onlyoffice历史版本功能实现

一:开启客户端配置

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

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

1.实现onRequestHistory事件,该事件会在ui点击查看历史的时候发起,用于展示历史列表

关键在于获取到history的内容,调用refreshHistory方法

javascript 复制代码
docEditor.refreshHistory(// show the document version history
{
	currentVersion: "31",
	history: historyList
})

historyList 的数据结构

javascript 复制代码
[{
	"serverVersion": "7.4.0",//来源回调的history,第一个版本无需该字段
	"changes": [{//来源回调的history,第一个版本该字段为null
		"created": "2023-09-28 02:01:25",
		"user": {
			"id": "uid-2",
			"name": "group-2 xxx"
		}
	}, {
		"created": "2023-09-28 02:01:49",
		"user": {
			"id": "uid-3",
			"name": "group-3 Hamish Mitchell"
		}
	}],
	"key": "__ffff_200.200.170.119new.docx291695866450703",来源回调的key
	"version": 30,//需要自己维护
	"created": "2023-09-28 02:01:25",//自己维护,一般是打开文档的时候记录
	"user": {//自己维护,一般是打开文档的时候记录
		"id": "uid-2",
		"name": "group-2 xxx"
	}
}]

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

javascript 复制代码
 {
  key: '1696822265751m4sq5vs50j',
  status: 2,
  url: 'http://xxx/cache/files/data/1696822265751m4sq5vs50j_9201/output.docx/output.docx?md5=jljJJVUlAm4pYX_6mvC_Lw&expires=1696823346&filename=output.docx',
  changesurl: 'http://xxxx/cache/files/data/1696822265751m4sq5vs50j_9201/changes.zip/changes.zip?md5=ivaLJ_lI0MK5nBdCqy8HLw&expires=1696823346&filename=changes.zip',
  history: { serverVersion: '7.4.0', changes: [ [Object] ] },
  users: [ '64773bdb97acf80031f4ef56' ],
  actions: [ { type: 0, userid: '64773bdb97acf80031f4ef56' } ],
  lastsave: '2023-10-09T03:33:46.000Z',
  notmodified: true,
  filetype: 'docx'
}

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

2.实现onRequestHistoryData事件,该事件会ui点击查看具体的某个历史的时候触发

关键在于获取某个版本的具体historyData,调用setHistoryData方法发起请求

javascript 复制代码
function onRequestHistoryData(data) {
		var version = data.data;//对应点击哪个版本
        docEditor.setHistoryData(historyData);
}

historyData的数据结构

javascript 复制代码
{
"fileType": "docx",
"version": 25,
"key": "xxxxxx",
"url": "http://xxxxx/history?fileName=new.docx&file=prev.docx&ver=25&useraddress=xxx",//当前版本下载的url
"directUrl": null,
"previous": {//上一个版本的信息,如果无上个版本,可以不要这个字段,例如第一个版本
	"fileType": "docx",
	"key": "new.docx231684394201684",
	"url": "http://xxx/history?fileName=new.docx&file=prev.docx&ver=24&useraddress=xxxx",
	"directUrl": null
},
"changesUrl": "http://xxxx&file=diff.zip&ver=24",//下载当前版本历史记录存储的diff.zip文件
"token": "eyJhbGciOiJIUzI1NiIsInR"//当条数据签名
}

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

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()即可

相关推荐
计算机毕业编程指导师12 小时前
【大数据毕设选题推荐】基于Spark的WTA职业网球赛事演变与竞技格局分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·python·计算机·spark·毕业设计·课程设计·wta网球
Sweet锦12 小时前
不调 Python,不装向量库:我用纯 Java 写了一套以图搜图引擎
java·人工智能·开源·图搜索
言乐613 小时前
Python区分广度优先深度优先宽度优先的区别
python·算法·深度优先·广度优先·宽度优先
打工仔折腾 AI13 小时前
LLaMA 1 到 LLaMA 3 架构演进拆解:从 RoPE、GQA 到词表扩张
人工智能·后端·python·深度学习·langchain·llama
如意猴13 小时前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法
可乐鸡翅yeah_13 小时前
HLS 分片过期清理,直播旧 TS 分片磁盘爆满问题处理
java·后端·spring·m3u8·m3u8在线·音视频在线播放
旋生万物13 小时前
螺旋角分布的功率谱分析:多窗谱 + FDR 校正
开发语言·python
专业程序开发源14 小时前
SSM校园拍摄交流服务平台36936-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·php·课程设计
用户0942485680314 小时前
第23章:OpenJDK逃逸分析、标量替换与锁优化
java·jvm
wuminyu14 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++