From 1d7d9fb9454080fa333109ba6f7603db136c7ada Mon Sep 17 00:00:00 2001 From: ila Date: Mon, 24 Aug 2026 10:33:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=AB=AF=E5=8A=A8=E6=80=81=E8=8F=9C=E5=8D=95=E8=A7=86=E5=9B=BE?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=20(#40)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin-ui/src/store/modules/permission.js | 6 ++++-- admin-ui/src/store/modules/route-view.js | 7 +++++++ admin-ui/tests/unit/store/route-view.spec.js | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 admin-ui/src/store/modules/route-view.js create mode 100644 admin-ui/tests/unit/store/route-view.spec.js diff --git a/admin-ui/src/store/modules/permission.js b/admin-ui/src/store/modules/permission.js index ad286fd..39e14ac 100644 --- a/admin-ui/src/store/modules/permission.js +++ b/admin-ui/src/store/modules/permission.js @@ -1,6 +1,7 @@ import { constantRoutes } from '@/router' import { getRoutes } from '@/api/admin/sys-role' import Layout from '@/layout' +import { getViewContextKey, normalizeViewPath } from './route-view' // import sysuserindex from '@/views/sysuser/index' /** @@ -61,7 +62,8 @@ export function generaMenu(routes, data) { const viewsContext = require.context('@/views', true, /\.vue$/) export const loadView = (view) => { // 路由懒加载 - const key = `.${view}.vue` + const normalizedView = normalizeViewPath(view) + const key = getViewContextKey(normalizedView) if (viewsContext.keys().includes(key)) { // require.context 返回的是 { default: Component, __esModule: true }, // Vue Router 4 需要直接拿到组件对象(.default),否则渲染空白 @@ -69,7 +71,7 @@ export const loadView = (view) => { // 路由懒加载 return mod.default || mod } // 兜底:动态 import(生产构建不受 dynamic-import-node 影响) - return () => import(`@/views${view}.vue`) + return () => import(`@/views/${normalizedView}.vue`) } /** diff --git a/admin-ui/src/store/modules/route-view.js b/admin-ui/src/store/modules/route-view.js new file mode 100644 index 0000000..c928dd3 --- /dev/null +++ b/admin-ui/src/store/modules/route-view.js @@ -0,0 +1,7 @@ +export function normalizeViewPath(view) { + return String(view || '').replace(/^\/+/, '') +} + +export function getViewContextKey(view) { + return `./${normalizeViewPath(view)}.vue` +} diff --git a/admin-ui/tests/unit/store/route-view.spec.js b/admin-ui/tests/unit/store/route-view.spec.js new file mode 100644 index 0000000..db58029 --- /dev/null +++ b/admin-ui/tests/unit/store/route-view.spec.js @@ -0,0 +1,18 @@ +import { getViewContextKey, normalizeViewPath } from '@/store/modules/route-view' + +describe('dynamic route view paths', () => { + it.each([ + ['chorus/providers/index', 'chorus/providers/index'], + ['/chorus/providers/index', 'chorus/providers/index'], + ['///chorus/providers/index', 'chorus/providers/index'] + ])('normalizes %s', (view, expected) => { + expect(normalizeViewPath(view)).toBe(expected) + }) + + it.each([ + ['chorus/providers/index', './chorus/providers/index.vue'], + ['/chorus/providers/index', './chorus/providers/index.vue'] + ])('builds the webpack context key for %s', (view, expected) => { + expect(getViewContextKey(view)).toBe(expected) + }) +})