sys_auth_rule.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /*
  2. * @desc:菜单处理
  3. * @company:云南奇讯科技有限公司
  4. * @Author: yixiaohu
  5. * @Date: 2022/3/11 15:07
  6. */
  7. package service
  8. import (
  9. "context"
  10. "fmt"
  11. "github.com/gogf/gf/v2/database/gdb"
  12. "github.com/gogf/gf/v2/frame/g"
  13. "github.com/gogf/gf/v2/util/gconv"
  14. "github.com/tiger1103/gfast/v3/api/v1/system"
  15. "github.com/tiger1103/gfast/v3/internal/app/common/service"
  16. commonService "github.com/tiger1103/gfast/v3/internal/app/common/service"
  17. "github.com/tiger1103/gfast/v3/internal/app/system/consts"
  18. "github.com/tiger1103/gfast/v3/internal/app/system/model"
  19. "github.com/tiger1103/gfast/v3/internal/app/system/service/internal/dao"
  20. "github.com/tiger1103/gfast/v3/internal/app/system/service/internal/do"
  21. "github.com/tiger1103/gfast/v3/library/liberr"
  22. )
  23. type IRule interface {
  24. GetIsMenuList(ctx context.Context) ([]*model.SysAuthRuleInfoRes, error)
  25. GetMenuList(ctx context.Context) (list []*model.SysAuthRuleInfoRes, err error)
  26. GetIsButtonList(ctx context.Context) ([]*model.SysAuthRuleInfoRes, error)
  27. Add(ctx context.Context, req *system.RuleAddReq) (err error)
  28. }
  29. type ruleImpl struct {
  30. }
  31. var rule = ruleImpl{}
  32. func Rule() IRule {
  33. return IRule(&rule)
  34. }
  35. // GetIsMenuList 获取isMenu=0|1
  36. func (s *ruleImpl) GetIsMenuList(ctx context.Context) ([]*model.SysAuthRuleInfoRes, error) {
  37. list, err := s.GetMenuList(ctx)
  38. if err != nil {
  39. return nil, err
  40. }
  41. var gList = make([]*model.SysAuthRuleInfoRes, 0, len(list))
  42. for _, v := range list {
  43. if v.MenuType == 0 || v.MenuType == 1 {
  44. gList = append(gList, v)
  45. }
  46. }
  47. return gList, nil
  48. }
  49. // GetMenuList 获取所有菜单
  50. func (s *ruleImpl) GetMenuList(ctx context.Context) (list []*model.SysAuthRuleInfoRes, err error) {
  51. cache := service.Cache(ctx)
  52. //从缓存获取
  53. iList := cache.GetOrSetFuncLock(ctx, consts.CacheSysAuthMenu, s.getMenuListFromDb, 0, consts.CacheSysAuthTag)
  54. if iList != nil {
  55. err = gconv.Struct(iList, &list)
  56. }
  57. return
  58. }
  59. // 从数据库获取所有菜单
  60. func (s *ruleImpl) getMenuListFromDb(ctx context.Context) (value interface{}, err error) {
  61. err = g.Try(func() {
  62. var v []*model.SysAuthRuleInfoRes
  63. //从数据库获取
  64. err = dao.SysAuthRule.Ctx(ctx).
  65. Fields(model.SysAuthRuleInfoRes{}).Order("weigh desc,id asc").Scan(&v)
  66. liberr.ErrIsNil(ctx, err, "获取菜单数据失败")
  67. value = v
  68. })
  69. return
  70. }
  71. // GetIsButtonList 获取所有按钮isMenu=2 菜单列表
  72. func (s *ruleImpl) GetIsButtonList(ctx context.Context) ([]*model.SysAuthRuleInfoRes, error) {
  73. list, err := s.GetMenuList(ctx)
  74. if err != nil {
  75. return nil, err
  76. }
  77. var gList = make([]*model.SysAuthRuleInfoRes, 0, len(list))
  78. for _, v := range list {
  79. if v.MenuType == 2 {
  80. gList = append(gList, v)
  81. }
  82. }
  83. return gList, nil
  84. }
  85. // Add 添加菜单
  86. func (s *ruleImpl) Add(ctx context.Context, req *system.RuleAddReq) (err error) {
  87. err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  88. err = g.Try(func() {
  89. //菜单数据
  90. data := do.SysAuthRule{
  91. Pid: req.Pid,
  92. Name: req.Name,
  93. Title: req.Title,
  94. Icon: req.Icon,
  95. Condition: req.Condition,
  96. Remark: req.Remark,
  97. MenuType: req.MenuType,
  98. Weigh: req.Weigh,
  99. IsHide: req.IsHide,
  100. Path: req.Path,
  101. Component: req.Component,
  102. IsLink: req.IsLink,
  103. IsIframe: req.IsIframe,
  104. IsCached: req.IsCached,
  105. Redirect: req.Redirect,
  106. IsAffix: req.IsAffix,
  107. LinkUrl: req.LinkUrl,
  108. }
  109. ruleId, e := dao.SysAuthRule.Ctx(ctx).TX(tx).InsertAndGetId(data)
  110. liberr.ErrIsNil(ctx, e, "添加菜单失败")
  111. e = s.BindRoleRule(ctx, ruleId, req.Roles)
  112. liberr.ErrIsNil(ctx, e, "添加菜单失败")
  113. })
  114. return err
  115. })
  116. return
  117. }
  118. // BindRoleRule 绑定角色权限
  119. func (s *ruleImpl) BindRoleRule(ctx context.Context, ruleId interface{}, roleIds []uint) (err error) {
  120. err = g.Try(func() {
  121. enforcer, e := commonService.CasbinEnforcer(ctx)
  122. liberr.ErrIsNil(ctx, e)
  123. for _, roleId := range roleIds {
  124. _, err = enforcer.AddPolicy(fmt.Sprintf("%d", roleId), fmt.Sprintf("%d", ruleId), "All")
  125. liberr.ErrIsNil(ctx, err)
  126. }
  127. })
  128. return
  129. }