admin_role.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "gadmin/config"
  7. "gadmin/internal/admin/consts"
  8. "gadmin/internal/admin/forms"
  9. "gadmin/internal/gorm/model"
  10. "gadmin/internal/gorm/query"
  11. "gadmin/utility/serializer"
  12. "github.com/gin-gonic/gin"
  13. "github.com/sirupsen/logrus"
  14. "github.com/spf13/cast"
  15. "gorm.io/gorm"
  16. "time"
  17. )
  18. // AdminRole 后台角色
  19. var AdminRole = new(sAdminRole)
  20. type sAdminRole struct{}
  21. func (s *sAdminRole) List(ctx *gin.Context, req forms.AdminRoleListReq) serializer.Response {
  22. var (
  23. q = query.Use(config.AdminDB).AdminRole
  24. m = q.WithContext(ctx)
  25. offset int64 = 0
  26. models forms.UserAccountListRes
  27. lists []*forms.AdminRoleListModel
  28. )
  29. m = m.Order(q.Sort).Order(q.ID.Desc())
  30. req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
  31. count, err := m.Count()
  32. if err != nil {
  33. return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
  34. }
  35. if count > 0 {
  36. if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
  37. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  38. }
  39. }
  40. for _, v := range lists {
  41. systemIds := make([]int32, 0)
  42. if err := json.Unmarshal([]byte(cast.ToString(v.Systems)), &systemIds); err != nil {
  43. return serializer.Err(consts.CodeParamErr, "格式化出错 Systems", err)
  44. }
  45. v.Systems = systemIds
  46. permissionsMap := make(map[int32][]int32)
  47. pagesMap := make(map[int32][]int32)
  48. for _, sid := range systemIds {
  49. if _, ok := config.LogDBGroup[sid]; !ok {
  50. continue
  51. }
  52. logDB := query.Use(config.LogDBGroup[sid])
  53. pq := logDB.AdminRolePermission
  54. rmq := logDB.AdminRoleMenu
  55. mq := logDB.AdminMenu
  56. // 查询该角色各系统下的权限
  57. permissionIds := make([]int32, 0)
  58. if err := pq.Where(pq.RoleID.Eq(int32(v.ID))).Pluck(pq.PermissionID, &permissionIds); err != nil {
  59. return serializer.Err(consts.CodeParamErr, "查询出错 permissionsModels", err)
  60. }
  61. if _, ok := permissionsMap[sid]; ok {
  62. permissionsMap[sid] = append(permissionsMap[sid], permissionIds...)
  63. } else {
  64. permissionsMap[sid] = permissionIds
  65. }
  66. // 查询该角色各系统下的页面
  67. type RolePage struct {
  68. PageID int32
  69. ParentID int32
  70. }
  71. pages := make([]*RolePage, 0)
  72. if err := rmq.LeftJoin(mq, mq.ID.EqCol(rmq.PageID)).Where(rmq.RoleID.Eq(int32(v.ID))).Select(rmq.PageID, mq.ParentID).Scan(&pages); err != nil {
  73. return serializer.Err(consts.CodeDBError, "查询出错 RolePage", err)
  74. }
  75. rolePageMap := make(map[int32][]int32)
  76. parentPageIdsMap := make(map[int32]struct{}, 0)
  77. for _, item := range pages {
  78. parentPageIdsMap[item.ParentID] = struct{}{}
  79. if item.ParentID == 0 {
  80. rolePageMap[item.ParentID] = make([]int32, 0)
  81. } else {
  82. if _, ok := rolePageMap[item.ParentID]; ok {
  83. rolePageMap[item.ParentID] = append(rolePageMap[item.ParentID], item.PageID)
  84. } else {
  85. rolePageMap[item.ParentID] = []int32{item.PageID}
  86. }
  87. }
  88. }
  89. parentPageIds := make([]int32, 0)
  90. for k := range parentPageIdsMap {
  91. parentPageIds = append(parentPageIds, k)
  92. }
  93. type ParentPageSubNum struct {
  94. SubNum int32
  95. ParentID int32
  96. }
  97. parentPageSubs := make([]*ParentPageSubNum, 0)
  98. if err := mq.Select(mq.ParentID, mq.ID.Count().As("subNum")).Where(mq.ParentID.In(parentPageIds...)).Group(mq.ParentID).Scan(&parentPageSubs); err != nil {
  99. return serializer.Err(consts.CodeDBError, "查询出错 allPages", err)
  100. }
  101. parentPageSubMap := make(map[int32]int32)
  102. for _, item := range parentPageSubs {
  103. parentPageSubMap[item.ParentID] = item.SubNum
  104. }
  105. pageIds := make([]int32, 0)
  106. for parentId, subPages := range rolePageMap {
  107. if parentPageSubMap[parentId] == int32(len(subPages)) {
  108. pageIds = append(pageIds, subPages...)
  109. pageIds = append(pageIds, parentId)
  110. } else {
  111. pageIds = append(pageIds, subPages...)
  112. }
  113. }
  114. if _, ok := pagesMap[sid]; ok {
  115. pagesMap[sid] = append(pagesMap[sid], pageIds...)
  116. } else {
  117. pagesMap[sid] = pageIds
  118. }
  119. }
  120. v.Permissions = permissionsMap
  121. v.Pages = pagesMap
  122. }
  123. models.List = lists
  124. models.Page = req.Page
  125. models.PerPage = req.PerPage
  126. models.PageCount = (count + req.PerPage - 1) / req.PerPage
  127. return serializer.Suc(models)
  128. }
  129. func (s *sAdminRole) Edit(ctx *gin.Context, req forms.AdminRoleEditReq) serializer.Response {
  130. q := query.Use(config.AdminDB).AdminRole
  131. uq := query.Use(config.AdminDB).AdminUser
  132. logrus.Warnf("req:%+v", req)
  133. type systemOperation struct {
  134. Permissions []*model.AdminRolePermission
  135. Pages []*model.AdminRoleMenu
  136. }
  137. systemOperations := make(map[int32]*systemOperation)
  138. for sysId, menus := range req.Pages {
  139. if _, ok := systemOperations[sysId]; !ok {
  140. systemOperations[sysId] = &systemOperation{
  141. Permissions: make([]*model.AdminRolePermission, 0),
  142. Pages: make([]*model.AdminRoleMenu, 0),
  143. }
  144. }
  145. for _, menu := range menus {
  146. systemOperations[sysId].Pages = append(systemOperations[sysId].Pages, &model.AdminRoleMenu{
  147. SystemID: sysId,
  148. RoleID: int32(req.ID),
  149. PageID: menu,
  150. })
  151. }
  152. }
  153. for sysId, permissions := range req.Permissions {
  154. if _, ok := systemOperations[sysId]; !ok {
  155. systemOperations[sysId] = &systemOperation{
  156. Permissions: make([]*model.AdminRolePermission, 0),
  157. Pages: make([]*model.AdminRoleMenu, 0),
  158. }
  159. }
  160. for _, id := range permissions {
  161. systemOperations[sysId].Permissions = append(systemOperations[sysId].Permissions, &model.AdminRolePermission{
  162. SystemID: sysId,
  163. RoleID: int32(req.ID),
  164. PermissionID: id,
  165. })
  166. }
  167. }
  168. systems, err := json.Marshal(req.Systems)
  169. if err != nil {
  170. return serializer.Err(consts.CodeParamErr, "格式化出错 Systems:", err)
  171. }
  172. // 修改
  173. if req.ID > 0 {
  174. update := &model.AdminRole{
  175. Name: req.Name,
  176. Key: req.Key,
  177. Sort: req.Sort,
  178. Remark: req.Remark,
  179. Status: req.Status,
  180. Systems: string(systems),
  181. UpdatedAt: time.Now(),
  182. }
  183. // 修改角色基本信息
  184. _, err := q.Where(q.ID.Eq(req.ID)).Updates(update)
  185. if err != nil {
  186. return serializer.Err(consts.CodeDBError, "更新出错", err)
  187. }
  188. // 各系统权限、页面处理
  189. for sysId, it := range systemOperations {
  190. if _, ok := config.LogDBGroup[sysId]; !ok {
  191. continue
  192. }
  193. logDB := query.Use(config.LogDBGroup[sysId])
  194. mq := logDB.AdminRoleMenu
  195. pq := logDB.AdminRolePermission
  196. queryTx := logDB.Begin()
  197. // 删除旧的菜单权限
  198. if _, err := queryTx.AdminRoleMenu.Where(mq.RoleID.Eq(int32(req.ID))).Delete(); err != nil {
  199. queryTx.Rollback()
  200. return serializer.Err(consts.CodeDBError, "更新出错", err)
  201. }
  202. // 插入新的菜单权限
  203. if err := queryTx.AdminRoleMenu.Create(it.Pages...); err != nil {
  204. queryTx.Rollback()
  205. return serializer.Err(consts.CodeDBError, "更新出错", err)
  206. }
  207. // 删除旧的操作权限
  208. if _, err := queryTx.AdminRolePermission.Where(pq.RoleID.Eq(int32(req.ID))).Delete(); err != nil {
  209. queryTx.Rollback()
  210. return serializer.Err(consts.CodeDBError, "更新出错", err)
  211. }
  212. // 插入新的操作权限
  213. if err := queryTx.AdminRolePermission.Create(it.Permissions...); err != nil {
  214. queryTx.Rollback()
  215. return serializer.Err(consts.CodeDBError, "更新出错", err)
  216. }
  217. queryTx.Commit()
  218. }
  219. // 查询该角色下的用户,清空token
  220. users, _ := query.Use(config.AdminDB).AdminUser.Where(uq.RoleID.Eq(int32(req.ID))).Find()
  221. for _, user := range users {
  222. config.TokenRedis.Del(config.GetUserTokenKey(user.ID))
  223. }
  224. return serializer.Suc(nil)
  225. }
  226. // 新增
  227. create := &model.AdminRole{
  228. Name: req.Name,
  229. Key: req.Key,
  230. Sort: req.Sort,
  231. Systems: string(systems),
  232. Remark: req.Remark,
  233. Status: req.Status,
  234. UpdatedAt: time.Now(),
  235. CreatedAt: time.Now(),
  236. }
  237. if err := q.WithContext(ctx).Create(create); err != nil {
  238. logrus.Error(err)
  239. return serializer.Err(consts.CodeDBError, "更新出错", err)
  240. }
  241. // 插入新的菜单权限
  242. for sysId, it := range systemOperations {
  243. if _, ok := config.LogDBGroup[sysId]; !ok {
  244. continue
  245. }
  246. logDB := query.Use(config.LogDBGroup[sysId])
  247. queryTx := logDB.Begin()
  248. for i := range it.Pages {
  249. it.Pages[i].RoleID = int32(create.ID)
  250. }
  251. for i := range it.Permissions {
  252. it.Permissions[i].RoleID = int32(create.ID)
  253. }
  254. // 插入页面权限
  255. if err := queryTx.AdminRoleMenu.Create(it.Pages...); err != nil {
  256. logrus.Error(err)
  257. queryTx.Rollback()
  258. return serializer.Err(consts.CodeDBError, "更新出错", err)
  259. }
  260. // 插入操作权限
  261. if err := queryTx.AdminRolePermission.Create(it.Permissions...); err != nil {
  262. logrus.Error(err)
  263. queryTx.Rollback()
  264. return serializer.Err(consts.CodeDBError, "更新出错", err)
  265. }
  266. queryTx.Commit()
  267. }
  268. return serializer.Suc(nil)
  269. }
  270. func (s *sAdminRole) GetRole(ctx *gin.Context, req forms.AdminRoleReq) (*model.AdminRole, error) {
  271. var (
  272. q = query.Use(config.AdminDB).AdminRole
  273. m = q.WithContext(ctx)
  274. )
  275. result, err := m.Where(q.ID.Eq(req.ID)).First()
  276. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  277. return nil, err
  278. }
  279. return result, nil
  280. }
  281. func (s *sAdminRole) GetAllSystem() ([]*model.AdminSystem, error) {
  282. var (
  283. q = query.Use(config.AdminDB).AdminSystem
  284. )
  285. systems, err := q.Find()
  286. if err != nil {
  287. logrus.Error(err)
  288. }
  289. return systems, nil
  290. }
  291. func (s *sAdminRole) GetOperation(systemId int32) ([]*model.AdminOperation, error) {
  292. if _, ok := config.LogDBGroup[systemId]; !ok {
  293. logrus.Warnf("系统不存在systemId:%v", systemId)
  294. return []*model.AdminOperation{}, nil
  295. }
  296. q := query.Use(config.LogDBGroup[systemId]).AdminOperation
  297. //q := query.Use(config.AdminDB).AdminMenu
  298. m := q.WithContext(context.Background())
  299. operations, err := m.Find()
  300. if err != nil {
  301. logrus.Error(err)
  302. return nil, err
  303. }
  304. //retMenus := handleMenus(operations)
  305. return operations, nil
  306. }