97 lines
2.4 KiB
Go
97 lines
2.4 KiB
Go
package handlers
|
||
|
||
import (
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/niangaodev/art-code/config"
|
||
"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. 合作咨询总数
|
||
var inquiryCount int
|
||
config.DB.QueryRow("SELECT COUNT(*) FROM inquiries WHERE deleted_at = 0").Scan(&inquiryCount)
|
||
|
||
// 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,
|
||
})
|
||
}
|