OnlyOffice 应用实战:企业云盘打开 Word 即编辑,劳动合同范本也能在线改、自动留痕
🌐演示地址:http://ruoyioffice.com | 📦源码1·GitHub:ruoyi-office | 📦源码2·GitCode:ruoyi-office | 📦源码3·Gitee:ruoyi-office | 💬微信:17156169080(备注「RuoYi Office」)
HR 把《企业通用劳动合同模板.docx》丢进云盘共享文件夹,同事却只能下载→本地改→再上传「V2 最终版」。OnlyOffice 接入企业系统后,目标体验应是:点开即编辑、编辑过程像 Word、关掉也不白改、历史可回看。本文按 RuoYi Office 企业云盘真实路径写「应用实战」——不重复讲 Docker 怎么起容器,而讲从业务入口到回存留痕怎么跑通。
▲ 应用链路:云盘打开 → 签发 config → 在线编辑 / forcesave → 回调写版本;底部「已保存」不等于业务已落库
引言:应用实战要解决什么?
集成文关心「服务能不能起来」;应用文关心「员工敢不敢用」。现场反馈最多的四类问题:
| 现象 | 根因往往是 |
|---|---|
| 改了半小时关掉,列表还是旧稿 | 只信编辑器「已保存」,没等 callback / forcesave |
| 预览历史版时把旧内容写成新版 | 只读会话也回写,没拦editable |
| 多人打开互相覆盖 | documentKey 规则不当,缓存串会话 |
| 正式劳动合同和共享范本搅在一起 | 云盘协同 vs 合同套打职责没分开 |
RuoYi Office 的用法可以概括成一句话:云盘管「可协同的文件资产」;合同模块管「正式套打成稿」。劳动合同「空白范本」放云盘在线改完全合理;员工入职后的正式合同正文,仍建议走合同中心。
一、场景:云盘里的劳动合同范本
典型路径:
- 行政/HR 将
企业通用劳动合同模板.docx上传到企业云盘「人事/模板」目录 - 设置组织分享(至少「可在线编辑」)
- 同事在列表点在线编辑→ 新标签打开
/oa/cloud/file-editor?id=…&editable=1 - 浏览器内出现完整 OnlyOffice 功能区(字体、样式、协作、保护等)
- 顶栏可开历史记录;关页前系统会尽量强制回存
▲ 实机:独立编辑页内嵌 OnlyOffice,打开《企业通用劳动合同模板》,页脚显示「所有更改已保存」——下文会解释它和业务落库的差别
▲ 入口在云盘列表:预览走 editable=0,在线编辑走 editable=1
二、一次点击背后的四步(应用视角)
列表「在线编辑」 → window.open 独立编辑页(长时编辑不堵主界面) → GET /oa/file/onlyoffice/config (documentKey + 双 JWT + callbackUrl) → Document Server 用 download token 拉文件 → 用户编辑;每约 90s / 开历史前 / 关页 → forcesave → POST callback(status=2 关闭保存 / status=6 强制保存) → 写对象存储 + 更新主表 URL + createVersion(AUTOSAVE)对应后端能力集中在OaFileOnlyOfficeServiceImpl:buildEditorConfig、forceSave、handleCallback。
▲ 分享权限决定能不能进 edit:只有「可在线编辑」及以上,才会签发可写权限
三、实战关键点(相对「装好能打开」)
3.1 独立编辑页,而不是弹窗 iframe
长文档(合同动辄十几页)适合整页工作台。路由/oa/cloud/file-editor隐藏菜单、独立标签;关闭时先forcesave/ 销毁编辑器,再关窗口,降低「关标签=白改」概率。
3.2 「所有更改已保存」≠ 业务版本已生成
编辑器页脚的已保存,多半表示内容进了 Document Server 缓存。业务库oa_file_version要等:
status=2:会话正常关闭保存status=6:forcesave 强制保存
因此产品上要做:定时 forcesave、开历史前先 forcesave、关页触发回存。否则用户截图「已保存」来投诉,你却查不到版本行。
3.3 双 JWT:下载一条、回调一条
Document Server 拉文件、回调业务时都不带登录 Cookie。实现上:
- download token:签在
document.url,临时拉取私有存储文件 - callback token:带上
fileId / userId / tenantId / editable,回存时恢复租户,避免版本落到tenant_id=0
// 回调必须带租户,否则版本列表「写了却查不到」callbackToken 含 tenantId、bizId、editable、userId … callbackUrl=base+"/admin-api/oa/file/onlyoffice/callback?token="+callbackToken;customization.forcesave=true;// 允许命令服务强制保存3.4 历史记录:只读预览 + 恢复即新版本
顶栏「历史记录」打开抽屉后:
- 带
versionId打开 → 只读,禁止 callback 写回 - 恢复某一版 → 下载旧内容重新上传新 URL → 再
createVersion(RESTORE),中间历史不断
这和「把指针拨回旧版」不同,审计更干净(详见云盘版本专文)。
3.5 云盘范本 vs 合同正式稿
| 企业云盘 OnlyOffice | 合同模块 OnlyOffice | |
|---|---|---|
| 路由 | /oa/cloud/file-editor | /contract/doc-editor等 |
| 配置 API | /oa/file/onlyoffice/config | /contract/onlyoffice/config |
| 适合 | 制度、范本、部门协同改稿 | 占位套打、入职正式合同 |
| 权限模型 | 云盘分享权限 | 合同单据权限 |
应用落地时先问清:这份劳动合同是「大家改范本」,还是「某人入职成稿」——入口选错,权限与归档都会拧巴。
四、最小配置清单(能跑起来)
# application.yml 片段(根节点以工程配置为准)onlyoffice:enabled:trueserver-url:https://your-ds-host# Document Serverjwt-secret:your-secret# 与 DS 一致callback-base-url:https://your-api-host# DS 能访问到的业务地址还要确认:
- DS 能访问
callback-base-url(容器网络最常踩坑) - 业务能访问
server-url(前端加载api.js) - 文件扩展名在白名单(docx/xlsx/pptx 等;PDF 通常仅预览)
更细的 Docker / JWT / documentKey 设计见《OnlyOffice 集成实战》《云盘协同编辑》两篇;本文只保证「应用路径正确」。
五、推荐体验路径
在线演示:http://ruoyioffice.com/web/(账号admin/admin123)
- OA → 企业云盘:上传或打开一份 docx(如劳动合同范本)。
- 点在线编辑,确认新标签出现 OnlyOffice,可改文字、看页脚保存状态。
- 点历史记录,再改一版后刷新,确认版本递增。
- 用只读分享账号打开同一文件,确认只能预览不能改。
- (对照)合同中心打开正式合同正文,感受另一条业务链路。
源码仓库:GitHub | GitCode | Gitee
常见问题(FAQ)
为什么关浏览器标签会丢修改?
若未触发 forcesave / status=2,内容可能只在 DS 缓存。应依赖关页钩子 + 定时 forcesave,并教育用户「页脚已保存≠业务版本」。
能否多人同时改同一份范本?
OnlyOffice 支持协同会话;前提是同一 documentKey 策略正确、网络与 DS 资源够用。高冲突文档建议拆副本或加锁流程。
PDF 能在线编辑吗?
一般白名单仅预览。编辑请用 docx 等可写格式。
和微信里常见「OnlyOffice 从零部署」文有何不同?
部署文解决「装上」;本文解决「云盘业务怎么用、怎么不丢稿、范本和正式合同怎么分工」。两者互补。
私有 MinIO 文件 DS 拉不到怎么办?
不要把桶直接暴露给 DS;用带 download token 的业务中转下载(本系统默认路径)。
结语
OnlyOffice 应用实战的及格线,不是 iframe 里出现编辑器,而是:打开路径清晰、权限控得住、关页不丢稿、历史可追溯、业务边界清楚(云盘范本 vs 合同成稿)。RuoYi Office 用独立编辑页 + 四端点 + 版本表,把「像 Word 一样改」嵌进 OA 云盘——劳动合同模板只是其中一个高频场景。
你们现在合同/制度是下载上传,还是已经在线改?有没有踩过「显示已保存其实没落库」?欢迎评论区交流。
💡想要体验 RuoYi Office 的强大功能?
🌐在线演示:http://ruoyioffice.com/web/(账号 admin / admin123)
📦源码仓库:GitHub | GitCode | Gitee
💬技术咨询:添加微信17156169080,备注「RuoYi Office」
⭐如果觉得不错,请给个 Star 支持一下!