Files
nl-blogs/server/handlers/dashboard.go
2026-01-19 13:53:32 +08:00

95 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package handlers
import (
"github.com/gin-gonic/gin"
"github.com/niangaodev/art-code/repositories"
"github.com/niangaodev/art-code/utils"
)
// GetDashboardStats 获取仪表盘统计数据
func GetDashboardStats(c *gin.Context) {
startDate := c.Query("startDate")
endDate := c.Query("endDate")
// 1. 获取博文增长趋势
postsTrend, err := repositories.GetNewPostsTrend(startDate, endDate)
if err != nil {
postsTrend = []repositories.TrendData{} // Fallback empty
}
// 2. 获取访客UV (根据IP)
uvTrend, err := repositories.GetDailyUV(startDate, endDate)
if err != nil {
uvTrend = []repositories.UVTrendData{}
}
// 3. 用户画像-地域分布
userRegions, err := repositories.GetUserRegions(startDate, endDate)
if err != nil {
userRegions = []struct {
Region string
Count int
}{}
}
// 4. 热门文章 Top 5
// 优先使用访问日志统计不足5条则用posts表的read_count补齐
topPosts, err := repositories.GetTopArticlesByAccess(5)
if err != nil {
topPosts = []struct {
ArticleID int `json:"article_id"`
Title string `json:"title"`
Count int `json:"count"`
}{}
}
if len(topPosts) < 5 {
// Fetch more than needed to ensure we find unique ones, or just fetch top 5
dbPosts, err := repositories.GetTopPosts(10)
if err == nil {
// Create a map of existing IDs to avoid duplicates
existingIDs := make(map[int]bool)
for _, p := range topPosts {
existingIDs[p.ArticleID] = true
}
for _, p := range dbPosts {
if len(topPosts) >= 5 {
break
}
if !existingIDs[int(p.ID)] {
topPosts = append(topPosts, struct {
ArticleID int `json:"article_id"`
Title string `json:"title"`
Count int `json:"count"`
}{
ArticleID: int(p.ID),
Title: p.Title,
Count: int(p.ReadCount),
})
existingIDs[int(p.ID)] = true
}
}
}
}
// 5. 合作咨询总数
inquiryCount, _ := repositories.GetInquiryCount()
// 6. 作品总数
workCount, _ := repositories.GetWorkCount()
// 7. 文章总数
postCount, _ := repositories.GetPostCount()
utils.Success(c, gin.H{
"postsTrend": postsTrend,
"uvTrend": uvTrend,
"userRegions": userRegions,
"topPosts": topPosts,
"inquiryCount": inquiryCount,
"posts": postCount,
"works": workCount,
})
}