修复内容统计
This commit is contained in:
parent
3a7a330b7c
commit
0f48ce7894
180
app/admin/controller/AnalyticsController.php
Normal file
180
app/admin/controller/AnalyticsController.php
Normal file
@ -0,0 +1,180 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\response\Json;
|
||||
use think\db\exception\DbException;
|
||||
use app\model\Articles;
|
||||
use app\model\ArticlesCategory;
|
||||
use app\model\AdminUser;
|
||||
|
||||
class AnalyticsController extends BaseController
|
||||
{
|
||||
/**
|
||||
* 内容统计
|
||||
* 包含:总发布量、本月新增、总点赞量、总访问量(均与昨日对比)、热门内容top5
|
||||
* @return Json
|
||||
*/
|
||||
public function getContentStats()
|
||||
{
|
||||
try {
|
||||
$today = date('Y-m-d');
|
||||
$yesterday = date('Y-m-d', strtotime('-1 day'));
|
||||
$monthStart = date('Y-m-01');
|
||||
$yesterdayMonthStart = date('Y-m-01', strtotime('-1 day'));
|
||||
$monthEnd = date('Y-m-t 23:59:59');
|
||||
|
||||
// 总发布量
|
||||
$totalArticles = Articles::where('delete_time', null)
|
||||
->where('status', 2)
|
||||
->count();
|
||||
|
||||
// 昨日总发布量
|
||||
$yesterdayTotalArticles = Articles::where('delete_time', null)
|
||||
->where('status', 2)
|
||||
->where('publish_date', '>=', $yesterday . ' 00:00:00')
|
||||
->where('publish_date', '<=', $yesterday . ' 23:59:59')
|
||||
->count();
|
||||
|
||||
// 本月新增
|
||||
$monthNewArticles = Articles::where('delete_time', null)
|
||||
->where('status', 2)
|
||||
->where('publish_date', '>=', $monthStart . ' 00:00:00')
|
||||
->where('publish_date', '<=', $monthEnd)
|
||||
->count();
|
||||
|
||||
// 上月同期新增(用于对比)
|
||||
$lastMonthStart = date('Y-m-01', strtotime('-1 month'));
|
||||
$lastMonthEnd = date('Y-m-t 23:59:59', strtotime('-1 month'));
|
||||
$lastMonthNewArticles = Articles::where('delete_time', null)
|
||||
->where('status', 2)
|
||||
->where('publish_date', '>=', $lastMonthStart . ' 00:00:00')
|
||||
->where('publish_date', '<=', $lastMonthEnd)
|
||||
->count();
|
||||
|
||||
// 总点赞量
|
||||
$totalLikes = Articles::where('delete_time', null)
|
||||
->where('status', 2)
|
||||
->sum('likes');
|
||||
|
||||
// 昨日点赞量
|
||||
$yesterdayLikes = Articles::where('delete_time', null)
|
||||
->where('status', 2)
|
||||
->where('update_time', '>=', $yesterday . ' 00:00:00')
|
||||
->where('update_time', '<=', $yesterday . ' 23:59:59')
|
||||
->sum('likes');
|
||||
|
||||
// 总访问量
|
||||
$totalViews = Articles::where('delete_time', null)
|
||||
->where('status', 2)
|
||||
->sum('views');
|
||||
|
||||
// 昨日访问量
|
||||
$yesterdayViews = Articles::where('delete_time', null)
|
||||
->where('status', 2)
|
||||
->where('update_time', '>=', $yesterday . ' 00:00:00')
|
||||
->where('update_time', '<=', $yesterday . ' 23:59:59')
|
||||
->sum('views');
|
||||
|
||||
// 计算增长率
|
||||
$articleGrowth = $yesterdayTotalArticles > 0
|
||||
? round(($totalArticles - $yesterdayTotalArticles) / $yesterdayTotalArticles * 100, 2)
|
||||
: 0;
|
||||
$monthGrowth = $lastMonthNewArticles > 0
|
||||
? round(($monthNewArticles - $lastMonthNewArticles) / $lastMonthNewArticles * 100, 2)
|
||||
: 0;
|
||||
$likesGrowth = $yesterdayLikes > 0
|
||||
? round(($totalLikes - $yesterdayLikes) / $yesterdayLikes * 100, 2)
|
||||
: 0;
|
||||
$viewsGrowth = $yesterdayViews > 0
|
||||
? round(($totalViews - $yesterdayViews) / $yesterdayViews * 100, 2)
|
||||
: 0;
|
||||
|
||||
// 热门内容TOP5
|
||||
$hotArticles = Articles::where('delete_time', null)
|
||||
->where('status', 2)
|
||||
->order('views', 'desc')
|
||||
->limit(5)
|
||||
->withAttr('cate', function ($value) {
|
||||
return ArticlesCategory::where('id', $value)->value('name') ?? '未分类';
|
||||
})
|
||||
->field('id,title,cate,views,likes,publish_date,status')
|
||||
->select();
|
||||
|
||||
$stats = [
|
||||
'overview' => [
|
||||
'total_articles' => [
|
||||
'value' => $totalArticles,
|
||||
'yesterday' => $yesterdayTotalArticles,
|
||||
'growth' => $articleGrowth
|
||||
],
|
||||
'month_new' => [
|
||||
'value' => $monthNewArticles,
|
||||
'last_month' => $lastMonthNewArticles,
|
||||
'growth' => $monthGrowth
|
||||
],
|
||||
'total_likes' => [
|
||||
'value' => (int)$totalLikes,
|
||||
'yesterday' => (int)$yesterdayLikes,
|
||||
'growth' => $likesGrowth
|
||||
],
|
||||
'total_views' => [
|
||||
'value' => (int)$totalViews,
|
||||
'yesterday' => (int)$yesterdayViews,
|
||||
'growth' => $viewsGrowth
|
||||
],
|
||||
],
|
||||
'hot_articles' => $hotArticles->toArray()
|
||||
];
|
||||
|
||||
$this->logSuccess('内容统计', '获取内容统计', ['data' => $stats]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '获取成功',
|
||||
'data' => $stats
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
$this->logFail('内容统计', '获取内容统计', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '获取失败:' . $e->getMessage(),
|
||||
'data' => []
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户统计
|
||||
* @return Json
|
||||
*/
|
||||
public function getUserStats()
|
||||
{
|
||||
try {
|
||||
$stats = [
|
||||
'total_users' => AdminUser::where('delete_time', null)->count(),
|
||||
];
|
||||
// 记录操作日志
|
||||
$this->logSuccess('用户统计', '获取用户统计', ['data' => $stats]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '获取成功',
|
||||
'data' => $stats
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('用户统计', '获取用户统计', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '获取失败:' . $e->getMessage(),
|
||||
'data' => []
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -60,7 +60,7 @@ class ArticleController extends BaseController
|
||||
|
||||
// 执行分页查询,合并order语句
|
||||
$articles = $query
|
||||
->field('a.id, a.title, c.name as cate, a.author, a.status, a.views, a.likes, a.publishdate,a.recommend,a.top,a.update_time, u.name as publisher')
|
||||
->field('a.id, a.title, c.name as cate, a.author, a.status, a.views, a.likes, a.publish_date,a.recommend,a.top,a.update_time, u.name as publisher')
|
||||
->order('a.status, a.top desc, a.recommend desc, a.sort desc, a.id desc')
|
||||
->page($page, $pageSize)
|
||||
->select()
|
||||
@ -208,7 +208,7 @@ class ArticleController extends BaseController
|
||||
try {
|
||||
$article = Db::name('mete_articles')
|
||||
->where('id', $id)
|
||||
->field('id,title,cate,image,desc,author,content,is_trans,transurl,views,likes,publisher,create_time,publishdate,update_time')
|
||||
->field('id,title,cate,image,desc,author,content,is_trans,transurl,views,likes,publisher,create_time,publish_date,update_time')
|
||||
->find();
|
||||
|
||||
if (!$article) {
|
||||
@ -324,7 +324,7 @@ class ArticleController extends BaseController
|
||||
}
|
||||
$data = [
|
||||
'status' => 2, // 已发布状态
|
||||
'publishdate' => $currentTime,
|
||||
'publish_date' => $currentTime,
|
||||
'update_time' => $currentTime,
|
||||
'publisher' => $user_id,
|
||||
];
|
||||
@ -362,7 +362,7 @@ class ArticleController extends BaseController
|
||||
$currentTime = date('Y-m-d H:i:s');
|
||||
$data = [
|
||||
'status' => 1, // 已发布状态
|
||||
'publishdate' => null,
|
||||
'publish_date' => null,
|
||||
'update_time' => $currentTime
|
||||
];
|
||||
|
||||
|
||||
@ -106,10 +106,10 @@ class UserController extends BaseController
|
||||
public function editUser(int $id)
|
||||
{
|
||||
$data = request()->param();
|
||||
unset($data['_t'], $data['id']);
|
||||
$data['update_time'] = date('Y-m-d H:i:s');
|
||||
AdminUser::where('id', $id)->update($data);
|
||||
// 记录操作日志
|
||||
$this->logSuccess('用户管理', '编辑用户', ['data' => $data]);
|
||||
$this->logSuccess('用户管理', '编辑用户', ['id' => $id]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '编辑成功'
|
||||
@ -122,9 +122,20 @@ class UserController extends BaseController
|
||||
*/
|
||||
public function deleteUser(int $id)
|
||||
{
|
||||
AdminUser::where('id', $id)->delete();
|
||||
// 记录操作日志
|
||||
$this->logSuccess('用户管理', '删除用户', ['data' => $id]);
|
||||
$user = AdminUser::where('id', $id)->where('delete_time', null)->find();
|
||||
|
||||
if (!$user) {
|
||||
return json([
|
||||
'code' => 404,
|
||||
'msg' => '用户不存在或已删除'
|
||||
]);
|
||||
}
|
||||
|
||||
AdminUser::where('id', $id)->update([
|
||||
'delete_time' => date('Y-m-d H:i:s')
|
||||
]);
|
||||
|
||||
$this->logSuccess('用户管理', '删除用户', ['id' => $id]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '删除成功'
|
||||
|
||||
@ -97,4 +97,8 @@ Route::get('operationLogs', 'app\\admin\\controller\\OperationLog\\OperationLogC
|
||||
Route::get('normalInfos', 'app\\admin\\controller\\SiteSettingsController@getNormalInfos');
|
||||
Route::post('saveNormalInfos', 'app\\admin\\controller\\SiteSettingsController@saveNormalInfos');
|
||||
Route::get('legalInfos', 'app\\admin\\controller\\SiteSettingsController@getLegalInfos');
|
||||
Route::post('saveLegalInfos', 'app\\admin\\controller\\SiteSettingsController@saveLegalInfos');
|
||||
Route::post('saveLegalInfos', 'app\\admin\\controller\\SiteSettingsController@saveLegalInfos');
|
||||
|
||||
// 数据统计路由
|
||||
Route::get('contentstats', 'app\\admin\\controller\\AnalyticsController@getContentStats');
|
||||
Route::get('usersstats', 'app\\admin\\controller\\AnalyticsController@getUserStats');
|
||||
|
||||
@ -59,7 +59,7 @@ class ArticleController extends BaseController
|
||||
->whereIn('cate', $categoryIds)
|
||||
->order([
|
||||
'recommend' => 'desc',
|
||||
'publishdate' => 'desc',
|
||||
'publish_date' => 'desc',
|
||||
'sort' => 'desc',
|
||||
'id' => 'desc'
|
||||
])
|
||||
@ -67,9 +67,9 @@ class ArticleController extends BaseController
|
||||
'id',
|
||||
'title',
|
||||
'content',
|
||||
'publishdate',
|
||||
'DAY(publishdate) AS `date`',
|
||||
'DATE_FORMAT(publishdate, "%Y-%m") AS `month`',
|
||||
'publish_date',
|
||||
'DAY(publish_date) AS `date`',
|
||||
'DATE_FORMAT(publish_date, "%Y-%m") AS `month`',
|
||||
'image',
|
||||
'recommend'
|
||||
])
|
||||
|
||||
@ -41,7 +41,7 @@ class NewsCenterController extends BaseController
|
||||
// 查询文章
|
||||
$articles = Articles::published()
|
||||
->where('cate', $categoryInfo['id'])
|
||||
->order('publishdate', 'desc')
|
||||
->order('publish_date', 'desc')
|
||||
->limit(4)
|
||||
->select();
|
||||
|
||||
@ -93,7 +93,7 @@ class NewsCenterController extends BaseController
|
||||
->order('top', 'desc')
|
||||
->order('recommend', 'desc')
|
||||
->order('sort', 'desc')
|
||||
->order('publishdate', 'desc')
|
||||
->order('publish_date', 'desc')
|
||||
->page($page, $limit)
|
||||
->select();
|
||||
|
||||
@ -148,7 +148,7 @@ class NewsCenterController extends BaseController
|
||||
->order('top', 'desc')
|
||||
->order('recommend', 'desc')
|
||||
->order('sort', 'desc')
|
||||
->order('publishdate', 'desc')
|
||||
->order('publish_date', 'desc')
|
||||
->page($page, $limit)
|
||||
->select();
|
||||
|
||||
@ -246,13 +246,13 @@ class NewsCenterController extends BaseController
|
||||
// 获取总数
|
||||
$total = (clone $articleQuery)->count();
|
||||
|
||||
// 获取列表:限定返回 id, title, desc, publishdate, image, likes, views
|
||||
$articles = $articleQuery->field('id,title,desc,publishdate,image,likes,views,cate')
|
||||
// 获取列表:限定返回 id, title, desc, publish_date, image, likes, views
|
||||
$articles = $articleQuery->field('id,title,desc,publish_date,image,likes,views,cate')
|
||||
->order([
|
||||
'top' => 'desc',
|
||||
'recommend' => 'desc',
|
||||
'sort' => 'desc',
|
||||
'publishdate' => 'desc'
|
||||
'publish_date' => 'desc'
|
||||
])
|
||||
->page($page, $limit)
|
||||
->select();
|
||||
@ -299,7 +299,7 @@ class NewsCenterController extends BaseController
|
||||
$article = Articles::where('id', $id)
|
||||
->where('delete_time', null)
|
||||
->where('status', 2)
|
||||
->field('id,title,cate,image,desc,author,content,publisher,publishdate,views,likes,is_trans,transurl')
|
||||
->field('id,title,cate,image,desc,author,content,publisher,publish_date,views,likes,is_trans,transurl')
|
||||
->find();
|
||||
|
||||
if (!$article) {
|
||||
|
||||
@ -47,7 +47,7 @@ class Articles extends Model
|
||||
'publisher' => 'integer',
|
||||
'create_time' => 'datetime',
|
||||
'update_time' => 'datetime',
|
||||
'publishdate' => 'datetime',
|
||||
'publish_date' => 'datetime',
|
||||
'delete_time' => 'datetime',
|
||||
];
|
||||
|
||||
|
||||
@ -4,4 +4,4 @@ use think\facade\Route;
|
||||
|
||||
Route::get('think', function () {
|
||||
return 'hello,ThinkPHP8!';
|
||||
});
|
||||
});
|
||||
|
||||
Loading…
Reference in New Issue
Block a user