sys_authority.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package system
  2. import (
  3. "errors"
  4. "server/dao/system"
  5. "strconv"
  6. systemReq "server/model/system/request"
  7. "gorm.io/gorm"
  8. "server/global"
  9. "server/model/common/request"
  10. )
  11. var ErrRoleExistence = errors.New("存在相同角色id")
  12. //@author: [piexlmax](https://github.com/piexlmax)
  13. //@function: CreateAuthority
  14. //@description: 创建一个角色
  15. //@param: auth model.SysAuthority
  16. //@return: authority system.SysAuthority, err error
  17. type AuthorityService struct{}
  18. var AuthorityServiceApp = new(AuthorityService)
  19. func (authorityService *AuthorityService) CreateAuthority(auth system.SysAuthority) (authority system.SysAuthority, err error) {
  20. _, err = system.QueryAuthorityById(auth.AuthorityId)
  21. if !errors.Is(err, gorm.ErrRecordNotFound) {
  22. return auth, ErrRoleExistence
  23. }
  24. e := global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  25. if err = tx.Create(&auth).Error; err != nil {
  26. return err
  27. }
  28. auth.SysBaseMenus = systemReq.DefaultMenu()
  29. if err = tx.Model(&auth).Association("SysBaseMenus").Replace(&auth.SysBaseMenus); err != nil {
  30. return err
  31. }
  32. casbinInfos := systemReq.DefaultCasbin()
  33. authorityId := strconv.Itoa(int(auth.AuthorityId))
  34. rules := [][]string{}
  35. for _, v := range casbinInfos {
  36. rules = append(rules, []string{authorityId, v.Path, v.Method})
  37. }
  38. return CasbinServiceApp.AddPolicies(tx, rules)
  39. })
  40. return auth, e
  41. }
  42. //@author: [piexlmax](https://github.com/piexlmax)
  43. //@function: UpdateAuthority
  44. //@description: 更改一个角色
  45. //@param: auth model.SysAuthority
  46. //@return: authority system.SysAuthority, err error
  47. func (authorityService *AuthorityService) UpdateAuthority(auth system.SysAuthority) (authority system.SysAuthority, err error) {
  48. _, err = system.QueryAuthorityById(auth.AuthorityId)
  49. if err != nil {
  50. global.GVA_LOG.Debug(err.Error())
  51. return system.SysAuthority{}, errors.New("查询角色数据失败")
  52. }
  53. err = auth.UpdateAuthority()
  54. return auth, err
  55. }
  56. //@author: [piexlmax](https://github.com/piexlmax)
  57. //@function: DeleteAuthority
  58. //@description: 删除角色
  59. //@param: auth *model.SysAuthority
  60. //@return: err error
  61. func (authorityService *AuthorityService) DeleteAuthority(auth *system.SysAuthority) error {
  62. if errors.Is(global.GVA_DB.Debug().Preload("Users").First(&auth).Error, gorm.ErrRecordNotFound) {
  63. return errors.New("该角色不存在")
  64. }
  65. if len(auth.Users) != 0 {
  66. return errors.New("此角色有用户正在使用禁止删除")
  67. }
  68. if !errors.Is(global.GVA_DB.Where("authority_id = ?", auth.AuthorityId).First(&system.SysUser{}).Error, gorm.ErrRecordNotFound) {
  69. return errors.New("此角色有用户正在使用禁止删除")
  70. }
  71. if !errors.Is(global.GVA_DB.Where("parent_id = ?", auth.AuthorityId).First(&system.SysAuthority{}).Error, gorm.ErrRecordNotFound) {
  72. return errors.New("此角色存在子角色不允许删除")
  73. }
  74. return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  75. var err error
  76. if err = tx.Preload("SysBaseMenus").Preload("DataAuthorityId").Where("authority_id = ?", auth.AuthorityId).First(auth).Unscoped().Delete(auth).Error; err != nil {
  77. return err
  78. }
  79. if len(auth.SysBaseMenus) > 0 {
  80. if err = tx.Model(auth).Association("SysBaseMenus").Delete(auth.SysBaseMenus); err != nil {
  81. return err
  82. }
  83. // err = db.Association("SysBaseMenus").Delete(&auth)
  84. }
  85. if len(auth.DataAuthorityId) > 0 {
  86. if err = tx.Model(auth).Association("DataAuthorityId").Delete(auth.DataAuthorityId); err != nil {
  87. return err
  88. }
  89. }
  90. if err = tx.Delete(&system.SysUserAuthority{}, "sys_authority_authority_id = ?", auth.AuthorityId).Error; err != nil {
  91. return err
  92. }
  93. if err = tx.Where("authority_id = ?", auth.AuthorityId).Delete(&[]system.SysAuthorityBtn{}).Error; err != nil {
  94. return err
  95. }
  96. authorityId := strconv.Itoa(int(auth.AuthorityId))
  97. if err = CasbinServiceApp.RemoveFilteredPolicy(tx, authorityId); err != nil {
  98. return err
  99. }
  100. return nil
  101. })
  102. }
  103. //@author: [piexlmax](https://github.com/piexlmax)
  104. //@function: GetAuthorityInfoList
  105. //@description: 分页获取数据
  106. //@param: info request.PageInfo
  107. //@return: list interface{}, total int64, err error
  108. func (authorityService *AuthorityService) GetAuthorityInfoList(info request.PageInfo) (list interface{}, total int64, err error) {
  109. limit := info.PageSize
  110. offset := info.PageSize * (info.Page - 1)
  111. return system.GetAuthorityInfoList(limit, offset)
  112. }
  113. //@author: [piexlmax](https://github.com/piexlmax)
  114. //@function: GetAuthorityInfo
  115. //@description: 获取所有角色信息
  116. //@param: auth model.SysAuthority
  117. //@return: sa system.SysAuthority, err error
  118. func (authorityService *AuthorityService) GetAuthorityInfo(auth system.SysAuthority) (sa system.SysAuthority, err error) {
  119. return auth.GetAuthorityInfo()
  120. }
  121. //@author: [piexlmax](https://github.com/piexlmax)
  122. //@function: SetDataAuthority
  123. //@description: 设置角色资源权限
  124. //@param: auth model.SysAuthority
  125. //@return: error
  126. func (authorityService *AuthorityService) SetDataAuthority(auth system.SysAuthority) error {
  127. var s system.SysAuthority
  128. global.GVA_DB.Preload("DataAuthorityId").First(&s, "authority_id = ?", auth.AuthorityId)
  129. err := global.GVA_DB.Model(&s).Association("DataAuthorityId").Replace(&auth.DataAuthorityId)
  130. return err
  131. }
  132. //@author: [piexlmax](https://github.com/piexlmax)
  133. //@function: SetMenuAuthority
  134. //@description: 菜单与角色绑定
  135. //@param: auth *model.SysAuthority
  136. //@return: error
  137. func (authorityService *AuthorityService) SetMenuAuthority(auth *system.SysAuthority) error {
  138. var s system.SysAuthority
  139. global.GVA_DB.Preload("SysBaseMenus").First(&s, "authority_id = ?", auth.AuthorityId)
  140. err := global.GVA_DB.Model(&s).Association("SysBaseMenus").Replace(&auth.SysBaseMenus)
  141. return err
  142. }