Pārlūkot izejas kodu

feat:下载部署包

ananzhusen 1 gadu atpakaļ
vecāks
revīzija
e5bbefa222

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 483 - 316
pnpm-lock.yaml


+ 1 - 0
public/view/meta2d-react

@@ -0,0 +1 @@
+Subproject commit c132a1c1d544f9a14c6331bdba1e36e8be33a7f7

+ 1 - 0
public/view/meta2d-vue2

@@ -0,0 +1 @@
+Subproject commit 827d7e9902425f69e71a6ff1a241bfb25796b9f3

+ 24 - 0
public/view/meta2d-vue3/README.md

@@ -0,0 +1,24 @@
+# Vue 3 + Vite + meta2d
+
+使用步骤
+
+1. 安装依赖
+
+```js
+pnpm install  //(推荐,安装文档:https://pnpm.io/zh/installation)
+// 或
+yarn 
+```
+2. 启动项目
+
+```js
+pnpm start 
+//或
+yarn start 
+```
+
+注意:
+- 安装依赖失败,可能是node版本太低,推荐 16.x.x 以上。
+- 项目启动不了,可能是端口被占用。
+- 部分图形库未显示,可能是图形库未购买,需要联系官方购买。https://doc.le5le.com/document/119296274#3.%E4%B9%90%E5%90%BE%E4%B9%902D%E4%BC%81%E4%B8%9A%E5%9B%BE%E5%BD%A2%E5%BA%93%E4%BB%B7%E6%A0%BC
+

+ 18 - 0
public/view/meta2d-vue3/index.html

@@ -0,0 +1,18 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>meta2d + vue3</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script src="js/lcjs.iife.js"></script>
+    <script src="js/marked.min.js"></script>
+    <script crossorigin="anonymous" integrity="sha512-ppWbHq6q2f7HAwS481w6qikuC0XEeBnmkRg6KWnWg3zSIbJwWWBgsCDMAxzSB7SVqXzWwSYQ2s8TSJKjnaikMg==" src="https://lib.baomitu.com/echarts/5.1.2/echarts.min.js"></script>
+    <script src="http://cdn.hcharts.cn/highcharts/highcharts.js"></script>
+    <script src="http://cdn.hcharts.cn/highcharts/highcharts-more.js"></script>
+    <script type="module" src="/src/main.js"></script>
+  </body>
+</html>

+ 29 - 0
public/view/meta2d-vue3/package.json

@@ -0,0 +1,29 @@
+{
+  "name": "meta2d-vue3",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "start": "vite",
+    "build": "vite build",
+    "preview": "vite preview"
+  },
+  "dependencies": {
+    "@meta2d/activity-diagram": "^1.0.0",
+    "@meta2d/chart-diagram": "^1.0.0",
+    "@meta2d/class-diagram": "^1.0.0",
+    "@meta2d/core": "^1.0.0",
+    "@meta2d/flow-diagram": "^1.0.0",
+    "@meta2d/form-diagram": "^1.0.0",
+    "@meta2d/fta-diagram": "^1.0.0",
+    "@meta2d/le5le-charts": "^1.0.0",
+    "@meta2d/sequence-diagram": "^1.0.0",
+    "@meta2d/svg": "^1.0.0",
+    "vue": "^3.3.8"
+  },
+  "devDependencies": {
+    "@vitejs/plugin-vue": "^4.5.0",
+    "vite": "^5.0.0"
+  }
+}

+ 9 - 0
public/view/meta2d-vue3/src/App.vue

@@ -0,0 +1,9 @@
+<script setup>
+import Meta2d from './components/Meta2d.vue';
+</script>
+
+<template>
+  <Meta2d />
+</template>
+
+<style scoped></style>

+ 102 - 0
public/view/meta2d-vue3/src/components/Meta2d.vue

@@ -0,0 +1,102 @@
+<script  setup>
+import { onMounted, onUnmounted } from 'vue';
+import {
+  Meta2d,
+  register,
+  registerAnchors,
+  registerCanvasDraw,
+} from '@meta2d/core';
+import { flowPens, flowAnchors } from '@meta2d/flow-diagram';
+import {
+  activityDiagram,
+  activityDiagramByCtx,
+} from '@meta2d/activity-diagram';
+import { classPens } from '@meta2d/class-diagram';
+import { sequencePens, sequencePensbyCtx } from '@meta2d/sequence-diagram';
+import { register as registerEcharts } from '@meta2d/chart-diagram';
+import { registerHighcharts } from '@meta2d/chart-diagram';
+import { registerLightningChart } from '@meta2d/chart-diagram';
+import { formPens, formPath2DPens } from '@meta2d/form-diagram';
+import { chartsPens } from '@meta2d/le5le-charts';
+import { ftaPens, ftaPensbyCtx, ftaAnchors } from '@meta2d/fta-diagram';
+
+let meta2d = null;
+
+onMounted(async () => {
+  const options = {
+    // x: 10,
+    // y: 10,
+    width: 1920,
+    height: 1080,
+    background: '#1e2430',
+    color: '#bdc7db',
+  }
+  meta2d = new Meta2d('meta2d',options);
+  //注册基本图形库
+  registerBasicDiagram();
+
+  //注册购买的图形库
+
+  _fetch('/json/data.json', function (text) {
+    var data = JSON.parse(text);
+    data.locked = 1;
+    data.rule = false;
+    meta2d.open(data);
+    // meta2d.fitSizeView(true, 0); //大屏充满屏幕
+    // meta2d.fitView(true,0); //充满屏幕
+  });
+});
+
+function _fetch(url, cb) {
+  var xhr = new XMLHttpRequest();
+  xhr.open('GET', url, true);
+  xhr.send();
+  xhr.onreadystatechange = function () {
+    if (xhr.readyState == 4 && xhr.status == 200) {
+      cb && cb(xhr.responseText);
+    }
+  };
+}
+
+//参考文档:https://doc.le5le.com/document/119754049
+function registerBasicDiagram() {
+  register(flowPens());
+  registerAnchors(flowAnchors());
+  register(activityDiagram());
+  registerCanvasDraw(activityDiagramByCtx());
+  register(classPens());
+  register(sequencePens());
+  registerCanvasDraw(sequencePensbyCtx());
+  registerEcharts();
+  registerHighcharts();
+  registerLightningChart();
+  register(formPath2DPens());
+  registerCanvasDraw(formPens());
+  registerCanvasDraw(chartsPens());
+  register(ftaPens());
+  registerCanvasDraw(ftaPensbyCtx());
+  registerAnchors(ftaAnchors());
+}
+
+
+onUnmounted(() => {
+  meta2d?.destroy();
+});
+</script>
+
+<template>
+  <div class="content">
+    <div id="meta2d"></div>
+  </div>
+</template>
+
+<style scoped>
+html,
+body {
+  height: 100vh;
+  margin: 0;
+  padding: 0;
+}
+
+
+</style>

+ 5 - 0
public/view/meta2d-vue3/src/main.js

@@ -0,0 +1,5 @@
+import { createApp } from 'vue'
+import './style.css'
+import App from './App.vue'
+
+createApp(App).mount('#app')

+ 39 - 0
public/view/meta2d-vue3/src/style.css

@@ -0,0 +1,39 @@
+:root {
+  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
+  line-height: 1.5;
+  font-weight: 400;
+
+  color-scheme: light dark;
+  color: rgba(255, 255, 255, 0.87);
+  background-color: #242424;
+
+  font-synthesis: none;
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+body {
+  height: 100vh;
+  margin: 0;
+  padding: 0;
+}
+
+#app {
+  width: 100vw;
+  height: 100vh;
+}
+
+.content {
+  position: relative;
+  background-color: #1e2430;
+  height: 100vh;
+}
+
+#meta2d {
+  position: absolute !important;
+  width: 100%;
+  height: 100%;
+  touch-action: none;
+  overflow: hidden;
+}

+ 7 - 0
public/view/meta2d-vue3/vite.config.js

@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+  plugins: [vue()],
+})

+ 0 - 20
public/view/react/Meta2d.css

@@ -1,20 +0,0 @@
-html,
-body {
-  height: 100vh;
-  margin: 0;
-  padding: 0;
-}
-
-.content {
-  position: relative;
-  background-color: #f4f4f4;
-  height: 100vh;
-}
-
-#meta2d {
-  position: absolute !important;
-  width: 100%;
-  height: 100%;
-  touch-action: none;
-  overflow: hidden;
-}

+ 0 - 56
public/view/react/Meta2d.jsx

@@ -1,56 +0,0 @@
-import React from "react";
-import "./Meta2d.css";
-
-let meta2d = null;
-export default class Meta2d extends React.Component {
-  constructor(props) {
-    super(props);
-  }
-
-  componentDidMount() {
-    meta2d = new window.Meta2d("meta2d",{
-      background: '#1e2430',
-      x: 32,
-      y: 32,
-      width: 1920,
-      height: 1080,
-      color: '#bdc7db',
-    });
-    window.registerCommonDiagram();
-    this._fetch("/json/data.json", function (text) {
-      var data = JSON.parse(text);
-      data.locked = 1;
-      meta2d.open(data);
-      let fit =
-          meta2d.store.data.scaleMode === '3'
-              ? 'height'
-              : meta2d.store.data.scaleMode === '2'
-                  ? 'width'
-                  : true;
-      meta2d.fitSizeView(fit, 10);
-    });
-  }
-
-  componentWillUnmount() {
-    meta2d?.destroy();
-  }
-
-  _fetch(url, cb) {
-    var xhr = new XMLHttpRequest();
-    xhr.open("GET", url, true);
-    xhr.send();
-    xhr.onreadystatechange = function () {
-      if (xhr.readyState == 4 && xhr.status == 200) {
-        cb && cb(xhr.responseText);
-      }
-    };
-  }
-
-  render() {
-    return (
-      <div className="content">
-        <div id="meta2d"></div>
-      </div>
-    );
-  }
-}

+ 0 - 82
public/view/vue2/Meta2d.vue

@@ -1,82 +0,0 @@
-<!--  -->
-<template>
-  <div class="content">
-    <div id="meta2d"></div>
-  </div>
-</template>
-
-<script>
-let meta2d = null;
-
-export default {
-  name: 'meta2d',
-  data() {
-    return {};
-  },
-  mounted() {
-    this.initMeta2d();
-  },
-  destroyed() {
-    meta2d?.destroy();
-  },
-  methods: {
-    initMeta2d() {
-      meta2d = new window.Meta2d("meta2d",{
-        background: '#1e2430',
-        x: 10,
-        y: 10,
-        width: 1920,
-        color: '#bdc7db',
-        height: 1080,
-      });
-      window.registerCommonDiagram();
-
-      this._fetch("/json/data.json", function (text) {
-        var data = JSON.parse(text);
-        data.locked = 1;
-        meta2d.open(data);
-        let fit =
-            meta2d.store.data.scaleMode === '3'
-                ? 'height'
-                : meta2d.store.data.scaleMode === '2'
-                    ? 'width'
-                    : true;
-        meta2d.fitSizeView(fit, 10);
-      });
-    },
-
-    _fetch(url, cb) {
-      var xhr = new XMLHttpRequest();
-      xhr.open("GET", url, true);
-      xhr.send();
-      xhr.onreadystatechange = function () {
-        if (xhr.readyState == 4 && xhr.status == 200) {
-          cb && cb(xhr.responseText);
-        }
-      };
-    },
-  },
-};
-</script>
-<style>
-html,
-body {
-  height: 100vh;
-  margin: 0;
-  padding: 0;
-}
-
-.content {
-  position: relative;
-  background-color: #f4f4f4;
-  height: 100vh;
-}
-
-#meta2d {
-  position: absolute !important;
-  width: 100%;
-  height: 100%;
-  touch-action: none;
-  overflow: hidden;
-}
-</style>

+ 0 - 72
public/view/vue3/Meta2d.vue

@@ -1,72 +0,0 @@
-<template>
-  <div class="content">
-    <div id="meta2d"></div>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import { onMounted, onUnmounted } from 'vue';
-let meta2d: any = null;
-
-onMounted(async () => {
-  meta2d = new (window as any).Meta2d('meta2d', {
-    background: '#1e2430',
-    x: 10,
-    y: 10,
-    width: 1920,
-    color: '#bdc7db',
-    height: 1080,
-  });
-  (window as any).registerCommonDiagram();
-
-  _fetch('/json/data.json', function (text) {
-    var data = JSON.parse(text);
-    data.locked = 1;
-    meta2d.open(data);
-    let fit =
-      meta2d.store.data.scaleMode === '3'
-        ? 'height'
-        : meta2d.store.data.scaleMode === '2'
-        ? 'width'
-        : true;
-    meta2d.fitSizeView(fit, 10);
-  });
-});
-
-function _fetch(url, cb) {
-  var xhr = new XMLHttpRequest();
-  xhr.open('GET', url, true);
-  xhr.send();
-  xhr.onreadystatechange = function () {
-    if (xhr.readyState == 4 && xhr.status == 200) {
-      cb && cb(xhr.responseText);
-    }
-  };
-}
-
-onUnmounted(() => {
-  meta2d?.destroy();
-});
-</script>
-
-<style lang="scss" scoped>
-html,
-body {
-  height: 100vh;
-  margin: 0;
-  padding: 0;
-}
-
-.content {
-  position: relative;
-  background-color: #f4f4f4;
-  height: 100vh;
-  #meta2d {
-    position: absolute !important;
-    width: 100%;
-    height: 100%;
-    touch-action: none;
-    overflow: hidden;
-  }
-}
-</style>

+ 2 - 3
src/services/common.ts

@@ -399,7 +399,6 @@ export const save = async (
    meta2d.store.data.component = true
   }
   const data: Meta2dBackData = meta2d.data();
-  console.log('data',deepClone(data))
   if (!(user && user.id)) {
     MessagePlugin.warning(noLoginTip);
     localforage.setItem(localStorageName, JSON.stringify(data));
@@ -714,8 +713,8 @@ export function autoSave(force = false) {
   if (
     user &&
     user.id &&
-    user.isVip &&
-    data._id &&
+    user.vip &&
+    (data.id||data._id) &&
     !data.component &&
     data.owner &&
     data.owner.id === user.id

+ 19 - 5
src/services/user.ts

@@ -23,6 +23,9 @@ export interface IUser {
   remember?: boolean;
   captcha?: string;
   vip?: string;
+  vipData?: any;
+  vipDesc?: string;
+  vipExpired?: boolean;
   isVip?: boolean;
   roles?: string[];
   isOperation?: boolean;
@@ -101,18 +104,29 @@ export const useUser = () => {
   };
 
   const setUser = async (data: IUser) => {
-    if (data.department && !data.department.id) {
-      delete data.department;
-    }
-
     if (data.vip) {
       const vip = new Date(data.vip);
       if (vip > new Date()) {
-        data.isVip = true;
+        data.vipExpired = false;
+      } else if (vip > new Date('2023-01-17T08:00:00+08:00')) {
+        data.vipExpired = true;
+      } else {
+        data.vip = undefined;
       }
       if (data.vip) {
         data.vip = dayjs(data.vip).format('YYYY-MM-DD HH:mm:ss');
       }
+      if (data.vipData?.devPackage) {
+        data.vipDesc = '旗舰会员';
+      } else if (data.vipData?.deploymentPackage) {
+        data.vipDesc = '超级会员';
+      } else if (data.vipData?.cloudHosting) {
+        data.vipDesc = '高级会员';
+      } else {
+        data.vipDesc = '普通会员';
+      }
+    } else {
+      data.vipDesc = '普通用户';
     }
     if (data.roles) {
       for (const item of data.roles) {

+ 9 - 5
src/views/Preview.vue

@@ -39,11 +39,15 @@ onMounted(() => {
     if (typeof e.data !== 'string') {
       return;
     }
-    let data = JSON.parse(e.data);
-    if (typeof data === 'object') {
-      meta2d.emit(data.name);
-    } else {
-      meta2d.emit(data);
+    try {
+      let data = JSON.parse(e.data);
+      if (typeof data === 'object') {
+        meta2d.emit(data.name);
+      } else {
+        meta2d.emit(data);
+      }
+    } catch (e) {
+      console.info(e);
     }
   });
 });

+ 1 - 1
src/views/components/FileProps.vue

@@ -188,7 +188,7 @@
                         />
                       </div>
                     </template>
-                    <div class="flex middle" v-if="user.isVip">
+                    <div class="flex middle" v-if="user.vip">
                       <t-input
                         v-model="data.iconUrl"
                         placeholder="Font class方式URL"

+ 168 - 25
src/views/components/Header.vue

@@ -31,7 +31,7 @@
         <t-dropdown-item divider="true">
           <a @click="downloadJson">下载JSON文件</a>
         </t-dropdown-item>
-        <!-- <t-dropdown-item>
+        <t-dropdown-item>
           <a @click="downloadZip">
             <div class="flex">
               导出为ZIP文件 <span class="flex-grow"></span>
@@ -42,7 +42,7 @@
         <t-dropdown-item>
           <a @click="downloadHtml">
             <div class="flex">
-              导出为HTML <span class="flex-grow"></span>
+              下载离线部署包 <span class="flex-grow"></span>
               <span><label>VIP</label></span>
             </div>
           </a>
@@ -50,7 +50,7 @@
         <t-dropdown-item>
           <a @click="downloadVue3">
             <div class="flex">
-              导出为Vue3组件 <span class="flex-grow"></span>
+              下载Vue3组件包 <span class="flex-grow"></span>
               <span><label>VIP</label></span>
             </div>
           </a>
@@ -58,7 +58,7 @@
         <t-dropdown-item>
           <a @click="downloadVue2">
             <div class="flex">
-              导出为Vue2组件 <span class="flex-grow"></span>
+              下载Vue2组件包 <span class="flex-grow"></span>
               <span><label>VIP</label></span>
             </div>
           </a>
@@ -66,11 +66,11 @@
         <t-dropdown-item divider="true">
           <a @click="downloadReact">
             <div class="flex">
-              导出为React组件 <span class="flex-grow"></span>
+              下载React组件包 <span class="flex-grow"></span>
               <span><label>VIP</label></span>
             </div>
           </a>
-        </t-dropdown-item> -->
+        </t-dropdown-item>
         <t-dropdown-item>
           <a @click="downloadPng">下载为PNG</a>
         </t-dropdown-item>
@@ -458,11 +458,15 @@ const openZip = async (file: File) => {
     return;
   }
 
-  if (!user.isVip) {
+  // if (!user.isVip) {
+  //   gotoAccount();
+  //   return;
+  // }
+  if (!user.vip) {
+    MessagePlugin.info('需要开通普通会员~');
     gotoAccount();
     return;
   }
-
   const { default: JSZip } = await import('jszip');
   const zip = new JSZip();
   await zip.loadAsync(file);
@@ -612,11 +616,15 @@ const downloadZip = async () => {
     return;
   }
 
-  if (!user.isVip) {
+  // if (!user.isVip) {
+  //   // gotoAccount();
+  //   return;
+  // }
+  if (!user.vip) {
+    MessagePlugin.info('需要开通普通会员~');
     gotoAccount();
     return;
   }
-
   MessagePlugin.info('正在下载打包中,可能需要几分钟,请耐心等待...');
   const [{ default: JSZip }, { saveAs }] = await Promise.all([
     import('jszip'),
@@ -642,21 +650,59 @@ const downloadZip = async () => {
   saveAs(blob, `${_fileName}.zip`);
 };
 
+const zip3D = (name:string) => {
+  const pen_3d = meta2d.store.data.pens.filter(
+    (pen) =>
+      pen.name === 'iframe' &&
+      (pen.tags.includes('meta3d') || pen.iframe.indexOf('3d') !== -1)
+  );
+  if (pen_3d && pen_3d.length) {
+    //存在3d场景
+    pen_3d.forEach((pen) => {
+      //发送消息
+      let params = queryURLParams(pen.iframe.split('?')[1]);
+      (
+        pen.calculative.singleton.div.children[0] as HTMLIFrameElement
+      ).contentWindow.postMessage(
+        JSON.stringify({
+          name,
+          id: params.id,
+        }),
+        '*'
+      );
+    });
+  }
+};
+function queryURLParams(value?: string) {
+  let url = value || window.location.href.split('?')[1];
+  const urlSearchParams = new URLSearchParams(url);
+  const params = Object.fromEntries(urlSearchParams.entries());
+  return params;
+}
+
 const downloadHtml = async () => {
   if (!(user && user.id)) {
     MessagePlugin.warning(noLoginTip);
     return;
   }
 
-  if (!user.isVip) {
+  // if (!user.isVip) {
+  //   gotoAccount();
+  //   return;
+  // }
+
+  if(user.vipDesc !== '超级会员'&&user.vipDesc !=='旗舰会员'){
+    MessagePlugin.info('需要开通超级会员~');
     gotoAccount();
-    return;
+    return
   }
-
+  frameFlag = -1;
   MessagePlugin.info('正在下载打包中,可能需要几分钟,请耐心等待...');
-
+  zip3D('deploy');
   const data: Meta2dBackData = meta2d.data();
   if (data._id) delete data._id;
+  if (data.id) delete data.id;
+  if (data.image) delete data.image;
   checkData(data);
   const [{ default: JSZip }, { saveAs }] = await Promise.all([
     import('jszip'),
@@ -709,21 +755,30 @@ const downloadReact = async () => {
   downloadAsFrame(Frame.react);
 };
 
+let frameFlag = -1;
+
 async function downloadAsFrame(type: Frame) {
   if (!(user && user.id)) {
     MessagePlugin.warning(noLoginTip);
     return;
   }
 
-  if (!user.isVip) {
+  // if (!user.isVip) {
+  //   gotoAccount();
+  //   return;
+  // }
+  if(user.vipDesc !=='旗舰会员'){
+    MessagePlugin.info('需要开通旗舰会员~');
     gotoAccount();
-    return;
+    return
   }
-
+  frameFlag = type;
   MessagePlugin.info('正在下载打包中,可能需要几分钟,请耐心等待...');
-
+  zip3D(type===Frame.vue3?'toVue3':(type===Frame.vue2?'toVue2':'toReact'));
   const data: Meta2dBackData = meta2d.data();
   if (data._id) delete data._id;
+  if (data.id) delete data.id;
+  if (data.image) delete data.image;
   checkData(data);
   const [{ default: JSZip }, { saveAs }] = await Promise.all([
     import('jszip'),
@@ -735,10 +790,17 @@ async function downloadAsFrame(type: Frame) {
     'le5le.meta2d';
   const _zip: any = zip.folder(`${_fileName}`);
   _zip.file(
-    'data.json',
+    `${
+      type === Frame.vue3
+        ? 'meta2d-vue3'
+        : type === Frame.vue2
+        ? 'meta2d-vue2'
+        : 'meta2d-react'
+    }/public/json/data.json`,
     JSON.stringify(data).replaceAll(cdn, '').replaceAll(upCdn, '')
   );
   await Promise.all([
+    zipJs(_zip),
     zipBkImg(_zip),
     zipImages(_zip, meta2d.store.data.pens),
     type === Frame.vue3
@@ -749,9 +811,32 @@ async function downloadAsFrame(type: Frame) {
   ]);
   const blob = await zip.generateAsync({ type: 'blob' });
   saveAs(blob, `${_fileName}.zip`);
+  frameFlag = -1;
 }
 
-async function zipVue3Files(zip: JSZip) {
+async function zipJs(zip: JSZip) {
+  const files = ['/view/js/marked.min.js', '/view/js/lcjs.iife.js'];
+  await Promise.all(
+    files.map(async (filePath) => {
+      const res: Blob = await axios.get(filePath, {
+        responseType: 'blob',
+      });
+      zip.file(
+        `${
+          frameFlag === Frame.vue3
+            ? 'meta2d-vue3'
+            : frameFlag === Frame.vue2
+            ? 'meta2d-vue2'
+            : 'meta2d-react'
+        }/public` + filePath.replace('/view', ''),
+        res,
+        { createFolders: true }
+      );
+    })
+  );
+}
+
+async function _zipVue3Files(zip: JSZip) {
   const files = [
     '/view/js/marked.min.js',
     '/view/js/lcjs.iife.js',
@@ -764,7 +849,23 @@ async function zipVue3Files(zip: JSZip) {
   await Promise.all(files.map((filePath) => zipFile(zip, filePath)));
 }
 
-async function zipVue2Files(zip: JSZip) {
+//新
+async function zipVue3Files(zip: JSZip) {
+  const files = [
+    '/view/meta2d-vue3/src/components/Meta2d.vue',
+    '/view/meta2d-vue3/src/App.vue',
+    '/view/meta2d-vue3/src/main.js',
+    '/view/meta2d-vue3/src/style.css',
+    '/view/meta2d-vue3/index.html',
+    '/view/meta2d-vue3/package.json',
+    '/view/meta2d-vue3/README.md',
+    '/view/meta2d-vue3/vite.config.js',
+  ] as const;
+  // 文件同时加载
+  await Promise.all(files.map((filePath) => zipFile(zip, filePath)));
+}
+
+async function _zipVue2Files(zip: JSZip) {
   const files = [
     '/view/js/marked.min.js',
     '/view/js/lcjs.iife.js',
@@ -777,7 +878,22 @@ async function zipVue2Files(zip: JSZip) {
   await Promise.all(files.map((filePath) => zipFile(zip, filePath)));
 }
 
-async function zipReactFiles(zip: JSZip) {
+async function zipVue2Files(zip: JSZip) {
+  const files = [
+    '/view/meta2d-vue2/src/components/Meta2d.vue',
+    '/view/meta2d-vue2/src/App.vue',
+    '/view/meta2d-vue2/src/main.js',
+    // '/view/meta2d-vue2/src/style.css',
+    '/view/meta2d-vue2/public/index.html',
+    '/view/meta2d-vue2/package.json',
+    '/view/meta2d-vue2/README.md',
+    // '/view/meta2d-vue3/vite.config.js',
+  ] as const;
+  // 文件同时加载
+  await Promise.all(files.map((filePath) => zipFile(zip, filePath)));
+}
+
+async function _zipReactFiles(zip: JSZip) {
   const files = [
     '/view/js/marked.min.js',
     '/view/js/lcjs.iife.js',
@@ -791,6 +907,21 @@ async function zipReactFiles(zip: JSZip) {
   await Promise.all(files.map((filePath) => zipFile(zip, filePath)));
 }
 
+async function zipReactFiles(zip: JSZip) {
+  const files = [
+    '/view/meta2d-react/src/index.css',
+    '/view/meta2d-react/src/index.js',
+    '/view/meta2d-react/src/Meta2d.css',
+    '/view/meta2d-react/src/Meta2d.jsx',
+    '/view/meta2d-react/package.json',
+    '/view/meta2d-react/README.md',
+    '/view/meta2d-react/public/index.html',
+
+  ] as const;
+  // 文件同时加载
+  await Promise.all(files.map((filePath) => zipFile(zip, filePath)));
+}
+
 async function zipFiles(zip: JSZip) {
   const files = [
     '/view/js/marked.min.js',
@@ -860,9 +991,21 @@ async function zipImage(zip: JSZip, image: string) {
       isZip: true,
     },
   });
-  zip.file(cdn ? image.replace(cdn, '').replace(upCdn, '') : image, res, {
-    createFolders: true,
-  });
+  zip.file(
+    (frameFlag === -1
+      ? ''
+      : `${
+          frameFlag === Frame.vue3
+            ? 'meta2d-vue3'
+            : frameFlag === Frame.vue2
+            ? 'meta2d-vue2'
+            : 'meta2d-react'
+        }/public`) + (cdn ? image.replace(cdn, '').replace(upCdn, '') : image),
+    res,
+    {
+      createFolders: true,
+    }
+  );
 }
 
 const downloadImageTips =

+ 12 - 7
src/views/components/View.vue

@@ -617,9 +617,10 @@
               <div class="gray" style="margin-left: 32px; margin-top: -2px">
                 有效期至:{{ publishDialog.data.expired }}
               </div>
-              <a class="bland ml-12" @click="publishChargeDialog.show = true">
+              <p>需要开通高级会员</p>
+              <!-- <a class="bland ml-12" @click="publishChargeDialog.show = true">
                 续费
-              </a>
+              </a> -->
             </div>
             <div v-else class="flex middle">
               <t-icon name="play-circle-stroke" class="mr-4" />
@@ -846,11 +847,15 @@ onMounted(() => {
     if (typeof e.data !== 'string') {
       return;
     }
-    let data = JSON.parse(e.data);
-    if (typeof data === 'object') {
-      meta2d.emit(data.name);
-    } else {
-      meta2d.emit(data);
+    try {
+      let data = JSON.parse(e.data);
+      if (typeof data === 'object') {
+        meta2d.emit(data.name);
+      } else {
+        meta2d.emit(data);
+      }
+    } catch (e) {
+      console.info(e);
     }
   });
 });

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels