|
@@ -103,7 +103,6 @@
|
|
|
</svg>
|
|
|
</a>
|
|
|
</t-tooltip>
|
|
|
- <!-- <t-tooltip content="连线" placement="top"> -->
|
|
|
<t-dropdown
|
|
|
:minColumnWidth="200"
|
|
|
:maxHeight="560"
|
|
@@ -123,7 +122,6 @@
|
|
|
<t-dropdown-item v-for="item in lineTypes">
|
|
|
<div class="flex middle" @click="changeLineType(item.value)">
|
|
|
{{ item.name }} <span class="flex-grow"></span>
|
|
|
- <!-- <t-icon v-show="item.value === currentLineType" name="check" /> -->
|
|
|
<svg class="l-icon" aria-hidden="true">
|
|
|
<use :xlink:href="item.icon"></use>
|
|
|
</svg>
|
|
@@ -223,13 +221,20 @@
|
|
|
<t-tooltip content="运行(查看)" placement="bottom">
|
|
|
<a @click="preview"><t-icon name="caret-right" /></a>
|
|
|
</t-tooltip>
|
|
|
-
|
|
|
- <t-tooltip content="手机查看" placement="bottom">
|
|
|
- <a><t-icon name="qrcode" /></a>
|
|
|
- </t-tooltip>
|
|
|
<t-tooltip content="分享" placement="bottom">
|
|
|
- <a><t-icon name="share" /></a>
|
|
|
+ <a @click="share">
|
|
|
+ <t-icon name="share" :class="{ primary: shared }" />
|
|
|
+ </a>
|
|
|
</t-tooltip>
|
|
|
+ <t-popup placement="bottom" trigger="click" v-model="qrcode.visible">
|
|
|
+ <a @mouseenter="qrcode.visible = true"><t-icon name="qrcode" /></a>
|
|
|
+ <template #content>
|
|
|
+ <div style="padding: 12px 12px 6px 12px">
|
|
|
+ <img :src="qrcode.url" />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </t-popup>
|
|
|
+
|
|
|
<t-tooltip content="发布" placement="bottom">
|
|
|
<a><t-icon name="cloud" /></a>
|
|
|
</t-tooltip>
|
|
@@ -424,18 +429,16 @@ import {
|
|
|
Options,
|
|
|
Pen,
|
|
|
deepClone,
|
|
|
- LockState,
|
|
|
PenType,
|
|
|
HoverType,
|
|
|
} from '@meta2d/core';
|
|
|
import localforage from 'localforage';
|
|
|
import dayjs from 'dayjs';
|
|
|
-import axios from 'axios';
|
|
|
-import { MessagePlugin } from 'tdesign-vue-next';
|
|
|
+import QRCode from 'qrcode';
|
|
|
|
|
|
import { registerBasicDiagram } from '@/services/register';
|
|
|
import { useUser } from '@/services/user';
|
|
|
-import { cdn, getLe5le2d } from '@/services/api';
|
|
|
+import { cdn, getLe5le2d, updateCollection } from '@/services/api';
|
|
|
import {
|
|
|
save,
|
|
|
newFile,
|
|
@@ -444,23 +447,20 @@ import {
|
|
|
onScaleWindow,
|
|
|
useDot,
|
|
|
} from '@/services/common';
|
|
|
-import { useSelection, SelectionMode } from '@/services/selections';
|
|
|
+import { useSelection } from '@/services/selections';
|
|
|
import { defaultFormat } from '@/services/defaults';
|
|
|
-import {
|
|
|
- checkData,
|
|
|
- localMeta2dDataName,
|
|
|
- Meta2dBackData,
|
|
|
-} from '@/services/utils';
|
|
|
+import { checkData, localStorageName, Meta2dBackData } from '@/services/utils';
|
|
|
import { debounce } from '@/services/debouce';
|
|
|
import { importExcel } from '@/services/excel';
|
|
|
|
|
|
import ContextMenu from './ContextMenu.vue';
|
|
|
import Network from './Network.vue';
|
|
|
+import { MessagePlugin } from 'tdesign-vue-next';
|
|
|
|
|
|
const router = useRouter();
|
|
|
const route = useRoute();
|
|
|
-const { user, message, getUser, getMessage, signout } = useUser();
|
|
|
-const { dot, setDot, getDot } = useDot();
|
|
|
+const { user } = useUser();
|
|
|
+const { dot, setDot } = useDot();
|
|
|
const { select } = useSelection();
|
|
|
|
|
|
const meta2dOptions: Options = {
|
|
@@ -475,6 +475,15 @@ const meta2dOptions: Options = {
|
|
|
disableAnchor: true,
|
|
|
defaultFormat: { ...defaultFormat },
|
|
|
};
|
|
|
+
|
|
|
+let timer: any = 0;
|
|
|
+
|
|
|
+const shared = ref<boolean>(false);
|
|
|
+const qrcode = reactive({
|
|
|
+ visible: false,
|
|
|
+ url: '',
|
|
|
+});
|
|
|
+
|
|
|
onMounted(() => {
|
|
|
meta2d = new Meta2d('meta2d', meta2dOptions);
|
|
|
registerBasicDiagram();
|
|
@@ -489,18 +498,42 @@ onMounted(() => {
|
|
|
meta2d.on('add', lineAdd);
|
|
|
meta2d.on('opened', openedListener);
|
|
|
|
|
|
- meta2d.on('undo', autoSave);
|
|
|
- meta2d.on('redo', autoSave);
|
|
|
- meta2d.on('add', autoSave);
|
|
|
- meta2d.on('delete', autoSave);
|
|
|
- meta2d.on('rotatePens', autoSave);
|
|
|
- meta2d.on('translatePens', autoSave);
|
|
|
+ meta2d.on('undo', patchFlag);
|
|
|
+ meta2d.on('redo', patchFlag);
|
|
|
+ meta2d.on('add', patchFlag);
|
|
|
+ meta2d.on('delete', patchFlag);
|
|
|
+ meta2d.on('rotatePens', patchFlag);
|
|
|
+ meta2d.on('translatePens', patchFlag);
|
|
|
|
|
|
// 所有编辑栏所做修改
|
|
|
- meta2d.on('components-update-value', autoSave);
|
|
|
+ meta2d.on('components-update-value', patchFlag);
|
|
|
// @ts-ignore
|
|
|
meta2d.on('contextmenu', contextmenu);
|
|
|
meta2d.on('click', canvasClick);
|
|
|
+
|
|
|
+ timer = setInterval(() => {
|
|
|
+ // 没有更新,不用保存
|
|
|
+ if (!dot.value) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const data: any = meta2d.data();
|
|
|
+
|
|
|
+ if (
|
|
|
+ user &&
|
|
|
+ user.id &&
|
|
|
+ !user.vipExpired &&
|
|
|
+ data._id &&
|
|
|
+ !data.component &&
|
|
|
+ data.owner &&
|
|
|
+ data.owner.id === user.id
|
|
|
+ ) {
|
|
|
+ save(SaveType.Save);
|
|
|
+ } else {
|
|
|
+ data.updateAt = dayjs().format();
|
|
|
+ localforage.setItem(localStorageName, JSON.stringify(data));
|
|
|
+ }
|
|
|
+ }, 60000);
|
|
|
});
|
|
|
|
|
|
const watcher = watch(
|
|
@@ -512,10 +545,21 @@ const watcher = watch(
|
|
|
|
|
|
const open = async () => {
|
|
|
if (route.query.id) {
|
|
|
- const ret: any = getLe5le2d(route.query.id + '');
|
|
|
- ret && meta2d.open(ret);
|
|
|
+ const ret: any = await getLe5le2d(route.query.id + '');
|
|
|
+ if (ret) {
|
|
|
+ meta2d.open(ret);
|
|
|
+ shared.value = ret.shared;
|
|
|
+
|
|
|
+ const qr: any = await QRCode.toDataURL(
|
|
|
+ `https://view2d.le5le.com/?id=${route.query.id + ''}`
|
|
|
+ );
|
|
|
+ qrcode.url = qr;
|
|
|
+ }
|
|
|
} else {
|
|
|
- meta2d.open();
|
|
|
+ const data: string = await localforage.getItem(localStorageName);
|
|
|
+ if (data) {
|
|
|
+ meta2d.open(JSON.parse(data));
|
|
|
+ }
|
|
|
}
|
|
|
meta2d.store.data.x = meta2d.store.options.x || 0;
|
|
|
meta2d.store.data.y = meta2d.store.options.y || 0;
|
|
@@ -534,7 +578,12 @@ const openedListener = () => {
|
|
|
toArrow.value = canvasToArrow || '';
|
|
|
};
|
|
|
|
|
|
+const patchFlag = () => {
|
|
|
+ setDot(true);
|
|
|
+};
|
|
|
+
|
|
|
onUnmounted(() => {
|
|
|
+ clearInterval(timer);
|
|
|
watcher();
|
|
|
if (meta2d) {
|
|
|
// @ts-ignore
|
|
@@ -547,13 +596,13 @@ onUnmounted(() => {
|
|
|
meta2d.off('add', lineAdd);
|
|
|
meta2d.on('opened', openedListener);
|
|
|
|
|
|
- meta2d.off('undo', autoSave);
|
|
|
- meta2d.off('redo', autoSave);
|
|
|
- meta2d.off('add', autoSave);
|
|
|
- meta2d.off('delete', autoSave);
|
|
|
- meta2d.off('rotatePens', autoSave);
|
|
|
- meta2d.off('translatePens', autoSave);
|
|
|
- meta2d.off('components-update-value', autoSave);
|
|
|
+ meta2d.off('undo', patchFlag);
|
|
|
+ meta2d.off('redo', patchFlag);
|
|
|
+ meta2d.off('add', patchFlag);
|
|
|
+ meta2d.off('delete', patchFlag);
|
|
|
+ meta2d.off('rotatePens', patchFlag);
|
|
|
+ meta2d.off('translatePens', patchFlag);
|
|
|
+ meta2d.off('components-update-value', patchFlag);
|
|
|
// @ts-ignore
|
|
|
meta2d.off('contextmenu', contextmenu);
|
|
|
meta2d.off('click', canvasClick);
|
|
@@ -562,45 +611,6 @@ onUnmounted(() => {
|
|
|
}
|
|
|
});
|
|
|
|
|
|
-let localSaveTimer: any = 0;
|
|
|
-let saveTimer: any = 0;
|
|
|
-const autoSave = () => {
|
|
|
- setDot(true);
|
|
|
- localSaveTimer && clearTimeout(localSaveTimer);
|
|
|
- localSaveTimer = setTimeout(() => {
|
|
|
- const data: Meta2dBackData = meta2d.data();
|
|
|
- let _localMeta2dDataName = data._id
|
|
|
- ? localMeta2dDataName + '-' + data._id
|
|
|
- : localMeta2dDataName;
|
|
|
- (data as any).localSaveAt = dayjs().format();
|
|
|
- localforage.setItem(_localMeta2dDataName, JSON.stringify(data));
|
|
|
- localSaveTimer = undefined;
|
|
|
- }, 3000);
|
|
|
- autoSaveServer();
|
|
|
-};
|
|
|
-//运行 在新标签页查看
|
|
|
-function autoSaveServer() {
|
|
|
- //会员享受自动保存
|
|
|
- if (saveTimer) {
|
|
|
- return;
|
|
|
- }
|
|
|
- saveTimer = setTimeout(() => {
|
|
|
- const data: Meta2dBackData = meta2d.data();
|
|
|
- if (
|
|
|
- user &&
|
|
|
- user.id &&
|
|
|
- user.vipExpired &&
|
|
|
- data._id &&
|
|
|
- !data.component &&
|
|
|
- data.owner &&
|
|
|
- data.owner?.id === user.id
|
|
|
- ) {
|
|
|
- save(SaveType.Save);
|
|
|
- }
|
|
|
- saveTimer = null;
|
|
|
- }, 60000);
|
|
|
-}
|
|
|
-
|
|
|
const inactive = () => {
|
|
|
select();
|
|
|
};
|
|
@@ -834,7 +844,7 @@ const preview = async () => {
|
|
|
await save(SaveType.Save);
|
|
|
}
|
|
|
if (!data._id) {
|
|
|
- await localforage.setItem(localMeta2dDataName, JSON.stringify(data));
|
|
|
+ await localforage.setItem(localStorageName, JSON.stringify(data));
|
|
|
}
|
|
|
router.push({
|
|
|
path: '/preview',
|
|
@@ -1017,6 +1027,21 @@ const importDataset = async () => {
|
|
|
console.log('data', data);
|
|
|
dataDialog.dataset = data;
|
|
|
};
|
|
|
+
|
|
|
+const share = async () => {
|
|
|
+ if (!route.query.id) {
|
|
|
+ MessagePlugin.error('请先保存!');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const ret: any = await updateCollection('le5le2d', {
|
|
|
+ _id: route.query.id,
|
|
|
+ shared: !shared.value,
|
|
|
+ });
|
|
|
+ if (ret) {
|
|
|
+ shared.value = ret.shared;
|
|
|
+ }
|
|
|
+};
|
|
|
</script>
|
|
|
<style lang="postcss" scoped>
|
|
|
.meta2d {
|