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']" >新增 + 复制新增