package system import ( "errors" "server/dao/system" "gorm.io/gorm" "server/model/common/request" ) //@author: [piexlmax](https://github.com/piexlmax) //@function: getMenuTreeMap //@description: 获取路由总树map //@param: authorityId string //@return: treeMap map[string][]system.SysMenu, err error type MenuService struct{} var MenuServiceApp = new(MenuService) func (menuService *MenuService) getMenuTreeMap(authorityId uint) (treeMap map[uint][]system.SysMenu, err error) { var allMenus []system.SysMenu treeMap = make(map[uint][]system.SysMenu) SysAuthorityMenus, err := system.QueryAuthorityMenuByAuthorityId(authorityId) if err != nil { return } var MenuIds []string for i := range SysAuthorityMenus { MenuIds = append(MenuIds, SysAuthorityMenus[i].MenuId) } baseMenu, err := system.QueryBaseMenuAndParametersByMenuId(MenuIds) if err != nil { return } for i := range baseMenu { allMenus = append(allMenus, system.SysMenu{ SysBaseMenu: baseMenu[i], AuthorityId: authorityId, MenuId: baseMenu[i].ID, Parameters: baseMenu[i].Parameters, }) } btns, err := system.QueryAuthorityBtnAndSysBaseMenuBtnById(authorityId) if err != nil { return } var btnMap = make(map[uint]map[string]uint) for _, v := range btns { if btnMap[v.SysMenuID] == nil { btnMap[v.SysMenuID] = make(map[string]uint) } btnMap[v.SysMenuID][v.SysBaseMenuBtn.Name] = authorityId } for _, v := range allMenus { v.Btns = btnMap[v.SysBaseMenu.ID] treeMap[v.ParentId] = append(treeMap[v.ParentId], v) } return treeMap, err } //@author: [piexlmax](https://github.com/piexlmax) //@function: GetMenuTree //@description: 获取动态菜单树 //@param: authorityId string //@return: menus []system.SysMenu, err error func (menuService *MenuService) GetMenuTree(authorityId uint) (menus []system.SysMenu, err error) { menuTree, err := menuService.getMenuTreeMap(authorityId) menus = menuTree[0] for i := 0; i < len(menus); i++ { err = menuService.getChildrenList(&menus[i], menuTree) } return menus, err } //@author: [piexlmax](https://github.com/piexlmax) //@function: getChildrenList //@description: 获取子菜单 //@param: menu *model.SysMenu, treeMap map[string][]model.SysMenu //@return: err error func (menuService *MenuService) getChildrenList(menu *system.SysMenu, treeMap map[uint][]system.SysMenu) (err error) { menu.Children = treeMap[menu.MenuId] for i := 0; i < len(menu.Children); i++ { err = menuService.getChildrenList(&menu.Children[i], treeMap) } return err } //@author: [piexlmax](https://github.com/piexlmax) //@function: GetInfoList //@description: 获取路由分页 //@return: list interface{}, total int64,err error func (menuService *MenuService) GetInfoList() (list interface{}, total int64, err error) { var menuList []system.SysBaseMenu treeMap, err := menuService.getBaseMenuTreeMap() menuList = treeMap[0] for i := 0; i < len(menuList); i++ { err = menuService.getBaseChildrenList(&menuList[i], treeMap) } return menuList, total, err } //@author: [piexlmax](https://github.com/piexlmax) //@function: getBaseChildrenList //@description: 获取菜单的子菜单 //@param: menu *model.SysBaseMenu, treeMap map[string][]model.SysBaseMenu //@return: err error func (menuService *MenuService) getBaseChildrenList(menu *system.SysBaseMenu, treeMap map[uint][]system.SysBaseMenu) (err error) { menu.Children = treeMap[menu.ID] for i := 0; i < len(menu.Children); i++ { err = menuService.getBaseChildrenList(&menu.Children[i], treeMap) } return err } //@author: [piexlmax](https://github.com/piexlmax) //@function: AddBaseMenu //@description: 添加基础路由 //@param: menu model.SysBaseMenu //@return: error func (menuService *MenuService) AddBaseMenu(menu system.SysBaseMenu) error { _, err := system.QueryBaseMenuByName(menu.Name) if !errors.Is(err, gorm.ErrRecordNotFound) { return errors.New("存在重复name,请修改name") } return menu.CreateBaseMenu() } //@author: [piexlmax](https://github.com/piexlmax) //@function: getBaseMenuTreeMap //@description: 获取路由总树map //@return: treeMap map[string][]system.SysBaseMenu, err error func (menuService *MenuService) getBaseMenuTreeMap() (treeMap map[uint][]system.SysBaseMenu, err error) { treeMap = make(map[uint][]system.SysBaseMenu) allMenus, err := system.QueryBaseMenuAndMenuBtnAndParameters() for _, v := range allMenus { treeMap[v.ParentId] = append(treeMap[v.ParentId], v) } return treeMap, err } //@author: [piexlmax](https://github.com/piexlmax) //@function: GetBaseMenuTree //@description: 获取基础路由树 //@return: menus []system.SysBaseMenu, err error func (menuService *MenuService) GetBaseMenuTree() (menus []system.SysBaseMenu, err error) { treeMap, err := menuService.getBaseMenuTreeMap() menus = treeMap[0] for i := 0; i < len(menus); i++ { err = menuService.getBaseChildrenList(&menus[i], treeMap) } return menus, err } //@author: [piexlmax](https://github.com/piexlmax) //@function: AddMenuAuthority //@description: 为角色增加menu树 //@param: menus []model.SysBaseMenu, authorityId string //@return: err error func (menuService *MenuService) AddMenuAuthority(menus []system.SysBaseMenu, authorityId uint) (err error) { var auth system.SysAuthority auth.AuthorityId = authorityId auth.SysBaseMenus = menus err = AuthorityServiceApp.SetMenuAuthority(&auth) return err } //@author: [piexlmax](https://github.com/piexlmax) //@function: GetMenuAuthority //@description: 查看当前角色树 //@param: info *request.GetAuthorityId //@return: menus []system.SysMenu, err error func (menuService *MenuService) GetMenuAuthority(info *request.GetAuthorityId) (menus []system.SysMenu, err error) { SysAuthorityMenus, err := system.QueryAuthorityMenuByAuthorityId(info.AuthorityId) if err != nil { return } var MenuIds []string for i := range SysAuthorityMenus { MenuIds = append(MenuIds, SysAuthorityMenus[i].MenuId) } baseMenu, err := system.QueryBaseMenuAndParametersByMenuId(MenuIds) for i := range baseMenu { menus = append(menus, system.SysMenu{ SysBaseMenu: baseMenu[i], AuthorityId: info.AuthorityId, MenuId: baseMenu[i].ID, Parameters: baseMenu[i].Parameters, }) } return menus, err } // UserAuthorityDefaultRouter 用户角色默认路由检查 // // Author [SliverHorn](https://github.com/SliverHorn) func (menuService *MenuService) UserAuthorityDefaultRouter(user *system.SysUser) { menuIds, err := system.QuerySysBaseMenuIdById(user.AuthorityId) if err != nil { return } _, err = system.QueryBaseMenuByIdAndDefaultRouter(user.Authority.DefaultRouter, menuIds) if errors.Is(err, gorm.ErrRecordNotFound) { user.Authority.DefaultRouter = "404" } }