admin_menu.go 4.8 KB

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