You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
354 lines
11 KiB
354 lines
11 KiB
package controller |
|
|
|
import ( |
|
"net/http" |
|
"strconv" |
|
"gofaster/internal/auth/model" |
|
"gofaster/internal/auth/service" |
|
"gofaster/internal/shared/response" |
|
|
|
"github.com/gin-gonic/gin" |
|
"go.uber.org/zap" |
|
) |
|
|
|
// MenuGroupController 菜单分组控制器 |
|
type MenuGroupController struct { |
|
menuGroupService *service.MenuGroupService |
|
logger *zap.Logger |
|
} |
|
|
|
// NewMenuGroupController 创建菜单分组控制器实例 |
|
func NewMenuGroupController(menuGroupService *service.MenuGroupService, logger *zap.Logger) *MenuGroupController { |
|
return &MenuGroupController{ |
|
menuGroupService: menuGroupService, |
|
logger: logger, |
|
} |
|
} |
|
|
|
// CreateMenuGroup 创建菜单分组 |
|
// @Summary 创建菜单分组 |
|
// @Description 创建新的菜单分组 |
|
// @Tags 菜单分组管理 |
|
// @Accept json |
|
// @Produce json |
|
// @Param menuGroup body model.MenuGroup true "菜单分组信息" |
|
// @Success 200 {object} response.Response{data=model.MenuGroup} |
|
// @Failure 400 {object} response.Response |
|
// @Failure 500 {object} response.Response |
|
// @Router /api/menu-groups [post] |
|
func (c *MenuGroupController) CreateMenuGroup(ctx *gin.Context) { |
|
var menuGroup model.MenuGroup |
|
if err := ctx.ShouldBindJSON(&menuGroup); err != nil { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error()) |
|
return |
|
} |
|
|
|
// 验证必填字段 |
|
if menuGroup.Name == "" { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "分组名称不能为空") |
|
return |
|
} |
|
|
|
if err := c.menuGroupService.CreateMenuGroup(&menuGroup); err != nil { |
|
response.Error(ctx, http.StatusInternalServerError, "创建菜单分组失败", err.Error()) |
|
return |
|
} |
|
|
|
response.Success(ctx, "创建菜单分组成功", menuGroup) |
|
} |
|
|
|
// GetMenuGroup 获取菜单分组详情 |
|
// @Summary 获取菜单分组详情 |
|
// @Description 根据ID获取菜单分组详情 |
|
// @Tags 菜单分组管理 |
|
// @Accept json |
|
// @Produce json |
|
// @Param id path int true "菜单分组ID" |
|
// @Success 200 {object} response.Response{data=model.MenuGroup} |
|
// @Failure 400 {object} response.Response |
|
// @Failure 404 {object} response.Response |
|
// @Failure 500 {object} response.Response |
|
// @Router /api/menu-groups/{id} [get] |
|
func (c *MenuGroupController) GetMenuGroup(ctx *gin.Context) { |
|
idStr := ctx.Param("id") |
|
id, err := strconv.ParseUint(idStr, 10, 32) |
|
if err != nil { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "ID格式错误") |
|
return |
|
} |
|
|
|
menuGroup, err := c.menuGroupService.GetMenuGroupByID(uint(id)) |
|
if err != nil { |
|
response.Error(ctx, http.StatusNotFound, "菜单分组不存在", err.Error()) |
|
return |
|
} |
|
|
|
response.Success(ctx, "获取菜单分组成功", menuGroup) |
|
} |
|
|
|
// ListMenuGroups 获取菜单分组列表 |
|
// @Summary 获取菜单分组列表 |
|
// @Description 获取所有菜单分组列表 |
|
// @Tags 菜单分组管理 |
|
// @Accept json |
|
// @Produce json |
|
// @Param status query int false "状态筛选" Enums(0,1) |
|
// @Success 200 {object} response.Response{data=[]model.MenuGroup} |
|
// @Failure 500 {object} response.Response |
|
// @Router /api/menu-groups [get] |
|
func (c *MenuGroupController) ListMenuGroups(ctx *gin.Context) { |
|
statusStr := ctx.Query("status") |
|
|
|
var menuGroups []*model.MenuGroup |
|
var err error |
|
|
|
if statusStr != "" { |
|
status, parseErr := strconv.Atoi(statusStr) |
|
if parseErr != nil { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "状态参数格式错误") |
|
return |
|
} |
|
menuGroups, err = c.menuGroupService.ListMenuGroupsByStatus(status) |
|
} else { |
|
menuGroups, err = c.menuGroupService.ListMenuGroups() |
|
} |
|
|
|
if err != nil { |
|
response.Error(ctx, http.StatusInternalServerError, "获取菜单分组列表失败", err.Error()) |
|
return |
|
} |
|
|
|
response.Success(ctx, "获取菜单分组列表成功", menuGroups) |
|
} |
|
|
|
// UpdateMenuGroup 更新菜单分组 |
|
// @Summary 更新菜单分组 |
|
// @Description 更新菜单分组信息 |
|
// @Tags 菜单分组管理 |
|
// @Accept json |
|
// @Produce json |
|
// @Param id path int true "菜单分组ID" |
|
// @Param menuGroup body model.MenuGroup true "菜单分组信息" |
|
// @Success 200 {object} response.Response{data=model.MenuGroup} |
|
// @Failure 400 {object} response.Response |
|
// @Failure 404 {object} response.Response |
|
// @Failure 500 {object} response.Response |
|
// @Router /api/menu-groups/{id} [put] |
|
func (c *MenuGroupController) UpdateMenuGroup(ctx *gin.Context) { |
|
idStr := ctx.Param("id") |
|
id, err := strconv.ParseUint(idStr, 10, 32) |
|
if err != nil { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "ID格式错误") |
|
return |
|
} |
|
|
|
var menuGroup model.MenuGroup |
|
if err := ctx.ShouldBindJSON(&menuGroup); err != nil { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error()) |
|
return |
|
} |
|
|
|
// 验证必填字段 |
|
if menuGroup.Name == "" { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "分组名称不能为空") |
|
return |
|
} |
|
|
|
menuGroup.ID = uint(id) |
|
|
|
if err := c.menuGroupService.UpdateMenuGroup(&menuGroup); err != nil { |
|
response.Error(ctx, http.StatusInternalServerError, "更新菜单分组失败", err.Error()) |
|
return |
|
} |
|
|
|
response.Success(ctx, "更新菜单分组成功", menuGroup) |
|
} |
|
|
|
// DeleteMenuGroup 删除菜单分组 |
|
// @Summary 删除菜单分组 |
|
// @Description 根据ID删除菜单分组 |
|
// @Tags 菜单分组管理 |
|
// @Accept json |
|
// @Produce json |
|
// @Param id path int true "菜单分组ID" |
|
// @Success 200 {object} response.Response |
|
// @Failure 400 {object} response.Response |
|
// @Failure 404 {object} response.Response |
|
// @Failure 500 {object} response.Response |
|
// @Router /api/menu-groups/{id} [delete] |
|
func (c *MenuGroupController) DeleteMenuGroup(ctx *gin.Context) { |
|
idStr := ctx.Param("id") |
|
id, err := strconv.ParseUint(idStr, 10, 32) |
|
if err != nil { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "ID格式错误") |
|
return |
|
} |
|
|
|
if err := c.menuGroupService.DeleteMenuGroup(uint(id)); err != nil { |
|
response.Error(ctx, http.StatusInternalServerError, "删除菜单分组失败", err.Error()) |
|
return |
|
} |
|
|
|
response.Success(ctx, "删除菜单分组成功", nil) |
|
} |
|
|
|
// BatchDeleteMenuGroups 批量删除菜单分组 |
|
// @Summary 批量删除菜单分组 |
|
// @Description 批量删除菜单分组 |
|
// @Tags 菜单分组管理 |
|
// @Accept json |
|
// @Produce json |
|
// @Param ids body []uint true "菜单分组ID列表" |
|
// @Success 200 {object} response.Response |
|
// @Failure 400 {object} response.Response |
|
// @Failure 500 {object} response.Response |
|
// @Router /api/menu-groups/batch-delete [post] |
|
func (c *MenuGroupController) BatchDeleteMenuGroups(ctx *gin.Context) { |
|
var request struct { |
|
IDs []uint `json:"ids" binding:"required"` |
|
} |
|
|
|
if err := ctx.ShouldBindJSON(&request); err != nil { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error()) |
|
return |
|
} |
|
|
|
if len(request.IDs) == 0 { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "ID列表不能为空") |
|
return |
|
} |
|
|
|
if err := c.menuGroupService.BatchDeleteMenuGroups(request.IDs); err != nil { |
|
response.Error(ctx, http.StatusInternalServerError, "批量删除菜单分组失败", err.Error()) |
|
return |
|
} |
|
|
|
response.Success(ctx, "批量删除菜单分组成功", nil) |
|
} |
|
|
|
// UpdateMenuGroupStatus 更新菜单分组状态 |
|
// @Summary 更新菜单分组状态 |
|
// @Description 更新菜单分组状态 |
|
// @Tags 菜单分组管理 |
|
// @Accept json |
|
// @Produce json |
|
// @Param id path int true "菜单分组ID" |
|
// @Param request body map[string]int true "状态信息" SchemaExample({"status": 1}) |
|
// @Success 200 {object} response.Response |
|
// @Failure 400 {object} response.Response |
|
// @Failure 404 {object} response.Response |
|
// @Failure 500 {object} response.Response |
|
// @Router /api/menu-groups/{id}/status [put] |
|
func (c *MenuGroupController) UpdateMenuGroupStatus(ctx *gin.Context) { |
|
idStr := ctx.Param("id") |
|
id, err := strconv.ParseUint(idStr, 10, 32) |
|
if err != nil { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "ID格式错误") |
|
return |
|
} |
|
|
|
var request struct { |
|
Status int `json:"status" binding:"required"` |
|
} |
|
|
|
if err := ctx.ShouldBindJSON(&request); err != nil { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error()) |
|
return |
|
} |
|
|
|
if err := c.menuGroupService.UpdateMenuGroupStatus(uint(id), request.Status); err != nil { |
|
response.Error(ctx, http.StatusInternalServerError, "更新菜单分组状态失败", err.Error()) |
|
return |
|
} |
|
|
|
response.Success(ctx, "更新菜单分组状态成功", nil) |
|
} |
|
|
|
// UpdateMenuGroupSort 更新菜单分组排序 |
|
// @Summary 更新菜单分组排序 |
|
// @Description 更新菜单分组排序 |
|
// @Tags 菜单分组管理 |
|
// @Accept json |
|
// @Produce json |
|
// @Param id path int true "菜单分组ID" |
|
// @Param request body map[string]int true "排序信息" SchemaExample({"sort": 1}) |
|
// @Success 200 {object} response.Response |
|
// @Failure 400 {object} response.Response |
|
// @Failure 404 {object} response.Response |
|
// @Failure 500 {object} response.Response |
|
// @Router /api/menu-groups/{id}/sort [put] |
|
func (c *MenuGroupController) UpdateMenuGroupSort(ctx *gin.Context) { |
|
idStr := ctx.Param("id") |
|
id, err := strconv.ParseUint(idStr, 10, 32) |
|
if err != nil { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "ID格式错误") |
|
return |
|
} |
|
|
|
var request struct { |
|
Sort int `json:"sort" binding:"required"` |
|
} |
|
|
|
if err := ctx.ShouldBindJSON(&request); err != nil { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error()) |
|
return |
|
} |
|
|
|
if err := c.menuGroupService.UpdateMenuGroupSort(uint(id), request.Sort); err != nil { |
|
response.Error(ctx, http.StatusInternalServerError, "更新菜单分组排序失败", err.Error()) |
|
return |
|
} |
|
|
|
response.Success(ctx, "更新菜单分组排序成功", nil) |
|
} |
|
|
|
// BatchUpdateMenuGroupSort 批量更新菜单分组排序 |
|
// @Summary 批量更新菜单分组排序 |
|
// @Description 批量更新菜单分组排序 |
|
// @Tags 菜单分组管理 |
|
// @Accept json |
|
// @Produce json |
|
// @Param request body map[uint]int true "排序信息" SchemaExample({"1": 1, "2": 2}) |
|
// @Success 200 {object} response.Response |
|
// @Failure 400 {object} response.Response |
|
// @Failure 500 {object} response.Response |
|
// @Router /api/menu-groups/batch-sort [put] |
|
func (c *MenuGroupController) BatchUpdateMenuGroupSort(ctx *gin.Context) { |
|
var request map[uint]int |
|
|
|
if err := ctx.ShouldBindJSON(&request); err != nil { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error()) |
|
return |
|
} |
|
|
|
if len(request) == 0 { |
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "排序数据不能为空") |
|
return |
|
} |
|
|
|
if err := c.menuGroupService.BatchUpdateMenuGroupSort(request); err != nil { |
|
response.Error(ctx, http.StatusInternalServerError, "批量更新菜单分组排序失败", err.Error()) |
|
return |
|
} |
|
|
|
response.Success(ctx, "批量更新菜单分组排序成功", nil) |
|
} |
|
|
|
// GetMenuGroupStats 获取菜单分组统计信息 |
|
// @Summary 获取菜单分组统计信息 |
|
// @Description 获取菜单分组统计信息 |
|
// @Tags 菜单分组管理 |
|
// @Accept json |
|
// @Produce json |
|
// @Success 200 {object} response.Response{data=map[string]interface{}} |
|
// @Failure 500 {object} response.Response |
|
// @Router /api/menu-groups/stats [get] |
|
func (c *MenuGroupController) GetMenuGroupStats(ctx *gin.Context) { |
|
stats, err := c.menuGroupService.GetMenuGroupStats() |
|
if err != nil { |
|
response.Error(ctx, http.StatusInternalServerError, "获取菜单分组统计信息失败", err.Error()) |
|
return |
|
} |
|
|
|
response.Success(ctx, "获取菜单分组统计信息成功", stats) |
|
}
|
|
|