package handler import ( "net/http" "soul-api/internal/database" "github.com/gin-gonic/gin" ) // AdminChapterClickStats GET /api/admin/chapters/:id/click-stats // 聚合 user_tracks 表,返回指定章节的点击用户列表(昵称、次数、最近时间) func AdminChapterClickStats(c *gin.Context) { chapterID := c.Param("id") if chapterID == "" { c.JSON(http.StatusOK, gin.H{"success": false, "error": "missing chapter id"}) return } db := database.DB() type clickUser struct { UserID string `json:"userId"` Nickname string `json:"nickname"` Avatar string `json:"avatar"` Count int `json:"count"` LastClick string `json:"lastClick"` } var results []clickUser err := db.Raw(` SELECT ut.user_id, COALESCE(u.nickname,'') AS nickname, COALESCE(u.avatar,'') AS avatar, COUNT(*) AS count, MAX(ut.created_at) AS last_click FROM user_tracks ut LEFT JOIN users u ON ut.user_id = u.id WHERE ut.chapter_id = ? AND ut.action = 'view_chapter' GROUP BY ut.user_id, u.nickname, u.avatar ORDER BY count DESC LIMIT 200 `, chapterID).Scan(&results).Error if err != nil { c.JSON(http.StatusOK, gin.H{"success": false, "error": err.Error()}) return } totalClicks := 0 for _, r := range results { totalClicks += r.Count } c.JSON(http.StatusOK, gin.H{ "success": true, "totalClicks": totalClicks, "users": results, }) }