From 097bb61f3ff408b3af23a711128cdaa25fdf613a Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Thu, 8 Oct 2026 18:34:16 +0800 Subject: [PATCH] feat: document setting --- ui/src/api/API_README.md | 3 +- .../knowledge/knowledge.ts | 4 +- .../admin/workspace/knowledge/knowledge.ts | 3 +- ui/src/api/enums/knowledge.ts | 3 ++ ui/src/api/types/knowledge.ts | 4 +- ui/src/constants/knowledge.ts | 1 - ui/src/router/ROUTE_README.md | 18 +++++++- .../admin/workspace/modules/knowledge.ts | 44 ++++++++++++++++++- ui/src/views/VIEW_README.md | 20 +++++++-- .../library/document/index.vue | 2 +- .../setting/{ => base}/index.vue | 4 +- .../setting/document-strategy/index.vue | 11 +++++ .../setting/scheduled-sync/index.vue | 11 +++++ .../components/DocumentStrategyForm.vue | 19 +++++++- ui/src/views/knowledge/index.vue | 2 +- .../SettingKnowledgeAction.vue | 7 +-- .../KnowledgeSyncDialog.vue | 19 +++++--- 17 files changed, 146 insertions(+), 29 deletions(-) rename ui/src/views/knowledge-detail/setting/{ => base}/index.vue (98%) create mode 100644 ui/src/views/knowledge-detail/setting/document-strategy/index.vue create mode 100644 ui/src/views/knowledge-detail/setting/scheduled-sync/index.vue diff --git a/ui/src/api/API_README.md b/ui/src/api/API_README.md index a30ea20f1f3..081726c3053 100644 --- a/ui/src/api/API_README.md +++ b/ui/src/api/API_README.md @@ -229,7 +229,8 @@ MCP 入口加载配置后打开只读及复制弹窗;分词索引入口仅调 已有配置,文件数量与大小限制仍作为知识库顶层字段提交。 `putSyncWebKnowledge(knowledgeId, syncType)` 使用 PUT 请求 `//sync`, -查询参数 `sync_type` 为 `replace`(替换同步)或 `complete`(整体同步),不传请求体。 +Workspace 与 System 资源管理接口的查询参数 `sync_type` 均支持 `incremental`(增量同步)、 +`replace`(替换同步)和 `complete`(整体同步),不传请求体。 仅用于 Web 知识库;页面负责方式选择、覆盖提示、loading 与任务提交成功提示。 知识库创建通过 `postKnowledge`、`postWebKnowledge` 分别提交到 `/base`、`/web`; diff --git a/ui/src/api/admin/system/resource-management/knowledge/knowledge.ts b/ui/src/api/admin/system/resource-management/knowledge/knowledge.ts index 3bd7fc62fd7..ca15dd72fec 100644 --- a/ui/src/api/admin/system/resource-management/knowledge/knowledge.ts +++ b/ui/src/api/admin/system/resource-management/knowledge/knowledge.ts @@ -1,6 +1,6 @@ import { del, get, getExportFile, put } from '@/api/admin/core/request' import type { ParamsPage, ResponsePage } from '@/api/admin/core/types' -import type { Dict, KnowledgeDetail, KnowledgeItem, KnowledgeGeneratePayload } from '@/api/types' +import type { Dict, KnowledgeDetail, KnowledgeItem, KnowledgeGeneratePayload, KnowledgeSyncType } from '@/api/types' const prefix = '/system/resource/knowledge' @@ -39,7 +39,7 @@ const putReEmbeddingKnowledge = (knowledgeId: string) => { } /** 同步 Web 知识库。 */ -const putSyncWebKnowledge = (knowledgeId: string, syncType: 'replace' | 'complete') => { +const putSyncWebKnowledge = (knowledgeId: string, syncType: KnowledgeSyncType) => { return put(`${prefix}/${knowledgeId}/sync`, undefined, { sync_type: syncType }) } diff --git a/ui/src/api/admin/workspace/knowledge/knowledge.ts b/ui/src/api/admin/workspace/knowledge/knowledge.ts index f97529147e7..b75070b74dc 100644 --- a/ui/src/api/admin/workspace/knowledge/knowledge.ts +++ b/ui/src/api/admin/workspace/knowledge/knowledge.ts @@ -6,6 +6,7 @@ import type { KnowledgeDetail, KnowledgeItem, KnowledgeGeneratePayload, + KnowledgeSyncType, KnowledgeCreatePayload, WebKnowledgeCreatePayload, LarkKnowledgeCreatePayload, @@ -72,7 +73,7 @@ const putReEmbeddingKnowledge = (knowledgeId: string) => { } /** 同步 Web 知识库。 */ -const putSyncWebKnowledge = (knowledgeId: string, syncType: 'replace' | 'complete') => { +const putSyncWebKnowledge = (knowledgeId: string, syncType: KnowledgeSyncType) => { return put(`${getPrefix()}/${knowledgeId}/sync`, undefined, { sync_type: syncType }) } diff --git a/ui/src/api/enums/knowledge.ts b/ui/src/api/enums/knowledge.ts index 2ca645e553f..c27aaf78748 100644 --- a/ui/src/api/enums/knowledge.ts +++ b/ui/src/api/enums/knowledge.ts @@ -1,5 +1,8 @@ /** 后端知识库类型。 */ export const KNOWLEDGE_TYPE = { BASE: 0, WEB: 1, LARK: 2, WORKFLOW: 4 } as const +/** Web 知识库同步方式。 */ +export const KNOWLEDGE_SYNC_TYPE = { INCREMENTAL: 'incremental', REPLACE: 'replace', COMPLETE: 'complete' } as const + /** 知识库分段检索模式。 */ export const KNOWLEDGE_SEARCH_MODE = { EMBEDDING: 'embedding', KEYWORDS: 'keywords', BLEND: 'blend' } as const diff --git a/ui/src/api/types/knowledge.ts b/ui/src/api/types/knowledge.ts index 9403a3fb0cd..106fb087913 100644 --- a/ui/src/api/types/knowledge.ts +++ b/ui/src/api/types/knowledge.ts @@ -1,7 +1,7 @@ /** Workspace 知识库列表和知识库卡片共用的业务类型。 */ import type LogicFlow from '@logicflow/core' -import { KNOWLEDGE_TYPE } from '@/api/enums' +import { KNOWLEDGE_SYNC_TYPE, KNOWLEDGE_TYPE } from '@/api/enums' import type { DefaultModelSettingPayload } from './model' import type { DocumentTaskState } from './document' @@ -19,6 +19,8 @@ export interface KnowledgeGeneratePayload extends RelatedQuestionsConfig { export type KnowledgeType = (typeof KNOWLEDGE_TYPE)[keyof typeof KNOWLEDGE_TYPE] +export type KnowledgeSyncType = (typeof KNOWLEDGE_SYNC_TYPE)[keyof typeof KNOWLEDGE_SYNC_TYPE] + export interface KnowledgeItem { application_mapping_count?: number char_length?: number | null diff --git a/ui/src/constants/knowledge.ts b/ui/src/constants/knowledge.ts index 28e83da2fb7..f5e928cd4e8 100644 --- a/ui/src/constants/knowledge.ts +++ b/ui/src/constants/knowledge.ts @@ -6,7 +6,6 @@ export const KNOWLEDGE_TYPE_KEY = { BASE: 'BASE', WEB: 'WEB', LARK: 'LARK', - YUQUE: 'YUQUE', WORKFLOW: 'WORKFLOW', } as const diff --git a/ui/src/router/ROUTE_README.md b/ui/src/router/ROUTE_README.md index ec32b43f315..346fe69dccc 100644 --- a/ui/src/router/ROUTE_README.md +++ b/ui/src/router/ROUTE_README.md @@ -221,6 +221,9 @@ Workspace 页面: /admin/workspace/:workspaceId/knowledge/:knowledgeId/:type /admin/workspace/:workspaceId/knowledge/:knowledgeId/:type/document /admin/workspace/:workspaceId/knowledge/:knowledgeId/:type/setting +/admin/workspace/:workspaceId/knowledge/:knowledgeId/:type/setting/base +/admin/workspace/:workspaceId/knowledge/:knowledgeId/:type/setting/document-strategy +/admin/workspace/:workspaceId/knowledge/:knowledgeId/:type/setting/scheduled-sync /admin/workspace/:workspaceId/knowledge/:knowledgeId/:type/workflow-entry /admin/workspace/:workspaceId/knowledge/:knowledgeId/:type/document/:documentId ``` @@ -344,8 +347,19 @@ System 共享资源页面: 普通和共享文档路由均引用 `library/document/index.vue`,文件分组不增加 URL 层级。 检索优化使用 `/retrieval/recall`、`/retrieval/question`、`/retrieval/dictionary`; 授权与集成使用 `/integration/chat-user`、`/integration/external-retrieval`。 -分组不挂载页面组件,直接访问分组时重定向到首个子页。新增七个页面暂为占位 View。`setting` -渲染 `knowledge-detail/setting/index.vue`,使用容器提供的知识库详情。`workflow-entry` +分组不挂载页面组件,直接访问分组时重定向到首个子页。新增七个页面暂为占位 View。 +设置菜单使用 `detailMenuVisible(params)` 按知识库类型筛选,不增加权限判断: +通用知识库保留单个“设置”,沿用 `/setting` 和 `workspace-knowledge-setting`; +Web 展示“设置 → 基础设置、文档处理策略、定时同步”;飞书和工作流展示 +“设置 → 基础设置、定时同步”。设置分组使用空 path,子页分别使用 +`/setting/base`、`/setting/document-strategy`、`/setting/scheduled-sync`,路由名分别为 +`workspace-knowledge-base-setting`、`workspace-knowledge-document-strategy`、 +`workspace-knowledge-scheduled-sync`。基础设置与通用设置复用 +`knowledge-detail/setting/base/index.vue` 和容器提供的详情,其他两个设置页暂为占位。 +设置路由不配置类型访问守卫,菜单显隐由 `detailMenuVisible` 控制。 +列表设置按钮按知识库类型直接进入通用设置或基础设置。 +`workspace-knowledge-settings` 仅提供菜单分组层级, +命名访问时重定向到基础设置,保留参数、query 和 hash。`workflow-entry` 仅作为目录跳转入口,重定向到独立的 `workflow-knowledge` 全屏画布。画布返回知识库详情。 文档详情路由当前尚未启用;后续接入时通过 `detailActiveMenu` 高亮“文档”。 diff --git a/ui/src/router/admin/workspace/modules/knowledge.ts b/ui/src/router/admin/workspace/modules/knowledge.ts index 755aeafb9e9..c63a993c419 100644 --- a/ui/src/router/admin/workspace/modules/knowledge.ts +++ b/ui/src/router/admin/workspace/modules/knowledge.ts @@ -1,4 +1,5 @@ import type { RouteRecordRaw } from 'vue-router' +import { KNOWLEDGE_TYPE_KEY } from '@/constants/knowledge' export const knowledgeRoutes: RouteRecordRaw[] = [ { @@ -101,8 +102,47 @@ export const knowledgeRoutes: RouteRecordRaw[] = [ { path: 'setting', name: 'workspace-knowledge-setting', - component: () => import('@/views/knowledge-detail/setting/index.vue'), - meta: { title: '设置', icon: 'icon_setting', activeIcon: 'icon_setting_filled', order: 50 }, + 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-knowledge-settings', + redirect: (to) => ({ name: 'workspace-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-knowledge-base-setting', + component: () => import('@/views/knowledge-detail/setting/base/index.vue'), + meta: { title: '基础设置', order: 10 }, + }, + { + path: 'setting/document-strategy', + name: 'workspace-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-knowledge-scheduled-sync', + component: () => import('@/views/knowledge-detail/setting/scheduled-sync/index.vue'), + meta: { title: '定时同步', order: 30 }, + }, + ], }, ], }, diff --git a/ui/src/views/VIEW_README.md b/ui/src/views/VIEW_README.md index 0bbd7e98c91..3c589a94a8b 100644 --- a/ui/src/views/VIEW_README.md +++ b/ui/src/views/VIEW_README.md @@ -217,11 +217,14 @@ src/views/knowledge/ 直接调用 `putReEmbeddingKnowledge`,提交成功后提示“提交成功”;复用页面操作 loading, 阻止重复提交并在请求结束后恢复,不额外增加权限判断或配置弹窗。 `SyncKnowledgeAction` 仅在非共享 Web 知识库菜单展示,不增加权限判断。专属弹窗按需挂载、 -关闭后卸载,默认“替换同步”,也支持“整体同步”,并展示数据覆盖提示;调用 +关闭后卸载,默认“增量同步”,也支持“替换同步”和“整体同步”;增量同步提示跳过未更新文档、 +更新已变更文档的分段,其他方式展示数据覆盖提示;调用 `putSyncWebKnowledge`,成功提示“同步任务发送成功”并关闭。复用页面操作 loading, 提交期间禁止重复提交和关闭,失败保留弹窗与当前选择。 `SettingKnowledgeAction` 暂不增加权限判断,点击后携带当前 -`workspaceId`、知识库 ID 和 `KNOWLEDGE_TYPE_MAP[knowledge.type]` 跳转 `workspace-knowledge-setting`;阻止事件冒泡,避免同时触发卡片详情跳转。 +`workspaceId`、知识库 ID 和 `KNOWLEDGE_TYPE_MAP[knowledge.type]`,通用类型跳转 +`workspace-knowledge-setting`,其他类型直接跳转 `workspace-knowledge-base-setting`; +阻止事件冒泡,避免同时触发卡片详情跳转。 “设置”之后依次组合 `KeywordIndexKnowledgeAction` 和 `McpConfigKnowledgeAction`,接收完整 Knowledge API 并复用页面操作 loading。分词索引不增加确认弹窗,调用成功后只提示“操作成功”; MCP 配置沿用工具的只读文本与悬浮复制交互,专属弹窗按需挂载、关闭后卸载。 @@ -245,6 +248,8 @@ MCP 配置沿用工具的只读文本与悬浮复制交互,专属弹窗按需 通过 `doc_strategy` 提交;智能分段默认策略与后端一致,高级分段使用与触发器类型相同的卡片外壳, 在选中卡片内展开配置,默认选择一级至四级标题标识、500–4096 分段长度、256 子块长度并开启自动清洗。 分段标识支持自定义正则表达式,留空使用后端默认规则;启用视觉增强后必须选择模型或工具。 +视觉模型和工具选项按当前资源范围选择 Workspace、System 资源管理或 System 共享资源的完整 API, +通过 `isSystemResource()`、`isSystemSharedResource()` 判断,供应商继续使用共用 Provider API。 `ButtonCreateKnowledge` 内聚四类创建浮层 Ref 和打开动作,列表页传入目标 `folderId`,通过 `refresh` 刷新列表。入口支持 `trigger` 插槽替换默认创建按钮,下拉使用 `persistent`。 @@ -448,7 +453,9 @@ Dialog。新增或重命名文件时,应同步更新所有导入和页面功 | `home/index.vue` | Workspace 首页 | | `knowledge/index.vue` | 工作空间知识库目录与知识库卡片页面 | | `knowledge-detail/index.vue` | 知识库详情页面 | -| `knowledge-detail/setting/index.vue` | 知识库基本信息、来源配置与上传限制设置 | +| `knowledge-detail/setting/base/index.vue` | 知识库基本信息、来源配置与上传限制设置 | +| `knowledge-detail/setting/document-strategy/index.vue` | Web 知识库文档处理策略占位页面 | +| `knowledge-detail/setting/scheduled-sync/index.vue` | Web、飞书与工作流知识库定时同步占位页面 | | `login/index.vue` | Admin 登录页面 | | `login/forgot-password/index.vue` | 忘记密码页面 | | `model/index.vue` | 工作空间模型目录与模型卡片页面 | @@ -694,7 +701,12 @@ Workspace API 内部通过 `getWorkspaceId()` 读取当前路由工作空间。 图片、标签管理及这五个页面暂只展示占位内容。 容器通过 `knowledge-detail/context.ts` 提供只读详情与替换能力;设置页复用已加载详情,保存成功后 更新容器数据,同步名称等展示。基本信息复用创建流程的 `KnowledgeBaseForm`,类型配置和校验留在 -设置页中。当前设置页仅接入 Workspace 路由和 API,暂不增加前端权限判断。 +`setting/base/index.vue` 中,通用知识库标题为“设置”,其他类型为“基础设置”。 +通用知识库只有单个设置菜单;Web 的设置分组包含基础设置、文档处理策略、定时同步, +飞书和工作流包含基础设置、定时同步。`setting/document-strategy/` 与 +`setting/scheduled-sync/` 分别承接文档处理策略和定时同步,当前仅展示占位内容。 +设置菜单的类型筛选由路由维护,不在 View 中重复维护菜单。 +当前设置页仅接入 Workspace 路由和 API,暂不增加前端权限判断。 更换向量模型需确认,先保存再重新向量化,整条流程禁止重复提交;向量化失败时保留原模型比较基准, 允许再次保存重试。Web、飞书设置保留未编辑的 `meta` 字段,上传限制使用详情顶层值。 `knowledge-detail/library/document/index.vue` 维护文档列表查询、多选和文档操作,使用 `MkComplexSearch`、`MkTable`。 diff --git a/ui/src/views/knowledge-detail/library/document/index.vue b/ui/src/views/knowledge-detail/library/document/index.vue index 26357dee88e..004b80948a9 100644 --- a/ui/src/views/knowledge-detail/library/document/index.vue +++ b/ui/src/views/knowledge-detail/library/document/index.vue @@ -444,7 +444,7 @@ onBeforeUnmount(() => { /> --> +import type { ResourceDetailPageProps } from '@/layout/ResourceDetailLayout.vue' + +defineOptions({ name: 'KnowledgeDocumentStrategyView' }) + +defineProps() + + + diff --git a/ui/src/views/knowledge-detail/setting/scheduled-sync/index.vue b/ui/src/views/knowledge-detail/setting/scheduled-sync/index.vue new file mode 100644 index 00000000000..62ab7ba098b --- /dev/null +++ b/ui/src/views/knowledge-detail/setting/scheduled-sync/index.vue @@ -0,0 +1,11 @@ + + + diff --git a/ui/src/views/knowledge/create-knowledge/components/DocumentStrategyForm.vue b/ui/src/views/knowledge/create-knowledge/components/DocumentStrategyForm.vue index ba6013a95f2..d95d031c222 100644 --- a/ui/src/views/knowledge/create-knowledge/components/DocumentStrategyForm.vue +++ b/ui/src/views/knowledge/create-knowledge/components/DocumentStrategyForm.vue @@ -3,9 +3,14 @@ import { computed, onMounted, reactive, ref } from 'vue' import type { FormInstance, FormRules } from 'element-plus' import type { DocumentStrategy, ModelItem, ModelProviderItem, ToolItem } from '@/api/types' import ModelApi from '@/api/admin/workspace/model' +import SystemResourceModelApi from '@/api/admin/system/resource-management/model' +import SystemSharedModelApi from '@/api/admin/system/shared-resources/model' import ProviderApi from '@/api/admin/model-provider' import ToolApi from '@/api/admin/workspace/tool/tool' +import SystemResourceToolApi from '@/api/admin/system/resource-management/tool/tool' +import SystemSharedToolApi from '@/api/admin/system/shared-resources/tool/tool' import SelectModel from '@/components/business/select-model/index.vue' +import { isSystemResource, isSystemSharedResource } from '@/utils/resource-context' defineOptions({ name: 'DocumentStrategyForm' }) @@ -61,6 +66,16 @@ function getStrategy(): DocumentStrategy { } /* 视觉模型与工具选项 */ +const requestModelApi = computed(() => { + if (isSystemResource()) return SystemResourceModelApi + if (isSystemSharedResource()) return SystemSharedModelApi + return ModelApi +}) +const requestToolApi = computed(() => { + if (isSystemResource()) return SystemResourceToolApi + if (isSystemSharedResource()) return SystemSharedToolApi + return ToolApi +}) const optionsLoading = ref(false) const modelOptions = ref([]) const providerOptions = ref([]) @@ -69,9 +84,9 @@ const selectedVisualTool = computed(() => toolOptions.value.find((tool) => tool. function loadOptions() { optionsLoading.value = true return Promise.all([ - ModelApi.getModelListWithShared({ model_type: 'IMAGE' }), + requestModelApi.value.getModelListWithShared({ model_type: 'IMAGE' }), ProviderApi.getProviderList({ model_type: 'IMAGE' }), - ToolApi.getToolListWithShared(), + requestToolApi.value.getToolListWithShared(), ]) .then(([models, providers, tools]) => { modelOptions.value = models diff --git a/ui/src/views/knowledge/index.vue b/ui/src/views/knowledge/index.vue index 926912d9c5f..c87f444f7a0 100644 --- a/ui/src/views/knowledge/index.vue +++ b/ui/src/views/knowledge/index.vue @@ -231,7 +231,7 @@ function handleBatchDelete() { -

注意:所有同步都会删除已有数据重新获取新数据,请谨慎操作。

+

+ {{ + syncType === KNOWLEDGE_SYNC_TYPE.INCREMENTAL + ? '注意:增量同步会跳过内容无更新的文档,内容有更新时会更新文档的分段,请谨慎操作。' + : '注意:同步会删除已有数据重新获取新数据,请谨慎操作。' + }} +