Skip to content

Commit 27a6ca0

Browse files
committed
feat: database tags management
1 parent 7069f03 commit 27a6ca0

9 files changed

Lines changed: 898 additions & 13 deletions

File tree

‎ui/src/api/API_README.md‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,29 @@ System 接口由资源管理服务提供;本地开源后端没有对应扩展
619619
文档页传 `resource_type: 'document'`,创建者选项复用 Workspace `common.ts` 的 `getAllUsers`。
620620
类型从 `@/api/types` 导入,命中处理枚举从 `@/api/enums` 导入。API 不接收 loading,不重复包装响应。
621621

622+
### 知识库标签与文档关联
623+
624+
`workspace/knowledge/tags.ts` 维护标签创建、编辑和删除,前缀为
625+
`/workspace/<workspaceId>/knowledge/<knowledgeId>/tags`,工作空间由 `getWorkspaceId()` 读取。
626+
标签查询暂保留在 `workspace/knowledge/knowledge.ts`,`getKnowledgeTags(knowledgeId)` 返回非分页 `KnowledgeTagGroup[]`;
627+
标签值中的可选 `doc_count` 表示关联文档数量。`postKnowledgeTags` 直接提交
628+
`KnowledgeTagPayload[]`(`key`、`value`),用于创建标签和新增标签值;
629+
`putKnowledgeTag` 向 `/<tagId>` 提交 `KnowledgeTagUpdatePayload`(`id`、`key`、`value`),仅用于已有的单项编辑。
630+
`deleteKnowledgeTag` 按路径末尾 `key` 删除整个标签、`one` 删除单个标签值;
631+
`putBatchDeleteKnowledgeTags` 使用 PUT `batch_delete`,请求体直接为标签 ID 数组,不包装为 `id_list`。
632+
标签类型统一维护在 `types/knowledge.ts`。多行编辑等待 V3 新协议,不组合旧接口模拟整组保存,
633+
也不声明推测的新接口;导入、模板下载尚未接入,三个待接请求入口的页面状态处理已预留。
634+
635+
文档与标签的关联由 `workspace/knowledge/document.ts` 维护,不使用标签删除接口代替取消关联。
636+
`getDocumentTags` 查询 `document/<documentId>/tags`,返回分组标签;
637+
`postAddDocumentTags` POST 到 `document/batch_add_tag`,提交 `{ document_ids, tag_ids }`;
638+
`putDeleteDocumentTags` PUT 到 `document/<documentId>/tags/batch_delete`,直接提交标签 ID 数组。
639+
`putUnlinkTagDocuments` PUT 到知识库下的 `tag/<tagId>/docs_delete`,提交 `{ id_list: documentIds }`,
640+
用于取消同一标签与单个或多个文档的关联。
641+
关联文档列表复用 `getDocumentPage`,传 `resource_type: 'document'`、`tags: [tagId]`,
642+
未关联列表另传 `tag_exclude: true`;标签数组沿用请求层的 `tags[]` 序列化。
643+
名称使用 `name`;关联文档抽屉不传 `order_by`,按接口默认顺序展示。
644+
622645
### 工作空间共享资源查询
623646

624647
`workspace/shared/` 按最终资源文件拆分:`model.ts` 提供 `getModelList`,`tool.ts` 提供

‎ui/src/api/admin/workspace/knowledge/document.ts‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import type {
1616
WebDocumentImportPayload,
1717
LarkDocumentList,
1818
LarkDocumentImportPayload,
19+
KnowledgeTagGroup,
1920
} from '@/api/types'
2021
import { getWorkspaceId } from '@/utils/resource-context'
2122

@@ -154,7 +155,26 @@ const postReplaceDocumentSource = (knowledgeId: string, documentId: string, file
154155
return post(`${getPrefix(knowledgeId)}/${documentId}/replace_source_file`, data)
155156
}
156157

158+
/** 查询文档当前标签。 */
159+
const getDocumentTags = (knowledgeId: string, documentId: string) => get<KnowledgeTagGroup[]>(`${getPrefix(knowledgeId)}/${documentId}/tags`)
160+
161+
/** 给指定文档批量添加已有标签。 */
162+
const postAddDocumentTags = (knowledgeId: string, documentIds: string[], tagIds: string[]) =>
163+
post(`${getPrefix(knowledgeId)}/batch_add_tag`, { document_ids: documentIds, tag_ids: tagIds })
164+
165+
/** 从单个文档移除指定标签,不删除标签本身。 */
166+
const putDeleteDocumentTags = (knowledgeId: string, documentId: string, tagIds: string[]) =>
167+
put(`${getPrefix(knowledgeId)}/${documentId}/tags/batch_delete`, tagIds)
168+
169+
/** 取消指定标签与单个或多个文档的关联。 */
170+
const putUnlinkTagDocuments = (knowledgeId: string, tagId: string, documentIds: string[]) =>
171+
put(`/workspace/${getWorkspaceId()}/knowledge/${knowledgeId}/tag/${tagId}/docs_delete`, { id_list: documentIds })
172+
157173
export default {
174+
getDocumentTags,
175+
postAddDocumentTags,
176+
putDeleteDocumentTags,
177+
putUnlinkTagDocuments,
158178
getDocumentPage,
159179
putBatchCreateDocuments,
160180
postSplitDocuments,
Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,29 @@
1-
/** 查询文档当前标签。 */
2-
const getDocumentTags = (knowledgeId: string, documentId: string) => get<KnowledgeTagGroup[]>(`${getPrefix(knowledgeId)}/${documentId}/tags`)
1+
import { del, post, put } from '../../core/request'
2+
import type { KnowledgeTagPayload, KnowledgeTagUpdatePayload } from '@/api/types'
3+
import { getWorkspaceId } from '@/utils/resource-context'
34

4-
/** 批量添加文档标签。 */
5-
const postAddDocumentTags = (knowledgeId: string, documentIds: string[], tagIds: string[]) =>
6-
post(`${getPrefix(knowledgeId)}/batch_add_tag`, { document_ids: documentIds, tag_ids: tagIds })
5+
const getPrefix = (knowledgeId: string) => `/workspace/${getWorkspaceId()}/knowledge/${knowledgeId}/tags`
76

8-
/** 移除文档标签关联。 */
9-
const putDeleteDocumentTags = (knowledgeId: string, documentId: string, tagIds: string[]) =>
10-
put(`${getPrefix(knowledgeId)}/${documentId}/tags/batch_delete`, tagIds)
7+
// TODO:接入标签导入、模板下载、整组/多行编辑接口。
8+
// 请求路径、参数和响应类型以 V3 接口协议为准。
9+
10+
/** 创建知识库标签或为已有标签新增值。 */
11+
const postKnowledgeTags = (knowledgeId: string, tags: KnowledgeTagPayload[]) => post<KnowledgeTagPayload[], void>(getPrefix(knowledgeId), tags)
12+
13+
/** 编辑单个知识库标签,不支持多行编辑。 */
14+
const putKnowledgeTag = (knowledgeId: string, tagId: string, tag: KnowledgeTagUpdatePayload) =>
15+
put<KnowledgeTagUpdatePayload, void>(`${getPrefix(knowledgeId)}/${tagId}`, tag)
16+
17+
/** 删除整个标签分组或单个标签值。 */
18+
const deleteKnowledgeTag = (knowledgeId: string, tagId: string, type: 'key' | 'one') =>
19+
del<undefined, void>(`${getPrefix(knowledgeId)}/${tagId}/${type}`)
20+
21+
/** 批量删除所选标签,直接提交标签 ID 数组。 */
22+
const putBatchDeleteKnowledgeTags = (knowledgeId: string, tagIds: string[]) => put<string[], void>(`${getPrefix(knowledgeId)}/batch_delete`, tagIds)
23+
24+
export default {
25+
postKnowledgeTags,
26+
putKnowledgeTag,
27+
deleteKnowledgeTag,
28+
putBatchDeleteKnowledgeTags,
29+
}

‎ui/src/api/types/knowledge.ts‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,18 @@ export interface KnowledgeDetail extends KnowledgeItem {
5555
/** 按标签名称分组的知识库标签。 */
5656
export interface KnowledgeTagGroup {
5757
key: string
58-
values: { id: string; value: string; create_time: string; update_time: string }[]
58+
values: { id: string; value: string; doc_count?: number; create_time: string; update_time: string }[]
59+
}
60+
61+
/** 创建知识库标签的名称和值。 */
62+
export interface KnowledgeTagPayload {
63+
key: string
64+
value: string
65+
}
66+
67+
/** 编辑单个知识库标签,保留现有接口的 ID 字段。 */
68+
export interface KnowledgeTagUpdatePayload extends KnowledgeTagPayload {
69+
id: string
5970
}
6071

6172
/** 知识库工作流任务状态。 */

‎ui/src/views/VIEW_README.md‎

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,7 @@ Dialog。新增或重命名文件时,应同步更新所有导入和页面功
474474
| `home/index.vue` | Workspace 首页 |
475475
| `knowledge/index.vue` | 工作空间知识库目录与知识库卡片页面 |
476476
| `knowledge-detail/index.vue` | 知识库详情页面 |
477+
| `knowledge-detail/library/tags/index.vue` | 标签分组查询、创建、单值编辑、删除与关联文档管理 |
477478
| `knowledge-detail/setting/base/index.vue` | 知识库基本信息、来源配置与上传限制设置 |
478479
| `knowledge-detail/setting/document-strategy/index.vue` | Web 知识库文档处理策略回填、校验与保存 |
479480
| `knowledge-detail/setting/scheduled-sync/index.vue` | Web、飞书与工作流知识库定时同步设置与日志 |
@@ -717,9 +718,9 @@ Workspace API 内部通过 `getWorkspaceId()` 读取当前路由工作空间。
717718
`ResourceDetailLayout` 生成资料库、工作流、检索优化、授权与集成、设置目录,返回列表时恢复所属文件夹。
718719
资料库包含文档、图片、标签管理;检索优化包含召回测试、问题、自定义分词;授权与集成包含
719720
对话用户、外部检索服务。资料库页面统一放在 `knowledge-detail/library/` 下,包含 `document/`、
720-
`image/`、`tag/`;文档专属组件及 Action 随 `document/` 集中维护。其他页面继续放在
721+
`image/`、`tags/`;文档专属组件及 Action 随 `document/` 集中维护。其他页面继续放在
721722
`knowledge-detail/` 下的 `recall-test/`、`question/`、`dictionary/`、`chat-user/`、`external-retrieval/`。
722-
图片、标签管理及这五个页面暂只展示占位内容。
723+
图片及这五个页面暂只展示占位内容。
723724
容器通过 `knowledge-detail/context.ts` 提供只读详情与替换能力;设置页复用已加载详情,保存成功后
724725
更新容器数据,同步名称等展示。基本信息复用创建流程的 `KnowledgeBaseForm`,类型配置和校验留在
725726
`setting/base/index.vue` 中,通用知识库标题为“设置”,其他类型为“基础设置”。
@@ -843,6 +844,44 @@ Action 仍通过上层 `action-dropdown/index.ts` 导出,弹窗仅在目录内
843844

844845
文档详情路由暂未启用,System 知识库详情路由暂未注册。
845846

847+
### 资料库标签管理
848+
849+
`knowledge-detail/library/tags/index.vue` 复用详情布局的 `customHeader` 与 Teleport,
850+
维护搜索、导入入口、创建入口和标签表格,不嵌套页面布局或修改路由。
851+
通过 `workspace/knowledge/knowledge.ts` 查询全量分组,前端按标签名或值搜索并保留完整命中分组;
852+
先按标签组分页,再展开各组标签值,分页总数为标签组数。
853+
`MkTable` 合并选择列和标签名,选择行为与工作空间成员表格一致,不额外联动同组记录;
854+
批量底栏按实际选中记录数统计,删除确认明确影响所选记录所属标签及其全部值。
855+
标签名旁提供新增值、编辑标签、删除标签;行末提供编辑值和删除值,
856+
数量链接打开同目录 `TagDocumentDrawer.vue`。
857+
858+
`library/tags/components/TagFormDialog.vue` 为标签管理和后续文档入口共用的创建、编辑弹窗,
859+
接收知识库 ID 与完整 Tags API,参考添加成员流程复用 `MkDialog`、`el-form` 和 `MkFormList`。
860+
创建允许多行标签名与值;新增值锁定标签名;编辑值回填单项并锁定标签名。
861+
标签名最多 64 字、标签值最多 128 字,校验必填、纯空白和表单内重复组合。
862+
创建与单个已有标签值编辑使用已确认接口;整组编辑或编辑中增删行走独立请求入口,
863+
保留编辑前快照、已有 ID 与清理首尾空格后的当前草稿,交由请求入口按 V3 协议映射参数。
864+
所有分支共用校验、loading、成功关闭和刷新;多行接口未接入时仅提示并保留草稿,
865+
不即时删除、不拼接多次旧请求、不模拟成功。
866+
常驻弹窗在 `closed` 清理草稿和校验。
867+
868+
`library/tags/components/ButtonImportTags.vue` 在同一组件内维护导入按钮与弹窗,
869+
复用 `MkDialog`、`el-form` 和 `MkDragUpload`,不再单独拆分导入 Dialog。
870+
支持单个 XLS、XLSX 文件的选择、拖拽、更换、删除及必填校验,关闭后清理文件和校验状态。
871+
接收知识库 ID 与完整 Tags API,页面监听 `refresh` 重新查询标签列表;已预接提交 loading、重复提交保护、
872+
成功提示和关闭弹窗,失败保留文件。模板下载有独立 loading 和重复点击保护,下载期间禁止提交与关闭,
873+
结束后恢复状态,不关闭弹窗或刷新列表。导入、模板下载接口尚未确认,真实请求保留 TODO;
874+
请求占位返回 `undefined` 时仅提示尚未接入,不发送请求、不模拟成功或刷新列表。
875+
876+
`TagDocumentDrawer.vue` 接收知识库 ID 与完整 Document API,通过 `open(tag)` 固定当前标签,
877+
以“已关联文档/未关联文档”两页签共用表格,提供搜索、启用状态筛选、分页、单个与批量关联/取消关联;创建时间仅展示,不提供排序入口。
878+
启用状态复用 `MkTableFilter mode="single"`,支持全部、已启用、已禁用;查询传布尔 `is_active`,全部时省略。
879+
名称或状态筛选后回到第一页并清空选择,切换页签时重置筛选条件。
880+
文档图标和时间格式沿用文档列表,状态使用 `MkStatusLabel`;批量操作放在顶部,不再显示页面批量底栏。
881+
搜索、分页和页签切换清空选择,关联变更后重新查询并通知标签页刷新数量,末页为空时回退。
882+
抽屉在 `closed` 重置标签、筛选、分页和选择,不新增权限判断或共享范围接口。
883+
文档页原有标签查询继续使用 Knowledge API,共享标签查询保持原接口,不启用尚未接入的文档标签入口。
884+
846885
`KnowledgeWorkflowView` 复用 `ButtonDefaultModelSetting`,从知识库详情读取默认模型配置,
847886
随工作流保存提交并将配置传入画布;支持应用到所有节点,保存失败回滚至已保存配置。
848887

0 commit comments

Comments
 (0)