This commit is contained in:
zxr
2026-03-21 17:53:40 +08:00
parent 2c3195b903
commit 996f86d3d0
4 changed files with 30 additions and 61 deletions

View File

@@ -6,7 +6,13 @@ import { listenerRouteChange } from '@/utils/route-listener'
import { compile, computed, defineComponent, h, ref } from 'vue' import { compile, computed, defineComponent, h, ref } from 'vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import type { RouteMeta } from 'vue-router' import type { RouteMeta } from 'vue-router'
import { RouteRecordRaw, useRoute, useRouter } from 'vue-router' import {
isNavigationFailure,
NavigationFailureType,
RouteRecordRaw,
useRoute,
useRouter,
} from 'vue-router'
import useMenuTree from './use-menu-tree' import useMenuTree from './use-menu-tree'
import { COMMON_ICONS } from '@/views/ops/pages/system-settings/menu-management/menuIcons' import { COMMON_ICONS } from '@/views/ops/pages/system-settings/menu-management/menuIcons'
@@ -45,10 +51,20 @@ export default defineComponent({
selectedKey.value = [item.name as string] selectedKey.value = [item.name as string]
return return
} }
console.log('item', item) const name = item.name
// Trigger router change if (name == null || name === '') {
router.push({ console.warn('[Menu] 无法跳转:路由缺少 name', item.path, item.meta?.locale)
name: item.name, return
}
if (!router.hasRoute(name as string)) {
console.warn('[Menu] 无法跳转:未注册的路由 name', name, item.meta?.locale)
return
}
router.push({ name }).catch((err) => {
if (isNavigationFailure(err, NavigationFailureType.duplicated)) {
return
}
console.error('[Menu] 路由跳转失败', name, err)
}) })
} }
const findMenuOpenKeys = (target: string) => { const findMenuOpenKeys = (target: string) => {
@@ -80,7 +96,8 @@ export default defineComponent({
const keySet = new Set([...menuOpenKeys, ...openKeys.value]) const keySet = new Set([...menuOpenKeys, ...openKeys.value])
openKeys.value = [...keySet] openKeys.value = [...keySet]
selectedKey.value = [activeMenu || menuOpenKeys[menuOpenKeys.length - 1]] const leafKey = (activeMenu || menuOpenKeys[menuOpenKeys.length - 1]) as string | undefined
selectedKey.value = leafKey ? [leafKey] : []
} }
}, true) }, true)
const setCollapse = (val: boolean) => { const setCollapse = (val: boolean) => {

View File

@@ -15,12 +15,12 @@ export default function useMenuTree() {
return appClientMenus return appClientMenus
}) })
const menuTree = computed(() => { const menuTree = computed(() => {
const copyRouter = cloneDeep(appRoute.value) as RouteRecordNormalized[] const copyRouter = cloneDeep(appRoute.value || []) as RouteRecordNormalized[]
copyRouter.sort((a: RouteRecordNormalized, b: RouteRecordNormalized) => { copyRouter.sort((a: RouteRecordNormalized, b: RouteRecordNormalized) => {
return (a.meta.order || 0) - (b.meta.order || 0) return (a.meta.order || 0) - (b.meta.order || 0)
}) })
function travel(_routes: RouteRecordRaw[], layer: number) { function travel(_routes: RouteRecordRaw[], layer: number): RouteRecordRaw[] {
if (!_routes) return null if (!_routes?.length) return []
const collector: any = _routes.map((element) => { const collector: any = _routes.map((element) => {
// no access // no access
@@ -44,16 +44,8 @@ export default function useMenuTree() {
element.children = subItem element.children = subItem
return element return element
} }
// the else logic
if (layer > 1) {
element.children = subItem
return element
}
if (element.meta?.hideInMenu === false) {
return element
}
// 子级全部被权限/隐藏规则过滤时,不再把父级当成可点击叶子(避免 push 父级 name 无对应页面)
return null return null
}) })
return collector.filter(Boolean) return collector.filter(Boolean)

View File

@@ -1,43 +1,4 @@
import { DEFAULT_LAYOUT } from '../base' import type { AppRouteRecordRaw } from '../types'
import { AppRouteRecordRaw } from '../types'
const REMOTE: AppRouteRecordRaw = { /** 占位:勿导出空对象 `{}`,否则会被当作一条无效路由加入 router导致部分菜单匹配异常 */
// path: '/dc', export default [] as AppRouteRecordRaw[]
// name: 'DC',
// component: DEFAULT_LAYOUT,
// meta: {
// locale: 'menu.dc',
// requiresAuth: true,
// icon: 'icon-desktop',
// order: 99,
// hideInMenu: true,
// },
// children: [
// {
// path: 'detail',
// name: 'DCDetail',
// component: () => import('@/views/ops/pages/dc/detail/index.vue'),
// meta: {
// locale: 'menu.dc.detail',
// requiresAuth: true,
// roles: ['*'],
// // is_full: true,
// isNewTab: true,
// },
// },
// {
// path: 'remote',
// name: 'DCRemote',
// component: () => import('@/views/ops/pages/dc/remote/index.vue'),
// meta: {
// locale: 'menu.dc.remote',
// requiresAuth: true,
// roles: ['*'],
// // is_full: true,
// isNewTab: true,
// },
// },
// ],
}
export default REMOTE

View File

@@ -6,7 +6,6 @@
<template #title> <template #title>
<div class="card-head-title"> <div class="card-head-title">
<div class="page-title">许可证信息</div> <div class="page-title">许可证信息</div>
<div class="page-subtitle">{{ license?.company_name || '—' }}</div>
</div> </div>
</template> </template>
<template #extra> <template #extra>