From 149831ebc9049d2fcf17da511715b0f20c99d3ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E5=BF=97=E5=86=9B?= <543024265@qq.com> Date: Fri, 25 Jul 2025 10:51:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(router):=20=E4=BC=98=E5=8C=96=20Agent?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E5=8A=A0=E8=BD=BD=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除静态路由中的占位组件- 删除动态路由加载逻辑 - 在路由守卫中实现 Agent路由的动态加载 - 更新路由元信息和结构 --- src/main.ts | 3 - src/router/guard/index.ts | 70 +++++++++++++++++++++++ src/router/routes/modules/agent.ts | 31 ++-------- src/router/routes/modules/agentDynamic.ts | 46 --------------- 4 files changed, 76 insertions(+), 74 deletions(-) delete mode 100644 src/router/routes/modules/agentDynamic.ts diff --git a/src/main.ts b/src/main.ts index 5d9fccb..e6d2445 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,7 +14,6 @@ import './core'; import 'uno.css'; import './mock'; // import '@/styles/vars.css'; // 优先加载 -import { loadDynamicMenus } from './router/routes/modules/agentDynamic'; const app = createApp(App); app.use(store); @@ -22,8 +21,6 @@ app.use(router); app.component('NoData', NoData); router.isReady().then(async () => { - await loadDynamicMenus(router); // 传入 router 实例 - console.log(router,'router') app.mount('#app'); }); diff --git a/src/router/guard/index.ts b/src/router/guard/index.ts index 5bfcf4e..066be3b 100644 --- a/src/router/guard/index.ts +++ b/src/router/guard/index.ts @@ -8,6 +8,7 @@ import type { Router } from 'vue-router'; import { setRouteEmitter } from '@/utils/route-listener'; import setupUserLoginInfoGuard from './userLoginInfo'; +import { MENU_GROUP_IDS } from '@/router/constants'; // import setupPermissionGuard from './permission'; function setupPageGuard(router: Router) { @@ -17,7 +18,76 @@ function setupPageGuard(router: Router) { }); } +// 动态加载 agent 路由 +let isAgentRouteLoaded = false; // 标志位 + +async function loadAgentRoute(router: Router) { + if (isAgentRouteLoaded) return; // 防止重复加载 + try { + const agentRouter = { + path: '/agent', + name: 'Agent', + redirect: 'agent/index', // 默认重定向到第一个子路由 + meta: { + locale: '扣子智能体', + requiresAuth: true, + requireLogin: true, + id: MENU_GROUP_IDS.AGENT, + roles: ['*'], + }, + children: [ + { + path: 'index', + name: 'AgentIndex', + component: () => import('@/views/agent/index'), + meta: { + title: '首页', // 菜单标题 + icon: 'home', // 菜单图标(可选) + requiresAuth: false, + requireLogin: true, + id: MENU_GROUP_IDS.AGENT, + }, + }, + { + path: 'settings', + name: 'AgentSettings', + component: () => import('@/views/agent/index'), + meta: { + title: '设置', // 菜单标题 + icon: 'settings', // 菜单图标(可选) + requiresAuth: true, + requireLogin: true, + id: MENU_GROUP_IDS.AGENT, + + }, + }, + { + path: 'dashboard', + name: 'AgentDashboard', + component: () => import('@/views/agent/index'), + meta: { + title: '仪表盘', // 菜单标题 + icon: 'dashboard', // 菜单图标(可选) + requiresAuth: true, + requireLogin: true, + }, + }, + ], + }; + router.addRoute(agentRouter); // 使用传递进来的 router 实例 + isAgentRouteLoaded = true; // 标记路由已加载 + } catch (error) { + console.error('Error loading agent route:', error); + } +} + + export default function createRouteGuard(router: Router) { + loadAgentRoute(router).then(() => { + // 路由加载完成后通知菜单更新 + setRouteEmitter(router.currentRoute.value); + }); + setupPageGuard(router); setupUserLoginInfoGuard(router); // setupPermissionGuard(router); diff --git a/src/router/routes/modules/agent.ts b/src/router/routes/modules/agent.ts index b7619da..b964b38 100644 --- a/src/router/routes/modules/agent.ts +++ b/src/router/routes/modules/agent.ts @@ -4,31 +4,12 @@ import { MENU_GROUP_IDS } from '@/router/constants'; import IconRepository from '@/assets/svg/icon-repository.svg'; const COMPONENTS: AppRouteRecordRaw[] = [ - // { - // path: '/agent', - // name: 'Agent', - // redirect: 'agent/index', - // meta: { - // locale: '扣子智能体', - // icon: IconRepository, - // requiresAuth: true, - // requireLogin: true, - // roles: ['*'], - // id: MENU_GROUP_IDS.AGENT, - // }, - // children: [ - // { - // path: 'index', - // name: 'AgentIndex', - // component: () => import('@/views/agent/index'), - // meta: { - // requiresAuth: false, - // requireLogin: true, - // }, - // } - // - // ], - // }, + { + path: '/agent', + name: 'AgentPlaceholder', + component: () => Promise.resolve({ template: '' }), // 占位组件 + + }, ]; export default COMPONENTS; diff --git a/src/router/routes/modules/agentDynamic.ts b/src/router/routes/modules/agentDynamic.ts deleted file mode 100644 index 720a7df..0000000 --- a/src/router/routes/modules/agentDynamic.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { getCategoriesMenus } from '@/api/all/agent'; -import type { AppRouteRecordRaw } from '../types'; -import { MENU_GROUP_IDS } from '@/router/constants'; -import IconRepository from '@/assets/svg/icon-repository.svg'; -import { IconBookmark } from '@arco-design/web-vue/es/icon'; - -export const loadDynamicMenus = async (routerInstance) => { - try { - const { code, data } = await getCategoriesMenus(); - - let router = [ - { - path: '/repository233', - name: 'Repository', - redirect: 'repository/brandMaterials', - meta: { - locale: '品牌资产管理', - icon: IconRepository, - requiresAuth: true, - requireLogin: true, - roles: ['*'], - id: MENU_GROUP_IDS.PROPERTY_ID, - }, - children: [ - { - path: 'brandMaterials', - name: 'RepositoryBrandMaterials', - meta: { - locale: '品牌信息', - requiresAuth: true, - requireLogin: true, - roles: ['*'], - }, - component: () => import('@/views/property-marketing/brands/brand-materials/index.vue'), - }, - ], - }, - ]; - // 添加子路由到名为 Agent 的父路由下 - router.forEach(route => { - routerInstance.addRoute('Agent', route); - }); - } catch (error) { - console.error('Failed to load dynamic menus:', error); - } -};