import type { RouteRecordRaw } from 'vue-router' import type { Menus } from '~/stores/interface' /** * 获取第一个菜单 */ export const getFirstRoute = (routes: RouteRecordRaw[]): false | RouteRecordRaw => { const routerPaths: string[] = [] const router = useRouter() const routers = router.getRoutes() routers.forEach((item) => { if (item.path) routerPaths.push(item.path) }) let find: boolean | RouteRecordRaw = false for (const key in routes) { if (routes[key].meta?.type != 'menu_dir' && routerPaths.indexOf(routes[key].path) !== -1) { return routes[key] } else if (routes[key].children && routes[key].children?.length) { find = getFirstRoute(routes[key].children!) if (find) return find } } return find } /** * 打开菜单 * @param menu 菜单数据 */ export const onClickMenu = (menu: RouteRecordRaw) => { switch (menu.meta?.menu_type) { case 'iframe': case 'tab': navigateTo(menu.path) break case 'link': window.open(menu.path, '_blank') break default: alert('菜单类型未识别') // ElNotification({ // message: $t('utils.Navigation failed, the menu type is unrecognized!'), // type: 'error', // }) break } } /** * 处理权限节点 * @param routes 路由数据 * @param prefix 节点前缀 * @returns 组装好的权限节点 */ export const handleAuthNode = (routes: any, prefix = '/') => { const authNode: Map = new Map([]) assembleAuthNode(routes, authNode, prefix, prefix) return authNode } const assembleAuthNode = (routes: any, authNode: Map, prefix = '/', parent = '/') => { const authNodeTemp = [] for (const key in routes) { if (routes[key].type == 'button') authNodeTemp.push(prefix + routes[key].name) if (routes[key].children && routes[key].children.length > 0) { assembleAuthNode(routes[key].children, authNode, prefix, prefix + routes[key].name) } } if (authNodeTemp && authNodeTemp.length > 0) { authNode.set(parent, authNodeTemp) } } export const registerMenus = (rules: any, menus: any) => { const systemConfig = useSystemStore() // if (rules.length) { // personalCenter.mergeAuthNode(handleAuthNode(rules, '/')) // systemConfig.setHeadNav(handleMenus(rules, '/', ['nav'])) // personalCenter.mergeNavUserMenus(handleMenus(rules, '/', ['nav_user_menu'])) // } // if (menus.length) { // const menupersonalCenterBaseRoute = '/user/' // personalCenter.mergeAuthNode(handleAuthNode(menus, menupersonalCenterBaseRoute)) // personalCenter.mergeNavUserMenus(handleMenus(menus, '/', ['nav_user_menu'])) // personalCenter.setShowHeadline(menus.length > 1) // personalCenter.setUserMenus(handleMenus(menus, menupersonalCenterBaseRoute, ['menu', 'menu_dir'])) // } } export const handleMenus = (rules: any, prefix = '/', type = ['nav']) => { const menus: Menus[] = [] for (const key in rules) { if (rules[key].extend == 'add_rules_only') { continue } if (rules[key].type == 'menu_dir' && rules[key].children && !rules[key].children.length) { continue } let children: Menus[] = [] if (rules[key].children && rules[key].children.length > 0) { children = handleMenus(rules[key].children, prefix, type) } if (type.includes(rules[key].type)) { let path = '' if (['link', 'iframe'].includes(rules[key].menu_type)) { path = rules[key].url } else { path = prefix + rules[key].path } menus.push({ ...rules[key], meta: { /** * 在 meta 中存储多个可能用到的属性 * 兼容 RouteRecordRaw 和 RouteLocationNormalizedLoaded 类型 */ id: rules[key].id, type: rules[key].type, menu_type: rules[key].menu_type, }, path: path, children: children, }) } } return menus }