瀏覽代碼

feat: 首页UI

John-Hong 2 年之前
父節點
當前提交
89fd4e1c2a

+ 5 - 0
babel.config.js

@@ -1,5 +1,10 @@
 module.exports = {
     "plugins": [
         "@babel/plugin-proposal-optional-chaining",
+        ['import', {
+            libraryName: 'vant',
+            libraryDirectory: 'es',
+            style: true
+          }, 'vant']
     ]
 }

+ 3 - 1
package.json

@@ -9,6 +9,7 @@
   },
   "dependencies": {
     "@better-scroll/core": "^2.4.2",
+    "@better-scroll/observe-dom": "^2.4.2",
     "@better-scroll/pull-up": "^2.4.2",
     "@vue/shared": "^3.0.0",
     "axios": "^0.27.2",
@@ -22,6 +23,7 @@
     "sa-sdk-javascript": "^1.23.3",
     "sa-sdk-miniprogram": "^1.17.12",
     "stompjs": "^2.3.3",
+    "vant": "^2.12.50",
     "vue": "^2.6.11",
     "vue-router": "^3.6.4",
     "vuex": "^3.2.0"
@@ -33,7 +35,7 @@
     "@vue/cli-plugin-babel": "~4.5.15",
     "@vue/cli-service": "~4.5.15",
     "autoprefixer": "^9.8.8",
-    "babel-plugin-import": "^1.11.0",
+    "babel-plugin-import": "^1.13.5",
     "cross-env": "^7.0.2",
     "http-proxy-middleware": "^2.0.6",
     "jest": "^25.4.0",

+ 3 - 3
public/index.html

@@ -3,11 +3,11 @@
 
     <head>
         <meta charset="utf-8">
-        <meta http-equiv="X-UA-Compatible" content="IE=edge">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge" viewport-fit="cover">
         <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
-        <title>
+        <!-- <title>
             <%= htmlWebpackPlugin.options.title %>
-        </title>
+        </title> -->
         <script>
             // var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
             // document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')

+ 3 - 2
src/App.vue

@@ -81,7 +81,7 @@ export default {
     windowSendInit() {
       // uni.showToast({title: '哈哈哈哈'})
       // return
-      window.toWXSendMsg = function ({ type = '', options = {} }) {
+      window.toWXSendMsg = function ({ type = '', funcName = '',options = {} }) {
         /**
          * 向小程序端发送消息
          */
@@ -94,6 +94,7 @@ export default {
             data: Encrypt(
               JSON.stringify({
                 type: type,
+                funcName,
                 options,
               })
             ),
@@ -136,7 +137,7 @@ export default {
       const href = `${window.location.href}`;
       // dev
       if (/8080|dev-/g.test(href)) {
-        CacheTool.setEnv('dev');
+        CacheTool.setEnv('qa');
         return;
       }
       // qa

+ 4 - 2
src/components/scroll-view/scroll-view.vue

@@ -7,9 +7,10 @@
 <script>
 import BScroll from '@better-scroll/core';
 import Pullup from '@better-scroll/pull-up';
+import ObserveDom from '@better-scroll/observe-dom'
 import _ from 'lodash'
 
-BScroll.use(Pullup);
+BScroll.use(Pullup).use(ObserveDom);
 
 export default {
   name: 'scroll-view',
@@ -26,7 +27,7 @@ export default {
       type: [Boolean, String],
       // required: false,
       default: true,
-    },
+    }
   },
   data() {
     this.pullingUpHandlerD = _.debounce(this.pullingUpHandler, 1000) // 防抖
@@ -48,6 +49,7 @@ export default {
   mounted() {
     this.scroll = new BScroll(this.$refs.refreshContainer, {
       scrollY: true, //垂直方向滚动
+      observeDOM: true,
       click: true, //默认会阻止浏览器的原生click事件,如果需要点击,这里要设为true
       pullUpLoad: {
         threshold: 50,

+ 2 - 0
src/main.js

@@ -6,6 +6,7 @@ import App from './App';
 import sensors from 'sa-sdk-javascript';
 import store from './store/index.js';
 import VueRouter from 'vue-router';
+import { Icon } from 'vant';
 import router from './routes/index.js';
 
 // import authorize from 'components/authorize/authorize.vue'
@@ -31,6 +32,7 @@ Vue.prototype.$sensors = sensors;
 Vue.config.productionTip = false;
 App.mpType = 'app';
 Vue.use(VueRouter);
+Vue.use(Icon);
 
 const app = new Vue({
   store,

+ 159 - 113
src/pages/parkingFee/parkingFee.vue

@@ -1,50 +1,21 @@
 <template>
   <scroll-view
+    style="background-color: #F4F7FF"
     scroll-y="true"
-    :class="{ 'scroll-Y': true, 'color-scroll-Y': custTypeId !== 0 }"
     scroll-bottom="1000"
+    ref="scroll"
   >
     <!--    <authorize ref="authorize"></authorize>-->
     <!--    <div v-if="userInfo && userInfo.vipcode">vipcode: {{userInfo.vipcode}}</div>-->
     <div class="wrap">
-      <div class="parkingFee">
+      <div class="parkingFee" ref="parkingFee">
         <div
           class="parkingFee-top bg"
           :style="{
-            backgroundImage: `url(${require('./static/images/parking-bgi.png')})`,
-            backgroundAttachment: 'fixed',
+            // backgroundImage: `url(${require('./static/images/parking-bgi.png')})`,
+            // backgroundAttachment: 'fixed',
           }"
         >
-          <div
-            :class="{
-              top_content: true,
-              blue_top_content: custTypeId === 1,
-              green_top_content: custTypeId === 2,
-            }"
-            :style="{
-              'background-image':
-                custTypeId === 1 ? `url(${picUrl}${blueHeadBg});` : '',
-            }"
-          >
-            <div class="title_box">
-              <span class="btn">缴费说明</span>
-            </div>
-            <div class="info" :class="!init_ch ? 'info_show' : ''">
-              <span>{{ parkInfoEntity.payinstruction }}</span>
-            </div>
-          </div>
-          <div
-            class="top_down"
-            @click="top_display"
-            v-if="
-              !init_ch &&
-              parkInfoEntity.payinstruction &&
-              parkInfoEntity.payinstruction.length > 60
-            "
-          >
-            ︾
-          </div>
-          <div class="top_down" @click="top_display" v-else>︽</div>
           <div
             :class="{
               top_menu: true,
@@ -90,6 +61,7 @@
             'parkingFee-bottom': true,
             'blue-parkingFee-bottom': custTypeId === 1,
             'green-parkingFee-bottom': custTypeId === 2,
+            'pb65': carList.length < 1
           }"
         >
           <div class="parkingFee-search">
@@ -100,7 +72,7 @@
                   :class="carType == 0 ? 'search_tip_pt_index' : ''"
                   @click="toggleType(0)"
                 >
-                  普通车牌
+                  燃油车牌
                 </div>
                 <div
                   :class="carType == 1 ? 'search_tip_pt_index' : ''"
@@ -192,7 +164,6 @@
               </div>
             </div>
             <button
-              type="primary"
               class="search-btn"
               :class="disabledBtn ? 'disabled-btn' : ''"
               :disabled="disabledBtn"
@@ -219,6 +190,36 @@
             </div>
           </div>
         </div>
+        <div
+          :class="{
+              top_content: true,
+              blue_top_content: custTypeId === 1,
+              green_top_content: custTypeId === 2,
+            }"
+          :style="{
+              'background-image':
+                custTypeId === 1 ? `url(${picUrl}${blueHeadBg});` : '',
+            }"
+        >
+          <div class="title_box">
+            <span class="title">缴费说明</span>
+          </div>
+          <div class="info" :class="!init_ch ? 'info_show' : ''">
+            <span>{{ parkInfoEntity.payinstruction }}</span>
+          </div>
+          <div
+          class="top_down"
+          @click="top_display"
+          v-if="
+              !init_ch &&
+              parkInfoEntity.payinstruction &&
+              parkInfoEntity.payinstruction.length > 60
+            "
+        >
+        <van-icon name="arrow-down" />
+        </div>
+        <div class="top_down" @click="top_display" v-else><van-icon name="arrow-up" /></div>
+        </div>
       </div>
     </div>
     <plate-number
@@ -267,7 +268,7 @@ export default {
       numArr: ['', '', '', '', '', '', ''],
       active: null,
       carList: [], // 车辆列表
-      classifyList: ['普通车牌', '新能源', '特殊车牌'], // 车牌类型
+      classifyList: ['燃油车牌', '新能源', '特殊车牌'], // 车牌类型
       vehicleNumber: '',
       localimgPic: '',
       hourMoney: '',
@@ -331,6 +332,11 @@ export default {
   },
   async created(params) {},
   mounted() {
+    setTimeout(() => {
+      uni.setNavigationBarTitle({
+        title: "临时停车"
+      })
+    }, 300)
     if (this.openid) {
       this.openId = this.openid;
       this.getParkInfo();
@@ -440,6 +446,7 @@ export default {
           if (res.data.code === 0) {
             const data = res.data.data || {};
             this.carList = data.carList;
+            // this.carList = ['辽A98G89', '沪A98GHJ', '陕A98GHJ0', '沪A98GHJ0', '陕A98GHJ', '辽A98G89'];
             this.parkInfoEntity = data.parkInfoEntity;
             this.hourMoney =
               parseFloat(this.parkInfoEntity.needmoney) /
@@ -736,6 +743,9 @@ export default {
 };
 </script>
 <style lang="less" scoped>
+page {
+  background-color: #F4F7FF;
+}
 .scroll-Y {
   width: 100%;
   // display: flex;
@@ -761,53 +771,12 @@ export default {
       flex-direction: column;
       background-size: 100% 30%;
       // height: 350px;
-      // margin-bottom: 25px;
+       margin-bottom: 24px;
+      background: #FAFBFF;
+      border: 1px solid #D8DAE0;
+      border-top: none;
 
-      .top_content {
-        padding: 25px 35px;
-        box-sizing: border-box;
-        display: flex;
-        flex-direction: column;
 
-        span {
-          font-size: 24px;
-          color: #898989;
-          text-align: left;
-        }
-
-        .title_box {
-          display: flex;
-          align-items: center;
-          justify-content: space-between;
-          margin-bottom: 20px;
-
-          .btn {
-            padding: 0px 14px;
-            box-sizing: border-box;
-            border-radius: 20px;
-            font-size: 30px;
-            color: #000;
-            text-align: center;
-          }
-        }
-
-        .info {
-          padding-left: 18px;
-          font-size: 27px;
-          width: 95%;
-          color: #666;
-          line-height: 45px;
-        }
-
-        .info_show {
-          word-break: break-all;
-          text-overflow: ellipsis;
-          overflow: hidden;
-          display: -webkit-box;
-          -webkit-line-clamp: 2;
-          -webkit-box-orient: vertical;
-        }
-      }
 
       .blue_top_content {
         .color_top_content('blue');
@@ -844,20 +813,20 @@ export default {
     }
 
     .top_menu {
-      margin: 10px auto 0;
-      background: #fff;
-      padding-top: 50px;
+      //margin: 10px auto 0;
+      background: #FAFBFF;
+      padding: 50px 40px 30px;
       box-sizing: border-box;
       display: flex;
       justify-content: space-between;
-      border-radius: 15px;
+      //border-radius: 15px;
       // position: absolute;
       // left: 50%;
-      box-shadow: 0 0 5px #666;
+      //box-shadow: 0 0 5px #666;
       // transform: translateX(-50%);
-      top: 160px;
-      width: calc(100% - 50px);
-      height: 250px;
+      //top: 160px;
+      width: 100%;
+      //height: 220px;
 
       .menu_item {
         display: flex;
@@ -916,16 +885,23 @@ export default {
       width: 100%;
       display: flex;
       flex-direction: column;
-      padding: 14px 25px;
+      //padding: 14px 25px;
+      background: #FAFBFF;
+      border: 1px solid #D8DAE0;
       box-sizing: border-box;
-      padding-bottom: 65px;
+      // padding-bottom: 65px;
+      margin-bottom: 24px;
+      &.pb65 {
+        padding-bottom: 65px;
+      }
+
       // 车牌号查询
       .parkingFee-search {
         width: 100%;
         display: flex;
         flex-direction: column;
-        background: #fff;
-        border-radius: 15px;
+        //background: #fff;
+        //border-radius: 15px;
         padding: 26px 25px 20px;
         box-sizing: border-box;
 
@@ -938,23 +914,28 @@ export default {
           justify-content: space-between;
           align-items: center;
           font-size: 30px;
-
+          &:first-child{
+            font-size: 36px;
+            font-weight: 500;
+            color: #333333;
+            line-height: 50px;
+          }
           .search_tip_pt {
-            font-size: 28px;
+            font-size: 24px;
             width: 470px;
             display: flex;
             justify-content: space-around;
             align-items: center;
-            border: 1px solid #8d8d8d;
-            height: 70px;
-            color: #8d8d8d;
+            border: 1px solid #999999;
+            height: 54px;
+            color: #999999;
             overflow: hidden;
             border-radius: 50px;
 
             div {
               height: 100%;
               border-radius: 50px;
-              line-height: 65px;
+              line-height: 54px;
               text-align: center;
             }
 
@@ -972,7 +953,9 @@ export default {
 
             .search_tip_pt_index {
               color: #fff;
-              background-image: linear-gradient(to right, #7e4fa1, #433c7f);
+              //background-image: linear-gradient(to right, #7e4fa1, #433c7f);
+              //background-image: linear-gradient(to right, #7e4fa1, #433c7f);
+              background-color: #064C8A;
             }
           }
         }
@@ -982,7 +965,7 @@ export default {
           width: 100%;
           height: 100px;
           margin: auto;
-          background: rgba(255, 255, 255, 1);
+          background: #F4F7FF;
           border-radius: 0.4rem;
           margin: 1rem auto;
           display: flex;
@@ -997,7 +980,7 @@ export default {
             display: flex;
             align-items: center;
             justify-content: center;
-            color: #703a98;
+            color: #000000;
 
             img {
               width: 80%;
@@ -1005,7 +988,7 @@ export default {
             }
 
             &.active {
-              border-color: #3e67ff;
+              border-color: #064C8A;
             }
           }
 
@@ -1014,7 +997,7 @@ export default {
             justify-content: center;
             align-items: center;
             font-size: 120px;
-            color: #703a98;
+            color: #000000;
           }
         }
 
@@ -1023,11 +1006,12 @@ export default {
           margin: 0 auto;
           height: 90px;
           width: 98%;
-          line-height: 90px;
+          line-height: 50px;
           border-radius: 80px;
-          font-size: 34px;
+          font-size: 36px;
           text-align: center;
-          background-image: linear-gradient(to right, #7e4fa1, #433c7f);
+          //background-image: linear-gradient(to right, #7e4fa1, #433c7f);
+          background-color: #064C8A;
         }
 
         .disabled-btn {
@@ -1076,14 +1060,15 @@ export default {
             box-sizing: border-box;
             border: 2px solid #dcdcdc;
             line-height: 60px;
-            font-size: 26px;
-            border-radius: 10px;
-            color: #a5a5a5;
+            font-size: 28px;
+            border-radius: 30px;
+            color: #666666;
+            background-color: #F4F7FF;
           }
 
           .vehicleMgt-content_cls {
-            color: #703a98;
-            border: 2px solid #703a98;
+            color: #F4F7FF;
+            border: 2px solid #064C8A;
           }
 
           // .item::after {
@@ -1132,7 +1117,68 @@ export default {
         }
       }
     }
+    .top_content {
+      padding: 30px 30px;
+      margin-bottom: constant(safe-area-inset-bottom); // 兼容 IOS<11.2
+      margin-bottom: env(safe-area-inset-bottom); // 兼容 IOS>=11.2
+      box-sizing: border-box;
+      display: flex;
+      flex-direction: column;
+
 
+      //width: 750px;
+      //height: 280px;
+      background: #FAFBFF;
+      border: 1px solid #D8DAE0;
+
+      span {
+        font-size: 24px;
+        color: #898989;
+        text-align: left;
+      }
+
+      .title_box {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        // margin-bottom: 20px;
+        .title {
+          // padding: 0px 14px;
+          box-sizing: border-box;
+          border-radius: 20px;
+          font-size: 36px;
+          color: #000;
+          font-weight: 500;
+          text-align: left;
+          line-height: 50px;
+        }
+      }
+
+      .info {
+        // padding-left: 18px;
+        font-size: 30px;
+        width: 100%;
+        color: #999999;
+        line-height: 45px;
+      }
+
+      .info_show {
+        word-break: break-all;
+        text-overflow: ellipsis;
+        overflow: hidden;
+        display: -webkit-box;
+        -webkit-line-clamp: 2;
+        -webkit-box-orient: vertical;
+      }
+      .top_down {
+        margin-top: 20px;
+        width: 100%;
+        // font-size: 20PX;
+        line-height: 20px;
+        text-align: center;
+        color: #999999;
+      }
+    }
     .blue-parkingFee-bottom {
       .color-parkingFee-bottom('blue');
     }

+ 40 - 29
src/pages/parkingFee/parkingFeeDetail.vue

@@ -516,35 +516,43 @@ export default {
   mounted() {
     console.log('页面被打开了');
     console.log('订单时间:' + this.orderCreateTime);
-    log.info('订单时间:' + this.orderCreateTime);
-    return;
-    this.isPageHide = false;
-    // 如果订单时间+3分钟-当前时间<=0 刷新订单
-    if (this.orderCreateTime) {
-      const countDownTime = moment(this.orderCreateTime)
-        .add(180, 's')
-        .diff(moment(), 's');
-      console.log('剩余时间:' + countDownTime);
-      log.info('剩余时间:' + countDownTime);
-      if (countDownTime <= 0) {
-        setTimeout(() => {
-          this.createParkOrder();
-        }, 300);
-      } else {
-        this.refreshTime = countDownTime;
+    // log.info('订单时间:' + this.orderCreateTime);
+    // return;
+    // 用户加载页面是计算规则
+    if (
+      this.isInit &&
+      this.isInit?.projectId &&
+      this.isInit?.member?.vipcode
+    ) {
+      this.isPageHide = false;
+      // 如果订单时间+3分钟-当前时间<=0 刷新订单
+      if (this.orderCreateTime) {
+        const countDownTime = moment(this.orderCreateTime)
+          .add(180, 's')
+          .diff(moment(), 's');
+        console.log('剩余时间:' + countDownTime);
+        log.info('剩余时间:' + countDownTime);
+        if (countDownTime <= 0) {
+          setTimeout(() => {
+            this.createParkOrder();
+          }, 300);
+        } else {
+          this.refreshTime = countDownTime;
+        }
       }
-    }
+      return
 
-    // 优惠减免(首停、会员、消费)
-    this.checkedTotal = uni.getStorageSync('checkedTotal');
-    this.discountTotal = uni.getStorageSync('discountTotal');
+      // 优惠减免(首停、会员、消费)
+      this.checkedTotal = uni.getStorageSync('checkedTotal');
+      this.discountTotal = uni.getStorageSync('discountTotal');
 
-    // 电子券减免(停车券)
-    this.couponInfo = uni.getStorageSync('couponInfo');
-    this.checkedCouponCount = uni.getStorageSync('checkedCouponList').length;
+      // 电子券减免(停车券)
+      this.couponInfo = uni.getStorageSync('couponInfo');
+      this.checkedCouponCount = uni.getStorageSync('checkedCouponList').length;
 
-    // 纸质优惠券
-    this.paperCouponInfo = uni.getStorageSync('paperCouponInfo');
+      // 纸质优惠券
+      this.paperCouponInfo = uni.getStorageSync('paperCouponInfo');
+    }
   },
   onHide() {
     this.isPageHide = true;
@@ -620,6 +628,7 @@ export default {
           createuser: 'sys_miniprogram',
         };
         this.$md(params);
+        console.log(623)
         // console.log(567, this.$baseURL + 'api/1.0/park/createParkOrderAndCarFee')
         console.log({
           // path: this.$baseURL + 'api/1.0/park/createParkOrder',
@@ -750,7 +759,7 @@ export default {
               },
             });
           }
-          console.log(629);
+          console.log(629, this.member);
           if (this.member) {
             console.log(639);
             this.getDiscount();
@@ -1248,6 +1257,7 @@ export default {
 
     // 自动选取电子券减免
     autoCoupon(serviceFee) {
+      console.log('查看 actualFee 的状态', this.actualFee)
       // 支付金额0 则无需后续减免
       if (!this.actualFee) {
         return;
@@ -1447,6 +1457,7 @@ export default {
       this.checkedCouponCount = checkedCouponList.length;
 
       // 存入缓存(用于子页面停车优惠画面显示)
+      console.log('将 checkedCouponList 写入缓存----》')
       uni.setStorageSync('checkedCouponList', checkedCouponList);
       uni.setStorageSync('list', couponList);
       uni.setStorageSync('couponInfo', this.couponInfo);
@@ -1593,8 +1604,8 @@ export default {
     // 支付
     goPay() {
       console.log(159515951595,  this.$kipAppId)
-      this.kerryPayment()
-      return
+      // this.kerryPayment()
+      // return
       // console.log(1580, this.parkMallCode);
       // window.toWXSendMsg({
       //   type: 'openWxPay',
@@ -1628,7 +1639,7 @@ export default {
         openId: openId,
         vipcode: this.member?.vipcode || uni.getStorageSync('member')?.vipcode,
         createuser: 'sys_miniprogram',
-        orderno: this.parkInfo.orderno || '7719219221312412c21v3218o',
+        orderno: this.parkInfo.orderno || '7719219221312412c21v3218u',
         bonusfee: this.bonusfee * 100,
         bonus: bonus,
         couponfee: this.couponInfo.couponfee * 100 || 0,

+ 5 - 0
src/pages/parkingFee/parkingFeeList.vue

@@ -121,6 +121,11 @@ export default {
     };
   },
   mounted() {
+    setTimeout(() => {
+      uni.setNavigationBarTitle({
+        title: "缴费记录"
+      })
+    }, 300)
     this.list = [];
     // 重新获取数据
     canloading = true;

+ 1 - 1
src/utils/cache-tool.js

@@ -5,7 +5,7 @@ export default {
     const href = `${window.location.href}`
     // dev
     if(/8080|dev-crm-kpl/g.test(href)) {
-      this.setEnv('dev')
+      this.setEnv('qa')
       return
     }
     // qa

+ 13 - 1
src/utils/uniHooks.js

@@ -51,12 +51,23 @@ function showToast({ title, duration, icon }) {
   }
   if (window?.toWXSendMsg) {
     window?.toWXSendMsg({
-      type: 'showToast',
+      type: 'uni_func',
+      funcName: 'showToast',
       options: params,
     });
   }
 }
 
+function setNavigationBarTitle({ title }) {
+  if (window?.toWXSendMsg) {
+    window?.toWXSendMsg({
+      type: 'uni_func',
+      funcName: 'setNavigationBarTitle',
+      options: {title},
+    });
+  }
+}
+
 function navigateTo({ title }) {
   console.log('navigateTo');
 }
@@ -134,4 +145,5 @@ export default {
   login,
   request,
   requestPayment,
+  setNavigationBarTitle
 };

+ 41 - 3
yarn.lock

@@ -921,7 +921,7 @@
     "@babel/types" "^7.4.4"
     esutils "^2.0.2"
 
-"@babel/runtime@^7.11.0", "@babel/runtime@^7.8.4", "@babel/runtime@~7.17.9":
+"@babel/runtime@7.x", "@babel/runtime@^7.11.0", "@babel/runtime@^7.8.4", "@babel/runtime@~7.17.9":
   version "7.17.9"
   resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72"
   integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==
@@ -974,6 +974,13 @@
   dependencies:
     "@better-scroll/shared-utils" "^2.4.2"
 
+"@better-scroll/observe-dom@^2.4.2":
+  version "2.4.2"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@better-scroll/observe-dom/-/observe-dom-2.4.2.tgz#cc1e6d82a8f53525c282c9a4bcea5d1be8c21c95"
+  integrity sha512-eeS77CZs+V72dkya10e5ptndBAbhQVcXoYGvfoIihOJgCPqO5MdYTpzRmlbshYCEE5juUMLe82Kx8FSbOejpAw==
+  dependencies:
+    "@better-scroll/core" "^2.4.2"
+
 "@better-scroll/pull-up@^2.4.2":
   version "2.4.2"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@better-scroll/pull-up/-/pull-up-2.4.2.tgz#25357ceef7bac7520930f0631896b63a10f82a6f"
@@ -1547,6 +1554,21 @@
   dependencies:
     "@types/yargs-parser" "*"
 
+"@vant/icons@^1.7.1":
+  version "1.8.0"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@vant/icons/-/icons-1.8.0.tgz#36b13f2e628b533f6523a93a168cf02f07056674"
+  integrity sha512-sKfEUo2/CkQFuERxvkuF6mGQZDKu3IQdj5rV9Fm0weJXtchDSSQ+zt8qPCNUEhh9Y8shy5PzxbvAfOOkCwlCXg==
+
+"@vant/popperjs@^1.1.0":
+  version "1.3.0"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@vant/popperjs/-/popperjs-1.3.0.tgz#e0eff017124b5b2352ef3b36a6df06277f4400f2"
+  integrity sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==
+
+"@vue/babel-helper-vue-jsx-merge-props@^1.0.0":
+  version "1.4.0"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz#8d53a1e21347db8edbe54d339902583176de09f2"
+  integrity sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==
+
 "@vue/babel-helper-vue-jsx-merge-props@^1.2.1":
   version "1.2.1"
   resolved "https://registry.npmmirror.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81"
@@ -2350,9 +2372,9 @@ babel-plugin-dynamic-import-node@^2.3.3:
   dependencies:
     object.assign "^4.1.0"
 
-babel-plugin-import@^1.11.0:
+babel-plugin-import@^1.13.5:
   version "1.13.5"
-  resolved "https://registry.npmmirror.com/babel-plugin-import/-/babel-plugin-import-1.13.5.tgz#42eed1c5afd9a35ee1b1f8fe922b07c44077d753"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/babel-plugin-import/-/babel-plugin-import-1.13.5.tgz#42eed1c5afd9a35ee1b1f8fe922b07c44077d753"
   integrity sha512-IkqnoV+ov1hdJVofly9pXRJmeDm9EtROfrc5i6eII0Hix2xMs5FEm8FG3ExMvazbnZBbgHIt6qdO8And6lCloQ==
   dependencies:
     "@babel/helper-module-imports" "^7.0.0"
@@ -10004,6 +10026,17 @@ validate-npm-package-license@^3.0.1:
     spdx-correct "^3.0.0"
     spdx-expression-parse "^3.0.0"
 
+vant@^2.12.50:
+  version "2.12.50"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/vant/-/vant-2.12.50.tgz#ee507a337e6e00b18acbf174cfaf1c5e2f527a88"
+  integrity sha512-WKm+oc2pUh+spTzK6uCviHmOuZwuLOjg2bYmUFNJGbGPlcPFkGzOl32NR/SP4rBvGopA6s32Mkp2key46qNOzA==
+  dependencies:
+    "@babel/runtime" "7.x"
+    "@vant/icons" "^1.7.1"
+    "@vant/popperjs" "^1.1.0"
+    "@vue/babel-helper-vue-jsx-merge-props" "^1.0.0"
+    vue-lazyload "1.2.3"
+
 vary@~1.1.2:
   version "1.1.2"
   resolved "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
@@ -10033,6 +10066,11 @@ vue-hot-reload-api@^2.3.0:
   resolved "https://registry.npmmirror.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2"
   integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==
 
+vue-lazyload@1.2.3:
+  version "1.2.3"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/vue-lazyload/-/vue-lazyload-1.2.3.tgz#901f9ec15c7e6ca78781a2bae4a343686bdedb2c"
+  integrity sha512-DC0ZwxanbRhx79tlA3zY5OYJkH8FYp3WBAnAJbrcuoS8eye1P73rcgAZhyxFSPUluJUTelMB+i/+VkNU/qVm7g==
+
 "vue-loader-v16@npm:vue-loader@^16.1.0":
   version "16.8.3"
   resolved "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz#d43e675def5ba9345d6c7f05914c13d861997087"