From 0f48ce7894297078f1f28cb0064ce01da24cb1e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E5=BC=BA?= <357099073@qq.com> Date: Mon, 26 Jan 2026 17:52:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=86=85=E5=AE=B9=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/controller/AnalyticsController.php | 180 ++++++++++++++++++ .../controller/Article/ArticleController.php | 8 +- app/admin/controller/UserController.php | 21 +- app/admin/route/app.php | 6 +- .../controller/Article/ArticleController.php | 8 +- app/index/controller/NewsCenterController.php | 14 +- app/model/Articles.php | 2 +- route/app.php | 2 +- 8 files changed, 218 insertions(+), 23 deletions(-) create mode 100644 app/admin/controller/AnalyticsController.php diff --git a/app/admin/controller/AnalyticsController.php b/app/admin/controller/AnalyticsController.php new file mode 100644 index 0000000..a71e46f --- /dev/null +++ b/app/admin/controller/AnalyticsController.php @@ -0,0 +1,180 @@ +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' => [] + ]); + } + } + + +} diff --git a/app/admin/controller/Article/ArticleController.php b/app/admin/controller/Article/ArticleController.php index 652d012..c15dbc7 100644 --- a/app/admin/controller/Article/ArticleController.php +++ b/app/admin/controller/Article/ArticleController.php @@ -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 ]; diff --git a/app/admin/controller/UserController.php b/app/admin/controller/UserController.php index 7831a29..0877b1e 100644 --- a/app/admin/controller/UserController.php +++ b/app/admin/controller/UserController.php @@ -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' => '删除成功' diff --git a/app/admin/route/app.php b/app/admin/route/app.php index 5bd41d1..a41c269 100644 --- a/app/admin/route/app.php +++ b/app/admin/route/app.php @@ -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'); \ No newline at end of file +Route::post('saveLegalInfos', 'app\\admin\\controller\\SiteSettingsController@saveLegalInfos'); + +// 数据统计路由 +Route::get('contentstats', 'app\\admin\\controller\\AnalyticsController@getContentStats'); +Route::get('usersstats', 'app\\admin\\controller\\AnalyticsController@getUserStats'); diff --git a/app/index/controller/Article/ArticleController.php b/app/index/controller/Article/ArticleController.php index eefb73f..f984bea 100644 --- a/app/index/controller/Article/ArticleController.php +++ b/app/index/controller/Article/ArticleController.php @@ -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' ]) diff --git a/app/index/controller/NewsCenterController.php b/app/index/controller/NewsCenterController.php index 68d4305..8d6bfa6 100644 --- a/app/index/controller/NewsCenterController.php +++ b/app/index/controller/NewsCenterController.php @@ -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) { diff --git a/app/model/Articles.php b/app/model/Articles.php index e9d0377..524ea94 100644 --- a/app/model/Articles.php +++ b/app/model/Articles.php @@ -47,7 +47,7 @@ class Articles extends Model 'publisher' => 'integer', 'create_time' => 'datetime', 'update_time' => 'datetime', - 'publishdate' => 'datetime', + 'publish_date' => 'datetime', 'delete_time' => 'datetime', ]; diff --git a/route/app.php b/route/app.php index 84f415a..07e373e 100644 --- a/route/app.php +++ b/route/app.php @@ -4,4 +4,4 @@ use think\facade\Route; Route::get('think', function () { return 'hello,ThinkPHP8!'; -}); \ No newline at end of file +});