123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- package system
- import (
- "errors"
- "server/dao/system"
- "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 system.SysAuthority) (authority system.SysAuthority, err error) {
- _, err = system.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 system.SysAuthority) (authority system.SysAuthority, err error) {
- _, err = system.QueryAuthorityById(auth.AuthorityId)
- if err != nil {
- global.GVA_LOG.Debug(err.Error())
- return system.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 *system.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(&system.SysUser{}).Error, gorm.ErrRecordNotFound) {
- return errors.New("此角色有用户正在使用禁止删除")
- }
- if !errors.Is(global.GVA_DB.Where("parent_id = ?", auth.AuthorityId).First(&system.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(&system.SysUserAuthority{}, "sys_authority_authority_id = ?", auth.AuthorityId).Error; err != nil {
- return err
- }
- if err = tx.Where("authority_id = ?", auth.AuthorityId).Delete(&[]system.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 system.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 system.SysAuthority) (sa system.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 system.SysAuthority) error {
- var s system.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 *system.SysAuthority) error {
- var s system.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
- }
|