feat: 用户端访问足迹统计(IP 去重 UV/PV)

- 后端 Visit 模型(date+ip 唯一索引):POST /api/track 埋点(ClientIP upsert,pv+1),GET /api/admin/visits 每日 UV/PV 统计
- web 每会话上报一次访问(sessionStorage 防重),IP 由后端去重
- admin 访问统计页:侧边栏入口 + 今日/近N天 UV·PV 卡片 + 每日柱状趋势(自绘无依赖) + 7/30/90 天切换

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Blizzard
2026-07-17 17:05:08 +08:00
parent cc4aa647c5
commit 5adb3d621b
9 changed files with 260 additions and 2 deletions
+3
View File
@@ -30,6 +30,8 @@ func New(db *gorm.DB) (*gin.Engine, error) {
api.GET("/posts/:slug", posts.Get)
api.GET("/releases/latest", handler.NewReleaseHandler().Latest)
api.POST("/track", handler.NewVisitHandler(db).Track)
}
// RSS 订阅源(页脚 RSS 链接指向这里)
@@ -43,6 +45,7 @@ func New(db *gorm.DB) (*gin.Engine, error) {
{
posts := handler.NewAdminPostHandler(db)
adminAPI.GET("/stats", posts.Stats)
adminAPI.GET("/visits", handler.NewVisitHandler(db).Stats)
adminAPI.GET("/posts", posts.List)
adminAPI.POST("/posts", posts.Create)
adminAPI.GET("/posts/:id", posts.Get)