// Package miniapphdl 是后台管理小程序的 HTTP 接入层。 package miniapphdl import ( "strconv" "github.com/gin-gonic/gin" "portal-mini-go/internal/middleware" "portal-mini-go/internal/pkg/errors" "portal-mini-go/internal/pkg/response" miniappsvc "portal-mini-go/internal/service/admin/miniapp" ) // Handler 小程序管理请求处理。 type Handler struct { svc *miniappsvc.Service } func NewHandler(svc *miniappsvc.Service) *Handler { return &Handler{svc: svc} } // Create 新建小程序。 func (h *Handler) Create(c *gin.Context) { var req miniappsvc.CreateReq if err := c.ShouldBindJSON(&req); err != nil { c.Error(errors.ErrBadRequest) return } m, err := h.svc.Create(c.Request.Context(), req) if err != nil { c.Error(err) return } response.OK(c, m) } // Update 更新小程序。 func (h *Handler) Update(c *gin.Context) { id, ok := parseID(c) if !ok { return } var req miniappsvc.UpdateReq if err := c.ShouldBindJSON(&req); err != nil { c.Error(errors.ErrBadRequest) return } m, err := h.svc.Update(c.Request.Context(), id, req) if err != nil { c.Error(err) return } response.OK(c, m) } // Get 查询单个小程序。 func (h *Handler) Get(c *gin.Context) { id, ok := parseID(c) if !ok { return } m, err := h.svc.GetByID(c.Request.Context(), id) if err != nil { c.Error(err) return } response.OK(c, m) } // List 分页列表小程序。支持 query: status、page、size。 func (h *Handler) List(c *gin.Context) { status, _ := strconv.ParseInt(c.DefaultQuery("status", "-1"), 10, 8) page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) size, _ := strconv.Atoi(c.DefaultQuery("size", "20")) list, total, err := h.svc.List(c.Request.Context(), miniappsvc.ListReq{ Status: int8(status), Page: page, Size: size, }) if err != nil { c.Error(err) return } response.OK(c, gin.H{"list": list, "total": total, "page": page, "size": size}) } // Delete 删除小程序。 func (h *Handler) Delete(c *gin.Context) { id, ok := parseID(c) if !ok { return } if err := h.svc.Delete(c.Request.Context(), id); err != nil { c.Error(err) return } response.OK(c, nil) } // UpdateStatus 更新小程序状态(0 禁用、1 启用)。 func (h *Handler) UpdateStatus(c *gin.Context) { id, ok := parseID(c) if !ok { return } var req miniappsvc.StatusReq if err := c.ShouldBindJSON(&req); err != nil || req.Status == nil { c.Error(errors.ErrBadRequest) return } m, err := h.svc.UpdateStatus(c.Request.Context(), id, *req.Status) if err != nil { c.Error(err) return } response.OK(c, m) } // parseID 从路径参数解析并校验 uint64 主键。 func parseID(c *gin.Context) (uint64, bool) { id, err := strconv.ParseUint(c.Param("id"), 10, 64) if err != nil { c.Error(errors.ErrBadRequest) return 0, false } return id, true } // Register 注册后台小程序管理路由。g 已带 /api/admin 前缀与 JWT 鉴权中间件; // 读接口挂 mini:view,写接口挂 mini:manage。 func Register(g *gin.RouterGroup, h *Handler) { rg := g.Group("/miniapps") { rg.POST("", middleware.RequirePerm(middleware.PermMiniManage), h.Create) rg.PUT("/:id", middleware.RequirePerm(middleware.PermMiniManage), h.Update) rg.GET("/:id", middleware.RequirePerm(middleware.PermMiniView), h.Get) rg.GET("", middleware.RequirePerm(middleware.PermMiniView), h.List) rg.DELETE("/:id", middleware.RequirePerm(middleware.PermMiniManage), h.Delete) rg.PUT("/:id/status", middleware.RequirePerm(middleware.PermMiniManage), h.UpdateStatus) } }