Browse Source

Merge branch 'master' of http://124.70.149.18:10880/lianghj/queenshow

qinyan 1 year ago
parent
commit
45b2a12209

+ 2 - 0
package.json

@@ -41,6 +41,7 @@
     "@types/file-saver": "^2.0.5",
     "@types/qrcode": "^1.5.0",
     "@vueuse/core": "^9.13.0",
+    "@vueuse/integrations": "^10.1.2",
     "ali-oss": "^6.17.1",
     "ant-design-vue": "^3.2.12",
     "co": "^4.6.0",
@@ -55,6 +56,7 @@
     "nanoid": "^4.0.2",
     "nats.ws": "^1.15.0",
     "proto.gl": "^1.0.0",
+    "qrcode": "^1.5.3",
     "queen3d": "^0.0.80",
     "queenjs": "^1.0.0-beta.72",
     "rimraf": "^3.0.2",

+ 12 - 0
src/controllers/queentreeController.ts

@@ -18,6 +18,18 @@ export class  TreeController {
         return ret.payload;
     }
 
+    async selectOnePack() {
+        const bus = this._bus;
+        const route = await bus.requestApi("queentree.local.router", {name:"selpacksceneblack"})
+        if (!route || !route.Url ) return;
+        let url:string = route.Url;
+        url = url.replace("#/selpackscene", "#/selectPack")
+        const payload = {}
+        const ret:any = await bus.RequestWebView("selpacksceneblack", {dev:true, height: 600, width: 900, payload, url, alwaysOnTop:true,})
+        console.log("selpackprodblack=>", ret);
+        return ret.payload;
+    }
+
     async selectOnePackScene() {
         const bus = this._bus;
         const route = await bus.requestApi("queentree.local.router", {name:"selpacksceneblack"})

+ 3 - 1
src/hooks/initRemSize.ts

@@ -1,8 +1,10 @@
+import { isPc } from "@queenjs/utils";
+
 export function initRemSize() {
   function setRem() {
     const clientWidth = document.documentElement.clientWidth;
     const width = clientWidth > 750 ? 750 : clientWidth;
-    const fontSize = (width / 750) * 50;
+    const fontSize = (width / 750) * (isPc() ? 50 : 100);
     document.documentElement.style.fontSize = fontSize + "px";
   }
 

+ 2 - 1
src/modules/editor/actions/init.ts

@@ -2,6 +2,7 @@ import { Exception } from "queenjs";
 import { EditorModule } from "..";
 import { DesignTemp } from "../defines/DesignTemp";
 import { editActions } from "./edit";
+import { EditorMode } from "../typings";
 
 export const initActions = EditorModule.action({
   // 模块初始化
@@ -22,7 +23,7 @@ export const initActions = EditorModule.action({
     this.store.initDesignData(ret.result);
   },
   // 切换模式
-  switchMode(v: string) {
+  switchMode(v: EditorMode) {
     this.store.setMode(v);
   },
 });

+ 1 - 1
src/modules/editor/components/CompUI/basicUI/Video/component.tsx

@@ -30,7 +30,7 @@ export const Component = defineComponent({
           onDblclick={store.isEditMode ? changeVal : undefined}
         >
           <video
-            class="w-full object-cover"
+            class="w-full object-cover pointer-events-none"
             src={value.url}
             style={{ aspectRatio: value.ratio }}
             {...options}

+ 1 - 1
src/modules/editor/components/CompUI/basicUI/Video/index.ts

@@ -12,7 +12,7 @@ export const { options, useCompData } = createOptions({
     ratio: 1,
     autoplay: true,
     loop: true,
-    controls: false,
+    controls: true,
   },
 });
 

+ 13 - 9
src/modules/editor/components/CompUI/basicUI/View.tsx

@@ -74,6 +74,7 @@ export const View = defineComponent({
         <div
           class={[
             viewStyle,
+            store.isEditMode && "view_editing",
             store.isEditMode && isSelected && "view_selected",
             bgClasses,
           ]}
@@ -103,26 +104,29 @@ const viewStyle = css`
   position: relative;
   font-size: 0;
 
+  &.view_editing {
+    .view_content {
+      &:hover {
+        outline: 1px dashed @inf-primary-color;
+      }
+    }
+    .view_inside:hover {
+      outline: 1px dashed @inf-primary-color;
+      outline-offset: -1px;
+    }
+  }
+
   .view_content {
     display: inline-block;
     width: 100%;
     height: 100%;
     background: no-repeat center / cover;
-
-    &:hover {
-      outline: 1px dashed @inf-primary-color;
-    }
   }
 
   &.view_selected {
     > .view_content {
       outline: 1px solid @inf-primary-color;
     }
-
-    .view_inside:hover {
-      outline: 1px dashed @inf-primary-color;
-      outline-offset: -1px;
-    }
   }
 
   .view_inside {

+ 42 - 7
src/modules/editor/components/CompUI/basicUI/Web3D/component.tsx

@@ -1,4 +1,5 @@
-import { defineComponent } from "vue";
+import { useEditor } from "@/modules/editor";
+import { defineComponent, reactive } from "vue";
 import { string } from "vue-types";
 import { useCompData } from ".";
 import { View } from "../View";
@@ -8,16 +9,50 @@ export const Component = defineComponent({
     compId: string().isRequired,
   },
   setup(props) {
+    const { store, controls } = useEditor();
     const { value } = useCompData(props.compId);
 
+    const state = reactive({
+      visible: false,
+    });
+
+    async function pickPack() {
+      await controls.pickCtrl.onPickPack();
+      value.url =
+        "https://www.sku3d.com/share.html?id=6478676ca494a3ea15a6fa82";
+    }
+
+    function openWeb3D() {
+      if (value.openWindow) {
+        window.open(value.url);
+      } else {
+        state.visible = true;
+      }
+    }
+
     return () => {
       return (
-        <View>
-          <img
-            class="w-full"
-            src={value.poster}
-            style={{ aspectRatio: value.ratio }}
-          />
+        <View
+          compId={props.compId}
+          onDblclick={store.isEditMode ? pickPack : undefined}
+        >
+          {!state.visible ? (
+            <img
+              class={[
+                "w-full h-full object-cover",
+                store.isEditMode && "pointer-events-none",
+              ]}
+              style={{ aspectRatio: value.ratio }}
+              src={value.poster}
+              onClick={openWeb3D}
+            />
+          ) : (
+            <iframe
+              class="w-full h-full border-none"
+              src={value.url}
+              style={{ aspectRatio: value.ratio }}
+            />
+          )}
         </View>
       );
     };

+ 17 - 6
src/modules/editor/components/CompUI/basicUI/Web3D/index.ts

@@ -9,15 +9,26 @@ export const { options, useCompData } = createOptions({
   name: "3D",
   thumbnail: Dict_Imgs.Default,
   value: {
-    url: "//infishwaibao.oss-cn-chengdu.aliyuncs.com/release/sku3d/media/shoes.1c5c29ad.webm",
-    ratio: 1,
+    url: "https://www.sku3d.com/share.html?id=6478676ca494a3ea15a6fa82",
+    openWindow: false,
     poster: Dict_Imgs.Default,
+    ratio: 1,
   },
 });
 
 export const Form = createAttrsForm([
   {
-    label: "视图比例",
+    label: "3D链接",
+    dataIndex: "value.url",
+    component: "Input",
+  },
+  {
+    label: "封面",
+    dataIndex: "value.poster",
+    component: ImagePicker,
+  },
+  {
+    label: "视频比例",
     dataIndex: "value.ratio",
     component: "Select",
     props: {
@@ -31,8 +42,8 @@ export const Form = createAttrsForm([
     },
   },
   {
-    label: "显示控制器",
-    dataIndex: "value.poster",
-    component: ImagePicker,
+    label: "是否跳转",
+    dataIndex: "value.openWindow",
+    component: "Switch",
   },
 ]);

+ 0 - 0
src/modules/editor/components/Canvas/index.tsx → src/modules/editor/components/Preview/index.tsx


+ 2 - 4
src/modules/editor/components/Viewport/Content/index.tsx

@@ -5,7 +5,6 @@ import { computed, onUnmounted } from "vue";
 import { Container, Draggable } from "vue-dndrop";
 import { useEditor } from "../../..";
 import { HotKeyCtrl } from "../../../controllers/HotKeyCtrl";
-import Canvas from "../../Canvas";
 import { CompUI } from "../../CompUI";
 import ErrorComp from "../../CompUI/placeHoder";
 
@@ -60,8 +59,7 @@ export default defineUI({
             non-drag-area-selector={".drag-disable"}
           >
             {compsGroup.value.normalArr.map((d) => {
-              const Comp: any =
-              CompUI[d.compKey]?.Component || ErrorComp;
+              const Comp: any = CompUI[d.compKey]?.Component || ErrorComp;
               return (
                 <Draggable key={d.id}>
                   <Comp compId={d.id} />
@@ -70,7 +68,7 @@ export default defineUI({
             })}
           </Container>
         ) : (
-          <Canvas />
+          <editor.components.Preview />
         )}
       </div>
     );

+ 25 - 0
src/modules/editor/components/Viewport/Header/ShareBox.tsx

@@ -0,0 +1,25 @@
+import { useEditor } from "@/modules/editor";
+import { useQRCode } from "@vueuse/integrations/useQRCode";
+import { useClipboard } from "@vueuse/core";
+import { Button } from "ant-design-vue";
+import { defineComponent } from "vue";
+
+export const ShareBox = defineComponent({
+  setup() {
+    const { store } = useEditor();
+    const shareLink =
+      location.origin + "/share.html?id=" + store.designData._id;
+    const qrUrl = useQRCode(shareLink);
+    const { copy, copied } = useClipboard();
+
+    return () => (
+      <div class="p-20px bg-dark-500 text-center">
+        <img src={qrUrl.value} />
+        <div class="mb-20px"></div>
+        <Button onClick={() => copy(shareLink)} disabled={copied.value}>
+          {copied.value ? "已复制" : "复制链接"}
+        </Button>
+      </div>
+    );
+  },
+});

+ 10 - 2
src/modules/editor/components/Viewport/Header/index.tsx

@@ -1,6 +1,7 @@
 import { useEditor } from "@/modules/editor";
-import { Button, Radio } from "ant-design-vue";
+import { Button, Dropdown, Radio } from "ant-design-vue";
 import { defineUI } from "queenjs";
+import { ShareBox } from "./ShareBox";
 
 export default defineUI({
   setup() {
@@ -16,7 +17,14 @@ export default defineUI({
           <Radio.Button value="preview">预览</Radio.Button>
         </Radio.Group>
 
-        <aside>
+        <aside class="space-x-10px">
+          <Dropdown
+            overlay={<ShareBox />}
+            trigger="click"
+            placement="bottomRight"
+          >
+            <Button>分享</Button>
+          </Dropdown>
           <Button type="primary" onClick={() => actions.saveDesign()}>
             保存
           </Button>

+ 2 - 0
src/modules/editor/components/index.ts

@@ -1,5 +1,7 @@
+import Preview from "./Preview";
 import Viewport from "./Viewport";
 
 export default {
   Viewport,
+  Preview
 };

+ 16 - 13
src/modules/editor/controllers/ImagePickerController.ts

@@ -1,16 +1,19 @@
 export class ImagePickController {
-    async pickOneImage() {
-        const rets:any = await this.onPickImage(1);
+  async pickOneImage() {
+    const rets: any = await this.onPickImage(1);
 
-        console.log("pickOneImage=>", rets)
-        
-        if (rets && rets.length > 0 ) {
-            return rets[0]
-        }
-        return ""
-    }
-    async onPickImage(maxCount:number):Promise<string[]> {
-        console.log("max=>", maxCount);
-        return []
+    console.log("pickOneImage=>", rets);
+
+    if (rets && rets.length > 0) {
+      return rets[0];
     }
-}
+    return "";
+  }
+  async onPickImage(maxCount: number): Promise<string[]> {
+    console.log("max=>", maxCount);
+    return [];
+  }
+  async onPickPack() {
+    //
+  }
+}

+ 3 - 3
src/modules/editor/stores/index.ts

@@ -2,11 +2,11 @@ import { EditorModule } from "..";
 import { CompUI } from "../components/CompUI";
 import { DesignTemp } from "../defines/DesignTemp";
 import { DesignComp } from "../defines/DesignTemp/DesignComp";
-import { ICompKeys } from "../typings";
+import { EditorMode, ICompKeys } from "../typings";
 
 export const store = EditorModule.store({
   state: () => ({
-    mode: "edit",
+    mode: "edit" as EditorMode,
     currCompId: "",
     designData: new DesignTemp(),
     designCompMap: new Map<string, DesignComp>(),
@@ -20,7 +20,7 @@ export const store = EditorModule.store({
     },
   },
   actions: {
-    setMode(v: string) {
+    setMode(v: EditorMode) {
       this.store.mode = v;
     },
     initDesignCompMap() {

+ 2 - 0
src/modules/editor/typings.ts

@@ -2,6 +2,8 @@ import { CompUI } from "./components/CompUI";
 
 export type ICompKeys = keyof typeof CompUI;
 
+export type EditorMode = "edit" | "preview";
+
 export type Layout = {
   size?: number[]; // width height
   textAlign?: string;

+ 13 - 8
src/pages/editor/EditPage/index.tsx

@@ -1,23 +1,28 @@
 import { initEditor } from "@/modules/editor";
+import { initResource, useResource } from "@/modules/resource";
 import { SelectOneImage } from "@/pages/website/Material2/modal";
 import { queenApi } from "queenjs";
 import { defineComponent } from "vue";
 
 export default defineComponent(() => {
   const editor = initEditor();
+  const resource = useResource();
 
   const params = new URLSearchParams(location.hash.split("?")[1]);
   editor.actions.initDesign(params.get("id") || "");
 
-  editor.controls.pickCtrl.onPickImage = async (maxCount:number)=>{
-     if ( maxCount <= 1 ) {
-       const url = await SelectOneImage();
+  editor.controls.pickCtrl.onPickImage = async (maxCount: number) => {
+    if (maxCount <= 1) {
+      const url = await SelectOneImage();
 
-       
-       return [url as string];
-     }
-     return []
-  }
+      return [url as string];
+    }
+    return [];
+  };
+
+  editor.controls.pickCtrl.onPickPack = async () => {
+    return resource.treeController.selectOnePackScene();
+  };
 
   return () => <editor.components.Viewport class="!h-100vh" />;
 });

+ 5 - 0
src/pages/queentree/router.ts

@@ -10,6 +10,11 @@ const routes: Array<RouteRecordRaw> = [
     name: "selpackscene",
     component: () => import("./selectPackScene"),
   },
+  {
+    path: "/selectPack",
+    name: "selectPack",
+    component: () => import("./selectPack"),
+  },
 ];
 
 const router = createRouter({

+ 19 - 0
src/pages/queentree/selectPack.tsx

@@ -0,0 +1,19 @@
+import { css } from "@linaria/core";
+import { defineComponent } from "vue";
+import LibraryModal from "../website/CreateMat/components/LibraryModal";
+
+export default defineComponent({
+  setup() {
+    return () =>(
+        <div class={rootStyles}>
+            <LibraryModal title="选择模型包场景" nodeTypes={["pack"]} apiName="selpacksceneblack" />
+        </div>
+      );
+  },
+});
+
+const rootStyles = css`
+  > div {
+    margin: unset !important;
+  }
+`;

+ 18 - 0
src/pages/share/App.tsx

@@ -0,0 +1,18 @@
+import { initRemSize } from "@/hooks/initRemSize";
+import { initEditor } from "@/modules/editor";
+import { defineComponent } from "vue";
+
+export const App = defineComponent(() => {
+  const editor = initEditor();
+  const params = new URLSearchParams(location.href.split("?")[1]);
+  const id = params.get("id");
+
+  editor.actions.switchMode("preview");
+  initRemSize();
+
+  if (id) {
+    editor.actions.initDesign(id);
+  }
+
+  return () => <editor.components.Preview />;
+});

+ 8 - 0
src/pages/share/index.ts

@@ -0,0 +1,8 @@
+import CKEditor from "@ckeditor/ckeditor5-vue";
+import { createApp } from "vue";
+import "../../styles";
+import { App } from "./App";
+import "./style.less";
+
+const app = createApp(App);
+app.use(CKEditor).mount("#app");

+ 5 - 0
src/pages/share/style.less

@@ -0,0 +1,5 @@
+#app {
+  min-height: 100vh;
+  min-width: 100vw;
+  background-color: #fff;
+}

+ 1 - 0
vue.config.js

@@ -17,6 +17,7 @@ module.exports = defineConfig({
   pages: {
     index: "src/pages/website/index.ts",
     editor: "src/pages/editor/index.ts",
+    share: "src/pages/share/index.ts",
     treeapi: "src/pages/queentree/index.ts",
   },
   publicPath: publicPath,

+ 131 - 2
yarn.lock

@@ -1949,6 +1949,11 @@
   resolved "http://124.70.149.18:4873/@types%2fweb-bluetooth/-/web-bluetooth-0.0.16.tgz#1d12873a8e49567371f2a75fe3e7f7edca6662d8"
   integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==
 
+"@types/web-bluetooth@^0.0.17":
+  version "0.0.17"
+  resolved "http://124.70.149.18:4873/@types%2fweb-bluetooth/-/web-bluetooth-0.0.17.tgz#5c9f3c617f64a9735d7b72a7cc671e166d900c40"
+  integrity sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==
+
 "@types/webpack-env@^1.15.2":
   version "1.18.0"
   resolved "http://124.70.149.18:4873/@types%2fwebpack-env/-/webpack-env-1.18.0.tgz#ed6ecaa8e5ed5dfe8b2b3d00181702c9925f13fb"
@@ -2440,6 +2445,16 @@
   resolved "http://124.70.149.18:4873/@vue%2fweb-component-wrapper/-/web-component-wrapper-1.3.0.tgz#b6b40a7625429d2bd7c2281ddba601ed05dc7f1a"
   integrity sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==
 
+"@vueuse/core@10.1.2":
+  version "10.1.2"
+  resolved "http://124.70.149.18:4873/@vueuse%2fcore/-/core-10.1.2.tgz#2499eadec36c5d7109338e3a2b73725040ae8011"
+  integrity sha512-roNn8WuerI56A5uiTyF/TEYX0Y+VKlhZAF94unUfdhbDUI+NfwQMn4FUnUscIRUhv3344qvAghopU4bzLPNFlA==
+  dependencies:
+    "@types/web-bluetooth" "^0.0.17"
+    "@vueuse/metadata" "10.1.2"
+    "@vueuse/shared" "10.1.2"
+    vue-demi ">=0.14.0"
+
 "@vueuse/core@^9.13.0":
   version "9.13.0"
   resolved "http://124.70.149.18:4873/@vueuse%2fcore/-/core-9.13.0.tgz#2f69e66d1905c1e4eebc249a01759cf88ea00cf4"
@@ -2450,11 +2465,32 @@
     "@vueuse/shared" "9.13.0"
     vue-demi "*"
 
+"@vueuse/integrations@^10.1.2":
+  version "10.1.2"
+  resolved "http://124.70.149.18:4873/@vueuse%2fintegrations/-/integrations-10.1.2.tgz#e318ed2cec87711b2a110dceca2150d7fe1452d0"
+  integrity sha512-wUpG3Wv6LiWerOwCzOAM0iGhNQ4vfFUTkhj/xQy7TLXduh2M3D8N08aS0KqlxsejY6R8NLxydDIM+68QfHZZ8Q==
+  dependencies:
+    "@vueuse/core" "10.1.2"
+    "@vueuse/shared" "10.1.2"
+    vue-demi ">=0.14.0"
+
+"@vueuse/metadata@10.1.2":
+  version "10.1.2"
+  resolved "http://124.70.149.18:4873/@vueuse%2fmetadata/-/metadata-10.1.2.tgz#d8ffe557b1042efd03a0aa88540a00c25d193ee3"
+  integrity sha512-3mc5BqN9aU2SqBeBuWE7ne4OtXHoHKggNgxZR2K+zIW4YLsy6xoZ4/9vErQs6tvoKDX6QAqm3lvsrv0mczAwIQ==
+
 "@vueuse/metadata@9.13.0":
   version "9.13.0"
   resolved "http://124.70.149.18:4873/@vueuse%2fmetadata/-/metadata-9.13.0.tgz#bc25a6cdad1b1a93c36ce30191124da6520539ff"
   integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==
 
+"@vueuse/shared@10.1.2":
+  version "10.1.2"
+  resolved "http://124.70.149.18:4873/@vueuse%2fshared/-/shared-10.1.2.tgz#31d8733a217a6396eb67706319133bf62cdd8baa"
+  integrity sha512-1uoUTPBlgyscK9v6ScGeVYDDzlPSFXBlxuK7SfrDGyUTBiznb3mNceqhwvZHjtDRELZEN79V5uWPTF1VDV8svA==
+  dependencies:
+    vue-demi ">=0.14.0"
+
 "@vueuse/shared@9.13.0":
   version "9.13.0"
   resolved "http://124.70.149.18:4873/@vueuse%2fshared/-/shared-9.13.0.tgz#089ff4cc4e2e7a4015e57a8f32e4b39d096353b9"
@@ -3324,6 +3360,15 @@ clipboardy@^2.3.0:
     execa "^1.0.0"
     is-wsl "^2.1.1"
 
+cliui@^6.0.0:
+  version "6.0.0"
+  resolved "http://124.70.149.18:4873/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+  integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
+  dependencies:
+    string-width "^4.2.0"
+    strip-ansi "^6.0.0"
+    wrap-ansi "^6.2.0"
+
 cliui@^7.0.2, cliui@^7.0.4:
   version "7.0.4"
   resolved "http://124.70.149.18:4873/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
@@ -3771,6 +3816,11 @@ debug@^3.2.6, debug@^3.2.7:
   dependencies:
     ms "^2.1.1"
 
+decamelize@^1.2.0:
+  version "1.2.0"
+  resolved "http://124.70.149.18:4873/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+  integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
 deep-is@^0.1.3, deep-is@~0.1.3:
   version "0.1.4"
   resolved "http://124.70.149.18:4873/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
@@ -3884,6 +3934,11 @@ digest-header@^1.0.0:
   resolved "http://124.70.149.18:4873/digest-header/-/digest-header-1.1.0.tgz#e16ab6cf4545bc4eea878c8c35acd1b89664d800"
   integrity sha512-glXVh42vz40yZb9Cq2oMOt70FIoWiv+vxNvdKdU8CwjLad25qHM3trLxhl9bVjdr6WaslIXhWpn0NO8T/67Qjg==
 
+dijkstrajs@^1.0.1:
+  version "1.0.3"
+  resolved "http://124.70.149.18:4873/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23"
+  integrity sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==
+
 dir-glob@^3.0.1:
   version "3.0.1"
   resolved "http://124.70.149.18:4873/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@@ -4017,6 +4072,11 @@ emojis-list@^3.0.0:
   resolved "http://124.70.149.18:4873/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
   integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
 
+encode-utf8@^1.0.3:
+  version "1.0.3"
+  resolved "http://124.70.149.18:4873/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda"
+  integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==
+
 encodeurl@~1.0.2:
   version "1.0.2"
   resolved "http://124.70.149.18:4873/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
@@ -4695,7 +4755,7 @@ gensync@^1.0.0-beta.2:
   resolved "http://124.70.149.18:4873/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
   integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
 
-get-caller-file@^2.0.5:
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
   version "2.0.5"
   resolved "http://124.70.149.18:4873/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
   integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
@@ -6556,6 +6616,11 @@ platform@^1.3.1:
   resolved "http://124.70.149.18:4873/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7"
   integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==
 
+pngjs@^5.0.0:
+  version "5.0.0"
+  resolved "http://124.70.149.18:4873/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb"
+  integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==
+
 pofile@^1.0.9:
   version "1.1.4"
   resolved "http://124.70.149.18:4873/pofile/-/pofile-1.1.4.tgz#eab7e29f5017589b2a61b2259dff608c0cad76a2"
@@ -6998,6 +7063,16 @@ punycode@^2.1.0:
   resolved "http://124.70.149.18:4873/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
   integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
 
+qrcode@^1.5.3:
+  version "1.5.3"
+  resolved "http://124.70.149.18:4873/qrcode/-/qrcode-1.5.3.tgz#03afa80912c0dccf12bc93f615a535aad1066170"
+  integrity sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==
+  dependencies:
+    dijkstrajs "^1.0.1"
+    encode-utf8 "^1.0.3"
+    pngjs "^5.0.0"
+    yargs "^15.3.1"
+
 qs@6.11.0:
   version "6.11.0"
   resolved "http://124.70.149.18:4873/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
@@ -7228,6 +7303,11 @@ require-from-string@^2.0.2:
   resolved "http://124.70.149.18:4873/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
   integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
 
+require-main-filename@^2.0.0:
+  version "2.0.0"
+  resolved "http://124.70.149.18:4873/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+  integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
 requires-port@^1.0.0:
   version "1.0.0"
   resolved "http://124.70.149.18:4873/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
@@ -7465,6 +7545,11 @@ serve-static@1.15.0:
     parseurl "~1.3.3"
     send "0.18.0"
 
+set-blocking@^2.0.0:
+  version "2.0.0"
+  resolved "http://124.70.149.18:4873/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+  integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
 setimmediate@^1.0.5:
   version "1.0.5"
   resolved "http://124.70.149.18:4873/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
@@ -8298,7 +8383,7 @@ vue-cli-plugin-windicss@~1.1.6:
     defu "^6.0.0"
     windicss-webpack-plugin "^1.7.4"
 
-vue-demi@*:
+vue-demi@*, vue-demi@>=0.14.0:
   version "0.14.5"
   resolved "http://124.70.149.18:4873/vue-demi/-/vue-demi-0.14.5.tgz#676d0463d1a1266d5ab5cba932e043d8f5f2fbd9"
   integrity sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==
@@ -8586,6 +8671,11 @@ whatwg-url@^5.0.0:
     tr46 "~0.0.3"
     webidl-conversions "^3.0.0"
 
+which-module@^2.0.0:
+  version "2.0.1"
+  resolved "http://124.70.149.18:4873/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409"
+  integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
+
 which@^1.2.9:
   version "1.3.1"
   resolved "http://124.70.149.18:4873/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
@@ -8644,6 +8734,15 @@ wrap-ansi@^3.0.1:
     string-width "^2.1.1"
     strip-ansi "^4.0.0"
 
+wrap-ansi@^6.2.0:
+  version "6.2.0"
+  resolved "http://124.70.149.18:4873/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+  integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
 wrap-ansi@^7.0.0:
   version "7.0.0"
   resolved "http://124.70.149.18:4873/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
@@ -8701,6 +8800,11 @@ xtend@^4.0.0:
   resolved "http://124.70.149.18:4873/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
   integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
 
+y18n@^4.0.0:
+  version "4.0.3"
+  resolved "http://124.70.149.18:4873/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+  integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
 y18n@^5.0.5:
   version "5.0.8"
   resolved "http://124.70.149.18:4873/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
@@ -8726,11 +8830,36 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2:
   resolved "http://124.70.149.18:4873/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
   integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
 
+yargs-parser@^18.1.2:
+  version "18.1.3"
+  resolved "http://124.70.149.18:4873/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+  integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+  dependencies:
+    camelcase "^5.0.0"
+    decamelize "^1.2.0"
+
 yargs-parser@^20.2.2:
   version "20.2.9"
   resolved "http://124.70.149.18:4873/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
   integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
 
+yargs@^15.3.1:
+  version "15.4.1"
+  resolved "http://124.70.149.18:4873/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
+  integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
+  dependencies:
+    cliui "^6.0.0"
+    decamelize "^1.2.0"
+    find-up "^4.1.0"
+    get-caller-file "^2.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^2.0.0"
+    set-blocking "^2.0.0"
+    string-width "^4.2.0"
+    which-module "^2.0.0"
+    y18n "^4.0.0"
+    yargs-parser "^18.1.2"
+
 yargs@^16.0.0:
   version "16.2.0"
   resolved "http://124.70.149.18:4873/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"