package system import ( "errors" "server/dao" "strconv" systemReq "server/model/system/request" "gorm.io/gorm" "server/global" "server/model/common/request" ) var ErrRoleExistence = errors.New("存在相同角色id") //@author: [piexlmax](https://github.com/piexlmax) //@function: CreateAuthority //@description: 创建一个角色 //@param: auth model.SysAuthority //@return: authority system.SysAuthority, err error type AuthorityService struct{} var AuthorityServiceApp = new(AuthorityService) func (authorityService *AuthorityService) CreateAuthority(auth dao.SysAuthority) (authority dao.SysAuthority, err error) { _, err = dao.QueryAuthorityById(auth.AuthorityId) if !errors.Is(err, gorm.ErrRecordNotFound) { return auth, ErrRoleExistence } e := global.GVA_DB.Transaction(func(tx *gorm.DB) error { if err = tx.Create(&auth).Error; err != nil { return err } auth.SysBaseMenus = systemReq.DefaultMenu() if err = tx.Model(&auth).Association("SysBaseMenus").Replace(&auth.SysBaseMenus); err != nil { return err } casbinInfos := systemReq.DefaultCasbin() authorityId := strconv.Itoa(int(auth.AuthorityId)) rules := [][]string{} for _, v := range casbinInfos { rules = append(rules, []string{authorityId, v.Path, v.Method}) } return CasbinServiceApp.AddPolicies(tx, rules) }) return auth, e } //@author: [piexlmax](https://github.com/piexlmax) //@function: UpdateAuthority //@description: 更改一个角色 //@param: auth model.SysAuthority //@return: authority system.SysAuthority, err error func (authorityService *AuthorityService) UpdateAuthority(auth dao.SysAuthority) (authority dao.SysAuthority, err error) { _, err = dao.QueryAuthorityById(auth.AuthorityId) if err != nil { global.GVA_LOG.Debug(err.Error()) return dao.SysAuthority{}, errors.New("查询角色数据失败") } err = auth.UpdateAuthority() return auth, err } //@author: [piexlmax](https://github.com/piexlmax) //@function: DeleteAuthority //@description: 删除角色 //@param: auth *model.SysAuthority //@return: err error func (authorityService *AuthorityService) DeleteAuthority(auth *dao.SysAuthority) error { if errors.Is(global.GVA_DB.Debug().Preload("Users").First(&auth).Error, gorm.ErrRecordNotFound) { return errors.New("该角色不存在") } if len(auth.Users) != 0 { return errors.New("此角色有用户正在使用禁止删除") } if !errors.Is(global.GVA_DB.Where("authority_id = ?", auth.AuthorityId).First(&dao.SysUser{}).Error, gorm.ErrRecordNotFound) { return errors.New("此角色有用户正在使用禁止删除") } if !errors.Is(global.GVA_DB.Where("parent_id = ?", auth.AuthorityId).First(&dao.SysAuthority{}).Error, gorm.ErrRecordNotFound) { return errors.New("此角色存在子角色不允许删除") } return global.GVA_DB.Transaction(func(tx *gorm.DB) error { var err error if err = tx.Preload("SysBaseMenus").Preload("DataAuthorityId").Where("authority_id = ?", auth.AuthorityId).First(auth).Unscoped().Delete(auth).Error; err != nil { return err } if len(auth.SysBaseMenus) > 0 { if err = tx.Model(auth).Association("SysBaseMenus").Delete(auth.SysBaseMenus); err != nil { return err } // err = db.Association("SysBaseMenus").Delete(&auth) } if len(auth.DataAuthorityId) > 0 { if err = tx.Model(auth).Association("DataAuthorityId").Delete(auth.DataAuthorityId); err != nil { return err } } if err = tx.Delete(&dao.SysUserAuthority{}, "sys_authority_authority_id = ?", auth.AuthorityId).Error; err != nil { return err } if err = tx.Where("authority_id = ?", auth.AuthorityId).Delete(&[]dao.SysAuthorityBtn{}).Error; err != nil { return err } authorityId := strconv.Itoa(int(auth.AuthorityId)) if err = CasbinServiceApp.RemoveFilteredPolicy(tx, authorityId); err != nil { return err } return nil }) } //@author: [piexlmax](https://github.com/piexlmax) //@function: GetAuthorityInfoList //@description: 分页获取数据 //@param: info request.PageInfo //@return: list interface{}, total int64, err error func (authorityService *AuthorityService) GetAuthorityInfoList(info request.PageInfo) (list interface{}, total int64, err error) { limit := info.PageSize offset := info.PageSize * (info.Page - 1) return dao.GetAuthorityInfoList(limit, offset) } //@author: [piexlmax](https://github.com/piexlmax) //@function: GetAuthorityInfo //@description: 获取所有角色信息 //@param: auth model.SysAuthority //@return: sa system.SysAuthority, err error func (authorityService *AuthorityService) GetAuthorityInfo(auth dao.SysAuthority) (sa dao.SysAuthority, err error) { return auth.GetAuthorityInfo() } //@author: [piexlmax](https://github.com/piexlmax) //@function: SetDataAuthority //@description: 设置角色资源权限 //@param: auth model.SysAuthority //@return: error func (authorityService *AuthorityService) SetDataAuthority(auth dao.SysAuthority) error { var s dao.SysAuthority global.GVA_DB.Preload("DataAuthorityId").First(&s, "authority_id = ?", auth.AuthorityId) err := global.GVA_DB.Model(&s).Association("DataAuthorityId").Replace(&auth.DataAuthorityId) return err } //@author: [piexlmax](https://github.com/piexlmax) //@function: SetMenuAuthority //@description: 菜单与角色绑定 //@param: auth *model.SysAuthority //@return: error func (authorityService *AuthorityService) SetMenuAuthority(auth *dao.SysAuthority) error { var s dao.SysAuthority global.GVA_DB.Preload("SysBaseMenus").First(&s, "authority_id = ?", auth.AuthorityId) err := global.GVA_DB.Model(&s).Association("SysBaseMenus").Replace(&auth.SysBaseMenus) return err }