From e994afb97f97a0c1e61eede4ed2ac707070e44cf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= <2178503051@qq.com>
Date: Thu, 25 Jun 2026 10:52:46 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E9=A1=B6=E9=83=A8?=
=?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=88=87=E6=8D=A2=E3=80=81=E8=8F=9C=E5=8D=95?=
=?UTF-8?q?=E5=A4=8D=E5=88=B6=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD=E5=B9=B6?=
=?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BE=A7=E8=BE=B9=E6=A0=8F=E6=B8=B2=E6=9F=93?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. 新增顶部菜单选择器,支持切换顶级菜单并动态渲染对应侧边栏
2. 菜单管理页面添加复制新增按钮,可基于现有菜单快速创建新菜单
3. 重构侧边栏路由逻辑,支持自动匹配当前页面所属顶级菜单
4. 在vuex中新增顶部菜单状态管理,持久化激活的顶级菜单
---
.../layout/components/Sidebar/SidebarItem.vue | 18 +-
.../src/layout/components/Sidebar/index.vue | 344 ++++++++++++++++--
klp-ui/src/layout/components/SubNav.vue | 19 +-
klp-ui/src/store/getters.js | 2 +
klp-ui/src/store/modules/permission.js | 22 +-
klp-ui/src/views/system/menu/index.vue | 18 +
6 files changed, 384 insertions(+), 39 deletions(-)
diff --git a/klp-ui/src/layout/components/Sidebar/SidebarItem.vue b/klp-ui/src/layout/components/Sidebar/SidebarItem.vue
index 10813cd04..6c5d4021e 100644
--- a/klp-ui/src/layout/components/Sidebar/SidebarItem.vue
+++ b/klp-ui/src/layout/components/Sidebar/SidebarItem.vue
@@ -88,17 +88,19 @@ export default {
return this.basePath
},
subMenuRoute() {
- const title = (this.item.meta && this.item.meta.title) || this.item.name || ''
- return {
- path: '/redirect/subMenu',
- query: {
- parent: this.basePath,
- title: title
- }
- }
+ return this.findFirstLeaf(this.item, this.basePath)
}
},
methods: {
+ findFirstLeaf(item, basePath) {
+ const visibleChildren = (item.children || []).filter(c => !c.hidden)
+ if (visibleChildren.length === 0) {
+ return basePath
+ }
+ const firstChild = visibleChildren[0]
+ const childPath = path.resolve(basePath, firstChild.path)
+ return this.findFirstLeaf(firstChild, childPath)
+ },
hasOneShowingChild(children = [], parent) {
if (!children) {
children = [];
diff --git a/klp-ui/src/layout/components/Sidebar/index.vue b/klp-ui/src/layout/components/Sidebar/index.vue
index 39c3db0bf..028256a5b 100644
--- a/klp-ui/src/layout/components/Sidebar/index.vue
+++ b/klp-ui/src/layout/components/Sidebar/index.vue
@@ -1,40 +1,123 @@
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/klp-ui/src/layout/components/SubNav.vue b/klp-ui/src/layout/components/SubNav.vue
index 424d4eef3..b18e123fa 100644
--- a/klp-ui/src/layout/components/SubNav.vue
+++ b/klp-ui/src/layout/components/SubNav.vue
@@ -61,8 +61,16 @@ export default {
computed: {
subNavItems() {
const sidebarRouters = this.$store.state.permission.sidebarRouters
- const items = this.getThirdLevelMenus(sidebarRouters)
- return items
+ const activeTop = this.$store.state.permission.activeTopMenu
+ const topMenus = this.$store.state.permission.topMenuList
+ const menu = topMenus.find(m => m.path === activeTop)
+ const basePath = menu ? menu.path : ''
+
+ let currentPath = this.$route.path
+ if (currentPath === '/redirect/subMenu' && this.$route.query.parent) {
+ currentPath = this.$route.query.parent
+ }
+ return this.findActiveLevel2(sidebarRouters, currentPath, 0, basePath) || []
},
hasItems() {
return this.subNavItems.length > 0
@@ -108,13 +116,6 @@ export default {
isChildActive(child) {
return this.$route.path === child._ownPath || this.$route.path.startsWith(child._ownPath + '/')
},
- getThirdLevelMenus(routes) {
- let currentPath = this.$route.path
- if (currentPath === '/redirect/subMenu' && this.$route.query.parent) {
- currentPath = this.$route.query.parent
- }
- return this.findActiveLevel2(routes, currentPath, 0, '') || []
- },
findActiveLevel2(routes, currentPath, depth, basePath) {
for (const route of routes) {
if (route.hidden) continue
diff --git a/klp-ui/src/store/getters.js b/klp-ui/src/store/getters.js
index 1fbd69ec1..3437c1648 100644
--- a/klp-ui/src/store/getters.js
+++ b/klp-ui/src/store/getters.js
@@ -18,6 +18,8 @@ const getters = {
topbarRouters:state => state.permission.topbarRouters,
defaultRoutes:state => state.permission.defaultRoutes,
sidebarRouters:state => state.permission.sidebarRouters,
+ topMenuList: state => state.permission.topMenuList,
+ activeTopMenu: state => state.permission.activeTopMenu,
productList: state => state.category.productList,
rawMaterialList: state => state.category.rawMaterialList,
bomMap: state => state.category.bomMap,
diff --git a/klp-ui/src/store/modules/permission.js b/klp-ui/src/store/modules/permission.js
index 228766550..5d11f93ae 100644
--- a/klp-ui/src/store/modules/permission.js
+++ b/klp-ui/src/store/modules/permission.js
@@ -4,6 +4,7 @@ import { getRouters } from '@/api/menu'
import Layout from '@/layout/index'
import ParentView from '@/components/ParentView'
import InnerLink from '@/layout/components/InnerLink'
+import Cookies from 'js-cookie'
const permission = {
state: {
@@ -11,7 +12,9 @@ const permission = {
addRoutes: [],
defaultRoutes: [],
topbarRouters: [],
- sidebarRouters: []
+ sidebarRouters: [],
+ topMenuList: [],
+ activeTopMenu: Cookies.get('activeTopMenu') || ''
},
mutations: {
SET_ROUTES: (state, routes) => {
@@ -27,6 +30,13 @@ const permission = {
SET_SIDEBAR_ROUTERS: (state, routes) => {
state.sidebarRouters = routes
},
+ SET_TOP_MENU_LIST: (state, menus) => {
+ state.topMenuList = menus
+ },
+ SET_ACTIVE_TOP_MENU: (state, path) => {
+ state.activeTopMenu = path
+ Cookies.set('activeTopMenu', path)
+ },
},
actions: {
// 生成路由
@@ -45,9 +55,19 @@ const permission = {
commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes))
commit('SET_DEFAULT_ROUTES', sidebarRoutes)
commit('SET_TOPBAR_ROUTES', sidebarRoutes)
+ commit('SET_TOP_MENU_LIST', sidebarRoutes)
resolve(rewriteRoutes)
})
})
+ },
+
+ selectTopMenu({ commit, state }, menuPath) {
+ const menu = state.topMenuList.find(m => m.path === menuPath)
+ if (menu) {
+ commit('SET_ACTIVE_TOP_MENU', menuPath)
+ const children = menu.children ? menu.children.filter(c => !c.hidden) : []
+ commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(children))
+ }
}
}
}
diff --git a/klp-ui/src/views/system/menu/index.vue b/klp-ui/src/views/system/menu/index.vue
index 483cc77dd..6c2fe9395 100644
--- a/klp-ui/src/views/system/menu/index.vue
+++ b/klp-ui/src/views/system/menu/index.vue
@@ -100,6 +100,13 @@
@click="handleAdd(scope.row)"
v-hasPermi="['system:menu:add']"
>新增
+ 复制新增