diff --git a/report-ui/src/utils/revoke.js b/report-ui/src/utils/revoke.js new file mode 100644 index 00000000..119b7699 --- /dev/null +++ b/report-ui/src/utils/revoke.js @@ -0,0 +1,102 @@ +/** + 撤销重做功能 + * @Author: eyas66 + * @Mail: 33955341@qq.com + * @Date: 2021-12-13 10:09:23 + * @Last Modified by: eyas66 + * @Last Modified time: 2021-12-13 10:09:23 + */ +export class Revoke { + // 历史记录 + recordList = []; + + // 撤销记录,用于重做 + redoList = []; + + // 当前记录用currentRecord变量暂时存储,当用户修改时,再存放到recordList + currentRecord = null; + + // 上次插入数据时间 + time = 0; + + /** + * @description: 插入历史记录 + * @param {object}record + * @return {boolean} + */ + push(record) { + const nowTime = Date.now(); + // 防止添加重复的时间,当添加间隔小于100ms时,则替换当前记录并取消执行添加 + if (this.time + 100 > nowTime) { + this.currentRecord = JSON.stringify(record); + return false; + } + + this.time = nowTime; + + // 判断之前是否已经存在currentRecord记录,有则存储到recordList + if (this.currentRecord) { + this.recordList.push(this.currentRecord); + //(清空记录)增加记录后则应该清空重做记录 + //splice() 方法向/从数组添加/删除项目,并返回删除的项目。 + this.redoList.splice(0, this.redoList.length); + } + + // 将json转成字符串存储 + this.currentRecord = JSON.stringify(record); + + // 最多存储2000条记录,超过2000条记录则删除之前的记录 + if (this.length > 2000) { + //unshift() 方法将新项添加到数组的开头,并返回新的长度。 + this.recordList.unshift(); + } + + return true; + } + + /** + * @description: 撤销操作 + * @param {*} + * @return {object} + */ + undo() { + // 没有记录时,返回false + // 新建的recordList里面,不知为什么会存在一条记录,未找到原因,所以就判断长度为1时就不能撤销了。 + if (this.recordList.length === 1 ) { + return false; + } + //pop(): 方法用于删除并返回数组的最后一个元素。 + const record = this.recordList.pop(); + + // 将当前记录添加到重做记录里面 + if (this.currentRecord) { + this.redoList.push(this.currentRecord); + } + // 丢弃当前记录,防止重复添加 + this.currentRecord = null; + //返回撤销的记录 + return JSON.parse(record); + } + + /** + * @description: 重做操作 + * @param {*} + * @return {*} + */ + redo() { + // 没有重做记录时,返回false + if (this.redoList.length === 0) { + return false; + } + //pop(): 方法用于删除并返回数组的最后一个元素。 + const record = this.redoList.pop(); + // 添加到重做记录里面 + if (this.currentRecord) { + this.recordList.push(this.currentRecord); + } + // 丢弃当前记录,防止重复添加 + this.currentRecord = null; + + return JSON.parse(record); + } +} diff --git a/report-ui/src/views/bigscreenDesigner/designer/index.vue b/report-ui/src/views/bigscreenDesigner/designer/index.vue index a72a81c9..8109f0c2 100644 --- a/report-ui/src/views/bigscreenDesigner/designer/index.vue +++ b/report-ui/src/views/bigscreenDesigner/designer/index.vue @@ -88,6 +88,29 @@ + + + + 撤销 + + + + + + 恢复 + + + { + this.revoke.push(this.widgets) + }) }, deep: true } }, + created() { + /* 以下是记录历史的 */ + this.revoke = new Revoke() + }, mounted() { // 如果是新的设计工作台 this.initEchartData(); @@ -408,6 +441,30 @@ export default { }); }, methods: { + /** + * @description: 恢复 + * @param {*} + * @return {*} + */ + handleUndo() { + const record = this.revoke.undo() + if (!record) { + return false + } + this.widgets = record + }, + /** + * @description: 重做 + * @param {*} + * @return {*} + */ + handleRedo() { + const record = this.revoke.redo() + if (!record) { + return false + } + this.widgets = record + }, handlerLayerWidget(val) { const layerWidgetArr = []; for (let i = 0; i < val.length; i++) { @@ -639,6 +696,13 @@ export default { }; // 处理默认值 const widgetJsonValue = this.handleDefaultValue(widgetJson); + + //2022年02月22日 修复:可以拖拽放到鼠标的位置 + widgetJsonValue.value.position.left = + x - widgetJsonValue.value.position.width / 2 + widgetJsonValue.value.position.top = + y - widgetJsonValue.value.position.height / 2 + // 将选中的复制组件,放到工作区中去 this.widgets.push(this.deepClone(widgetJsonValue)); // 激活新组件的配置属性