321 lines
9.0 KiB
Go
321 lines
9.0 KiB
Go
// 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, "权限分配成功")
|
||
}
|