From dc329a652cb095565ebb0f2698582be764e2f25a Mon Sep 17 00:00:00 2001
From: buaixuexideshitongxue <2936013465@qq.com>
Date: Tue, 3 Feb 2026 20:03:49 +0800
Subject: [PATCH] =?UTF-8?q?=E7=9B=AE=E5=BD=95=E8=B0=83=E6=95=B4--=E6=94=AF?=
=?UTF-8?q?=E6=8C=81=E6=B7=BB=E5=8A=A0=E5=A4=96=E9=93=BE=E8=8F=9C=E5=8D=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/layout/components/Aside.vue | 4 +++-
src/router/index.ts | 42 ++++++++++++++++++++++-----------
src/views/ExternalLink.vue | 21 +++++++++++++++++
3 files changed, 52 insertions(+), 15 deletions(-)
create mode 100644 src/views/ExternalLink.vue
diff --git a/src/layout/components/Aside.vue b/src/layout/components/Aside.vue
index 76702f7..9f1d752 100644
--- a/src/layout/components/Aside.vue
+++ b/src/layout/components/Aside.vue
@@ -96,7 +96,9 @@ function handleSecondMenuClick(route) {
activeSecondMenuName.value = route.name;
if(route.meta.openOutside){
console.log('route-------',route)
- window.open(route.path);
+ // window.open(route.path);
+ const url = route.meta.url || route.path
+ window.open(url, "_blank")
return;
}
if (route.meta.openNewPage) {
diff --git a/src/router/index.ts b/src/router/index.ts
index d565c51..225e6dd 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -11,11 +11,26 @@ export function getModulesKey() {
return Object.keys(modules).map((item) => item.replace('/src/views/', '').replace('.vue', ''))
}
+function normalizeUrl(url: string) {
+ if (/^https?:\/\//i.test(url)) return url
+ return "https://" + url
+}
+
+function genExternalPath(menu: any) {
+ return `/external/${menu.id}`
+}
+
+
export function createRouteRecord(menus) {
return menus.map(menu => {
+ const isExternal = !!menu.openOutside
+ console.log("============menu==============")
+ console.log(menu)
const routeRecord: RouteRecordRaw = {
- path: menu.paths,
- name: Symbol(menu.paths),
+ // ✅ 外链用站内 path,占位
+ path: isExternal ? genExternalPath(menu) : menu.paths,
+ // ✅ name 用字符串,别用 Symbol
+ name: isExternal ? `external-${menu.id ?? menu.menuName}` : (menu.name ?? menu.paths),
meta: {
hidden: !menu.isShow,
keepAlive: !!menu.isCache,
@@ -23,19 +38,18 @@ export function createRouteRecord(menus) {
perms: menu.perms,
icon: menu.icon,
type: menu.menuType,
- openOutside:menu.openOutside,
- openNewPage: menu.openNewPage
- }
+ openOutside: menu.openOutside,
+ openNewPage: menu.openNewPage,
+ // ✅ 把真正外链放到 meta.url
+ url: isExternal ? normalizeUrl(menu.paths) : undefined,
+ },
+ // ✅ 外链用一个固定组件
+ component: isExternal
+ ? () => import("@/views/ExternalLink.vue")
+ : (menu.menuType === MenuEnum.CATALOGUE ? LAYOUT : loadRouteView(menu.component)),
}
- switch (menu.menuType) {
- case MenuEnum.CATALOGUE:
- routeRecord.component = LAYOUT
- break
- case MenuEnum.MENU:
- routeRecord.component = loadRouteView(menu.component)
- break
- }
- if (menu.children.length) {
+
+ if (menu.children?.length) {
routeRecord.children = createRouteRecord(menu.children)
}
return routeRecord
diff --git a/src/views/ExternalLink.vue b/src/views/ExternalLink.vue
new file mode 100644
index 0000000..df35aca
--- /dev/null
+++ b/src/views/ExternalLink.vue
@@ -0,0 +1,21 @@
+
+
+
+ 正在打开外部页面...
+