package api import ( "strconv" "github.com/flipped-aurora/gin-vue-admin/server/global" "github.com/flipped-aurora/gin-vue-admin/server/model/common/response" "github.com/flipped-aurora/gin-vue-admin/server/plugin/wechat-integration/model" "github.com/flipped-aurora/gin-vue-admin/server/plugin/wechat-integration/model/request" "github.com/flipped-aurora/gin-vue-admin/server/plugin/wechat-integration/service" "github.com/gin-gonic/gin" "go.uber.org/zap" ) type MpMenuApi struct{} var mpMenuService = service.ServiceGroupApp.MpMenuService // GetMenuList 获取菜单列表 // @Tags MpMenu // @Summary 获取菜单列表 // @Description 获取公众号菜单配置列表 // @Accept json // @Produce json // @Success 200 {object} response.Response{data=[]model.MpMenu} "获取成功" // @Router /wechat/mp/menu [get] func (m *MpMenuApi) GetMenuList(c *gin.Context) { menus, err := mpMenuService.GetMenuList() if err != nil { global.GVA_LOG.Error("获取菜单列表失败!", zap.Error(err)) response.FailWithMessage("获取失败: "+err.Error(), c) return } response.OkWithDetailed(menus, "获取成功", c) } // GetMenuByID 获取菜单详情 // @Tags MpMenu // @Summary 获取菜单详情 // @Description 根据ID获取菜单详细信息 // @Accept json // @Produce json // @Param id path int true "菜单ID" // @Success 200 {object} response.Response{data=model.MpMenu} "获取成功" // @Router /wechat/mp/menu/{id} [get] func (m *MpMenuApi) GetMenuByID(c *gin.Context) { idStr := c.Param("id") id, err := strconv.ParseUint(idStr, 10, 32) if err != nil { response.FailWithMessage("无效的菜单ID", c) return } menu, err := mpMenuService.GetMenuByID(uint(id)) if err != nil { global.GVA_LOG.Error("获取菜单详情失败!", zap.Error(err)) response.FailWithMessage("获取失败: "+err.Error(), c) return } response.OkWithData(menu, c) } // CreateMenu 创建菜单 // @Tags MpMenu // @Summary 创建菜单 // @Description 创建新的菜单项 // @Accept json // @Produce json // @Param data body request.CreateMenuRequest true "创建参数" // @Success 200 {object} response.Response{data=model.MpMenu} "创建成功" // @Router /wechat/mp/menu [post] func (m *MpMenuApi) CreateMenu(c *gin.Context) { var req request.CreateMenuRequest err := c.ShouldBindJSON(&req) if err != nil { response.FailWithMessage(err.Error(), c) return } // 验证必填字段 if req.Name == "" || req.Type == "" { response.FailWithMessage("菜单名称和类型不能为空", c) return } // 构建菜单对象 menu := &model.MpMenu{ Name: &req.Name, Type: req.Type, } // 设置可选字段 if req.ParentID != "" { menu.ParentID = &req.ParentID } if req.MenuKey != "" { menu.MenuKey = &req.MenuKey } if req.URL != "" { menu.URL = &req.URL } if req.MiniProgramAppID != "" { menu.MiniProgramAppID = &req.MiniProgramAppID } if req.MiniProgramPagePath != "" { menu.MiniProgramPagePath = &req.MiniProgramPagePath } if req.ReplyMessageType != "" { menu.ReplyMessageType = &req.ReplyMessageType } if req.ReplyContent != "" { menu.ReplyContent = &req.ReplyContent } err = mpMenuService.CreateMenu(menu) if err != nil { global.GVA_LOG.Error("创建菜单失败!", zap.Error(err)) response.FailWithMessage("创建失败: "+err.Error(), c) return } response.OkWithDetailed(menu, "创建成功", c) } // UpdateMenu 更新菜单 // @Tags MpMenu // @Summary 更新菜单 // @Description 更新菜单项 // @Accept json // @Produce json // @Param data body request.UpdateMenuRequest true "更新参数" // @Success 200 {object} response.Response "更新成功" // @Router /wechat/mp/menu [put] func (m *MpMenuApi) UpdateMenu(c *gin.Context) { var req request.UpdateMenuRequest err := c.ShouldBindJSON(&req) if err != nil { response.FailWithMessage(err.Error(), c) return } if req.ID == 0 { response.FailWithMessage("ID不能为空", c) return } // 获取现有记录 existingMenu, err := mpMenuService.GetMenuByID(req.ID) if err != nil { global.GVA_LOG.Error("获取菜单失败!", zap.Error(err)) response.FailWithMessage("获取失败: "+err.Error(), c) return } // 更新字段 if req.Name != "" { existingMenu.Name = &req.Name } if req.Type != "" { existingMenu.Type = req.Type } if req.MenuKey != "" { existingMenu.MenuKey = &req.MenuKey } if req.URL != "" { existingMenu.URL = &req.URL } if req.ReplyContent != "" { existingMenu.ReplyContent = &req.ReplyContent } err = mpMenuService.UpdateMenu(existingMenu) if err != nil { global.GVA_LOG.Error("更新菜单失败!", zap.Error(err)) response.FailWithMessage("更新失败: "+err.Error(), c) return } response.OkWithMessage("更新成功", c) } // DeleteMenu 删除菜单 // @Tags MpMenu // @Summary 删除菜单 // @Description 删除指定的菜单项 // @Accept json // @Produce json // @Param id path int true "菜单ID" // @Success 200 {object} response.Response "删除成功" // @Router /wechat/mp/menu/{id} [delete] func (m *MpMenuApi) DeleteMenu(c *gin.Context) { idStr := c.Param("id") id, err := strconv.ParseUint(idStr, 10, 32) if err != nil { response.FailWithMessage("无效的菜单ID", c) return } err = mpMenuService.DeleteMenu(uint(id)) if err != nil { global.GVA_LOG.Error("删除菜单失败!", zap.Error(err)) response.FailWithMessage("删除失败: "+err.Error(), c) return } response.OkWithMessage("删除成功", c) } // PublishMenu 发布菜单 // @Tags MpMenu // @Summary 发布菜单 // @Description 将菜单配置发布到微信服务器 // @Accept json // @Produce json // @Success 200 {object} response.Response "发布成功" // @Router /wechat/mp/menu/publish [post] func (m *MpMenuApi) PublishMenu(c *gin.Context) { err := mpMenuService.PublishMenu() if err != nil { global.GVA_LOG.Error("发布菜单失败!", zap.Error(err)) response.FailWithMessage("发布失败: "+err.Error(), c) return } response.OkWithMessage("发布成功", c) } // DeleteWechatMenu 删除微信菜单 // @Tags MpMenu // @Summary 删除微信菜单 // @Description 删除微信服务器上的菜单 // @Accept json // @Produce json // @Success 200 {object} response.Response "删除成功" // @Router /wechat/mp/menu/wechat [delete] func (m *MpMenuApi) DeleteWechatMenu(c *gin.Context) { err := mpMenuService.DeleteWechatMenu() if err != nil { global.GVA_LOG.Error("删除微信菜单失败!", zap.Error(err)) response.FailWithMessage("删除失败: "+err.Error(), c) return } response.OkWithMessage("删除成功", c) }