admin_role.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. package service
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "gadmin/config"
  6. "gadmin/internal/admin/consts"
  7. "gadmin/internal/admin/forms"
  8. "gadmin/internal/gorm/model"
  9. "gadmin/internal/gorm/query"
  10. "gadmin/utility/serializer"
  11. "github.com/gin-gonic/gin"
  12. "github.com/sirupsen/logrus"
  13. "github.com/spf13/cast"
  14. "gorm.io/gorm"
  15. "time"
  16. )
  17. // AdminRole 后台角色
  18. var AdminRole = new(sAdminRole)
  19. type sAdminRole struct{}
  20. func (s *sAdminRole) List(ctx *gin.Context, req forms.AdminRoleListReq) serializer.Response {
  21. var (
  22. q = query.Use(config.AdminDB).AdminRole
  23. m = q.WithContext(ctx)
  24. mq = query.Use(config.AdminDB).AdminRoleMenu
  25. pq = query.Use(config.AdminDB).AdminRolePermission
  26. offset int64 = 0
  27. models forms.UserAccountListRes
  28. lists []*forms.AdminRoleListModel
  29. )
  30. m = m.Order(q.Sort).Order(q.ID.Desc())
  31. req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
  32. count, err := m.Count()
  33. if err != nil {
  34. return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
  35. }
  36. if count > 0 {
  37. if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
  38. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  39. }
  40. }
  41. for _, v := range lists {
  42. if err := json.Unmarshal([]byte(cast.ToString(v.Systems)), &v.Systems); err != nil {
  43. return serializer.Err(consts.CodeParamErr, "格式化出错 Systems", err)
  44. }
  45. permissionsModels, err := pq.Where(pq.RoleID.Eq(int32(v.ID))).Find()
  46. if err != nil {
  47. return serializer.Err(consts.CodeParamErr, "查询出错 permissionsModels", err)
  48. }
  49. permissionsMap := make(map[int32][]int32)
  50. for _, item := range permissionsModels {
  51. if _, ok := permissionsMap[item.SystemID]; ok {
  52. permissionsMap[item.SystemID] = append(permissionsMap[item.SystemID], item.PermissionID)
  53. } else {
  54. permissionsMap[item.SystemID] = []int32{item.PermissionID}
  55. }
  56. }
  57. v.Permissions = permissionsMap
  58. pagesModels, err := mq.Where(mq.RoleID.Eq(int32(v.ID))).Find()
  59. if err != nil {
  60. return serializer.Err(consts.CodeParamErr, "查询出错 pagesModels", err)
  61. }
  62. pagesMap := make(map[int32][]int32)
  63. for _, item := range pagesModels {
  64. if _, ok := pagesMap[item.SystemID]; ok {
  65. pagesMap[item.SystemID] = append(pagesMap[item.SystemID], item.PageID)
  66. } else {
  67. pagesMap[item.SystemID] = []int32{item.PageID}
  68. }
  69. }
  70. v.Pages = pagesMap
  71. }
  72. models.List = lists
  73. models.Page = req.Page
  74. models.PerPage = req.PerPage
  75. models.PageCount = (count + req.PerPage - 1) / req.PerPage
  76. return serializer.Suc(models)
  77. }
  78. func (s *sAdminRole) Edit(ctx *gin.Context, req forms.AdminRoleEditReq) serializer.Response {
  79. q := query.Use(config.AdminDB).AdminRole
  80. mq := query.Use(config.AdminDB).AdminRoleMenu
  81. pq := query.Use(config.AdminDB).AdminRolePermission
  82. uq := query.Use(config.AdminDB).AdminUser
  83. logrus.Warnf("req:%+v", req)
  84. menusModel := make([]*model.AdminRoleMenu, 0)
  85. for sysId, menus := range req.Pages {
  86. for _, menu := range menus {
  87. menusModel = append(menusModel, &model.AdminRoleMenu{
  88. SystemID: sysId,
  89. RoleID: int32(req.ID),
  90. PageID: menu,
  91. })
  92. }
  93. }
  94. permissionsModel := make([]*model.AdminRolePermission, 0)
  95. for sysId, permissions := range req.Permissions {
  96. for _, id := range permissions {
  97. permissionsModel = append(permissionsModel, &model.AdminRolePermission{
  98. SystemID: sysId,
  99. RoleID: int32(req.ID),
  100. PermissionID: id,
  101. })
  102. }
  103. }
  104. systems, err := json.Marshal(req.Systems)
  105. if err != nil {
  106. return serializer.Err(consts.CodeParamErr, "格式化出错 Systems:", err)
  107. }
  108. // 修改
  109. if req.ID > 0 {
  110. update := &model.AdminRole{
  111. Name: req.Name,
  112. Key: req.Key,
  113. Sort: req.Sort,
  114. Remark: req.Remark,
  115. Status: req.Status,
  116. Systems: string(systems),
  117. UpdatedAt: time.Now(),
  118. }
  119. queryTx := query.Use(config.AdminDB).Begin()
  120. _, err := queryTx.AdminRole.Where(q.ID.Eq(req.ID)).Updates(update)
  121. if err != nil {
  122. queryTx.Rollback()
  123. return serializer.Err(consts.CodeDBError, "更新出错", err)
  124. }
  125. // 删除旧的菜单权限
  126. if _, err := queryTx.AdminRoleMenu.Where(mq.RoleID.Eq(int32(req.ID))).Delete(); err != nil {
  127. queryTx.Rollback()
  128. return serializer.Err(consts.CodeDBError, "更新出错", err)
  129. }
  130. // 插入新的菜单权限
  131. if err := queryTx.AdminRoleMenu.Create(menusModel...); err != nil {
  132. queryTx.Rollback()
  133. return serializer.Err(consts.CodeDBError, "更新出错", err)
  134. }
  135. // 删除旧的操作权限
  136. if _, err := queryTx.AdminRolePermission.Where(pq.RoleID.Eq(int32(req.ID))).Delete(); err != nil {
  137. queryTx.Rollback()
  138. return serializer.Err(consts.CodeDBError, "更新出错", err)
  139. }
  140. // 插入新的操作权限
  141. if err := queryTx.AdminRolePermission.Create(permissionsModel...); err != nil {
  142. queryTx.Rollback()
  143. return serializer.Err(consts.CodeDBError, "更新出错", err)
  144. }
  145. queryTx.Commit()
  146. // 查询该角色下的用户,清空token
  147. users, _ := query.Use(config.AdminDB).AdminUser.Where(uq.RoleID.Eq(int32(req.ID))).Find()
  148. for _, user := range users {
  149. config.TokenRedis.Del(config.GetUserTokenKey(user.ID))
  150. }
  151. return serializer.Suc(nil)
  152. }
  153. // 新增
  154. create := &model.AdminRole{
  155. Name: req.Name,
  156. Key: req.Key,
  157. Sort: req.Sort,
  158. Systems: string(systems),
  159. Remark: req.Remark,
  160. Status: req.Status,
  161. UpdatedAt: time.Now(),
  162. CreatedAt: time.Now(),
  163. }
  164. queryTx := query.Use(config.AdminDB).Begin()
  165. if err := queryTx.AdminRole.WithContext(ctx).Create(create); err != nil {
  166. logrus.Error(err)
  167. queryTx.Rollback()
  168. return serializer.Err(consts.CodeDBError, "更新出错", err)
  169. }
  170. // 插入新的菜单权限
  171. for _, item := range menusModel {
  172. item.RoleID = int32(create.ID)
  173. }
  174. if err := queryTx.AdminRoleMenu.Create(menusModel...); err != nil {
  175. logrus.Error(err)
  176. queryTx.Rollback()
  177. return serializer.Err(consts.CodeDBError, "更新出错", err)
  178. }
  179. // 插入新的操作权限
  180. for _, item := range permissionsModel {
  181. item.RoleID = int32(create.ID)
  182. }
  183. if err := queryTx.AdminRolePermission.Create(permissionsModel...); err != nil {
  184. logrus.Error(err)
  185. queryTx.Rollback()
  186. return serializer.Err(consts.CodeDBError, "更新出错", err)
  187. }
  188. queryTx.Commit()
  189. return serializer.Suc(nil)
  190. }
  191. func (s *sAdminRole) GetRole(ctx *gin.Context, req forms.AdminRoleReq) (*model.AdminRole, error) {
  192. var (
  193. q = query.Use(config.AdminDB).AdminRole
  194. m = q.WithContext(ctx)
  195. )
  196. result, err := m.Where(q.ID.Eq(req.ID)).First()
  197. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  198. return nil, err
  199. }
  200. return result, nil
  201. }
  202. func (s *sAdminRole) GetAllSystem() ([]*model.AdminSystem, error) {
  203. var (
  204. q = query.Use(config.AdminDB).AdminSystem
  205. )
  206. systems, err := q.Find()
  207. if err != nil {
  208. logrus.Error(err)
  209. }
  210. return systems, nil
  211. }