From cac05b4297fd1d17b7ddceebf22c6fc54806b673 Mon Sep 17 00:00:00 2001 From: "DESKTOP-72TV0V4\\caoxiaozhu" Date: Tue, 10 Mar 2026 15:42:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=92=8C=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重构 Agents 页面 - 优化 Knowledge 页面 - 更新侧边栏导航 - 添加前端依赖 Co-Authored-By: Claude Opus 4.6 --- web/package-lock.json | 29 + web/package.json | 1 + web/src/components/Sidebar.vue | 90 +-- web/src/views/Agents.vue | 940 +++++++++--------------- web/src/views/Knowledge.vue | 89 ++- web/src/views/knowledge/useKnowledge.ts | 6 +- 6 files changed, 513 insertions(+), 642 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index 2ca1723..97a3311 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -20,6 +20,7 @@ "vue-router": "^4.3.0" }, "devDependencies": { + "@types/papaparse": "^5.5.2", "@vitejs/plugin-vue": "^5.0.4", "autoprefixer": "^10.4.19", "postcss": "^8.4.38", @@ -982,6 +983,27 @@ "@types/lodash": "*" } }, + "node_modules/@types/node": { + "version": "25.3.5", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.3.5.tgz", + "integrity": "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/papaparse": { + "version": "5.5.2", + "resolved": "https://registry.npmmirror.com/@types/papaparse/-/papaparse-5.5.2.tgz", + "integrity": "sha512-gFnFp/JMzLHCwRf7tQHrNnfhN4eYBVYYI897CGX4MY1tzY9l2aLkVyx2IlKZ/SAqDbB3I1AOZW5gTMGGsqWliA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/web-bluetooth": { "version": "0.0.20", "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", @@ -2624,6 +2646,13 @@ "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", diff --git a/web/package.json b/web/package.json index 5ead366..ec2eb84 100644 --- a/web/package.json +++ b/web/package.json @@ -21,6 +21,7 @@ "vue-router": "^4.3.0" }, "devDependencies": { + "@types/papaparse": "^5.5.2", "@vitejs/plugin-vue": "^5.0.4", "autoprefixer": "^10.4.19", "postcss": "^8.4.38", diff --git a/web/src/components/Sidebar.vue b/web/src/components/Sidebar.vue index d926317..d7166eb 100644 --- a/web/src/components/Sidebar.vue +++ b/web/src/components/Sidebar.vue @@ -39,42 +39,45 @@ interface MenuItem { path?: string } -const mainMenu = computed(() => [ - { name: 'Dashboard', icon: 'fa-gauge', path: '/dashboard' }, - { name: 'Agents', icon: 'fa-robot', badge: 3, path: '/agents' }, - { name: 'Script', icon: 'fa-code', path: '/script' }, +// 第1组: Chat, Agents +const group1 = computed(() => [ + { name: 'Chat', icon: 'fa-robot', path: '/agents' }, + { name: 'Agents', icon: 'fa-users', badge: 3, path: '/agents' }, +]) + +// 第2组: Database, Knowledge +const group2 = computed(() => [ { name: 'Database', icon: 'fa-database', path: '/database', badge: databaseCount.value }, { name: 'Knowledge', icon: 'fa-brain', path: '/knowledge', badge: knowledgeCount.value }, ]) -const middleMenu: MenuItem[] = [ +// 第3组: Skills, Tools, Script +const group3 = computed(() => [ { name: 'Skills', icon: 'fa-wand-magic-sparkles', badge: 21, path: '/mcp' }, { name: 'Tools', icon: 'fa-tools', badge: 13, path: '/model-apis' }, -] + { name: 'Script', icon: 'fa-code', path: '/script' }, +]) -const bottomMenu: MenuItem[] = [ - { name: 'Settings', icon: 'fa-gear', path: '/settings' }, -] - -const bottomMenu2: MenuItem[] = [ +// 第4组: Dashboard, Account, Settings +const group4 = computed(() => [ + { name: 'Dashboard', icon: 'fa-gauge', path: '/dashboard' }, { name: 'Account', icon: 'fa-user', path: '/account' }, -] + { name: 'Settings', icon: 'fa-gear', path: '/settings' }, +]) const activeMenu = computed(() => { const currentPath = route.path - // Check main menu - const menuItem = mainMenu.value.find(item => item.path === currentPath) - if (menuItem) return menuItem.name - // Check middle menu (Skills, Tools) - const middleItem = middleMenu.find(item => item.path === currentPath) - if (middleItem) return middleItem.name - // Check bottom menu (Settings) - const bottomItem = bottomMenu.find(item => item.path === currentPath) - if (bottomItem) return bottomItem.name - // Check bottomMenu2 (Account) - const bottomItem2 = bottomMenu2.find(item => item.path === currentPath) - if (bottomItem2) return bottomItem2.name - return 'Dashboard' + + // Special case for /agents - prioritize Chat over Agents + if (currentPath === '/agents') { + return 'Chat' + } + + // Check all groups + const allGroups = [...group1.value, ...group2.value, ...group3.value, ...group4.value] + const item = allGroups.find(item => item.path === currentPath) + if (item) return item.name + return 'Chat' }) const navigateTo = (item: MenuItem) => { @@ -129,8 +132,8 @@ const handleUserCommand = (command: string) => { diff --git a/web/src/views/Agents.vue b/web/src/views/Agents.vue index d1fefca..a15024b 100644 --- a/web/src/views/Agents.vue +++ b/web/src/views/Agents.vue @@ -1,645 +1,429 @@ diff --git a/web/src/views/Knowledge.vue b/web/src/views/Knowledge.vue index 9367848..d8aebd2 100644 --- a/web/src/views/Knowledge.vue +++ b/web/src/views/Knowledge.vue @@ -1,6 +1,6 @@