admin_menu.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package service
  2. import (
  3. "context"
  4. "gadmin/config"
  5. "gadmin/internal/admin/forms"
  6. "gadmin/internal/gorm/model"
  7. "gadmin/internal/gorm/query"
  8. "gadmin/utility/character"
  9. "github.com/sirupsen/logrus"
  10. "os"
  11. "sort"
  12. "strings"
  13. )
  14. var Menu = NewAMenu()
  15. type aMenu struct{}
  16. func NewAMenu() *aMenu {
  17. return &aMenu{}
  18. }
  19. func (s *aMenu) GetMenuList(systemId int32) ([]*forms.Menu, error) {
  20. q := query.Use(config.AdminDB).AdminMenu
  21. m := q.WithContext(context.Background())
  22. m = m.Where(q.Disable.Eq(0), q.SystemID.Eq(systemId)).Order(q.Sort)
  23. if os.Getenv("ADMIN_IS_LOCAL") != "1" {
  24. m = m.Where(q.LocalShow.Eq(0))
  25. }
  26. menus, err := m.Find()
  27. if err != nil {
  28. logrus.Error(err)
  29. return nil, err
  30. }
  31. retMenus := handleMenus(menus)
  32. return retMenus, nil
  33. }
  34. func handleMenus(menus []*model.AdminMenu) []*forms.Menu {
  35. menuMap := make(map[int32]*forms.Menu, 0)
  36. for _, menu := range menus {
  37. item := &forms.Menu{
  38. Id: menu.ID,
  39. Component: menu.Component,
  40. Meta: &forms.MenuMeta{
  41. Icon: menu.Icon,
  42. Sort: menu.Sort,
  43. Title: menu.Title,
  44. Hidden: menu.Hidden == 1,
  45. ActiveMenu: menu.ActiveMenu,
  46. IsRoot: menu.IsRoot == 1,
  47. IsSuper: menu.IsSuper == 1,
  48. },
  49. Name: menu.Name,
  50. Path: menu.Path,
  51. Redirect: menu.Redirect,
  52. Children: []*forms.Menu{},
  53. }
  54. if menu.ParentID == 0 {
  55. if _, ok := menuMap[menu.ID]; ok {
  56. menuMap[menu.ID].Id = menu.ID
  57. menuMap[menu.ID].Component = menu.Component
  58. menuMap[menu.ID].Meta = item.Meta
  59. menuMap[menu.ID].Name = menu.Name
  60. menuMap[menu.ID].Path = menu.Path
  61. menuMap[menu.ID].Redirect = menu.Redirect
  62. } else {
  63. menuMap[menu.ID] = item
  64. }
  65. } else {
  66. if _, ok := menuMap[menu.ParentID]; ok {
  67. menuMap[menu.ParentID].Children = append(menuMap[menu.ParentID].Children, item)
  68. } else {
  69. menuMap[menu.ParentID] = &forms.Menu{
  70. Id: menu.ParentID,
  71. Meta: &forms.MenuMeta{},
  72. Children: []*forms.Menu{
  73. item,
  74. },
  75. }
  76. }
  77. }
  78. }
  79. retMenus := make([]*forms.Menu, 0, len(menuMap))
  80. for _, menu := range menuMap {
  81. retMenus = append(retMenus, menu)
  82. }
  83. sort.Slice(retMenus, func(i, j int) bool {
  84. return retMenus[i].Meta.Sort < retMenus[j].Meta.Sort
  85. })
  86. return retMenus
  87. }
  88. func (s *aMenu) GetRoleMenuList(systemId int32, roleId int64, token string) ([]*forms.Menu, error) {
  89. //lists := GetMenuList(c)
  90. lists, err := s.GetMenuList(systemId)
  91. if err != nil {
  92. return nil, err
  93. }
  94. for _, item := range lists {
  95. if strings.Contains(item.Name, "{access-token}") {
  96. item.Name = strings.ReplaceAll(item.Name, "{access-token}", token)
  97. }
  98. if len(item.Children) > 0 {
  99. for _, children := range item.Children {
  100. if strings.Contains(children.Name, "{access-token}") {
  101. children.Name = strings.ReplaceAll(children.Name, "{access-token}", token)
  102. }
  103. }
  104. }
  105. }
  106. // 获取角色可查看的页面
  107. // 超管查看所有页面
  108. if config.IsSuperRole(roleId) {
  109. return lists, nil
  110. }
  111. var rolePages []int32
  112. rdb := query.Use(config.AdminDB).AdminRoleMenu
  113. m := rdb.WithContext(context.Background())
  114. err = m.Where(rdb.RoleID.Eq(int32(roleId)), rdb.SystemID.Eq(systemId)).Pluck(rdb.PageID, &rolePages)
  115. if err != nil {
  116. logrus.Error("AdminRole... err:%+v", err)
  117. return nil, err
  118. }
  119. newList := make([]*forms.Menu, 0)
  120. //if len(rolePages) == 0 { // 没有配置权限默认全部
  121. // newList = lists
  122. //} else {
  123. tmpPages := make(map[int32]*forms.Menu)
  124. for _, item := range lists {
  125. if item.Meta.IsSuper {
  126. continue
  127. }
  128. if character.InSlice(rolePages, item.Id) {
  129. tmpPages[item.Id] = &forms.Menu{
  130. Id: item.Id,
  131. Component: item.Component,
  132. Meta: item.Meta,
  133. Name: item.Name,
  134. Path: item.Name,
  135. Redirect: item.Redirect,
  136. Children: []*forms.Menu{},
  137. }
  138. }
  139. if len(item.Children) > 0 {
  140. for _, children := range item.Children {
  141. if children.Meta.IsSuper {
  142. continue
  143. }
  144. if !character.InSlice(rolePages, children.Id) {
  145. continue
  146. }
  147. if _, ok2 := tmpPages[item.Id]; ok2 {
  148. tmpPages[item.Id].Children = append(tmpPages[item.Id].Children, children)
  149. } else {
  150. tmpPages[item.Id] = &forms.Menu{
  151. Id: item.Id,
  152. Component: item.Component,
  153. Meta: item.Meta,
  154. Name: item.Name,
  155. Path: item.Name,
  156. Redirect: item.Redirect,
  157. Children: []*forms.Menu{children},
  158. }
  159. }
  160. }
  161. }
  162. }
  163. for _, item := range tmpPages {
  164. sort.Slice(item.Children, func(i, j int) bool {
  165. return item.Children[i].Meta.Sort < item.Children[j].Meta.Sort
  166. })
  167. newList = append(newList, item)
  168. }
  169. //}
  170. // 排序
  171. sort.Slice(newList, func(i, j int) bool {
  172. return newList[i].Meta.Sort < newList[j].Meta.Sort
  173. })
  174. return newList, nil
  175. }