Skip to content

Commit df31070

Browse files
committed
refactor:优化后台菜单唯一标识的生成规则
1 parent 7e671df commit df31070

File tree

6 files changed

+43
-26
lines changed

6 files changed

+43
-26
lines changed

web/src/layouts/backend/components/menus/menuHorizontal.vue

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@
1414

1515
<script setup lang="ts">
1616
import { nextTick, onMounted, reactive } from 'vue'
17+
import { onBeforeRouteUpdate, useRoute, type RouteLocationNormalizedLoaded } from 'vue-router'
1718
import Logo from '/@/layouts/backend/components/logo.vue'
1819
import MenuTree from '/@/layouts/backend/components/menus/menuTree.vue'
19-
import { useRoute, onBeforeRouteUpdate, type RouteLocationNormalizedLoaded } from 'vue-router'
20+
import NavMenus from '/@/layouts/backend/components/navMenus.vue'
2021
import { useConfig } from '/@/stores/config'
2122
import { useNavTabs } from '/@/stores/navTabs'
22-
import NavMenus from '/@/layouts/backend/components/navMenus.vue'
2323
import { layoutMenuRef, layoutMenuScrollbarRef } from '/@/stores/refs'
2424
import horizontalScroll from '/@/utils/horizontalScroll'
25+
import { getMenuKey } from '/@/utils/router'
2526
2627
const config = useConfig()
2728
const navTabs = useNavTabs()
@@ -35,10 +36,10 @@ const state = reactive({
3536
* 激活当前路由对应的菜单
3637
*/
3738
const currentRouteActive = (currentRoute: RouteLocationNormalizedLoaded) => {
39+
// 以路由 fullPath 匹配的菜单优先,且 fullPath 无匹配时,回退到 path 的匹配菜单
3840
const tabView = navTabs.getTabsViewDataByRoute(currentRoute)
3941
if (tabView) {
40-
// 以路由 fullPath 匹配的菜单优先,且 fullPath 无匹配时,回退到 path 的匹配菜单
41-
state.defaultActive = tabView.meta!.matched as string
42+
state.defaultActive = getMenuKey(tabView, tabView.meta!.matched as string)
4243
}
4344
}
4445

web/src/layouts/backend/components/menus/menuTree.vue

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
22
<template v-for="menu in props.menus">
33
<template v-if="menu.children && menu.children.length > 0">
4-
<el-sub-menu @click="onClickSubMenu(menu)" :index="menu.path" :key="menu.path">
4+
<el-sub-menu @click="onClickSubMenu(menu)" :index="getMenuKey(menu)" :key="getMenuKey(menu)">
55
<template #title>
66
<Icon :color="config.getColorVal('menuColor')" :name="menu.meta?.icon ? menu.meta?.icon : config.layout.menuDefaultIcon" />
77
<span>{{ menu.meta?.title ? menu.meta?.title : $t('noTitle') }}</span>
@@ -10,19 +10,20 @@
1010
</el-sub-menu>
1111
</template>
1212
<template v-else>
13-
<el-menu-item :index="menu.path" :key="menu.path" @click="onClickMenu(menu)">
13+
<el-menu-item @click="onClickMenu(menu)" :index="getMenuKey(menu)" :key="getMenuKey(menu)">
1414
<Icon :color="config.getColorVal('menuColor')" :name="menu.meta?.icon ? menu.meta?.icon : config.layout.menuDefaultIcon" />
1515
<span>{{ menu.meta?.title ? menu.meta?.title : $t('noTitle') }}</span>
1616
</el-menu-item>
1717
</template>
1818
</template>
1919
</template>
20+
2021
<script setup lang="ts">
21-
import { useConfig } from '/@/stores/config'
22-
import type { RouteRecordRaw } from 'vue-router'
23-
import { getFirstRoute, onClickMenu } from '/@/utils/router'
2422
import { ElNotification } from 'element-plus'
2523
import { useI18n } from 'vue-i18n'
24+
import type { RouteRecordRaw } from 'vue-router'
25+
import { useConfig } from '/@/stores/config'
26+
import { getFirstRoute, getMenuKey, onClickMenu } from '/@/utils/router'
2627
2728
const { t } = useI18n()
2829
const config = useConfig()

web/src/layouts/backend/components/menus/menuVertical.vue

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@
1515

1616
<script setup lang="ts">
1717
import { computed, nextTick, onMounted, reactive } from 'vue'
18+
import { onBeforeRouteUpdate, useRoute, type RouteLocationNormalizedLoaded } from 'vue-router'
1819
import MenuTree from '/@/layouts/backend/components/menus/menuTree.vue'
19-
import { useRoute, onBeforeRouteUpdate, type RouteLocationNormalizedLoaded } from 'vue-router'
20-
import { layoutMenuRef, layoutMenuScrollbarRef } from '/@/stores/refs'
2120
import { useConfig } from '/@/stores/config'
2221
import { useNavTabs } from '/@/stores/navTabs'
22+
import { layoutMenuRef, layoutMenuScrollbarRef } from '/@/stores/refs'
23+
import { getMenuKey } from '/@/utils/router'
2324
2425
const config = useConfig()
2526
const navTabs = useNavTabs()
@@ -45,10 +46,10 @@ const verticalMenusScrollbarHeight = computed(() => {
4546
* 激活当前路由对应的菜单
4647
*/
4748
const currentRouteActive = (currentRoute: RouteLocationNormalizedLoaded) => {
49+
// 以路由 fullPath 匹配的菜单优先,且 fullPath 无匹配时,回退到 path 的匹配菜单
4850
const tabView = navTabs.getTabsViewDataByRoute(currentRoute)
4951
if (tabView) {
50-
// 以路由 fullPath 匹配的菜单优先,且 fullPath 无匹配时,回退到 path 的匹配菜单
51-
state.defaultActive = tabView.meta!.matched as string
52+
state.defaultActive = getMenuKey(tabView, tabView.meta!.matched as string)
5253
}
5354
}
5455

web/src/layouts/backend/components/menus/menuVerticalChildren.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { useConfig } from '/@/stores/config'
2222
import { useNavTabs } from '/@/stores/navTabs'
2323
import { layoutMenuRef, layoutMenuScrollbarRef } from '/@/stores/refs'
2424
import horizontalScroll from '/@/utils/horizontalScroll'
25+
import { getMenuKey } from '/@/utils/router'
2526
2627
const config = useConfig()
2728
const navTabs = useNavTabs()
@@ -51,10 +52,10 @@ const verticalMenusScrollbarHeight = computed(() => {
5152
* 激活当前路由的菜单
5253
*/
5354
const currentRouteActive = (currentRoute: RouteLocationNormalizedLoaded) => {
55+
// 以路由 fullPath 匹配的菜单优先,且 fullPath 无匹配时,回退到 path 的匹配菜单
5456
const tabView = navTabs.getTabsViewDataByRoute(currentRoute)
5557
if (tabView) {
56-
// 以路由 fullPath 匹配的菜单优先,且 fullPath 无匹配时,回退到 path 的匹配菜单
57-
state.defaultActive = tabView.meta!.matched as string
58+
state.defaultActive = getMenuKey(tabView, tabView.meta!.matched as string)
5859
}
5960
6061
let routeChildren = navTabs.getTabsViewDataByRoute(currentRoute, 'above')

web/src/layouts/backend/components/navBar/double.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import NavMenus from '/@/layouts/backend/components/navMenus.vue'
1717
import { useConfig } from '/@/stores/config'
1818
import { useNavTabs } from '/@/stores/navTabs'
1919
import { layoutMenuRef, layoutMenuScrollbarRef } from '/@/stores/refs'
20+
import { getMenuKey } from '/@/utils/router'
2021
2122
const config = useConfig()
2223
const navTabs = useNavTabs()
@@ -30,10 +31,10 @@ const state = reactive({
3031
* 激活当前路由的菜单
3132
*/
3233
const currentRouteActive = (currentRoute: RouteLocationNormalizedLoaded) => {
34+
// 以路由 fullPath 匹配的菜单优先,且 fullPath 无匹配时,回退到 path 的匹配菜单
3335
const tabView = navTabs.getTabsViewDataByRoute(currentRoute)
3436
if (tabView) {
35-
// 以路由 fullPath 匹配的菜单优先,且 fullPath 无匹配时,回退到 path 的匹配菜单
36-
state.defaultActive = tabView.meta!.matched as string
37+
state.defaultActive = getMenuKey(tabView, tabView.meta!.matched as string)
3738
}
3839
}
3940

web/src/utils/router.ts

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
import router from '/@/router/index'
2-
import { isNavigationFailure, NavigationFailureType } from 'vue-router'
3-
import type { RouteRecordRaw, RouteLocationRaw } from 'vue-router'
41
import { ElNotification } from 'element-plus'
2+
import { compact, isEmpty, reverse } from 'lodash-es'
3+
import type { RouteLocationRaw, RouteRecordRaw } from 'vue-router'
4+
import { isNavigationFailure, NavigationFailureType } from 'vue-router'
5+
import { i18n } from '/@/lang/index'
6+
import router from '/@/router/index'
7+
import adminBaseRoute from '/@/router/static/adminBase'
8+
import memberCenterBaseRoute from '/@/router/static/memberCenterBase'
59
import { useConfig } from '/@/stores/config'
10+
import { useMemberCenter } from '/@/stores/memberCenter'
611
import { useNavTabs } from '/@/stores/navTabs'
712
import { useSiteConfig } from '/@/stores/siteConfig'
8-
import { useMemberCenter } from '/@/stores/memberCenter'
9-
import { closeShade } from '/@/utils/pageShade'
10-
import adminBaseRoute from '/@/router/static/adminBase'
11-
import memberCenterBaseRoute from '/@/router/static/memberCenterBase'
12-
import { i18n } from '/@/lang/index'
1313
import { isAdminApp } from '/@/utils/common'
14-
import { compact, isEmpty, reverse } from 'lodash-es'
14+
import { closeShade } from '/@/utils/pageShade'
1515

1616
/**
1717
* 导航失败有错误消息的路由push
@@ -146,6 +146,18 @@ export const getMenuPaths = (menus: RouteRecordRaw[]): string[] => {
146146
return menuPaths
147147
}
148148

149+
/**
150+
* 获取菜单唯一标识
151+
* @param menu 菜单数据
152+
* @param prefix 前缀
153+
*/
154+
export const getMenuKey = (menu: RouteRecordRaw, prefix = '') => {
155+
if (prefix === '') {
156+
prefix = menu.path
157+
}
158+
return `${prefix}-${menu.name as string}-${menu.meta && menu.meta.id ? menu.meta.id : ''}`
159+
}
160+
149161
/**
150162
* 会员中心和后台的菜单处理
151163
*/

0 commit comments

Comments
 (0)