ThinkPHP6 文章访问量统计:日榜、周榜、月榜实现教程

本文将详细介绍如何使用ThinkPHP6框架实现文章访问量统计功能,包括日榜、周榜、月榜的统计和展示。

思路

  1. 创建一个新的表,用于存储文章的访问量数据。
  2. 在访问文章时,每次访问都会将访问量+1,并更新到数据库中。
  3. 使用ThinkPHP的时间处理函数,计算出日榜、周榜、月榜的起始时间和结束时间。
  4. 根据起始时间和结束时间,在访问量表中查询出对应时间段内的访问量,并按照访问量从高到低排序,得到排行榜数据。

代码

1. 创建访问量表

在数据库中创建一张表,存储文章的访问量数据。表结构如下:

CREATE TABLE `article_visit` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `article_id` int(11) NOT NULL COMMENT '文章ID',
  `visit_count` int(11) NOT NULL DEFAULT '0' COMMENT '访问量',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='文章访问量表';

2. 更新访问量

在访问文章的控制器中,添加如下代码:

use app\common\model\ArticleVisit;

class Article extends BaseController
{
    public function detail($id)
    {
        // 获取文章详情
        $article = ArticleModel::get($id);

        // 记录访问量
        ArticleVisit::addVisitCount($id);

        // 渲染模板
        return $this->fetch('detail', ['article' => $article]);
    }
}

在ArticleVisit模型中,添加如下代码:

use think\facade\Db;
use think\Model;
use think\helper\Str;

class ArticleVisit extends Model
{
    protected $table = 'article_visit';

    /**
     * 添加访问量
     */
    public static function addVisitCount($articleId)
    {
        // 获取当天日期
        $today = date('Y-m-d');

        // 判断当天是否已经有访问记录
        $visit = self::where('article_id', $articleId)
            ->where('create_time', '>=', $today)
            ->find();

        if ($visit) {
            // 如果已有访问记录,访问量+1
            $visit->visit_count += 1;
            $visit->save();
        } else {
            // 如果没有访问记录,创建新的访问记录
            self::create([
                'article_id' => $articleId,
                'visit_count' => 1,
                'create_time' => date('Y-m-d H:i:s'),
            ]);
        }
    }
}

3. 查询排行榜数据

在控制器中,添加如下代码:

use think\facade\Db;
use think\helper\Str;

class Index extends BaseController
{
    public function index()
    {
        // 日榜
        $dayStart = date('Y-m-d 00:00:00');
        $dayEnd = date('Y-m-d 23:59:59');
        $dayList = Db::name('article_visit')
            ->alias('av')
            ->join('article a', 'av.article_id = a.id')
            ->where('av.create_time', 'between', [$dayStart, $dayEnd])
            ->field('a.id, a.title, av.visit_count')
            ->order('av.visit_count DESC')
            ->limit(10)
            ->select();

        // 周榜
        $weekStart = date('Y-m-d 00:00:00', strtotime('-1 week'));
        $weekEnd = date('Y-m-d 23:59:59');
        $weekList = Db::name('article_visit')
            ->alias('av')
            ->join('article a', 'av.article_id = a.id')
            ->where('av.create_time', 'between', [$weekStart, $weekEnd])
            ->field('a.id, a.title, sum(av.visit_count) as visit_count')
            ->group('a.id')
            ->order('visit_count DESC')
            ->limit(10)
            ->select();

        // 月榜
        $monthStart = date('Y-m-01 00:00:00');
        $monthEnd = date('Y-m-t 23:59:59');
        $monthList = Db::name('article_visit')
            ->alias('av')
            ->join('article a', 'av.article_id = a.id')
            ->where('av.create_time', 'between', [$monthStart, $monthEnd])
            ->field('a.id, a.title, sum(av.visit_count) as visit_count')
            ->group('a.id')
            ->order('visit_count DESC')
            ->limit(10)
            ->select();

        // 渲染模板
        return $this->fetch('index', [
            'dayList' => $dayList,
            'weekList' => $weekList,
            'monthList' => $monthList,
        ]);
    }
}

4. 显示排行榜

在模板中,添加如下代码:

<!-- 日榜 -->
<h2>日榜</h2>
<table>
    <thead>
        <tr>
            <th>排名</th>
            <th>文章标题</th>
            <th>访问量</th>
        </tr>
    </thead>
    <tbody>
        {volist name="dayList" id="item"}
        <tr>
            <td>{$i}</td>
            <td><a href="{:url('article/detail', ['id' => $item['id']])}">{$item.title}</a></td>
            <td>{$item.visit_count}</td>
        </tr>
        {/volist}
    </tbody>
</table>

<!-- 周榜 -->
<h2>周榜</h2>
<table>
    <thead>
        <tr>
            <th>排名</th>
            <th>文章标题</th>
            <th>访问量</th>
        </tr>
    </thead>
    <tbody>
        {volist name="weekList" id="item"}
        <tr>
            <td>{$i}</td>
            <td><a href="{:url('article/detail', ['id' => $item['id']])}">{$item.title}</a></td>
            <td>{$item.visit_count}</td>
        </tr>
        {/volist}
    </tbody>
</table>

<!-- 月榜 -->
<h2>月榜</h2>
<table>
    <thead>
        <tr>
            <th>排名</th>
            <th>文章标题</th>
            <th>访问量</th>
        </tr>
    </thead>
    <tbody>
        {volist name="monthList" id="item"}
        <tr>
            <td>{$i}</td>
            <td><a href="{:url('article/detail', ['id' => $item['id']])}">{$item.title}</a></td>
            <td>{$item.visit_count}</td>
        </tr>
        {/volist}
    </tbody>
</table>

总结

通过以上步骤,您就可以在ThinkPHP6框架中实现文章访问量统计功能,并展示日榜、周榜、月榜。您可以根据实际需求,调整代码和模板,实现更丰富的功能。

ThinkPHP6 文章访问量统计:日榜、周榜、月榜实现教程

原文地址: https://www.cveoy.top/t/topic/lPq3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录