2026-04-28 14:53:04 +08:00
|
|
|
|
package handler
|
2026-03-14 18:01:55 +08:00
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"strconv"
|
|
|
|
|
|
|
2026-04-22 16:01:59 +08:00
|
|
|
|
"with_you/internal/pkg/response"
|
|
|
|
|
|
"with_you/internal/service"
|
2026-03-14 18:01:55 +08:00
|
|
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// AdminDashboardHandler 管理端仪表盘处理器
|
|
|
|
|
|
type AdminDashboardHandler struct {
|
|
|
|
|
|
dashboardService service.AdminDashboardService
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// NewAdminDashboardHandler 创建管理端仪表盘处理器
|
|
|
|
|
|
func NewAdminDashboardHandler(dashboardService service.AdminDashboardService) *AdminDashboardHandler {
|
|
|
|
|
|
return &AdminDashboardHandler{
|
|
|
|
|
|
dashboardService: dashboardService,
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetStats 获取统计数据
|
|
|
|
|
|
// GET /api/v1/admin/dashboard/stats
|
|
|
|
|
|
func (h *AdminDashboardHandler) GetStats(c *gin.Context) {
|
|
|
|
|
|
stats, err := h.dashboardService.GetStats(c.Request.Context())
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
response.InternalServerError(c, "failed to get dashboard stats")
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
response.Success(c, stats)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetUserActivityTrend 获取用户活跃度趋势
|
|
|
|
|
|
// GET /api/v1/admin/dashboard/user-activity
|
|
|
|
|
|
func (h *AdminDashboardHandler) GetUserActivityTrend(c *gin.Context) {
|
2026-03-30 04:49:35 +08:00
|
|
|
|
// 解析天数参数,默认7天,限制在1-30天
|
2026-03-14 18:01:55 +08:00
|
|
|
|
days, _ := strconv.Atoi(c.DefaultQuery("days", "7"))
|
2026-03-30 04:49:35 +08:00
|
|
|
|
days = min(max(days, 1), 30)
|
2026-03-14 18:01:55 +08:00
|
|
|
|
|
|
|
|
|
|
trend, err := h.dashboardService.GetUserActivityTrend(c.Request.Context(), days)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
response.InternalServerError(c, "failed to get user activity trend")
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
response.Success(c, trend)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetContentStats 获取内容统计
|
|
|
|
|
|
// GET /api/v1/admin/dashboard/content-stats
|
|
|
|
|
|
func (h *AdminDashboardHandler) GetContentStats(c *gin.Context) {
|
|
|
|
|
|
stats, err := h.dashboardService.GetContentStats(c.Request.Context())
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
response.InternalServerError(c, "failed to get content stats")
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
response.Success(c, stats)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetPendingContent 获取待审核内容
|
|
|
|
|
|
// GET /api/v1/admin/dashboard/pending-content
|
|
|
|
|
|
func (h *AdminDashboardHandler) GetPendingContent(c *gin.Context) {
|
2026-03-30 04:49:35 +08:00
|
|
|
|
// 解析limit参数,默认10条,限制在1-50条
|
2026-03-14 18:01:55 +08:00
|
|
|
|
limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10"))
|
2026-03-30 04:49:35 +08:00
|
|
|
|
limit = min(max(limit, 1), 50)
|
2026-03-14 18:01:55 +08:00
|
|
|
|
|
|
|
|
|
|
content, err := h.dashboardService.GetPendingContent(c.Request.Context(), limit)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
response.InternalServerError(c, "failed to get pending content")
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
response.Success(c, content)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetOnlineUsers 获取在线用户数
|
|
|
|
|
|
// GET /api/v1/admin/dashboard/online-users
|
|
|
|
|
|
func (h *AdminDashboardHandler) GetOnlineUsers(c *gin.Context) {
|
|
|
|
|
|
onlineUsers, err := h.dashboardService.GetOnlineUsers(c.Request.Context())
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
response.InternalServerError(c, "failed to get online users count")
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
response.Success(c, onlineUsers)
|
|
|
|
|
|
}
|