|
@@ -348,6 +348,7 @@ import {
|
|
} from '@/services/common';
|
|
} from '@/services/common';
|
|
import { useEnterprise } from '@/services/enterprise';
|
|
import { useEnterprise } from '@/services/enterprise';
|
|
import { CheckIcon,HomeIcon ,DesktopIcon ,ControlPlatformIcon,AppIcon} from 'tdesign-icons-vue-next';
|
|
import { CheckIcon,HomeIcon ,DesktopIcon ,ControlPlatformIcon,AppIcon} from 'tdesign-icons-vue-next';
|
|
|
|
+import { getDownloadList } from '@/services/download';
|
|
|
|
|
|
const { enterprise } = useEnterprise();
|
|
const { enterprise } = useEnterprise();
|
|
const router = useRouter();
|
|
const router = useRouter();
|
|
@@ -380,8 +381,33 @@ const initMeta2dName = () => {
|
|
data.name = (meta2d.store.data as Meta2dBackData).name || '';
|
|
data.name = (meta2d.store.data as Meta2dBackData).name || '';
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+let downloadList = new Set();
|
|
|
|
+let iframeNum = 0;
|
|
|
|
+let compareNum = 0;
|
|
nextTick(() => {
|
|
nextTick(() => {
|
|
meta2d.on('opened', initMeta2dName);
|
|
meta2d.on('opened', initMeta2dName);
|
|
|
|
+ window.addEventListener('message', function (e) {
|
|
|
|
+ if (typeof e.data !== 'string'||!e.data||e.data.startsWith('setImmediate')) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ let data = JSON.parse(e.data);
|
|
|
|
+ if (typeof data === 'object') {
|
|
|
|
+ if(data.type && data.name==='download'){
|
|
|
|
+ downloadList = new Set([...downloadList, ...data.data]);
|
|
|
|
+ compareNum+=1;
|
|
|
|
+ if(compareNum>=iframeNum){
|
|
|
|
+ saveDownload();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ meta2d.emit(data.name);
|
|
|
|
+ } else {
|
|
|
|
+ meta2d.emit(data);
|
|
|
|
+ }
|
|
|
|
+ } catch (e) {
|
|
|
|
+ console.info(e);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
});
|
|
});
|
|
|
|
|
|
onUnmounted(() => {
|
|
onUnmounted(() => {
|
|
@@ -697,6 +723,174 @@ const downloadHtml = async () => {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if(user.vipDesc !== '超级会员'&&user.vipDesc !=='旗舰会员'){
|
|
|
|
+ MessagePlugin.info('需要开通超级会员~');
|
|
|
|
+ gotoAccount();
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ MessagePlugin.info('正在下载打包中,可能需要几分钟,请耐心等待...');
|
|
|
|
+ compareNum = 0;
|
|
|
|
+ const meta2dData = meta2d.data();
|
|
|
|
+
|
|
|
|
+ const pen_3d = meta2dData.pens.filter(
|
|
|
|
+ (pen) =>
|
|
|
|
+ pen.name === 'iframe' &&
|
|
|
|
+ (pen.iframe.indexOf('3d.le5le.com') !== -1)
|
|
|
|
+ );
|
|
|
|
+ if (pen_3d && pen_3d.length) {
|
|
|
|
+ //存在3d场景
|
|
|
|
+ if(pen_3d.length===1){
|
|
|
|
+ let params = queryURLParams(pen_3d[0].iframe.split('?')[1]);
|
|
|
|
+ meta2d.store.pens[pen_3d[0].id].calculative.singleton.div.children[0].contentWindow.postMessage(
|
|
|
|
+ JSON.stringify({
|
|
|
|
+ name:'deploy',
|
|
|
|
+ // id: params.id,
|
|
|
|
+ type:1, //用于区分是系统消息
|
|
|
|
+ path:`3d`
|
|
|
|
+ }),
|
|
|
|
+ '*'
|
|
|
|
+ );
|
|
|
|
+ pen_3d.iframe = '/view?data=3d';
|
|
|
|
+ }else{
|
|
|
|
+ pen_3d.forEach((pen) => {
|
|
|
|
+ //发送消息
|
|
|
|
+ let params = queryURLParams(pen.iframe.split('?')[1]);
|
|
|
|
+ (
|
|
|
|
+ meta2d.store.pens[pen.id].calculative.singleton.div.children[0] as HTMLIFrameElement
|
|
|
|
+ ).contentWindow.postMessage(
|
|
|
|
+ JSON.stringify({
|
|
|
|
+ name:'deploy',
|
|
|
|
+ // id: params.id,
|
|
|
|
+ type:1,
|
|
|
|
+ path:`3d-${params.id}`
|
|
|
|
+ }),
|
|
|
|
+ '*'
|
|
|
|
+ );
|
|
|
|
+ pen.iframe = `/view?data=3d-${params.id}`;
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ iframeNum+= pen_3d.length;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const pen_2d = meta2dData.pens.filter(
|
|
|
|
+ (pen) =>
|
|
|
|
+ pen.name === 'iframe' &&
|
|
|
|
+ (pen.iframe.indexOf('2d.le5le.com') !== -1)
|
|
|
|
+ );
|
|
|
|
+ if (pen_2d && pen_2d.length) {
|
|
|
|
+ //存在3d场景
|
|
|
|
+ if(pen_2d.length===1){
|
|
|
|
+ let params = queryURLParams(pen_2d[0].iframe.split('?')[1]);
|
|
|
|
+ meta2d.store.pens[pen_2d[0].id].calculative.singleton.div.children[0].contentWindow.postMessage(
|
|
|
|
+ JSON.stringify({
|
|
|
|
+ name:'downloadHtml',
|
|
|
|
+ id: params.id,
|
|
|
|
+ type:1,
|
|
|
|
+ path:`2d`
|
|
|
|
+ }),
|
|
|
|
+ '*'
|
|
|
|
+ );
|
|
|
|
+ pen_2d[0].iframe = '/view?data=2d'
|
|
|
|
+ }else{
|
|
|
|
+ pen_2d.forEach((pen) => {
|
|
|
|
+ //发送消息
|
|
|
|
+ let params = queryURLParams(pen.iframe.split('?')[1]);
|
|
|
|
+ (
|
|
|
|
+ meta2d.store.pens[pen.id].calculative.singleton.div.children[0] as HTMLIFrameElement
|
|
|
|
+ ).contentWindow.postMessage(
|
|
|
|
+ JSON.stringify({
|
|
|
|
+ name:'downloadHtml',
|
|
|
|
+ // id: params.id,
|
|
|
|
+ type:1,
|
|
|
|
+ path:`2d-${params.id}`
|
|
|
|
+ }),
|
|
|
|
+ '*'
|
|
|
|
+ );
|
|
|
|
+ });
|
|
|
|
+ pen.iframe = `/view?data=2d-${params.id}`
|
|
|
|
+ }
|
|
|
|
+ iframeNum+= pen_2d.length;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const pen_v = meta2dData.pens.filter(
|
|
|
|
+ (pen) =>
|
|
|
|
+ pen.name === 'iframe' &&
|
|
|
|
+ (pen.iframe.indexOf('/preview') !== -1)
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ if (pen_v && pen_v.length) {
|
|
|
|
+ //存在3d场景
|
|
|
|
+ pen_v.forEach((pen) => {
|
|
|
|
+ //发送消息
|
|
|
|
+ let params = queryURLParams(pen.iframe.split('?')[1]);
|
|
|
|
+ (
|
|
|
|
+ meta2d.store.pens[pen.id].calculative.singleton.div.children[0] as HTMLIFrameElement
|
|
|
|
+ ).contentWindow.postMessage(
|
|
|
|
+ JSON.stringify({
|
|
|
|
+ name:'downloadHtml',
|
|
|
|
+ // id: params.id,
|
|
|
|
+ type:1,
|
|
|
|
+ path:`v-${params.id}`
|
|
|
|
+ }),
|
|
|
|
+ '*'
|
|
|
|
+ );
|
|
|
|
+ pen.iframe = `/view?data=v-${params.id}`
|
|
|
|
+ });
|
|
|
|
+ iframeNum+= pen_v.length;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ downloadList = getDownloadList(meta2dData);
|
|
|
|
+
|
|
|
|
+ if(iframeNum===0){
|
|
|
|
+ //如果没有嵌入场景
|
|
|
|
+ saveDownload();
|
|
|
|
+ }else{
|
|
|
|
+ setTimeout(()=>{
|
|
|
|
+ if(compareNum < iframeNum){
|
|
|
|
+ //message阻塞/报错的情况
|
|
|
|
+ saveDownload();
|
|
|
|
+ }
|
|
|
|
+ },10000);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const saveDownload = async()=>{
|
|
|
|
+ const [{ default: JSZip }, { saveAs }] = await Promise.all([
|
|
|
|
+ import('jszip'),
|
|
|
|
+ import('file-saver'),
|
|
|
|
+ ]);
|
|
|
|
+ const zip = new JSZip();
|
|
|
|
+
|
|
|
|
+ await Promise.all([...downloadList].map(async(item)=>{
|
|
|
|
+ if(item.url){
|
|
|
|
+ //接口请求
|
|
|
|
+ const res: Blob = await axios.get(item.url, {
|
|
|
|
+ responseType: 'blob',
|
|
|
|
+ });
|
|
|
|
+ zip.file(item.path, res, { createFolders: true });
|
|
|
|
+ }else if(item.data){
|
|
|
|
+ //直接写数据
|
|
|
|
+ zip.file(
|
|
|
|
+ item.path,
|
|
|
|
+ item.data, { createFolders: true }
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+ }));
|
|
|
|
+ let _fileName =
|
|
|
|
+ (data.name && data.name.replace(/\//g, '_').replace(/:/g, '_')) ||
|
|
|
|
+ 'le5le.meta2d';
|
|
|
|
+ const blob = await zip.generateAsync({ type: 'blob' });
|
|
|
|
+ saveAs(blob, `${_fileName}.zip`);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+const _downloadHtml = async () => {
|
|
|
|
+ if (!(user && user.id)) {
|
|
|
|
+ MessagePlugin.warning(noLoginTip);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
// if (!user.isVip) {
|
|
// if (!user.isVip) {
|
|
// gotoAccount();
|
|
// gotoAccount();
|
|
// return;
|
|
// return;
|