package controller import ( "net/http" "strconv" "ezops/model" "github.com/gin-gonic/gin" ) // CreateRole 创建角色 // Logan.Li // POST /api/v1/admin/roles func (h *UserHandler) CreateRole(c *gin.Context) { var req model.CreateRoleRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, model.Response{ Code: 400, Message: "请求参数错误: " + err.Error(), }) return } // 名称 / 编码唯一性校验 var existing model.Role if err := h.db.Where("name = ? OR code = ?", req.Name, req.Code).First(&existing).Error; err == nil { c.JSON(http.StatusBadRequest, model.Response{ Code: 400, Message: "角色名称或编码已存在", }) return } role := model.Role{ Name: req.Name, Code: req.Code, Description: req.Description, Status: 1, } if err := h.db.Create(&role).Error; err != nil { c.JSON(http.StatusInternalServerError, model.Response{ Code: 500, Message: "创建角色失败", }) return } // 关联权限 if len(req.PermissionIDs) > 0 { var perms []model.Permission h.db.Find(&perms, req.PermissionIDs) h.db.Model(&role).Association("Permissions").Append(perms) } h.db.Preload("Permissions").First(&role, role.ID) c.JSON(http.StatusOK, model.Response{ Code: 200, Message: "创建成功", Data: role, }) } // UpdateRole 更新角色 // Logan.Li // PUT /api/v1/admin/roles/:id func (h *UserHandler) UpdateRole(c *gin.Context) { id, err := strconv.Atoi(c.Param("id")) if err != nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "无效的角色 ID"}) return } var req model.UpdateRoleRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, model.Response{ Code: 400, Message: "请求参数错误: " + err.Error(), }) return } var role model.Role if err := h.db.First(&role, id).Error; err != nil { c.JSON(http.StatusNotFound, model.Response{Code: 404, Message: "角色不存在"}) return } updates := map[string]interface{}{} if req.Name != "" { // 名称 / 编码唯一性校验(排除自身) var dup model.Role if err := h.db.Where("(name = ? OR code = ?) AND id != ?", req.Name, req.Code, id).First(&dup).Error; err == nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "角色名称或编码已存在"}) return } updates["name"] = req.Name } if req.Code != "" { updates["code"] = req.Code } if req.Description != nil { updates["description"] = *req.Description } if req.Status != nil { updates["status"] = *req.Status } if len(updates) > 0 { if err := h.db.Model(&role).Updates(updates).Error; err != nil { c.JSON(http.StatusInternalServerError, model.Response{Code: 500, Message: "更新失败"}) return } } // 替换权限关联 if req.PermissionIDs != nil { var perms []model.Permission if len(req.PermissionIDs) > 0 { h.db.Find(&perms, req.PermissionIDs) } h.db.Model(&role).Association("Permissions").Replace(perms) } h.db.Preload("Permissions").First(&role, id) c.JSON(http.StatusOK, model.Response{ Code: 200, Message: "更新成功", Data: role, }) } // DeleteRole 删除角色 // Logan.Li // DELETE /api/v1/admin/roles/:id func (h *UserHandler) DeleteRole(c *gin.Context) { id, err := strconv.Atoi(c.Param("id")) if err != nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "无效的角色 ID"}) return } var role model.Role if err := h.db.First(&role, id).Error; err != nil { c.JSON(http.StatusNotFound, model.Response{Code: 404, Message: "角色不存在"}) return } // 清空权限关联后再删除(避免 join 表残留) h.db.Model(&role).Association("Permissions").Clear() if err := h.db.Delete(&role).Error; err != nil { c.JSON(http.StatusInternalServerError, model.Response{Code: 500, Message: "删除失败"}) return } c.JSON(http.StatusOK, model.Response{ Code: 200, Message: "删除成功", }) } // ListPermissions 获取权限列表(供前端角色权限选择) // Logan.Li // GET /api/v1/admin/permissions func (h *UserHandler) ListPermissions(c *gin.Context) { var perms []model.Permission h.db.Where("status = ?", 1).Order("sort ASC, id ASC").Find(&perms) c.JSON(http.StatusOK, model.Response{ Code: 200, Data: model.ListResponse{List: perms, Total: int64(len(perms))}, }) }