【知识中心】文档与协作
文档与协作属于知识中心,由 yudao-module-pms 后端模块的 kb.content、kb.interaction、kb.recycle 包实现,前端实现在 @/views/pms/kb/document、@/views/pms/kb/favorite、@/views/pms/kb/recent、@/views/pms/kb/search、@/views/pms/kb/label 和 @/views/pms/kb/recycle 目录。
知识中心以知识库为边界组织文件夹、富文本和上传文件,并在内容上提供协作权限、关注、点赞、评论、分享和回收站。知识库的创建、成员和个人分组,详见 《【知识中心】知识库管理》。
- 目录与文档:在知识库中创建文件夹、富文本文档和文件,支持树形目录、重命名、移动和在线预览。
- 内容协作权限:按知识库公开范围、用户或部门设置管理员、可编辑、仅预览、可下载和可上传下载,子内容默认继承父内容权限。
- 文档协作:富文本文档支持点赞、评论和回复;所有文档都可以关注,具备编辑权限的协作者可以生成内部或公开分享链接。
- 知识入口:提供我的关注、最近使用、文档搜索、文档标签和最近删除,分别对应独立菜单或知识库工作区中的操作。
本文涉及表如下图所示:
本篇涉及 11 张表,按下文的章节顺序分为五组:
- 文件夹与文档:
pms_knowledge_folder目录层级、pms_knowledge_document富文本与文件。 - 内容协作权限:
pms_knowledge_content_permission权限主表、pms_knowledge_content_permission_member用户或部门协作者。 - 文档协作与分享:
pms_knowledge_document_comment评论、pms_knowledge_document_like点赞、pms_knowledge_document_share分享链接。 - 关注、最近使用与标签:
pms_knowledge_favorite关注、pms_knowledge_view_record最近浏览、pms_knowledge_document_label文档标签。 - 回收站:
pms_knowledge_recycle_record回收记录。
# 1. 文件夹与文档
文件夹,由 PmsKnowledgeFolderController 提供接口(/pms/kb/folder);文档,由 PmsKnowledgeDocumentController 提供接口(/pms/kb/document)。文件夹保存目录层级,文档保存富文本内容或文件地址,二者都通过内容协作权限编号控制访问。
# 1.1 表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
文件夹表 pms_knowledge_folder,保存知识库内的目录层级:
CREATE TABLE `pms_knowledge_folder` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`library_id` bigint NOT NULL COMMENT '知识库编号',
`permission_id` bigint NOT NULL COMMENT '内容协作权限编号',
`parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父文件夹编号',
`title` varchar(255) NOT NULL 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 知识库文件夹';
文档表 pms_knowledge_document,保存富文本正文或上传文件:
CREATE TABLE `pms_knowledge_document` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`library_id` bigint NOT NULL COMMENT '知识库编号',
`permission_id` bigint NOT NULL COMMENT '内容协作权限编号',
`folder_id` bigint NOT NULL DEFAULT 0 COMMENT '文件夹编号',
`parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父文档编号',
`title` varchar(255) NOT NULL COMMENT '文档标题',
`content` text DEFAULT NULL COMMENT '正文内容或文件地址',
`type` int NOT NULL COMMENT '文档类型',
`file_type` varchar(50) DEFAULT NULL COMMENT '文件类型',
`file_size` bigint DEFAULT NULL COMMENT '文件大小,单位:字节',
`label_ids` varchar(5000) DEFAULT NULL 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 知识库文档';
① library_id 关联 pms_knowledge_library 表的 id 字段,permission_id 关联 pms_knowledge_content_permission 表的 id 字段。文件夹的 parent_id 自关联本表,parent_id = 0 表示知识库根目录。
② 文档的 folder_id 关联 pms_knowledge_folder 表的 id 字段,folder_id = 0 表示文档不在文件夹中;parent_id 自关联本表,parent_id = 0 表示根文档。一个文档不能同时指定非根文件夹和非根父文档;请求同时传入两者时,后端以文件夹为准并把 parent_id 规范为根值。文件夹和文档都不能创建循环层级。
③ 枚举 type 文档类型(PmsKnowledgeDocumentTypeEnum):3 富文本、4 文件。富文本的 content 保存编辑器 HTML;文件的 content 保存文件地址,file_type 和 file_size 保存扩展名与字节数。
④ label_ids 由 LongListTypeHandler 序列化为标签编号数组,标签定义保存在 pms_knowledge_document_label。编辑文档时传空数组表示清空标签,后端会校验标签存在。
⑤ 枚举 status 状态(PmsKnowledgeDocumentStatusEnum),与知识库共用同一套枚举:-1 回收站、0 草稿、1 正常、2 模板。管理后台创建的文件夹、文档和文件都由 Service 初始化为正常,创建请求不能自行指定状态;移入回收站时写入删除人和删除时间,恢复时回到正常。
⑥ 删除文件夹会把直属及后代内容级联标记为回收站并写入删除信息,但回收记录表只登记本次显式删除的根对象,不会为每个子对象重复写记录,详见 §5. 回收站。
# 1.2 管理后台
对应 [PMS 项目管理 -> 知识中心 -> 知识库] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/pms/kb/document 目录。知识库详情、文件夹详情和文档详情复用同一个工作区组件,隐藏路由分别为 /pms/kb/library/{libraryId}、/pms/kb/library/{libraryId}/folder/{folderId} 和 /pms/kb/library/{libraryId}/document/{documentId};activeMenu 固定指向 /pms/kb/library,因此进入详情后左侧「知识库」菜单仍保持高亮。
工作区由 KnowledgeLibrarySidebar.vue、KnowledgeLibraryHome.vue、KnowledgeFolderDetail.vue 和 KnowledgeDocumentDetail.vue 组成。左侧目录树只返回当前用户有内容读取权限的正常文件夹和文档,右侧根据路由展示主页、文件夹或文档;整体布局见下方「知识库主页」截图。
# 知识库主页
KnowledgeLibraryHome.vue 展示知识库名称、简介和目录内容。点击【全部文档】显示目录树的根节点,点击【我关注的】只展示当前用户仍可读取的文件夹、文档和文件。
点击【搜索文档】进入 /pms/kb/search?libraryId={libraryId};点击【更多】可以关注或取消关注知识库、打开成员管理,以及在允许退出时退出知识库。成员管理由 KnowledgeMemberForm.vue 负责,详见 《【知识中心】知识库管理》。

# 新建文件夹、文档和文件
目录树右侧的【+】菜单由 KnowledgeLibrarySidebar.vue 提供:创建文件夹打开 KnowledgeFolderForm.vue,创建富文本文档打开 KnowledgeDocumentCreateForm.vue,上传文件打开 KnowledgeFileUploadForm.vue(上传完成后同样调用文档创建接口,类型固定为文件)。
① 根目录创建需要知识库写权限;在子文件夹或子文档下创建,需要父内容的「可编辑」权限。
② 富文本文档使用平台 Editor 组件编辑 HTML。
③ 文件上传使用平台文件上传能力,单文件上限 100 MB,扩展名受 PmsKnowledgeUploadFileTypes 限制,保存文件地址、扩展名和字节数。

# 文件夹详情
点击目录树中的文件夹进入 /pms/kb/library/{libraryId}/folder/{folderId},同时记录一次最近浏览。KnowledgeFolderDetail.vue 展示创建时间、子文件夹数和文档数,并列出直属内容。
操作按钮按内容权限显示:具有管理权限时显示【协作】和【移动】;具有编辑权限(管理员、可编辑或可上传下载)时可以【重命名】;具有删除权限时,可以把文件夹及其全部子文件夹、文档一次移入回收站。

# 文档详情与编辑
点击富文本文档或文件进入 /pms/kb/library/{libraryId}/document/{documentId},记录最近浏览并拼接创建人、点赞人、标签和当前用户权限。KnowledgeDocumentDetail.vue 按文档类型展示内容:
① 富文本直接渲染经 DOMPurify 清洗的 HTML,显示标题、创建时间、状态和标签;底部加载 KnowledgeDocumentComment.vue,支持点赞、发表评论和一级回复。
② 文件显示扩展名和大小。当前用户拥有下载权限时,FilePreview 使用响应中的 previewUrl 预览并显示下载入口;只有「仅预览」权限时,响应会清空 content,但仍保留 previewUrl 供在线预览,页面不显示下载入口。
③ 具有编辑权限时显示【编辑】和【分享】,打开 KnowledgeDocumentUpdateForm.vue 保存标题、正文、标签、文件类型和大小;具有管理权限时额外显示【协作】;【更多】菜单提供移动和删除。

# 移动、重命名与删除
重命名只修改标题。移动打开 KnowledgeContentMoveDialog.vue,需要源内容的管理权限、源和目标知识库可读,以及目标父目录可管理;不能移动到自身或后代。
跨知识库移动时,Service 会复制内容权限并同步关注、最近浏览记录的 library_id,避免改变原知识库中其他内容的权限;原权限记录在不再被引用后才清理。

点击【删除】只把对象和级联子树标记为回收站状态,并写入一条根对象回收记录,详见 §5. 回收站。
查询说明
文件夹和文档的查询接口只返回非回收状态且当前用户可读取的内容,目录树和详情入口另外只展示正常状态。权限判断在 Service 层再次执行,不能只依赖前端按钮的显示与隐藏。
# 2. 内容协作权限
内容协作权限,由 PmsKnowledgeContentPermissionController 提供接口(/pms/kb/content-permission)。文件夹和文档通过 permission_id 指向权限主表;同一权限可以被同一内容树复用,权限成员只保存用户或部门的显式协作等级。
# 2.1 表结构
权限主表 pms_knowledge_content_permission,保存公开范围和公开协作等级:
CREATE TABLE `pms_knowledge_content_permission` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`library_id` bigint NOT NULL COMMENT '知识库编号',
`open_status` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否对知识库可访问人公开',
`open_level` tinyint NOT NULL DEFAULT 3 COMMENT '公开协作等级',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='PMS 知识内容协作权限';
协作者表 pms_knowledge_content_permission_member,保存用户或部门的显式协作等级:
CREATE TABLE `pms_knowledge_content_permission_member` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`permission_id` bigint NOT NULL COMMENT '协作权限编号',
`user_id` bigint DEFAULT NULL COMMENT '用户编号',
`dept_id` bigint DEFAULT NULL COMMENT '部门编号',
`level` tinyint NOT NULL COMMENT '协作等级',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='PMS 知识内容协作者';
① library_id 关联 pms_knowledge_library 表的 id 字段;permission_id 关联权限主表的 id 字段。user_id 和 dept_id 必须且只能填写一个,分别关联 system_users.id 和 system_dept.id。
② 在根目录创建文件夹或文档时,Service 创建一条默认权限记录:open_status = 1、open_level = 3(仅预览),并把内容创建人写入成员表,等级固定为管理员。
③ 子文件夹和子文档默认直接复用父内容的 permission_id。因此修改内容权限时,会更新这条权限记录关联的整棵共享内容树,不会自动为当前子项复制独立权限记录;只有跨知识库移动时,才会按目标知识库复制权限。
④ 公开内容对知识库可访问人使用 open_level;私有内容按「当前用户显式权限优先、当前部门权限其次」匹配成员表。知识库管理员对本库所有内容直接拥有管理员等级,超级管理员同样可以读取和管理。
⑤ 私有知识库的内容协作者必须已经是知识库成员;知识库创建人不能作为重复的显式协作者。更新权限时,Service 会批量校验用户、部门存在性,并重建协作者列表。
⑥ 枚举 level / open_level 协作等级(PmsKnowledgeContentLevelEnum):
| 值 | 枚举 | 说明 | 可编辑 | 可删除 | 可下载 | 可维护协作者和移动 |
|---|---|---|---|---|---|---|
1 | MANAGE | 管理员 | ✓ | ✓ | ✓ | ✓ |
2 | EDIT | 可编辑 | ✓ | ✓ | ✓ | — |
3 | PREVIEW | 仅预览 | — | — | — | — |
4 | DOWNLOAD | 可下载 | — | — | ✓ | — |
5 | UPLOAD_DOWNLOAD | 可上传下载 | ✓ | — | ✓ | — |
「可编辑」用于修改内容,以及在当前内容下创建子项;「可删除」用于把内容移入回收站;「可下载」只控制文件地址和下载能力,不代表可以修改富文本。
# 2.2 管理后台
在文件夹或文档详情点击【协作】,打开 KnowledgeContentPermissionForm.vue。弹窗展示公开开关、公开等级、当前用户等级和用户 / 部门协作者。
① 公开开关打开时,选择「仅预览」「可下载」等公开等级,所有能够读取知识库的用户按该等级访问;关闭后,只有显式用户或部门协作者、知识库管理员和超级管理员可以访问。
② 【添加成员】使用 System 模块的 UserSelectV2.vue 或 DeptSelect.vue,一行只能选择用户或部门之一,再选择协作等级。用户和部门重复、空对象、无效用户,以及私有库中的非成员,都会被后端拒绝。
③ 创建人会由后端自动保留为管理员,前端不能删除或降级。更新权限采用完整列表提交,移除成员后其内容级权限立即失效。


# 3. 文档协作与分享
文档协作由 kb.interaction 包实现。评论,由 PmsKnowledgeDocumentCommentController 提供接口(/pms/kb/document-comment);点赞,由 PmsKnowledgeDocumentLikeController 提供接口(/pms/kb/document-like);分享,由 PmsKnowledgeDocumentShareController 提供接口(/pms/kb/document-share)。
互动数据均以后台用户为主体,不会改变文档正文和目录结构。
# 3.1 表结构
评论表 pms_knowledge_document_comment,保存主评论和一级回复:
CREATE TABLE `pms_knowledge_document_comment` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`document_id` bigint NOT NULL COMMENT '文档编号',
`user_id` bigint NOT NULL COMMENT '评论人用户编号',
`main_id` bigint NOT NULL DEFAULT 0 COMMENT '主评论编号,0 表示主评论',
`reply_user_id` bigint DEFAULT NULL COMMENT '回复对象用户编号',
`content` varchar(2000) NOT NULL COMMENT '评论内容',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='PMS 知识库文档评论';
点赞表 pms_knowledge_document_like,保存「用户是否点赞文档」的关系:
CREATE TABLE `pms_knowledge_document_like` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`document_id` bigint NOT NULL COMMENT '文档编号',
`user_id` bigint NOT NULL COMMENT '点赞人用户编号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='PMS 知识文档点赞';
分享表 pms_knowledge_document_share,保存内部分享成员和公开链接令牌:
CREATE TABLE `pms_knowledge_document_share` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`document_id` bigint NOT NULL COMMENT '文档编号',
`share_user_ids` varchar(5000) DEFAULT NULL COMMENT '内部分享成员用户编号 JSON',
`token` varchar(64) NOT NULL COMMENT '外部分享令牌',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '分享状态',
`close_user_id` bigint DEFAULT NULL COMMENT '关闭人用户编号',
`close_time` datetime DEFAULT NULL COMMENT '关闭时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_token` (`token`)
) ENGINE=InnoDB COMMENT='PMS 知识库文档分享';
① 三张表的 document_id 都关联 pms_knowledge_document 表的 id 字段;user_id、reply_user_id、close_user_id 关联 system_users 表的 id 字段。
② 评论的 main_id = 0 表示主评论,非零值必须指向同一文档的主评论;reply_user_id 只表示回复对象,不改变评论归属。
③ 点赞表表示「用户是否点赞文档」的关系,重复点赞和重复取消保持幂等。文档详情会返回点赞人列表和当前用户是否已点赞。
④ share_user_ids 由 JacksonTypeHandler 映射为用户编号数组,用于站内分享通知;token 是公开链接的随机令牌,唯一约束防止链接碰撞。status 使用通用状态:0 开启、1 关闭;关闭时记录操作者和时间,原链接立即失效。
# 3.2 评论与回复
评论区域由 KnowledgeDocumentComment.vue 加载,只在富文本文档详情中展示。
① 发表评论时,后端会校验文档可读,以及文档类型为富文本。
② 点击【回复】会把主评论编号写入 mainId,把被回复用户写入 replyUserId。后端只允许回复同一文档下的主评论,不能把回复挂到另一个回复下面。
③ 点击【删除】只能删除当前用户自己的评论,删除主评论会连同回复一起删除。

# 3.3 点赞
点赞按钮位于 KnowledgeDocumentDetail.vue 的富文本文档互动区域,点击切换点赞和取消点赞,两个动作都先校验当前用户可以读取该文档。
点赞不要求文档编辑权限,文件类型没有点赞入口。删除文档时,回收站服务会同步清理对应点赞记录。
# 3.4 分享
文档详情的【分享】按钮打开 KnowledgeDocumentShareDialog.vue。打开弹窗先查询当前有效分享;没有有效分享时点击【开启分享】,后端生成新的随机 token。
开启后,弹窗展示公开链接、二维码和内部分享成员。复制链接和下载二维码都在浏览器端完成,不把二维码图片写入数据库;新增内部成员会收到站内信通知。点击【关闭分享】后原链接立即失效。
公开页面路由为 /pms/kb/document/share/:token,对应 @/views/pms/kb/document/share 目录。页面不要求登录,后端使用 @PermitAll 和 @TenantIgnore 按令牌查询,仅返回状态正常的文档;富文本接口返回原始正文,由页面清洗后展示,文件类型通过 FileApi 生成临时预览地址,不返回数据库中的原始文件地址。
分享只控制链接访问和通知,不会把文档加入接收人的知识库成员列表;接收人能否从知识库内部打开文档,仍由知识库成员和内容协作权限决定。

# 4. 关注、最近使用、搜索与标签
关注,由 PmsKnowledgeFavoriteController 提供接口(/pms/kb/favorite);最近浏览,由 PmsKnowledgeViewRecordController 提供接口(/pms/kb/view-record);文档标签,由 PmsKnowledgeDocumentLabelController 提供接口(/pms/kb/document-label)。
关注和最近使用是当前用户的个人入口,标签是租户范围内可复用的文档属性。它们不会改变知识库成员关系,也不扩大文档的可见范围;列表响应会再次过滤已经无权读取或已经回收的对象。
# 4.1 表结构
关注表 pms_knowledge_favorite,保存当前用户关注的知识库、文件夹、文档或文件:
CREATE TABLE `pms_knowledge_favorite` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`library_id` bigint NOT NULL COMMENT '知识库编号',
`type` int NOT NULL COMMENT '关注对象类型',
`entity_id` bigint NOT NULL COMMENT '关注对象编号',
`user_id` bigint NOT NULL COMMENT '关注人用户编号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='PMS 知识收藏(关注)';
最近浏览表 pms_knowledge_view_record,保存当前用户最近打开的内容:
CREATE TABLE `pms_knowledge_view_record` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`library_id` bigint NOT NULL COMMENT '知识库编号',
`type` int NOT NULL COMMENT '浏览对象类型',
`entity_id` bigint NOT NULL COMMENT '浏览对象编号',
`user_id` bigint NOT NULL COMMENT '浏览人用户编号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='PMS 知识最近浏览记录';
文档标签表 pms_knowledge_document_label,是租户范围内可复用的公共配置:
CREATE TABLE `pms_knowledge_document_label` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(255) NOT NULL COMMENT '标签名称',
`color` varchar(20) NOT NULL COMMENT '标签颜色',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='PMS 知识库文档标签';
① library_id 关联知识库,user_id 关联 system_users 表的 id 字段。entity_id 根据 type 指向知识库、文件夹、文档或文件,属于多态关系,数据库不建立单一外键。
② 枚举 type 对象类型(PmsKnowledgeObjectTypeEnum):1 知识库、2 文件夹、3 文档、4 文件。关注文档时必须传实际文档类型,文件不能当成富文本文档处理。
③ 关注关系由「用户 + 类型 + 对象编号」确定。新增前会校验对象可读,重复关注抛出业务异常;取消关注只删除当前用户自己的关系。
④ 打开文件夹或文档详情时写入最近浏览记录。同一用户再次打开同一对象只更新时间并同步当前知识库;当前详情入口不记录知识库本身。查询最近使用时按今天、昨天和此前 30 个自然日分组,每个分组内同一对象只保留最近一次。
⑤ 标签是租户范围内的公共配置,没有 library_id。删除标签后,后端不会自动改写历史文档的 label_ids,查询时只返回仍存在的标签;删除标签不会删除文档。
# 4.2 管理后台
# 我的关注
对应 [PMS 项目管理 -> 知识中心 -> 我的关注] 菜单,管理后台路由为 /pms/kb/favorite,对应 @/views/pms/kb/favorite 目录,分页展示知识库、文件夹、文档和文件。知识库工作区的「我关注的」页签则按知识库过滤。
点击对象名称跳转到知识库或文档隐藏路由。如果对象已被删除、移入回收站,或当前用户失去权限,Service 会在响应组装阶段过滤,不返回失效记录。

# 最近使用
对应 [PMS 项目管理 -> 知识中心 -> 最近使用] 菜单,对应 @/views/pms/kb/recent 目录,按「今天」「昨天」「最近 30 天」分组显示最近访问的内容。页面没有手动删除入口,访问新对象或重新打开旧对象会自动更新顺序。

# 文档搜索
对应 [PMS 项目管理 -> 知识中心 -> 文档搜索] 菜单,对应 @/views/pms/kb/search 目录。查询条件包括关键字、知识库、创建人和更新时间范围;关键字由 MySQL 对标题和正文执行模糊搜索,结果仍限制在当前用户可读的知识库、内容权限和非回收状态。
点击结果标题进入文档详情,详情页再次校验权限。

# 文档标签
对应 [PMS 项目管理 -> 知识中心 -> 文档标签] 菜单,对应 @/views/pms/kb/label 目录。左侧加载标签列表,选中标签后查询该标签下的文档;KnowledgeLabelManageDialog.vue 负责新增、编辑和删除标签,表单为 KnowledgeLabelForm.vue。
标签页点击文档名称进入文档详情;文档详情的编辑表单也可以直接维护标签。标签页只展示当前用户可读的非回收状态文档,不展示正文内容。

# 5. 回收站
回收站,由 PmsKnowledgeRecycleController 提供接口(/pms/kb/recycle)。删除采用「标记回收 + 延迟清理」方式,默认保留 30 天。
# 5.1 表结构
CREATE TABLE `pms_knowledge_recycle_record` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`library_id` bigint NOT NULL COMMENT '知识库编号',
`type` int NOT NULL COMMENT '回收对象类型',
`entity_id` bigint NOT NULL COMMENT '回收对象编号',
`name` varchar(255) NOT NULL COMMENT '回收对象名称快照',
`delete_user_id` bigint NOT NULL COMMENT '删除人用户编号',
`delete_time` datetime NOT NULL COMMENT '删除时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='PMS 知识库回收站记录';
① library_id 关联知识库,delete_user_id 关联 system_users 表的 id 字段;entity_id 根据 type 指向知识库、文件夹、文档或文件,类型枚举同 §4.1 表结构。
② name 保存删除时的名称快照,即使原对象后续被彻底删除,回收站列表仍可以展示名称。
③ 删除文件夹或文档时只新增一条根对象记录,级联子项通过 parent_id、folder_id 和对象状态在详情接口中动态解析,不重复写入回收记录。删除知识库时同时回收其下的文件夹和文档,但只保留知识库根记录。
④ 回收记录不携带内容权限快照。查看、恢复和彻底删除前,Service 会根据仍保留的文件夹或文档 permission_id 重新校验知识库可读及内容删除权限;知识库记录要求创建人、管理员或超级管理员操作。
# 5.2 管理后台
# 内容回收站
知识库工作区左侧的 KnowledgeLibrarySidebar.vue,在当前用户拥有写入和删除权限时显示【最近删除】。点击后切换右侧 KnowledgeRecyclePanel.vue,按文档、文件夹和文件页签过滤记录,表格展示名称、类型、删除人、删除时间和文件大小。

# 知识库回收站
对应 [PMS 项目管理 -> 知识中心 -> 最近删除] 菜单,对应 @/views/pms/kb/recycle 目录,只展示已删除的知识库。知识库恢复后,会恢复本次删除所级联、且未被此前独立删除记录保护的内容;此前单独删除的子树继续保留在回收站。

# 回收详情与预览
点击回收记录名称打开 KnowledgeRecycleDetail.vue。文件夹记录展示本次级联删除的子文件夹和文档;文档或文件记录展示只读预览,点击子节点时按子对象编号预览。
① 富文本文档使用原正文只读渲染;文件类型只有在当前用户仍具备内容删除权限时才返回可预览地址,页面通过 FilePreview 打开,不提供编辑和下载入口。
② 点击【恢复】后,如果原父文件夹或父文档仍在回收站,根对象会自动挂到知识库根目录;此前单独删除的子树不会被误恢复。
③ 点击【彻底删除】后,Service 先删除评论、点赞、分享、关注、浏览记录和内容权限,再物理删除文档、文件夹及回收记录。该操作不可逆。

过期清理说明
PmsKnowledgeRecycleCleanJob 每次执行时,以当前时间减去 30 天作为截止时间清理到期记录。定时任务按租户执行,清理结果写入任务日志;在保留期内不会后台自动删除可恢复内容。请在 [基础设施 -> 定时任务] 中配置该 Job。