diff --git a/ui/src/router/ROUTE_README.md b/ui/src/router/ROUTE_README.md index c7e39cec541..48f051ec51e 100644 --- a/ui/src/router/ROUTE_README.md +++ b/ui/src/router/ROUTE_README.md @@ -46,7 +46,7 @@ Workspace 使用 `AppLayout`,左侧导航根据 `scope: 'workspace'` 对应路 Workspace 根地址为 `/admin/workspace/:workspaceId`。`workspaceId` 只以当前路由参数为准。应用根 地址、登录成功和从 System 返回 Workspace 时统一进入 `/admin/workspace/default`。父路由的 - `scope` 会合并到匹配的子路由 `meta` 中。 +`scope` 会合并到匹配的子路由 `meta` 中。 顶部工作空间切换统一由 `layout/header-workspace-dropdown/index.vue` 处理:选择不同工作空间时, 通过 `router.resolve()` 生成目标地址,再调用 `window.location.assign()` 整页加载,重新初始化 @@ -158,20 +158,20 @@ Chat 导航守卫(`chat/index.ts`): 路由扩展字段定义在 `admin/types.ts`: -| 字段 | 类型 | 说明 | -| -------------------- | ----------------------------------------------------- | ------------------------------------------------------ | -| `scope` | `'workspace' \| 'system'` | 标记生成哪一套框架导航,只配置在布局根路由上 | -| `resourceScope` | `'workspace' \| 'workspace-shared' \| 'system-resource' \| 'system-shared'` | 标记页面使用的资源范围,由对应资源父路由配置并向下继承 | -| `activeIcon` | `string` | 菜单激活状态的 iconfont Symbol ID | -| `activeMenu` | `string` | 进入子页面时需要保持激活的侧栏菜单路径 | -| `resourceDetailRoot` | `boolean` | 标记资源详情根,详情容器和独立文档分段页配置,用于目录与工作空间切换 | -| `detailActiveMenu` | `string` | 更深层详情页面需要保持激活的二级菜单路由名称 | -| `title` | `string` | 页面标题,同时作为导航名称 | -| `icon` | `string` | iconfont Symbol ID,子目录通常可以不配置 | -| `order` | `number` | 同级导航排序,数字越小越靠前 | -| `hidden` | `boolean` | 设置为 `true` 时不显示在导航中 | -| `hideSidebar` | `boolean` | 隐藏 AppLayout 应用侧栏,保留顶部栏和页面自身导航;子页继承 | -| `resource` | `ResourceAuthorizationType` | 系统资源授权页面当前管理的后端资源类型 | +| 字段 | 类型 | 说明 | +| -------------------- | --------------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `scope` | `'workspace' \| 'system'` | 标记生成哪一套框架导航,只配置在布局根路由上 | +| `resourceScope` | `'workspace' \| 'workspace-shared' \| 'system-resource' \| 'system-shared'` | 标记页面使用的资源范围,由对应资源父路由配置并向下继承 | +| `activeIcon` | `string` | 菜单激活状态的 iconfont Symbol ID | +| `activeMenu` | `string` | 进入子页面时需要保持激活的侧栏菜单路径 | +| `resourceDetailRoot` | `boolean` | 标记资源详情根,详情容器和独立文档分段页配置,用于目录与工作空间切换 | +| `detailActiveMenu` | `string` | 更深层详情页面需要保持激活的二级菜单路由名称 | +| `title` | `string` | 页面标题,同时作为导航名称 | +| `icon` | `string` | iconfont Symbol ID,子目录通常可以不配置 | +| `order` | `number` | 同级导航排序,数字越小越靠前 | +| `hidden` | `boolean` | 设置为 `true` 时不显示在导航中 | +| `hideSidebar` | `boolean` | 隐藏 AppLayout 应用侧栏,保留顶部栏和页面自身导航;子页继承 | +| `resource` | `ResourceAuthorizationType` | 系统资源授权页面当前管理的后端资源类型 | ## 导航生成 @@ -415,7 +415,8 @@ Web 展示“设置 → 基础设置、文档处理策略、定时同步”; `ResourceDetailLayout`。配置 `hidden` 与 `resourceDetailRoot`,使工作空间切换继续返回知识库列表; 返回按钮进入 `workspace-knowledge-document-list`,保留知识库类型和 query。 文档行点击进入分段页,选择列、名称编辑和操作按钮不触发跳转。 -Workspace 共享及 System 文档分段入口暂未注册,等待各范围接口接入,不回退普通 Workspace。 +Workspace 共享及 System 两种来源也注册独立的文档分段路由,路径在各自详情地址后追加 `/document/:documentId`; +分段页不挂载详情容器,返回各自文档列表;各范围分段 API 接入暂缓。 智能体工作流返回通过 `views/workflow/application/navigation.ts` 动态读取详情父路由的 `children`。 Workspace 父路由为 `workspace-application-detail-layout`;System 详情实现时使用 @@ -460,10 +461,9 @@ Workspace 父路由为 `workspace-application-detail-layout`;System 详情实 `/admin/workspace/:workspaceId/shared/knowledge/:knowledgeId/:type`,默认重定向到 `workspace-shared-knowledge-document-list`(`document`)。详情父路由配置 `resourceScope: 'workspace-shared'` 和 `activeMenu: 'workspace-knowledge'`,复用知识库详情容器和文档页,侧栏仍高亮 Workspace 知识库。 -共享详情目前仅注册“资料库 → 文档”,后续页面需接入对应共享接口后再注册,不跳转普通设置或工作流。 +共享详情与其他三种范围维护相同菜单及知识库类型显隐规则;新增页面的共享 API 接入暂缓,不假定各范围接口相同。 返回列表时使用 `folderId: 'shared'` 恢复共享目录。 - ### System 知识库详情路由 `admin/system/modules/knowledge-system-resource.ts` 导出 `systemResourceKnowledgeRoutes`, @@ -477,16 +477,17 @@ Workspace 父路由为 `workspace-application-detail-layout`;System 详情实 参数 `type` 沿用 Workspace 的字符串知识库类型。 各来源在自己的模块文件中显式维护 children,不使用共用子路由生成函数。 -Workspace 普通和 System 两种管理来源分别配置资料库、检索优化、授权与集成和设置目录, -共用 View 组件并保持知识库类型显隐规则。Workspace 共享仍仅配置资料库中的文档页。 -System 画布尚未接入对应 API,因此两种 System 详情均不注册工作流入口; -Workspace 普通来源继续保留 `workflow-knowledge` 入口。 +四种来源均配置资料库、工作流、检索优化、授权与集成和设置目录,共用 View 组件并保持相同的 +菜单顺序与知识库类型显隐规则。工作流入口对 WORKFLOW 类型跳转对应全屏画布,其他类型进入转换页。 +Workspace 普通保留 `workflow-knowledge`;其他三种来源分别使用 +`workspace-shared-workflow-knowledge`、`system-resource-workflow-knowledge`、`system-shared-workflow-knowledge`, +地址分别为 `/workspace/:workspaceId/shared/knowledge/:knowledgeId/workflow`、 +`/system/resource/knowledge/:knowledgeId/workflow`、`/system/shared/knowledge/:knowledgeId/workflow`。 System 资源管理知识库表格的详情按钮和共享知识库卡片分别进入对应详情父路由, 携带 `knowledgeId` 和经 `KNOWLEDGE_TYPE_MAP` 转换的 `type`,不携带 `workspaceId`。 `AppLayout` 响应当前路由 `meta.hideSidebar` 控制应用侧栏;返回普通列表后自动恢复侧栏。 预览模式继续保留侧栏占位。`hidden` 仅控制菜单项显隐,不代替 `hideSidebar`。 详情容器使用 System 主区的高度,按来源查询知识库详情,并返回对应 System 列表。 -详情上下文按资源范围集中装配 API,基础设置和文档策略已使用对应管理 API; -System Sync 模块暂未提供,定时同步页仍展示设置及日志布局,不回退 Workspace 接口。 -library 接口调整暂未实施,文档及标签保持原有请求方式,System library 适配仍待后续处理。 +本轮仅补齐四套菜单与导航,API 及其上下文装配保持原实现,各范围接口差异后续独立接入。 +新增路由不代表对应范围 API 已完成;不复制 Workspace 协议补造其他来源的接口。 diff --git a/ui/src/router/admin/system/modules/knowledge-system-resource.ts b/ui/src/router/admin/system/modules/knowledge-system-resource.ts index 713406c46dc..9ce1d847654 100644 --- a/ui/src/router/admin/system/modules/knowledge-system-resource.ts +++ b/ui/src/router/admin/system/modules/knowledge-system-resource.ts @@ -36,6 +36,22 @@ export const systemResourceKnowledgeRoutes: RouteRecordRaw[] = [ }, ], }, + { + path: 'workflow-entry', + name: 'system-resource-knowledge-workflow', + component: () => import('@/views/knowledge-detail/workflow-transform/index.vue'), + beforeEnter: (to) => { + if (to.params.type === KNOWLEDGE_TYPE_KEY.WORKFLOW) { + return { + name: 'system-resource-workflow-knowledge', + params: { knowledgeId: to.params.knowledgeId }, + query: to.query, + hash: to.hash, + } + } + }, + meta: { title: '工作流', icon: 'icon_ticket-flow_outlined', order: 20 }, + }, { path: 'retrieval', name: 'system-resource-knowledge-retrieval', @@ -129,4 +145,10 @@ export const systemResourceKnowledgeRoutes: RouteRecordRaw[] = [ }, ], }, + { + path: '/system/resource/knowledge/:knowledgeId/:type/document/:documentId', + name: 'system-resource-knowledge-paragraph', + component: () => import('@/views/knowledge-detail/paragraph/index.vue'), + meta: { resourceScope: 'system-resource', scope: 'system', hideSidebar: true, title: '文档分段', hidden: true, resourceDetailRoot: true }, + }, ] diff --git a/ui/src/router/admin/system/modules/knowledge-system-shared.ts b/ui/src/router/admin/system/modules/knowledge-system-shared.ts index b85010ac447..7613bc9c71c 100644 --- a/ui/src/router/admin/system/modules/knowledge-system-shared.ts +++ b/ui/src/router/admin/system/modules/knowledge-system-shared.ts @@ -36,6 +36,22 @@ export const systemSharedKnowledgeRoutes: RouteRecordRaw[] = [ }, ], }, + { + path: 'workflow-entry', + name: 'system-shared-knowledge-workflow', + component: () => import('@/views/knowledge-detail/workflow-transform/index.vue'), + beforeEnter: (to) => { + if (to.params.type === KNOWLEDGE_TYPE_KEY.WORKFLOW) { + return { + name: 'system-shared-workflow-knowledge', + params: { knowledgeId: to.params.knowledgeId }, + query: to.query, + hash: to.hash, + } + } + }, + meta: { title: '工作流', icon: 'icon_ticket-flow_outlined', order: 20 }, + }, { path: 'retrieval', name: 'system-shared-knowledge-retrieval', @@ -129,4 +145,10 @@ export const systemSharedKnowledgeRoutes: RouteRecordRaw[] = [ }, ], }, + { + path: '/system/shared/knowledge/:knowledgeId/:type/document/:documentId', + name: 'system-shared-knowledge-paragraph', + component: () => import('@/views/knowledge-detail/paragraph/index.vue'), + meta: { resourceScope: 'system-shared', scope: 'system', hideSidebar: true, title: '文档分段', hidden: true, resourceDetailRoot: true }, + }, ] diff --git a/ui/src/router/admin/workflow/index.ts b/ui/src/router/admin/workflow/index.ts index 55ededff4eb..8b4f97c4ba9 100644 --- a/ui/src/router/admin/workflow/index.ts +++ b/ui/src/router/admin/workflow/index.ts @@ -34,4 +34,22 @@ export const workflowRoutes: RouteRecordRaw[] = [ component: () => import('@/views/workflow/knowledge/index.vue'), meta: { title: '知识库工作流', resourceScope: 'workspace' }, }, + { + path: '/workspace/:workspaceId/shared/knowledge/:knowledgeId/workflow', + name: 'workspace-shared-workflow-knowledge', + component: () => import('@/views/workflow/knowledge/index.vue'), + meta: { title: '知识库工作流', resourceScope: 'workspace-shared' }, + }, + { + path: '/system/resource/knowledge/:knowledgeId/workflow', + name: 'system-resource-workflow-knowledge', + component: () => import('@/views/workflow/knowledge/index.vue'), + meta: { title: '知识库工作流', resourceScope: 'system-resource' }, + }, + { + path: '/system/shared/knowledge/:knowledgeId/workflow', + name: 'system-shared-workflow-knowledge', + component: () => import('@/views/workflow/knowledge/index.vue'), + meta: { title: '知识库工作流', resourceScope: 'system-shared' }, + }, ] diff --git a/ui/src/router/admin/workspace/modules/knowledge-shared.ts b/ui/src/router/admin/workspace/modules/knowledge-shared.ts index 03d8e60e267..229be4ec90b 100644 --- a/ui/src/router/admin/workspace/modules/knowledge-shared.ts +++ b/ui/src/router/admin/workspace/modules/knowledge-shared.ts @@ -1,4 +1,5 @@ import type { RouteRecordRaw } from 'vue-router' +import { KNOWLEDGE_TYPE_KEY } from '@/constants/knowledge' /** 工作空间知识库模块下的共享详情路由。 */ export const sharedKnowledgeRoutes: RouteRecordRaw[] = [ @@ -21,8 +22,133 @@ export const sharedKnowledgeRoutes: RouteRecordRaw[] = [ component: () => import('@/views/knowledge-detail/library/document/index.vue'), meta: { title: '文档', order: 10 }, }, + { + path: 'image', + name: 'workspace-shared-knowledge-image-list', + component: () => import('@/views/knowledge-detail/library/image/index.vue'), + meta: { title: '图片', order: 20, detailMenuVisible: (params) => params.type === KNOWLEDGE_TYPE_KEY.BASE }, + }, + { + path: 'tag', + name: 'workspace-shared-knowledge-tag', + component: () => import('@/views/knowledge-detail/library/tags/index.vue'), + meta: { title: '标签管理', order: 30 }, + }, + ], + }, + { + path: 'workflow-entry', + name: 'workspace-shared-knowledge-workflow', + component: () => import('@/views/knowledge-detail/workflow-transform/index.vue'), + beforeEnter: (to) => { + if (to.params.type === KNOWLEDGE_TYPE_KEY.WORKFLOW) { + return { + name: 'workspace-shared-workflow-knowledge', + params: { workspaceId: to.params.workspaceId, knowledgeId: to.params.knowledgeId }, + query: to.query, + hash: to.hash, + } + } + }, + meta: { title: '工作流', icon: 'icon_ticket-flow_outlined', order: 20 }, + }, + { + path: 'retrieval', + name: 'workspace-shared-knowledge-retrieval', + redirect: { name: 'workspace-shared-knowledge-recall-test' }, + meta: { title: '检索优化', icon: 'icon_trace_outlined', order: 30 }, + children: [ + { + path: 'recall', + name: 'workspace-shared-knowledge-recall-test', + component: () => import('@/views/knowledge-detail/recall-test/index.vue'), + meta: { title: '召回测试', order: 10 }, + }, + { + path: 'question', + name: 'workspace-shared-knowledge-question', + component: () => import('@/views/knowledge-detail/question/index.vue'), + meta: { title: '问题', order: 20 }, + }, + { + path: 'dictionary', + name: 'workspace-shared-knowledge-dictionary', + component: () => import('@/views/knowledge-detail/dictionary/index.vue'), + meta: { title: '自定义分词', order: 30 }, + }, + ], + }, + { + path: 'integration', + name: 'workspace-shared-knowledge-integration', + redirect: { name: 'workspace-shared-knowledge-chat-user' }, + meta: { title: '授权与集成', icon: 'icon_personal-privacy_outlined', order: 40 }, + children: [ + { + path: 'chat-user', + name: 'workspace-shared-knowledge-chat-user', + component: () => import('@/views/knowledge-detail/chat-user/index.vue'), + meta: { title: '对话用户', order: 10 }, + }, + { + path: 'external-retrieval', + name: 'workspace-shared-knowledge-external-retrieval', + component: () => import('@/views/knowledge-detail/external-retrieval/index.vue'), + meta: { title: '外部检索服务', order: 20 }, + }, + ], + }, + { + path: 'setting', + name: 'workspace-shared-knowledge-setting', + component: () => import('@/views/knowledge-detail/setting/base/index.vue'), + meta: { + title: '设置', + icon: 'icon_setting', + activeIcon: 'icon_setting_filled', + order: 50, + detailMenuVisible: (params) => params.type === KNOWLEDGE_TYPE_KEY.BASE, + }, + }, + { + // 设置分组只提供菜单层级,子页面统一使用 setting 前缀。 + path: '', + name: 'workspace-shared-knowledge-settings', + redirect: (to) => ({ name: 'workspace-shared-knowledge-base-setting', params: to.params, query: to.query, hash: to.hash }), + meta: { + title: '设置', + icon: 'icon_setting', + activeIcon: 'icon_setting_filled', + order: 50, + detailMenuVisible: (params) => params.type !== KNOWLEDGE_TYPE_KEY.BASE, + }, + children: [ + { + path: 'setting/base', + name: 'workspace-shared-knowledge-base-setting', + component: () => import('@/views/knowledge-detail/setting/base/index.vue'), + meta: { title: '基础设置', order: 10 }, + }, + { + path: 'setting/document-strategy', + name: 'workspace-shared-knowledge-document-strategy', + component: () => import('@/views/knowledge-detail/setting/document-strategy/index.vue'), + meta: { title: '文档处理策略', order: 20, detailMenuVisible: (params) => params.type === KNOWLEDGE_TYPE_KEY.WEB }, + }, + { + path: 'setting/scheduled-sync', + name: 'workspace-shared-knowledge-scheduled-sync', + component: () => import('@/views/knowledge-detail/setting/scheduled-sync/index.vue'), + meta: { title: '定时同步', order: 30 }, + }, ], }, ], }, + { + path: 'shared/knowledge/:knowledgeId/:type/document/:documentId', + name: 'workspace-shared-knowledge-paragraph', + component: () => import('@/views/knowledge-detail/paragraph/index.vue'), + meta: { resourceScope: 'workspace-shared', activeMenu: 'workspace-knowledge', title: '文档分段', hidden: true, resourceDetailRoot: true }, + }, ] diff --git a/ui/src/views/VIEW_README.md b/ui/src/views/VIEW_README.md index 76cc61794d4..90b8a7cb501 100644 --- a/ui/src/views/VIEW_README.md +++ b/ui/src/views/VIEW_README.md @@ -488,7 +488,7 @@ Dialog。新增或重命名文件时,应同步更新所有导入和页面功 | `knowledge-detail/index.vue` | 知识库详情页面 | | `knowledge-detail/library/tags/index.vue` | 标签分组查询、创建、重命名、单值编辑、删除与关联文档管理 | | `knowledge-detail/workflow-transform/index.vue` | 非工作流知识库转换说明、确认与进入画布 | -| `knowledge-detail/paragraph/index.vue` | 普通 Workspace 文档分段查询、目录定位、批量操作、新增、编辑与详情 | +| `knowledge-detail/paragraph/index.vue` | 普通 Workspace 文档分段查询、目录定位、批量操作、新增、编辑与详情 | | | `knowledge-detail/setting/base/index.vue` | 知识库基本信息、来源配置与上传限制设置 | @@ -936,7 +936,7 @@ Workspace 普通资源、System 资源管理和 System 共享资源允许打开 避免覆盖并行的问题操作;取消编辑不撤销即时保存的问题关联。 新增成功关闭弹窗并通知页面清空搜索、重新查询服务端排序;编辑成功通知页面刷新当前筛选结果。 分段卡片在非批量模式点击打开详情弹窗,批量模式点击切换勾选;批量生成问题继续使用 `components/ButtonGenerateQuestions.vue`。 -Workspace 共享及 System 分段入口暂未接入,不回退 Workspace API。 +Workspace 共享及 System 分段路由已注册并保持来源导航;各范围分段 API 接入暂缓。 System 资源管理与共享资源已注册共用知识库详情路由, 列表导航已接入。System 详情路由在 System 根路由的 children 汇总,通过详情父路由的 `hideSidebar: true` 隐藏系统管理 Sidebar,保留系统 Header 和知识库详情目录; @@ -1064,7 +1064,7 @@ application、tool、knowledge 的 WorkflowView 统一使用一个 `loading` 控 ### 知识库工作流导航与导入导出 -`workflow/knowledge/navigation.ts` 统一返回入口:Workspace 将详情中的 `type` 通过 `KNOWLEDGE_TYPE_MAP` 转为字符串后返回当前知识库详情,详情尚未加载时使用 `WORKFLOW`;System 资源管理和共享资源返回各自知识库列表。 +`workflow/knowledge/navigation.ts` 统一返回入口:Workspace 将详情中的 `type` 通过 `KNOWLEDGE_TYPE_MAP` 转为字符串后返回当前知识库详情,详情尚未加载时使用 `WORKFLOW`;System 资源管理和共享资源返回各自知识库详情;Workspace 共享也返回共享详情。 历史模式下返回只退出预览;普通编辑态返回保留未保存确认。更多菜单的导出工作流先保存未提交改动, 再调用专用 `.kbwf` 导出接口;保存失败不导出。知识库原有文件上传、数据源表单与任务轮询调试流程保持独立。 更多菜单在“导出工作流”上方依次提供“导入文档”和“导入工作流”。导入文档要求工作流已发布, @@ -1144,7 +1144,7 @@ application、tool、knowledge 的 WorkflowView 统一使用一个 `loading` 控 通过 `useKnowledgeSettingContext()` 的 `resourceApi.knowledge.postTransformWorkflow` 提交 深拷贝后的 `knowledge/template.ts` 默认模板,按上下文选择 Workspace、System 资源管理或 System 共享管理 Knowledge API;成功后进入画布,失败保留转换页。 -当前路由与画布跳转仍仅接入 Workspace,不为 Workspace 共享只读资源增加转换接口或回退。 +四种范围的路由与画布跳转已配置;API 保留原实现,Workspace 共享和 System 工作流接口接入暂缓。 ### 执行记录 @@ -1313,7 +1313,7 @@ Web 地址按行去空白、去重并校验 HTTP/HTTPS;空选择器提交 `bod 两者复用 `knowledge-detail/index.vue` 和文档页;详情容器通过上下文选择对应详情 API, 文档页继续自行通过 `isWorkspaceSharedResource()` 选择 `workspace/knowledge/` 或 `workspace/shared/knowledge/` 的完整 API 对象。 -共享详情目前仅提供资料库中的文档页,设置与工作流尚未接入共享接口,不注册对应共享入口。 +共享详情已补齐与其他三种范围一致的菜单,设置与工作流接口接入暂缓。 容器监听工作空间、知识库和资源范围变化重新加载;共享详情返回列表携带 `folderId: 'shared'`, 普通详情继续恢复所属文件夹。文档创建者选项在共享范围使用 System `CommonApi`,普通范围使用 Workspace `CommonApi`;范围变化同时清空搜索控件、筛选、创建者选项与分页。 @@ -1417,7 +1417,7 @@ chat 装配函数通过 `disabled` 禁用输入框与附件。 基础设置和文档策略通过 `useKnowledgeSettingContext` 获取可管理范围的完整 Knowledge API 类型, 该设置上下文的 `resourceApi` 仅提供 `knowledge`;定时同步从普通详情上下文读取 `sync`,不重复暴露。 不在页面用方法是否存在判断可写能力;上下文边界排除 Workspace 共享只读范围, -共享路由不注册设置页,也不增加写接口。 +共享设置路由已注册,API 上下文仍保留原有只读边界,写接口接入暂缓。 上下文按响应式 `resourceScope` 选择完整 Knowledge、Sync API 对象, 统一通过响应式 `resourceApi.knowledge / sync` 提供接口,脚本调用不需要 `.value`; 详情查询与保存使用同一个完整 Knowledge API 对象,不存在的设置模块保持 undefined。 @@ -1427,3 +1427,7 @@ chat 装配函数通过 `disabled` 禁用输入框与附件。 library 下的文档、标签与迁移组件保留原有调用方式,不装配到上下文。 同步日志通过完整 Sync API props 请求。展示组件不接收上下文 API。 System 飞书专用保存方法尚未提供,基础设置沿该范围现有 `putKnowledge` 协议;Workspace 飞书保留专用方法。 + +四套知识库详情菜单及来源导航已统一,`useKnowledgeNavigationContext` 仅维护路由名称与参数, +不配置 API。各范围接口存在差异,API 模块和原有详情接口上下文保持原实现; +后续按每套真实接口分别接入,不将菜单完整度视为接口接入完成。 diff --git a/ui/src/views/knowledge-detail/chat-user/index.vue b/ui/src/views/knowledge-detail/chat-user/index.vue index 826aeb4c838..598a4299cc7 100644 --- a/ui/src/views/knowledge-detail/chat-user/index.vue +++ b/ui/src/views/knowledge-detail/chat-user/index.vue @@ -1,10 +1,220 @@ diff --git a/ui/src/views/knowledge-detail/context.ts b/ui/src/views/knowledge-detail/context.ts index f31669b8246..857d4974e81 100644 --- a/ui/src/views/knowledge-detail/context.ts +++ b/ui/src/views/knowledge-detail/context.ts @@ -103,3 +103,28 @@ export function useKnowledgeSettingContext() { }) return { ...context, resourceApi } } + +/** 四套详情的路由导航,与各范围 API 装配独立。 */ +export function useKnowledgeNavigationContext() { + const route = useRoute() + const resourceScope = computed(() => route.meta.resourceScope) + const routeNames = computed(() => { + const scope = resourceScope.value + if (!scope) throw new Error('Knowledge resource scope is unavailable') + const prefix = `${scope}-knowledge` + return { + detail: `${prefix}-detail`, + document: `${prefix}-document-list`, + paragraph: `${prefix}-paragraph`, + workflowEntry: `${prefix}-workflow`, + workflow: scope === 'workspace' ? 'workflow-knowledge' : `${scope}-workflow-knowledge`, + } + }) + const routeParams = computed(() => { + const knowledgeId = String(route.params.knowledgeId ?? '') + return resourceScope.value === 'workspace' || resourceScope.value === 'workspace-shared' + ? { workspaceId: route.params.workspaceId, knowledgeId } + : { knowledgeId } + }) + return { routeNames, routeParams } +} diff --git a/ui/src/views/knowledge-detail/library/document/index.vue b/ui/src/views/knowledge-detail/library/document/index.vue index a12e5ff56d7..6893ce5f362 100644 --- a/ui/src/views/knowledge-detail/library/document/index.vue +++ b/ui/src/views/knowledge-detail/library/document/index.vue @@ -1,4 +1,5 @@