|
@@ -4,13 +4,8 @@
|
|
<img src="/favicon.ico" />
|
|
<img src="/favicon.ico" />
|
|
<span> {{ enterprise.name }}</span>
|
|
<span> {{ enterprise.name }}</span>
|
|
</a>
|
|
</a>
|
|
- <t-dropdown
|
|
|
|
- :minColumnWidth="200"
|
|
|
|
- :maxHeight="560"
|
|
|
|
- :delay2="[10, 150]"
|
|
|
|
- overlayClassName="header-dropdown"
|
|
|
|
- trigger1="click"
|
|
|
|
- >
|
|
|
|
|
|
+ <t-dropdown :minColumnWidth="200" :maxHeight="560" :delay2="[10, 150]" overlayClassName="header-dropdown"
|
|
|
|
+ trigger1="click">
|
|
<a> 文件 </a>
|
|
<a> 文件 </a>
|
|
<t-dropdown-menu>
|
|
<t-dropdown-menu>
|
|
<t-dropdown-item @click="newFile">
|
|
<t-dropdown-item @click="newFile">
|
|
@@ -85,12 +80,7 @@
|
|
</t-dropdown-item>
|
|
</t-dropdown-item>
|
|
</t-dropdown-menu>
|
|
</t-dropdown-menu>
|
|
</t-dropdown>
|
|
</t-dropdown>
|
|
- <t-dropdown
|
|
|
|
- :minColumnWidth="180"
|
|
|
|
- :maxHeight="500"
|
|
|
|
- :delay2="[10, 150]"
|
|
|
|
- overlayClassName="header-dropdown"
|
|
|
|
- >
|
|
|
|
|
|
+ <t-dropdown :minColumnWidth="180" :maxHeight="500" :delay2="[10, 150]" overlayClassName="header-dropdown">
|
|
<a> 编辑 </a>
|
|
<a> 编辑 </a>
|
|
<t-dropdown-menu>
|
|
<t-dropdown-menu>
|
|
<t-dropdown-item>
|
|
<t-dropdown-item>
|
|
@@ -142,12 +132,7 @@
|
|
</t-dropdown-item>
|
|
</t-dropdown-item>
|
|
</t-dropdown-menu>
|
|
</t-dropdown-menu>
|
|
</t-dropdown>
|
|
</t-dropdown>
|
|
- <t-dropdown
|
|
|
|
- :minColumnWidth="180"
|
|
|
|
- :maxHeight="500"
|
|
|
|
- :delay2="[10, 150]"
|
|
|
|
- overlayClassName="header-dropdown"
|
|
|
|
- >
|
|
|
|
|
|
+ <t-dropdown :minColumnWidth="180" :maxHeight="500" :delay2="[10, 150]" overlayClassName="header-dropdown">
|
|
<a> 工具 </a>
|
|
<a> 工具 </a>
|
|
<t-dropdown-menu>
|
|
<t-dropdown-menu>
|
|
<t-dropdown-item>
|
|
<t-dropdown-item>
|
|
@@ -200,30 +185,19 @@
|
|
</t-dropdown-item>
|
|
</t-dropdown-item>
|
|
<t-dropdown-item>
|
|
<t-dropdown-item>
|
|
<a @click="onToggleAnchor">
|
|
<a @click="onToggleAnchor">
|
|
- <div
|
|
|
|
- class="flex"
|
|
|
|
- :style="{
|
|
|
|
- color: showAnchor ? '' : '#4f5b75',
|
|
|
|
- }"
|
|
|
|
- >
|
|
|
|
|
|
+ <div class="flex" :style="{
|
|
|
|
+ color: showAnchor ? '' : '#4f5b75',
|
|
|
|
+ }">
|
|
添加/删除锚点 <span class="flex-grow"></span> A
|
|
添加/删除锚点 <span class="flex-grow"></span> A
|
|
</div>
|
|
</div>
|
|
</a>
|
|
</a>
|
|
</t-dropdown-item>
|
|
</t-dropdown-item>
|
|
</t-dropdown-menu>
|
|
</t-dropdown-menu>
|
|
</t-dropdown>
|
|
</t-dropdown>
|
|
- <t-dropdown
|
|
|
|
- :minColumnWidth="180"
|
|
|
|
- :maxHeight="500"
|
|
|
|
- :delay2="[10, 150]"
|
|
|
|
- overlayClassName="header-dropdown"
|
|
|
|
- >
|
|
|
|
|
|
+ <t-dropdown :minColumnWidth="180" :maxHeight="500" :delay2="[10, 150]" overlayClassName="header-dropdown">
|
|
<a> 帮助 </a>
|
|
<a> 帮助 </a>
|
|
<t-dropdown-menu>
|
|
<t-dropdown-menu>
|
|
- <t-dropdown-item
|
|
|
|
- v-for="item in enterprise.helps"
|
|
|
|
- :divider="item.divider"
|
|
|
|
- >
|
|
|
|
|
|
+ <t-dropdown-item v-for="item in enterprise.helps" :divider="item.divider">
|
|
<a :href="item.url" target="_blank">{{ item.name }}</a>
|
|
<a :href="item.url" target="_blank">{{ item.name }}</a>
|
|
</t-dropdown-item>
|
|
</t-dropdown-item>
|
|
</t-dropdown-menu>
|
|
</t-dropdown-menu>
|
|
@@ -252,31 +226,19 @@
|
|
<app-icon />
|
|
<app-icon />
|
|
2D可视化
|
|
2D可视化
|
|
</a>
|
|
</a>
|
|
- <t-dropdown
|
|
|
|
- v-if="user.id"
|
|
|
|
- :minColumnWidth="200"
|
|
|
|
- :maxHeight="500"
|
|
|
|
- :delay2="[10, 150]"
|
|
|
|
- overlayClassName="custom-dropdown header"
|
|
|
|
- >
|
|
|
|
|
|
+ <t-dropdown v-if="user.id" :minColumnWidth="200" :maxHeight="500" :delay2="[10, 150]"
|
|
|
|
+ overlayClassName="custom-dropdown header">
|
|
<a style="margin-left: 32px; margin-right: 12px">
|
|
<a style="margin-left: 32px; margin-right: 12px">
|
|
- <t-avatar
|
|
|
|
- size="small"
|
|
|
|
- :image="user.avatarUrl ? user.avatarUrl : baseUrl + 'img/avatar.png'"
|
|
|
|
- />
|
|
|
|
|
|
+ <t-avatar size="small" :image="user.avatarUrl ? user.avatarUrl : baseUrl + 'img/avatar.png'" />
|
|
</a>
|
|
</a>
|
|
<t-dropdown-menu>
|
|
<t-dropdown-menu>
|
|
<t-dropdown-item divider="true">
|
|
<t-dropdown-item divider="true">
|
|
<a :href="enterprise.account">
|
|
<a :href="enterprise.account">
|
|
{{ user.username }}
|
|
{{ user.username }}
|
|
- <label
|
|
|
|
- class="ml-16 vip-label"
|
|
|
|
- :style="{
|
|
|
|
- color: user.limit > 1 ? '#ff4000' : '#D5C781',
|
|
|
|
- background: user.limit > 1 ? '#ff400030' : '#D5C78133',
|
|
|
|
- }"
|
|
|
|
- >VIP</label
|
|
|
|
- >
|
|
|
|
|
|
+ <label class="ml-16 vip-label" :style="{
|
|
|
|
+ color: user.limit > 1 ? '#ff4000' : '#D5C781',
|
|
|
|
+ background: user.limit > 1 ? '#ff400030' : '#D5C78133',
|
|
|
|
+ }">VIP</label>
|
|
</a>
|
|
</a>
|
|
</t-dropdown-item>
|
|
</t-dropdown-item>
|
|
<t-dropdown-item divider="true">
|
|
<t-dropdown-item divider="true">
|
|
@@ -308,20 +270,9 @@
|
|
</a>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
- <t-dialog
|
|
|
|
- v-if="payListDialog.show"
|
|
|
|
- v-model:visible="payListDialog.show"
|
|
|
|
- class="pay-dialog"
|
|
|
|
- header="图纸用到的企业图形库"
|
|
|
|
- :close-on-overlay-click="false"
|
|
|
|
- :top="95"
|
|
|
|
- :width="700"
|
|
|
|
- cancel-btn="跳过"
|
|
|
|
- confirm-btn="结算(不支持退款)"
|
|
|
|
- @cancel="skipPay"
|
|
|
|
- @close="payListDialog.show = false"
|
|
|
|
- @confirm="prePay"
|
|
|
|
- >
|
|
|
|
|
|
+ <t-dialog v-if="payListDialog.show" v-model:visible="payListDialog.show" class="pay-dialog" header="图纸用到的企业图形库"
|
|
|
|
+ :close-on-overlay-click="false" :top="95" :width="700" cancel-btn="跳过" confirm-btn="结算(不支持退款)" @cancel="skipPay"
|
|
|
|
+ @close="payListDialog.show = false" @confirm="prePay">
|
|
<div class="pay-line">
|
|
<div class="pay-line">
|
|
<div></div>
|
|
<div></div>
|
|
<div>已购买</div>
|
|
<div>已购买</div>
|
|
@@ -329,11 +280,7 @@
|
|
</div>
|
|
</div>
|
|
<div class="pay-body">
|
|
<div class="pay-body">
|
|
<t-collapse defaultExpandAll>
|
|
<t-collapse defaultExpandAll>
|
|
- <t-collapse-panel
|
|
|
|
- v-if="[...prePayList.pngs].length"
|
|
|
|
- value="0"
|
|
|
|
- :header="data.goods[0].type"
|
|
|
|
- >
|
|
|
|
|
|
+ <t-collapse-panel v-if="[...prePayList.pngs].length" value="0" :header="data.goods[0].type">
|
|
<template #headerRightContent>
|
|
<template #headerRightContent>
|
|
<t-space size="small">
|
|
<t-space size="small">
|
|
<t-checkbox v-model="data.goods[0].checked"></t-checkbox>
|
|
<t-checkbox v-model="data.goods[0].checked"></t-checkbox>
|
|
@@ -350,16 +297,13 @@
|
|
}}
|
|
}}
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div>
|
|
- <check-icon
|
|
|
|
- v-show="data.purchasedList.some((item) => item.name === pngPen)"
|
|
|
|
- style="color: #4480f9ff"
|
|
|
|
- />
|
|
|
|
|
|
+ <check-icon v-show="data.purchasedList.some((item) => item.name === pngPen)" style="color: #4480f9ff" />
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div>
|
|
{{
|
|
{{
|
|
data.purchasedList.some((item) => item.name === pngPen)
|
|
data.purchasedList.some((item) => item.name === pngPen)
|
|
- ? 0
|
|
|
|
- : data.goods[0].unitPrice
|
|
|
|
|
|
+ ? 0
|
|
|
|
+ : data.goods[0].unitPrice
|
|
}}
|
|
}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@@ -372,11 +316,7 @@
|
|
<p v-else>已选择0个图元 小计:¥0</p>
|
|
<p v-else>已选择0个图元 小计:¥0</p>
|
|
</div>
|
|
</div>
|
|
</t-collapse-panel>
|
|
</t-collapse-panel>
|
|
- <t-collapse-panel
|
|
|
|
- v-if="[...prePayList.iotPens].length"
|
|
|
|
- value="1"
|
|
|
|
- :header="data.goods[1].type"
|
|
|
|
- >
|
|
|
|
|
|
+ <t-collapse-panel v-if="[...prePayList.iotPens].length" value="1" :header="data.goods[1].type">
|
|
<template #headerRightContent>
|
|
<template #headerRightContent>
|
|
<t-space size="small">
|
|
<t-space size="small">
|
|
<t-checkbox v-model="data.goods[1].checked"></t-checkbox>
|
|
<t-checkbox v-model="data.goods[1].checked"></t-checkbox>
|
|
@@ -390,16 +330,13 @@
|
|
{{ iotPensMap[iotPen]?.name || iotPen }}
|
|
{{ iotPensMap[iotPen]?.name || iotPen }}
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div>
|
|
- <check-icon
|
|
|
|
- v-show="data.purchasedList.some((item) => item.name === iotPen)"
|
|
|
|
- style="color: #4480f9ff"
|
|
|
|
- />
|
|
|
|
|
|
+ <check-icon v-show="data.purchasedList.some((item) => item.name === iotPen)" style="color: #4480f9ff" />
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div>
|
|
{{
|
|
{{
|
|
data.purchasedList.some((item) => item.name === iotPen)
|
|
data.purchasedList.some((item) => item.name === iotPen)
|
|
- ? 0
|
|
|
|
- : data.goods[1].unitPrice
|
|
|
|
|
|
+ ? 0
|
|
|
|
+ : data.goods[1].unitPrice
|
|
}}
|
|
}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@@ -412,11 +349,7 @@
|
|
<p v-else>已选择0个图元 小计:¥0</p>
|
|
<p v-else>已选择0个图元 小计:¥0</p>
|
|
</div>
|
|
</div>
|
|
</t-collapse-panel>
|
|
</t-collapse-panel>
|
|
- <t-collapse-panel
|
|
|
|
- v-if="[...prePayList.svgPens].length"
|
|
|
|
- value="2"
|
|
|
|
- :header="data.goods[2].type"
|
|
|
|
- >
|
|
|
|
|
|
+ <t-collapse-panel v-if="[...prePayList.svgPens].length" value="2" :header="data.goods[2].type">
|
|
<template #headerRightContent>
|
|
<template #headerRightContent>
|
|
<t-space size="small">
|
|
<t-space size="small">
|
|
<t-checkbox v-model="data.goods[2].checked"></t-checkbox>
|
|
<t-checkbox v-model="data.goods[2].checked"></t-checkbox>
|
|
@@ -429,21 +362,13 @@
|
|
}}个)。【说明】检查到当前项目为老版本格式,需要购买整套SVG线性图元。
|
|
}}个)。【说明】检查到当前项目为老版本格式,需要购买整套SVG线性图元。
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div>
|
|
- <check-icon
|
|
|
|
- v-show="data.goods[2].unPurchased === 0"
|
|
|
|
- style="color: #4480f9ff"
|
|
|
|
- />
|
|
|
|
|
|
+ <check-icon v-show="data.goods[2].unPurchased === 0" style="color: #4480f9ff" />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
<template v-else>
|
|
<template v-else>
|
|
<div v-for="svgPen in prePayList.svgPens" class="pay-line">
|
|
<div v-for="svgPen in prePayList.svgPens" class="pay-line">
|
|
<div>
|
|
<div>
|
|
- <t-image
|
|
|
|
- class="pay-svg"
|
|
|
|
- :src="svgPen"
|
|
|
|
- :lazy="true"
|
|
|
|
- fit="contain"
|
|
|
|
- />
|
|
|
|
|
|
+ <t-image class="pay-svg" :src="svgPen" :lazy="true" fit="contain" />
|
|
{{
|
|
{{
|
|
svgPen.slice(
|
|
svgPen.slice(
|
|
svgPen.lastIndexOf('/') + 1,
|
|
svgPen.lastIndexOf('/') + 1,
|
|
@@ -452,18 +377,14 @@
|
|
}}
|
|
}}
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div>
|
|
- <check-icon
|
|
|
|
- v-show="
|
|
|
|
- data.purchasedList.some((item) => item.name === svgPen)
|
|
|
|
- "
|
|
|
|
- style="color: #4480f9ff"
|
|
|
|
- />
|
|
|
|
|
|
+ <check-icon v-show="data.purchasedList.some((item) => item.name === svgPen)
|
|
|
|
+ " style="color: #4480f9ff" />
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div>
|
|
{{
|
|
{{
|
|
data.purchasedList.some((item) => item.name === svgPen)
|
|
data.purchasedList.some((item) => item.name === svgPen)
|
|
- ? 0
|
|
|
|
- : data.goods[2].unitPrice
|
|
|
|
|
|
+ ? 0
|
|
|
|
+ : data.goods[2].unitPrice
|
|
}}
|
|
}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@@ -477,11 +398,7 @@
|
|
<p v-else>已选择0个图元 小计:¥0</p>
|
|
<p v-else>已选择0个图元 小计:¥0</p>
|
|
</div>
|
|
</div>
|
|
</t-collapse-panel>
|
|
</t-collapse-panel>
|
|
- <t-collapse-panel
|
|
|
|
- v-if="[...prePayList.jsPens].length"
|
|
|
|
- value="3"
|
|
|
|
- :header="data.goods[3].type"
|
|
|
|
- >
|
|
|
|
|
|
+ <t-collapse-panel v-if="[...prePayList.jsPens].length" value="3" :header="data.goods[3].type">
|
|
<template #headerRightContent>
|
|
<template #headerRightContent>
|
|
<t-space size="small">
|
|
<t-space size="small">
|
|
<t-checkbox v-model="data.goods[3].checked"></t-checkbox>
|
|
<t-checkbox v-model="data.goods[3].checked"></t-checkbox>
|
|
@@ -490,16 +407,13 @@
|
|
<div v-for="jsPen in prePayList.jsPens" class="pay-line">
|
|
<div v-for="jsPen in prePayList.jsPens" class="pay-line">
|
|
<div style="margin-left: 16px">{{ jsPen }}</div>
|
|
<div style="margin-left: 16px">{{ jsPen }}</div>
|
|
<div>
|
|
<div>
|
|
- <check-icon
|
|
|
|
- v-show="data.purchasedList.some((item) => item.name === jsPen)"
|
|
|
|
- style="color: #4480f9ff"
|
|
|
|
- />
|
|
|
|
|
|
+ <check-icon v-show="data.purchasedList.some((item) => item.name === jsPen)" style="color: #4480f9ff" />
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div>
|
|
{{
|
|
{{
|
|
data.purchasedList.some((item) => item.name === jsPen)
|
|
data.purchasedList.some((item) => item.name === jsPen)
|
|
- ? 0
|
|
|
|
- : data.goods[3].unitPrice
|
|
|
|
|
|
+ ? 0
|
|
|
|
+ : data.goods[3].unitPrice
|
|
}}
|
|
}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@@ -523,24 +437,10 @@
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</t-dialog>
|
|
</t-dialog>
|
|
- <t-dialog
|
|
|
|
- v-if="wechatPayDialog.show"
|
|
|
|
- v-model:visible="wechatPayDialog.show"
|
|
|
|
- class="pay-dialog"
|
|
|
|
- header="乐吾乐收银台"
|
|
|
|
- :close-on-overlay-click="false"
|
|
|
|
- :top="95"
|
|
|
|
- :width="700"
|
|
|
|
- confirm-btn="支付完成"
|
|
|
|
- :cancel-btn="null"
|
|
|
|
- @close="finishPay"
|
|
|
|
- @confirm="finishPay"
|
|
|
|
- >
|
|
|
|
- <WechatPay
|
|
|
|
- :order="data.order"
|
|
|
|
- :code-url="data.order.codeUrl"
|
|
|
|
- @success="onSuccess"
|
|
|
|
- />
|
|
|
|
|
|
+ <t-dialog v-if="wechatPayDialog.show" v-model:visible="wechatPayDialog.show" class="pay-dialog" header="乐吾乐收银台"
|
|
|
|
+ :close-on-overlay-click="false" :top="95" :width="700" confirm-btn="支付完成" :cancel-btn="null" @close="finishPay"
|
|
|
|
+ @confirm="finishPay">
|
|
|
|
+ <WechatPay :order="data.order" :code-url="data.order.codeUrl" @success="onSuccess" />
|
|
</t-dialog>
|
|
</t-dialog>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
@@ -601,11 +501,12 @@ import {
|
|
getComponentPurchased,
|
|
getComponentPurchased,
|
|
get2dComponentJs,
|
|
get2dComponentJs,
|
|
getTemPngs,
|
|
getTemPngs,
|
|
- getGoods,
|
|
|
|
|
|
+ getGoods
|
|
} from '@/services/download';
|
|
} from '@/services/download';
|
|
import { formComponents } from '@/services/defaults';
|
|
import { formComponents } from '@/services/defaults';
|
|
import WechatPay from './WechatPay.vue';
|
|
import WechatPay from './WechatPay.vue';
|
|
|
|
|
|
|
|
+
|
|
const { enterprise } = useEnterprise();
|
|
const { enterprise } = useEnterprise();
|
|
const router = useRouter();
|
|
const router = useRouter();
|
|
const route = useRoute();
|
|
const route = useRoute();
|
|
@@ -656,6 +557,7 @@ let payListNum = 0;
|
|
let comparePayListNum = 0;
|
|
let comparePayListNum = 0;
|
|
// let purchasedList = []; //已购买列表
|
|
// let purchasedList = []; //已购买列表
|
|
const iotPensMap = {};
|
|
const iotPensMap = {};
|
|
|
|
+let downloadType: Frame = null;
|
|
// const payPrice = ref(0);
|
|
// const payPrice = ref(0);
|
|
|
|
|
|
const getIotPensMap = () => {
|
|
const getIotPensMap = () => {
|
|
@@ -713,7 +615,11 @@ const dealWithMessage = async (e) => {
|
|
![...prePayList.svgPens].length
|
|
![...prePayList.svgPens].length
|
|
) {
|
|
) {
|
|
//直接下载
|
|
//直接下载
|
|
- preDownload(meta2d.data());
|
|
|
|
|
|
+ if (downloadType === Frame.html) {
|
|
|
|
+ preDownload(meta2d.data());
|
|
|
|
+ } else {
|
|
|
|
+ preFrameDownload(downloadType);
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
await showPayListDialog();
|
|
await showPayListDialog();
|
|
}
|
|
}
|
|
@@ -1024,6 +930,7 @@ const zip3D = (name: string) => {
|
|
pen.calculative.singleton.div.children[0] as HTMLIFrameElement
|
|
pen.calculative.singleton.div.children[0] as HTMLIFrameElement
|
|
).contentWindow.postMessage(
|
|
).contentWindow.postMessage(
|
|
JSON.stringify({
|
|
JSON.stringify({
|
|
|
|
+ type: 1,
|
|
name,
|
|
name,
|
|
id: params.id,
|
|
id: params.id,
|
|
}),
|
|
}),
|
|
@@ -1032,6 +939,34 @@ const zip3D = (name: string) => {
|
|
});
|
|
});
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
+
|
|
|
|
+const zip2D = (name: string) => {
|
|
|
|
+ const pen_2d = meta2d.store.data.pens.filter(
|
|
|
|
+ (pen) =>
|
|
|
|
+ pen.name === 'iframe' &&
|
|
|
|
+ (pen.iframe.indexOf('2d.le5le.com') !== -1 ||
|
|
|
|
+ pen.iframe.indexOf('/2d/') !== -1 ||
|
|
|
|
+ pen.iframe.indexOf('v.le5le.com') !== -1 ||
|
|
|
|
+ pen.iframe.indexOf('/v/') !== -1)
|
|
|
|
+ );
|
|
|
|
+ if (pen_2d && pen_2d.length) {
|
|
|
|
+ //存在3d场景
|
|
|
|
+ pen_2d.forEach((pen) => {
|
|
|
|
+ //发送消息
|
|
|
|
+ // let params = queryURLParams(pen.iframe.split('?')[1]);
|
|
|
|
+ (
|
|
|
|
+ pen.calculative.singleton.div.children[0] as HTMLIFrameElement
|
|
|
|
+ ).contentWindow.postMessage(
|
|
|
|
+ JSON.stringify({
|
|
|
|
+ name,
|
|
|
|
+ type: 1,
|
|
|
|
+ }),
|
|
|
|
+ '*'
|
|
|
|
+ );
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
function queryURLParams(value?: string) {
|
|
function queryURLParams(value?: string) {
|
|
let url = value || window.location.href.split('?')[1];
|
|
let url = value || window.location.href.split('?')[1];
|
|
const urlSearchParams = new URLSearchParams(url);
|
|
const urlSearchParams = new URLSearchParams(url);
|
|
@@ -1050,7 +985,11 @@ const downloadHtml = async () => {
|
|
gotoAccount();
|
|
gotoAccount();
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+ downloadType = Frame.html;
|
|
|
|
+ await preGetPayList(Frame.html);
|
|
|
|
+};
|
|
|
|
|
|
|
|
+const preGetPayList = async (key: Frame) => {
|
|
//图形库需要购买
|
|
//图形库需要购买
|
|
const meta2dData = meta2d.data();
|
|
const meta2dData = meta2d.data();
|
|
let list = getPayList(meta2dData);
|
|
let list = getPayList(meta2dData);
|
|
@@ -1095,12 +1034,18 @@ const downloadHtml = async () => {
|
|
!list.iotPens.length &&
|
|
!list.iotPens.length &&
|
|
!list.svgPens.length
|
|
!list.svgPens.length
|
|
) {
|
|
) {
|
|
- preDownload(meta2dData);
|
|
|
|
|
|
+ if (key === Frame.html) {
|
|
|
|
+ preDownload(meta2dData);
|
|
|
|
+ } else {
|
|
|
|
+ preFrameDownload(key);
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
await showPayListDialog();
|
|
await showPayListDialog();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-};
|
|
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
const showPayListDialog = async () => {
|
|
const showPayListDialog = async () => {
|
|
data.goods = await getGoods();
|
|
data.goods = await getGoods();
|
|
@@ -1142,10 +1087,10 @@ const showPayListDialog = async () => {
|
|
price += item.unPurchased * item.unitPrice;
|
|
price += item.unPurchased * item.unitPrice;
|
|
}
|
|
}
|
|
});
|
|
});
|
|
- if(price===0){
|
|
|
|
|
|
+ if (price === 0) {
|
|
skipPay();//如果计算价格为0,直接下载
|
|
skipPay();//如果计算价格为0,直接下载
|
|
- }else{
|
|
|
|
- payListDialog.show = true;
|
|
|
|
|
|
+ } else {
|
|
|
|
+ payListDialog.show = true;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
@@ -1153,7 +1098,7 @@ const preDownload = (meta2dData: any) => {
|
|
MessagePlugin.info('正在下载打包中,可能需要几分钟,请耐心等待...');
|
|
MessagePlugin.info('正在下载打包中,可能需要几分钟,请耐心等待...');
|
|
iframeNum = 0;
|
|
iframeNum = 0;
|
|
compareNum = 0;
|
|
compareNum = 0;
|
|
-
|
|
|
|
|
|
+ meta2dData.userId = user.id;
|
|
const pen_3d = meta2dData.pens.filter(
|
|
const pen_3d = meta2dData.pens.filter(
|
|
(pen) =>
|
|
(pen) =>
|
|
pen.name === 'iframe' &&
|
|
pen.name === 'iframe' &&
|
|
@@ -1303,7 +1248,6 @@ const saveDownload = async () => {
|
|
}
|
|
}
|
|
});
|
|
});
|
|
//js线性图元 由对应页面处理
|
|
//js线性图元 由对应页面处理
|
|
-
|
|
|
|
//SVG线性图元
|
|
//SVG线性图元
|
|
if ([...prePayList.svgPens].length) {
|
|
if ([...prePayList.svgPens].length) {
|
|
let purchased = data.purchasedList?.filter(
|
|
let purchased = data.purchasedList?.filter(
|
|
@@ -1331,7 +1275,7 @@ const saveDownload = async () => {
|
|
});
|
|
});
|
|
} else {
|
|
} else {
|
|
list.forEach((item) => {
|
|
list.forEach((item) => {
|
|
- if (item.data && item.path.indexOf('/projects/v') !== 1) {
|
|
|
|
|
|
+ if (item.data && item.path.indexOf('/projects/v') !== -1 && item.path.indexOf('/projects/v/png/') === -1) {
|
|
//2d 图纸数据
|
|
//2d 图纸数据
|
|
let meta2dData = JSON.parse(item.data);
|
|
let meta2dData = JSON.parse(item.data);
|
|
meta2dData.pens.forEach((pen) => {
|
|
meta2dData.pens.forEach((pen) => {
|
|
@@ -1428,7 +1372,8 @@ async function zipBkImg(zip: JSZip) {
|
|
let img = meta2d.store.data.bkImage;
|
|
let img = meta2d.store.data.bkImage;
|
|
if (img) {
|
|
if (img) {
|
|
if (img.startsWith('/') || img.startsWith(cdn) || img.startsWith(upCdn)) {
|
|
if (img.startsWith('/') || img.startsWith(cdn) || img.startsWith(upCdn)) {
|
|
- await zipImage(zip, img);
|
|
|
|
|
|
+ const pngs = await getTemPngs([img.replace(cdn, '').replace(upCdn, '')]);
|
|
|
|
+ await zipImage(zip, img, pngs[img.replace(cdn, '').replace(upCdn, '')]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1437,6 +1382,7 @@ enum Frame {
|
|
vue2,
|
|
vue2,
|
|
vue3,
|
|
vue3,
|
|
react,
|
|
react,
|
|
|
|
+ html
|
|
}
|
|
}
|
|
|
|
|
|
const downloadVue3 = async () => {
|
|
const downloadVue3 = async () => {
|
|
@@ -1458,25 +1404,29 @@ async function downloadAsFrame(type: Frame) {
|
|
MessagePlugin.warning(noLoginTip);
|
|
MessagePlugin.warning(noLoginTip);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
-
|
|
|
|
- // if (!user.isVip) {
|
|
|
|
- // gotoAccount();
|
|
|
|
- // return;
|
|
|
|
- // }
|
|
|
|
if (user.vipDesc !== '旗舰会员') {
|
|
if (user.vipDesc !== '旗舰会员') {
|
|
MessagePlugin.info('需要开通旗舰会员~');
|
|
MessagePlugin.info('需要开通旗舰会员~');
|
|
gotoAccount();
|
|
gotoAccount();
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+ downloadType = type;
|
|
|
|
+ await preGetPayList(type);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const preFrameDownload = async (type: Frame) => {
|
|
frameFlag = type;
|
|
frameFlag = type;
|
|
MessagePlugin.info('正在下载打包中,可能需要几分钟,请耐心等待...');
|
|
MessagePlugin.info('正在下载打包中,可能需要几分钟,请耐心等待...');
|
|
zip3D(
|
|
zip3D(
|
|
type === Frame.vue3 ? 'toVue3' : type === Frame.vue2 ? 'toVue2' : 'toReact'
|
|
type === Frame.vue3 ? 'toVue3' : type === Frame.vue2 ? 'toVue2' : 'toReact'
|
|
);
|
|
);
|
|
- const data: Meta2dBackData = meta2d.data();
|
|
|
|
|
|
+ zip2D(
|
|
|
|
+ type === Frame.vue3 ? 'downloadVue3' : type === Frame.vue2 ? 'downloadVue2' : 'downloadReact'
|
|
|
|
+ );
|
|
|
|
+ const data: any = meta2d.data();
|
|
if (data._id) delete data._id;
|
|
if (data._id) delete data._id;
|
|
if (data.id) delete data.id;
|
|
if (data.id) delete data.id;
|
|
if (data.image) delete data.image;
|
|
if (data.image) delete data.image;
|
|
|
|
+ data.userId = user.id;
|
|
checkData(data);
|
|
checkData(data);
|
|
const [{ default: JSZip }, { saveAs }] = await Promise.all([
|
|
const [{ default: JSZip }, { saveAs }] = await Promise.all([
|
|
import('jszip'),
|
|
import('jszip'),
|
|
@@ -1486,12 +1436,44 @@ async function downloadAsFrame(type: Frame) {
|
|
let _fileName =
|
|
let _fileName =
|
|
(data.name && data.name.replace(/\//g, '_').replace(/:/g, '_')) ||
|
|
(data.name && data.name.replace(/\//g, '_').replace(/:/g, '_')) ||
|
|
'le5le.meta2d';
|
|
'le5le.meta2d';
|
|
|
|
+ //处理付费svg
|
|
|
|
+ if (Object.keys(data.paths).length >= 3) {
|
|
|
|
+ //简单判断有无svg图元
|
|
|
|
+ const res: any = await axios.post('/api/paid/2d/component', {
|
|
|
|
+ type: 'SVG线性图元',
|
|
|
|
+ });
|
|
|
|
+ if (res.list.length === 1 && !res.list[0].name) {
|
|
|
|
+ //已经购买全部
|
|
|
|
+ for (let key of Object.keys(data.paths)) {
|
|
|
|
+ let path = data.paths[key];
|
|
|
|
+ if (
|
|
|
|
+ path.indexOf('-1.18Zm4-1') !== -1 ||
|
|
|
|
+ path.indexOf('-1.19Zm4-1') !== -1 ||
|
|
|
|
+ path.indexOf('2.85ZM') !== -1 ||
|
|
|
|
+ path.indexOf('-1-2.39.3') !== -1
|
|
|
|
+ ) {
|
|
|
|
+ data.paths[key] = '';
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ //购买部分
|
|
|
|
+ let purchasedList = res.list.map((i) => i.name);
|
|
|
|
+ data.pens.forEach((pen) => {
|
|
|
|
+ if (pen.name === 'svgPath' && pen.svgUrl) {
|
|
|
|
+ if (purchasedList.includes(pen.svgUrl)) {
|
|
|
|
+ pen.pathId = null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
const _zip: any = zip.folder(`${_fileName}`);
|
|
const _zip: any = zip.folder(`${_fileName}`);
|
|
_zip.file(
|
|
_zip.file(
|
|
- `${
|
|
|
|
- type === Frame.vue3
|
|
|
|
- ? 'meta2d-vue3'
|
|
|
|
- : type === Frame.vue2
|
|
|
|
|
|
+ `${type === Frame.vue3
|
|
|
|
+ ? 'meta2d-vue3'
|
|
|
|
+ : type === Frame.vue2
|
|
? 'meta2d-vue2'
|
|
? 'meta2d-vue2'
|
|
: 'meta2d-react'
|
|
: 'meta2d-react'
|
|
}/public/json/data.json`,
|
|
}/public/json/data.json`,
|
|
@@ -1504,14 +1486,35 @@ async function downloadAsFrame(type: Frame) {
|
|
type === Frame.vue3
|
|
type === Frame.vue3
|
|
? zipVue3Files(_zip)
|
|
? zipVue3Files(_zip)
|
|
: type === Frame.vue2
|
|
: type === Frame.vue2
|
|
- ? zipVue2Files(_zip)
|
|
|
|
- : zipReactFiles(_zip),
|
|
|
|
|
|
+ ? zipVue2Files(_zip)
|
|
|
|
+ : zipReactFiles(_zip),
|
|
|
|
+ zipIotPens(_zip),
|
|
]);
|
|
]);
|
|
const blob = await zip.generateAsync({ type: 'blob' });
|
|
const blob = await zip.generateAsync({ type: 'blob' });
|
|
saveAs(blob, `${_fileName}.zip`);
|
|
saveAs(blob, `${_fileName}.zip`);
|
|
frameFlag = -1;
|
|
frameFlag = -1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+async function zipIotPens(zip: JSZip) {
|
|
|
|
+ //处理控件
|
|
|
|
+ const js = await get2dComponentJs();
|
|
|
|
+ zip.file(`${frameFlag === Frame.vue3
|
|
|
|
+ ? 'meta2d-vue3'
|
|
|
|
+ : frameFlag === Frame.vue2
|
|
|
|
+ ? 'meta2d-vue2'
|
|
|
|
+ : 'meta2d-react'
|
|
|
|
+ }/public/js/2d-components.js`, js, { createFolders: true });
|
|
|
|
+ const res: Blob = await axios.get('/view/js/r.js', {
|
|
|
|
+ responseType: 'blob',
|
|
|
|
+ });
|
|
|
|
+ zip.file(`${frameFlag === Frame.vue3
|
|
|
|
+ ? 'meta2d-vue3'
|
|
|
|
+ : frameFlag === Frame.vue2
|
|
|
|
+ ? 'meta2d-vue2'
|
|
|
|
+ : 'meta2d-react'
|
|
|
|
+ }/public/js/r.js`, res, { createFolders: true });
|
|
|
|
+}
|
|
|
|
+
|
|
async function zipJs(zip: JSZip) {
|
|
async function zipJs(zip: JSZip) {
|
|
const files = ['/view/js/marked.min.js', '/view/js/lcjs.iife.js'];
|
|
const files = ['/view/js/marked.min.js', '/view/js/lcjs.iife.js'];
|
|
await Promise.all(
|
|
await Promise.all(
|
|
@@ -1520,10 +1523,9 @@ async function zipJs(zip: JSZip) {
|
|
responseType: 'blob',
|
|
responseType: 'blob',
|
|
});
|
|
});
|
|
zip.file(
|
|
zip.file(
|
|
- `${
|
|
|
|
- frameFlag === Frame.vue3
|
|
|
|
- ? 'meta2d-vue3'
|
|
|
|
- : frameFlag === Frame.vue2
|
|
|
|
|
|
+ `${frameFlag === Frame.vue3
|
|
|
|
+ ? 'meta2d-vue3'
|
|
|
|
+ : frameFlag === Frame.vue2
|
|
? 'meta2d-vue2'
|
|
? 'meta2d-vue2'
|
|
: 'meta2d-react'
|
|
: 'meta2d-react'
|
|
}/public` + filePath.replace('/view', ''),
|
|
}/public` + filePath.replace('/view', ''),
|
|
@@ -1681,26 +1683,27 @@ async function zipImages(zip: JSZip, pens: Pen[]) {
|
|
}
|
|
}
|
|
// 无需递归遍历子节点,现在所有的节点都在外层
|
|
// 无需递归遍历子节点,现在所有的节点都在外层
|
|
}
|
|
}
|
|
- await Promise.all(images.map((image) => zipImage(zip, image)));
|
|
|
|
|
|
+ //付费pngs
|
|
|
|
+ const pngs = await getTemPngs(images.map(i => i.replace(cdn, '').replace(upCdn, '')));
|
|
|
|
+ await Promise.all(images.map((image) => zipImage(zip, image, pngs[image.replace(cdn, '').replace(upCdn, '')])));
|
|
}
|
|
}
|
|
|
|
|
|
-async function zipImage(zip: JSZip, image: string) {
|
|
|
|
- const res: Blob = await axios.get(image, {
|
|
|
|
|
|
+async function zipImage(zip: JSZip, image: string, temImage?: string) {
|
|
|
|
+ const res: Blob = await axios.get(temImage || image, {
|
|
responseType: 'blob',
|
|
responseType: 'blob',
|
|
- params: {
|
|
|
|
- isZip: true,
|
|
|
|
- },
|
|
|
|
|
|
+ // params: {
|
|
|
|
+ // isZip: true,
|
|
|
|
+ // },
|
|
});
|
|
});
|
|
zip.file(
|
|
zip.file(
|
|
(frameFlag === -1
|
|
(frameFlag === -1
|
|
? ''
|
|
? ''
|
|
- : `${
|
|
|
|
- frameFlag === Frame.vue3
|
|
|
|
- ? 'meta2d-vue3'
|
|
|
|
- : frameFlag === Frame.vue2
|
|
|
|
- ? 'meta2d-vue2'
|
|
|
|
- : 'meta2d-react'
|
|
|
|
- }/public`) + (cdn ? image.replace(cdn, '').replace(upCdn, '') : image),
|
|
|
|
|
|
+ : `${frameFlag === Frame.vue3
|
|
|
|
+ ? 'meta2d-vue3'
|
|
|
|
+ : frameFlag === Frame.vue2
|
|
|
|
+ ? 'meta2d-vue2'
|
|
|
|
+ : 'meta2d-react'
|
|
|
|
+ }/public`) + (cdn ? image.replace(cdn, '').replace(upCdn, '') : image),
|
|
res,
|
|
res,
|
|
{
|
|
{
|
|
createFolders: true,
|
|
createFolders: true,
|
|
@@ -1958,7 +1961,11 @@ const prePay = async () => {
|
|
|
|
|
|
const skipPay = () => {
|
|
const skipPay = () => {
|
|
//跳过支付,直接下载
|
|
//跳过支付,直接下载
|
|
- preDownload(meta2d.data());
|
|
|
|
|
|
+ if (downloadType === Frame.html) {
|
|
|
|
+ preDownload(meta2d.data());
|
|
|
|
+ } else {
|
|
|
|
+ preFrameDownload(downloadType);
|
|
|
|
+ }
|
|
};
|
|
};
|
|
|
|
|
|
const finishPay = async () => {
|
|
const finishPay = async () => {
|
|
@@ -1970,7 +1977,11 @@ const finishPay = async () => {
|
|
MessagePlugin.success('支付成功');
|
|
MessagePlugin.success('支付成功');
|
|
wechatPayDialog.show = false;
|
|
wechatPayDialog.show = false;
|
|
payListDialog.show = false;
|
|
payListDialog.show = false;
|
|
- preDownload(meta2d.data());
|
|
|
|
|
|
+ if (downloadType === Frame.html) {
|
|
|
|
+ preDownload(meta2d.data());
|
|
|
|
+ } else {
|
|
|
|
+ preFrameDownload(downloadType);
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
MessagePlugin.error('支付失败');
|
|
MessagePlugin.error('支付失败');
|
|
wechatPayDialog.show = false;
|
|
wechatPayDialog.show = false;
|
|
@@ -2009,6 +2020,7 @@ const onSuccess = (success: boolean) => {
|
|
background-color: var(--color-background);
|
|
background-color: var(--color-background);
|
|
position: relative;
|
|
position: relative;
|
|
z-index: 2;
|
|
z-index: 2;
|
|
|
|
+
|
|
.logo {
|
|
.logo {
|
|
display: flex;
|
|
display: flex;
|
|
padding: 0 16px;
|
|
padding: 0 16px;
|
|
@@ -2065,14 +2077,18 @@ const onSuccess = (success: boolean) => {
|
|
height: 300px;
|
|
height: 300px;
|
|
overflow-y: scroll;
|
|
overflow-y: scroll;
|
|
margin-bottom: 30px;
|
|
margin-bottom: 30px;
|
|
|
|
+
|
|
.t-collapse {
|
|
.t-collapse {
|
|
border: 0px;
|
|
border: 0px;
|
|
|
|
+
|
|
:deep(.t-collapse-panel__wrapper .t-collapse-panel__header) {
|
|
:deep(.t-collapse-panel__wrapper .t-collapse-panel__header) {
|
|
border-bottom: 0px;
|
|
border-bottom: 0px;
|
|
}
|
|
}
|
|
|
|
+
|
|
:deep(.t-collapse-panel__wrapper .t-collapse-panel__body) {
|
|
:deep(.t-collapse-panel__wrapper .t-collapse-panel__body) {
|
|
background: #fff0;
|
|
background: #fff0;
|
|
border-bottom: 0px;
|
|
border-bottom: 0px;
|
|
|
|
+
|
|
.t-collapse-panel__content {
|
|
.t-collapse-panel__content {
|
|
padding: 0;
|
|
padding: 0;
|
|
color: #c1c8d7;
|
|
color: #c1c8d7;
|
|
@@ -2080,25 +2096,30 @@ const onSuccess = (success: boolean) => {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
.pay-line {
|
|
.pay-line {
|
|
display: flex;
|
|
display: flex;
|
|
height: 54px;
|
|
height: 54px;
|
|
background-color: #afcaff0a;
|
|
background-color: #afcaff0a;
|
|
margin-top: 1px;
|
|
margin-top: 1px;
|
|
|
|
+
|
|
div {
|
|
div {
|
|
width: 30%;
|
|
width: 30%;
|
|
text-align: center;
|
|
text-align: center;
|
|
line-height: 54px;
|
|
line-height: 54px;
|
|
|
|
+
|
|
:deep(.t-image) {
|
|
:deep(.t-image) {
|
|
width: 40px;
|
|
width: 40px;
|
|
height: 40px;
|
|
height: 40px;
|
|
margin-top: 7px;
|
|
margin-top: 7px;
|
|
}
|
|
}
|
|
|
|
+
|
|
:deep(.pay-svg) {
|
|
:deep(.pay-svg) {
|
|
.t-image {
|
|
.t-image {
|
|
background: #fff;
|
|
background: #fff;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
.l-icon {
|
|
.l-icon {
|
|
width: 40px;
|
|
width: 40px;
|
|
height: 40px;
|
|
height: 40px;
|
|
@@ -2107,30 +2128,35 @@ const onSuccess = (success: boolean) => {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- & > div:first-child {
|
|
|
|
|
|
+ &>div:first-child {
|
|
width: 40%;
|
|
width: 40%;
|
|
display: flex;
|
|
display: flex;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
.pay-tip {
|
|
.pay-tip {
|
|
height: 54px;
|
|
height: 54px;
|
|
width: 100%;
|
|
width: 100%;
|
|
position: relative;
|
|
position: relative;
|
|
|
|
+
|
|
p {
|
|
p {
|
|
position: absolute;
|
|
position: absolute;
|
|
right: 16px;
|
|
right: 16px;
|
|
color: var(--color-desc);
|
|
color: var(--color-desc);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
.pay-footer {
|
|
.pay-footer {
|
|
margin-bottom: -42px;
|
|
margin-bottom: -42px;
|
|
position: relative;
|
|
position: relative;
|
|
|
|
+
|
|
.pay-price {
|
|
.pay-price {
|
|
position: absolute;
|
|
position: absolute;
|
|
right: 215px;
|
|
right: 215px;
|
|
/* margin-left: 50px; */
|
|
/* margin-left: 50px; */
|
|
align-items: flex-end;
|
|
align-items: flex-end;
|
|
line-height: 10px;
|
|
line-height: 10px;
|
|
|
|
+
|
|
/* p{
|
|
/* p{
|
|
vertical-align: bottom;
|
|
vertical-align: bottom;
|
|
line-height: normal;
|
|
line-height: normal;
|
|
@@ -2141,6 +2167,7 @@ const onSuccess = (success: boolean) => {
|
|
color: #4480f9;
|
|
color: #4480f9;
|
|
line-height: 20px;
|
|
line-height: 20px;
|
|
}
|
|
}
|
|
|
|
+
|
|
p:nth-child(1) {
|
|
p:nth-child(1) {
|
|
font-size: 14px;
|
|
font-size: 14px;
|
|
color: #4480f9;
|
|
color: #4480f9;
|