pet-ai/server/plugin/wechat-integration/api/mp_menu_api.go

248 lines
6.4 KiB
Go

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)
}