1.增加撤销和恢复功能

2.优化从工具栏拖拽组件到画布时组件初始位置
tclqwl 3 years ago
parent 4f704f64a2
commit 482c865f92

@ -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);
}
}

@ -88,6 +88,29 @@
<i class="iconfont iconyulan" @click="viewScreen"></i>
</el-tooltip>
</span>
<span class="btn">
<el-tooltip
class="item"
effect="dark"
content="撤销"
placement="bottom"
>
<i class="iconfont" @click="handleUndo"></i>
</el-tooltip>
</span>
<span class="btn">
<el-tooltip
class="item"
effect="dark"
content="恢复"
placement="bottom"
>
<i class="iconfont" @click="handleRedo"></i>
</el-tooltip>
</span>
<span class="btn" v-permission="'bigScreenManage:export'">
<el-tooltip
class="item"
@ -263,6 +286,7 @@ import draggable from "vuedraggable";
import VueRulerTool from "vue-ruler-tool"; //
import contentMenu from "./components/contentMenu";
import { getToken } from "@/utils/auth";
import { Revoke } from '@/utils/revoke' // 2022-02-22
export default {
name: "Login",
@ -290,6 +314,7 @@ export default {
bigscreenWidth: 1920, //
bigscreenHeight: 1080,
revoke: null, // 2022-02-22
// gaea_report_dashboard
dashboard: {
@ -395,10 +420,18 @@ export default {
widgets: {
handler(val) {
this.handlerLayerWidget(val);
//
this.$nextTick(() => {
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);
//20220222
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));
//

Loading…
Cancel
Save