first commit

This commit is contained in:
何昌清
2026-03-26 22:13:03 +08:00
parent bbe1faa363
commit a2685f7f1e
51 changed files with 11244 additions and 0 deletions

View File

@@ -0,0 +1,320 @@
// 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, "权限分配成功")
}