123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- package service
- import (
- "context"
- "gadmin/config"
- "gadmin/internal/admin/forms"
- "gadmin/internal/gorm/model"
- "gadmin/internal/gorm/query"
- "gadmin/utility/character"
- "github.com/sirupsen/logrus"
- "os"
- "sort"
- "strings"
- )
- var Menu = NewAMenu()
- type aMenu struct{}
- func NewAMenu() *aMenu {
- return &aMenu{}
- }
- func (s *aMenu) GetMenuList(systemId int32) ([]*forms.Menu, error) {
- q := query.Use(config.AdminDB).AdminMenu
- m := q.WithContext(context.Background())
- m = m.Where(q.Disable.Eq(0), q.SystemID.Eq(systemId)).Order(q.Sort)
- if os.Getenv("ADMIN_IS_LOCAL") != "1" {
- m = m.Where(q.LocalShow.Eq(0))
- }
- menus, err := m.Find()
- if err != nil {
- logrus.Error(err)
- return nil, err
- }
- retMenus := handleMenus(menus)
- return retMenus, nil
- }
- func handleMenus(menus []*model.AdminMenu) []*forms.Menu {
- menuMap := make(map[int32]*forms.Menu, 0)
- for _, menu := range menus {
- item := &forms.Menu{
- Id: menu.ID,
- Component: menu.Component,
- Meta: &forms.MenuMeta{
- Icon: menu.Icon,
- Sort: menu.Sort,
- Title: menu.Title,
- Hidden: menu.Hidden == 1,
- ActiveMenu: menu.ActiveMenu,
- IsRoot: menu.IsRoot == 1,
- IsSuper: menu.IsSuper == 1,
- },
- Name: menu.Name,
- Path: menu.Path,
- Redirect: menu.Redirect,
- Children: []*forms.Menu{},
- }
- if menu.ParentID == 0 {
- if _, ok := menuMap[menu.ID]; ok {
- menuMap[menu.ID].Id = menu.ID
- menuMap[menu.ID].Component = menu.Component
- menuMap[menu.ID].Meta = item.Meta
- menuMap[menu.ID].Name = menu.Name
- menuMap[menu.ID].Path = menu.Path
- menuMap[menu.ID].Redirect = menu.Redirect
- } else {
- menuMap[menu.ID] = item
- }
- } else {
- if _, ok := menuMap[menu.ParentID]; ok {
- menuMap[menu.ParentID].Children = append(menuMap[menu.ParentID].Children, item)
- } else {
- menuMap[menu.ParentID] = &forms.Menu{
- Id: menu.ParentID,
- Meta: &forms.MenuMeta{},
- Children: []*forms.Menu{
- item,
- },
- }
- }
- }
- }
- retMenus := make([]*forms.Menu, 0, len(menuMap))
- for _, menu := range menuMap {
- retMenus = append(retMenus, menu)
- }
- sort.Slice(retMenus, func(i, j int) bool {
- return retMenus[i].Meta.Sort < retMenus[j].Meta.Sort
- })
- return retMenus
- }
- func (s *aMenu) GetRoleMenuList(systemId int32, roleId int64, token string) ([]*forms.Menu, error) {
- //lists := GetMenuList(c)
- lists, err := s.GetMenuList(systemId)
- if err != nil {
- return nil, err
- }
- for _, item := range lists {
- if strings.Contains(item.Name, "{access-token}") {
- item.Name = strings.ReplaceAll(item.Name, "{access-token}", token)
- }
- if len(item.Children) > 0 {
- for _, children := range item.Children {
- if strings.Contains(children.Name, "{access-token}") {
- children.Name = strings.ReplaceAll(children.Name, "{access-token}", token)
- }
- }
- }
- }
- // 获取角色可查看的页面
- // 超管查看所有页面
- if config.IsSuperRole(roleId) {
- return lists, nil
- }
- var rolePages []int32
- rdb := query.Use(config.AdminDB).AdminRoleMenu
- m := rdb.WithContext(context.Background())
- err = m.Where(rdb.RoleID.Eq(int32(roleId)), rdb.SystemID.Eq(systemId)).Pluck(rdb.PageID, &rolePages)
- if err != nil {
- logrus.Error("AdminRole... err:%+v", err)
- return nil, err
- }
- newList := make([]*forms.Menu, 0)
- //if len(rolePages) == 0 { // 没有配置权限默认全部
- // newList = lists
- //} else {
- tmpPages := make(map[int32]*forms.Menu)
- for _, item := range lists {
- if item.Meta.IsSuper {
- continue
- }
- if character.InSlice(rolePages, item.Id) {
- tmpPages[item.Id] = &forms.Menu{
- Id: item.Id,
- Component: item.Component,
- Meta: item.Meta,
- Name: item.Name,
- Path: item.Name,
- Redirect: item.Redirect,
- Children: []*forms.Menu{},
- }
- }
- if len(item.Children) > 0 {
- for _, children := range item.Children {
- if children.Meta.IsSuper {
- continue
- }
- if !character.InSlice(rolePages, children.Id) {
- continue
- }
- if _, ok2 := tmpPages[item.Id]; ok2 {
- tmpPages[item.Id].Children = append(tmpPages[item.Id].Children, children)
- } else {
- tmpPages[item.Id] = &forms.Menu{
- Id: item.Id,
- Component: item.Component,
- Meta: item.Meta,
- Name: item.Name,
- Path: item.Name,
- Redirect: item.Redirect,
- Children: []*forms.Menu{children},
- }
- }
- }
- }
- }
- for _, item := range tmpPages {
- sort.Slice(item.Children, func(i, j int) bool {
- return item.Children[i].Meta.Sort < item.Children[j].Meta.Sort
- })
- newList = append(newList, item)
- }
- //}
- // 排序
- sort.Slice(newList, func(i, j int) bool {
- return newList[i].Meta.Sort < newList[j].Meta.Sort
- })
- return newList, nil
- }
|