package handlers import ( "net/http" "strconv" "github.com/gin-gonic/gin" "github.com/inchstep/server/internal/middleware" "github.com/inchstep/server/internal/services" ) type AdminHandler struct { adminSvc *services.AdminService jwtSecret string } func NewAdminHandler(adminSvc *services.AdminService, jwtSecret string) *AdminHandler { return &AdminHandler{adminSvc: adminSvc, jwtSecret: jwtSecret} } type adminLoginReq struct { Username string `json:"username" binding:"required"` Password string `json:"password" binding:"required"` } func (h *AdminHandler) Login(c *gin.Context) { var req adminLoginReq if err := c.ShouldBindJSON(&req); err != nil { middleware.Error(c, http.StatusBadRequest, 400, "参数格式错误") return } admin, err := h.adminSvc.Login(req.Username, req.Password) if err != nil { middleware.Error(c, http.StatusUnauthorized, 401, err.Error()) return } token, _ := middleware.GenerateToken(admin.ID, h.jwtSecret) middleware.Success(c, gin.H{ "admin": admin, "token": token, }) } func (h *AdminHandler) Dashboard(c *gin.Context) { stats, err := h.adminSvc.GetDashboardStats() if err != nil { middleware.Error(c, http.StatusInternalServerError, 500, err.Error()) return } middleware.Success(c, stats) } func (h *AdminHandler) ListUsers(c *gin.Context) { page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "20")) users, total, err := h.adminSvc.ListUsers(page, pageSize) if err != nil { middleware.Error(c, http.StatusInternalServerError, 500, err.Error()) return } middleware.Success(c, gin.H{"list": users, "total": total, "page": page}) } func (h *AdminHandler) ListPosts(c *gin.Context) { page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "20")) posts, total, err := h.adminSvc.ListPosts(page, pageSize) if err != nil { middleware.Error(c, http.StatusInternalServerError, 500, err.Error()) return } middleware.Success(c, gin.H{"list": posts, "total": total, "page": page}) } func (h *AdminHandler) ListAdmins(c *gin.Context) { admins, err := h.adminSvc.ListAdmins() if err != nil { middleware.Error(c, http.StatusInternalServerError, 500, err.Error()) return } middleware.Success(c, admins) } type createAdminReq struct { Username string `json:"username" binding:"required"` Password string `json:"password" binding:"required"` Role string `json:"role"` Nickname *string `json:"nickname"` } func (h *AdminHandler) CreateAdmin(c *gin.Context) { var req createAdminReq if err := c.ShouldBindJSON(&req); err != nil { middleware.Error(c, http.StatusBadRequest, 400, "参数格式错误") return } role := req.Role if role == "" { role = "admin" } admin, err := h.adminSvc.CreateAdmin(req.Username, req.Password, role, req.Nickname) if err != nil { middleware.Error(c, http.StatusConflict, 409, err.Error()) return } middleware.Success(c, admin) } func (h *AdminHandler) DisableAdmin(c *gin.Context) { id := c.Param("id") if err := h.adminSvc.DisableAdmin(id); err != nil { middleware.Error(c, http.StatusInternalServerError, 500, err.Error()) return } middleware.Success(c, nil) }