sys_role.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /*
  2. * @desc:角色处理
  3. * @company:云南奇讯科技有限公司
  4. * @Author: yixiaohu
  5. * @Date: 2022/3/9 10:31
  6. */
  7. package service
  8. import (
  9. "context"
  10. "github.com/gogf/gf/v2/database/gdb"
  11. "github.com/gogf/gf/v2/frame/g"
  12. "github.com/gogf/gf/v2/util/gconv"
  13. "github.com/tiger1103/gfast/v3/api/v1/system"
  14. commonService "github.com/tiger1103/gfast/v3/internal/app/common/service"
  15. "github.com/tiger1103/gfast/v3/internal/app/system/consts"
  16. "github.com/tiger1103/gfast/v3/internal/app/system/model/entity"
  17. "github.com/tiger1103/gfast/v3/internal/app/system/service/internal/dao"
  18. "github.com/tiger1103/gfast/v3/internal/app/system/service/internal/do"
  19. "github.com/tiger1103/gfast/v3/library/liberr"
  20. )
  21. type IRole interface {
  22. GetRoleList(ctx context.Context) (list []*entity.SysRole, err error)
  23. GetRoleListSearch(ctx context.Context, req *system.RoleListReq) (res *system.RoleListRes, err error)
  24. AddRole(ctx context.Context, req *system.RoleAddReq) (err error)
  25. Get(ctx context.Context, id uint) (res *entity.SysRole, err error)
  26. GetFilteredNamedPolicy(ctx context.Context, id uint) (gpSlice []int, err error)
  27. EditRole(ctx context.Context, req *system.RoleEditReq) error
  28. DeleteByIds(ctx context.Context, ids []int64) (err error)
  29. }
  30. type roleImpl struct {
  31. }
  32. var roleService = roleImpl{}
  33. func Role() IRole {
  34. return IRole(&roleService)
  35. }
  36. func (s *roleImpl) GetRoleListSearch(ctx context.Context, req *system.RoleListReq) (res *system.RoleListRes, err error) {
  37. res = new(system.RoleListRes)
  38. g.Try(func() {
  39. model := dao.SysRole.Ctx(ctx)
  40. if req.RoleName != "" {
  41. model = model.Where("name like ?", "%"+req.RoleName+"%")
  42. }
  43. if req.Status != "" {
  44. model = model.Where("status", gconv.Int(req.Status))
  45. }
  46. res.Total, err = model.Count()
  47. liberr.ErrIsNil(ctx, err, "获取角色数据失败")
  48. if req.PageNum == 0 {
  49. req.PageNum = 1
  50. }
  51. res.CurrentPage = req.PageNum
  52. if req.PageSize == 0 {
  53. req.PageSize = consts.PageSize
  54. }
  55. err = model.Page(res.CurrentPage, req.PageSize).Order("id asc").Scan(&res.List)
  56. liberr.ErrIsNil(ctx, err, "获取数据失败")
  57. })
  58. return
  59. }
  60. // GetRoleList 获取角色列表
  61. func (s *roleImpl) GetRoleList(ctx context.Context) (list []*entity.SysRole, err error) {
  62. cache := commonService.Cache()
  63. //从缓存获取
  64. iList := cache.GetOrSetFuncLock(ctx, consts.CacheSysRole, s.getRoleListFromDb, 0, consts.CacheSysAuthTag)
  65. if iList != nil {
  66. err = gconv.Struct(iList, &list)
  67. }
  68. return
  69. }
  70. // 从数据库获取所有角色
  71. func (s *roleImpl) getRoleListFromDb(ctx context.Context) (value interface{}, err error) {
  72. err = g.Try(func() {
  73. var v []*entity.SysRole
  74. //从数据库获取
  75. err = dao.SysRole.Ctx(ctx).
  76. Order(dao.SysRole.Columns().ListOrder + " asc," + dao.SysRole.Columns().Id + " asc").
  77. Scan(&v)
  78. liberr.ErrIsNil(ctx, err, "获取角色数据失败")
  79. value = v
  80. })
  81. return
  82. }
  83. // AddRoleRule 添加角色权限
  84. func (s *roleImpl) AddRoleRule(ctx context.Context, ruleIds []uint, roleId int64) (err error) {
  85. err = g.Try(func() {
  86. enforcer, e := commonService.CasbinEnforcer(ctx)
  87. liberr.ErrIsNil(ctx, e)
  88. ruleIdsStr := gconv.Strings(ruleIds)
  89. for _, v := range ruleIdsStr {
  90. _, err = enforcer.AddPolicy(gconv.String(roleId), v, "All")
  91. liberr.ErrIsNil(ctx, err)
  92. }
  93. })
  94. return
  95. }
  96. // DelRoleRule 删除角色权限
  97. func (s *roleImpl) DelRoleRule(ctx context.Context, roleId int64) (err error) {
  98. err = g.Try(func() {
  99. enforcer, e := commonService.CasbinEnforcer(ctx)
  100. liberr.ErrIsNil(ctx, e)
  101. _, err = enforcer.RemoveFilteredPolicy(0, gconv.String(roleId))
  102. liberr.ErrIsNil(ctx, e)
  103. })
  104. return
  105. }
  106. func (s *roleImpl) AddRole(ctx context.Context, req *system.RoleAddReq) (err error) {
  107. err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  108. err = g.Try(func() {
  109. roleId, e := dao.SysRole.Ctx(ctx).TX(tx).InsertAndGetId(req)
  110. liberr.ErrIsNil(ctx, e, "添加角色失败")
  111. //添加角色权限
  112. e = s.AddRoleRule(ctx, req.MenuIds, roleId)
  113. liberr.ErrIsNil(ctx, e)
  114. //清除TAG缓存
  115. commonService.Cache().RemoveByTag(ctx, consts.CacheSysAuthTag)
  116. })
  117. return err
  118. })
  119. return
  120. }
  121. func (s *roleImpl) Get(ctx context.Context, id uint) (res *entity.SysRole, err error) {
  122. err = g.Try(func() {
  123. err = dao.SysRole.Ctx(ctx).WherePri(id).Scan(&res)
  124. liberr.ErrIsNil(ctx, err, "获取角色信息失败")
  125. })
  126. return
  127. }
  128. // GetFilteredNamedPolicy 获取角色关联的菜单规则
  129. func (s *roleImpl) GetFilteredNamedPolicy(ctx context.Context, id uint) (gpSlice []int, err error) {
  130. err = g.Try(func() {
  131. enforcer, e := commonService.CasbinEnforcer(ctx)
  132. liberr.ErrIsNil(ctx, e)
  133. gp := enforcer.GetFilteredNamedPolicy("p", 0, gconv.String(id))
  134. gpSlice = make([]int, len(gp))
  135. for k, v := range gp {
  136. gpSlice[k] = gconv.Int(v[1])
  137. }
  138. })
  139. return
  140. }
  141. // EditRole 修改角色
  142. func (s *roleImpl) EditRole(ctx context.Context, req *system.RoleEditReq) (err error) {
  143. err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  144. err = g.Try(func() {
  145. _, e := dao.SysRole.Ctx(ctx).TX(tx).WherePri(req.Id).Data(&do.SysRole{
  146. Status: req.Status,
  147. ListOrder: req.ListOrder,
  148. Name: req.Name,
  149. Remark: req.Remark,
  150. }).Update()
  151. liberr.ErrIsNil(ctx, e, "修改角色失败")
  152. //删除角色权限
  153. e = s.DelRoleRule(ctx, req.Id)
  154. liberr.ErrIsNil(ctx, e)
  155. //添加角色权限
  156. e = s.AddRoleRule(ctx, req.MenuIds, req.Id)
  157. liberr.ErrIsNil(ctx, e)
  158. //清除TAG缓存
  159. commonService.Cache().RemoveByTag(ctx, consts.CacheSysAuthTag)
  160. })
  161. return err
  162. })
  163. return
  164. }
  165. // DeleteByIds 删除角色
  166. func (s *roleImpl) DeleteByIds(ctx context.Context, ids []int64) (err error) {
  167. err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  168. err = g.Try(func() {
  169. _, err = dao.SysRole.Ctx(ctx).TX(tx).Where(dao.SysRole.Columns().Id+" in(?)", ids).Delete()
  170. liberr.ErrIsNil(ctx, err, "删除角色失败")
  171. //删除角色权限
  172. for _, v := range ids {
  173. err = s.DelRoleRule(ctx, v)
  174. liberr.ErrIsNil(ctx, err)
  175. }
  176. })
  177. return err
  178. })
  179. return
  180. }