Browse Source

feat: 前端所有页面

xiansin 2 năm trước cách đây
mục cha
commit
98a44e2f4d
40 tập tin đã thay đổi với 3145 bổ sung241 xóa
  1. 2 1
      mini/api/index.js
  2. 35 0
      mini/api/user/index.js
  3. 129 0
      mini/components/Episode/index.vue
  4. 132 0
      mini/components/Recharge/index.vue
  5. 95 0
      mini/components/SwiperBox/index.vue
  6. 0 114
      mini/components/UserIdentityBtn/IdentityType.vue
  7. 0 74
      mini/components/UserIdentityBtn/index.vue
  8. 1295 1
      mini/package-lock.json
  9. 65 2
      mini/pages.json
  10. 73 0
      mini/pages/index/components/EpisodeBox.vue
  11. 88 8
      mini/pages/index/index.vue
  12. 42 0
      mini/pages/member/free.vue
  13. 149 0
      mini/pages/member/index.vue
  14. 140 0
      mini/pages/my/consume.vue
  15. 102 0
      mini/pages/my/history.vue
  16. 210 9
      mini/pages/my/index.vue
  17. 36 0
      mini/pages/my/protocol.vue
  18. 128 0
      mini/pages/my/recharge.vue
  19. 155 0
      mini/pages/sign/index.vue
  20. 100 0
      mini/pages/trace/collect.vue
  21. 130 10
      mini/pages/trace/index.vue
  22. 18 0
      mini/pages/trace/trace.vue
  23. 3 3
      mini/setting.js
  24. 3 7
      mini/static/css/common.scss
  25. 6 7
      mini/static/css/variable.scss
  26. BIN
      mini/static/image/default-head-img.png
  27. BIN
      mini/static/image/default-movie.png
  28. BIN
      mini/static/image/gold-bag.png
  29. BIN
      mini/static/image/gold.png
  30. BIN
      mini/static/image/member-line-bg.png
  31. BIN
      mini/static/image/member-selected-bg.png
  32. BIN
      mini/static/image/my-page/contact.png
  33. BIN
      mini/static/image/my-page/order.png
  34. BIN
      mini/static/image/my-page/protocol.png
  35. BIN
      mini/static/image/my-page/recharge.png
  36. BIN
      mini/static/image/my-page/share.png
  37. BIN
      mini/static/image/my-recharge-bg.png
  38. 9 5
      mini/utils/mixin.js
  39. BIN
      server/public/static/image/sign/bg.png
  40. BIN
      server/public/static/image/sign/icon.png

+ 2 - 1
mini/api/index.js

xqd
@@ -1,5 +1,6 @@
+import user from './user/index'
 const api = {
-
+  user
 }
 
 export default api

+ 35 - 0
mini/api/user/index.js

xqd
@@ -0,0 +1,35 @@
+/**
+ * Created by JianJia.Zhou<jianjia.zhou> on 2022/8/14.
+ */
+import { getToken } from '../../utils/auth'
+const request = uni.$u.http
+
+export async function login() {
+  return new Promise(resolve => {
+    uni.showLoading({
+      title: '数据加载中...',
+      mask: true
+    })
+    uni.login({
+      provider: uni.$u.platform,
+      success: loginRes => {
+        uni.hideLoading()
+        return request.post(
+          '/passport/login',
+          { code: loginRes.code }
+        ).then(res => {
+          resolve(res)
+        })
+      }
+    })
+  })
+}
+
+export function isLogin() {
+  return !!getToken()
+}
+
+export default {
+  login,
+  isLogin
+}

+ 129 - 0
mini/components/Episode/index.vue

xqd
@@ -0,0 +1,129 @@
+<template>
+  <view class="episode" :style="[customStyle]">
+    <view class="cover-image" :style="[imageStyle]">
+      <view v-if="rank" class="rank" :class="{first: rank === 1}">
+        <text>1</text>
+      </view>
+      <image src="@/static/image/default-movie.png" mode="aspectFill" :style="[imageStyle]" />
+      <view v-if="recent" class="special">最近播放 </view>
+      <view v-if="guess" class="special guess">猜你喜欢 </view>
+    </view>
+    <u-text
+      :text="episode.name"
+      :lines="1"
+      size="32rpx"
+      margin="20rpx 0 10rpx"
+      :color="$colors.defaultColor"
+    />
+    <view class="status-box dir-left-nowrap">
+      <u-text
+        :text="episode.status"
+        :lines="1"
+        size="24rpx"
+        :custom-style="{flex: 'unset'}"
+        :color="$colors.primaryColor"
+      />
+      <u-text
+        :text="`共${episode.total}集`"
+        :lines="1"
+        size="24rpx"
+        :color="$colors.infoColor"
+      />
+    </view>
+  </view></template>
+
+<script>
+import UText from '../../uni_modules/uview-ui/components/u--text/u--text'
+export default {
+  name: 'Episode',
+  components: { UText },
+  props: {
+    episode: {
+      type: Object,
+      required: true
+    },
+    customStyle: {
+      type: Object,
+      default() {
+        return {}
+      }
+    },
+    imageStyle: {
+      type: Object,
+      default() {
+        return {}
+      }
+    },
+    recent: {
+      type: Boolean,
+      default: false
+    },
+    guess: {
+      type: Boolean,
+      default: false
+    },
+    rank: {
+      type: Number,
+      default: 0
+    }
+  },
+  data() {
+    return {}
+  },
+  computed: {},
+  methods: {}
+}
+</script>
+
+<style lang="scss" scoped>
+    .episode {
+      width: calc((#{750rpx} - #{80rpx}) / 3);
+      margin-bottom: 30rpx;
+      .cover-image{
+        position: relative;
+        overflow: hidden;
+        height: 330rpx;
+        image{
+          width: 100%;
+          height: inherit;
+        }
+        .special{
+          background: rgba(48, 98, 97, 0.65);
+          text-align: center;
+          color: #fff;
+          padding: 10rpx 0;
+          position: absolute;
+          bottom: 0;
+          width: 100%;
+          font-size: 26rpx;
+          &.guess{
+            background: rgba(124, 78, 112, 0.65);
+          }
+        }
+        .rank{
+          position: absolute;
+          top: -35rpx;
+          left: -35rpx;
+          width: 70rpx;
+          height: 70rpx;
+          transform: rotate(45deg);
+          background: rgba(254, 53, 82, 0.78);
+          color: #fff;
+          font-size: 26rpx;
+          z-index: 99;
+          &.first{
+            background: #FE3552;
+          }
+          text{
+            position: absolute;
+            right: 5px;
+            top: 10px;
+            transform: rotate(-45deg);
+          }
+        }
+      }
+      .status-box{
+
+      }
+    }
+</style>

+ 132 - 0
mini/components/Recharge/index.vue

xqd
@@ -0,0 +1,132 @@
+<template>
+  <view class="recharge">
+    <u-popup
+      :show="show"
+      :mode="mode"
+      round="20rpx"
+      @close="close"
+    >
+      <view class="container">
+        <view class="static-text">充值金币</view>
+        <view class="overage">账户余额:<text>3金币</text></view>
+
+        <view class="recharge-group dir-left-wrap">
+          <view
+            v-for="(item,index) in recharge"
+            :key="index"
+            class="recharge-item dir-top-wrap main-center cross-center"
+            :class="{active: rechargeActive === index}"
+            @click="rechargeActive = index"
+          >
+            <text class="price">49.99元</text>
+            <text class="gold">500+300金币</text>
+            <text class="gift">多送350金币</text>
+          </view>
+        </view>
+
+        <view class="btn">充值</view>
+      </view>
+    </u-popup>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'Recharge',
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    },
+    mode: {
+      type: String,
+      default: 'center'
+    }
+  },
+  data() {
+    return {
+      modal: {
+        show: false
+      },
+      recharge: [1, 2, 3, 4],
+      rechargeActive: 1
+    }
+  },
+  computed: {},
+  watch: {
+    show(val) {
+      this.modal.show = val
+    }
+  },
+  methods: {
+    close() {
+      this.$emit('update:show', false)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+    .recharge {
+      font-size: 28rpx;
+      .container{
+        width: 700rpx;
+        border: 2rpx solid;
+        padding: 30rpx 40rpx;
+        .static-text{
+          font-size: 38rpx;
+          font-weight: 600;
+          margin-bottom: 40rpx;
+        }
+        .overage{
+          color: $info-color;
+          text{
+            color: #FB3651 ;
+          }
+        }
+        .recharge-group{
+          margin-top: 30rpx;
+          .recharge-item{
+            border: 4rpx solid $primary-color;
+            width: calc(#{600rpx} / 2);
+            margin-right: 20rpx;
+            margin-bottom: 20rpx;
+            border-radius: 10rpx;
+            padding: 40rpx 20rpx;
+            transition: .3s;
+            &:nth-child(2n){
+              margin-right: 0;
+            }
+            &.active{
+              background: #1b1e32;
+              border: 4rpx solid #1b1e32;
+              .price{
+                color: $default-color;
+              }
+            }
+            .price{
+              margin-bottom: 40rpx;
+              font-size: 38rpx;
+            }
+            .gold{
+              color: $primary-color;
+              margin-bottom: 10rpx;
+            }
+            .gift{
+              color: $info-color;
+            }
+          }
+        }
+        .btn{
+          background: linear-gradient(270deg, #6EEBE8 0%, #FF74B9 100%);
+          width: 90%;
+          margin: 40rpx auto;
+          padding: 20rpx 0;
+          text-align: center;
+          border-radius: 40rpx;
+          color: $default-color;
+          letter-spacing: .1rem;
+        }
+      }
+    }
+</style>

+ 95 - 0
mini/components/SwiperBox/index.vue

xqd
@@ -0,0 +1,95 @@
+<template>
+  <view class="swiper-box" :style="{height: height}">
+    <u-swiper
+      :list="list"
+      :height="height"
+      :radius="radius"
+      style="width: 100%"
+      :indicator="true"
+      :show-title="true"
+      indicator-mode="dot"
+      :indicator-style="{bottom: '24rpx'}"
+      @click="handleClick"
+      @change="handleChange"
+    >
+      <view
+        slot="indicator"
+        class="indicator"
+      >
+        <view
+          v-for="(item, index) in list"
+          :key="index"
+          class="indicator__dot"
+          :class="[index === currentNum && 'indicator__dot--active']"
+        />
+      </view>
+    </u-swiper>
+  </view>
+</template>
+
+<script>
+
+export default {
+  name: 'SwiperBox',
+  props: {
+    height: {
+      type: [Number, String],
+      default: '330rpx'
+    },
+    radius: {
+      type: [Number, String],
+      default: '10rpx'
+    }
+  },
+  data() {
+    return {
+      list: [
+        'https://cdn.uviewui.com/uview/swiper/swiper1.png',
+        'https://cdn.uviewui.com/uview/swiper/swiper2.png',
+        'https://cdn.uviewui.com/uview/swiper/swiper3.png'
+      ],
+      currentNum: 0
+    }
+  },
+  computed: {
+  },
+  created() {
+    this.getSwiper()
+  },
+  methods: {
+    handleClick(index) {
+      const item = this.list[index]
+      console.log('-->data', item)
+    },
+    handleChange(e) {
+      this.currentNum = e.current
+    },
+    getSwiper() {
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .swiper-box{
+    margin: 20rpx 0;
+    .indicator {
+      display: flex;
+      flex-direction: row;
+      justify-content: center;
+
+      &__dot {
+        height: 20rpx;
+        width: 20rpx;
+        border-radius: 50%;
+        background-color: rgba(255, 255, 255, 0.35);
+        margin: 0 10px;
+        transition: background-color 0.3s;
+
+        &--active {
+          background-color: #6EEBE8;
+        }
+      }
+    }
+  }
+</style>

+ 0 - 114
mini/components/UserIdentityBtn/IdentityType.vue

xqd
@@ -1,114 +0,0 @@
-<template>
-  <view
-    class="identity-type dir-left-nowrap"
-    :class="{
-      vip: isVip,
-      normal: isNormal
-    }"
-  >
-    <view class="static-text main-center cross-center">会员身份</view>
-    <view class="identity-box dir-left-nowrap">
-      <view class="user-type main-center cross-center">{{ isVip?'福卡会员':'普通用户' }}</view>
-      <view class="discount main-center cross-center">
-        {{ isVip?'享受福卡特权':'享受普通优惠' }}
-        <u-text :text="price" mode="price" color="#ffffff" />
-      </view>
-    </view>
-    <view class="checked main-center cross-center">
-      <i v-if="checked" class="iconfont icon-checked" />
-    </view>
-  </view>
-</template>
-
-<script>
-export default {
-  name: 'IdentityType',
-  props: {
-    price: {
-      type: Number,
-      default: 0
-    },
-    isVip: {
-      type: Boolean,
-      default: false
-    },
-    isNormal: {
-      type: Boolean,
-      default: false
-    },
-    checked: {
-      type: Boolean,
-      default: false
-    }
-  },
-  data() {
-    return {}
-  },
-  computed: {
-  },
-  methods: {}
-}
-</script>
-
-<style lang="scss" scoped>
-  @import '@/static/css/mixin.scss';
-  $vipHeight: 60;
-  $height: $vipHeight + 8;
-  .identity-type{
-    margin: 10rpx 0;
-    color: #fff;
-    font-size: 28rpx;
-    .static-text{
-      height: #{$height}rpx;
-      flex-shrink: 0;
-      width: 150rpx;
-      background-color: #888D93;
-    }
-    .identity-box{
-      background: linear-gradient(#A6ADBF, #7E8796);
-      flex: 1;
-      .user-type{
-        height: #{$height}rpx;
-        width: 180rpx;
-
-      }
-      .discount{
-        flex: 1;
-        height: #{$height}rpx;
-      }
-    }
-    .checked{
-      height: #{$height}rpx;
-      width: 100rpx;
-      .iconfont{
-        font-size: 46rpx;
-        color: $text-grey-color;
-      }
-    }
-    &.vip,
-    &.normal{
-      .static-text{
-        background-color: #F9D2B5;
-        color: #3D434F;
-      }
-    }
-    &.vip{
-      .identity-box {
-        @include vipBorder;
-
-        .user-type {
-          height: #{$vipHeight}rpx;
-        }
-
-        .discount {
-          height: #{$vipHeight}rpx;
-        }
-      }
-    }
-    &.normal{
-      .identity-box{
-        @include background;
-      }
-    }
-  }
-</style>

+ 0 - 74
mini/components/UserIdentityBtn/index.vue

xqd
@@ -1,74 +0,0 @@
-<template>
-  <view
-    class="user-identity-btn"
-  >
-    <template v-if="isVip">
-      <!--会员-->
-      <identity-type :price="vipPrice" :is-vip="true" :checked="true" />
-      <!--普通用户-->
-      <identity-type :price="normalPrice" />
-    </template>
-    <template v-else>
-      <!--普通用户-->
-      <identity-type :price="normalPrice" :is-normal="true" :checked="true" />
-      <!--会员-->
-      <identity-type :price="vipPrice" />
-      <view class="open-card" @click="handleOpen">
-        开通福卡会员,立享福卡特权
-      </view>
-    </template>
-  </view>
-</template>
-
-<script>/**
- * 购买弹窗  显示会员身份
- */
-
-import { mapState } from 'vuex'
-import IdentityType from './IdentityType'
-
-export default {
-  name: 'UserIdentityBtn',
-  components: { IdentityType },
-  props: {
-    vipPrice: {
-      type: Number,
-      default: 0
-    },
-    normalPrice: {
-      type: Number,
-      default: 0
-    }
-  },
-  data() {
-    return {
-
-    }
-  },
-  computed: {
-    ...mapState({
-      userInfo: state => state.user.info
-    }),
-    isVip() {
-      return this.userInfo.is_vip
-    }
-  },
-  methods: {
-    handleOpen() {
-      uni.navigateTo({
-        url: '/pages/index/index'
-      })
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-    .user-identity-btn {
-      .open-card{
-        text-align: center;
-        text-decoration: underline;
-        margin: 20rpx 0;
-      }
-    }
-</style>

+ 1295 - 1
mini/package-lock.json

xqd
@@ -1,6 +1,1300 @@
 {
+  "name": "mini",
+  "lockfileVersion": 2,
   "requires": true,
-  "lockfileVersion": 1,
+  "packages": {
+    "": {
+      "devDependencies": {
+        "babel-eslint": "10.1.0",
+        "eslint": "6.7.2",
+        "eslint-plugin-vue": "6.2.2"
+      }
+    },
+    "node_modules/@babel/code-frame": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.16.7.tgz",
+      "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/highlight": "^7.16.7"
+      }
+    },
+    "node_modules/@babel/generator": {
+      "version": "7.17.7",
+      "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.17.7.tgz",
+      "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==",
+      "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.17.0",
+        "jsesc": "^2.5.1",
+        "source-map": "^0.5.0"
+      }
+    },
+    "node_modules/@babel/helper-environment-visitor": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
+      "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
+      "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.16.7"
+      }
+    },
+    "node_modules/@babel/helper-function-name": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
+      "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-get-function-arity": "^7.16.7",
+        "@babel/template": "^7.16.7",
+        "@babel/types": "^7.16.7"
+      }
+    },
+    "node_modules/@babel/helper-get-function-arity": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
+      "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.16.7"
+      }
+    },
+    "node_modules/@babel/helper-hoist-variables": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
+      "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.16.7"
+      }
+    },
+    "node_modules/@babel/helper-split-export-declaration": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
+      "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.16.7"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
+      "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
+      "dev": true
+    },
+    "node_modules/@babel/highlight": {
+      "version": "7.16.10",
+      "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.16.10.tgz",
+      "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.16.7",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.17.8",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.17.8.tgz",
+      "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==",
+      "dev": true
+    },
+    "node_modules/@babel/template": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.16.7.tgz",
+      "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.16.7",
+        "@babel/parser": "^7.16.7",
+        "@babel/types": "^7.16.7"
+      }
+    },
+    "node_modules/@babel/traverse": {
+      "version": "7.17.3",
+      "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.17.3.tgz",
+      "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.16.7",
+        "@babel/generator": "^7.17.3",
+        "@babel/helper-environment-visitor": "^7.16.7",
+        "@babel/helper-function-name": "^7.16.7",
+        "@babel/helper-hoist-variables": "^7.16.7",
+        "@babel/helper-split-export-declaration": "^7.16.7",
+        "@babel/parser": "^7.17.3",
+        "@babel/types": "^7.17.0",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0"
+      }
+    },
+    "node_modules/@babel/traverse/node_modules/globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "dev": true
+    },
+    "node_modules/@babel/types": {
+      "version": "7.17.0",
+      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.17.0.tgz",
+      "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.16.7",
+        "to-fast-properties": "^2.0.0"
+      }
+    },
+    "node_modules/acorn": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz",
+      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+      "dev": true
+    },
+    "node_modules/acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "node_modules/ansi-escapes": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+      "dev": true,
+      "dependencies": {
+        "type-fest": "^0.21.3"
+      }
+    },
+    "node_modules/ansi-escapes/node_modules/type-fest": {
+      "version": "0.21.3",
+      "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz",
+      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+      "dev": true
+    },
+    "node_modules/ansi-regex": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz",
+      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+      "dev": true
+    },
+    "node_modules/ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "node_modules/argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "dependencies": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "node_modules/astral-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-1.0.0.tgz",
+      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+      "dev": true
+    },
+    "node_modules/babel-eslint": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmmirror.com/babel-eslint/-/babel-eslint-10.1.0.tgz",
+      "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.0.0",
+        "@babel/parser": "^7.7.0",
+        "@babel/traverse": "^7.7.0",
+        "@babel/types": "^7.7.0",
+        "eslint-visitor-keys": "^1.0.0",
+        "resolve": "^1.12.0"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true
+    },
+    "node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      }
+    },
+    "node_modules/chardet": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz",
+      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+      "dev": true
+    },
+    "node_modules/cli-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+      "dev": true,
+      "dependencies": {
+        "restore-cursor": "^3.1.0"
+      }
+    },
+    "node_modules/cli-width": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz",
+      "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+      "dev": true
+    },
+    "node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+      "dev": true
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true
+    },
+    "node_modules/cross-spawn": {
+      "version": "6.0.5",
+      "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz",
+      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+      "dev": true,
+      "dependencies": {
+        "nice-try": "^1.0.4",
+        "path-key": "^2.0.1",
+        "semver": "^5.5.0",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      }
+    },
+    "node_modules/cross-spawn/node_modules/semver": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+      "dev": true
+    },
+    "node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      }
+    },
+    "node_modules/deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true
+    },
+    "node_modules/doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "dependencies": {
+        "esutils": "^2.0.2"
+      }
+    },
+    "node_modules/emoji-regex": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-7.0.3.tgz",
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+      "dev": true
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "dev": true
+    },
+    "node_modules/eslint": {
+      "version": "6.7.2",
+      "resolved": "https://registry.npmmirror.com/eslint/-/eslint-6.7.2.tgz",
+      "integrity": "sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.0.0",
+        "ajv": "^6.10.0",
+        "chalk": "^2.1.0",
+        "cross-spawn": "^6.0.5",
+        "debug": "^4.0.1",
+        "doctrine": "^3.0.0",
+        "eslint-scope": "^5.0.0",
+        "eslint-utils": "^1.4.3",
+        "eslint-visitor-keys": "^1.1.0",
+        "espree": "^6.1.2",
+        "esquery": "^1.0.1",
+        "esutils": "^2.0.2",
+        "file-entry-cache": "^5.0.1",
+        "functional-red-black-tree": "^1.0.1",
+        "glob-parent": "^5.0.0",
+        "globals": "^12.1.0",
+        "ignore": "^4.0.6",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "inquirer": "^7.0.0",
+        "is-glob": "^4.0.0",
+        "js-yaml": "^3.13.1",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.3.0",
+        "lodash": "^4.17.14",
+        "minimatch": "^3.0.4",
+        "mkdirp": "^0.5.1",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.8.3",
+        "progress": "^2.0.0",
+        "regexpp": "^2.0.1",
+        "semver": "^6.1.2",
+        "strip-ansi": "^5.2.0",
+        "strip-json-comments": "^3.0.1",
+        "table": "^5.2.3",
+        "text-table": "^0.2.0",
+        "v8-compile-cache": "^2.0.3"
+      }
+    },
+    "node_modules/eslint-plugin-vue": {
+      "version": "6.2.2",
+      "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz",
+      "integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==",
+      "dev": true,
+      "dependencies": {
+        "natural-compare": "^1.4.0",
+        "semver": "^5.6.0",
+        "vue-eslint-parser": "^7.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-vue/node_modules/semver": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+      "dev": true
+    },
+    "node_modules/eslint-scope": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "dev": true,
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "node_modules/eslint-scope/node_modules/estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "dev": true
+    },
+    "node_modules/eslint-visitor-keys": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+      "dev": true
+    },
+    "node_modules/eslint/node_modules/eslint-utils": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-1.4.3.tgz",
+      "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
+      "dev": true,
+      "dependencies": {
+        "eslint-visitor-keys": "^1.1.0"
+      }
+    },
+    "node_modules/espree": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmmirror.com/espree/-/espree-6.2.1.tgz",
+      "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
+      "dev": true,
+      "dependencies": {
+        "acorn": "^7.1.1",
+        "acorn-jsx": "^5.2.0",
+        "eslint-visitor-keys": "^1.1.0"
+      }
+    },
+    "node_modules/esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true
+    },
+    "node_modules/esquery": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.4.0.tgz",
+      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+      "dev": true,
+      "dependencies": {
+        "estraverse": "^5.1.0"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "dev": true
+    },
+    "node_modules/esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true
+    },
+    "node_modules/external-editor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz",
+      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+      "dev": true,
+      "dependencies": {
+        "chardet": "^0.7.0",
+        "iconv-lite": "^0.4.24",
+        "tmp": "^0.0.33"
+      }
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
+    },
+    "node_modules/fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+      "dev": true
+    },
+    "node_modules/figures": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz",
+      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+      "dev": true,
+      "dependencies": {
+        "escape-string-regexp": "^1.0.5"
+      }
+    },
+    "node_modules/file-entry-cache": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+      "dev": true,
+      "dependencies": {
+        "flat-cache": "^2.0.1"
+      }
+    },
+    "node_modules/flat-cache": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-2.0.1.tgz",
+      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+      "dev": true,
+      "dependencies": {
+        "flatted": "^2.0.0",
+        "rimraf": "2.6.3",
+        "write": "1.0.3"
+      }
+    },
+    "node_modules/flatted": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/flatted/-/flatted-2.0.2.tgz",
+      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+      "dev": true
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+      "dev": true
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "node_modules/functional-red-black-tree": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
+      "dev": true
+    },
+    "node_modules/glob": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz",
+      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+      "dev": true,
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      }
+    },
+    "node_modules/globals": {
+      "version": "12.4.0",
+      "resolved": "https://registry.npmmirror.com/globals/-/globals-12.4.0.tgz",
+      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+      "dev": true,
+      "dependencies": {
+        "type-fest": "^0.8.1"
+      }
+    },
+    "node_modules/has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "dependencies": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "dev": true
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dev": true,
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
+    },
+    "node_modules/ignore": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmmirror.com/ignore/-/ignore-4.0.6.tgz",
+      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+      "dev": true
+    },
+    "node_modules/import-fresh": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "dev": true,
+      "dependencies": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      }
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "dev": true
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "dev": true,
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "node_modules/inquirer": {
+      "version": "7.3.3",
+      "resolved": "https://registry.npmmirror.com/inquirer/-/inquirer-7.3.3.tgz",
+      "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-width": "^3.0.0",
+        "external-editor": "^3.0.3",
+        "figures": "^3.0.0",
+        "lodash": "^4.17.19",
+        "mute-stream": "0.0.8",
+        "run-async": "^2.4.0",
+        "rxjs": "^6.6.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "through": "^2.3.6"
+      }
+    },
+    "node_modules/inquirer/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true
+    },
+    "node_modules/inquirer/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      }
+    },
+    "node_modules/inquirer/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      }
+    },
+    "node_modules/inquirer/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      }
+    },
+    "node_modules/inquirer/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
+    },
+    "node_modules/inquirer/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true
+    },
+    "node_modules/inquirer/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      }
+    },
+    "node_modules/inquirer/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.8.1.tgz",
+      "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
+      "dev": true,
+      "dependencies": {
+        "has": "^1.0.3"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true
+    },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+      "dev": true
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "dev": true
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true
+    },
+    "node_modules/js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+      "dev": true,
+      "dependencies": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      }
+    },
+    "node_modules/jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "dev": true
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "node_modules/json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true
+    },
+    "node_modules/levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+      "dev": true,
+      "dependencies": {
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2"
+      }
+    },
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+      "dev": true
+    },
+    "node_modules/mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "dev": true
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "dev": true
+    },
+    "node_modules/mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+      "dev": true,
+      "dependencies": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "node_modules/mute-stream": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.8.tgz",
+      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+      "dev": true
+    },
+    "node_modules/natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true
+    },
+    "node_modules/nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "dev": true
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dev": true,
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "dev": true,
+      "dependencies": {
+        "mimic-fn": "^2.1.0"
+      }
+    },
+    "node_modules/optionator": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz",
+      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+      "dev": true,
+      "dependencies": {
+        "deep-is": "~0.1.3",
+        "fast-levenshtein": "~2.0.6",
+        "levn": "~0.3.0",
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2",
+        "word-wrap": "~1.2.3"
+      }
+    },
+    "node_modules/os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+      "dev": true
+    },
+    "node_modules/parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "dependencies": {
+        "callsites": "^3.0.0"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "dev": true
+    },
+    "node_modules/path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+      "dev": true
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
+    },
+    "node_modules/prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+      "dev": true
+    },
+    "node_modules/progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+      "dev": true
+    },
+    "node_modules/punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "dev": true
+    },
+    "node_modules/regexpp": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/regexpp/-/regexpp-2.0.1.tgz",
+      "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
+      "dev": true
+    },
+    "node_modules/resolve": {
+      "version": "1.22.0",
+      "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.0.tgz",
+      "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+      "dev": true,
+      "dependencies": {
+        "is-core-module": "^2.8.1",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true
+    },
+    "node_modules/restore-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz",
+      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+      "dev": true,
+      "dependencies": {
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
+      }
+    },
+    "node_modules/rimraf": {
+      "version": "2.6.3",
+      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.6.3.tgz",
+      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+      "dev": true,
+      "dependencies": {
+        "glob": "^7.1.3"
+      }
+    },
+    "node_modules/run-async": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmmirror.com/run-async/-/run-async-2.4.1.tgz",
+      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+      "dev": true
+    },
+    "node_modules/rxjs": {
+      "version": "6.6.7",
+      "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-6.6.7.tgz",
+      "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+      "dev": true,
+      "dependencies": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
+    },
+    "node_modules/semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "dev": true
+    },
+    "node_modules/shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+      "dev": true,
+      "dependencies": {
+        "shebang-regex": "^1.0.0"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+      "dev": true
+    },
+    "node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+      "dev": true
+    },
+    "node_modules/slice-ansi": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-2.1.0.tgz",
+      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^3.2.0",
+        "astral-regex": "^1.0.0",
+        "is-fullwidth-code-point": "^2.0.0"
+      }
+    },
+    "node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+      "dev": true
+    },
+    "node_modules/sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+      "dev": true
+    },
+    "node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      }
+    },
+    "node_modules/string-width/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true
+    },
+    "node_modules/string-width/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true
+    },
+    "node_modules/string-width/node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true
+    },
+    "node_modules/string-width/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
+      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^4.1.0"
+      }
+    },
+    "node_modules/strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true
+    },
+    "node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true
+    },
+    "node_modules/table": {
+      "version": "5.4.6",
+      "resolved": "https://registry.npmmirror.com/table/-/table-5.4.6.tgz",
+      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+      "dev": true,
+      "dependencies": {
+        "ajv": "^6.10.2",
+        "lodash": "^4.17.14",
+        "slice-ansi": "^2.1.0",
+        "string-width": "^3.0.0"
+      }
+    },
+    "node_modules/table/node_modules/string-width": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/string-width/-/string-width-3.1.0.tgz",
+      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+      "dev": true,
+      "dependencies": {
+        "emoji-regex": "^7.0.1",
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^5.1.0"
+      }
+    },
+    "node_modules/text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+      "dev": true
+    },
+    "node_modules/through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz",
+      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+      "dev": true
+    },
+    "node_modules/tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "dev": true,
+      "dependencies": {
+        "os-tmpdir": "~1.0.2"
+      }
+    },
+    "node_modules/to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+      "dev": true
+    },
+    "node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+      "dev": true
+    },
+    "node_modules/type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+      "dev": true,
+      "dependencies": {
+        "prelude-ls": "~1.1.2"
+      }
+    },
+    "node_modules/type-fest": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.8.1.tgz",
+      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+      "dev": true
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/v8-compile-cache": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+      "dev": true
+    },
+    "node_modules/vue-eslint-parser": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz",
+      "integrity": "sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==",
+      "dev": true,
+      "dependencies": {
+        "debug": "^4.1.1",
+        "eslint-scope": "^5.1.1",
+        "eslint-visitor-keys": "^1.1.0",
+        "espree": "^6.2.1",
+        "esquery": "^1.4.0",
+        "lodash": "^4.17.21",
+        "semver": "^6.3.0"
+      }
+    },
+    "node_modules/which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "node_modules/word-wrap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz",
+      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+      "dev": true
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "dev": true
+    },
+    "node_modules/write": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/write/-/write-1.0.3.tgz",
+      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+      "dev": true,
+      "dependencies": {
+        "mkdirp": "^0.5.1"
+      }
+    }
+  },
   "dependencies": {
     "@babel/code-frame": {
       "version": "7.16.7",

+ 65 - 2
mini/pages.json

xqd
@@ -15,14 +15,77 @@
     {
       "path": "pages/trace/index",
       "style": {
-        "navigationBarTitleText": "追剧",
+        "navigationBarTitleText": "张四爷剧场",
         "enablePullDownRefresh": false
       }
     },
     {
       "path": "pages/my/index",
       "style": {
-        "navigationBarTitleText": "我的",
+        "navigationBarTitleText": "张四爷剧场",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/trace/collect",
+      "style": {
+        "navigationBarTitleText": "我的收藏",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/trace/trace",
+      "style": {
+        "navigationBarTitleText": "我的追剧",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/my/consume",
+      "style": {
+        "navigationBarTitleText": "消费记录",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/my/history",
+      "style": {
+        "navigationBarTitleText": "历史记录",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/my/recharge",
+      "style": {
+        "navigationBarTitleText": "充值记录",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/my/protocol",
+      "style": {
+        "navigationBarTitleText": "用户协议",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/sign/index",
+      "style": {
+        "navigationBarTitleText": "签到",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/member/index",
+      "style": {
+        "navigationBarTitleText": "会员",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/member/free",
+      "style": {
+        "navigationBarTitleText": "会员免费片单",
         "enablePullDownRefresh": false
       }
     }

+ 73 - 0
mini/pages/index/components/EpisodeBox.vue

xqd
@@ -0,0 +1,73 @@
+<template>
+  <view class="episode-box">
+    <view class="header-box main-between cross-center">
+      <text class="title">{{ title }}</text>
+      <view class="refresh main-left cross-center">
+        <text>换一批</text>
+        <view class="icon">
+          <u-icon name="reload" size="32rpx" bold />
+        </view>
+      </view>
+    </view>
+    <view class="container dir-left-wrap">
+      <episode
+        v-for="(episode,index) in episodes"
+        :key="index"
+        :episode="episode"
+        :custom-style="{
+          marginRight: ((index+1) % 3 !== 0 ? '20rpx' :''),
+        }"
+      />
+    </view>
+  </view>
+</template>
+
+<script>
+import UIcon from '../../../uni_modules/uview-ui/components/u-icon/u-icon'
+import Episode from '../../../components/Episode/index'
+export default {
+  name: 'EpisodeBox',
+  components: { Episode, UIcon },
+  props: {
+    title: {
+      type: String,
+      required: true
+    }
+  },
+  data() {
+    return {
+      episodes: [
+        { name: '毒液', status: '已完结', total: 40 },
+        { name: '毒液', status: '已完结', total: 40 },
+        { name: '毒液', status: '已完结', total: 40 },
+        { name: '毒液', status: '已完结', total: 40 }
+      ]
+    }
+  },
+  computed: {},
+  methods: {}
+}
+</script>
+
+<style lang="scss" scoped>
+    .episode-box {
+      margin-top: 30rpx;
+      .header-box{
+        .title{
+          font-size: 32rpx;
+          color: #ffffff;
+        }
+        .refresh{
+          text{
+            color: $info-color;
+            font-size: 24rpx;
+            line-height: 22rpx;
+            margin-right: 4rpx;
+          }
+        }
+      }
+      .container{
+        margin-top: 30rpx;
+      }
+    }
+</style>

+ 88 - 8
mini/pages/index/index.vue

xqd xqd
@@ -1,15 +1,70 @@
 <template>
-  <!--防止滚动穿透-->
-  <view>
-    321
+  <view class="container">
+    <!--search-->
+    <view class="search-box main-center cross-center">
+      <u-input
+        v-model="keywords"
+        placeholder="请输入剧名 /演员"
+        color="#fff"
+        border="none"
+        prefix-icon="search"
+        :prefix-icon-style="{
+          color: $colors.primaryColor,
+          fontSize: '50rpx',
+          fontWeight: 500,
+          lineHeight: '50rpx'
+        }"
+        :custom-style="{
+          backgroundColor: '#1B203C',
+          padding: '14rpx 30rpx',
+          width: '700rpx',
+          borderRadius: '36rpx',
+          color: '#fff'
+        }"
+      />
+    </view>
+    <!--swpier-->
+    <swiper-box />
+    <!--栏目分类-->
+    <view class="category-box main-center cross-center">
+      <view
+        v-for="(item,index) in category"
+        :key="index"
+        class="category-item dir-top-wrap cross-center"
+        @click="handleRedirect(item)"
+      >
+        <view class="icon">
+          <image :src="item.icon" />
+        </view>
+        <text>{{ item.name }}</text>
+      </view>
+    </view>
+    <!--分类-->
+    <episode-box title="短剧推荐" />
+    <episode-box title="最新热剧" />
+    <episode-box title="排行榜" />
+    <!--充值-->
+    <recharge :show.sync="recharge.show" />
   </view>
 </template>
 
 <script>
+import SwiperBox from '../../components/SwiperBox/index'
+import EpisodeBox from './components/EpisodeBox'
+import Recharge from '../../components/Recharge/index'
 export default {
+  components: { Recharge, EpisodeBox, SwiperBox },
   data() {
     return {
-      title: '首页',
+      keywords: '',
+      category: [
+        { icon: '', name: '排行榜', href: '/pages/' },
+        { icon: '', name: '最新', href: '/pages/' },
+        { icon: '', name: '会员', href: '/pages/member/index' },
+        { icon: '', name: '签到', href: '/pages/sign/index' },
+        { icon: '', name: '充值', type: 'recharge' }
+      ],
+      recharge: { show: false }
     }
   },
   computed: {
@@ -17,12 +72,37 @@ export default {
   onLoad(options) {
   },
   methods: {
-    handleRedirect(link) {
-      this.src = link
+    handleRedirect(item) {
+      if (item.type === 'recharge') {
+        this.recharge.show = true
+      } else if (item.href) {
+        this.$u.route(item.href)
+      }
     }
-  },
+  }
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
+  .container{
+    padding: 0 20rpx;
+    .search-box{
+      margin-top: 30rpx;
+    }
+    .category-box{
+      .category-item{
+        flex: 1;
+        font-size: 32rpx;
+        .icon{
+          image{
+            width: 100rpx;
+            height: 100rpx;
+          }
+        }
+        text{
+          color: #fff;
+        }
+      }
+    }
+  }
 </style>

+ 42 - 0
mini/pages/member/free.vue

xqd
@@ -0,0 +1,42 @@
+<template>
+  <view class="free-container dir-left-wrap">
+    <episode
+      v-for="(episode,index) in episodes"
+      :key="index"
+      :episode="episode"
+      :custom-style="{
+        marginRight: ((index+1) % 3 !== 0 ? '20rpx' :''),
+      }"
+    />
+  </view>
+</template>
+
+<script>
+import Episode from '../../components/Episode/index'
+export default {
+  name: 'Free',
+  components: { Episode },
+  data() {
+    return {
+      episodes: [
+        { name: '毒液', status: '已完结', total: 40 },
+        { name: '毒液', status: '已完结', total: 40 },
+        { name: '毒液', status: '已完结', total: 40 },
+        { name: '毒液', status: '已完结', total: 40 },
+        { name: '毒液', status: '已完结', total: 40 },
+        { name: '毒液', status: '已完结', total: 40 },
+        { name: '毒液', status: '已完结', total: 40 },
+        { name: '毒液', status: '已完结', total: 40 }
+      ]
+    }
+  },
+  computed: {},
+  methods: {}
+}
+</script>
+
+<style lang="scss" scoped>
+  .free-container {
+    padding: 20rpx;
+  }
+</style>

+ 149 - 0
mini/pages/member/index.vue

xqd
@@ -0,0 +1,149 @@
+<template>
+  <view class="member-container">
+    <view class="header dir-top-wrap cross-center">
+      <view class="title">会员充值</view>
+      <text class="tips">会员指定短剧无限观看、xxx 等特权</text>
+    </view>
+    <view class="content main-left">
+      <view
+        v-for="(item,index) in vip"
+        :key="index"
+        class="item dir-top-wrap cross-center main-center"
+        :class="{active: activeIndex === index}"
+        @click="activeIndex = index"
+      >
+        <view class="border" />
+        <view v-if="activeIndex === index" class="selected">已选择</view>
+        <text class="day">7天</text>
+        <text class="price">¥29</text>
+      </view>
+    </view>
+    <view class="free main-center cross-center" @click="$u.route('/pages/member/free')">
+      查看 <text>免费片单</text>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      vip: [1, 2, 3],
+      activeIndex: 0
+    }
+  },
+  computed: {},
+  methods: {}
+}
+</script>
+
+<style lang="scss" scoped>
+    .member-container{
+      padding: 20rpx 0;
+      font-size: 30rpx;
+      .header{
+        color: $primary-color;
+        margin-top: 50rpx;
+        .title{
+          position: relative;
+          font-size: 42rpx;
+          font-weight: 600;
+          width: 100%;
+          text-align: center;
+          &:before,&:after{
+            content: "";
+            background: url("/static/image/member-line-bg.png") no-repeat;
+            background-size: 100%;
+            position: absolute;
+            top: 50%;
+            left: 60rpx;
+            width: 200rpx;
+            height: 20rpx;
+          }
+          &:after{
+            transform: rotate(180deg);
+            right: 60rpx;
+            left: unset;
+            top: 20%;
+          }
+        }
+        .tips{
+          color: $dark-color;
+          font-size: 26rpx;
+          margin-top: 20rpx;
+        }
+      }
+      .content{
+        padding: 0 20rpx;
+        margin-top: 80rpx;
+        .item{
+          color: $default-color;
+          margin-left: 20rpx;
+          flex: 1;
+          height: 300rpx;
+          position: relative;
+          .border{
+            position: absolute;
+            top: 0;
+            left: 0;
+            right: 0;
+            bottom: 0;
+            z-index: 0;
+            border: 4rpx solid $info-color;
+            border-radius: 10rpx;
+            overflow: hidden;
+          }
+          &.active .border{
+            border: unset;
+            &:after{
+              content: "";
+              position: absolute;
+              top: 0;
+              left: 0;
+              right: 0;
+              bottom: 0;
+              border: 4rpx solid;
+              border-image: linear-gradient(222deg, #6EEBE8, #FF74B9) 1;
+              z-index: 0;
+            }
+          }
+          .selected{
+            position: absolute;
+            top: -20rpx;
+            background: url("/static/image/member-selected-bg.png") no-repeat;
+            background-size: 100%;
+            text-align: center;
+            width: 120rpx;
+            height: 40rpx;
+            font-size: 24rpx;
+            line-height: 40rpx;
+            left: 20rpx;
+            z-index: 1;
+          }
+          &:first-child{
+            margin-left: 0;
+          }
+          .day{
+            font-size: 32rpx;
+            margin-bottom: 80rpx;
+          }
+          .price{
+            font-size: 38rpx;
+            color: $primary-color;
+          }
+        }
+      }
+      .free{
+        background: #1B1E32;
+        width: 100%;
+        padding: 20rpx 0;
+        color: $info-color;
+        text-align: center;
+        font-size: 26rpx;
+        margin-top: 60px;
+        text{
+          color: $dark-color;
+        }
+      }
+    }
+</style>

+ 140 - 0
mini/pages/my/consume.vue

xqd
@@ -0,0 +1,140 @@
+<template>
+  <view class="consume">
+    <view class="header main-left cross-center" @click="datePicker.show = true">
+      <text>{{ date }}</text>
+      <view class="icon" :class="{rotate: datePicker.show}">
+        <u-icon name="arrow-down" />
+      </view>
+    </view>
+    <view class="content">
+      <view
+        v-for="(item,index) in consume"
+        :key="index"
+        class="consume-item dir-left-nowrap cross-center"
+      >
+        <view class="cover-image">
+          <image src="@/static/image/default-movie.png" />
+        </view>
+        <view class="episode-box dir-top-wrap ">
+          <view class="name">毒液</view>
+          <view class="status-box main-left cross-center">
+            <text class="status">已完结</text>
+            <text>共18集</text>
+          </view>
+          <view class="detail">5集</view>
+          <text class="time">2022-07-21 12:45:21</text>
+        </view>
+        <view class="gold">
+          <text class="number">-150</text>
+          <text>金币</text>
+        </view>
+      </view>
+    </view>
+    <!--时间选择-->
+    <u-datetime-picker
+      ref="datePicker"
+      v-model="datePicker.value"
+      :show="datePicker.show"
+      mode="year-month"
+      @confirm="handleDateConfirm"
+      @cancel="handleDateConfirm"
+    />
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      consume: [1, 2],
+      datePicker: {
+        value: (new Date()).getTime(),
+        date: uni.$u.timeFormat((new Date()).getTime(), 'yyyy-mm'),
+        show: false
+      }
+    }
+  },
+  computed: {
+    date() {
+      const date = this.datePicker.date
+      const arr = date.split('-')
+      return `${arr[0]}年${arr[1]}月`
+    }
+  },
+  watch: {
+    datePicker: {
+      handler(date) {
+        date.date = uni.$u.timeFormat(date.value, 'yyyy-mm')
+      },
+      deep: true,
+      immediate: true
+    }
+  },
+  methods: {
+    handleDateConfirm() {
+      this.datePicker.show = false
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+    .consume {
+      padding: 20rpx 20rpx;
+      font-size: 30rpx;
+      .header{
+        color: $info-color;
+        text{
+          margin-right: 20rpx;
+          font-size: 32rpx;
+        }
+        .icon{
+          transition: .3s;
+          &.rotate{
+            transform: rotate(-180deg);
+          }
+        }
+      }
+      .content{
+        .consume-item{
+          color: $info-color;
+          margin-top: 20rpx;
+          .cover-image{
+            image{
+              width: 200rpx;
+              height: 260rpx;
+            }
+          }
+          .episode-box{
+            flex: 1;
+            margin-left: 20rpx;
+            font-size: 26rpx;
+            .name{
+              color: $default-color;
+              font-size: 38rpx;
+              font-weight: 600;
+              margin-bottom: 10rpx;
+            }
+            .status-box{
+              margin-bottom: 50rpx;
+              .status{
+                color: $primary-color;
+                margin-right: 14rpx;
+              }
+            }
+            .detail{
+              font-size: 32rpx;
+              color: $default-color;
+              margin-bottom: 10rpx;
+            }
+          }
+          .gold{
+            .number{
+              color: $pink-color;
+              font-size: 42rpx;
+            }
+          }
+        }
+      }
+    }
+</style>

+ 102 - 0
mini/pages/my/history.vue

xqd
@@ -0,0 +1,102 @@
+<template>
+  <view class="history">
+    <view
+      v-for="(item,index) in history"
+      :key="index"
+      class="item main-left"
+    >
+      <view class="cover-image">
+        <image src="/static/image/default-movie.png" />
+      </view>
+      <view class="right-box">
+        <view class="op-group main-right cross-center">
+          <view class="delete">删除</view>
+          <view class="play">播放</view>
+        </view>
+        <view class="name">毒液</view>
+        <view class="status-box">
+          <text class="status">已完结</text>
+          <text>共18集</text>
+        </view>
+        <view class="record">
+          上次看至 <text>第二集</text>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      history: [1, 2, 3, 4, 5]
+    }
+  },
+  computed: {},
+  methods: {}
+}
+</script>
+
+<style lang="scss" scoped>
+    .history{
+      padding: 20rpx;
+      color: $default-color ;
+      font-size: 30rpx;
+      .item{
+        padding: 30rpx;
+        border: 1rpx solid $primary-color;
+        border-radius: 30rpx;
+        margin-top: 30rpx;
+        .cover-image{
+          image{
+            width: 200rpx;
+            height: 280rpx;
+          }
+        }
+        .right-box{
+          flex: 1;
+          margin-left: 20rpx;
+          .op-group{
+            .delete{
+              border: 1rpx solid #FB3651;
+              color: #FB3651;
+              border-radius: 30rpx;
+              width: 140rpx;
+              padding: 10rpx;
+              text-align: center;
+              margin-right: 30rpx;
+            }
+            .play{
+              background: linear-gradient(90deg, #FF74B9,#6EEBE8);
+              color: $default-color;
+              border-radius: 30rpx;
+              width: 140rpx;
+              padding: 10rpx;
+              text-align: center;
+            }
+          }
+          .name{
+            font-size: 38rpx;
+            font-weight: 600;
+            margin-bottom: 10rpx;
+            margin-top: 50rpx;
+          }
+          .status-box{
+            font-size: 28rpx;
+            margin-bottom: 10rpx;
+            color: $info-color;
+            .status{
+              color: $primary-color;
+              margin-right: 14rpx;
+            }
+          }
+          .record{
+            text{
+              color: #FB3651;
+            }
+          }
+        }
+      }
+    }
+</style>

+ 210 - 9
mini/pages/my/index.vue

xqd
@@ -1,19 +1,220 @@
 <template>
-    <view class="My">32</view>
+  <view class="container">
+    <!--用户信息-->
+    <view class="header main-between cross-center">
+      <view class="user-box main-left cross-center">
+        <view class="head-img">
+          <image src="@/static/image/default-head-img.png" />
+        </view>
+        <view class="nickname cross-center">未授权登陆</view>
+      </view>
+      <button open-type="getUserInfo" class="refresh" @click="handleGetUserInfo">刷新</button>
+    </view>
+    <!--充值-->
+    <view class="recharge main-between cross-center">
+      <view class="static-box main-left cross-center">
+        <view class="icon">
+          <image src="/static/image/gold-bag.png" mode="aspectFill" />
+        </view>
+        <view class="overage">3金币</view>
+      </view>
+      <view class="recharge-btn">充值</view>
+    </view>
+    <!--历史-->
+    <view class="history" @click="$u.route('/pages/my/history')">
+      <view class="header main-between cross-center">
+        <text>历史观看记录</text>
+        <u-icon name="arrow-right" :color="$colors.infoColor" bold />
+      </view>
+      <view class="content main-between cross-center">
+        <view
+          v-for="(item,index) in history"
+          :key="index"
+          class="episode"
+        >
+          <view class="cover-image">
+            <image src="@/static/image/default-movie.png" mode="aspectFill" />
+          </view>
+        </view>
+      </view>
+    </view>
+    <!--菜单-->
+    <view class="menu-group">
+      <button
+        v-for="(menu,index) in menus"
+        :key="index"
+        class="menu-item main-between cross-center"
+        :open-type="menu.type ? menu.type : ''"
+        @click="handleMenu(menu)"
+      >
+        <view class="left-box dir-left-nowrap cross-center">
+          <view class="icon">
+            <image :src="menu.icon" />
+          </view>
+          <text>{{ menu.name }}</text>
+        </view>
+        <u-icon name="arrow-right" :color="$colors.infoColor" bold />
+      </button>
+    </view>
+  </view>
 </template>
 
 <script>
-    export default {
-        name: "My",
-        data() {
-            return {}
-        },
-        methods: {},
-        computed: {}
+export default {
+  name: 'My',
+  data() {
+    return {
+      history: [1, 2, 3, 4],
+      menus: [
+        { icon: '/static/image/my-page/order.png', name: '消费记录', href: '/pages/my/consume' },
+        { icon: '/static/image/my-page/recharge.png', name: '充值记录', href: '/pages/my/recharge' },
+        { icon: '/static/image/my-page/share.png', name: '分享好友', type: 'share' },
+        { icon: '/static/image/my-page/contact.png', name: '联系客服', type: 'contact' },
+        { icon: '/static/image/my-page/protocol.png', name: '用户协议', href: '/pages/my/protocol' }
+      ]
     }
+  },
+  computed: {},
+  methods: {
+    handleMenu(menu) {
+      if (menu.href) {
+        this.$u.route(menu.href)
+      }
+    },
+    handleGetUserInfo(detail) {
+      uni.login({
+        success: function(loginRes) {
+          console.log(loginRes.authResult)
+          // 获取用户信息
+          uni.getUserInfo({
+            success: function(infoRes) {
+              console.log('-->data', infoRes)
+            }
+          })
+        }
+      })
+    }
+  }
+}
 </script>
 
 <style lang="scss" scoped>
-    .My {
+  .container {
+    padding: 20px 20rpx 0;
+    font-size: 30rpx;
+    >.header{
+      .user-box{
+        .head-img{
+          image{
+            width: 100rpx;
+            height: 100rpx;
+            border-radius: 50%;
+          }
+        }
+        .nickname{
+          color: $primary-color;
+          margin-left: 30rpx;
+        }
+      }
+      .refresh{
+        background: $primary-color;
+        color: #fff;
+        border-radius: 30rpx;
+        padding: 10rpx 0;
+        width: 140rpx;
+        text-align: center;
+        letter-spacing: .1rem;
+        line-height: initial;
+      }
+    }
+    .recharge{
+      background: url("/static/image/my-recharge-bg.png") no-repeat center;
+      background-size: 100%;
+      height: 200rpx;
+      margin-top: 20rpx;
+      margin-bottom: 10rpx;
+      .static-box{
+        margin-left: 30rpx;
+        .icon{
+          border-radius: 20rpx;
+          image{
+            width: 100rpx;
+            height: 100rpx;
+          }
+        }
+        .overage{
+          font-weight: 800;
+          margin-left: 20rpx;
+          font-size: 32rpx;
+        }
+      }
+      .recharge-btn{
+        border: 1rpx solid #fff;
+        padding: 10rpx 0 ;
+        text-align: center;
+        width: 140rpx;
+        margin-right: 20rpx;
+        border-radius: 30rpx;
+        color: #ffffff;
+      }
+    }
+    .history{
+      background: #1B203C;
+      height: 300rpx;
+      border-radius: 15rpx;
+      padding: 20rpx 30rpx;
+      margin-bottom: 40rpx;
+      >.header{
+        text{
+          color: $info-color;
+          font-weight: 600;
+        }
+      }
+      .content{
+        margin-top: 20rpx;
+        .episode{
+          flex: 1;
+          margin-left: 20rpx;
+          &:first-child{
+            margin-left: 0;
+          }
+          .cover-image{
+            image{
+              width: 100%;
+              height: 200rpx;
+            }
+          }
+        }
+      }
+    }
+    .menu-group{
+      .menu-item{
+        padding: 20rpx 0;
+        background: transparent;
+        border: none;
+        text-align: unset;
+        width: 100%;
+        line-height: initial;
+        font-size: initial;
+        justify-content: space-between;
+        &:after{
+          content: unset;
+        }
+        .left-box{
+          flex: 1;
+          .icon{
+            transform: translateY(4rpx);
+            image{
+              width: 55rpx;
+              height: 55rpx;
+            }
+          }
+          text{
+            color: #fff;
+            margin-left: 10rpx;
+          }
+        }
+      }
     }
+  }
 </style>

+ 36 - 0
mini/pages/my/protocol.vue

xqd
@@ -0,0 +1,36 @@
+<template>
+  <view class="protocol">
+    该软件的著作权和所有权由公司所有。该软件受著作权法和国际条约条款的保护。商标的使用应符合商标惯例,包括和商标所有人名称的一致。商标可以仅用于对该软件产品的识别。对于任何商标的该种使用都不会导致对该商标使用权的拥有。除上述以外,该协议不授予你该软件上的任何知识产权。
+    2. 软件的使用   你可以:
+     (1) 根据该协议条款使用该软件;
+      (2) 复制和备份;
+    (3) 不对文档作任何增加或修改以文档下载的最初形式将此软件拷贝给他人;
+    (4) 在网址上通过 email 或者其他任何物理媒体分发该软件。   你不可以:
+     (1) 对本系统进行逆向工程、反汇编、解体拆卸或任何试图发现该软件工作程序获源代码的行为;
+     (2) 未经有限公司的书面许可出售租赁该程序;
+    (3) 创造派生性产品包括含有该系统的更大的系统或另外的程序和包裹
+    (4) 将该软件和与_________没有分离授权协议的产品或山版物捆绑销售
+    (5) 使用和拷贝没有_________授权的包含在_________之中的 icons,1ogosorartwork
+     (6) 改变_________广告图案内部程序的运行,改变广告及其内容、广告出现的时间或使其他功能丧失的行为
+     (7) 使用该软件改进其他产品和服务
+     (8) 任何反相工程、反相编译和反汇编以及其他任何试图发现由该内程旗帜广告和该软件中网络共享功能所使用的协议的行为;
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {}
+  },
+  computed: {},
+  methods: {}
+}
+</script>
+
+<style lang="scss" scoped>
+    .protocol{
+      color: $info-color;
+      font-size: 32rpx;
+      padding: 0 20rpx;
+    }
+</style>

+ 128 - 0
mini/pages/my/recharge.vue

xqd
@@ -0,0 +1,128 @@
+<template>
+  <view class="recharge">
+    <view class="header main-left cross-center" @click="datePicker.show = true">
+      <text>{{ date }}</text>
+      <view class="icon" :class="{rotate: datePicker.show}">
+        <u-icon name="arrow-down" />
+      </view>
+    </view>
+    <view class="content">
+      <view
+        v-for="(item,index) in recharge"
+        :key="index"
+        class="recharge-item"
+      >
+        <view class="gold-box main-between cross-center">
+          <view class="left-box main-left cross-center">
+            <view class="gold">
+              <text class="number">+150</text>
+              <text>金币</text>
+            </view>
+            <view class="gift">充100赠50</view>
+          </view>
+          <view class="right-box">
+            <text class="number">49.99</text>
+            <text>金币</text>
+          </view>
+        </view>
+        <text class="time">2022.07.21 12:55</text>
+      </view>
+    </view>
+    <!--时间选择-->
+    <u-datetime-picker
+      ref="datePicker"
+      v-model="datePicker.value"
+      :show="datePicker.show"
+      mode="year-month"
+      @confirm="handleDateConfirm"
+      @cancel="handleDateConfirm"
+    />
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      recharge: [1, 2, 3, 4, 5],
+      datePicker: {
+        value: (new Date()).getTime(),
+        date: uni.$u.timeFormat((new Date()).getTime(), 'yyyy-mm'),
+        show: false
+      }
+    }
+  },
+  computed: {
+    date() {
+      const date = this.datePicker.date
+      const arr = date.split('-')
+      return `${arr[0]}年${arr[1]}月`
+    }
+  },
+  watch: {
+    datePicker: {
+      handler(date) {
+        date.date = uni.$u.timeFormat(date.value, 'yyyy-mm')
+      },
+      deep: true,
+      immediate: true
+    }
+  },
+  methods: {
+    handleDateConfirm() {
+      this.datePicker.show = false
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+    .recharge {
+      padding: 20rpx 20rpx;
+      .header{
+        color: $info-color;
+        text{
+          margin-right: 20rpx;
+          font-size: 32rpx;
+        }
+        .icon{
+          transition: .3s;
+          &.rotate{
+            transform: rotate(-180deg);
+          }
+        }
+      }
+      .content{
+        .recharge-item{
+          border-bottom: 1rpx solid $info-color;
+          color: $info-color;
+          font-size: 26rpx;
+          padding: 20rpx 0;
+          &:last-child{
+            border-bottom: none;
+          }
+          .gold-box{
+            padding: 16rpx 0;
+            .number{
+              color: $primary-color;
+              font-size: 38rpx;
+              font-weight: 600;
+              margin-right: 10rpx;
+            }
+            .gold .number{
+              color: $default-color;
+            }
+            .left-box{
+              .gift{
+                color: $pink-color;
+                margin-left: 40rpx;
+              }
+            }
+          }
+          text.time{
+            font-size: 24rpx;
+          }
+        }
+      }
+    }
+</style>

+ 155 - 0
mini/pages/sign/index.vue

xqd
@@ -0,0 +1,155 @@
+<template>
+  <view class="sign-container">
+    <view
+      class="header"
+      :style="{
+        backgroundImage: `url(${$setting.IMAGE_URL}/sign/bg.png)`
+      } "
+    >
+      <view
+        class="icon"
+        :style="{
+          backgroundImage: `url(${$setting.IMAGE_URL}/sign/icon.png)`
+        } "
+      />
+      <view class="been-sign">已连续签到1天</view>
+      <view class="tips">在连续签到6天立得50金</view>
+    </view>
+    <view class="content dir-left-wrap">
+      <view
+        v-for="(item,index) in sign"
+        :key="index"
+        class="item main-center cross-center"
+        :class="{active: index === 0}"
+      >
+        <view class="left-box dir-top-wrap cross-center">
+          <text class="title">{{ item.name }}</text>
+          <view class="icon">
+            <image src="@/static/image/gold.png" />
+          </view>
+          <view class="number">{{ item.number }}金币</view>
+        </view>
+        <view v-if="(index + 1) === sign.length" class="right-box">
+          <image src="@/static/image/gold-bag.png" />
+        </view>
+      </view>
+    </view>
+    <view class="btn">立即签到</view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      sign: [
+        { name: '第一天', number: 3 },
+        { name: '第二天', number: 3 },
+        { name: '第三天', number: 3 },
+        { name: '第四天', number: 3 },
+        { name: '第五天', number: 3 },
+        { name: '第六天', number: 3 },
+        { name: '第七天', number: 3 }
+      ]
+    }
+  },
+  computed: {},
+  methods: {}
+}
+</script>
+
+<style lang="scss" scoped>
+    .sign-container{
+      padding: 20rpx;
+      font-size: 28rpx;
+      .header{
+        background-repeat: no-repeat;
+        background-size: 100% 100%;
+        height: 300rpx;
+        border-radius: 10rpx;
+        position: relative;
+        margin-top: 100rpx;
+        padding-top: 80rpx;
+        .icon{
+          background-repeat: no-repeat;
+          background-size: 100%;
+          height: 180rpx;
+          width: 240rpx;
+          position: absolute;
+          top: -50%;
+          transform: translateY(30%) translateX(-50%);
+          left: 50%;
+        }
+        .been-sign{
+          background: linear-gradient(303deg, #FF74B9, #6EEBE8, #FFFFFF);
+          -webkit-background-clip: text;
+          color: transparent;
+          text-align: center;
+          margin-bottom: 30rpx;
+          font-size: 46rpx;
+          font-weight: bold;
+        }
+        .tips{
+          color: $info-color;
+          text-align: center;
+          width: 500rpx;
+          margin: 0 auto;
+          border-radius: 30rpx;
+          padding: 12rpx 0;
+          background: #1f2336;
+          font-size: 26rpx;
+        }
+      }
+      .content{
+        margin-top: 40rpx;
+        .item{
+          color: $default-color;
+          width: calc(#{660rpx}/4);
+          background: #1B1E32;
+          border-radius: 10rpx;
+          padding: 40rpx 0;
+          margin-bottom: 20rpx;
+          margin-right: 20rpx;
+          &.active{
+            background: linear-gradient(221deg, #6EEBE8, #FF74B9);
+          }
+          &:nth-child(4){
+            margin-right: 0;
+          }
+          &:last-child{
+            flex: 1;
+            margin-right: 0;
+          }
+          .left-box{
+            .icon{
+              image{
+                width: 100rpx;
+                height: 100rpx;
+              }
+            }
+            .number{
+              color: $primary-color;
+            }
+          }
+          .right-box{
+            margin-bottom: -100rpx;
+            margin-right: -20rpx;
+            margin-left: 40rpx;
+            image{
+              width: 160rpx;
+              height: 160rpx;
+            }
+          }
+        }
+      }
+      .btn{
+        width: 690rpx;
+        margin: 80rpx auto 0;
+        padding: 24rpx 0;
+        color: $default-color;
+        background: linear-gradient(270deg, #FB3651 0%, #FF8999 100%);
+        border-radius: 45px;
+        text-align: center;
+      }
+    }
+</style>

+ 100 - 0
mini/pages/trace/collect.vue

xqd
@@ -0,0 +1,100 @@
+<template>
+  <view class="collect">
+    <view
+      v-for="(item,index) in collect"
+      :key="index"
+      class="item main-left"
+    >
+      <view class="cover-image">
+        <image src="/static/image/default-movie.png" />
+      </view>
+      <view class="right-box">
+        <view class="op-group main-right cross-center">
+          <view class="delete">删除</view>
+          <view class="play">播放</view>
+        </view>
+        <view class="name">毒液</view>
+        <view class="status-box">
+          <text class="status">已完结</text>
+          <text>共18集</text>
+        </view>
+        <view class="record">
+          上次看至 <text>第二集</text>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      collect: [1, 2, 3, 4, 5]
+    }
+  },
+  computed: {},
+  methods: {}
+}
+</script>
+
+<style lang="scss" scoped>
+  .collect{
+    padding: 20rpx;
+    color: $default-color ;
+    font-size: 30rpx;
+    .item{
+      padding: 30rpx;
+      border: 1rpx solid $primary-color;
+      border-radius: 30rpx;
+      margin-top: 30rpx;
+      .cover-image{
+        image{
+          width: 200rpx;
+          height: 280rpx;
+        }
+      }
+      .right-box{
+        flex: 1;
+        margin-left: 20rpx;
+        .op-group{
+          .delete{
+            border: 1rpx solid #FB3651;
+            color: #FB3651;
+            border-radius: 30rpx;
+            width: 140rpx;
+            padding: 10rpx;
+            text-align: center;
+            margin-right: 30rpx;
+          }
+          .play{
+            background: linear-gradient(90deg, #FF74B9,#6EEBE8);
+            color: $default-color;
+            border-radius: 30rpx;
+            width: 140rpx;
+            padding: 10rpx;
+            text-align: center;
+          }
+        }
+        .name{
+          font-size: 38rpx;
+          font-weight: 600;
+          margin-bottom: 10rpx;
+          margin-top: 50rpx;
+        }
+        .status-box{
+          margin-bottom: 10rpx;
+          .status{
+            color: $primary-color;
+            margin-right: 14rpx;
+          }
+        }
+        .record{
+          text{
+            color: #FB3651;
+          }
+        }
+      }
+    }
+  }
+</style>

+ 130 - 10
mini/pages/trace/index.vue

xqd
@@ -1,20 +1,140 @@
 <template>
-    <view class="Trace"></view>
+  <view class="trace-container">
+    <!--我的收藏-->
+    <view class="collect-container">
+      <view class="header main-between cross-center" @click="$u.route('/pages/trace/collect')">
+        <text>我的收藏</text>
+        <view class="more main-left cross-center">查看全部
+          <u-icon name="arrow-right" />
+        </view>
+      </view>
+      <!--剧集-->
+      <view class="content main-left cross-center">
+        <episode
+          v-for="(episode,index) in collect"
+          :key="index"
+          :episode="episode"
+          :custom-style="{
+            marginRight: ((index+1) % 4 !== 0 ? '10rpx' :''),
+            width: ((710 - 60) / 4 )+'rpx' // 60为间隔 710为 collect-container宽度
+          }"
+          :image-style="{
+            height: '200rpx'
+          }"
+        />
+      </view>
+    </view>
+    <!--其他剧集-->
+    <view class="title">其他剧集</view>
+    <view
+      v-for="(item,index) in category"
+      :key="index"
+      class="category main-left"
+    >
+      <view class="name">动作</view>
+      <view class="episode-box main-left">
+        <episode
+          v-for="(episode,episodeIndex) in collect"
+          :key="episodeIndex"
+          :episode="episode"
+          :custom-style="{
+            marginRight: ((index+1) % 3 !== 0 ? '10rpx' :''),
+            width: ((700 - 80) / 3 )+'rpx'
+          }"
+          :image-style="{
+            height: '280rpx'
+          }"
+        />
+      </view>
+    </view>
+  </view>
 </template>
 
 <script>
-  /**/
-    export default {
-        name: "Trace",
-        data() {
-            return {}
-        },
-        methods: {},
-        computed: {}
+import Episode from '../../components/Episode/index'
+export default {
+  name: 'Trace',
+  components: { Episode },
+  data() {
+    return {
+      collect: [
+        { name: '毒液', status: '已完结', total: 40 },
+        { name: '毒液', status: '已完结', total: 40 },
+        { name: '毒液', status: '已完结', total: 40 }
+      ],
+      category: [1, 2, 3]
     }
+  },
+  computed: {},
+  methods: {}
+}
 </script>
 
 <style lang="scss" scoped>
-    .Trace {
+    .trace-container {
+      padding: 20rpx 0;
+      font-size: 30rpx;
+      color: $default-color;
+      .status-box{
+        margin-top: 10rpx;
+        color: $info-color;
+        font-size: 28rpx;
+        .status{
+          color: $primary-color;
+          margin-right: 14rpx;
+        }
+      }
+      .collect-container{
+        background: #1B203C;
+        border-radius: 30rpx;
+        padding: 20rpx;
+        width: 710rpx;
+        margin: 0 auto;
+        .header{
+          text{
+            color: $primary-color;
+            font-size: 38rpx;
+            font-weight: 800;
+          }
+          .more{
+            color: $info-color;
+          }
+        }
+        .content{
+          margin-top: 20rpx;
+          .collect-item{
+            .cover-image{
+              image{
+                width: 200rpx;
+                height: 280rpx;
+              }
+            }
+            .name{
+              margin-top: 10rpx;
+            }
+          }
+        }
+      }
+      .title{
+        color: $primary-color;
+        font-size: 38rpx;
+        font-weight: 800;
+        padding: 0 20rpx;
+        margin: 40rpx 0 30rpx;
+      }
+      .category{
+        margin-bottom: 30rpx;
+        .name{
+          background: #284150;
+          writing-mode: vertical-lr;
+          padding: 0 20rpx;
+          border-top-right-radius: 30rpx;
+          border-bottom-right-radius: 30rpx;
+          text-align: center;
+        }
+        .episode-box{
+          margin-left: 20rpx;
+        }
+      }
     }
 </style>

+ 18 - 0
mini/pages/trace/trace.vue

xqd
@@ -0,0 +1,18 @@
+<template>
+  <view class="trace" />
+</template>
+
+<script>
+export default {
+  data() {
+    return {}
+  },
+  computed: {},
+  methods: {}
+}
+</script>
+
+<style lang="scss" scoped>
+  .trace {
+  }
+</style>

+ 3 - 3
mini/setting.js

xqd
@@ -7,7 +7,7 @@ module.exports = {
   // 版本
   VERSION: '0.0.1',
   // API 接口URL
-  BASE_URL: IS_DEV ? 'http://api.member.me/api/consumer' : 'https://api.jiufuka.com/api/consumer',
-  //
-  IMG_URL: IS_DEV ? 'http://api.member.me/images' : 'https://api.jiufuka.com/images'
+  BASE_URL: IS_DEV ? 'http://www.zsy.me/api' : 'https://t3.9026.com/api',
+  // API 接口URL
+  IMAGE_URL: IS_DEV ? 'http://www.zsy.me/static/image' : 'https://t3.9026.com/static/image'
 }

+ 3 - 7
mini/static/css/common.scss

xqd
@@ -6,16 +6,12 @@ view,image,text,rich-text,progress,button,input,form,label,textarea{
 
 page,
 uni-page-body{
+  box-sizing: border-box;
   height: 100%;
-  background: $main-bg-color;
+  background: $bg-color;
+  padding-bottom: 80rpx;
 }
 .hidden{
   display: flex;
   visibility: hidden;
 }
-
-.ellipsis-hide {
-  overflow: hidden;
-  text-overflow:ellipsis;
-  white-space: nowrap;
-}

+ 6 - 7
mini/static/css/variable.scss

xqd
@@ -1,9 +1,8 @@
-$main-color: #652907;
-$main-bg-color: #F3F4F8;
+$bg-color: #151729;
 
-$grey-color: #868B91;
-$black-color: #2a211a;
+$primary-color: #6EEBE8;
+$dark-color: #48979C;
+$default-color: #FFFFFF;
+$info-color: #6F717F;
 
-$text-black-color: #3b434e;
-$text-grey-color: #d8dee5;
-$text-deep-grey-color: #868B91;
+$pink-color: #FF74B9;

BIN
mini/static/image/default-head-img.png


BIN
mini/static/image/default-movie.png


BIN
mini/static/image/gold-bag.png


BIN
mini/static/image/gold.png


BIN
mini/static/image/member-line-bg.png


BIN
mini/static/image/member-selected-bg.png


BIN
mini/static/image/my-page/contact.png


BIN
mini/static/image/my-page/order.png


BIN
mini/static/image/my-page/protocol.png


BIN
mini/static/image/my-page/recharge.png


BIN
mini/static/image/my-page/share.png


BIN
mini/static/image/my-recharge-bg.png


+ 9 - 5
mini/utils/mixin.js

xqd xqd
@@ -5,11 +5,15 @@ import $api from '../api'
 import constant from './constant'
 import $util from './index'
 import $cache from './cache.js'
+import $setting from '../setting.js'
 module.exports = {
   computed: {
     $const() {
       return constant
     },
+    $setting() {
+      return $setting
+    },
     $api() {
       return $api
     },
@@ -34,11 +38,11 @@ module.exports = {
     },
     $colors() {
       return {
-        main: '#652907',
-        mainBg: '#F3F4F8',
-        grey: '#868B91',
-        black: '#2A211A',
-        textBlack: '#3b434e'
+        bgColor: '#151729',
+        primaryColor: '#6EEBE8',
+        darkColor: '#48979C',
+        defaultColor: '#FFFFFF',
+        infoColor: '#6F717F'
       }
     }
   }

BIN
server/public/static/image/sign/bg.png


BIN
server/public/static/image/sign/icon.png