ThinkPHP6 文章访问量统计:日榜、周榜、月榜实现教程
ThinkPHP6 文章访问量统计:日榜、周榜、月榜实现教程
本文将详细介绍如何使用ThinkPHP6框架实现文章访问量统计功能,包括日榜、周榜、月榜的统计和展示。
思路
- 创建一个新的表,用于存储文章的访问量数据。
- 在访问文章时,每次访问都会将访问量+1,并更新到数据库中。
- 使用ThinkPHP的时间处理函数,计算出日榜、周榜、月榜的起始时间和结束时间。
- 根据起始时间和结束时间,在访问量表中查询出对应时间段内的访问量,并按照访问量从高到低排序,得到排行榜数据。
代码
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框架中实现文章访问量统计功能,并展示日榜、周榜、月榜。您可以根据实际需求,调整代码和模板,实现更丰富的功能。
原文地址: https://www.cveoy.top/t/topic/lPq3 著作权归作者所有。请勿转载和采集!