Skip to content

Commit d269294

Browse files
feat: detail router
1 parent 5c488cb commit d269294

20 files changed

Lines changed: 550 additions & 75 deletions

File tree

‎ui/src/api/API_README.md‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,18 @@ FormData;保存返回完整配置,页面以该返回值作为唯一数据来
104104
根据资源范围或业务上下文选择出的 API 对象统一命名为 `requestApi`,包括 `computed` 结果和
105105
局部变量,不使用 `toolApi`、`authorizationApi` 或 `request` 等名称。同一作用域确需同时使用
106106
多套 API 时,以 `request` 为前缀加业务名区分,例如 `requestModelApi`、`requestToolApi`。
107+
知识库详情上下文的多模块接口入口使用 `resourceApi.knowledge / sync`,通过响应式 getter
108+
读取当前范围,无需 `.value`;方法内选定单个接口对象时仍命名为 `requestApi`。
107109
直接导入的 API 保持 PascalCase 命名;请求返回的 Promise 不属于此命名规则。
108110

109111
`application`、`knowledge`、`model`、`tool` 是需要同时考虑 Workspace 普通资源、Workspace 共享资源、System 资源管理和
110112
System 共享资源的四类特殊资源。其接口按真实后端边界分别维护在 `admin/workspace/` 与
111113
`admin/system/` 下,不把不同范围的 URL 合并为页面侧 API Map,也不让卡片或 Action 根据路由拼接
112114
System 接口地址。
113115

114-
页面根据路由 `resourceScope` 选择当前范围的完整业务 API 对象,并将其传给需要请求的 Card
116+
页面根据路由 `resourceScope` 选择当前范围的完整业务 API 对象;知识库详情由功能本地
117+
`views/knowledge-detail/context.ts` 集中装配,当前由详情入口与 setting 子页复用该选择,library 暂不迁移。缺失设置 API 模块保持未提供,
118+
不回退其他资源范围。页面将选定对象传给需要请求的 Card
115119
Action、Drawer 或 Dialog。复用方直接使用 `typeof XxxApi` 约束完整 API 对象;不要为每组 Action
116120
额外维护逐方法接口,例如 `ModelActionApi`,也不要使用不断扩展的 `Pick<typeof XxxApi, ...>`。
117121
完整 API 对象的方法集合不同时,共用组件使用完整对象类型的联合,例如

‎ui/src/layout/AppLayout.vue‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const mode = computed<LayoutMode>(() => route.meta.scope ?? 'workspace')
1717
<LayoutHeader :mode="preview ? 'workspace' : mode" :preview="preview" />
1818
<div class="flex">
1919
<aside v-if="preview" class="h-layout-content w-sidebar"></aside>
20-
<LayoutSidebar v-else :mode="mode" />
20+
<LayoutSidebar v-else-if="!route.meta.hideSidebar" :mode="mode" />
2121
<main class="mk-layout__main h-layout-content w-full overflow-hidden rounded-tl-xl bg-white transition-[margin] duration-200">
2222
<RouterView v-if="!preview" />
2323
</main>

‎ui/src/router/ROUTE_README.md‎

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ src/router/
2121
│ │ ├── index.ts # 系统管理路由汇总
2222
│ │ └── modules/
2323
│ │ ├── application.ts # System 来源的智能体详情路由
24-
│ │ └── knowledge.ts # System 来源的知识库详情路由
24+
│ │ ├── knowledge-system-resource.ts # System 资源管理知识库详情路由
25+
│ │ └── knowledge-system-shared.ts # System 共享资源知识库详情路由
2526
│ └── workspace/
2627
│ ├── index.ts # 工作空间模块汇总
2728
│ └── modules/
@@ -62,7 +63,8 @@ Workspace 根地址为 `/admin/workspace/:workspaceId`。`workspaceId` 只以当
6263

6364
System 使用 `AppLayout`,左侧导航根据 `scope: 'system'` 对应路由的 `children` 自动生成。
6465

65-
System 根地址为 `/admin/system`,默认进入首页 `/admin/system/home`。需要复用 Workspace 详情页面时,在 System 路由树中注册独立路由名并复用同一个页面组件,以保留访问来源。
66+
System 根地址为 `/admin/system`,默认进入首页 `/admin/system/home`。需要复用 Workspace 详情页面时使用独立路由名保留访问来源。System 知识库详情在 `system/index.ts` 的 children 注册,
67+
继承 System 的 AppLayout,在主区展示详情目录和内容区。
6668

6769
对话端管理根地址为 `/admin/system/chat-management`(`system-chat-management`),默认进入
6870
`users`(`system-chat-users`)。子路由还包括 `groups`
@@ -168,6 +170,7 @@ Chat 导航守卫(`chat/index.ts`):
168170
| `icon` | `string` | iconfont Symbol ID,子目录通常可以不配置 |
169171
| `order` | `number` | 同级导航排序,数字越小越靠前 |
170172
| `hidden` | `boolean` | 设置为 `true` 时不显示在导航中 |
173+
| `hideSidebar` | `boolean` | 隐藏 AppLayout 应用侧栏,保留顶部栏和页面自身导航;子页继承 |
171174
| `resource` | `ResourceAuthorizationType` | 系统资源授权页面当前管理的后端资源类型 |
172175

173176
## 导航生成
@@ -270,30 +273,33 @@ Workspace 页面:
270273
文件夹 ID,只清除已有的 `folderId`;进入详情时也不继续携带该 query。`folderId` 不作为详情 path
271274
参数。
272275

273-
System 复用页面(仅替换根前缀):
276+
System 复用页面:
274277

275278
```text
276279
/admin/system/application/:applicationId
277280
/admin/system/application/:applicationId/edit
278281
279-
/admin/system/knowledge/:knowledgeId
280-
/admin/system/knowledge/:knowledgeId/document/:documentId
282+
/admin/system/resource/knowledge/:knowledgeId/:type
283+
/admin/system/resource/knowledge/:knowledgeId/:type/document
284+
/admin/system/shared/knowledge/:knowledgeId/:type
285+
/admin/system/shared/knowledge/:knowledgeId/:type/document
281286
```
282287

283-
两套详情路由使用不同的路由名称并复用相同页面组件。除 `/workspace`、`/system` 根前缀外,后续模块路径保持一致。
288+
不同来源的详情路由使用独立名称并复用相同页面组件。System 知识库详情沿用对应列表的
289+
`resource` / `shared` 目录,详情地址不携带 `workspaceId`。
284290

285291
System 共享资源页面:
286292

287293
```text
288-
/admin/system/share/knowledge
289-
/admin/system/share/models
290-
/admin/system/share/tools
294+
/admin/system/shared/knowledge
295+
/admin/system/shared/models
296+
/admin/system/shared/tools
291297
```
292298

293299
`system-shared-knowledge` 渲染 `views/system/shared-resources/knowledge/index.vue`,提供共享知识库
294300
卡片管理页面;`system-shared-tools` 渲染 `views/system/shared-resources/tool/index.vue`,提供共享工具管理页面。
295301

296-
共享资源路由是 System 导航的一部分,继续在 `admin/system/index.ts` 的 `share` 子路由中维护。
302+
共享资源路由是 System 导航的一部分,继续在 `admin/system/index.ts` 的 `shared` 子路由中维护。
297303
已实现的共享资源页面放在 `views/system/shared-resources/`,由页面处理 System 范围的查询和操作,
298304
可按需复用 Workspace 对应资源的卡片等展示组件。
299305

@@ -446,3 +452,31 @@ Workspace 父路由为 `workspace-application-detail-layout`;System 详情实
446452
`resourceScope: 'workspace-shared'` 和 `activeMenu: 'workspace-knowledge'`,复用知识库详情容器和文档页,侧栏仍高亮 Workspace 知识库。
447453
共享详情目前仅注册“资料库 → 文档”,后续页面需接入对应共享接口后再注册,不跳转普通设置或工作流。
448454
返回列表时使用 `folderId: 'shared'` 恢复共享目录。
455+
456+
457+
### System 知识库详情路由
458+
459+
`admin/system/modules/knowledge-system-resource.ts` 导出 `systemResourceKnowledgeRoutes`,
460+
`admin/system/modules/knowledge-system-shared.ts` 导出 `systemSharedKnowledgeRoutes`,由 `system/index.ts`
461+
展开到 System 根路由的 children,使用完整的 `/system/resource/knowledge/:knowledgeId/:type`、
462+
`/system/shared/knowledge/:knowledgeId/:type` 地址,继承系统管理的 AppLayout。
463+
详情父路由显式配置 `scope: 'system'` 和对应 `resourceScope`,子页继承资源范围。共享资源统一使用 `shared` 前缀,父路由名为 `system-shared`,相关 `next` 同步使用该名称。
464+
不保留 `/system/share` 别名,列表及详情均使用 `/system/shared` 地址。
465+
两种详情父路由分别为 `system-resource-knowledge-detail`、`system-shared-knowledge-detail`,
466+
均配置 `hidden`、`hideSidebar`、`resourceDetailRoot`,隐藏系统应用侧栏并保留系统顶部栏与详情目录,复用 `knowledge-detail/index.vue`,默认重定向到各自的文档页。
467+
参数 `type` 沿用 Workspace 的字符串知识库类型。
468+
469+
各来源在自己的模块文件中显式维护 children,不使用共用子路由生成函数。
470+
Workspace 普通和 System 两种管理来源分别配置资料库、检索优化、授权与集成和设置目录,
471+
共用 View 组件并保持知识库类型显隐规则。Workspace 共享仍仅配置资料库中的文档页。
472+
System 画布尚未接入对应 API,因此两种 System 详情均不注册工作流入口;
473+
Workspace 普通来源继续保留 `workflow-knowledge` 入口。
474+
475+
System 资源管理知识库表格的详情按钮和共享知识库卡片分别进入对应详情父路由,
476+
携带 `knowledgeId` 和经 `KNOWLEDGE_TYPE_MAP` 转换的 `type`,不携带 `workspaceId`。
477+
`AppLayout` 响应当前路由 `meta.hideSidebar` 控制应用侧栏;返回普通列表后自动恢复侧栏。
478+
预览模式继续保留侧栏占位。`hidden` 仅控制菜单项显隐,不代替 `hideSidebar`。
479+
详情容器使用 System 主区的高度,按来源查询知识库详情,并返回对应 System 列表。
480+
详情上下文按资源范围集中装配 API,基础设置和文档策略已使用对应管理 API;
481+
System Sync 模块暂未提供,定时同步页仍展示设置及日志布局,不回退 Workspace 接口。
482+
library 接口调整暂未实施,文档及标签保持原有请求方式,System library 适配仍待后续处理。

‎ui/src/router/admin/index.ts‎

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import NProgress from 'nprogress'
2-
import { createRouter, createWebHistory , type RouteLocationNormalizedLoaded,type RouteLocationNormalized,type RouteLocationResolvedGeneric} from 'vue-router'
2+
import {
3+
createRouter,
4+
createWebHistory,
5+
type RouteLocationNormalizedLoaded,
6+
type RouteLocationNormalized,
7+
type RouteLocationResolvedGeneric,
8+
} from 'vue-router'
39
import { useStore } from '@/stores'
410
import { loginRoutes } from './login'
511
import { systemRoutes } from './system'
@@ -42,7 +48,7 @@ router.beforeEach(async (to, from) => {
4248
}
4349

4450
// 当前路由有权限,放行
45-
if (!to.meta?.permission || (to.meta.permission as (route:RouteLocationNormalizedLoaded)=>boolean)(to)) {
51+
if (!to.meta?.permission || (to.meta.permission as (route: RouteLocationNormalizedLoaded) => boolean)(to)) {
4652
return true
4753
}
4854

@@ -65,7 +71,9 @@ router.beforeEach(async (to, from) => {
6571

6672
const nextRoute = router.resolve({ name: nextName })
6773
if (nextRoute?.name) {
68-
const nextPermission = nextRoute.meta?.permission as ((route?:RouteLocationNormalized |RouteLocationResolvedGeneric| RouteLocationNormalizedLoaded)=>boolean)
74+
const nextPermission = nextRoute.meta?.permission as (
75+
route?: RouteLocationNormalized | RouteLocationResolvedGeneric | RouteLocationNormalizedLoaded,
76+
) => boolean
6977
if (!nextPermission || nextPermission(nextRoute)) {
7078
return { name: nextName, replace: true }
7179
}

‎ui/src/router/admin/system/index.ts‎

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import type { RouteRecordRaw } from 'vue-router'
22
import { RESOURCE_TYPE } from '@/api/enums'
33
import { systemApplicationRoutes } from './modules/application'
4-
import { systemKnowledgeRoutes } from './modules/knowledge'
4+
import { systemResourceKnowledgeRoutes } from './modules/knowledge-system-resource'
5+
import { systemSharedKnowledgeRoutes } from './modules/knowledge-system-shared'
56
import perm from '@/permission/index'
67
export const systemRoutes: RouteRecordRaw = {
78
path: '/system',
@@ -151,7 +152,7 @@ export const systemRoutes: RouteRecordRaw = {
151152
permission: () => {
152153
return perm.application.system.read() || perm.knowledge.system.read() || perm.tool.system.read() || perm.model.system.read()
153154
},
154-
next: 'system-share',
155+
next: 'system-shared',
155156
},
156157
children: [
157158
{
@@ -176,15 +177,14 @@ export const systemRoutes: RouteRecordRaw = {
176177
path: 'models',
177178
name: 'system-resource-models',
178179
component: () => import('@/views/system/resource-management/model/index.vue'),
179-
meta: { title: '模型', order: 40, permission: perm.model.system.read, next: 'system-share' },
180+
meta: { title: '模型', order: 40, permission: perm.model.system.read, next: 'system-shared' },
180181
},
181182
],
182183
},
183184
...systemApplicationRoutes,
184-
...systemKnowledgeRoutes,
185185
{
186-
path: 'share',
187-
name: 'system-share',
186+
path: 'shared',
187+
name: 'system-shared',
188188
redirect: { name: 'system-shared-knowledge' },
189189
meta: {
190190
title: '共享资源',
@@ -218,6 +218,8 @@ export const systemRoutes: RouteRecordRaw = {
218218
},
219219
],
220220
},
221+
...systemResourceKnowledgeRoutes,
222+
...systemSharedKnowledgeRoutes,
221223
{
222224
path: 'chat-management',
223225
name: 'system-chat-management',
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
import type { RouteRecordRaw } from 'vue-router'
2+
import { KNOWLEDGE_TYPE_KEY } from '@/constants/knowledge'
3+
4+
/** System 知识库详情路由,由 System 汇总并继承系统布局。 */
5+
export const systemResourceKnowledgeRoutes: RouteRecordRaw[] = [
6+
{
7+
path: '/system/resource/knowledge/:knowledgeId/:type',
8+
name: 'system-resource-knowledge-detail',
9+
component: () => import('@/views/knowledge-detail/index.vue'),
10+
redirect: { name: 'system-resource-knowledge-document-list' },
11+
meta: { title: '知识库详情', hidden: true, hideSidebar: true, resourceDetailRoot: true, scope: 'system', resourceScope: 'system-resource' },
12+
children: [
13+
{
14+
path: '',
15+
name: 'system-resource-knowledge-library',
16+
redirect: { name: 'system-resource-knowledge-document-list' },
17+
meta: { title: '资料库', icon: 'icon-draft', order: 10 },
18+
children: [
19+
{
20+
path: 'document',
21+
name: 'system-resource-knowledge-document-list',
22+
component: () => import('@/views/knowledge-detail/library/document/index.vue'),
23+
meta: { title: '文档', order: 10 },
24+
},
25+
{
26+
path: 'image',
27+
name: 'system-resource-knowledge-image-list',
28+
component: () => import('@/views/knowledge-detail/library/image/index.vue'),
29+
meta: { title: '图片', order: 20, detailMenuVisible: (params) => params.type === KNOWLEDGE_TYPE_KEY.BASE },
30+
},
31+
{
32+
path: 'tag',
33+
name: 'system-resource-knowledge-tag',
34+
component: () => import('@/views/knowledge-detail/library/tags/index.vue'),
35+
meta: { title: '标签管理', order: 30 },
36+
},
37+
],
38+
},
39+
{
40+
path: 'retrieval',
41+
name: 'system-resource-knowledge-retrieval',
42+
redirect: { name: 'system-resource-knowledge-recall-test' },
43+
meta: { title: '检索优化', icon: 'icon_trace_outlined', order: 30 },
44+
children: [
45+
{
46+
path: 'recall',
47+
name: 'system-resource-knowledge-recall-test',
48+
component: () => import('@/views/knowledge-detail/recall-test/index.vue'),
49+
meta: { title: '召回测试', order: 10 },
50+
},
51+
{
52+
path: 'question',
53+
name: 'system-resource-knowledge-question',
54+
component: () => import('@/views/knowledge-detail/question/index.vue'),
55+
meta: { title: '问题', order: 20 },
56+
},
57+
{
58+
path: 'dictionary',
59+
name: 'system-resource-knowledge-dictionary',
60+
component: () => import('@/views/knowledge-detail/dictionary/index.vue'),
61+
meta: { title: '自定义分词', order: 30 },
62+
},
63+
],
64+
},
65+
{
66+
path: 'integration',
67+
name: 'system-resource-knowledge-integration',
68+
redirect: { name: 'system-resource-knowledge-chat-user' },
69+
meta: { title: '授权与集成', icon: 'icon_personal-privacy_outlined', order: 40 },
70+
children: [
71+
{
72+
path: 'chat-user',
73+
name: 'system-resource-knowledge-chat-user',
74+
component: () => import('@/views/knowledge-detail/chat-user/index.vue'),
75+
meta: { title: '对话用户', order: 10 },
76+
},
77+
{
78+
path: 'external-retrieval',
79+
name: 'system-resource-knowledge-external-retrieval',
80+
component: () => import('@/views/knowledge-detail/external-retrieval/index.vue'),
81+
meta: { title: '外部检索服务', order: 20 },
82+
},
83+
],
84+
},
85+
{
86+
path: 'setting',
87+
name: 'system-resource-knowledge-setting',
88+
component: () => import('@/views/knowledge-detail/setting/base/index.vue'),
89+
meta: {
90+
title: '设置',
91+
icon: 'icon_setting',
92+
activeIcon: 'icon_setting_filled',
93+
order: 50,
94+
detailMenuVisible: (params) => params.type === KNOWLEDGE_TYPE_KEY.BASE,
95+
},
96+
},
97+
{
98+
// 设置分组只提供菜单层级,子页面统一使用 setting 前缀。
99+
path: '',
100+
name: 'system-resource-knowledge-settings',
101+
redirect: (to) => ({ name: 'system-resource-knowledge-base-setting', params: to.params, query: to.query, hash: to.hash }),
102+
meta: {
103+
title: '设置',
104+
icon: 'icon_setting',
105+
activeIcon: 'icon_setting_filled',
106+
order: 50,
107+
detailMenuVisible: (params) => params.type !== KNOWLEDGE_TYPE_KEY.BASE,
108+
},
109+
children: [
110+
{
111+
path: 'setting/base',
112+
name: 'system-resource-knowledge-base-setting',
113+
component: () => import('@/views/knowledge-detail/setting/base/index.vue'),
114+
meta: { title: '基础设置', order: 10 },
115+
},
116+
{
117+
path: 'setting/document-strategy',
118+
name: 'system-resource-knowledge-document-strategy',
119+
component: () => import('@/views/knowledge-detail/setting/document-strategy/index.vue'),
120+
meta: { title: '文档处理策略', order: 20, detailMenuVisible: (params) => params.type === KNOWLEDGE_TYPE_KEY.WEB },
121+
},
122+
{
123+
path: 'setting/scheduled-sync',
124+
name: 'system-resource-knowledge-scheduled-sync',
125+
component: () => import('@/views/knowledge-detail/setting/scheduled-sync/index.vue'),
126+
meta: { title: '定时同步', order: 30 },
127+
},
128+
],
129+
},
130+
],
131+
},
132+
]

0 commit comments

Comments
 (0)