From 068b5ddeef3d9b7355019723321fdf5788d945ec Mon Sep 17 00:00:00 2001 From: GeekMaster Date: Fri, 1 Aug 2025 10:45:49 +0800 Subject: [PATCH] Dashboard page is ready --- api/handler/admin/dashboard_handler.go | 53 +++--- web/src/views/admin/Dashboard.vue | 215 ++++++------------------- 2 files changed, 79 insertions(+), 189 deletions(-) diff --git a/api/handler/admin/dashboard_handler.go b/api/handler/admin/dashboard_handler.go index 7e0707df..74befe6d 100644 --- a/api/handler/admin/dashboard_handler.go +++ b/api/handler/admin/dashboard_handler.go @@ -55,18 +55,18 @@ type statsVo struct { Tokens int `json:"tokens"` Income float64 `json:"income"` Chart map[string]map[string]float64 `json:"chart"` - TodayUsers int64 `json:"today_users"` - TodayChats int64 `json:"today_chats"` - TodayTokens int `json:"today_tokens"` - TodayIncome float64 `json:"today_income"` - TodayOrders int64 `json:"today_orders"` - TodayImageJobs int64 `json:"today_image_jobs"` - TodayVideoJobs int64 `json:"today_video_jobs"` - TodayMusicJobs int64 `json:"today_music_jobs"` + TodayUsers int64 `json:"todayUsers"` + TodayChats int64 `json:"todayChats"` + TodayTokens int `json:"todayTokens"` + TodayIncome float64 `json:"todayIncome"` + TodayOrders int64 `json:"todayOrders"` + TodayImageJobs int64 `json:"todayImageJobs"` + TodayVideoJobs int64 `json:"todayVideoJobs"` + TodayMusicJobs int64 `json:"todayMusicJobs"` Orders int64 `json:"orders"` - ImageJobs int64 `json:"image_jobs"` - VideoJobs int64 `json:"video_jobs"` - MusicJobs int64 `json:"music_jobs"` + ImageJobs int64 `json:"imageJobs"` + VideoJobs int64 `json:"videoJobs"` + MusicJobs int64 `json:"musicJobs"` RecentOrders []OrderBrief `json:"recentOrders"` RecentUsers []UserBrief `json:"recentUsers"` } @@ -88,18 +88,18 @@ func (h *DashboardHandler) Stats(c *gin.Context) { // 今日新增对话 h.DB.Model(&model.ChatItem{}).Where("created_at > ?", zeroTime).Count(&stats.TodayChats) - // 总Token消耗 - var historyMessages []model.ChatMessage - h.DB.Find(&historyMessages) - for _, item := range historyMessages { - stats.Tokens += item.Tokens + // 总算力消耗 + var powerLogs []model.PowerLog + h.DB.Where("mark = ?", types.PowerSub).Find(&powerLogs) + for _, item := range powerLogs { + stats.Tokens += item.Amount } - // 今日Token消耗 - var todayMessages []model.ChatMessage - h.DB.Where("created_at > ?", zeroTime).Find(&todayMessages) - for _, item := range todayMessages { - stats.TodayTokens += item.Tokens + // 今日算力消耗 + var todayPowerLogs []model.PowerLog + h.DB.Where("mark = ?", types.PowerSub).Where("created_at > ?", zeroTime).Find(&todayPowerLogs) + for _, item := range todayPowerLogs { + stats.TodayTokens += item.Amount } // 总收入 @@ -130,6 +130,8 @@ func (h *DashboardHandler) Stats(c *gin.Context) { h.DB.Model(&model.JimengJob{}).Where("type IN ?", []string{"text_to_image", "image_to_image", "image_edit", "image_effects"}).Count(&jimengImageJobs) stats.ImageJobs = mjJobs + sdJobs + dallJobs + jimengImageJobs + logger.Info("stats.ImageJobs", stats.ImageJobs) + // 今日图片生成任务统计 var todayMjJobs, todaySdJobs, todayDallJobs, todayJimengImageJobs int64 h.DB.Model(&model.MidJourneyJob{}).Where("created_at > ?", zeroTime).Count(&todayMjJobs) @@ -202,11 +204,12 @@ func (h *DashboardHandler) Stats(c *gin.Context) { } } - // 统计7天Token 消耗 - err = h.DB.Where("created_at > ?", startDate).Find(&historyMessages).Error + // 统计7天算力消耗 + var chartPowerLogs []model.PowerLog + err = h.DB.Where("mark = ?", types.PowerSub).Where("created_at > ?", startDate).Find(&chartPowerLogs).Error if err == nil { - for _, item := range historyMessages { - historyMessagesStatistic[item.CreatedAt.Format("2006-01-02")] += float64(item.Tokens) + for _, item := range chartPowerLogs { + historyMessagesStatistic[item.CreatedAt.Format("2006-01-02")] += float64(item.Amount) } } diff --git a/web/src/views/admin/Dashboard.vue b/web/src/views/admin/Dashboard.vue index 6f54d9fd..239e3693 100644 --- a/web/src/views/admin/Dashboard.vue +++ b/web/src/views/admin/Dashboard.vue @@ -11,7 +11,7 @@
{{ stats.users }}
用户总数
-
今日新增: {{ stats.todayUsers || 1 }}
+
今日新增: {{ stats.todayUsers || 0 }}
@@ -39,9 +39,9 @@
-
{{ formatNumber(stats.tokens) }}
-
Token消耗
-
今日: {{ formatNumber(stats.todayTokens) }}
+
{{ formatNumber(stats.power || stats.tokens) }}
+
算力消耗
+
今日: {{ formatNumber(stats.todayPower || stats.todayTokens) }}
@@ -153,7 +153,7 @@ - +

最近订单

@@ -173,7 +173,7 @@ - +

最近用户

@@ -193,53 +193,6 @@
- - - - -
-

AI任务统计

-
-
-
-
- -
-
-
图片生成
-
{{ stats.imageJobs }}
-
-
-
-
- -
-
-
视频生成
-
{{ stats.videoJobs }}
-
-
-
-
- -
-
-
音乐生成
-
{{ stats.musicJobs }}
-
-
-
-
- -
-
-
订单总数
-
{{ stats.orders }}
-
-
-
-
-
@@ -264,6 +217,7 @@ const stats = ref({ users: 0, chats: 0, tokens: 0, + power: 0, income: 0, orders: 0, activeUsers: 0, @@ -274,6 +228,8 @@ const stats = ref({ todayUsers: 0, todayOrders: 0, todayIncome: 0, + todayTokens: 0, + todayPower: 0, todayImageJobs: 0, todayVideoJobs: 0, todayMusicJobs: 0, @@ -307,18 +263,31 @@ const formatTime = (dateStr) => { } onMounted(() => { - const chartUsers = echarts.init(document.getElementById('chart-users')) - const chartTokens = echarts.init(document.getElementById('chart-tokens')) - const chartIncome = echarts.init(document.getElementById('chart-income')) + const chartUsersEl = document.getElementById('chart-users') + const chartIncomeEl = document.getElementById('chart-income') + + if (!chartUsersEl || !chartIncomeEl) { + ElMessage.error('图表容器未找到') + return + } + + const chartUsers = echarts.init(chartUsersEl) + const chartIncome = echarts.init(chartIncomeEl) httpGet('/api/admin/dashboard/stats') .then((res) => { // 更新统计数据 Object.assign(stats.value, res.data) recentOrders.value = res.data.recentOrders || [] recentUsers.value = res.data.recentUsers || [] - const chartData = res.data.chart + const chartData = res.data.chart || {} loading.value = false + // 检查图表数据是否存在 + if (!chartData.users || !chartData.orders) { + ElMessage.warning('图表数据不完整') + return + } + const x = [] const dataUsers = [] for (let k in chartData.users) { @@ -388,29 +357,6 @@ onMounted(() => { }, ], }) - const dataTokens = [] - for (let k in chartData.historyMessage) { - dataTokens.push(chartData.historyMessage[k]) - } - chartTokens.setOption({ - xAxis: { - data: x, - }, - yAxis: {}, - series: [ - { - data: dataTokens, - type: 'line', - label: { - show: true, - position: 'bottom', - textStyle: { - fontSize: 18, - }, - }, - }, - ], - }) const dataIncome = [] for (let k in chartData.orders) { @@ -486,16 +432,16 @@ onMounted(() => { window.onresize = function () { // 自适应大小 - chartUsers.resize() - chartIncome.resize() + if (chartUsers) chartUsers.resize() + if (chartIncome) chartIncome.resize() } }) -