Bladeren bron

feat(邀请好友): 增加激活码类型

zengzhixiang 2 jaren geleden
bovenliggende
commit
3bd7db5eea

+ 7 - 1
.eslintrc.js

@@ -4,11 +4,17 @@ module.exports = {
     browser: true,
     node: true,
   },
+  parser: 'vue-eslint-parser',
   parserOptions: {
     parser: '@babel/eslint-parser',
     requireConfigFile: false,
   },
-  extends: ['@nuxtjs', 'plugin:nuxt/recommended', 'prettier'],
+  extends: [
+    'plugin:vue/recommended',
+    '@nuxtjs',
+    'plugin:nuxt/recommended',
+    'prettier',
+  ],
   plugins: [],
   // add your custom rules here
   rules: {

BIN
assets/image/activity/invite-user/bg-2@2x.png


BIN
assets/image/activity/invite-user/cybz-content-2@2x.png


BIN
assets/image/logo.png


+ 40 - 45
components/disk/index.vue

@@ -20,7 +20,7 @@
         ></v-progress-circular>
         <div v-if="loadingLabel" class="label mt-2">{{ loadingLabel }}</div>
       </div>
-      <div class="" v-else-if="$fetchState.error">
+      <div v-else-if="$fetchState.error" class="">
         <v-icon>$error</v-icon>
         <div class="">{{ $fetchState.error.message }}</div>
         <div class="">
@@ -71,11 +71,6 @@ export default {
       // activePhoneSizeId: 0,
     };
   },
-  computed: {
-    // currentPhoneSize() {
-    //   // return this.phoneSizeList.find(v=> v.width=== )
-    // },
-  },
   async fetch() {
     // await this.getDiskInfo();
     if (this.userCardId) {
@@ -84,6 +79,11 @@ export default {
       await this.connect(this.userCardId);
     }
   },
+  computed: {
+    // currentPhoneSize() {
+    //   // return this.phoneSizeList.find(v=> v.width=== )
+    // },
+  },
   watch: {
     userCardId: '$fetch',
   },
@@ -123,50 +123,45 @@ export default {
      */
     async connect(userCardId) {
       // 连接云机
-      const getConnectData = () => {
-        return this.$axios
-          .$post('/resources/user/cloud/connect', {
-            userCardId,
-          })
-          .catch((error) => {
-            if (error.response.data.status === 5200) {
-              this.loadingLabel = '云手机挂载中...';
-            }
-            return error;
-          });
-      };
-
-      const res = await getConnectData();
+      const getConnectData = () =>
+        this.$axios.$post('/resources/user/cloud/connect', {
+          userCardId,
+        });
 
-      if (!res.isAxiosError) {
+      try {
+        const res = await getConnectData();
         this.connectInfo = res.data;
-        // this.connectInfo.sn = 'RK3931C13019';
         return res;
-      }
-      // 第一次连接失败,开启轮询
-      const wres = await new Promise((resolve, reject) => {
-        const startTime = Date.now();
-        const maxTime = 1000 * 20;
-        clearInterval(this._watchConnectInterval);
-        this._watchConnectInterval = setInterval(async () => {
-          try {
-            if (Date.now() - startTime >= maxTime) {
-              throw new Error('云手机挂载超时');
-            }
-            const res = await getConnectData();
-            if (!res.isAxiosError) {
+      } catch (error) {
+        const res = await new Promise((resolve, reject) => {
+          const startTime = Date.now();
+          const maxTime = 1000 * 60;
+          const interval = 1000 * 1;
+          clearInterval(this._watchConnectInterval);
+          this._watchConnectInterval = setInterval(async () => {
+            try {
+              if (Date.now() - startTime >= maxTime) {
+                throw new Error('云手机挂载超时');
+              }
+              await getConnectData().then(resolve, (error) => {
+                // console.log(
+                //   '🚀 ~ file: index.vue ~ line 149 ~ awaitgetConnectData ~ error',
+                //   error,
+                // );
+                if (error.response.data.status === 5220) {
+                  // console.log('一键修复');
+                  this.loadingLabel = error.response.data.msg;
+                }
+              });
+            } catch (error) {
               clearInterval(this._watchConnectInterval);
-              resolve(res);
+              reject(error);
             }
-          } catch (error) {
-            clearInterval(this._watchConnectInterval);
-            reject(error);
-          }
-        }, 1000);
-      });
-      this.connectInfo = wres.data;
-      // this.connectInfo.sn = 'RK3923C1201900139';
-      return res;
+          }, interval);
+        });
+        this.connectInfo = res.data;
+        return res;
+      }
     },
   },
 };

+ 26 - 15
components/disk/video.vue

@@ -2,15 +2,14 @@
   <div class="disk-video">
     <video
       v-if="hasMediaSource"
-      :id="videoId"
       ref="video"
       class="video"
-      src=""
       autoplay
+      muted
+      controls
     ></video>
     <canvas
       v-else
-      :id="videoId"
       class="canvas"
       width="720"
       height="1280"
@@ -145,12 +144,12 @@ function checkMultiLoginInfo(input) {
 // 切换清晰度
 function makeSharpness(sn, level) {
   // var sn = "RK3923C1201900139";
-  var jsonObj = {
+  const jsonObj = {
     type: 2,
     data: { definition: level, clientType: 'h5', sceneType: 'cloudPhone' },
   };
-  var jsonStr = JSON.stringify(jsonObj);
-  var outPut = new TextEncoder('utf-8').encode(jsonStr);
+  const jsonStr = JSON.stringify(jsonObj);
+  const outPut = new TextEncoder('utf-8').encode(jsonStr);
   return makeFrameExtend(sn, 0xd, outPut);
 }
 export default {
@@ -164,19 +163,23 @@ export default {
   data() {
     return {
       hasMediaSource: false,
-      videoId: `video-${Date.now()}`,
     };
   },
-  created() {},
-  mounted() {
-    this.initVideo();
-  },
   async fetch() {
     this.info && (await this.initPlugflowWebSocket());
   },
+  computed: {
+    sn() {
+      return this.info.sn;
+    },
+  },
   watch: {
     info: '$fetch',
   },
+  created() {},
+  mounted() {
+    this.initVideo();
+  },
   methods: {
     initPlugflowWebSocket() {
       this?._ws?.close();
@@ -289,22 +292,30 @@ export default {
     },
     initVideo() {
       this.hasMediaSource = !!window.MediaSource;
-      this.hasMediaSource = false;
+      // this.hasMediaSource = false;
       if (this.hasMediaSource) {
         this._jmuxer = new JMuxer({
-          node: this.videoId,
+          node: this.$refs.video,
           flushingTime: 33,
           fps: 30,
           mode: 'video',
-          debug: false,
+          debug: true,
+          onReady :()=>{
+            console.log('JMuxer ready');
+          }
         });
       } else {
         throw new Error('当前设备不支持MediaSource');
       }
     },
     pushVideo(data) {
+      console.log("🚀 ~ file: video.vue ~ line 315 ~ pushVideo ~ data", data)
       if (this.hasMediaSource) {
-        this?._jmuxer?.feed({ video: data.video });
+        this?._jmuxer?.feed({
+          video: data.video,
+          // duration: data.duration,
+          // frameType: data.frameType,
+        });
         this.$refs?.video?.play();
       }
     },

+ 4 - 2
jsconfig.json

@@ -6,7 +6,9 @@
       "@/*": ["./*"],
       "~~/*": ["./*"],
       "@@/*": ["./*"]
-    }
+    },
+    "jsx": "preserve"
   },
-  "exclude": ["node_modules", ".nuxt", "dist"]
+  "exclude": ["node_modules", ".nuxt", "dist"],
+  "vueCompilerOptions": { "target": 2.7 }
 }

+ 5 - 4
package.json

@@ -1,5 +1,5 @@
 {
-  "name": "android-cloud-H5",
+  "name": "android-cloud-h5",
   "version": "1.0.0",
   "private": true,
   "scripts": {
@@ -41,10 +41,10 @@
     "vant": "^2.12.47",
     "vconsole": "^3.14.6",
     "vee-validate": "^3.4.14",
-    "vue": "^2.6.14",
+    "vue": "^2.7.8",
     "vue-data-dict": "^1.0.6",
-    "vue-server-renderer": "^2.6.14",
-    "vue-template-compiler": "^2.6.14",
+    "vue-server-renderer": "^2.7.8",
+    "vue-template-compiler": "^2.7.8",
     "vuetify": "^2.6.1",
     "webpack": "^4.46.0"
   },
@@ -61,6 +61,7 @@
     "@nuxtjs/stylelint-module": "^4.1.0",
     "@nuxtjs/vuetify": "^1.12.3",
     "@unocss/nuxt": "^0.39.0",
+    "@vue/runtime-dom": "^3.2.37",
     "babel-plugin-import": "^1.13.5",
     "eslint": "^8.4.1",
     "eslint-config-prettier": "^8.3.0",

+ 184 - 66
pages/activity/invite-user/index.vue

@@ -1,20 +1,31 @@
 <template>
-  <v-container class="invite-user pa-0" fluid>
+  <v-container class="invite-user pa-0" fluid :class="`bg-${type}`">
     <div class="box box1">
       <div class="box-header">参与步骤</div>
       <div class="box-main">
         <v-img
+          v-if="type === 1"
           class="cybz-content"
           src="~/assets/image/activity/invite-user/cybz-content@2x.png"
         />
+        <v-img
+          v-else-if="type === 2"
+          class="cybz-content"
+          src="~/assets/image/activity/invite-user/cybz-content-2@2x.png"
+        />
         <div class="cybz-content-text">
           <div class="cybz-content-text-item">分享好友</div>
           <div class="cybz-content-text-item">邀请购买云机</div>
-          <div class="cybz-content-text-item">返星币换现金</div>
+          <div class="cybz-content-text-item">
+            <template v-if="type === 1">返星币换现金</template>
+            <template v-else-if="type === 2">返云手机时长</template>
+          </div>
         </div>
         <v-btn class="share-button" rounded @click="share()">
-          <template v-if="$userAgent.isApp">分享好友赚星币</template>
-          <template v-else>复制链接分享好友赚星币</template>
+          <template v-if="!($userAgent.isSzx || $userAgent.isSzxBrowser)"
+            >复制链接</template
+          >分享好友赚<template v-if="type === 1">星币</template
+          ><template v-else-if="type === 2">手机时长</template>
         </v-btn>
         <!-- <button @click="share()">邀请</button> -->
       </div>
@@ -47,6 +58,7 @@
     </div> -->
     <div class="box box4">
       <div class="box-header">活动规则</div>
+      <!-- eslint-disable-next-line vue/no-v-html -->
       <div class="box-main text-sm" v-html="activityRules">
         <!-- <p>1、传播过程中有任何疑问,可直接咨询客服</p>
         <p>
@@ -86,12 +98,22 @@
 // import qs from 'qs';
 // import clipboard from 'clipboardy/browser';
 import * as clipboard from 'clipboard-polyfill/text';
-import { getStarCoinOverview } from '~/api/activity/invite-user.js';
-import { getContentByType } from '~/api/public/agreement.js';
+// import { getStarCoinOverview } from '~/api/activity/invite-user.js';
+// import { getContentByType } from '~/api/public/agreement.js';
 export default {
   // auth: false,
   name: 'InviteUser',
   filters: {},
+  async asyncData({ $axios }) {
+    // 页面初始化前触发
+    const res = await $axios.$get(
+      '/activity/v1/inviteUser/orderRelation/starCoinOverview',
+    );
+    res.data.type = 2;
+    return {
+      data: res.data,
+    };
+  },
   data() {
     return {
       data: {
@@ -107,13 +129,18 @@ export default {
         status: 0,
       },
       activityRules: '',
+      myActivationCode: [],
     };
   },
   async fetch() {
-    //
+    // 页面初始化后触发
     try {
-      this.getActivityRules();
-      this.data = (await getStarCoinOverview(this)).data;
+      // await this.getActiveInfo();
+      this.$native.setShareInfo(this.shareInfo);
+      await Promise.all([
+        this.getActivityRules(),
+        this.type === 2 && this.getMyActivationCode(),
+      ]);
     } catch (error) {
       this.$toast.error(error.message);
     }
@@ -129,40 +156,111 @@ export default {
   },
   computed: {
     dataList() {
-      return [
-        { label: '今日收益(星币)', value: this.data.todayIncomeStarCoin },
-        { label: '总收益(星币)', value: this.data.totalIncomeStarCoin },
-        { label: '今日购买订单数', value: this.data.todayBuyOrderSuccessCount },
-        { label: '累计推广订单', value: this.data.totalBuyOrderCount },
-        {
-          label: '今日购买成功客户',
-          value: this.data.todayBuyOrderSuccessCount,
-        },
-        {
-          label: '累计购买成功客户',
-          value: this.data.totalBuyOrderSuccessCount,
-        },
-        // { label: '可提现星币数量', value: this.data.withdrawStarCoinNum },
-      ];
+      switch (this.type) {
+        case 1: {
+          return [
+            { label: '今日收益(星币)', value: this.data.todayIncomeStarCoin },
+            { label: '总收益(星币)', value: this.data.totalIncomeStarCoin },
+            {
+              label: '今日购买订单数',
+              value: this.data.todayBuyOrderSuccessCount,
+            },
+            { label: '累计推广订单', value: this.data.totalBuyOrderCount },
+            {
+              label: '今日购买成功客户',
+              value: this.data.todayBuyOrderSuccessCount,
+            },
+            {
+              label: '累计购买成功客户',
+              value: this.data.totalBuyOrderSuccessCount,
+            },
+            // { label: '可提现星币数量', value: this.data.withdrawStarCoinNum },
+          ];
+        }
+        case 2: {
+          return [
+            { label: '今日获取的激活码', value: this.data.todayIncomeStarCoin },
+            { label: '总激活码', value: this.data.totalIncomeStarCoin },
+            {
+              label: '今日购买订单数',
+              value: this.data.todayBuyOrderSuccessCount,
+            },
+            { label: '累计推广订单', value: this.data.totalBuyOrderCount },
+            {
+              label: '今日购买成功客户',
+              value: this.data.todayBuyOrderSuccessCount,
+            },
+            {
+              label: '累计购买成功客户',
+              value: this.data.totalBuyOrderSuccessCount,
+            },
+            // { label: '可提现星币数量', value: this.data.withdrawStarCoinNum },
+          ];
+        }
+        default: {
+          return [];
+        }
+      }
+    },
+    type() {
+      return this.data.type;
+    },
+    shareInfo() {
+      if (this.$userAgent.isMiniProgram) {
+        return {
+          title: '双子星APP',
+          path: '/pages/home/home',
+          imgUrl: location.origin + require('~/assets/image/logo.png'),
+        };
+      }
+      const url =
+        location.origin +
+        this.$router.resolve({
+          path: '/activity/invite-user/register',
+          query: {
+            invitationUserName: this.data.inviteUserName,
+            activityId: this.data.activityId,
+            type: this.type,
+          },
+        }).href;
+      return {
+        title: '双子星APP',
+        desc: '分享好友购买云机套餐,返星币换现金',
+        link: url,
+        imgUrl: location.origin + require('~/assets/image/logo.png'),
+      };
     },
   },
   mounted() {
-    this.$userAgent.isMiniProgram &&
-      this.$wx.miniProgram.postMessage({
-        data: {
-          action: 'updateAppMessageShareData',
-          params: {
-            title: '双子星云手机',
-            path: '/pages/home/home',
-            imageUrl:
-              location.origin +
-              require('~/assets/image/activity/invite-user/bg@2x.png'),
-            // promise: null,
-          },
-        },
-      });
+    // this.$userAgent.isMiniProgram &&
+    //   this.$wx.miniProgram.postMessage({
+    //     data: {
+    //       action: 'updateAppMessageShareData',
+    //       params: {
+    //         title: '双子星云手机',
+    //         path: '/pages/home/home',
+    //         imageUrl:
+    //           location.origin +
+    //           require('~/assets/image/activity/invite-user/bg@2x.png'),
+    //         // promise: null,
+    //       },
+    //     },
+    //   });
   },
   methods: {
+    // async getActiveInfo() {
+    //   const res = await this.$axios.$get(
+    //     '/activity/v1/inviteUser/orderRelation/starCoinOverview',
+    //   );
+    //   res.data.type = 2;
+    //   this.data = res.data;
+    // },
+    async getMyActivationCode() {
+      const res = await this.$axios.$get(
+        '/activity/v1/inviteUser/orderRelation/myActivationCode',
+      );
+      this.myActivationCode = res.data;
+    },
     async share() {
       // console.log(this);
       if (this.data.status !== 1) {
@@ -179,40 +277,41 @@ export default {
       }
 
       this.$tongji.trackEvent('活动', '分享', '', 0);
-      const url =
-        location.origin +
-        this.$router.resolve({
-          path: '/activity/invite-user/register',
-          query: {
-            invitationUserName: this.data.inviteUserName,
-            activityId: this.data.activityId,
-          },
-        }).href;
 
-      if (this.$userAgent.isMiniProgram) {
-        // 小程序环境
-        await clipboard.writeText(`${url} 唔即云手机`);
-        this.$toast.success('链接复制成功');
-      } else if (this.$userAgent.isApp) {
+      // if (this.$userAgent.isMiniProgram) {
+      //   // 小程序环境
+      //   await clipboard.writeText(`${this.shareInfo.gotoUrl} 唔即云手机`);
+      //   this.$toast.success('链接复制成功');
+      // } else
+      if (this.$userAgent.isSzx || this.$userAgent.isSzxBrowser) {
         // app环境
-        this.$native.share({
-          title: '双子星APP',
-          content: '分享好友购买云机套餐,返星币换现金',
-          gotoUrl: url,
-          shareImg: 'sdsa.png',
-        });
+        this.$native.share(this.shareInfo);
       } else {
         // 浏览器环境
-        await clipboard.writeText(`${url} 唔即云手机`);
+        await clipboard.writeText(`${this.shareInfo.gotoUrl} 唔即云手机`);
         // throw new Error('1231');
         this.$toast.success('链接复制成功');
       }
     },
     async getActivityRules() {
-      const res = await getContentByType(this, 'iuserrules01');
-      this.activityRules = res.data.content
-        .replace(/[\d\D]*<body>([\d\D]+)<\/body>[\d\D]*/i, '$1')
-        .replace(/<div class="phone-container">([\d\D]+)<\/div>/g, '$1');
+      const agreementCoding = { 1: 'iuserrules01', 2: 'iuserrules02' }[
+        this.type
+      ];
+      if (agreementCoding) {
+        const res = await this.$axios.$get(
+          '/public/v5/agreementApi/content/getContentByType',
+          {
+            params: {
+              agreementCoding,
+              type: 1,
+            },
+          },
+        );
+
+        this.activityRules = res.data.content
+          .replace(/[\d\D]*<body>([\d\D]+)<\/body>[\d\D]*/i, '$1')
+          .replace(/<div class="phone-container">([\d\D]+)<\/div>/g, '$1');
+      }
     },
   },
 };
@@ -221,12 +320,20 @@ export default {
 <style lang="scss" scoped>
 .invite-user {
   color: #333;
-  background-image: url('~/assets/image/activity/invite-user/bg@2x.png');
+  // background-image: url('~/assets/image/activity/invite-user/bg@2x.png');
   background-size: 100% auto;
   // background-position-y: -44px;
   overflow: hidden;
   padding-bottom: 30px;
+
+  &.bg-1 {
+    background-image: url('~/assets/image/activity/invite-user/bg@2x.png');
+  }
+  &.bg-2 {
+    background-image: url('~/assets/image/activity/invite-user/bg-2@2x.png');
+  }
 }
+
 .box {
   width: 373px;
   box-sizing: border-box;
@@ -240,9 +347,11 @@ export default {
   // border-width: 1px;
   border-style: solid;
   position: relative;
+
   + .box {
     margin-top: 30px;
   }
+
   .box-header {
     position: absolute;
     top: -30px;
@@ -253,17 +362,21 @@ export default {
     padding: 0 130px;
     color: #fff;
   }
+
   .box-main {
     padding: 30px 15px 20px;
   }
 }
+
 .box1 {
   margin-top: 275px;
+
   .box-main {
     // padding: 30px 15px 20px;
     padding-left: 0;
     padding-right: 0;
   }
+
   .cybz-content {
     width: 305px;
     height: 75px;
@@ -271,6 +384,7 @@ export default {
     display: block;
     // margin-top: 30px;
   }
+
   .cybz-content-text {
     // display: flex;
     display: grid;
@@ -282,12 +396,14 @@ export default {
     grid-template-columns: 1fr 1fr 1fr;
     font-size: 12px;
     color: #333;
+
     .cybz-content-text-item {
       // width: 0;
       // flex: auto;
       text-align: center;
     }
   }
+
   .share-button {
     display: block;
     margin: auto;
@@ -302,19 +418,23 @@ export default {
     font-weight: bold;
   }
 }
+
 .box2 {
   .label {
     // font-size: 14px;
   }
+
   .value {
     color: #ff6600;
     // font-size: 24px;
   }
+
   .box-main {
     padding-left: 20px;
     padding-right: 20px;
   }
 }
+
 .box4 {
   .box-main {
     // padding-left: 20px;
@@ -322,5 +442,3 @@ export default {
   }
 }
 </style>
-
-

+ 12 - 4
pages/activity/invite-user/register.vue

@@ -1,5 +1,5 @@
 <template>
-  <v-container class="register-for-invite pa-0" fluid>
+  <v-container class="register-for-invite pa-0" fluid :class="`type-${type}`">
     <div class="box box1">
       <div class="box-header">快速注册</div>
       <div class="box-main">
@@ -104,6 +104,11 @@ export default {
   head: {
     title: '注册',
   },
+  computed: {
+    type() {
+      return Number(this.$route.query.type);
+    },
+  },
   watch: {},
   methods: {
     maskPhone(value) {
@@ -153,16 +158,20 @@ export default {
 };
 </script>
 
-
 <style lang="scss" scoped>
 .register-for-invite {
   color: #333;
-  background-image: url('~/assets/image/activity/invite-user/bg@2x.png');
   background-size: 100% auto;
   // background-position-y: -44px;
   overflow: hidden;
   padding-bottom: 30px;
   min-height: 100vh;
+  &.type-1 {
+    background-image: url('~/assets/image/activity/invite-user/bg@2x.png');
+  }
+  &.type-2 {
+    background-image: url('~/assets/image/activity/invite-user/bg-2@2x.png');
+  }
 }
 .box {
   width: 373px;
@@ -216,4 +225,3 @@ export default {
   font-weight: bold !important;
 }
 </style>
-

+ 3 - 1
pages/phone/_id.vue

@@ -6,7 +6,7 @@
 
 <script>
 import qs from 'qs';
-const isNew = false;
+const isNew = true;
 export default {
   name: 'DiskPage',
   middleware: [
@@ -30,6 +30,7 @@ export default {
         sourceType,
         authPhone,
         validTime,
+        id,
       } = res.data;
       const token = $auth.strategy.token.get();
       const url = `${location.origin}${base}${
@@ -44,6 +45,7 @@ export default {
           sourceType,
           authPhone: authPhone ? 'huo' : 'none',
           validTime,
+          record: id,
         },
         {
           addQueryPrefix: true,

+ 59 - 0
pages/test/ios-post-message.vue

@@ -0,0 +1,59 @@
+<template lang="">
+  <div>
+    <div class="">
+      <div class="">window.webkit: {{ hasWebkit }}</div>
+      <div class="">
+        window.webkit.messageHandlers: {{ hasMessageHandlers }}
+      </div>
+      <div class="">
+        window.webkit.messageHandlers.setShareInfo: {{ hasSetShareInfo }}
+      </div>
+      <div class="">
+        window.webkit.messageHandlers.openShare: {{ hasOpenShare }}
+      </div>
+      <div class="">
+        <div class="">messageHandlersKeys {{ messageHandlersKeys.length }}</div>
+        <div v-for="item in messageHandlersKeys" :key="item">
+          {{ item }}
+        </div>
+      </div>
+    </div>
+    <v-btn @click="setShareInfo">setShareInfo</v-btn>
+    <v-btn @click="openShare">openShare</v-btn>
+  </div>
+</template>
+<script>
+export default {
+  auth: false,
+  data() {
+    return {
+      hasWebkit: !!window?.webkit,
+      hasMessageHandlers: !!window?.webkit?.messageHandlers,
+      hasSetShareInfo: !!window?.webkit?.messageHandlers?.setShareInfo,
+      hasOpenShare: !!window?.webkit?.messageHandlers?.openShare,
+      messageHandlersKeys: Object.keys(window?.webkit?.messageHandlers ?? {}),
+    };
+  },
+  fetch() {
+    try {
+      this.setShareInfo();
+    } catch (error) {}
+  },
+  mounted() {
+    // this.
+  },
+  methods: {
+    setShareInfo() {
+      window.webkit.messageHandlers.setShareInfo.postMessage({
+        title: '邀请好友赚星币',
+        gotoUrl: 'http://www.baidu.com',
+        shareImg:
+          'http://gntest.phone.androidscloud.com:1280/cloud/phone/web/static/img/logo.c898a0c6.png',
+      });
+    },
+    openShare() {
+      window.webkit.messageHandlers.openShare.postMessage();
+    },
+  },
+};
+</script>

+ 1 - 1
plugins/axios.js

@@ -8,7 +8,7 @@ export default function ({ $axios, $auth, redirect }) {
     return config;
   });
   $axios.onResponse(async (response) => {
-    console.log("🚀 ~ file: axios.js ~ line 11 ~ $axios.onResponse ~ response", response)
+    // console.log("🚀 ~ file: axios.js ~ line 11 ~ $axios.onResponse ~ response", response)
     if (Object.prototype.toString.call(response.data) === '[object Object]') {
       if ([6013, 6014].includes(response.data.status)) {
         // await $auth.logout();

+ 59 - 18
plugins/native.js

@@ -1,27 +1,68 @@
 export default function ({ $userAgent }, i) {
-  const before = () => {
-    if ($userAgent.isApp) {
-      return;
-    }
-    //  else if ($userAgent.isMiniProgram) {
-    //   throw new Error('小程序环境不支持');
-    // }
-    throw new Error('非App环境');
-  };
+  // const before = () => {
+  //   if ($userAgent.isApp) {
+  //     return;
+  //   }
+  //   //  else if ($userAgent.isMiniProgram) {
+  //   //   throw new Error('小程序环境不支持');
+  //   // }
+  //   throw new Error('非App环境');
+  // };
 
   i('native', {
-    share({ title, content, gotoUrl, shareImg }) {
-      before();
-      if ($userAgent.isIos) {
-        window.webkit.messageHandlers.share.postMessage({
+    share({ title, desc, link, imgUrl }) {
+      // before();
+      if ($userAgent.isSzx) {
+        if ($userAgent.isIos) {
+          window.webkit.messageHandlers.share.postMessage({
+            title,
+            content: desc,
+            gotoUrl: link,
+            shareImg: imgUrl,
+          });
+          return;
+        }
+
+        if ($userAgent.isAndroid) {
+          window.native.share(title, desc, link, imgUrl);
+          return;
+        }
+        return;
+      }
+
+      if ($userAgent.isSzxBrowser) {
+        this.setShareInfo({ title, desc, link, imgUrl });
+        window.webkit.messageHandlers.openShare.postMessage();
+      }
+    },
+    setShareInfo({ title, desc, link, imgUrl, path }) {
+      if ($userAgent.isSzxBrowser) {
+        // before();
+        window.webkit.messageHandlers.setShareInfo.postMessage({
           title,
-          content,
-          gotoUrl,
-          shareImg,
+          // content,
+          gotoUrl: link,
+          shareImg: imgUrl,
+        });
+        return;
+      }
+
+      if ($userAgent.isMiniProgram) {
+        this.$wx.miniProgram.postMessage({
+          data: {
+            action: 'updateAppMessageShareData',
+            params: {
+              title,
+              path,
+              imageUrl: imgUrl,
+            },
+          },
         });
-      } else {
-        window.native.share(title, content, gotoUrl, shareImg);
       }
+      // if ($userAgent.isIos) {
+      // } else {
+      //   window.native.setShareUrl(url);
+      // }
     },
   });
 }

+ 4 - 1
plugins/user-agent.js

@@ -6,7 +6,7 @@ export default function (c, i) {
     get isAndroid() {
       return /Android/i.test(navigator.userAgent);
     },
-    get isApp() {
+    get isSzx() {
       return /Szx/i.test(navigator.userAgent);
     },
     get isMobile() {
@@ -18,5 +18,8 @@ export default function (c, i) {
     get isMiniProgram() {
       return /miniProgram/i.test(navigator.userAgent);
     },
+    get isSzxBrowser() {
+      return /SzxBrowser/i.test(navigator.userAgent);
+    },
   });
 }

+ 181 - 112
pnpm-lock.yaml

@@ -15,6 +15,7 @@ specifiers:
   '@nuxtjs/stylelint-module': ^4.1.0
   '@nuxtjs/vuetify': ^1.12.3
   '@unocss/nuxt': ^0.39.0
+  '@vue/runtime-dom': ^3.2.37
   axios: ^0.27.2
   babel-plugin-import: ^1.13.5
   callapp-lib: ^3.5.2
@@ -49,15 +50,15 @@ specifiers:
   vant: ^2.12.47
   vconsole: ^3.14.6
   vee-validate: ^3.4.14
-  vue: ^2.6.14
+  vue: ^2.7.8
   vue-data-dict: ^1.0.6
-  vue-server-renderer: ^2.6.14
-  vue-template-compiler: ^2.6.14
+  vue-server-renderer: ^2.7.8
+  vue-template-compiler: ^2.7.8
   vuetify: ^2.6.1
   webpack: ^4.46.0
 
 dependencies:
-  '@nuxtjs/auth-next': 5.0.0-1648802546.c9880dc_vue@2.6.14
+  '@nuxtjs/auth-next': 5.0.0-1648802546.c9880dc_vue@2.7.8
   '@nuxtjs/axios': 5.13.6
   axios: 0.27.2
   callapp-lib: 3.5.3
@@ -74,14 +75,14 @@ dependencies:
   numeral: 2.0.6
   nuxt: 2.15.8
   v-mask: 2.3.0
-  vant: 2.12.48_vue@2.6.14
+  vant: 2.12.48_vue@2.7.8
   vconsole: 3.14.6
-  vee-validate: 3.4.14_vue@2.6.14
-  vue: 2.6.14
+  vee-validate: 3.4.14_vue@2.7.8
+  vue: 2.7.8
   vue-data-dict: 1.0.6
-  vue-server-renderer: 2.6.14
-  vue-template-compiler: 2.6.14
-  vuetify: 2.6.6_vue@2.6.14
+  vue-server-renderer: 2.7.8
+  vue-template-compiler: 2.7.8
+  vuetify: 2.6.6_vue@2.7.8
   webpack: 4.46.0
 
 devDependencies:
@@ -95,8 +96,9 @@ devDependencies:
   '@nuxtjs/eslint-module': 3.1.0_hwfcbxmu54a3xufgod34h5broq
   '@nuxtjs/style-resources': 1.2.1
   '@nuxtjs/stylelint-module': 4.1.0_v4nhrkkkkoiqg2hssuj7dgekci
-  '@nuxtjs/vuetify': 1.12.3_uqv3neqxpocdxebttzkuflj7ci
+  '@nuxtjs/vuetify': 1.12.3_7yyaxvfknav26b5ga5gvepslmi
   '@unocss/nuxt': 0.39.3_webpack@4.46.0
+  '@vue/runtime-dom': 3.2.37
   babel-plugin-import: 1.13.5
   eslint: 8.16.0
   eslint-config-prettier: 8.5.0_eslint@8.16.0
@@ -112,7 +114,7 @@ devDependencies:
   stylelint-config-prettier: 9.0.3_stylelint@14.8.5
   stylelint-config-recommended-vue: 1.4.0_nk65nlqk3b7n3hrsok2e5orbsa
   stylelint-config-standard: 24.0.0_stylelint@14.8.5
-  unplugin-vue-components: 0.19.9_vue@2.6.14+webpack@4.46.0
+  unplugin-vue-components: 0.19.9_vue@2.7.8+webpack@4.46.0
 
 packages:
 
@@ -192,7 +194,7 @@ packages:
     resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.18.4
+      '@babel/types': 7.18.10
     dev: false
 
   /@babel/helper-builder-binary-assignment-operator-visitor/7.16.7:
@@ -200,7 +202,7 @@ packages:
     engines: {node: '>=6.9.0'}
     dependencies:
       '@babel/helper-explode-assignable-expression': 7.16.7
-      '@babel/types': 7.18.4
+      '@babel/types': 7.18.10
     dev: false
 
   /@babel/helper-compilation-targets/7.18.2_@babel+core@7.18.2:
@@ -256,7 +258,7 @@ packages:
       '@babel/traverse': 7.18.2
       debug: 4.3.4
       lodash.debounce: 4.0.8
-      resolve: 1.22.0
+      resolve: 1.22.1
       semver: 6.3.0
     transitivePeerDependencies:
       - supports-color
@@ -270,7 +272,7 @@ packages:
     resolution: {integrity: sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.18.4
+      '@babel/types': 7.18.10
     dev: false
 
   /@babel/helper-function-name/7.17.9:
@@ -290,7 +292,7 @@ packages:
     resolution: {integrity: sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.18.4
+      '@babel/types': 7.18.10
     dev: false
 
   /@babel/helper-module-imports/7.16.7:
@@ -318,7 +320,7 @@ packages:
     resolution: {integrity: sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.18.4
+      '@babel/types': 7.18.10
     dev: false
 
   /@babel/helper-plugin-utils/7.17.12:
@@ -332,7 +334,7 @@ packages:
     dependencies:
       '@babel/helper-annotate-as-pure': 7.16.7
       '@babel/helper-wrap-function': 7.16.8
-      '@babel/types': 7.18.4
+      '@babel/types': 7.18.10
     transitivePeerDependencies:
       - supports-color
     dev: false
@@ -345,7 +347,7 @@ packages:
       '@babel/helper-member-expression-to-functions': 7.17.7
       '@babel/helper-optimise-call-expression': 7.16.7
       '@babel/traverse': 7.18.2
-      '@babel/types': 7.18.4
+      '@babel/types': 7.18.10
     transitivePeerDependencies:
       - supports-color
     dev: false
@@ -360,7 +362,7 @@ packages:
     resolution: {integrity: sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.18.4
+      '@babel/types': 7.18.10
     dev: false
 
   /@babel/helper-split-export-declaration/7.16.7:
@@ -369,10 +371,18 @@ packages:
     dependencies:
       '@babel/types': 7.18.4
 
+  /@babel/helper-string-parser/7.18.10:
+    resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==}
+    engines: {node: '>=6.9.0'}
+
   /@babel/helper-validator-identifier/7.16.7:
     resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==}
     engines: {node: '>=6.9.0'}
 
+  /@babel/helper-validator-identifier/7.18.6:
+    resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==}
+    engines: {node: '>=6.9.0'}
+
   /@babel/helper-validator-option/7.16.7:
     resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==}
     engines: {node: '>=6.9.0'}
@@ -384,7 +394,7 @@ packages:
       '@babel/helper-function-name': 7.17.9
       '@babel/template': 7.16.7
       '@babel/traverse': 7.18.2
-      '@babel/types': 7.18.4
+      '@babel/types': 7.18.10
     transitivePeerDependencies:
       - supports-color
     dev: false
@@ -407,6 +417,13 @@ packages:
       chalk: 2.4.2
       js-tokens: 4.0.0
 
+  /@babel/parser/7.18.11:
+    resolution: {integrity: sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+    dependencies:
+      '@babel/types': 7.18.10
+
   /@babel/parser/7.18.4:
     resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==}
     engines: {node: '>=6.0.0'}
@@ -991,7 +1008,7 @@ packages:
       '@babel/helper-hoist-variables': 7.16.7
       '@babel/helper-module-transforms': 7.18.0
       '@babel/helper-plugin-utils': 7.17.12
-      '@babel/helper-validator-identifier': 7.16.7
+      '@babel/helper-validator-identifier': 7.18.6
       babel-plugin-dynamic-import-node: 2.3.3
     transitivePeerDependencies:
       - supports-color
@@ -1250,7 +1267,7 @@ packages:
       '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.18.2
       '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.18.2
       '@babel/preset-modules': 0.1.5_@babel+core@7.18.2
-      '@babel/types': 7.18.4
+      '@babel/types': 7.18.10
       babel-plugin-polyfill-corejs2: 0.3.1_@babel+core@7.18.2
       babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.18.2
       babel-plugin-polyfill-regenerator: 0.3.1_@babel+core@7.18.2
@@ -1269,7 +1286,7 @@ packages:
       '@babel/helper-plugin-utils': 7.17.12
       '@babel/plugin-proposal-unicode-property-regex': 7.17.12_@babel+core@7.18.2
       '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.18.2
-      '@babel/types': 7.18.4
+      '@babel/types': 7.18.10
       esutils: 2.0.3
     dev: false
 
@@ -1309,6 +1326,14 @@ packages:
     transitivePeerDependencies:
       - supports-color
 
+  /@babel/types/7.18.10:
+    resolution: {integrity: sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-string-parser': 7.18.10
+      '@babel/helper-validator-identifier': 7.18.6
+      to-fast-properties: 2.0.0
+
   /@babel/types/7.18.4:
     resolution: {integrity: sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==}
     engines: {node: '>=6.9.0'}
@@ -1865,7 +1890,7 @@ packages:
       scule: 0.2.1
       semver: 7.3.7
       upath: 2.0.1
-      vue-template-compiler: 2.6.14
+      vue-template-compiler: 2.7.8
     dev: false
 
   /@nuxt/config/2.15.8:
@@ -2078,13 +2103,13 @@ packages:
       node-fetch: 2.6.7
       ufo: 0.7.11
       unfetch: 4.2.0
-      vue: 2.6.14
+      vue: 2.7.8
       vue-client-only: 2.1.0
       vue-meta: 2.4.0
       vue-no-ssr: 1.1.1
       vue-router: 3.5.4
-      vue-template-compiler: 2.6.14
-      vuex: 3.6.2_vue@2.6.14
+      vue-template-compiler: 2.7.8
+      vuex: 3.6.2_vue@2.7.8
     transitivePeerDependencies:
       - encoding
     dev: false
@@ -2100,9 +2125,9 @@ packages:
       lodash: 4.17.21
       lru-cache: 5.1.1
       ufo: 0.7.11
-      vue: 2.6.14
+      vue: 2.7.8
       vue-meta: 2.4.0
-      vue-server-renderer: 2.6.14
+      vue-server-renderer: 2.7.8
     dev: false
 
   /@nuxt/webpack/2.15.8:
@@ -2144,9 +2169,9 @@ packages:
       time-fix-plugin: 2.0.7_webpack@4.46.0
       ufo: 0.7.11
       url-loader: 4.1.1_lit45vopotvaqup7lrvlnvtxwy
-      vue-loader: 15.9.8_rqhk6tgffcjxa27soxhh2o2ymu
+      vue-loader: 15.9.8_fbq7qz6my3bnyxl4e33vubcsuq
       vue-style-loader: 4.1.3
-      vue-template-compiler: 2.6.14
+      vue-template-compiler: 2.7.8
       webpack: 4.46.0
       webpack-bundle-analyzer: 4.5.0
       webpack-dev-middleware: 4.3.0_webpack@4.46.0
@@ -2216,7 +2241,7 @@ packages:
       - whiskers
     dev: false
 
-  /@nuxtjs/auth-next/5.0.0-1648802546.c9880dc_vue@2.6.14:
+  /@nuxtjs/auth-next/5.0.0-1648802546.c9880dc_vue@2.7.8:
     resolution: {integrity: sha512-L4IxKQDEP2Z85TZRyz+jNl9lWFjj/AmPWMwKjJLrcGz3Ubh1dGV4aXGfmtqeZmwGSr4vOqSd7MYCYwXTbk1cPA==}
     peerDependencies:
       vue: '*'
@@ -2230,7 +2255,7 @@ packages:
       hasha: 5.2.2
       jwt-decode: 3.1.2
       requrl: 3.0.2
-      vue: 2.6.14
+      vue: 2.7.8
     transitivePeerDependencies:
       - debug
       - supports-color
@@ -2317,14 +2342,14 @@ packages:
       webpack: 4.46.0
     dev: true
 
-  /@nuxtjs/vuetify/1.12.3_uqv3neqxpocdxebttzkuflj7ci:
+  /@nuxtjs/vuetify/1.12.3_7yyaxvfknav26b5ga5gvepslmi:
     resolution: {integrity: sha512-6uVL3cfESMB00eVjJTNkyU4jvuPTGPn1yteo7lQTH6v+fxHcPaOgvzVYHIKSHIz1DecuOiB5c9b+YjsRP5+C8A==}
     dependencies:
       deepmerge: 4.2.2
       sass: 1.32.13
       sass-loader: 10.2.1_4okbfuh23nbhomnbf2m344tfwq
-      vuetify: 2.6.6_vue@2.6.14
-      vuetify-loader: 1.7.3_jyn3ljfz5khtam3igvcs7jnv2i
+      vuetify: 2.6.6_vue@2.7.8
+      vuetify-loader: 1.7.3_ci7txdcnclxj5nvyuorgdjasje
     transitivePeerDependencies:
       - fibers
       - node-sass
@@ -2434,7 +2459,7 @@ packages:
     dependencies:
       '@types/node': 17.0.36
       '@types/source-list-map': 0.1.2
-      source-map: 0.7.3
+      source-map: 0.7.4
     dev: false
 
   /@types/webpack/4.41.32:
@@ -2727,6 +2752,13 @@ packages:
       camelcase: 5.3.1
     dev: false
 
+  /@vue/compiler-sfc/2.7.8:
+    resolution: {integrity: sha512-2DK4YWKfgLnW9VDR9gnju1gcYRk3flKj8UNsms7fsRmFcg35slVTZEkqwBtX+wJBXaamFfn6NxSsZh3h12Ix/Q==}
+    dependencies:
+      '@babel/parser': 7.18.11
+      postcss: 8.4.16
+      source-map: 0.6.1
+
   /@vue/component-compiler-utils/3.3.0_lodash@4.17.21:
     resolution: {integrity: sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==}
     dependencies:
@@ -2739,7 +2771,7 @@ packages:
       source-map: 0.6.1
       vue-template-es2015-compiler: 1.9.1
     optionalDependencies:
-      prettier: 2.6.2
+      prettier: 2.7.1
     transitivePeerDependencies:
       - arc-templates
       - atpl
@@ -2796,6 +2828,31 @@ packages:
       - whiskers
     dev: false
 
+  /@vue/reactivity/3.2.37:
+    resolution: {integrity: sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==}
+    dependencies:
+      '@vue/shared': 3.2.37
+    dev: true
+
+  /@vue/runtime-core/3.2.37:
+    resolution: {integrity: sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==}
+    dependencies:
+      '@vue/reactivity': 3.2.37
+      '@vue/shared': 3.2.37
+    dev: true
+
+  /@vue/runtime-dom/3.2.37:
+    resolution: {integrity: sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==}
+    dependencies:
+      '@vue/runtime-core': 3.2.37
+      '@vue/shared': 3.2.37
+      csstype: 2.6.20
+    dev: true
+
+  /@vue/shared/3.2.37:
+    resolution: {integrity: sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==}
+    dev: true
+
   /@webassemblyjs/ast/1.9.0:
     resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==}
     dependencies:
@@ -3021,11 +3078,6 @@ packages:
     resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
     engines: {node: '>=8'}
 
-  /ansi-styles/2.2.1:
-    resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
-    engines: {node: '>=0.10.0'}
-    dev: false
-
   /ansi-styles/3.2.1:
     resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
     engines: {node: '>=4'}
@@ -3770,17 +3822,6 @@ packages:
     resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
     dev: true
 
-  /chalk/1.1.3:
-    resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      ansi-styles: 2.2.1
-      escape-string-regexp: 1.0.5
-      has-ansi: 2.0.0
-      strip-ansi: 3.0.1
-      supports-color: 2.0.0
-    dev: false
-
   /chalk/2.4.2:
     resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
     engines: {node: '>=4'}
@@ -4659,6 +4700,13 @@ packages:
       css-tree: 1.1.3
     dev: false
 
+  /csstype/2.6.20:
+    resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==}
+    dev: true
+
+  /csstype/3.1.0:
+    resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==}
+
   /cuint/0.2.2:
     resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==}
     dev: false
@@ -5120,7 +5168,7 @@ packages:
     resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==}
     dependencies:
       debug: 3.2.7
-      resolve: 1.22.0
+      resolve: 1.22.1
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -5194,7 +5242,7 @@ packages:
       is-glob: 4.0.3
       minimatch: 3.1.2
       object.values: 1.1.5
-      resolve: 1.22.0
+      resolve: 1.22.1
       tsconfig-paths: 3.14.1
     transitivePeerDependencies:
       - eslint-import-resolver-typescript
@@ -5215,7 +5263,7 @@ packages:
       ignore: 5.2.0
       is-core-module: 2.9.0
       minimatch: 3.1.2
-      resolve: 1.22.0
+      resolve: 1.22.1
       semver: 7.3.7
     dev: true
 
@@ -5230,7 +5278,7 @@ packages:
       eslint-utils: 2.1.0
       ignore: 5.2.0
       minimatch: 3.1.2
-      resolve: 1.22.0
+      resolve: 1.22.1
       semver: 6.3.0
     dev: true
 
@@ -6170,13 +6218,6 @@ packages:
       write-json-file: 2.3.0
     dev: false
 
-  /has-ansi/2.0.0:
-    resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      ansi-regex: 2.1.1
-    dev: false
-
   /has-bigints/1.0.2:
     resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
 
@@ -6680,10 +6721,16 @@ packages:
       rgba-regex: 1.0.0
     dev: false
 
+  /is-core-module/2.10.0:
+    resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==}
+    dependencies:
+      has: 1.0.3
+
   /is-core-module/2.9.0:
     resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==}
     dependencies:
       has: 1.0.3
+    dev: true
 
   /is-data-descriptor/0.1.4:
     resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==}
@@ -7919,7 +7966,7 @@ packages:
     resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
     dependencies:
       hosted-git-info: 2.8.9
-      resolve: 1.22.0
+      resolve: 1.22.1
       semver: 5.7.1
       validate-npm-package-license: 3.0.4
     dev: true
@@ -7929,7 +7976,7 @@ packages:
     engines: {node: '>=10'}
     dependencies:
       hosted-git-info: 4.1.0
-      is-core-module: 2.9.0
+      is-core-module: 2.10.0
       semver: 7.3.7
       validate-npm-package-license: 3.0.4
     dev: true
@@ -8768,7 +8815,7 @@ packages:
       postcss: 7.0.39
       postcss-value-parser: 3.3.1
       read-cache: 1.0.0
-      resolve: 1.22.0
+      resolve: 1.22.1
     dev: false
 
   /postcss-initial/3.0.4:
@@ -9232,6 +9279,14 @@ packages:
       source-map-js: 1.0.2
     dev: true
 
+  /postcss/8.4.16:
+    resolution: {integrity: sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==}
+    engines: {node: ^10 || ^12 || >=14}
+    dependencies:
+      nanoid: 3.3.4
+      picocolors: 1.0.0
+      source-map-js: 1.0.2
+
   /prelude-ls/1.2.1:
     resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
     engines: {node: '>= 0.8.0'}
@@ -9246,6 +9301,14 @@ packages:
     resolution: {integrity: sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==}
     engines: {node: '>=10.13.0'}
     hasBin: true
+    dev: true
+
+  /prettier/2.7.1:
+    resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+    dev: false
+    optional: true
 
   /pretty-bytes/5.6.0:
     resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
@@ -9690,7 +9753,16 @@ packages:
     resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==}
     hasBin: true
     dependencies:
-      is-core-module: 2.9.0
+      is-core-module: 2.10.0
+      path-parse: 1.0.7
+      supports-preserve-symlinks-flag: 1.0.0
+    dev: true
+
+  /resolve/1.22.1:
+    resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
+    hasBin: true
+    dependencies:
+      is-core-module: 2.10.0
       path-parse: 1.0.7
       supports-preserve-symlinks-flag: 1.0.0
 
@@ -9913,12 +9985,6 @@ packages:
       - supports-color
     dev: false
 
-  /serialize-javascript/3.1.0:
-    resolution: {integrity: sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==}
-    dependencies:
-      randombytes: 2.1.0
-    dev: false
-
   /serialize-javascript/4.0.0:
     resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==}
     dependencies:
@@ -9930,6 +9996,12 @@ packages:
       randombytes: 2.1.0
     dev: false
 
+  /serialize-javascript/6.0.0:
+    resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==}
+    dependencies:
+      randombytes: 2.1.0
+    dev: false
+
   /serve-placeholder/1.2.4:
     resolution: {integrity: sha512-jWD9cZXLcr4vHTTL5KEPIUBUYyOWN/z6v/tn0l6XxFhi9iqV3Fc5Y1aFeduUyz+cx8sALzGCUczkPfeOlrq9jg==}
     dependencies:
@@ -10094,7 +10166,6 @@ packages:
   /source-map-js/1.0.2:
     resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
     engines: {node: '>=0.10.0'}
-    dev: true
 
   /source-map-resolve/0.5.3:
     resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==}
@@ -10129,8 +10200,8 @@ packages:
     resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
     engines: {node: '>=0.10.0'}
 
-  /source-map/0.7.3:
-    resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==}
+  /source-map/0.7.4:
+    resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
     engines: {node: '>= 8'}
     dev: false
 
@@ -10523,11 +10594,6 @@ packages:
       - supports-color
     dev: true
 
-  /supports-color/2.0.0:
-    resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
-    engines: {node: '>=0.8.0'}
-    dev: false
-
   /supports-color/5.5.0:
     resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
     engines: {node: '>=4'}
@@ -11102,7 +11168,7 @@ packages:
     engines: {node: '>= 0.8'}
     dev: false
 
-  /unplugin-vue-components/0.19.9_vue@2.6.14+webpack@4.46.0:
+  /unplugin-vue-components/0.19.9_vue@2.7.8+webpack@4.46.0:
     resolution: {integrity: sha512-i5mZtg85euPWZrGswFkoa9pf4WjKCP5qOjnwOyg3KOKVzFjnP3osCdrunQMjtoMKehTdz1vV6baZH8bZR4PNgg==}
     engines: {node: '>=14'}
     peerDependencies:
@@ -11125,7 +11191,7 @@ packages:
       minimatch: 5.1.0
       resolve: 1.22.0
       unplugin: 0.7.2_webpack@4.46.0
-      vue: 2.6.14
+      vue: 2.7.8
     transitivePeerDependencies:
       - esbuild
       - rollup
@@ -11197,7 +11263,7 @@ packages:
     dependencies:
       '@babel/core': 7.18.2
       '@babel/standalone': 7.18.9
-      '@babel/types': 7.18.4
+      '@babel/types': 7.18.10
       scule: 0.2.1
     transitivePeerDependencies:
       - supports-color
@@ -11329,7 +11395,7 @@ packages:
       spdx-expression-parse: 3.0.1
     dev: true
 
-  /vant/2.12.48_vue@2.6.14:
+  /vant/2.12.48_vue@2.7.8:
     resolution: {integrity: sha512-cTv5V8pYboLrryMAThTu9Nrjroc6z246ktvvRbQ6v+G/yUH2tJia4S/L8RaTCH6btiuoeKZbtFAjkeQUPYeOtQ==}
     peerDependencies:
       vue: '>= 2.6.0'
@@ -11338,7 +11404,7 @@ packages:
       '@vant/icons': 1.8.0
       '@vant/popperjs': 1.2.1
       '@vue/babel-helper-vue-jsx-merge-props': 1.2.1
-      vue: 2.6.14
+      vue: 2.7.8
       vue-lazyload: 1.2.3
     dev: false
 
@@ -11356,12 +11422,12 @@ packages:
       mutation-observer: 1.0.3
     dev: false
 
-  /vee-validate/3.4.14_vue@2.6.14:
+  /vee-validate/3.4.14_vue@2.7.8:
     resolution: {integrity: sha512-Hqqic8G9WcRSIzCxiCPqMZv4qB8JE1lIQqIOLDm2K5BXUiL8d4a2+kqkanv8gQSGDzYpnCQZ7BO/T99Aj05T1Q==}
     peerDependencies:
       vue: ^2.5.18
     dependencies:
-      vue: 2.6.14
+      vue: 2.7.8
     dev: false
 
   /vendors/1.0.4:
@@ -11389,7 +11455,7 @@ packages:
     requiresBuild: true
     dependencies:
       merge: 1.2.1
-      vue: 2.6.14
+      vue: 2.7.8
     dev: false
 
   /vue-eslint-parser/8.3.0_eslint@8.16.0:
@@ -11418,7 +11484,7 @@ packages:
     resolution: {integrity: sha512-DC0ZwxanbRhx79tlA3zY5OYJkH8FYp3WBAnAJbrcuoS8eye1P73rcgAZhyxFSPUluJUTelMB+i/+VkNU/qVm7g==}
     dev: false
 
-  /vue-loader/15.9.8_rqhk6tgffcjxa27soxhh2o2ymu:
+  /vue-loader/15.9.8_fbq7qz6my3bnyxl4e33vubcsuq:
     resolution: {integrity: sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==}
     peerDependencies:
       '@vue/compiler-sfc': ^3.0.8
@@ -11441,7 +11507,7 @@ packages:
       loader-utils: 1.4.0
       vue-hot-reload-api: 2.3.4
       vue-style-loader: 4.1.3
-      vue-template-compiler: 2.6.14
+      vue-template-compiler: 2.7.8
       webpack: 4.46.0
     transitivePeerDependencies:
       - arc-templates
@@ -11513,16 +11579,16 @@ packages:
     resolution: {integrity: sha512-x+/DLAJZv2mcQ7glH2oV9ze8uPwcI+H+GgTgTmb5I55bCgY3+vXWIsqbYUzbBSZnwFHEJku4eoaH/x98veyymQ==}
     dev: false
 
-  /vue-server-renderer/2.6.14:
-    resolution: {integrity: sha512-HifYRa/LW7cKywg9gd4ZtvtRuBlstQBao5ZCWlg40fyB4OPoGfEXAzxb0emSLv4pBDOHYx0UjpqvxpiQFEuoLA==}
+  /vue-server-renderer/2.7.8:
+    resolution: {integrity: sha512-d7nf5uRk4BrZLKptAbAcAvmCM4/3VD1xBThjXgLfcAarwta1ngTdXxnVkUHPlYLTUaOFf563EoH2tgxfLY9fcg==}
     dependencies:
-      chalk: 1.1.3
-      hash-sum: 1.0.2
+      chalk: 4.1.2
+      hash-sum: 2.0.0
       he: 1.2.0
       lodash.template: 4.5.0
       lodash.uniq: 4.5.0
-      resolve: 1.22.0
-      serialize-javascript: 3.1.0
+      resolve: 1.22.1
+      serialize-javascript: 6.0.0
       source-map: 0.5.6
     dev: false
 
@@ -11533,8 +11599,8 @@ packages:
       loader-utils: 1.4.0
     dev: false
 
-  /vue-template-compiler/2.6.14:
-    resolution: {integrity: sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==}
+  /vue-template-compiler/2.7.8:
+    resolution: {integrity: sha512-eQqdcUpJKJpBRPDdxCNsqUoT0edNvdt1jFjtVnVS/LPPmr0BU2jWzXlrf6BVMeODtdLewB3j8j3WjNiB+V+giw==}
     dependencies:
       de-indent: 1.0.2
       he: 1.2.0
@@ -11543,10 +11609,13 @@ packages:
     resolution: {integrity: sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==}
     dev: false
 
-  /vue/2.6.14:
-    resolution: {integrity: sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==}
+  /vue/2.7.8:
+    resolution: {integrity: sha512-ncwlZx5qOcn754bCu5/tS/IWPhXHopfit79cx+uIlLMyt3vCMGcXai5yCG5y+I6cDmEj4ukRYyZail9FTQh7lQ==}
+    dependencies:
+      '@vue/compiler-sfc': 2.7.8
+      csstype: 3.1.0
 
-  /vuetify-loader/1.7.3_jyn3ljfz5khtam3igvcs7jnv2i:
+  /vuetify-loader/1.7.3_ci7txdcnclxj5nvyuorgdjasje:
     resolution: {integrity: sha512-1Kt6Rfvuw3i9BBlxC9WTMnU3WEU7IBWQmDX+fYGAVGpzWCX7oHythUIwPCZGShHSYcPMKSDbXTPP8UvT5RNw8Q==}
     peerDependencies:
       vue-template-compiler: ^2.6.10
@@ -11556,24 +11625,24 @@ packages:
       decache: 4.6.1
       file-loader: 6.2.0_webpack@4.46.0
       loader-utils: 2.0.2
-      vue-template-compiler: 2.6.14
-      vuetify: 2.6.6_vue@2.6.14
+      vue-template-compiler: 2.7.8
+      vuetify: 2.6.6_vue@2.7.8
       webpack: 4.46.0
     dev: true
 
-  /vuetify/2.6.6_vue@2.6.14:
+  /vuetify/2.6.6_vue@2.7.8:
     resolution: {integrity: sha512-H4KtxDFmDN8QiTRiGfBySyjMhVaHAJTKB0llGGKZT5jKxtnx9gvEtMWXKtVuRP0NJJP0H6xBPJHNOH7nT18qiQ==}
     peerDependencies:
       vue: ^2.6.4
     dependencies:
-      vue: 2.6.14
+      vue: 2.7.8
 
-  /vuex/3.6.2_vue@2.6.14:
+  /vuex/3.6.2_vue@2.7.8:
     resolution: {integrity: sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==}
     peerDependencies:
       vue: ^2.0.0
     dependencies:
-      vue: 2.6.14
+      vue: 2.7.8
     dev: false
 
   /watchpack-chokidar2/2.0.1: