admin_role.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  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. mq := logDB.AdminRoleMenu
  55. // 查询该角色各系统下的权限
  56. permissionIds := make([]int32, 0)
  57. if err := pq.Where(pq.RoleID.Eq(int32(v.ID))).Pluck(pq.PermissionID, &permissionIds); err != nil {
  58. return serializer.Err(consts.CodeParamErr, "查询出错 permissionsModels", err)
  59. }
  60. if _, ok := permissionsMap[sid]; ok {
  61. permissionsMap[sid] = append(permissionsMap[sid], permissionIds...)
  62. } else {
  63. permissionsMap[sid] = permissionIds
  64. }
  65. // 查询该角色各系统下的页面
  66. pageIds := make([]int32, 0)
  67. if err := mq.Where(mq.RoleID.Eq(int32(v.ID))).Pluck(mq.PageID, &pageIds); err != nil {
  68. return serializer.Response{}
  69. }
  70. if _, ok := pagesMap[sid]; ok {
  71. pagesMap[sid] = append(pagesMap[sid], pageIds...)
  72. } else {
  73. pagesMap[sid] = pageIds
  74. }
  75. }
  76. v.Permissions = permissionsMap
  77. v.Pages = pagesMap
  78. }
  79. models.List = lists
  80. models.Page = req.Page
  81. models.PerPage = req.PerPage
  82. models.PageCount = (count + req.PerPage - 1) / req.PerPage
  83. return serializer.Suc(models)
  84. }
  85. func (s *sAdminRole) Edit(ctx *gin.Context, req forms.AdminRoleEditReq) serializer.Response {
  86. q := query.Use(config.AdminDB).AdminRole
  87. uq := query.Use(config.AdminDB).AdminUser
  88. logrus.Warnf("req:%+v", req)
  89. type systemOperation struct {
  90. Permissions []*model.AdminRolePermission
  91. Pages []*model.AdminRoleMenu
  92. }
  93. systemOperations := make(map[int32]*systemOperation)
  94. for sysId, menus := range req.Pages {
  95. if _, ok := systemOperations[sysId]; !ok {
  96. systemOperations[sysId] = &systemOperation{
  97. Permissions: make([]*model.AdminRolePermission, 0),
  98. Pages: make([]*model.AdminRoleMenu, 0),
  99. }
  100. }
  101. for _, menu := range menus {
  102. systemOperations[sysId].Pages = append(systemOperations[sysId].Pages, &model.AdminRoleMenu{
  103. SystemID: sysId,
  104. RoleID: int32(req.ID),
  105. PageID: menu,
  106. })
  107. }
  108. }
  109. for sysId, permissions := range req.Permissions {
  110. if _, ok := systemOperations[sysId]; !ok {
  111. systemOperations[sysId] = &systemOperation{
  112. Permissions: make([]*model.AdminRolePermission, 0),
  113. Pages: make([]*model.AdminRoleMenu, 0),
  114. }
  115. }
  116. for _, id := range permissions {
  117. systemOperations[sysId].Permissions = append(systemOperations[sysId].Permissions, &model.AdminRolePermission{
  118. SystemID: sysId,
  119. RoleID: int32(req.ID),
  120. PermissionID: id,
  121. })
  122. }
  123. }
  124. systems, err := json.Marshal(req.Systems)
  125. if err != nil {
  126. return serializer.Err(consts.CodeParamErr, "格式化出错 Systems:", err)
  127. }
  128. // 修改
  129. if req.ID > 0 {
  130. update := &model.AdminRole{
  131. Name: req.Name,
  132. Key: req.Key,
  133. Sort: req.Sort,
  134. Remark: req.Remark,
  135. Status: req.Status,
  136. Systems: string(systems),
  137. UpdatedAt: time.Now(),
  138. }
  139. // 修改角色基本信息
  140. _, err := q.Where(q.ID.Eq(req.ID)).Updates(update)
  141. if err != nil {
  142. return serializer.Err(consts.CodeDBError, "更新出错", err)
  143. }
  144. // 各系统权限、页面处理
  145. for sysId, it := range systemOperations {
  146. if _, ok := config.LogDBGroup[sysId]; !ok {
  147. continue
  148. }
  149. logDB := query.Use(config.LogDBGroup[sysId])
  150. mq := logDB.AdminRoleMenu
  151. pq := logDB.AdminRolePermission
  152. queryTx := logDB.Begin()
  153. // 删除旧的菜单权限
  154. if _, err := queryTx.AdminRoleMenu.Where(mq.RoleID.Eq(int32(req.ID))).Delete(); err != nil {
  155. queryTx.Rollback()
  156. return serializer.Err(consts.CodeDBError, "更新出错", err)
  157. }
  158. // 插入新的菜单权限
  159. if err := queryTx.AdminRoleMenu.Create(it.Pages...); err != nil {
  160. queryTx.Rollback()
  161. return serializer.Err(consts.CodeDBError, "更新出错", err)
  162. }
  163. // 删除旧的操作权限
  164. if _, err := queryTx.AdminRolePermission.Where(pq.RoleID.Eq(int32(req.ID))).Delete(); err != nil {
  165. queryTx.Rollback()
  166. return serializer.Err(consts.CodeDBError, "更新出错", err)
  167. }
  168. // 插入新的操作权限
  169. if err := queryTx.AdminRolePermission.Create(it.Permissions...); err != nil {
  170. queryTx.Rollback()
  171. return serializer.Err(consts.CodeDBError, "更新出错", err)
  172. }
  173. queryTx.Commit()
  174. }
  175. // 查询该角色下的用户,清空token
  176. users, _ := query.Use(config.AdminDB).AdminUser.Where(uq.RoleID.Eq(int32(req.ID))).Find()
  177. for _, user := range users {
  178. config.TokenRedis.Del(config.GetUserTokenKey(user.ID))
  179. }
  180. return serializer.Suc(nil)
  181. }
  182. // 新增
  183. create := &model.AdminRole{
  184. Name: req.Name,
  185. Key: req.Key,
  186. Sort: req.Sort,
  187. Systems: string(systems),
  188. Remark: req.Remark,
  189. Status: req.Status,
  190. UpdatedAt: time.Now(),
  191. CreatedAt: time.Now(),
  192. }
  193. if err := q.WithContext(ctx).Create(create); err != nil {
  194. logrus.Error(err)
  195. return serializer.Err(consts.CodeDBError, "更新出错", err)
  196. }
  197. // 插入新的菜单权限
  198. for sysId, it := range systemOperations {
  199. if _, ok := config.LogDBGroup[sysId]; !ok {
  200. continue
  201. }
  202. logDB := query.Use(config.LogDBGroup[sysId])
  203. queryTx := logDB.Begin()
  204. for i := range it.Pages {
  205. it.Pages[i].RoleID = int32(create.ID)
  206. }
  207. for i := range it.Permissions {
  208. it.Permissions[i].RoleID = int32(create.ID)
  209. }
  210. // 插入页面权限
  211. if err := queryTx.AdminRoleMenu.Create(it.Pages...); err != nil {
  212. logrus.Error(err)
  213. queryTx.Rollback()
  214. return serializer.Err(consts.CodeDBError, "更新出错", err)
  215. }
  216. // 插入操作权限
  217. if err := queryTx.AdminRolePermission.Create(it.Permissions...); err != nil {
  218. logrus.Error(err)
  219. queryTx.Rollback()
  220. return serializer.Err(consts.CodeDBError, "更新出错", err)
  221. }
  222. queryTx.Commit()
  223. }
  224. return serializer.Suc(nil)
  225. }
  226. func (s *sAdminRole) GetRole(ctx *gin.Context, req forms.AdminRoleReq) (*model.AdminRole, error) {
  227. var (
  228. q = query.Use(config.AdminDB).AdminRole
  229. m = q.WithContext(ctx)
  230. )
  231. result, err := m.Where(q.ID.Eq(req.ID)).First()
  232. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  233. return nil, err
  234. }
  235. return result, nil
  236. }
  237. func (s *sAdminRole) GetAllSystem() ([]*model.AdminSystem, error) {
  238. var (
  239. q = query.Use(config.AdminDB).AdminSystem
  240. )
  241. systems, err := q.Find()
  242. if err != nil {
  243. logrus.Error(err)
  244. }
  245. return systems, nil
  246. }
  247. func (s *sAdminRole) GetOperation(systemId int32) ([]*model.AdminOperation, error) {
  248. if _, ok := config.LogDBGroup[systemId]; !ok {
  249. logrus.Warnf("系统不存在systemId:%v", systemId)
  250. return []*model.AdminOperation{}, nil
  251. }
  252. q := query.Use(config.LogDBGroup[systemId]).AdminOperation
  253. //q := query.Use(config.AdminDB).AdminMenu
  254. m := q.WithContext(context.Background())
  255. operations, err := m.Find()
  256. if err != nil {
  257. logrus.Error(err)
  258. return nil, err
  259. }
  260. //retMenus := handleMenus(operations)
  261. return operations, nil
  262. }