role.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. package role
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. "gfast/app/model/admin/role_dept"
  7. "gfast/app/service/cache_service"
  8. "gfast/app/service/casbin_adapter_service"
  9. "gfast/library/service"
  10. "gfast/library/utils"
  11. "github.com/gogf/gf/database/gdb"
  12. "github.com/gogf/gf/errors/gerror"
  13. "github.com/gogf/gf/frame/g"
  14. "github.com/gogf/gf/os/gtime"
  15. "github.com/gogf/gf/util/gconv"
  16. "github.com/gogf/gf/util/gvalid"
  17. )
  18. //分页请求参数
  19. type SelectPageReq struct {
  20. RoleName string `p:"roleName"` //参数名称
  21. BeginTime string `p:"beginTime"` //开始时间
  22. EndTime string `p:"endTime"` //结束时间
  23. Status string `p:"status"` //状态
  24. PageNum int `p:"pageNum"` //当前页码
  25. PageSize int `p:"pageSize"` //每页数
  26. }
  27. //修改状态参数
  28. type StatusSetReq struct {
  29. RoleId uint `p:"roleId" v:"required#角色ID不能为空"`
  30. Status uint `p:"status" v:"required#状态不能为空"`
  31. }
  32. //角色数据授权参数
  33. type DataScopeReq struct {
  34. RoleId uint `p:"roleId" v:"required#角色ID不能为空"`
  35. DataScope uint `p:"dataScope" v:"required#权限范围不能为空"`
  36. DeptIds []uint `p:"deptIds"`
  37. }
  38. func GetRoleListSearch(req *SelectPageReq) (total, page int, list []*Entity, err error) {
  39. model := Model
  40. if req != nil {
  41. if req.RoleName != "" {
  42. model = model.Where("name like ?", "%"+req.RoleName+"%")
  43. }
  44. if req.Status != "" {
  45. model = model.Where("status", gconv.Int(req.Status))
  46. }
  47. if req.BeginTime != "" {
  48. model = model.Where("create_time >= ? ", utils.StrToTimestamp(req.BeginTime))
  49. }
  50. if req.EndTime != "" {
  51. model = model.Where("create_time<=?", utils.StrToTimestamp(req.EndTime))
  52. }
  53. }
  54. total, err = model.Count()
  55. if err != nil {
  56. g.Log().Error(err)
  57. err = gerror.New("获取总行数失败")
  58. return
  59. }
  60. if req.PageNum == 0 {
  61. req.PageNum = 1
  62. }
  63. page = req.PageNum
  64. if req.PageSize == 0 {
  65. req.PageSize = service.AdminPageNum
  66. }
  67. list, err = model.Page(page, req.PageSize).Order("id asc").All()
  68. if err != nil {
  69. g.Log().Error(err)
  70. err = gerror.New("获取数据失败")
  71. return
  72. }
  73. return
  74. }
  75. //获取用户组(角色)列表
  76. func GetList() (list []*Entity, err error) {
  77. cache := cache_service.New()
  78. //从缓存获取
  79. iList := cache.Get(cache_service.AdminAuthRole)
  80. if iList != nil {
  81. list = iList.([]*Entity)
  82. return
  83. }
  84. //从数据库获取
  85. list, err = Model.Order("list_order asc,id asc").All()
  86. //缓存数据
  87. cache.Set(cache_service.AdminAuthRole, list, 0, cache_service.AdminAuthTag)
  88. return
  89. }
  90. func checkRoleData(params map[string]interface{}) error {
  91. rules := []string{
  92. "roleName@required|length:1,20#请填写角色名称|名称应在:min到:max个字符之间",
  93. }
  94. e := gvalid.CheckMap(params, rules)
  95. if e != nil {
  96. return e
  97. }
  98. return nil
  99. }
  100. //保存角色信息并返回插入的id
  101. func Add(tx *gdb.TX, data map[string]interface{}) (InsId int64, err error) {
  102. if e := checkRoleData(data); e != nil {
  103. err = gerror.New(e.(*gvalid.Error).FirstString())
  104. return
  105. }
  106. //保存角色信息
  107. now := gtime.Timestamp()
  108. roleMap := gdb.Map{
  109. "status": data["status"],
  110. "name": data["roleName"],
  111. "create_time": now,
  112. "update_time": now,
  113. "list_order": data["roleSort"],
  114. "remark": data["remark"],
  115. }
  116. var res sql.Result
  117. res, err = tx.Table(Table).Data(roleMap).Save()
  118. if err != nil {
  119. return
  120. }
  121. InsId, _ = res.LastInsertId()
  122. return
  123. }
  124. //修改角色信息操作
  125. func Edit(tx *gdb.TX, data map[string]interface{}) (err error) {
  126. if _, k := data["roleId"]; !k {
  127. err = errors.New("缺少更新条件Id")
  128. return
  129. }
  130. if e := checkRoleData(data); e != nil {
  131. err = gerror.New(e.(*gvalid.Error).FirstString())
  132. return
  133. }
  134. //保存角色信息
  135. now := gtime.Timestamp()
  136. roleMap := gdb.Map{
  137. "id": data["roleId"],
  138. "status": data["status"],
  139. "name": data["roleName"],
  140. "update_time": now,
  141. "list_order": data["roleSort"],
  142. "remark": data["remark"],
  143. }
  144. _, err = tx.Table(Table).Data(roleMap).Save()
  145. if err != nil {
  146. return
  147. }
  148. return
  149. }
  150. //设置角色状态
  151. func StatusSetRole(req *StatusSetReq) error {
  152. if req != nil {
  153. entity, err := Model.Where("id", req.RoleId).One()
  154. if err != nil {
  155. g.Log().Error(err)
  156. return gerror.New("获取角色信息失败")
  157. }
  158. entity.Status = req.Status
  159. _, err = entity.Update()
  160. if err != nil {
  161. g.Log().Error(err)
  162. return gerror.New("设置状态失败")
  163. }
  164. }
  165. return nil
  166. }
  167. //设置角色数据权限
  168. func DataScope(req *DataScopeReq) error {
  169. tx, err := g.DB().Begin()
  170. if err != nil {
  171. g.Log().Error(err)
  172. err = gerror.New("设置失败")
  173. return err
  174. }
  175. _, err = tx.Table(Table).Where("id", req.RoleId).Data(g.Map{"data_scope": req.DataScope}).Update()
  176. if err != nil {
  177. g.Log().Error(err)
  178. tx.Rollback()
  179. return gerror.New("设置失败")
  180. }
  181. if req.DataScope == 2 {
  182. _, err := tx.Table(role_dept.Table).Delete(role_dept.Columns.RoleId, req.RoleId)
  183. if err != nil {
  184. g.Log().Error(err)
  185. tx.Rollback()
  186. return gerror.New("设置失败")
  187. }
  188. //自定义数据权限
  189. data := g.List{}
  190. for _, deptId := range req.DeptIds {
  191. data = append(data, g.Map{role_dept.Columns.RoleId: req.RoleId, role_dept.Columns.DeptId: deptId})
  192. }
  193. _, err = tx.Table(role_dept.Table).Data(data).Insert()
  194. if err != nil {
  195. g.Log().Error(err)
  196. tx.Rollback()
  197. return gerror.New("设置失败")
  198. }
  199. }
  200. tx.Commit()
  201. return nil
  202. }
  203. //删除角色权限操作
  204. func DeleteRoleRule(roleId int) (err error) {
  205. enforcer, e := casbin_adapter_service.GetEnforcer()
  206. if e != nil {
  207. err = e
  208. return
  209. }
  210. //查询当前权限
  211. gp := enforcer.GetFilteredNamedPolicy("p", 0, fmt.Sprintf("g_%d", roleId))
  212. //删除旧权限
  213. for _, v := range gp {
  214. _, e = enforcer.RemovePolicy(v)
  215. if e != nil {
  216. err = e
  217. return
  218. }
  219. }
  220. return
  221. }
  222. func DeleteByIds(ids []int) (err error) {
  223. //查询所有子级id
  224. roleAllEntity, err := GetList()
  225. if err != nil {
  226. g.Log().Debug(err)
  227. err = gerror.New("删除失败,不存在角色信息")
  228. return
  229. }
  230. roleAll := gconv.SliceMap(roleAllEntity)
  231. sonList := make(g.List, 0, len(roleAll))
  232. for _, id := range ids {
  233. sonList = append(sonList, utils.FindSonByParentId(roleAll, id, "parent_id", "id")...)
  234. }
  235. for _, role := range sonList {
  236. ids = append(ids, gconv.Int(role["id"]))
  237. }
  238. tx, err := g.DB("default").Begin() //开启事务
  239. if err != nil {
  240. g.Log().Error(err)
  241. err = gerror.New("事务处理失败")
  242. return
  243. }
  244. _, err = tx.Table(Table).Where("id in(?)", ids).Delete()
  245. if err != nil {
  246. g.Log().Error(err)
  247. tx.Rollback()
  248. err = gerror.New("删除失败")
  249. return
  250. }
  251. //删除角色的权限和管理的部门数据权限
  252. for _, v := range ids {
  253. err = DeleteRoleRule(v)
  254. if err != nil {
  255. g.Log().Error(err)
  256. tx.Rollback()
  257. err = gerror.New("删除失败")
  258. return
  259. }
  260. _, err = tx.Table(role_dept.Table).Delete(role_dept.Columns.RoleId, v)
  261. if err != nil {
  262. g.Log().Error(err)
  263. tx.Rollback()
  264. err = gerror.New("删除失败")
  265. return
  266. }
  267. }
  268. tx.Commit()
  269. return
  270. }