role.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package role
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. "gfast/app/service/cache_service"
  7. "gfast/app/service/casbin_adapter_service"
  8. "gfast/library/utils"
  9. "github.com/gogf/gf/database/gdb"
  10. "github.com/gogf/gf/errors/gerror"
  11. "github.com/gogf/gf/frame/g"
  12. "github.com/gogf/gf/os/gtime"
  13. "github.com/gogf/gf/util/gconv"
  14. "github.com/gogf/gf/util/gvalid"
  15. )
  16. //获取用户组(角色)列表
  17. func GetList() (list []*Entity, err error) {
  18. cache := cache_service.New()
  19. //从缓存获取
  20. iList := cache.Get(cache_service.AdminAuthRole)
  21. if iList != nil {
  22. list = iList.([]*Entity)
  23. return
  24. }
  25. //从数据库获取
  26. list, err = Model.OrderBy("list_order asc,id asc").All()
  27. //缓存数据
  28. cache.Set(cache_service.AdminAuthRole, list, 0, cache_service.AdminAuthTag)
  29. return
  30. }
  31. func checkRoleData(params map[string]interface{}) error {
  32. rules := []string{
  33. "name@required|length:1,20#请填写角色名称|名称应在:min到:max个字符之间",
  34. "parent_id@integer|min:0#父级ID必须为整数|父级ID必须大于等于0",
  35. }
  36. e := gvalid.CheckMap(params, rules)
  37. if e != nil {
  38. return e
  39. }
  40. return nil
  41. }
  42. //保存角色信息并返回插入的id
  43. func Add(tx *gdb.TX, data map[string]interface{}) (InsId int64, err error) {
  44. if e := checkRoleData(data); e != nil {
  45. err = gerror.New(e.(*gvalid.Error).FirstString())
  46. return
  47. }
  48. //保存角色信息
  49. now := gtime.Timestamp()
  50. roleMap := gdb.Map{
  51. "parent_id": data["parent_id"],
  52. "status": data["status"],
  53. "name": data["name"],
  54. "create_time": now,
  55. "update_time": now,
  56. "list_order": data["list_order"],
  57. "remark": data["remark"],
  58. }
  59. var res sql.Result
  60. res, err = tx.Table(Table).Data(roleMap).Save()
  61. if err != nil {
  62. return
  63. }
  64. InsId, _ = res.LastInsertId()
  65. return
  66. }
  67. //修改角色信息操作
  68. func Edit(tx *gdb.TX, data map[string]interface{}) (err error) {
  69. if _, k := data["id"]; !k {
  70. err = errors.New("缺少更新条件Id")
  71. return
  72. }
  73. if e := checkRoleData(data); e != nil {
  74. err = gerror.New(e.(*gvalid.Error).FirstString())
  75. return
  76. }
  77. //保存角色信息
  78. now := gtime.Timestamp()
  79. roleMap := gdb.Map{
  80. "id": data["id"],
  81. "parent_id": data["parent_id"],
  82. "status": data["status"],
  83. "name": data["name"],
  84. "update_time": now,
  85. "list_order": data["list_order"],
  86. "remark": data["remark"],
  87. }
  88. _, err = tx.Table(Table).Data(roleMap).Save()
  89. if err != nil {
  90. return
  91. }
  92. return
  93. }
  94. //删除角色权限操作
  95. func DeleteRoleRule(roleId int) (err error) {
  96. enforcer, e := casbin_adapter_service.GetEnforcer()
  97. if e != nil {
  98. err = e
  99. return
  100. }
  101. //查询当前权限
  102. gp := enforcer.GetFilteredNamedPolicy("p", 0, fmt.Sprintf("g_%d", roleId))
  103. //删除旧权限
  104. for _, v := range gp {
  105. _, e = enforcer.RemovePolicy(v)
  106. if e != nil {
  107. err = e
  108. return
  109. }
  110. }
  111. return
  112. }
  113. func DeleteByIds(ids []int) (err error) {
  114. //查询所有子级id
  115. roleAllEntity, err := GetList()
  116. if err != nil {
  117. g.Log().Debug(err)
  118. err = gerror.New("删除失败,不存在角色信息")
  119. return
  120. }
  121. roleAll := gconv.SliceMap(roleAllEntity)
  122. sonList := make(g.List, 0, len(roleAll))
  123. for _, id := range ids {
  124. sonList = append(sonList, utils.FindSonByParentId(roleAll, id, "parent_id", "id")...)
  125. }
  126. for _, role := range sonList {
  127. ids = append(ids, gconv.Int(role["id"]))
  128. }
  129. tx, err := g.DB("default").Begin() //开启事务
  130. if err != nil {
  131. g.Log().Error(err)
  132. err = gerror.New("事务处理失败")
  133. return
  134. }
  135. _, err = tx.Table(Table).Where("id in(?)", ids).Delete()
  136. if err != nil {
  137. g.Log().Error(err)
  138. tx.Rollback()
  139. err = gerror.New("删除失败")
  140. return
  141. }
  142. //删除角色的权限
  143. for _, v := range ids {
  144. err = DeleteRoleRule(v)
  145. if err != nil {
  146. g.Log().Error(err)
  147. tx.Rollback()
  148. err = gerror.New("删除失败")
  149. return
  150. }
  151. }
  152. tx.Commit()
  153. return
  154. }