feat():learning后台管理项目初始化
This commit is contained in:
228
internal/api/handlers/role_handler.go
Normal file
228
internal/api/handlers/role_handler.go
Normal file
@@ -0,0 +1,228 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"goalfymax-admin/internal/models"
|
||||
"goalfymax-admin/internal/services"
|
||||
"goalfymax-admin/pkg/utils"
|
||||
"strconv"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
// RoleHandler 角色处理器
|
||||
type RoleHandler struct {
|
||||
roleService services.RoleService
|
||||
rbacService services.RBACService
|
||||
response *utils.Response
|
||||
logger *utils.Logger
|
||||
}
|
||||
|
||||
// NewRoleHandler 创建角色处理器
|
||||
func NewRoleHandler(roleService services.RoleService, rbacService services.RBACService, logger *utils.Logger) *RoleHandler {
|
||||
return &RoleHandler{
|
||||
roleService: roleService,
|
||||
rbacService: rbacService,
|
||||
response: utils.NewResponse(),
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
// Create 创建角色
|
||||
func (h *RoleHandler) Create(c *gin.Context) {
|
||||
var req models.RoleCreateRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
h.response.ValidateError(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
role, err := h.roleService.Create(&req)
|
||||
if err != nil {
|
||||
h.logger.Error("创建角色失败", zap.Error(err))
|
||||
h.response.InternalServerError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
h.response.Success(c, role)
|
||||
}
|
||||
|
||||
// GetByID 获取角色详情
|
||||
func (h *RoleHandler) GetByID(c *gin.Context) {
|
||||
idStr := c.Param("id")
|
||||
id, err := strconv.ParseUint(idStr, 10, 32)
|
||||
if err != nil {
|
||||
h.response.BadRequest(c, "无效的角色ID")
|
||||
return
|
||||
}
|
||||
|
||||
role, err := h.roleService.GetByID(uint(id))
|
||||
if err != nil {
|
||||
h.logger.Error("获取角色失败", zap.Error(err))
|
||||
h.response.InternalServerError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
h.response.Success(c, role)
|
||||
}
|
||||
|
||||
// Update 更新角色
|
||||
func (h *RoleHandler) Update(c *gin.Context) {
|
||||
idStr := c.Param("id")
|
||||
id, err := strconv.ParseUint(idStr, 10, 32)
|
||||
if err != nil {
|
||||
h.response.BadRequest(c, "无效的角色ID")
|
||||
return
|
||||
}
|
||||
|
||||
var req models.RoleUpdateRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
h.response.ValidateError(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
role, err := h.roleService.Update(uint(id), &req)
|
||||
if err != nil {
|
||||
h.logger.Error("更新角色失败", zap.Error(err))
|
||||
h.response.InternalServerError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
h.response.Success(c, role)
|
||||
}
|
||||
|
||||
// Delete 删除角色
|
||||
func (h *RoleHandler) Delete(c *gin.Context) {
|
||||
idStr := c.Param("id")
|
||||
id, err := strconv.ParseUint(idStr, 10, 32)
|
||||
if err != nil {
|
||||
h.response.BadRequest(c, "无效的角色ID")
|
||||
return
|
||||
}
|
||||
|
||||
err = h.roleService.Delete(uint(id))
|
||||
if err != nil {
|
||||
h.logger.Error("删除角色失败", zap.Error(err))
|
||||
h.response.InternalServerError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
h.response.Success(c, gin.H{"message": "角色删除成功"})
|
||||
}
|
||||
|
||||
// List 获取角色列表
|
||||
func (h *RoleHandler) List(c *gin.Context) {
|
||||
var req models.RoleListRequest
|
||||
if err := c.ShouldBindQuery(&req); err != nil {
|
||||
h.response.ValidateError(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
roles, total, err := h.roleService.List(&req)
|
||||
if err != nil {
|
||||
h.logger.Error("获取角色列表失败", zap.Error(err))
|
||||
h.response.InternalServerError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
// 为每个角色获取页面权限
|
||||
rolesWithPermissions := make([]gin.H, len(roles))
|
||||
for i, role := range roles {
|
||||
// 获取角色的页面权限
|
||||
pages, err := h.rbacService.GetRolePagePermissions(role.ID)
|
||||
if err != nil {
|
||||
h.logger.Warn("获取角色页面权限失败", zap.Uint("roleId", role.ID), zap.Error(err))
|
||||
pages = []models.Page{} // 如果获取失败,返回空数组
|
||||
}
|
||||
|
||||
rolesWithPermissions[i] = gin.H{
|
||||
"id": role.ID,
|
||||
"name": role.Name,
|
||||
"level": role.Level,
|
||||
"description": role.Description,
|
||||
"isDefault": role.IsDefault,
|
||||
"createdAt": role.CreatedAt,
|
||||
"updatedAt": role.UpdatedAt,
|
||||
"deletedAt": role.DeletedAt,
|
||||
"pages": pages, // 添加页面权限信息
|
||||
}
|
||||
}
|
||||
|
||||
h.response.Success(c, gin.H{
|
||||
"roles": rolesWithPermissions,
|
||||
"total": total,
|
||||
"page": req.Page,
|
||||
"size": req.Size,
|
||||
})
|
||||
}
|
||||
|
||||
// UpdateStatus 更新角色状态
|
||||
func (h *RoleHandler) UpdateStatus(c *gin.Context) {
|
||||
idStr := c.Param("id")
|
||||
id, err := strconv.ParseUint(idStr, 10, 32)
|
||||
if err != nil {
|
||||
h.response.BadRequest(c, "无效的角色ID")
|
||||
return
|
||||
}
|
||||
|
||||
var req struct {
|
||||
Status int `json:"status" binding:"required"`
|
||||
}
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
h.response.ValidateError(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
err = h.roleService.UpdateStatus(uint(id), req.Status)
|
||||
if err != nil {
|
||||
h.logger.Error("更新角色状态失败", zap.Error(err))
|
||||
h.response.InternalServerError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
h.response.Success(c, gin.H{"message": "角色状态更新成功"})
|
||||
}
|
||||
|
||||
// UpdatePermissions 更新角色权限
|
||||
func (h *RoleHandler) UpdatePermissions(c *gin.Context) {
|
||||
idStr := c.Param("id")
|
||||
id, err := strconv.ParseUint(idStr, 10, 32)
|
||||
if err != nil {
|
||||
h.response.BadRequest(c, "无效的角色ID")
|
||||
return
|
||||
}
|
||||
|
||||
var req models.RolePagePermissionAssignRequest
|
||||
req.RoleID = uint(id)
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
h.response.ValidateError(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
err = h.rbacService.AssignRolePagePermissions(&req)
|
||||
if err != nil {
|
||||
h.logger.Error("更新角色权限失败", zap.Error(err))
|
||||
h.response.InternalServerError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
h.response.Success(c, gin.H{"message": "角色权限更新成功"})
|
||||
}
|
||||
|
||||
// GetRolePermissions 获取角色权限
|
||||
func (h *RoleHandler) GetRolePermissions(c *gin.Context) {
|
||||
idStr := c.Param("id")
|
||||
id, err := strconv.ParseUint(idStr, 10, 32)
|
||||
if err != nil {
|
||||
h.response.BadRequest(c, "无效的角色ID")
|
||||
return
|
||||
}
|
||||
|
||||
permissions, err := h.rbacService.GetRolePagePermissions(uint(id))
|
||||
if err != nil {
|
||||
h.logger.Error("获取角色权限失败", zap.Error(err))
|
||||
h.response.InternalServerError(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
h.response.Success(c, gin.H{"permissions": permissions})
|
||||
}
|
||||
Reference in New Issue
Block a user