From 6d6598816caca7990ac9c3b15ddac91bbc7a369c Mon Sep 17 00:00:00 2001 From: "zhangf@suq.cn" Date: Wed, 17 Dec 2025 13:30:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(user):=20=E6=96=B0=E5=A2=9E=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9C=8B=E6=9D=BF=E5=8A=9F=E8=83=BD=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 DataBoardController 控制器,提供各类统计数据接口 - 新增 DataBoardService 服务类,实现具体统计逻辑 - 在路由中注册数据看板相关接口路径及权限控制 - 为在线媒体列表增加名称模糊搜索功能 - 完善数据看板的五个统计维度:数据总量、AI平台问题占比、搜索报表、问题报表、品牌报表 --- app/controller/admin/OnlineMediasController.php | 1 + app/controller/user/DataBoardController.php | 34 +++++++ app/route/route.php | 15 +++ app/service/admin/OnlineMediasService.php | 3 + app/service/user/DataBoardService.php | 117 ++++++++++++++++++++++++ 5 files changed, 170 insertions(+) create mode 100644 app/controller/user/DataBoardController.php create mode 100644 app/service/user/DataBoardService.php diff --git a/app/controller/admin/OnlineMediasController.php b/app/controller/admin/OnlineMediasController.php index e80d6eb..5333d0f 100644 --- a/app/controller/admin/OnlineMediasController.php +++ b/app/controller/admin/OnlineMediasController.php @@ -12,6 +12,7 @@ class OnlineMediasController { $params = requestOnly([ 'wheres' => [], + 'name' => '' ]); return success($service->listData($params)); } diff --git a/app/controller/user/DataBoardController.php b/app/controller/user/DataBoardController.php new file mode 100644 index 0000000..3d66df7 --- /dev/null +++ b/app/controller/user/DataBoardController.php @@ -0,0 +1,34 @@ +countStatistic()); + } + + public function aiStatistic(DataBoardService $service) + { + return success($service->aiStatistic()); + } + + public function searchStatistic(DataBoardService $service) + { + return success($service->searchStatistic()); + } + + public function questionStatistic(DataBoardService $service) + { + return success($service->questionStatistic()); + } + + public function brandStatistic(DataBoardService $service) + { + return success($service->brandStatistic()); + } +} \ No newline at end of file diff --git a/app/route/route.php b/app/route/route.php index 3d73444..00046db 100644 --- a/app/route/route.php +++ b/app/route/route.php @@ -7,6 +7,7 @@ use app\controller\user\ArticleCategoryController; use app\controller\user\CreationArticleController; use app\controller\user\CreationArticleReceiveRecordsController; use app\controller\user\CreationTaskController; +use app\controller\user\DataBoardController; use app\controller\user\DistillationQuestionsController; use app\controller\user\DistillationWordController; use app\controller\user\EnterprisePortraitCategoryController; @@ -22,6 +23,20 @@ use Webman\Route; * 用户端定制路由 */ Route::group('/service/v1', function () { + //数据看板 + Route::group('/databoard', function () { + //数据总量 + Route::get('/count', [DataBoardController::class, 'countStatistic'])->setParams(['perm' => ['databoardCount']]); + //各平台问题占比 + Route::get('/ai', [DataBoardController::class, 'aiStatistic'])->setParams(['perm' => ['databoardAi']]); + //搜索报表 + Route::get('/search', [DataBoardController::class, 'searchStatistic'])->setParams(['perm' => ['databoardSearch']]); + //问题报表 + Route::get('/question', [DataBoardController::class, 'questionStatistic'])->setParams(['perm' => ['databoardQuestion']]); + //品牌报表 + Route::get('/brand', [DataBoardController::class, 'brandStatistic'])->setParams(['perm' => ['databoardBrand']]); + }); + //控制台 Route::group('/statistic', function () { //数量统计 diff --git a/app/service/admin/OnlineMediasService.php b/app/service/admin/OnlineMediasService.php index 58493bb..d797345 100644 --- a/app/service/admin/OnlineMediasService.php +++ b/app/service/admin/OnlineMediasService.php @@ -32,6 +32,9 @@ class OnlineMediasService extends BaseService } } } + if (isNotBlank($params['name'])) { + $query[] = ['name', 'like', "%{$params['name']}%"]; + } $list = $this->dao->getList($query, '*', $page, $limit, "$sortField $sortRule"); $count = $this->dao->getCount($query); return compact('list', 'count'); diff --git a/app/service/user/DataBoardService.php b/app/service/user/DataBoardService.php new file mode 100644 index 0000000..de0f495 --- /dev/null +++ b/app/service/user/DataBoardService.php @@ -0,0 +1,117 @@ +distillationWordDao = app()->make(DistillationWordDao::class); + $this->distillationWordExtendDao = app()->make(DistillationExpandWordDao::class); + } + + /** + * 数据总量 + * 蒸馏词总量, 拓展此总量 + * 蒸馏词扩展词数量排名 + */ + public function countStatistic() + { + $res = $this->distillationWordDao->getList([], '*', 0, 0, 'expand_count DESC', [], ['expand']); + return [ + 'word' => sizeof($res), + 'extend' => array_sum(array_column($res, 'expand_count')), + 'top' => collect($res)->sortByDesc('expand_count')->take(10)->map(function ($item) { + return collect($item)->only(['id', 'name', 'expand_count'])->toArray(); + })->toArray(), + ]; + } + + /** + * AI平台问题占比 + */ + public function aiStatistic() + { + return [ + 'deepseek' => 0, + 'doubao' => 0, + 'yuanbao' => 0, + 'tongyiqianwen' => 0, + 'wenxinyiyan' => 0, + 'nami' => 0, + 'kimi' => 0, + 'zhipu' => 0 + ]; + } + + /** + * 报表明细-搜索报表 + */ + public function searchStatistic() + { + return [ + 'ai' => [ + 'deepseek' => 0, + 'doubao' => 0, + 'yuanbao' => 0, + 'tongyiqianwen' => 0, + 'wenxinyiyan' => 0, + 'nami' => 0, + 'kimi' => 0, + 'zhipu' => 0 + ], + 'list' => [], + 'count' => 0, + ]; + } + + /** + * 报表明细-问题报表 + */ + public function questionStatistic() + { + return [ + 'ai' => [ + 'deepseek' => 0, + 'doubao' => 0, + 'yuanbao' => 0, + 'tongyiqianwen' => 0, + 'wenxinyiyan' => 0, + 'nami' => 0, + 'kimi' => 0, + 'zhipu' => 0 + ], + 'list' => [], + 'count' => 0, + ]; + } + + /** + * 报表明细-品牌报表 + */ + public function brandStatistic() + { + return [ + 'ai' => [ + 'deepseek' => 0, + 'doubao' => 0, + 'yuanbao' => 0, + 'tongyiqianwen' => 0, + 'wenxinyiyan' => 0, + 'nami' => 0, + 'kimi' => 0, + 'zhipu' => 0 + ], + 'list' => [], + 'count' => 0, + ]; + } + +} \ No newline at end of file