【知识中心】知识库管理
知识库管理属于知识中心,由 yudao-module-pms 后端模块的 kb.library 包实现,前端实现在 @/views/pms/kb/library 和 @/views/pms/kb/library-template 目录。
知识库是知识中心的业务数据边界。一个知识库包含文件夹、富文本文档和文件;私有知识库由成员决定进入范围,公开知识库对登录用户开放,具体内容协作再由内容权限控制。
- 知识库:维护名称、封面、简介和公开 / 私有可见范围,并进入知识库工作区管理内容。
- 知识库成员:维护创建人、管理员和普通成员,也可以按部门加入成员。
- 个人分组:在「全部知识库」「未分组」之外自定义个人分组并调整顺序,不影响其他用户。
- 知识库模板:维护模板基本信息和默认文档,在新建知识库时选择并复制到知识库根目录。
本文只介绍知识库容器及其设置。文件夹、文档编辑、内容协作权限、评论、分享、标签、最近使用和回收站,详见 《【知识中心】文档与协作》。
本文涉及表如下图所示:
上图同时展示了文件夹、文档和内容权限等相邻表,便于理解 library_id 的归属关系。本篇涉及的核心表共 5 张,按下文的章节顺序分为三组:
- 知识库与成员:
pms_knowledge_library知识库主表、pms_knowledge_library_member知识库成员。 - 个人分组:
pms_knowledge_group个人分组、pms_knowledge_group_relation分组与知识库的关系。 - 知识库模板:
pms_knowledge_library_template模板及其默认文档。
# 1. 知识库
知识库,由 PmsKnowledgeLibraryController 提供接口(/pms/kb/library);成员权限由 PmsKnowledgeLibraryMemberService 校验,删除由 PmsKnowledgeRecycleService 负责移入回收站。
# 1.1 表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
CREATE TABLE `pms_knowledge_library` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(255) NOT NULL COMMENT '知识库名称',
`description` varchar(300) DEFAULT NULL COMMENT '知识库简介',
`cover_url` varchar(255) DEFAULT NULL COMMENT '封面地址',
`open_status` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否公开',
`status` int NOT NULL DEFAULT 1 COMMENT '知识库状态',
`delete_user_id` bigint DEFAULT NULL COMMENT '删除人用户编号',
`delete_time` datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='PMS 知识库';
① open_status = 0 表示私有,只有知识库成员或超级管理员可以读取;open_status = 1 表示公开,所有登录用户可以读取,但内容是否可以协作由内容权限的 open_level 决定。根目录新增内容仍需要知识库写权限。公开库改为私有时,只允许创建人或超级管理员执行。
② 创建人使用 BaseDO 的 creator 审计字段保存,不额外冗余创建人字段,响应中以 creatorUserId 返回。
③ delete_user_id 和 delete_time 记录移入回收站的操作者及时间,deleted 仍由平台逻辑删除机制维护。删除知识库不是物理删除,回收站服务会同步把文件夹和文档标记为回收状态。
④ 枚举 status 知识库状态(PmsKnowledgeDocumentStatusEnum)。详见 §1.2 状态流转。
该表包含两个子表:
pms_knowledge_library_member(知识库成员):在【成员管理】弹窗中维护,保存后台用户或部门在该知识库中的成员等级,详见 §2.1 表结构。pms_knowledge_group_relation(个人分组关系):在知识库列表【移动分组】时维护,属于当前用户维度,详见 §3.1 表结构。
# 1.2 状态流转
知识库生命周期由 PmsKnowledgeLibraryServiceImpl 和 PmsKnowledgeRecycleService 控制。状态字段为 status,与文件夹、文档共用同一套枚举,列表只查询正常状态的知识库:
| 状态值 | 枚举 | 页面状态 | 可执行操作 |
|---|---|---|---|
-1 | RECYCLED | 回收站 | 在「最近删除」中恢复或彻底删除 |
0 | DRAFT | 草稿 | 保留枚举兼容,当前创建流程不会写入 |
1 | NORMAL | 正常 | 查询、编辑、成员管理、移动分组、进入内容 |
2 | TEMPLATE | 模板 | 知识库模板使用独立表,不作为知识库列表状态 |
状态流转说明
新建知识库 ──→ 正常(1) ──删除──→ 回收站(-1) ──彻底删除(终态)
↑ │
└──────── 恢复 ─────┘
- 新建(
createLibrary):Service 强制设置为正常,创建请求不能自行指定状态,并在同一事务中写入创建人和初始成员。 - 删除(
deleteLibrary):只有创建人或超级管理员可以执行,会把知识库及其内容一起移入回收站。 - 恢复与彻底删除:由回收站服务和 [知识中心 -> 最近删除] 页面处理,详见 《【知识中心】文档与协作》。
- 知识库没有停用按钮;公开 / 私有是可见范围
open_status,不等同于生命周期状态。
# 1.3 管理后台
对应 [PMS 项目管理 -> 知识中心 -> 知识库] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/pms/kb/library 目录。页面由 index.vue、KnowledgeLibraryForm.vue、KnowledgeGroupForm.vue 和 KnowledgeGroupManageDialog.vue 组成。
# 列表
页面左侧为当前用户的个人分组,右侧为知识库列表。查询区域支持按知识库名称搜索;表格展示封面、名称、简介、可见范围、成员数、文档数、文件数、创建人、创建时间和是否关注。
操作按钮按当前用户在该知识库中的身份显示:可写显示【移动分组】,管理员显示【编辑】,创建人显示【删除】,非创建人的直接成员显示【退出】。

# 新增
点击【新建知识库】打开 KnowledgeLibraryForm.vue,分为「选择知识库模板」和「知识库基础信息」两步:
① 第一步加载已开启的模板,左侧选择「空白知识库」或某个模板,右侧预览模板简介和文档标题。选择空白知识库时不创建默认文档。
② 点击【下一步】进入基础信息,填写知识库名称、封面、简介和可见范围,并可使用 System 模块的 UserSelectV2.vue 设置初始管理员和普通成员。创建人由后端自动加入,不需要再次选择当前用户。
③ 选择了模板时,模板中的文档会在知识库根目录生成独立的富文本文档,之后与模板不再关联。

# 修改
知识库管理员点击【编辑】,复用同一个 KnowledgeLibraryForm.vue 回显资料。管理员可以修改名称、封面和简介;公开库改为私有必须由创建人或超级管理员操作。保存不会改变成员关系、文档内容和模板记录。
# 删除
知识库创建人点击【删除】并二次确认后,后端再次校验创建人或超级管理员权限,然后把知识库及内容移入回收站。列表不提供普通成员或管理员直接删除知识库的入口。
# 进入知识库
点击知识库名称进入知识库工作区(@/views/pms/kb/document/index.vue)。知识库详情、文件夹详情和文档详情三个隐藏路由都设置 activeMenu: '/pms/kb/library',因此进入详情或直接粘贴详情地址访问时,左侧「知识库」菜单仍保持高亮。
工作区中的目录树、文档编辑、协作权限和分享,详见 《【知识中心】文档与协作》。

# 2. 知识库成员
知识库成员,由 PmsKnowledgeLibraryMemberController 提供接口(/pms/kb/library-member),读取、写入和退出规则由 PmsKnowledgeLibraryMemberServiceImpl 统一校验。
# 2.1 表结构
CREATE TABLE `pms_knowledge_library_member` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`library_id` bigint NOT NULL COMMENT '知识库编号',
`user_id` bigint DEFAULT NULL COMMENT '用户编号',
`dept_id` bigint DEFAULT NULL COMMENT '部门编号',
`level` int NOT NULL COMMENT '成员等级',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='PMS 知识库成员';
① library_id 关联 pms_knowledge_library 表的 id 字段,user_id 关联 system_users 表的 id 字段,dept_id 关联 system_dept 表的 id 字段。一条记录只能表示一个直接用户或一个直接部门,两者不能同时填写,也不能同时为空。
② 枚举 level 成员等级(PmsKnowledgeLibraryMemberLevelEnum):
| 值 | 枚举 | 说明 | 读取知识库 | 内容协作 | 维护资料和成员 | 删除知识库 |
|---|---|---|---|---|---|---|
1 | CREATOR | 创建人 | ✓ | ✓ | ✓ | ✓ |
2 | ADMIN | 管理员 | ✓ | ✓ | ✓ | — |
3 | MEMBER | 普通成员 | ✓ | ✓(受内容权限限制) | — | — |
③ 创建知识库时系统自动插入创建人,初始管理员和普通成员由新增表单传入。
④ 部门成员表示该部门的直接成员可以访问知识库,表中没有「包含子部门」的字段;如果需要包含子部门,应由部门选择器和业务规则在部署时明确处理,不能根据本表推断继承关系。
⑤ 私有知识库要求当前用户是直接用户成员、直接部门成员或超级管理员;公开知识库的读取范围不要求加入成员。isLibraryWritable 的业务定义是「当前用户属于知识库成员即可写入内容」,文件夹和文档的具体动作还会继续校验内容级权限。
# 2.2 管理后台
编辑知识库时,管理员点击【成员管理】打开 KnowledgeMemberForm.vue,使用 System 模块的 UserSelectV2.vue 和 DeptSelect.vue 选择用户或部门,表格展示成员类型、成员、角色和移除操作。
① 创建人固定显示,不能修改角色、移除或主动退出;管理员可以新增用户或部门,并在「管理员」和「普通成员」之间切换。
② 点击【添加成员】后选择「成员」或「部门」,填写对应对象并选择角色。前端先校验必填和重复,后端再次校验用户、部门存在性,并禁止伪造创建人等级。
③ 保存时按本次完整列表重建管理员和普通成员,保留创建人。被移出的用户和部门,其文档级协作权限也会由 PmsKnowledgeContentPermissionService 一并清理。
④ 非创建人的直接成员可以在知识库列表点击【退出】。创建人不能退出,部门继承成员也不能代替直接用户执行退出。

# 3. 个人分组
个人分组,由 PmsKnowledgeGroupController 提供接口(/pms/kb/group)。分组是当前用户的个人视图,不是知识库的公共属性,也不改变其他成员看到的分组。
# 3.1 表结构
个人分组表 pms_knowledge_group,保存当前用户自定义的分组:
CREATE TABLE `pms_knowledge_group` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`user_id` bigint NOT NULL COMMENT '用户编号',
`name` varchar(100) NOT NULL COMMENT '分组名称',
`type` tinyint NOT NULL DEFAULT 3 COMMENT '分组类型',
`sort` int NOT NULL DEFAULT 0 COMMENT '显示顺序',
PRIMARY KEY (`id`),
KEY `idx_group_tenant_user_type` (`tenant_id`, `user_id`, `type`),
KEY `idx_group_tenant_user_sort` (`tenant_id`, `user_id`, `sort`)
) ENGINE=InnoDB COMMENT='PMS 知识库个人分组';
分组关系表 pms_knowledge_group_relation,保存分组与知识库的对应关系:
CREATE TABLE `pms_knowledge_group_relation` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`user_id` bigint NOT NULL COMMENT '用户编号',
`group_id` bigint NOT NULL COMMENT '分组编号',
`library_id` bigint NOT NULL COMMENT '知识库编号',
`sort` int NOT NULL DEFAULT 0 COMMENT '显示顺序',
PRIMARY KEY (`id`),
KEY `idx_group_relation_tenant_user_group_library` (`tenant_id`, `user_id`, `group_id`, `library_id`),
KEY `idx_group_relation_tenant_user_library` (`tenant_id`, `user_id`, `library_id`),
KEY `idx_group_relation_tenant_library` (`tenant_id`, `library_id`)
) ENGINE=InnoDB COMMENT='PMS 知识库个人分组关系';
① user_id 关联 system_users 表的 id 字段,group_id 关联 pms_knowledge_group 表的 id 字段,library_id 关联 pms_knowledge_library 表的 id 字段。分组数据按「租户 + 用户」隔离,user_id + library_id 确定当前用户对某知识库的分组关系。
② 枚举 type 分组类型(PmsKnowledgeGroupTypeEnum):
| 值 | 枚举 | 说明 | 能否编辑 / 删除 | 能否作为移动目标 |
|---|---|---|---|---|
1 | ALL | 全部知识库 | — | —(只是查询范围) |
2 | UNGROUPED | 未分组 | — | ✓(用于清除分组关系) |
3 | CUSTOM | 自定义分组 | ✓ | ✓ |
③ getGroupList 首次查询时,如果两个系统分组缺失才会补齐「全部知识库」和「未分组」。自定义分组名称在同一用户下唯一,新增时 Service 会去除首尾空格并追加到已有分组末尾。
④ 分组数量只统计当前用户可读的正常知识库,公开库也会计入「全部知识库」;「未分组」数量等于可读总数减去已有分组关系数。
⑤ 删除自定义分组时只删除分组关系,知识库自动回到「未分组」。
# 3.2 管理后台
知识库列表顶部提供【新建分组】和【管理分组】按钮,均在 @/views/pms/kb/library/index.vue 内完成,不增加独立的左侧菜单。两个按钮的位置见 §1.3 管理后台 的知识库列表截图。
# 新建与修改
点击【新建分组】打开 KnowledgeGroupForm.vue 填写分组名称;在分组管理弹窗中点击【编辑】修改名称。名称为空、重复或操作系统分组时,Service 返回业务异常。

# 排序与删除
点击【管理分组】打开 KnowledgeGroupManageDialog.vue。表格支持拖动自定义分组,点击【保存排序】保存新顺序。删除自定义分组时,确认提示会说明该分组下的知识库将回到「未分组」。

# 移动知识库
知识库列表的【移动分组】下拉菜单会过滤「全部知识库」,选择「未分组」等同于移出当前自定义分组。该操作只修改当前用户的分组关系,不修改知识库本身。
# 4. 知识库模板
知识库模板,由 PmsKnowledgeLibraryTemplateController 提供接口(/pms/kb/library-template)。模板用于新建知识库时一次性复制默认文档,之后与知识库不再有关联。
# 4.1 表结构
CREATE TABLE `pms_knowledge_library_template` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(100) NOT NULL COMMENT '模板名称',
`description` varchar(500) DEFAULT NULL COMMENT '模板简介',
`cover_url` varchar(255) DEFAULT NULL COMMENT '封面地址',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态',
`sort` int NOT NULL DEFAULT 0 COMMENT '显示顺序',
`documents` longtext NOT NULL COMMENT '默认文档 JSON',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='PMS 知识库模板';
① 模板名称由 Service 在当前租户内校验唯一。
② status 使用通用状态:0 开启、1 停用。只有开启状态的模板会出现在新建知识库的选择器中;停用模板仍保留配置,也不会影响已经由它生成的知识库文档。
③ documents 使用 JacksonTypeHandler 保存 JSON 数组。模板至少包含一篇文档,标题和正文不能为空,标题不能重复。
documents JSON 字段结构
[
{
"title": "项目说明",
"content": "<h1>项目说明</h1><p>请在此处补充项目背景。</p>"
},
{
"title": "使用规范",
"content": "<p>请填写团队协作规范。</p>"
}
]
① title 是创建后文档的标题,content 是富文本初始内容。模板的下拉接口只返回标题,不返回正文,正文在点击【确定】创建知识库时才复制。
② 选择模板创建知识库时,Service 为每个元素调用 PmsKnowledgeDocumentService 的 createDocument,在知识库根目录建立独立文档。后续编辑文档不会回写模板,修改模板也不会影响已经创建的知识库。
# 4.2 管理后台
对应 [PMS 项目管理 -> 知识中心 -> 知识库模板] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/pms/kb/library-template 目录。
# 列表
支持按模板名称和状态筛选,展示模板名称、描述、状态、排序和创建时间。

# 新增与修改
点击【新增】或【编辑】打开 KnowledgeLibraryTemplateForm.vue,填写名称、状态、封面、描述和排序,并在文档编辑器弹窗中维护至少一篇文档。保存时后端重新校验模板名称、文档标题唯一性和正文非空。

# 删除与停用
点击【删除】使用平台逻辑删除,模板不再出现在列表和新建知识库的模板选择步骤中。停用只修改 status,不会删除已经由模板生成的知识库文档;如果只需暂时隐藏,应使用停用而不是删除。
# 5. 创建和使用流程
新建知识库
├─ 选择空白或已开启模板
├─ 保存知识库基本资料
├─ 自动加入创建人、初始管理员和普通成员
└─ 选择模板时复制根目录文档
↓
知识库列表
├─ 公开库 / 已加入的私有库进入可读范围
├─ 当前用户按个人分组筛选
└─ 点击名称进入内容树
↓
知识库工作区
├─ 文件夹和文档继续校验知识库成员权限
├─ 内容协作权限控制具体动作
└─ 删除内容或知识库进入回收站