• onlyoffice历史版本功能实现


    一:开启客户端配置

    如果不开启,回调请求里面的history和changeUrl是空

    二:客户端主要实现2个回调函数

    1.实现onRequestHistory事件,该事件会在ui点击查看历史的时候发起,用于展示历史列表
    关键在于获取到history的内容,调用refreshHistory方法

    1. docEditor.refreshHistory(// show the document version history
    2. {
    3. currentVersion: "31",
    4. history: historyList
    5. })

    historyList 的数据结构

    1. [{
    2. "serverVersion": "7.4.0",//来源回调的history,第一个版本无需该字段
    3. "changes": [{//来源回调的history,第一个版本该字段为null
    4. "created": "2023-09-28 02:01:25",
    5. "user": {
    6. "id": "uid-2",
    7. "name": "group-2 xxx"
    8. }
    9. }, {
    10. "created": "2023-09-28 02:01:49",
    11. "user": {
    12. "id": "uid-3",
    13. "name": "group-3 Hamish Mitchell"
    14. }
    15. }],
    16. "key": "_xxxxx",来源回调的key
    17. "version": 30,//需要自己维护
    18. "created": "2023-09-28 02:01:25",//自己维护,一般是打开文档的时候记录
    19. "user": {//自己维护,一般是打开文档的时候记录
    20. "id": "uid-2",
    21. "name": "group-2 xxx"
    22. }
    23. }]

    回调的数据结构如下(仅供参考)

    1. {
    2. key: '1696822265751m4sq5vs50j',
    3. status: 2,
    4. url: 'http://xxx/cache/files/data/1696822265751m4sq5vs50j_9201/output.docx/output.docx?md5=jljJJVUlAm4pYX_6mvC_Lw&expires=1696823346&filename=output.docx',
    5. changesurl: 'http://xxxx/cache/files/data/1696822265751m4sq5vs50j_9201/changes.zip/changes.zip?md5=ivaLJ_lI0MK5nBdCqy8HLw&expires=1696823346&filename=changes.zip',
    6. history: { serverVersion: '7.4.0', changes: [ [Object] ] },
    7. users: [ '64773bdb97acf80031f4ef56' ],
    8. actions: [ { type: 0, userid: '64773bdb97acf80031f4ef56' } ],
    9. lastsave: '2023-10-09T03:33:46.000Z',
    10. notmodified: true,
    11. filetype: 'docx'
    12. }

    historyList 排序要求:按version升序排序

    2.实现onRequestHistoryData事件,该事件会ui点击查看具体的某个历史的时候触发
    关键在于获取某个版本的具体historyData,调用setHistoryData方法发起请求

    1. function onRequestHistoryData(data) {
    2. var version = data.data;//对应点击哪个版本
    3. docEditor.setHistoryData(historyData);
    4. }

     historyData的数据结构

    1. {
    2. "fileType": "docx",
    3. "version": 25,
    4. "key": "xxxxxx",
    5. "url": "http://xxxxx/history?fileName=new.docx&file=prev.docx&ver=25&useraddress=xxx",//当前版本下载的url
    6. "directUrl": null,
    7. "previous": {//上一个版本的信息,如果无上个版本,可以不要这个字段,例如第一个版本
    8. "fileType": "docx",
    9. "key": "new.docx231684394201684",
    10. "url": "http://xxx/history?fileName=new.docx&file=prev.docx&ver=24&useraddress=xxxx",
    11. "directUrl": null
    12. },
    13. "changesUrl": "http://xxxx&file=diff.zip&ver=24",//下载当前版本历史记录存储的diff.zip文件
    14. "token": "eyJhbGciOiJIUzI1NiIsInR"//当条数据签名
    15. }

    三:服务端所有工作都是围绕实现上述的数据

    1.处理onlyoffice发起的回调函数,将保存history信息,更新文件,保存历史文件,保存changeUrl的zip文件,刷新key

    例如,刚新建个文件的时候就添加个历史记录版本是1,客户端编辑后,回调的处理,保存版本号是2的历史记录,创建个版本号是2的目录,里面存放上个版本的文件,和回调changeUrl里的文件,拼接historyData的changesUrl就用对应版本号里面对应的信息,url也是。changeUrl的内容是当前版本和上个版本的对比

    2.实现getHistoryList接口,获取对应的historyList给到客户端用

    3.实现getHistoryData接口,返回historyData给客户端用

    4.实现download相关的接口,返回historyData里面url和changeUrl会下载到的文件

    其他:

    实现界面有关闭按钮:只需要在客户端实现onRequestHistoryClose函数里面执行location.reload()即可 

    四:回调函数相关问答:

    1.客户端保存-->未推送回调-->重新打开(还会不会推送?)

    答:不会,所以如果是很快的刷新,或关闭后立即打开也是不会有问题(他们相当于同一个版本)。onlyoffice有个机制,他不是退出后立即更新,会等几秒没有人再打开的时候才推送回调。


    2.客户端保存-->已推送回调->回调未结束--->客户端重新打开请求老key-->编辑-->关闭(新编辑的内容会不会丢失?)

    答:如果是已推送,只要回调未结束正确通知到onlyoffice,此时的版本就会处于一个锁的状态
    ,客户端打开的时候能得到一个版本过期的事件,处理好该事件不让编辑,从而保证了不会在保存的过程中,打开旧的版本进行编辑后丢失的问题 

  • 相关阅读:
    shell基本命令
    OpenMV:23串口发送数据
    Fetch 请求不转换BLOB正常显示GBK编码的数据
    Qt实现手动切换多种布局
    智能井盖传感器:城市安全卫士
    Vuex快速入门
    IO流 - File - properties
    详解 SpringMVC 的 HttpMessageConverter
    简单谈谈对云原生领域MQ组件kafka的理解
    网络安全(黑客)自学
  • 原文地址:https://blog.csdn.net/hongkid/article/details/133701810