ruoyi-vue-pro 开发指南 ruoyi-vue-pro 开发指南
  • 萌新必读
  • 后端手册
  • 中间件手册
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 会员手册
  • 商城手册
  • ERP 手册
  • CRM 手册
  • MES 手册
  • WMS 手册
  • HRM 手册
  • FMS 手册
  • PMS 手册
  • IM 即时通讯手册
  • AI 大模型手册
  • IoT 物联网手册
  • 公众号手册
  • 系统手册
  • 运维手册
  • 前端手册 Vue 3.x
  • 前端手册 Vben 5.x
  • 前端手册 Vue 2.x
  • 前端手册 Admin Uniapp
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 会员手册
  • 商城手册
  • ERP 手册
  • CRM 手册
  • MES 手册
  • WMS 手册
  • HRM 手册
  • FMS 手册
  • PMS 手册
  • IM 即时通讯手册
  • AI 大模型手册
  • IoT 物联网手册
  • 公众号手册
  • 系统手册
视频教程
  • Vue3 + element-plus (opens new window)
  • Vue3 + vben5(ant-design-vue、element-plus) (opens new window)
  • Vue2 + element-ui (opens new window)
微服务版 (opens new window)
作者博客 (opens new window)
GitHub (opens new window)
  • 萌新必读
  • 后端手册
  • 中间件手册
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 会员手册
  • 商城手册
  • ERP 手册
  • CRM 手册
  • MES 手册
  • WMS 手册
  • HRM 手册
  • FMS 手册
  • PMS 手册
  • IM 即时通讯手册
  • AI 大模型手册
  • IoT 物联网手册
  • 公众号手册
  • 系统手册
  • 运维手册
  • 前端手册 Vue 3.x
  • 前端手册 Vben 5.x
  • 前端手册 Vue 2.x
  • 前端手册 Admin Uniapp
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 会员手册
  • 商城手册
  • ERP 手册
  • CRM 手册
  • MES 手册
  • WMS 手册
  • HRM 手册
  • FMS 手册
  • PMS 手册
  • IM 即时通讯手册
  • AI 大模型手册
  • IoT 物联网手册
  • 公众号手册
  • 系统手册
视频教程
  • Vue3 + element-plus (opens new window)
  • Vue3 + vben5(ant-design-vue、element-plus) (opens new window)
  • Vue2 + element-ui (opens new window)
微服务版 (opens new window)
作者博客 (opens new window)
GitHub (opens new window)
  • 萌新必读

    • 简介
    • 交流群
    • 视频教程
    • 功能列表
    • 快速启动(后端项目)
    • 快速启动(前端项目)
    • 接口文档
    • 技术选型
    • 项目结构
    • 代码热加载
    • 一键改包
    • 迁移模块(适合新项目)
    • 删除功能(以租户为例)
    • 表结构变更(版本升级)
    • 国产信创数据库(DM 达梦、大金、OpenGauss、瀚高)
    • 如何去除 Redis 缓存
    • 内网穿透
    • 面试题、简历模版、简历优化
    • 项目外包
  • 后端手册

    • 新建模块
    • 代码生成【单表】(新增功能)
    • 代码生成【主子表】
    • 代码生成(树表)
    • 代码生成(移动端)
    • 功能权限
    • 数据权限
    • 用户体系
    • 三方登录
    • OAuth 2.0(SSO 单点登录)
    • SaaS 多租户【字段隔离】
    • SaaS 多租户【数据库隔离】
    • WebSocket 实时通信
    • 异常处理(错误码)
    • 参数校验、时间传参
    • 分页实现
    • VO 对象转换、数据翻译
    • 文件存储(上传下载)
    • Excel 导入导出
    • 操作日志、访问日志、异常日志
    • MyBatis 数据库
    • MyBatis 联表&分页查询
    • 多数据源(读写分离)、事务
    • Redis 缓存
    • 本地缓存
    • 异步任务
    • 分布式锁
    • 幂等性(防重复提交)
    • 请求限流(RateLimiter)
    • HTTP 接口签名(防篡改)
    • HTTP 接口加解密
    • 单元测试
    • 验证码
    • 工具类 Util
    • 配置管理
    • 数据库文档
  • 中间件手册

    • 定时任务
    • 消息队列(内存)
    • 消息队列(Redis)
    • 消息队列(RocketMQ)
    • 消息队列(RabbitMQ)
    • 消息队列(Kafka)
    • 限流熔断
  • 工作流手册

    • 工作流演示
    • 功能开启
    • 工作流(达梦适配)
    • 审批接入(流程表单)
    • 审批接入(业务表单)
    • 流程设计器(BPMN)
    • 流程设计器(钉钉、飞书)
    • 选择审批人、发起人自选
    • 会签、或签、依次审批
    • 流程发起、取消、重新发起
    • 审批通过、不通过、驳回
    • 审批加签、减签
    • 审批转办、委派、抄送
    • 执行监听器、任务监听器
    • 流程表达式
    • 流程审批通知
    • 移动端审批
  • 大屏手册

    • 报表设计器
    • 大屏设计器
  • 支付手册

    • 功能开启
    • 支付宝支付接入
    • 微信公众号支付接入
    • 微信小程序支付接入
    • 支付宝、微信退款接入
    • 支付宝转账接入
    • 微信转账接入
    • 钱包充值、支付、退款
    • 模拟支付、退款
    • 移动端支付管理
  • 会员手册

    • 功能开启
    • 微信公众号登录
    • 微信小程序登录
    • 微信小程序订阅消息
    • 微信小程序码
    • 会员用户、标签、分组
    • 会员等级、积分、签到
    • 移动端会员管理
  • 商城手册

    • 商城演示
    • 功能开启
    • 商城装修
    • 在线客服
    • 【商品】商品分类
    • 【商品】商品属性
    • 【商品】商品 SPU 与 SKU
    • 【商品】商品评价
    • 【交易】购物车
    • 【交易】交易订单
    • 【交易】售后退款
    • 【交易】快递发货
    • 【交易】门店自提
    • 【交易】分销返佣
    • 【营销】优惠劵
    • 【营销】积分商城
    • 【营销】拼团活动
    • 【营销】秒杀活动
    • 【营销】砍价活动
    • 【营销】满减送活动
    • 【营销】限时折扣
    • 【营销】内容管理
    • 【统计】会员、商品、交易统计
    • 移动端商城管理
  • ERP手册

    • ERP 演示
    • 功能开启
    • 【产品】产品信息、分类、单位
    • 【库存】产品库存、库存明细
    • 【库存】其它入库、其它出库
    • 【库存】库存调拨、库存盘点
    • 【采购】采购订单、入库、退货
    • 【销售】销售订单、出库、退货
    • 【财务】采购付款、销售收款
    • 移动端 ERP
  • CRM手册

    • CRM 演示
    • 功能开启
    • 【线索】线索管理
    • 【客户】客户管理、公海客户
    • 【商机】商机管理、商机状态
    • 【合同】合同管理、合同提醒
    • 【回款】回款管理、回款计划
    • 【产品】产品管理、产品分类
    • 【通用】数据权限
    • 【通用】跟进记录、待办事项
    • 移动端 CRM
  • AI大模型手册

    • AI 大模型演示
    • 功能开启
    • AI 聊天对话
    • AI 绘画创作
    • AI 知识库(RAG)
    • AI 音乐创作
    • AI 写作助手
    • AI 思维导图
    • AI 工具(function calling)
    • AI 工作流
    • Dify 工作流
    • FastGPT 工作流
    • Coze 智能体
    • 推理模式(thinking)
    • 联网搜索
    • MCP Client 客户端
    • MCP Server 服务端
    • 【模型接入】Claude
    • 【模型接入】OpenAI
    • 【模型接入】通义千问
    • 【模型接入】DeepSeek
    • 【模型接入】字节豆包
    • 【模型接入】腾讯混元
    • 【模型接入】硅基流动
    • 【模型接入】MiniMax
    • 【模型接入】月之暗面
    • 【模型接入】百川智能
    • 【模型接入】文心一言
    • 【模型接入】LLAMA
    • 【模型接入】智谱 GLM
    • 【模型接入】讯飞星火
    • 【模型接入】微软 OpenAI
    • 【模型接入】谷歌 Gemini
    • 【模型接入】Stable Diffusion
    • 【模型接入】Midjourney
    • 【模型接入】Suno
    • 【模型接入】Grok
    • 【模型接入】阶跃星辰
    • 移动端 AI 大模型
  • IoT物联网手册

    • 功能开启
    • 产品管理
    • 设备管理
    • 物模型配置
    • 设备网关与子设备
    • 设备动态注册
    • 设备接入(概述)
    • 设备接入(HTTP 协议)
    • 设备接入(MQTT 协议)
    • 设备接入(EMQX 协议)
    • 设备接入(TCP 协议)
    • 设备接入(UDP 协议)
    • 设备接入(WebSocket 协议)
    • 设备接入(CoAP 协议)
    • 设备接入(Modbus Client 模式)
    • 设备接入(Modbus Server 模式)
    • 设备接入(自定义协议)
    • 场景联动
    • 数据流转
    • 告警配置
    • OTA 固件升级
    • 移动端 IoT 物联网
  • MES手册

    • MES 演示
    • 功能开启
    • 【基础】物料产品、分类、计量单位
    • 【基础】客户管理、供应商管理
    • 【基础】车间设置、工作站设置
    • 【基础】编码规则
    • 【生产】工序设置、工艺流程
    • 【生产】生产工单
    • 【生产】生产排产、工序流转卡
    • 【生产】生产报工
    • 【生产】安灯配置、安灯呼叫
    • 【生产】工作记录
    • 【仓库】仓库与库区库位、条码赋码、SN码
    • 【仓库】批次管理、库存现有量、库存事务
    • 【仓库】到货通知、采购入库、采购退货
    • 【仓库】生产领料、生产退料、物料消耗
    • 【仓库】产品产出、产品入库
    • 【仓库】发货通知、销售出库、销售退货
    • 【仓库】外协发料、外协入库
    • 【仓库】其他入库、其他出库
    • 【仓库】调拨单、装箱管理
    • 【仓库】库存盘点
    • 【质量】检测项设置、常见缺陷
    • 【质量】质检方案
    • 【质量】来料检验(IQC)
    • 【质量】过程检验(IPQC)
    • 【质量】出货检验(OQC)
    • 【质量】退货检验(RQC)
    • 【质量】待检任务、检验结果、缺陷记录
    • 【设备】设备类型、设备台账
    • 【设备】点检保养项目、点检保养方案
    • 【设备】点检记录、保养记录、维修单
    • 【工具】工具类型、工装夹具台账
    • 【排班】班组设置、节假日设置
    • 【排班】排班计划、排班日历
    • 移动端 MES
  • WMS手册

    • WMS 演示
    • 功能开启
    • 【基础】仓库
    • 【基础】商品、SKU、分类、品牌
    • 【基础】往来企业(供应商、客户)
    • 【库存】库存记录、流水、统计
    • 【单据】入库
    • 【单据】出库
    • 【单据】移库
    • 【单据】盘库
    • 【其它】WMS、MES、ERP 对比
    • 移动端 WMS
  • HRM人力资源

    • HRM 演示
    • 功能开启
    • 【组织】工作台、组织架构
    • 【员工】员工管理
    • 【招聘】招聘管理
    • 【考勤】考勤管理
    • 【社保】社保管理
    • 【薪资】计薪设置、薪资档案
    • 【薪资】月度工资、工资条
    • 【绩效】绩效模板、绩效计划
    • 【绩效】绩效考核、绩效档案
    • 移动端 HRM
  • FMS财务管理

    • FMS 演示
    • 功能开启
    • 【设置】账套管理、财务参数、财务指标
    • 【设置】币别、科目、辅助核算、初始余额
    • 【设置】凭证字、常用摘要、凭证模板
    • 【凭证】凭证管理
    • 【账簿】账簿管理
    • 【报表】财务报表
    • 【结账】期末结账
    • 移动端 FMS
  • PMS项目管理

    • PMS 演示
    • 功能开启
    • 【项目中心】工作台与项目管理
    • 【项目中心】项目详情与迭代
    • 【项目中心】工作项与协作
    • 【知识中心】知识库管理
    • 【知识中心】文档与协作
      • 1. 文件夹与文档
        • 1.1 表结构
        • 1.2 管理后台
      • 2. 内容协作权限
        • 2.1 表结构
        • 2.2 管理后台
      • 3. 文档协作与分享
        • 3.1 表结构
        • 3.2 评论与回复
        • 3.3 点赞
        • 3.4 分享
      • 4. 关注、最近使用、搜索与标签
        • 4.1 表结构
        • 4.2 管理后台
      • 5. 回收站
        • 5.1 表结构
        • 5.2 管理后台
    • 移动端 PMS
  • IM即时通讯手册

    • IM 演示
    • 功能开启
    • 【好友】好友关系、好友申请
    • 【群聊】群组、群成员、入群申请
    • 【消息】私聊、群聊、频道消息
    • 【频道】频道、频道素材
    • 【内容】表情、敏感词
    • 【通话】语音通话、视频通话、共享屏幕
    • 【WebSocket】实时推送与离线消息
    • 移动端 IM 即时通讯
  • 公众号手册

    • 功能开启
    • 公众号接入
    • 公众号粉丝
    • 公众号标签
    • 公众号消息
    • 模版消息
    • 自动回复
    • 公众号菜单
    • 公众号素材
    • 公众号图文
    • 公众号统计
    • 移动端公众号管理
  • 系统手册

    • 短信配置
    • 邮件配置
    • 站内信配置
    • Webhook(钉钉、飞书、企微)
    • 数据脱敏、字段权限
    • 敏感词
    • 地区 & IP 库
  • 运维手册

    • 开发环境
    • Linux 部署
    • Docker 部署
    • Jenkins 部署
    • 宝塔部署
    • 1Panel 部署
    • HTTPS 证书
    • 服务监控
    • Tomcat WAR 部署
  • 前端手册 Vue 3.x

    • 开发规范
    • 菜单路由
    • Icon 图标
    • 字典数据
    • 系统组件
    • 通用方法
    • 配置读取
    • CRUD 组件
    • 国际化
    • IDE 调试
    • 代码格式化
  • 前端手册 Vben 5.x

    • 开发规范
    • 菜单路由
    • 图标、主题、国际化
    • 字典数据
    • 系统组件
    • 通用方法
    • 配置读取
    • IDE 调试
    • 代码格式化
  • 前端手册 Vue 2.x

    • 开发规范
    • 菜单路由
    • Icon 图标
    • 字典数据
    • 系统组件
    • 通用方法
    • 配置读取
  • 前端手册 Admin Uniapp

    • 开发规范
    • 菜单路由
    • 图标、主题、国际化
    • 字典数据
    • 系统组件
    • 通用方法
    • IDE 调试
    • 代码格式化
    • 运行发布
  • 更新日志

    • 【v2026-09】
    • 【v2026-08】
    • 【v2026-07】
    • 【v2026-06】
    • 【v2026-05】
    • 【v2026-04】
    • 【v2026-03】
    • 【v2026-01】
    • 【v2025-12】
    • 【v2025-11】
    • 【v2025-10】
    • 【v2025-09】
    • 【v2025-08】
  • 开发指南
  • PMS项目管理
芋道源码
2026-09-01
目录

【知识中心】文档与协作

文档与协作属于知识中心,由 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。

【知识中心】知识库管理
移动端 PMS

← 【知识中心】知识库管理 移动端 PMS→

Theme by Vdoing | Copyright © 2019-2026 芋道源码 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×