sys_role.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. package service
  2. import (
  3. "dashoo.cn/micro/app/common/global"
  4. comModel "dashoo.cn/micro/app/common/model"
  5. "dashoo.cn/micro/app/common/service"
  6. "dashoo.cn/micro/app/dao"
  7. "dashoo.cn/micro/app/model"
  8. "dashoo.cn/micro_libary/utils"
  9. "database/sql"
  10. "errors"
  11. "fmt"
  12. "github.com/gogf/gf/database/gdb"
  13. "github.com/gogf/gf/errors/gerror"
  14. "github.com/gogf/gf/frame/g"
  15. "github.com/gogf/gf/util/gconv"
  16. "github.com/gogf/gf/util/gvalid"
  17. )
  18. type sysRole struct{}
  19. var SysRole = new(sysRole)
  20. func (s *sysRole) DeleteByIds(ids []int) (err error) {
  21. tx, err := g.DB("default").Begin() //开启事务
  22. if err != nil {
  23. g.Log().Error(err)
  24. err = gerror.New("事务处理失败")
  25. return
  26. }
  27. _, err = tx.Model(model.SysRole{}).Where("id in(?)", ids).Delete()
  28. if err != nil {
  29. g.Log().Error(err)
  30. tx.Rollback()
  31. err = gerror.New("删除失败")
  32. return
  33. }
  34. //删除角色的权限和管理的部门数据权限
  35. enforcer, e := service.Casbin.GetEnforcer()
  36. if e != nil {
  37. tx.Rollback()
  38. return e
  39. }
  40. for _, v := range ids {
  41. _, err = enforcer.RemoveFilteredPolicy(0, fmt.Sprintf("%d", v))
  42. if err != nil {
  43. tx.Rollback()
  44. return err
  45. }
  46. _, err = tx.Model(model.SysRoleDept{}).Delete("role_id", v)
  47. if err != nil {
  48. tx.Rollback()
  49. return err
  50. }
  51. }
  52. tx.Commit()
  53. //清除TAG缓存
  54. service.Cache.New().RemoveByTag(global.SysAuthTag)
  55. return nil
  56. }
  57. func (s *sysRole) One(id int) (*model.SysRole, error) {
  58. return dao.SysRole.Where("id = ?", id).FindOne()
  59. }
  60. // GetRoleList 获取角色列表
  61. func (s *sysRole) GetRoleList() (list []*model.SysRole, err error) {
  62. cache := service.Cache.New()
  63. //从缓存获取
  64. iList := cache.Get(global.SysRole)
  65. if iList != nil {
  66. err = gconv.Struct(iList, &list)
  67. return
  68. }
  69. //从数据库获取
  70. //list, err = dao.SysRole.Order(dao.SysRole.Columns.ListOrder + " asc," + dao.SysRole.Columns.Id + " asc").All()
  71. list, err = dao.SysRole.Order(dao.SysRole.Columns.Id + " asc").All()
  72. if err != nil {
  73. g.Log().Error(err)
  74. err = gerror.New("获取角色数据失败")
  75. }
  76. //缓存数据
  77. cache.Set(global.SysRole, list, 0, global.SysAuthTag)
  78. iList = cache.Get(global.SysRole)
  79. return
  80. }
  81. func (s *sysRole) GetRoleListSearch(req *model.SelectPageReq) (total, page int, list []*model.SysRole, err error) {
  82. model := dao.SysRole.M
  83. if req.RoleName != "" {
  84. model = model.Where("name like ?", "%"+req.RoleName+"%")
  85. }
  86. if req.Status != "" {
  87. model = model.Where("status", gconv.Int(req.Status))
  88. }
  89. if req.BeginTime != "" {
  90. model = model.Where("create_time >= ? ", utils.StrToTimestamp(req.BeginTime))
  91. }
  92. if req.EndTime != "" {
  93. model = model.Where("create_time<=?", utils.StrToTimestamp(req.EndTime))
  94. }
  95. total, err = model.Count()
  96. if err != nil {
  97. g.Log().Error(err)
  98. err = gerror.New("获取总行数失败")
  99. return
  100. }
  101. if req.PageNum == 0 {
  102. req.PageNum = 1
  103. }
  104. page = req.PageNum
  105. if req.PageSize == 0 {
  106. req.PageSize = comModel.PageSize
  107. }
  108. err = model.Page(page, req.PageSize).Order("id asc").Scan(&list)
  109. if err != nil {
  110. g.Log().Error(err)
  111. err = gerror.New("获取数据失败")
  112. return
  113. }
  114. return
  115. }
  116. // 获取角色关联的菜单规则
  117. func (s *sysRole) GetFilteredNamedPolicy(id int) ([]int, error) {
  118. enforcer, err := service.Casbin.GetEnforcer()
  119. if err != nil {
  120. g.Log().Error(err)
  121. return nil, err
  122. }
  123. gp := enforcer.GetFilteredNamedPolicy("p", 0, fmt.Sprintf("%d", id))
  124. gpSlice := make([]int, len(gp))
  125. for k, v := range gp {
  126. gpSlice[k] = gconv.Int(v[1])
  127. }
  128. return gpSlice, nil
  129. }
  130. func (s *sysRole) AddRolePost(m map[string]interface{}) error {
  131. tx, err := g.DB("default").Begin() //开启事务
  132. if err != nil {
  133. return err
  134. }
  135. //插入角色
  136. insertId, err := s.AddRole(tx, m)
  137. if err != nil {
  138. tx.Rollback() //回滚
  139. return err
  140. }
  141. //添加角色权限
  142. err = s.AddRoleRule(m["menuIds"], insertId)
  143. if err != nil {
  144. tx.Rollback() //回滚
  145. g.Log().Error(err.Error())
  146. return err
  147. }
  148. tx.Commit()
  149. //清除TAG缓存
  150. service.Cache.New().RemoveByTag(global.SysAuthTag)
  151. return nil
  152. }
  153. // AddRoleRule 添加角色权限
  154. func (s *sysRole) AddRoleRule(iRule interface{}, roleId int64) (err error) {
  155. enforcer, e := service.Casbin.GetEnforcer()
  156. if e != nil {
  157. err = e
  158. return
  159. }
  160. rule := gconv.Strings(iRule)
  161. for _, v := range rule {
  162. _, err = enforcer.AddPolicy(fmt.Sprintf("%d", roleId), fmt.Sprintf("%s", v), "All")
  163. if err != nil {
  164. break
  165. }
  166. }
  167. return
  168. }
  169. // 插入角色
  170. func (s *sysRole) AddRole(tx *gdb.TX, data map[string]interface{}) (InsId int64, err error) {
  171. if e := s.checkRoleData(data); e != nil {
  172. err = e.(gvalid.Error).Current()
  173. return
  174. }
  175. //保存角色信息
  176. roleMap := gdb.Map{
  177. "status": data["status"],
  178. "name": data["roleName"],
  179. "list_order": data["roleSort"],
  180. "remark": data["remark"],
  181. }
  182. var res sql.Result
  183. res, err = tx.Model(model.SysRole{}).Data(roleMap).Save()
  184. if err != nil {
  185. return
  186. }
  187. InsId, _ = res.LastInsertId()
  188. return
  189. }
  190. func (s *sysRole) checkRoleData(params map[string]interface{}) error {
  191. rules := []string{
  192. "roleName@required|length:1,20#请填写角色名称|名称应在:min到:max个字符之间",
  193. }
  194. e := gvalid.CheckMap(nil, params, rules)
  195. if e != nil {
  196. return e
  197. }
  198. return nil
  199. }
  200. // 修改角色信息
  201. func (s *sysRole) EditRole(tx *gdb.TX, data map[string]interface{}) error {
  202. if _, k := data["roleId"]; !k {
  203. return errors.New("缺少更新条件Id")
  204. }
  205. if e := s.checkRoleData(data); e != nil {
  206. return e.(gvalid.Error).Current()
  207. }
  208. //保存角色信息
  209. roleMap := gdb.Map{
  210. "id": data["roleId"],
  211. "status": data["status"],
  212. "name": data["roleName"],
  213. "list_order": data["roleSort"],
  214. "remark": data["remark"],
  215. }
  216. _, err := tx.Model(model.SysRole{}).Data(roleMap).Save()
  217. if err != nil {
  218. return err
  219. }
  220. return nil
  221. }
  222. // 修改角色的授权规则
  223. func (s *sysRole) EditRoleRule(iRule interface{}, roleId int64) (err error) {
  224. enforcer, e := service.Casbin.GetEnforcer()
  225. if e != nil {
  226. return e
  227. }
  228. //删除旧权限
  229. _, err = enforcer.RemoveFilteredPolicy(0, fmt.Sprintf("%d", roleId))
  230. if err != nil {
  231. return
  232. }
  233. // 添加新权限
  234. rule := gconv.Strings(iRule)
  235. for _, v := range rule {
  236. _, err = enforcer.AddPolicy(fmt.Sprintf("%d", roleId), fmt.Sprintf("%s", v), "All")
  237. if err != nil {
  238. break
  239. }
  240. }
  241. return
  242. }
  243. func (s *sysRole) EditRolePost(m map[string]interface{}, id int) error {
  244. tx, err := g.DB("default").Begin() //开启事务
  245. if err != nil {
  246. return err
  247. }
  248. err = s.EditRole(tx, m)
  249. if err != nil {
  250. tx.Rollback()
  251. return err
  252. }
  253. err = s.EditRoleRule(m["menuIds"], int64(id))
  254. if err != nil {
  255. tx.Rollback() //回滚
  256. return err
  257. }
  258. tx.Commit()
  259. //清除TAG缓存
  260. service.Cache.New().RemoveByTag(global.SysAuthTag)
  261. return nil
  262. }
  263. func (s *sysRole) StatusSetRole(req *model.StatusSetReq) error {
  264. _, err := dao.SysRole.Where(dao.SysRole.Columns.Id, req.RoleId).Data(dao.SysRole.Columns.Status, req.Status).
  265. Update()
  266. if err == nil {
  267. //清除TAG缓存
  268. service.Cache.New().RemoveByTag(global.SysAuthTag)
  269. }
  270. return err
  271. }
  272. // 设置角色数据权限
  273. func (s *sysRole) RoleDataScope(req *model.DataScopeReq) error {
  274. tx, err := g.DB().Begin()
  275. if err != nil {
  276. g.Log().Error(err)
  277. return gerror.New("设置失败")
  278. }
  279. _, err = tx.Model(model.SysRole{}).Where("id", req.RoleId).Data(g.Map{"data_scope": req.DataScope}).Update()
  280. if err != nil {
  281. g.Log().Error(err)
  282. tx.Rollback()
  283. return gerror.New("设置失败")
  284. }
  285. if req.DataScope == 2 {
  286. _, err := tx.Model(model.SysRoleDept{}).Where("role_id", req.RoleId).Delete()
  287. if err != nil {
  288. g.Log().Error(err)
  289. tx.Rollback()
  290. return gerror.New("设置失败")
  291. }
  292. data := g.List{}
  293. for _, deptId := range req.DeptIds {
  294. data = append(data, g.Map{"role_id": req.RoleId, "dept_id": deptId})
  295. }
  296. _, err = tx.Model(model.SysRoleDept{}).Data(data).Insert()
  297. if err != nil {
  298. g.Log().Error(err)
  299. tx.Rollback()
  300. return gerror.New("设置失败")
  301. }
  302. }
  303. tx.Commit()
  304. return nil
  305. }