perf: 优化dashboard API,41次查询12次
- 合并30次循环查询为1次(onlineTrend) - 使用 GROUP BY DATE() 一次获取所有日期数据 - 在内存中填充缺失日期,避免 N+1 问题 - API 响应时间预计从 1-2s 降至 100-200ms
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
package admin
|
package admin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
@@ -111,23 +111,47 @@ func handleGetDashboard(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onlineTrend := make([]gin.H, 0, 30)
|
onlineTrend := make([]gin.H, 0, 30)
|
||||||
for i := 29; i >= 0; i-- {
|
if len(appIDs) > 0 {
|
||||||
date := time.Now().AddDate(0, 0, -i)
|
type DailyCount struct {
|
||||||
dateStart := time.Date(date.Year(), date.Month(), date.Day(), 0, 0, 0, 0, date.Location())
|
Date string
|
||||||
dateEnd := dateStart.Add(24 * time.Hour)
|
Count int64
|
||||||
|
}
|
||||||
|
var dailyCounts []DailyCount
|
||||||
|
|
||||||
var count int64
|
dateStart := time.Now().AddDate(0, 0, -29)
|
||||||
if len(appIDs) > 0 {
|
dateStart = time.Date(dateStart.Year(), dateStart.Month(), dateStart.Day(), 0, 0, 0, 0, dateStart.Location())
|
||||||
database.DB.Model(&model.DeviceSession{}).
|
|
||||||
Joins("JOIN user_devices ON device_sessions.device_id = user_devices.id").
|
database.DB.Model(&model.DeviceSession{}).
|
||||||
Where("user_devices.application_id IN ? AND device_sessions.last_heartbeat >= ? AND device_sessions.last_heartbeat < ?", appIDs, dateStart, dateEnd).
|
Select("DATE(last_heartbeat) as date, COUNT(*) as count").
|
||||||
Count(&count)
|
Joins("JOIN user_devices ON device_sessions.device_id = user_devices.id").
|
||||||
|
Where("user_devices.application_id IN ? AND last_heartbeat >= ?", appIDs, dateStart).
|
||||||
|
Group("DATE(last_heartbeat)").
|
||||||
|
Order("date ASC").
|
||||||
|
Find(&dailyCounts)
|
||||||
|
|
||||||
|
countMap := make(map[string]int64)
|
||||||
|
for _, dc := range dailyCounts {
|
||||||
|
countMap[dc.Date] = dc.Count
|
||||||
}
|
}
|
||||||
|
|
||||||
onlineTrend = append(onlineTrend, gin.H{
|
for i := 29; i >= 0; i-- {
|
||||||
"date": date.Format("01-02"),
|
date := time.Now().AddDate(0, 0, -i)
|
||||||
"value": count,
|
dateStr := date.Format("2006-01-02")
|
||||||
})
|
count := countMap[dateStr]
|
||||||
|
|
||||||
|
onlineTrend = append(onlineTrend, gin.H{
|
||||||
|
"date": date.Format("01-02"),
|
||||||
|
"value": count,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for i := 29; i >= 0; i-- {
|
||||||
|
date := time.Now().AddDate(0, 0, -i)
|
||||||
|
onlineTrend = append(onlineTrend, gin.H{
|
||||||
|
"date": date.Format("01-02"),
|
||||||
|
"value": 0,
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
recentTickets := make([]gin.H, 0, 5)
|
recentTickets := make([]gin.H, 0, 5)
|
||||||
|
|||||||
Reference in New Issue
Block a user