58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
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,
|
|
})
|
|
}
|