Files
Quincy_admin/controllers/pms_controller.go
2026-03-26 22:13:03 +08:00

321 lines
9.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Package controllers/pms_controller.go
package controllers
import (
"Quincy_admin/schemas"
"Quincy_admin/services"
"Quincy_admin/utils"
"fmt"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
)
type PermissionController struct {
PmsService *services.PermissionService
}
func NewPermissionController(PmsService *services.PermissionService) *PermissionController {
return &PermissionController{PmsService: PmsService}
}
// GetRoutes 侧边菜单权限
// @Summary 侧边菜单权限
// @Description 根据用户Session获取侧边栏菜单权限
// @Tags 权限模块
// @Accept json
// @Produce json
// @Success 200 {object} schemas.MenuItems "菜单信息"
// @Failure 400 {object} utils.Response
// @Failure 404 {object} utils.Response
// @Failure 500 {object} utils.Response
// @Router /pms/routes [get]
// @Security ApiKeyAuth
func (c *PermissionController) GetRoutes(ctx *gin.Context) {
// 从请求头获取 X-Access-Token
scode := ctx.GetHeader("X-Access-Token")
if scode == "" {
fmt.Println("无效的用户编码", scode)
utils.Fail(ctx, http.StatusBadRequest, "无效的用户编码")
return
}
roleIDInterface, exists := ctx.Get("role_id")
if !exists {
utils.Error(ctx, http.StatusUnauthorized, "权限校验错误用户ID不存在")
ctx.Abort()
return
}
roleID, ok := roleIDInterface.(int)
if !ok {
utils.Error(ctx, http.StatusUnauthorized, "权限校验错误用户ID类型错误")
ctx.Abort()
return
}
items, err := c.PmsService.GetRoutesByID(roleID)
if err != nil {
fmt.Println("获取路由权限失败", err)
utils.Fail(ctx, http.StatusNotFound, "获取失败")
return
}
utils.Success(ctx, items.Children)
}
// GetMenuList 获取菜单列表
// @Summary 获取菜单列表
// @Description 获取管理后台菜单列表
// @Tags 权限模块
// @Accept json
// @Produce json
// @Param role body schemas.MenuListRequest true "req"
// @Success 200 {object} schemas.MenuItems "菜单信息"
// @Failure 400 {object} utils.Response
// @Failure 404 {object} utils.Response
// @Failure 500 {object} utils.Response
// @Router /pms/menus [post]
// @Security ApiKeyAuth
func (c *PermissionController) GetMenuList(ctx *gin.Context) {
var req schemas.MenuListRequest
if err := ctx.ShouldBindJSON(&req); err != nil {
utils.Error(ctx, http.StatusBadRequest, "参数错误")
return
}
if req.PageIndex <= 0 || req.PageSize <= 0 || req.PageSize > 100 {
utils.Error(ctx, http.StatusBadRequest, "分页参数错误")
return
}
items, total, err := c.PmsService.GetMenuList(req.PageIndex, req.PageSize)
if err != nil {
utils.Error(ctx, http.StatusInternalServerError, err.Error())
return
}
response := schemas.MenuListResponse{
Item: items,
Total: total,
PageIndex: req.PageIndex,
PageSize: req.PageSize,
}
utils.Success(ctx, response)
}
// UpdateMenuStatus 启用停用菜单
// @Summary 启用停用菜单
// @Description 启用停用菜单
// @Tags 权限模块
// @Accept json
// @Produce json
// @Param id path string true "id"
// @Param status query int false "启用状态(1:启用,0:停用)"
// @Success 200 {object} utils.Response{data=string}
// @Failure 400 {object} utils.Response
// @Failure 500 {object} utils.Response
// @Router /pms/menus/{id} [put]
// @Security ApiKeyAuth
func (c *PermissionController) UpdateMenuStatus(ctx *gin.Context) {
var idstr = ctx.Param("id")
id, err := strconv.Atoi(idstr)
if err != nil || id <= 0 {
utils.Error(ctx, http.StatusBadRequest, "参数 id 必须是有效的整数")
return
}
statusStr := ctx.Query("status")
if statusStr == "" {
utils.Error(ctx, http.StatusBadRequest, "参数 status 不能为空")
return
}
statusValue, err := strconv.Atoi(statusStr)
if err != nil || (statusValue != 0 && statusValue != 1) {
utils.Error(ctx, http.StatusBadRequest, "参数 status 必须是0或1")
return
}
// 直接传递整数值到服务层
if err := c.PmsService.UpdateMenuStatus(id, statusValue); err != nil {
utils.Error(ctx, http.StatusInternalServerError, "更新任务状态失败: "+err.Error())
return
}
if statusValue == 1 {
utils.Success(ctx, "启用成功")
} else {
utils.Success(ctx, "停用成功")
}
}
// GetPermission 获取权限列表
// @Summary 获取权限列表
// @Description 根据用户Session和权限type获取权限列表
// @Tags 权限模块
// @Accept json
// @Produce json
// @Param type query string false "all-全部 button-按钮route-路由menu-菜单api-接口"
// @Success 200 {object} []string "权限列表"
// @Failure 400 {object} utils.Response
// @Failure 404 {object} utils.Response
// @Failure 500 {object} utils.Response
// @Router /pms/permission [get]
// @Security ApiKeyAuth
func (c *PermissionController) GetPermission(ctx *gin.Context) {
// 获取角色 ID
roleIDInterface, exists := ctx.Get("role_id")
if !exists {
utils.Error(ctx, http.StatusUnauthorized, "权限校验错误用户ID不存在")
ctx.Abort()
return
}
roleID, ok := roleIDInterface.(int)
if !ok {
utils.Error(ctx, http.StatusUnauthorized, "权限校验错误用户ID类型错误")
ctx.Abort()
return
}
typeStr := ctx.Query("type")
if typeStr == "" {
utils.Error(ctx, http.StatusBadRequest, "参数 type 不能为空")
return
}
items, err := c.PmsService.GetPermission(roleID, typeStr)
if err != nil {
fmt.Println("获取路由权限失败", err)
utils.Fail(ctx, http.StatusNotFound, "获取失败")
return
}
utils.Success(ctx, items)
}
// GetAllPermission 获取所有权限
// @Summary 获取所有权限
// @Description 获取所有权限
// @Tags 权限模块
// @Accept json
// @Produce json
// @Success 200 {object} schemas.PermissionItems "权限列表"
// @Failure 400 {object} utils.Response
// @Failure 404 {object} utils.Response
// @Failure 500 {object} utils.Response
// @Router /pms/permission/all [get]
// @Security ApiKeyAuth
// @Security ApiKeyAuth
func (c *PermissionController) GetAllPermission(ctx *gin.Context) {
items, err := c.PmsService.GetAllPermission()
if err != nil {
fmt.Println("获取路由权限失败", err)
utils.Fail(ctx, http.StatusNotFound, "获取失败")
return
}
// 返回树形结构,包含所有层级的 children
utils.Success(ctx, items.Children)
}
// GetRolePermission 获取角色权限
// @Summary 获取角色权限
// @Description 获取角色权限
// @Tags 权限模块
// @Accept json
// @Produce json
// @param role_id query int true "角色ID"
// @Param type query string false "all-全部 button-按钮route-路由menu-菜单api-接口"
// @Success 200 {object} utils.Response{data=[]int} "权限列表"
// @Failure 400 {object} utils.Response
// @Failure 404 {object} utils.Response
// @Failure 500 {object} utils.Response
// @Router /pms/permission/role [get]
// @Security ApiKeyAuth
func (c *PermissionController) GetRolePermission(ctx *gin.Context) {
// 获取角色 ID
var roleIDStr = ctx.Query("role_id")
roleID, err := strconv.Atoi(roleIDStr)
if err != nil {
utils.Error(ctx, http.StatusBadRequest, "参数 role_id 错误")
return
}
typeStr := ctx.Query("type")
if typeStr == "" {
utils.Error(ctx, http.StatusBadRequest, "参数 type 不能为空")
return
}
items, err := c.PmsService.GetRolePermission(roleID, typeStr)
if err != nil {
fmt.Println("获取路由权限失败", err)
utils.Fail(ctx, http.StatusNotFound, "获取失败")
return
}
utils.Success(ctx, items)
}
// AssignPermission 分配角色权限
// @Summary 分配角色权限
// @Description 为指定角色分配权限
// @Tags 权限模块
// @Accept json
// @Produce json
// @Param role_id path int true "角色ID"
// @Param permission_ids query []int true "权限ID数组"
// @Success 200 {object} utils.Response "权限分配成功"
// @Failure 400 {object} utils.Response
// @Failure 500 {object} utils.Response
// @Router /pms/permission/assign/{role_id} [put]
// @Security ApiKeyAuth
func (c *PermissionController) AssignPermission(ctx *gin.Context) {
// 从 path 参数获取角色 ID
roleIDStr := ctx.Param("role_id")
roleID, err := strconv.Atoi(roleIDStr)
if err != nil || roleID <= 0 {
utils.Error(ctx, http.StatusBadRequest, "参数 role_id 必须是有效的正整数")
return
}
if roleID == 1 {
utils.Error(ctx, http.StatusForbidden, "无权修改超级管理员角色")
return
}
// 从请求体解析权限ID数组
var permissionIDs []int
if err := ctx.ShouldBindJSON(&permissionIDs); err != nil {
utils.Error(ctx, http.StatusBadRequest, "参数格式错误: "+err.Error())
return
}
// 验证权限ID数组不为空
if len(permissionIDs) == 0 {
utils.Error(ctx, http.StatusBadRequest, "参数 permission_ids 不能为空")
return
}
// 验证每个权限ID的有效性
for _, id := range permissionIDs {
if id <= 0 {
utils.Error(ctx, http.StatusBadRequest, fmt.Sprintf("权限ID '%d' 必须是有效的正整数", id))
return
}
}
// 调用服务层处理权限分配
if err := c.PmsService.AssignPermission(roleID, permissionIDs); err != nil {
utils.Error(ctx, http.StatusInternalServerError, "权限分配失败: "+err.Error())
return
}
utils.Success(ctx, "权限分配成功")
}