diff --git a/api/controller/menu.go b/api/controller/menu.go index 3f70a34..bfed8d0 100644 --- a/api/controller/menu.go +++ b/api/controller/menu.go @@ -2,13 +2,18 @@ package controller import ( "github.com/gin-gonic/gin" + "hospital-admin-api/api/requests" "hospital-admin-api/api/responses" "hospital-admin-api/api/service" + "hospital-admin-api/global" + "hospital-admin-api/utils" ) type Menu struct{} -// GetMenuList 获取菜单列表 +var MenuRequest requests.MenuRequest + +// GetMenuList 获取全部菜单列表 func (r *Menu) GetMenuList(c *gin.Context) { MenuService := service.MenuService{} MenuList, err := MenuService.GetMenuList() @@ -25,3 +30,54 @@ func (r *Menu) GetMenuList(c *gin.Context) { responses.OkWithData(MenuList, c) return } + +// AddMenu 新增菜单 +func (r *Menu) AddMenu(c *gin.Context) { + if err := c.ShouldBindJSON(&MenuRequest.AddMenu); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(MenuRequest.AddMenu); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + // 处理参数 + if MenuRequest.AddMenu.MenuType == 1 || MenuRequest.AddMenu.MenuType == 2 { + // 模块-菜单 + if MenuRequest.AddMenu.Path == "" { + responses.FailWithMessage("请填写页面地址", c) + return + } + + if MenuRequest.AddMenu.Component == "" { + responses.FailWithMessage("请填写组件名称", c) + return + } + } + + // 非模块无父级 + if MenuRequest.AddMenu.ParentId == 0 && MenuRequest.AddMenu.MenuType != 1 { + responses.FailWithMessage("请选择父节点", c) + return + } + + // 模块存在父级 + if MenuRequest.AddMenu.ParentId != 0 && MenuRequest.AddMenu.MenuType == 1 { + responses.FailWithMessage("顶级菜单,无法添加上级菜单", c) + return + } + + // 业务处理 + MenuService := service.MenuService{} + _, err := MenuService.AddMenu(MenuRequest.AddMenu) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) + return +} diff --git a/api/controller/role.go b/api/controller/role.go index 2a211e3..ed571b3 100644 --- a/api/controller/role.go +++ b/api/controller/role.go @@ -39,8 +39,8 @@ func (r *Role) GetRoleMenuList(c *gin.Context) { responses.OkWithData(roleMenuList, c) } -// GetRoleList 搜索角色列表 -func (r *Role) GetRoleList(c *gin.Context) { +// GetRolePage 搜索角色列表 +func (r *Role) GetRolePage(c *gin.Context) { if err := c.ShouldBind(&RoleRequest.GetRoleList); err != nil { responses.FailWithMessage(err.Error(), c) return @@ -61,14 +61,20 @@ func (r *Role) GetRoleList(c *gin.Context) { } AdminRoleDao := dao.AdminRoleDao{} - adminRole, err := AdminRoleDao.GetAdminRolePageSearch(RoleRequest.GetRoleList.RoleName, RoleRequest.GetRoleList.Page, RoleRequest.GetRoleList.PageSize) - if err != nil || adminRole == nil { - responses.Ok(c) + adminRole, total, err := AdminRoleDao.GetAdminRolePageSearch(RoleRequest.GetRoleList.RoleName, RoleRequest.GetRoleList.Page, RoleRequest.GetRoleList.PageSize) + + if err != nil { + responses.FailWithMessage(err.Error(), c) c.Abort() return } - responses.OkWithData(adminRole, c) + result := make(map[string]interface{}) + result["page"] = RoleRequest.GetRoleList.Page + result["page_size"] = RoleRequest.GetRoleList.PageSize + result["total"] = total + result["data"] = adminRole + responses.OkWithData(result, c) } // PutRoleStatus 角色禁用/启用 @@ -167,3 +173,45 @@ func (r *Role) GetRole(c *gin.Context) { responses.OkWithData(GetRoleResponse, c) } + +// PutRole 修改角色 +func (r *Role) PutRole(c *gin.Context) { + if err := c.ShouldBindJSON(&RoleRequest.PutRole); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(RoleRequest.PutRole); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + id := c.Param("role_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + roleId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 判断菜单数据是否为空 + if len(RoleRequest.PutRole.MenuIds) == 0 { + responses.FailWithMessage("请为角色添加菜单", c) + return + } + + // 业务处理 + RoleService := service.RoleService{} + _, err = RoleService.PutRole(c, roleId, RoleRequest.PutRole) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + responses.Ok(c) +} diff --git a/api/dao/adminApi.go b/api/dao/adminApi.go new file mode 100644 index 0000000..2200891 --- /dev/null +++ b/api/dao/adminApi.go @@ -0,0 +1,18 @@ +package dao + +import ( + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type AdminApiDao struct { +} + +// GetAdminApiById 获取菜单数据-菜单id +func (r *AdminApiDao) GetAdminApiById(apiId int64) (m *model.AdminAPI, err error) { + err = global.Db.First(&m, apiId).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/dao/adminMenu.go b/api/dao/adminMenu.go index ed247a0..69be3b1 100644 --- a/api/dao/adminMenu.go +++ b/api/dao/adminMenu.go @@ -1,6 +1,7 @@ package dao import ( + "gorm.io/gorm" "hospital-admin-api/api/model" "hospital-admin-api/global" ) @@ -34,3 +35,20 @@ func (r *AdminMenuDao) GetAdminMenuById(menuId int64) (m *model.AdminMenu, err e } return m, nil } + +// GetAdminMenuListNormalSortOrderNum 获取全部正常菜单列表-排序 +func (r *AdminMenuDao) GetAdminMenuListNormalSortOrderNum() (m []*model.AdminMenu, err error) { + err = global.Db.Where("menu_status = ?", 1).Order("order_num asc").Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddAdminMenu 新增菜单 +func (r *AdminMenuDao) AddAdminMenu(tx *gorm.DB, model *model.AdminMenu) (*model.AdminMenu, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} diff --git a/api/dao/adminMenuApi.go b/api/dao/adminMenuApi.go index 624a86c..15de034 100644 --- a/api/dao/adminMenuApi.go +++ b/api/dao/adminMenuApi.go @@ -1,6 +1,7 @@ package dao import ( + "gorm.io/gorm" "hospital-admin-api/api/model" "hospital-admin-api/global" ) @@ -17,3 +18,11 @@ func (r *AdminMenuApiDao) GetAdminMenuApiListByMenuID(menuId int64) (m []*model. } return m, nil } + +// AddAdminMenuApi 新增菜单api +func (r *AdminMenuApiDao) AddAdminMenuApi(tx *gorm.DB, model *model.AdminMenuApi) (*model.AdminMenuApi, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} diff --git a/api/dao/adminRole.go b/api/dao/adminRole.go index 23ca0da..60c66e8 100644 --- a/api/dao/adminRole.go +++ b/api/dao/adminRole.go @@ -19,25 +19,6 @@ func (r *AdminRoleDao) GetAdminRoleFirstById(roleId int64) (m *model.AdminRole, return m, nil } -// GetAdminRolePageSearch 搜索角色列表-分页 -func (r *AdminRoleDao) GetAdminRolePageSearch(roleName string, page, pageSize int) (m []*model.AdminRole, err error) { - // 计算偏移量 - offset := (page - 1) * pageSize - - if roleName != "" { - err = global.Db.Where("role_name = ?", roleName).Offset(offset).Limit(pageSize).Find(&m).Error - if err != nil { - return nil, err - } - } else { - err = global.Db.Offset(offset).Limit(pageSize).Find(&m).Error - if err != nil { - return nil, err - } - } - return m, nil -} - // EditAdminRoleStatusById 角色启用/禁用-角色id func (r *AdminRoleDao) EditAdminRoleStatusById(roleId int64, roleStatus int) error { err := global.Db.Model(&model.AdminRole{}).Where("role_id = ?", roleId).Update("role_status", roleStatus).Error @@ -54,3 +35,34 @@ func (r *AdminRoleDao) AddAdminRole(tx *gorm.DB, model *model.AdminRole) (*model } return model, nil } + +// GetAdminRolePageSearch 搜索角色列表-分页 +func (r *AdminRoleDao) GetAdminRolePageSearch(roleName string, page, pageSize int) (m []*model.AdminRole, total int64, err error) { + var totalRecords int64 + + // 构建查询条件 + query := global.Db.Model(&model.AdminRole{}) + if roleName != "" { + query = query.Where("role_name = ?", roleName) + } + + // 查询总数量 + if err := query.Count(&totalRecords).Error; err != nil { + return nil, 0, err + } + + err = query.Scopes(model.Paginate(page, pageSize)).Find(&m).Error + if err != nil { + return nil, 0, err + } + return m, totalRecords, nil +} + +// EditAdminRoleById 修改角色 +func (r *AdminRoleDao) EditAdminRoleById(tx *gorm.DB, roleId int64, data interface{}) error { + err := tx.Model(&model.AdminRole{}).Where("role_id = ?", roleId).Updates(data).Error + if err != nil { + return err + } + return nil +} diff --git a/api/dao/adminRoleMenu.go b/api/dao/adminRoleMenu.go index 31c21ee..1af48f8 100644 --- a/api/dao/adminRoleMenu.go +++ b/api/dao/adminRoleMenu.go @@ -48,3 +48,11 @@ func (r *AdminRoleMenuDao) AddAdminRoleMenu(tx *gorm.DB, model *model.AdminRoleM } return model, nil } + +// DeleteAdminRoleMenuByRoleId 删除角色菜单 +func (r *AdminRoleMenuDao) DeleteAdminRoleMenuByRoleId(tx *gorm.DB, roleId int64) error { + if err := tx.Where("role_id = ?", roleId).Delete(&model.AdminRoleMenu{}).Error; err != nil { + return err + } + return nil +} diff --git a/api/model/adminMenu.go b/api/model/adminMenu.go index b966d83..d32b2ec 100644 --- a/api/model/adminMenu.go +++ b/api/model/adminMenu.go @@ -5,7 +5,7 @@ type AdminMenu struct { Model MenuId int64 `gorm:"column:menu_id;type:bigint(19);primary_key;comment:主键id" json:"menu_id"` MenuName string `gorm:"column:menu_name;type:varchar(30);comment:菜单名称" json:"menu_name"` - MenuTitle string `gorm:"column:title;menu_title:varchar(30);comment:菜单名称" json:"menu_title"` + MenuTitle string `gorm:"column:menu_title;menu_title:varchar(30);comment:菜单名称" json:"menu_title"` ParentId int64 `gorm:"column:parent_id;type:int(10);default:0;comment:父菜单ID(0表示一级)" json:"parent_id"` MenuStatus int `gorm:"column:menu_status;type:tinyint(1);default:1;comment:菜单状态(0:隐藏 1:正常)此优先级最高" json:"menu_status"` MenuType int `gorm:"column:menu_type;type:tinyint(1);comment:菜单类型(1:模块 2:菜单 3:按钮)" json:"menu_type"` diff --git a/api/model/model.go b/api/model/model.go index ef1201f..e6cbb6c 100644 --- a/api/model/model.go +++ b/api/model/model.go @@ -121,3 +121,21 @@ func (m *Model) BeforeCreate(tx *gorm.DB) (err error) { return nil } + +func Paginate(page, pageSize int) func(db *gorm.DB) *gorm.DB { + return func(db *gorm.DB) *gorm.DB { + if page <= 0 { + page = 1 + } + + switch { + case pageSize > 100: + pageSize = 100 + case pageSize <= 0: + pageSize = 10 + } + + offset := (page - 1) * pageSize + return db.Offset(offset).Limit(pageSize) + } +} diff --git a/api/requests/menu.go b/api/requests/menu.go new file mode 100644 index 0000000..0e9869f --- /dev/null +++ b/api/requests/menu.go @@ -0,0 +1,20 @@ +package requests + +type MenuRequest struct { + AddMenu // 新增菜单 +} + +// AddMenu 新增菜单 +type AddMenu struct { + MenuName string `json:"menu_name" form:"menu_name" validate:"required" label:"菜单名称"` + MenuTitle string `json:"menu_title" form:"menu_title" validate:"required" label:"菜单名称"` + ParentId int64 `json:"parent_id" form:"parent_id" validate:"required,numeric" label:"父菜单ID"` // (0表示一级) + MenuStatus int `json:"menu_status" form:"menu_status" validate:"oneof=0 1" label:"菜单状态"` // (0:隐藏 1:正常)此优先级最高 + MenuType int `json:"menu_type" form:"menu_type" validate:"required,oneof=1 2 3" label:"菜单类型"` // 菜单类型(1:模块 2:菜单 3:按钮) + Permission string `json:"permission" form:"permission" label:"标识"` // 标识 + OrderNum int `json:"order_num" form:"order_num" validate:"numeric" label:"显示顺序"` // 显示顺序 + Icon string `json:"icon" form:"icon" label:"图标地址"` // 图标地址 + Path string `json:"path" form:"path" label:"页面地址"` // 页面地址(#表示当前页)-按钮不需要 + Component string `json:"component" form:"component" label:"组件名称"` // 组件名称-按钮不需要 + ApiIds []int64 `json:"api_ids" form:"api_ids" label:"接口"` // 接口ids +} diff --git a/api/requests/role.go b/api/requests/role.go index 39e61c5..2b0b5ef 100644 --- a/api/requests/role.go +++ b/api/requests/role.go @@ -4,6 +4,7 @@ type RoleRequest struct { GetRoleList // 获取角色列表 PutRoleStatus // 角色禁用/启用 AddRole // 新增角色 + PutRole // 修改角色 } // GetRoleList 获取角色列表 @@ -24,3 +25,10 @@ type AddRole struct { IsAdmin int `json:"is_admin" form:"is_admin" validate:"oneof=0 1" label:"是否管理员"` // (0:否 1:是) MenuIds []int64 `json:"menu_ids" form:"menu_ids" validate:"required" label:"菜单"` } + +// PutRole 修改角色 +type PutRole struct { + RoleName string `json:"role_name" form:"role_name" validate:"required" label:"角色名称"` + IsAdmin int `json:"is_admin" form:"is_admin" validate:"oneof=0 1" label:"是否管理员"` // (0:否 1:是) + MenuIds []int64 `json:"menu_ids" form:"menu_ids" validate:"required" label:"菜单"` +} diff --git a/api/responses/menuResponse/menu.go b/api/responses/menuResponse/menu.go index 5621736..fddac0f 100644 --- a/api/responses/menuResponse/menu.go +++ b/api/responses/menuResponse/menu.go @@ -1,6 +1,6 @@ package menuResponse -// GetMenuList 角色详情 +// GetMenuList 获取菜单列表 type GetMenuList struct { MenuId int64 `json:"menu_id"` MenuName string `json:"menu_name"` // 菜单名称 diff --git a/api/responses/base.go b/api/responses/responses.go similarity index 100% rename from api/responses/base.go rename to api/responses/responses.go diff --git a/api/responses/roleResponse/role.go b/api/responses/roleResponse/role.go index 6fb21e8..7614734 100644 --- a/api/responses/roleResponse/role.go +++ b/api/responses/roleResponse/role.go @@ -1,19 +1,19 @@ package roleResponse -// RoleMenuList 角色菜单列表 -type RoleMenuList struct { - MenuId int64 `json:"menu_id"` // 主键id - MenuName string `json:"menu_name"` // 菜单名称 - MenuTitle string `json:"menu_title"` // 菜单名称 - ParentId int64 `json:"parent_id"` // 父菜单ID(0表示一级) - MenuStatus int `json:"menu_status"` // 菜单状态(0:隐藏 1:正常)此优先级最高 - MenuType int `json:"menu_type"` // 菜单类型(1:模块 2:菜单 3:按钮) - Permission string `json:"permission"` // 标识 - OrderNum int `json:"order_num"` // 显示顺序 - Icon string `json:"icon"` // 图标地址 - Path string `json:"path"` // 页面地址(#表示当前页) - Component string `json:"component"` // 组件名称 - Children []*RoleMenuList `json:"children"` // 下级页面 +// GetRoleMenuList 角色菜单列表 +type GetRoleMenuList struct { + MenuId int64 `json:"menu_id"` // 主键id + MenuName string `json:"menu_name"` // 菜单名称 + MenuTitle string `json:"menu_title"` // 菜单名称 + ParentId int64 `json:"parent_id"` // 父菜单ID(0表示一级) + MenuStatus int `json:"menu_status"` // 菜单状态(0:隐藏 1:正常)此优先级最高 + MenuType int `json:"menu_type"` // 菜单类型(1:模块 2:菜单 3:按钮) + Permission string `json:"permission"` // 标识 + OrderNum int `json:"order_num"` // 显示顺序 + Icon string `json:"icon"` // 图标地址 + Path string `json:"path"` // 页面地址(#表示当前页) + Component string `json:"component"` // 组件名称 + Children []*GetRoleMenuList `json:"children"` // 下级页面 } // GetRole 角色详情 diff --git a/api/router/router.go b/api/router/router.go index d044db0..6cb2510 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -75,8 +75,8 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 获取登陆角色菜单列表 roleGroup.GET("menu", api.Role.GetRoleMenuList) - // 搜索角色列表 - roleGroup.GET("", api.Role.GetRoleList) + // 搜索角色列表-分页 + roleGroup.GET("", api.Role.GetRolePage) // 角色禁用/启用 roleGroup.PUT("status/:id", api.Role.PutRoleStatus) @@ -86,12 +86,18 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 角色详情 roleGroup.GET("/:role_id", api.Role.GetRole) + + // 角色修改 + roleGroup.PUT("/:role_id", api.Role.PutRole) } // 菜单 menuGroup := adminGroup.Group("/menu") { - // 获取菜单列表 + // 获取全部菜单列表 menuGroup.GET("", api.Menu.GetMenuList) + + // 新增菜单 + menuGroup.POST("", api.Menu.AddMenu) } } diff --git a/api/service/menu.go b/api/service/menu.go index 6054aff..fce48b9 100644 --- a/api/service/menu.go +++ b/api/service/menu.go @@ -1,8 +1,12 @@ package service import ( + "errors" "hospital-admin-api/api/dao" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" "hospital-admin-api/api/responses/menuResponse" + "hospital-admin-api/global" ) type MenuService struct{} @@ -48,3 +52,73 @@ func (r *MenuService) GetMenuList() ([]*menuResponse.GetMenuList, error) { return menuTree, nil } + +// AddMenu 新增菜单 +func (r *MenuService) AddMenu(AddMenuRequest requests.AddMenu) (bool, error) { + AdminMenuDao := dao.AdminMenuDao{} + AdminMenuApiDao := dao.AdminMenuApiDao{} + AdminApiDao := dao.AdminApiDao{} + + // 判断父级id + if AddMenuRequest.ParentId != 0 { + adminMenu, _ := AdminMenuDao.GetAdminMenuById(AddMenuRequest.ParentId) + if adminMenu == nil { + return false, errors.New("上级菜单错误") + } + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 新增菜单 + AdminMenuModel := &model.AdminMenu{ + MenuName: AddMenuRequest.MenuName, + MenuTitle: AddMenuRequest.MenuTitle, + ParentId: AddMenuRequest.ParentId, + MenuStatus: AddMenuRequest.MenuStatus, + MenuType: AddMenuRequest.MenuType, + Permission: AddMenuRequest.Permission, + OrderNum: AddMenuRequest.OrderNum, + Icon: AddMenuRequest.Icon, + Path: AddMenuRequest.Path, + Component: AddMenuRequest.Component, + } + + adminMenu, _ := AdminMenuDao.AddAdminMenu(tx, AdminMenuModel) + if adminMenu == nil { + tx.Rollback() + return false, errors.New("新增失败") + } + + // 新增菜单api + if len(AddMenuRequest.ApiIds) > 0 { + for _, v := range AddMenuRequest.ApiIds { + // 检测api + adminApi, _ := AdminApiDao.GetAdminApiById(v) + if adminApi == nil { + tx.Rollback() + return false, errors.New("接口不存在") + } + + AdminMenuApiModel := &model.AdminMenuApi{ + MenuId: adminMenu.MenuId, + ApiId: v, + } + + adminMenuApi, _ := AdminMenuApiDao.AddAdminMenuApi(tx, AdminMenuApiModel) + if adminMenuApi == nil { + tx.Rollback() + return false, errors.New("新增失败") + } + } + } + + tx.Commit() + + return true, nil +} diff --git a/api/service/role.go b/api/service/role.go index 290bf26..875aa77 100644 --- a/api/service/role.go +++ b/api/service/role.go @@ -13,22 +13,23 @@ import ( type RoleService struct{} // GetRoleMenuList 获取角色菜单 -func (r *RoleService) GetRoleMenuList(roleId int64) ([]*roleResponse.RoleMenuList, error) { +func (r *RoleService) GetRoleMenuList(roleId int64) ([]*roleResponse.GetRoleMenuList, error) { + // 获取角色菜单 AdminRoleMenuDao := dao.AdminRoleMenuDao{} adminRoleMenu, _ := AdminRoleMenuDao.GetAdminRoleMenuListByRoleId(roleId) if adminRoleMenu == nil { - return []*roleResponse.RoleMenuList{}, nil + return []*roleResponse.GetRoleMenuList{}, nil } - // 获取全部菜单 + // 获取全部正常菜单列表 AdminMenuDao := dao.AdminMenuDao{} - adminMenu, _ := AdminMenuDao.GetAdminMenuListSortOrderNum() + adminMenu, _ := AdminMenuDao.GetAdminMenuListNormalSortOrderNum() if adminMenu == nil { - return []*roleResponse.RoleMenuList{}, nil + return []*roleResponse.GetRoleMenuList{}, nil } var menuIDs []int64 - var menuTree []*roleResponse.RoleMenuList + var menuTree []*roleResponse.GetRoleMenuList if len(adminRoleMenu) > 0 { for _, roleMenu := range adminRoleMenu { @@ -43,15 +44,15 @@ func (r *RoleService) GetRoleMenuList(roleId int64) ([]*roleResponse.RoleMenuLis } // 获取角色菜单-构建菜单树 -func buildMenuTree(menuIds []int64, menuData []*model.AdminMenu) []*roleResponse.RoleMenuList { - menuMap := make(map[int64]*roleResponse.RoleMenuList) - rootNodes := make([]*roleResponse.RoleMenuList, 0) +func buildMenuTree(menuIds []int64, menuData []*model.AdminMenu) []*roleResponse.GetRoleMenuList { + menuMap := make(map[int64]*roleResponse.GetRoleMenuList) + rootNodes := make([]*roleResponse.GetRoleMenuList, 0) // 构建菜单映射 for _, menu := range menuData { for _, v := range menuIds { if v == menu.MenuId { - node := &roleResponse.RoleMenuList{ + node := &roleResponse.GetRoleMenuList{ MenuId: menu.MenuId, MenuName: menu.MenuName, MenuTitle: menu.MenuTitle, @@ -199,3 +200,76 @@ func (r *RoleService) AddRole(c *gin.Context, AddRoleRequest requests.AddRole) ( return true, nil } + +// PutRole 修改角色 +func (r *RoleService) PutRole(c *gin.Context, requestRoleId int64, AddRoleRequest requests.PutRole) (bool, error) { + // 获取当前登陆用户数据 + roleId := c.GetInt64("RoleId") + if roleId == 0 { + return false, errors.New("数据错误") + } + + AdminRoleDao := dao.AdminRoleDao{} + adminRole, err := AdminRoleDao.GetAdminRoleFirstById(roleId) + if err != nil || adminRole == nil { + return false, errors.New("非法操作") + } + + if AddRoleRequest.IsAdmin == 1 && adminRole.IsAdmin == 0 { + return false, errors.New("您当前为普通用户,无法设置管理员") + } + + AdminMenuDao := dao.AdminMenuDao{} + + // 判断菜单id + for _, menuId := range AddRoleRequest.MenuIds { + adminMenu, _ := AdminMenuDao.GetAdminMenuById(menuId) + if adminMenu == nil { + return false, errors.New("菜单错误") + } + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 修改角色 + data := make(map[string]interface{}) + data["role_name"] = AddRoleRequest.RoleName + data["is_admin"] = AddRoleRequest.IsAdmin + err = AdminRoleDao.EditAdminRoleById(tx, requestRoleId, data) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + + AdminRoleMenuDao := dao.AdminRoleMenuDao{} + // 删除角色菜单 + err = AdminRoleMenuDao.DeleteAdminRoleMenuByRoleId(tx, requestRoleId) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + + // 新增角色菜单 + for _, menuId := range AddRoleRequest.MenuIds { + AdminRoleMenuModel := &model.AdminRoleMenu{ + RoleID: requestRoleId, + MenuID: menuId, + } + + adminRoleMenu, _ := AdminRoleMenuDao.AddAdminRoleMenu(tx, AdminRoleMenuModel) + if adminRoleMenu == nil { + tx.Rollback() + return false, errors.New("新增失败") + } + } + + tx.Commit() + + return true, nil +}