huangzhe 3 anni fa
commit
c41b8fa8d1
100 ha cambiato i file con 29025 aggiunte e 0 eliminazioni
  1. 5 0
      .gitignore
  2. 16 0
      .hbuilderx/launch.json
  3. 478 0
      README.md
  4. 50 0
      babel.config.js
  5. 21 0
      config.extra.h5.js
  6. 1 0
      config.extra.js
  7. 7 0
      config.extra.miniProgram.js
  8. 26 0
      css.append.js
  9. 45 0
      doc/api.md
  10. 1072 0
      doc/components.md
  11. 64 0
      no.plugins.js
  12. 11543 0
      package-lock.json
  13. 71 0
      package.json
  14. 11 0
      postcss.config.js
  15. 68 0
      project.config.json
  16. 1 0
      public/ap.js
  17. 37 0
      public/index.html
  18. 102 0
      public/pay.html
  19. 50 0
      remove.otiose.js
  20. 20 0
      src/.hbuilderx/launch.json
  21. 144 0
      src/App.vue
  22. 256 0
      src/components/basic-component/app-button/app-button.vue
  23. 73 0
      src/components/basic-component/app-cart-image/app-cart-image.vue
  24. 128 0
      src/components/basic-component/app-check-box/app-check-box.vue
  25. 178 0
      src/components/basic-component/app-city-swiper/app-city-swiper.vue
  26. 201 0
      src/components/basic-component/app-close/app-close.vue
  27. 210 0
      src/components/basic-component/app-composition/app-composition.vue
  28. 115 0
      src/components/basic-component/app-css-icon/app-css-icon.vue
  29. 167 0
      src/components/basic-component/app-datetime-picker/app-datetime-picker.vue
  30. 42 0
      src/components/basic-component/app-empty-bottom/app-empty-bottom.vue
  31. 30 0
      src/components/basic-component/app-empty/app-empty.vue
  32. 67 0
      src/components/basic-component/app-form-id/app-form-id.vue
  33. 1140 0
      src/components/basic-component/app-goods/app-goods.vue
  34. 43 0
      src/components/basic-component/app-hotspot/app-hotspot.vue
  35. 69 0
      src/components/basic-component/app-image/app-image.vue
  36. 230 0
      src/components/basic-component/app-input/app-input.vue
  37. 40 0
      src/components/basic-component/app-iphone-x/app-iphone-x.vue
  38. 444 0
      src/components/basic-component/app-jump-button/app-jump-button.vue
  39. 259 0
      src/components/basic-component/app-layout/app-coupon-modal/app-coupon-modal.vue
  40. 383 0
      src/components/basic-component/app-layout/app-layout.vue
  41. 899 0
      src/components/basic-component/app-layout/app-payment/app-payment.vue
  42. 151 0
      src/components/basic-component/app-layout/app-permissions-auth/app-permissions-auth.vue
  43. 300 0
      src/components/basic-component/app-layout/app-user-login/app-user-login.vue
  44. 140 0
      src/components/basic-component/app-layout/bd-mandatory-attention/bd-mandatory-attention.vue
  45. 174 0
      src/components/basic-component/app-layout/u-authorized-iphone/u-authorized-iphone.vue
  46. 24 0
      src/components/basic-component/app-load-text/app-load-text.vue
  47. BIN
      src/components/basic-component/app-load-text/image/load.gif
  48. 109 0
      src/components/basic-component/app-loading/app-loading.vue
  49. 202 0
      src/components/basic-component/app-model/app-model.vue
  50. BIN
      src/components/basic-component/app-model/image/close.png
  51. 186 0
      src/components/basic-component/app-order/app-form-data.vue
  52. 120 0
      src/components/basic-component/app-preview-image/app-preview-image.vue
  53. 90 0
      src/components/basic-component/app-prompt-box/app-prompt-box.vue
  54. 150 0
      src/components/basic-component/app-radio/app-radio-group.vue
  55. 108 0
      src/components/basic-component/app-radio/app-radio.vue
  56. BIN
      src/components/basic-component/app-radio/image/yes.png
  57. 112 0
      src/components/basic-component/app-report-error/app-report-error.vue
  58. 28 0
      src/components/basic-component/app-rich/components/wxParseAudio.vue
  59. 114 0
      src/components/basic-component/app-rich/components/wxParseImg.vue
  60. 52 0
      src/components/basic-component/app-rich/components/wxParseTable.vue
  61. 143 0
      src/components/basic-component/app-rich/components/wxParseTemplate0.vue
  62. 139 0
      src/components/basic-component/app-rich/components/wxParseTemplate1.vue
  63. 15 0
      src/components/basic-component/app-rich/components/wxParseVideo.vue
  64. 234 0
      src/components/basic-component/app-rich/libs/html2json.js
  65. 126 0
      src/components/basic-component/app-rich/libs/htmlparser.js
  66. 210 0
      src/components/basic-component/app-rich/libs/wxDiscode.js
  67. 228 0
      src/components/basic-component/app-rich/parse.scss
  68. 138 0
      src/components/basic-component/app-rich/parse.vue
  69. 82 0
      src/components/basic-component/app-switch-tab/app-switch-tab.vue
  70. 110 0
      src/components/basic-component/app-tab-bar/app-tab-bar.vue
  71. 110 0
      src/components/basic-component/app-tab-nav/app-tab-nav.vue
  72. 153 0
      src/components/basic-component/app-tabs/app-tabs.vue
  73. 25 0
      src/components/basic-component/app-text/app-text.vue
  74. 162 0
      src/components/basic-component/app-textarea/app-textarea.vue
  75. 55 0
      src/components/basic-component/app-timer/app-timer.vue
  76. 302 0
      src/components/basic-component/app-upload-image/app-upload-image.vue
  77. 219 0
      src/components/basic-component/u-count-to/u-count-to.vue
  78. 85 0
      src/components/basic-component/u-mask/u-mask.vue
  79. 322 0
      src/components/basic-component/u-popup/u-popup.vue
  80. 424 0
      src/components/basic-component/u-tabs-swiper/u-tabs-swiper.vue
  81. 199 0
      src/components/basic-component/uni-swiper-dot/uni-swiper-dot.vue
  82. 151 0
      src/components/page-component/app-account-balance/app-account-balance.vue
  83. 67 0
      src/components/page-component/app-account-balance/app-account-style.vue
  84. 146 0
      src/components/page-component/app-ad/app-ad.vue
  85. 347 0
      src/components/page-component/app-area-picker/app-area-picker.vue
  86. 240 0
      src/components/page-component/app-associated-link/app-associated-link.vue
  87. 1200 0
      src/components/page-component/app-attr/app-attr.vue
  88. 125 0
      src/components/page-component/app-buy-prompt/app-buy-prompt.vue
  89. 195 0
      src/components/page-component/app-cash-model/app-cash-model.vue
  90. 94 0
      src/components/page-component/app-category-list/app-category-list.vue
  91. 87 0
      src/components/page-component/app-check-in/app-check-in.vue
  92. 55 0
      src/components/page-component/app-check-in/check-in-award.js
  93. 197 0
      src/components/page-component/app-clerk-historys/app-clerk-historys.vue
  94. 103 0
      src/components/page-component/app-common/app-wechat-share.vue
  95. 56 0
      src/components/page-component/app-copyright/app-copyright.vue
  96. 177 0
      src/components/page-component/app-coupon-center/app-coupon-center.vue
  97. 246 0
      src/components/page-component/app-customer/app-customer.vue
  98. 122 0
      src/components/page-component/app-diy-form/app-diy-form-checkbox-group.vue
  99. 861 0
      src/components/page-component/app-diy-form/app-diy-form.vue
  100. 209 0
      src/components/page-component/app-diy-goods-list/app-diy-composition-image.vue

+ 5 - 0
.gitignore

xqd
@@ -0,0 +1,5 @@
+dist
+
+src/unpackage/
+
+node_modules

+ 16 - 0
.hbuilderx/launch.json

xqd
@@ -0,0 +1,16 @@
+{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version": "0.0",
+    "configurations": [{
+     	"default" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"mp-weixin" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"type" : "uniCloud"
+     }
+    ]
+}

+ 478 - 0
README.md

xqd
@@ -0,0 +1,478 @@
+[TOC]
+
+# 凡云商城v4小程序端
+
+##前置条件
+
+###开发者需要掌握的
+
+- Html
+
+- Javascript(ES6)
+
+- CSS(Sass)
+
+- 小程序开发(微信为主、支付宝、百度、字节跳动)
+
+- <a href="https://cn.vuejs.org/index.html" target="_blank">Vue</a>
+
+- <a href="https://uniapp.dcloud.io/" target="_blank">Uni-app</a>
+
+### 运行环境
+
+Node.js + 小程序开发者工具
+
+## 安装、运行
+
+1. 命令行切换到代码目录下,执行以下命令安装依赖
+
+    ```shell script
+    npm install
+    ```
+
+2. 创建配置下面两个文件
+
+    /src/siteInfo.js文件
+	小程序配置如下:
+    ```javascript
+    module.exports = {
+        'acid': -1,
+        'version': '1.0.0',
+        'siteroot': 'http://localhost/app/index.php',
+        'apiroot': 'https://localhost/web/index.php?_mall_id=1',
+    };
+    ```
+	h5配置如下:
+	```javascript
+	let siteInfo = {
+	    'acid': -1,
+	    'version': '1.0.0',
+	    'apiroot': 'https://localhost/web/index.php?_mall_id=1',
+		'id': '1',
+	};
+	```
+   
+   修改`apiroot`成自己的服务器路径,`_mall_id`可从后台的`小程序商城`列表获取到ID,id为后台的`小程序商城`列表获取到ID
+
+    /src/manifest.json文件
+
+    ```json
+    {
+      "name": "zjhj_bd_app",
+      "appid": "",
+      "description": "",
+      "versionName": "1.0.0",
+      "versionCode": "100",
+      "transformPx": false,
+      "uniStatistics": {
+        "enable": false
+      },
+      "app-plus": {
+      },
+      "quickapp": {
+      },
+      "mp-weixin": {
+        "appid": "",
+        "setting": {
+          "urlCheck": false
+        },
+        "usingComponents": true,
+        "permission": {
+          "scope.userLocation": {
+            "desc": "请求获取您的位置信息"
+          }
+        }
+      },
+      "mp-alipay": {
+        "usingComponents": true
+      },
+      "mp-baidu": {
+        "appid": "",
+        "usingComponents": true
+      },
+      "mp-toutiao": {
+        "appid": "",
+        "usingComponents": true,
+        "urlCheck": false
+      },
+      "mp-qq": {
+        "usingComponents": true
+      },
+	  "h5": {
+	    "async": {
+	      "loading": "AsyncLoading",
+	      "error": "AsyncError",
+	      "delay": 2000,
+	      "timeout": 10000
+	    },
+	    "uniStatistics" : {
+	      "enable" : true
+	    },
+        "publicPath" : "/addons/zjhj_bd/h5/",
+        "router" : {
+            "base" : "/addons/zjhj_bd/h5/",
+            "mode" : "hash"
+        },
+	    "sdkConfigs": {
+	      "maps": {
+	        "qqmap": {
+	          // 腾讯地图秘钥(key)https://lbs.qq.com/dev/console/key/manage
+	          "key": ""
+	        }
+	      }
+	    }
+	  },
+    }
+    ```
+   
+   `mp-weixin/appid`填写上微信小程序的appid
+   
+   h5编译时需要注意文件路径问题:目前需要将h5编译后的文件解压到`域名根目录/addons/zjhj_bd/h5/`路径下;
+
+3. 编译代码
+  
+    编译微信小程序
+    
+    ```shell script
+    npm run dev:mp-weixin
+    ```
+
+    会在dist/dev下生成mp-weixin文件夹,用微信开发者工具打开即可预览小程序
+
+    各个平台编译命令:
+    ```
+    // 微信
+    npm run dev:mp-weixin
+    
+    // 支付宝
+    npm run dev:mp-alipay
+    
+    // 百度
+    npm run dev:mp-baidu
+    
+    // 字节跳动
+    npm run dev:mp-toutiao
+    ```
+
+## 规范
+
+### Git规范
+
+- dev为公共开发分支,开发提交的内容请提交至dev;
+
+- git提交尽量以每一项修改提交一次,尽量不要多项修改一次提交,备注信息请勿提交“111”,“aaaa”这样不明意思的内容;
+
+- 项目发布后,涉及到比较大的改动或新功能开发,建议自己创建分支进行开发;
+
+- 自己创建的分支需要经常把dev合并到自己的分支,以面差异过多产生冲突;
+
+- 自己分支开发的内容确认开发完成需要测试时,合并到dev分支;
+
+### 代码基础规范
+
+- 必须以4个空格缩进,并保持代码缩进整齐;
+
+- 代码结尾必须以分号结尾;
+
+- Html代码标签属性使用双引号,示例
+
+    ```html
+    <view msg="hello"></view><!--正确示范-->
+    <view msg='hello'></view><!--错误示范-->
+    ```
+
+- JavaScript代码字符串优先使用''或``,示例
+
+    ```javascript
+    const str = 'hello'; // 正确示范
+    const str = `hello`; // 正确示范
+    
+    const str = "hello"; // 错误示范
+    ```
+
+- 组件命名使用app-xxx-xxx的格式;
+
+### 开发基础组件
+
+请给写的公共组件写一个使用文档,在doc/components.md。
+
+### FormId记录
+
+尽可能的使用app-form-id组件套可点击的位置,以记录formid发送模板消息用。
+
+### 样式
+
+- 全局scss 变量定义 ./uni.scss;
+
+- 主题颜色 ./static/css/themeColor.scss;
+
+- 弹性布局 ./static/css/flex.scss;
+
+### 静态图片
+
+- 通用图片 .https://shop.9026.com/web/statics/image/mall/static/
+
+- 单独图片 组件下或页面下 ./image/
+
+### 层级(z-index)
+
+- 普通悬浮组件(低于底部导航):<1500
+
+- 底部导航:1500
+
+- 悬浮组件(高于底部导航):>1500
+
+## 代码说明
+
+### 目录结构
+
+/src目录
+
+    ```
+    components      // 公共组件
+    core            // 小程序核心代码
+    └──  apiUrl.js      // 服务器端API接口配置
+    pages           // 页面代码
+    plugins         // 插件代码
+    static          // 图片、样式
+    store           // vuex
+    App.vue         // 小程序生命周期控制
+    main.js         // 入口文件
+    manifest.json   // 小程序配置
+    pages.json      // 页面路由配置
+    siteinfo.js     // 服务器路径配置
+    uni.scss        // 全局样式
+    ```
+
+### 生命周期
+
+页面的生命周期使用页面的生命周期,参见
+
+[https://uniapp.dcloud.io/frame?id=页面生命周期]
+
+组件生命周期使用vue组件的生命周期,参见
+
+[https://cn.vuejs.org/v2/guide/instance.html#实例生命周期钩子]
+
+### 主题色
+  ```html
+    <!--   组件形式-->
+    <component :theme="theme"></component>
+    <!--  标签形式-->
+    <view :class="[`${theme}-background`, `${theme}-color`]"></view>
+  ```
+
+````javascript
+    export default {
+        props: {
+            theme: {
+                default: 'classic-red', // 统一整个颜色为默认主题色
+                type: String,
+            }
+        }
+    }
+````
+### 公共代码 - app-layout
+- 每一个page页面请用,如下代码书写:
+````html
+<template>
+    <app-layout>
+    </app-layout>
+</template>
+````
+
+### 组件使用规范
+
+#### 样式 穿透
+- 在vue文件中的style标签上,有一个特殊的属性:scoped。
+当一个style标签拥有scoped属性时,
+它的CSS样式就只能作用于当前的组件,
+也就是说,该样式只能适用于当前组件元素。
+通过该属性,可以使得组件之间的样式不互相污染。
+如果一个项目中的所有style标签全部加上了scoped,相当于实现了样式的模块化。
+````html
+<style>
+    /* global styles */
+</style>
+````
+
+````html
+<style scoped>
+    /* local styles */
+</style>
+````
+
+- 编译前
+
+````html
+<style scoped>
+    .example {
+      color: red;
+    }
+</style>
+
+<template>
+    <div class="example">hi</div>
+</template>
+
+````
+
+- 编译后
+
+````html
+<style>
+    .example.data-v-5558831a. {
+      color: red;
+    }
+</style>
+
+<template>
+  <div class="example" data-v-5558831a>hi</div>
+</template>
+````
+
+穿透方法
+````
+<style scoped>
+    外层 /deep/ 第三方组件 {
+        样式
+    }
+</style>
+````
+### 组件使用方法
+- 开发是在组件外部套上 view 标签 目的: 平台样式兼容处理
+
+````html
+    <template>
+        <app-layout>
+            <view>
+                <app-component></app-component>
+            </view>
+        </app-layout>
+    </template>
+````
+
+````javascript
+import appComponent from "../component/app-component.vue";
+export default {
+    components: {
+        'app-component': appComponent,
+    }
+}
+````
+### 全局组件挂载
+- uni-app 支持配置全局组件,需在 main.js 里进行全局注册,注册后就可在所有页面里使用该组件。
+
+ main.js 里进行全局导入和注册
+ ````javascript
+ import Vue from 'vue';
+ import pageHead from './components/page-head.vue';
+ Vue.component('page-head',pageHead);
+ ````
+ index.vue 里可直接使用组件
+ ````html
+ <template>
+   <view>
+     <page-head></page-head>
+     </view>
+ </template>
+ ````
+
+### 网络请求
+- api request 已挂载在全局
+````javascript
+Vue.use({
+    install(Vue, options) {
+        // 接口 路径
+        Vue.prototype.$api = Api;
+        // 请求
+        Vue.prototype.$request = request;
+    },
+});
+````
+
+- 使用方法
+````javascript
+    this.$request({
+        url: this.$api.index.config,
+    });
+````
+
+### vuex
+
+- modules 模块化 以及 组件中引入 mapGetters、mapActions 和 mapStates的使用
+index.js
+````javascript
+    import Vue from 'vue';
+    import Vuex from 'vuex';
+    // 模块引入
+    import user from './modules/user.js';
+    import mallConfig from './modules/mallConfig.js';
+    
+    Vue.use(Vuex);
+    
+    export default new Vuex.Store({
+        modules:{
+             user: user,
+             mallConfig: mallConfig,
+        }
+    });
+````
+
+````javascript
+    // user.js
+    const state={
+        userName: '',  //初始化数据
+    };
+    const getters={
+          getUserName(state){ // 获取数据
+            return state.userName;
+          }
+    };
+    const mutations={// 只能做同步操作
+         setUserName(state,data){ //如何变化collects,插入items
+            state.userName = data
+         }
+     };
+    const actions={// 可以做异步操作
+        actionsUserName(context,item){ // 调用setUserName ,传入数据形参item 对应到items
+            return new Promise((resolve, reject) => {
+                context.commit('setUserName',item);
+            });
+        }
+    };
+    export default {
+         namespaced:true,//用于在全局引用此文件里的方法时标识这一个的文件名
+         state,
+         getters,
+         mutations,
+         actions
+    }
+````
+````javascript
+import { mapState,mapGetters,mapActions } from 'vuex';
+export default {
+    computed: {
+        ...mapState({ //ES6的语法,意思是state里有多少属性值我可以在这里放多少属性值
+            userName: state=> state.user.userName
+        }),
+        ...mapGetters('user',{ //用mapGetters来获取user.js里面的getters
+          userName: 'getUserName'
+        })
+    },
+    mounted() {
+        this.$store.dispatch('user/actionsUserName'); // 执行 user.js里的 actions里的方法
+    },
+    methods: {
+        ...mapActions('user',[ //user是指modules文件夹下的user.js
+          'actionsUserName'  //user.js文件中的actions里的方法,在上面的@click中执行并传入实参
+        ])
+    }
+}
+````
+
+### 条件编译
+
+不同平台下编译出不同代码
+
+[https://uniapp.dcloud.io/platform](https://uniapp.dcloud.io/platform)

+ 50 - 0
babel.config.js

xqd
@@ -0,0 +1,50 @@
+const plugins = [];
+
+if (process.env.UNI_PLATFORM === 'app-plus' && process.env.UNI_USING_V8) {
+  const path = require('path');
+
+  const isWin = /^win/.test(process.platform);
+
+  const normalizePath = path => (isWin ? path.replace(/\\/g, '/') : path);
+
+  const input = normalizePath(process.env.UNI_INPUT_DIR);
+  try {
+    plugins.push([
+      require('@dcloudio/vue-cli-plugin-hbuilderx/packages/babel-plugin-console'),
+      {
+        file (file) {
+          file = normalizePath(file);
+          if (file.indexOf(input) === 0) {
+            return path.relative(input, file);
+          }
+          return false;
+        }
+      }
+    ])
+  } catch (e) {}
+}
+
+process.UNI_LIBRARIES = process.UNI_LIBRARIES || ['@dcloudio/uni-ui'];
+process.UNI_LIBRARIES.forEach(libraryName => {
+  plugins.push([
+    'import',
+    {
+      'libraryName': libraryName,
+      'customName': (name) => {
+        return `${libraryName}/lib/${name}/${name}`
+      }
+    }
+  ])
+});
+module.exports = {
+  presets: [
+    [
+      '@vue/app',
+      {
+        modules: 'commonjs',
+        useBuiltIns: 'entry'
+      }
+    ]
+  ],
+  plugins
+};

+ 21 - 0
config.extra.h5.js

xqd
@@ -0,0 +1,21 @@
+const path = require('path');
+module.exports = {
+    externals: {
+        'siteInfo': 'siteInfo',
+        'appVersion': 'version'
+    },
+    copy: [
+        {
+            from: path.join(__dirname, 'public/ap.js'),
+            to: path.join(__dirname, 'dist', process.env.NODE_ENV === 'production' ? 'build' : 'dev', process.env.UNI_PLATFORM, 'ap.js')
+        },
+        {
+            from: path.join(__dirname, 'public/pay.html'),
+            to: path.join(__dirname, 'dist', process.env.NODE_ENV === 'production' ? 'build' : 'dev', process.env.UNI_PLATFORM, 'pay.html')
+        },
+        {
+            from: path.join(__dirname, 'src/pages/registered/image'),
+            to: path.join(__dirname, 'dist', process.env.NODE_ENV === 'production' ? 'build' : 'dev', process.env.UNI_PLATFORM, 'pages/registered/image')
+        },
+    ]
+};

+ 1 - 0
config.extra.js

xqd
@@ -0,0 +1 @@
+module.exports = process.env.UNI_PLATFORM === 'h5' ? require('./config.extra.h5.js') : require('./config.extra.miniProgram.js');

+ 7 - 0
config.extra.miniProgram.js

xqd
@@ -0,0 +1,7 @@
+module.exports = {
+    externals: {
+        'siteInfo': 'commonjs2 ../siteinfo.js',
+        'appVersion': 'commonjs2 ../version.js'
+    },
+    copy: []
+};

+ 26 - 0
css.append.js

xqd
@@ -0,0 +1,26 @@
+'use strict';
+
+module.exports = {
+    apply(compiler) {
+        compiler.hooks.emit.tap('compilation', compilation => {
+            // 遍历所有资源文件
+            for (let filePathName in compilation.assets) {
+                if (/common\/main\.ttss/i.test(filePathName)) {
+                    console.log('\n-  字节跳动追加box-sizing:border-box...');
+                    // 获取文件内容
+                    let content = `*{-webkit-box-sizing:border-box;box-sizing:border-box}` + compilation.assets[filePathName].source() || '';
+                    // 重写指定输出模块内容
+                    compilation.assets[filePathName] = {
+                        source() {
+                            return content;
+                        },
+                        size() {
+                            return content.length;
+                        }
+                    };
+                }
+            }
+
+        });
+    },
+};

+ 45 - 0
doc/api.md

xqd
@@ -0,0 +1,45 @@
+# 小程序核心功能文档
+
+## 用户 this.$user
+
+### this.$user.getAccessToken(options)
+
+获取用户Access Token
+
+```javascript
+this.$user.getAccessToken({
+    cacheOnly: false, // 是否只从缓存读取,是的话即使缓存是空的也会返回空
+}).then(accessToken => {
+    
+}).catch(error => {
+    
+});
+```
+
+### this.$user.getInfo()
+
+获取用户信息
+
+```javascript
+this.$user.getInfo().then(info => {
+    
+}).catch(error => {
+    
+});
+```
+
+## 支付 this.$payment
+
+### this.$payment.pay(id);
+
+调用支付
+
+```javascript
+// id: 后台支付接口返回的待支付id
+this.$payment.pay(id).then(msg => {
+    // 支付成功
+}).catch(msg => {
+    // 支付失败
+    
+});
+```

+ 1072 - 0
doc/components.md

xqd
@@ -0,0 +1,1072 @@
+# 小程序公共组件文档
+
+**注意:调用任何组件需要在外部套一个标签<view></view>,避免意料之外的样式产生。**
+
+## app-radio
+
+- 代码
+
+    ````html
+    <app-radio></app-radio>
+    ````
+- 属性 
+  
+    - v-model: 开启关闭数据(boolean)
+    
+    ````html
+    <app-radio v-model="isShow"></app-radio>
+    ````
+    
+    - theme: 主题色(字符串,变量)--- 变量需在props中定义
+    ````html
+    <app-radio :theme="theme"></app-radio>
+    ````
+    
+    - type: 类型(String)圆形---round, 默认情况方形
+    
+    ````html
+    <app-radio type="round"></app-radio>
+    <app-radio></app-radio>
+    ````
+
+## app-input
+
+- 代码
+
+    ````html
+    <app-input ></app-input>
+    ````
+
+- 属性
+
+    - type: 键盘类型(String)
+    
+    ````html
+    文本输入键盘
+    <app-input type="text"></app-input>
+    数字输入键盘
+    <app-input type="number"></app-input>
+    身份证输入键盘
+    <app-input type="idcard"></app-input>
+    带小数点的数字键盘
+    <app-input type="digit"></app-input>
+    输入框
+    <app-input type="textarea"></app-input>
+    ````
+
+    - disabled :禁用(Boolean)
+    
+    ````html
+    <app-input disabled></app-input>
+    ````
+
+    - password: 密码(Boolean)
+    
+    ````html
+    <app-input password></app-input>
+    ````
+
+    - placeholder: 占位符(String)
+    
+    ````html
+    <app-input placeholder="请输入字符"></app-input>
+    ````
+
+    - autoHeight: 自动高度(Boolean) type = 'textarea'
+    
+    ````html
+    <app-input autoHeight></app-input>
+    ````
+
+    - showConfirmBar: 显示完成按钮(Boolean) type = 'textarea'
+    
+    ````html
+    <app-input showConfirmBar></app-input>
+    ````
+
+    - placeholderStyle: 占位符文字样式(String) 指定 placeholder 的样式,目前仅支持color,font-size和font-weight type = 'textarea'
+    
+    ````html
+    <app-input placeholderStyle="color:red;"></app-input>
+    ````
+
+
+## app-form-id
+
+- 代码
+
+    ```html
+    <view>
+        <app-form-id @click="自定义事件触发>
+           <app-button>按钮</app-button>
+        </app-form-id>
+    </view>
+    ```
+
+- 在外部嵌套一个标签,内部通过click时间,触发自定义事件,抛出获取到的formid,formid已经保存到缓存中,组件无样式
+自定义样式
+
+## app-button
+
+- 代码
+
+    ````html
+    <app-button>按钮</app-button>
+    ````
+  
+- 回调
+  
+    ````html
+    <app-button @click="自定义方法">按钮</app-button>
+    ````
+  
+- 属性
+
+    - disabled: 禁止点击(boolean)
+    
+    ```html
+    <app-button disabled>按钮</app-button>
+    <app-button :disabled="disabled">按钮</app-button>
+    ```
+
+    - type: 按钮类型,(字符串)分为三种: 重要-important,一般-general,普通-(不传参)
+
+    ```html
+    <app-button type="important">按钮</app-button>
+    ```
+
+    - round:圆角按钮,50rpx(boolean)(统一)
+
+    ```html
+    <app-button round>按钮</app-button>
+    ```
+
+    - theme: 主题色,(字符串,变量)--- 变量需在props中定义
+    
+    ```html
+    <app-button :theme="theme">按钮</app-button>
+    ```
+
+    - height:高度,(字符串)--- 单位为rpx,不需要传
+    
+    ```html
+    <app-button height="100">按钮</app-button>
+    ```
+
+    - fontSize: 字体大小,不传,默认为32rpx(字符串)--- 单位为rpx,不需要传
+    
+    ```html
+    <app-button fontSize="10">按钮</app-button>
+    ```
+
+    - width: 宽度,不传默认为100%,(字符串)--- 单位为rpx.不需要传
+    
+    ```html
+    <app-button width="10">按钮</app-button>
+    ```
+
+    - color:文字颜色(字符串)
+    
+    ```html
+    <app-button color="#000000">按钮</app-button>
+    ```
+
+    - size: 规定的三种按钮高度,(字符串)分为三种:大---large(100),小---small(60),中---medium(80)
+    
+    ```html
+    <app-button size="large">按钮</app-button>
+    ```
+  
+    - background: 背景颜色,不用主题色的情况下使用
+    
+    ```html
+    <app-button background="red">按钮</app-button>
+    <app-button background="#ffffff">按钮</app-button>
+    ```
+
+## app-form-id app-button
+
+- 两者结合使用
+  
+    ````html
+    <app-form-id @click="自定义方法">
+       <app-button >按钮</app-button>
+    </app-form-id>
+    ````
+
+## app-jump-button
+
+- 代码
+
+    ````html
+     <view>
+        <app-jump-button></app-jump-button>
+     </view>
+    ````
+  
+- 属性
+
+    - arrangement: 插槽内部排列方式(字符串) column --- 竖排居中对齐,row --- 横排居中对齐
+    
+    ````html
+     <view>
+        <app-jump-button arrangement="column"></app-jump-button>
+     </view>
+    ````
+
+    - backgroundColor: 背景颜色
+    
+    ````html
+     <view>
+        <app-jump-button backgroundColor="red"></app-jump-button>
+     </view>
+     <view>
+         <app-jump-button backgroundColor="#ffffff"></app-jump-button>
+      </view>
+    ````
+    
+    - item: 对象
+    
+    ```
+    {
+        open_type: "contact", //(redirect, contact, navigate, tel, web, app...)
+        url: "pages/index/index", //(跳转路径, 可有可无, 与link_url二选一)
+        link_url: "pages/index/index"//(跳转路径, 可有可无, 与link_url二选一)
+    }
+    
+    //redirect: 重定向,
+    
+    //contact: 客服消息回调,
+    
+    //navigate: 跳转,
+    
+    //tel: 电话,
+    
+    //web: 网页,
+    
+    //app: 跳转其他小程序
+    ```
+
+## app-report-error
+
+- 代码
+
+    ```javascript
+    // 服务端报错弹框, 在全局app-layout中使用
+    
+    //开启:
+    this.$store.dispatch('gConfig/reportAndErrorB', true);
+    //关闭:
+    this.$store.dispatch('gConfig/reportAndErrorB', false);
+    
+    //传递报错信息
+    //开启:
+    this.$store.dispatch('gConfig/reportAndErrorObj', {
+    boolean: true,
+    content: '网络开了会儿小差, 请刷新重试下哦~'});
+    
+    //关闭:
+    this.$store.dispatch('gConfig/reportAndErrorObj', {
+    boolean: false,
+    content: '网络开了会儿小差, 请刷新重试下哦~'});
+    ```
+
+## app-tab-bar
+
+- 代码
+
+    ```javascript
+    // 底部导航,放在全局app-layout 中, 再次展现页面时,判断当前页面是否有tabbar
+    // 在每一个可能存在tabbar的页面中 写上
+    
+        import { mapGetters } from "vuex";
+        export default {
+            computed: {
+                ...mapGetters('mallConfig',{
+                   tabBarNavs: 'getNavBar',
+                })
+            },
+            onShow() {
+                this.$store.dispatch('gConfig/setTabBarBoolean', this.tabBarNavs.navs);
+            }
+        }
+    ```
+
+## app-loading
+
+- 代码
+
+    ```html
+    <app-loading></app-loading>
+    ```
+
+- 属性
+
+    - type: loading 类型(字符串) 全局---global,小框--- toast
+    
+    ```html
+    <app-loading type="toast"></app-loading>
+    <app-loading type="global"></app-loading>
+    ```
+    
+    - text: 显示文字 (字符串)
+    
+    ```html
+    <app-loading text="加载中..."></app-loading>
+    ```
+    
+    - backgroundImage: 背景图片(字符串)
+    
+    ````html
+    <app-loading backgroundImage="图片地址"></app-loading>
+    ````
+
+## app-text
+
+主题文字
+
+- 代码
+
+    ````html
+    <app-text></app-text>
+    ````
+
+- 属性
+
+    - theme: 主题色(字符串,变量)--- 变量需在props中定义
+    ````html
+    <app-text :theme="theme"></app-text>
+    ````
+    
+    - fontSize: 文字大小
+    
+    ````html
+    <app-text fontSize="23"></app-text>
+    ````
+    
+    - color: 文字颜色
+    
+    ````html
+    <app-text color="red"></app-text>
+    ````
+
+## app-map
+
+注:字节跳动小程序不支持
+
+- 代码
+
+    ````html
+     <!--#ifndef MP-TOUTIAO -->
+        <app-map></app-map>
+    <!-- #endif-->
+    ````
+    
+    ````javascript
+    export default {
+        data() {
+            return {
+                data: {
+                      backgroundColor: '#ffffff',
+                      backgroundPicUrl: 'http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg',
+                      height: 400,
+                      latitude: '30.747440',
+                      location: '30.747440,120.784830',
+                      longitude: '120.784830',
+                      marginTop: 20,
+                      marginTopColor: "#ffffff",
+                      paddingX: 40,
+                      paddingY: 40,
+                      }
+            }
+        }
+    }
+    ````
+
+## app-copyright
+
+- 代码
+
+    ````html
+    <app-copyright :data="data"></app-copyright>
+    ````
+    
+    ````javascript
+    export default {
+        data() {
+            return {
+                data: {
+                        backgroundColor: 'red',
+                        link: {
+                          data: {},
+                          openType: '',
+                          url: '',
+                        },
+                        picUrl: 'http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg',
+                        text: '凡云科技',
+                    }
+            }
+        }
+    }
+    ````
+
+## app-video
+
+- 代码
+
+    ````html
+    <app-video :newScrollTop="scrollTop"></app-video>
+    ````
+    
+    ````javascript
+    export default {
+        data() {
+            return {
+                scrollTop: 0
+            }
+        },
+         onPageScroll: function(e) {
+            this.$nextTick().then(() => {
+                this.scrollTop = e.scrollTop;
+            });
+        },
+    }
+    ````
+
+## app-search-for
+
+- 代码
+
+    ````html
+    <app-search-for :data="data"></app-search-for>
+    ````
+    
+    ````javascript
+    export default {
+        data() {
+            return {
+                data: {
+                      background: `#968B8B`,
+                      color: '#DECACA',
+                      placeholder: '搜索',
+                      radius: 10,
+                      textColor: '#E8E3E3',
+                      textPosition: `left`,
+                }
+            }
+        }
+    }
+    ````
+
+## app-quick-navigation
+
+- 代码
+
+    ````html
+    <app-quick-navigation :data="data"></app-quick-navigation>
+    ````
+    
+    ````javascript
+    export default {
+        data() {
+            return {
+                data: {
+                  closedPicUrl: 'http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg',
+                  customerService: {
+                      opened: true,
+                      picUrl: 'http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg',
+                  },
+                  home: {
+                      opened: true,
+                      picUrl: 'http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg',
+                  },
+                  mApp: {
+                      appId: '',
+                      opened: false,
+                      page: '',
+                      picUrl: '',
+                  },
+                  mapNav: {
+                      address: '南湖',
+                      latitude: '30.762457',
+                      location: '',
+                      longitude: '120.763779',
+                      opened: true,
+                      picUrl: 'http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg'
+                  },
+                  navStyle: 1,
+                  navSwitch: 1,
+                  openedPicUrl: 'http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg',
+                  tel: {
+                      number: '1885813481',
+                      opened: true,
+                      picUrl: 'http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg',
+                  },
+                  useMallConfig: false,
+                  web: {
+                      opened: true,
+                      picUrl: 'http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg',
+                      url: 'www.baidu.com',
+                  },
+              }
+            }
+        }
+    }
+    ````
+
+## app-navigation-icon
+
+- 代码
+
+    ```html
+    <app-navigation-icon :data="data"></app-navigation-icon>
+    ```
+    
+    ````javascript
+    export default {
+        data() {
+            return {
+                data: {
+                     background: "#C42929",
+                     color: "#1358EE",
+                     columns: 3,
+                     navs: [
+                           {
+                               icon: "http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg",
+                               icon_url: "http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg",
+                               link_url: "/pages/index/index",
+                               name: "导航13",
+                               openType: "navigate",
+                               open_type: "navigate",
+                               url: "/pages/index/index",
+                           },
+                     ],
+                     rows: 4,
+                     scroll: true,
+                    }
+            }
+        }
+    }
+    ````
+
+## app-announcement
+
+- 代码
+
+    ````html
+    <app-announcement :data="data"></app-announcement>
+    ````
+    
+    ````javascript
+    export default {
+        data() {
+            return {
+                data: {
+                    background: '#f67f79',
+                    btnColor: '#ff4544',
+                    btnHeight: 80,
+                    btnRadius: 40,
+                    btnText: '我知道了',
+                    btnTextColor: '#ffffff',
+                    btnWidth: 500,
+                    content: 'sdfsdfsdfwerr2323232323232323232323232323232323232323232323232323232323232323232323',
+                    headerUrl: 'https://www.bangdian.net/plugins/diy/assets/images/icon-notice-title.png',
+                    icon: 'http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg',
+                    name: '公告',
+                    textColor: "#ffffff",
+                }
+            }
+        }
+    }
+    ````
+
+## app-special-topic-normal
+
+- 代码
+
+    ````html
+    <template v-if="data.style === 'normal'">
+        <app-special-topic-normal :data="data"></app-special-topic-normal>
+    </template>
+    ````
+    
+    ````javascript
+    export default {
+        data() {
+            return {
+                data: {
+                    cat_show: false,
+                    count: 2,
+                    icon: "https://www.bangdian.net/web/statics/img/app/topic/icon-topic-r.png",
+                    list: [],
+                    logo_1: "https://www.bangdian.net/web/statics/img/app/topic/icon-topic-1.png",
+                    logo_2: "https://www.bangdian.net/web/statics/img/app/topic/icon-topic-2.png",
+                    style: "normal",
+                    topic_list: [
+                        {
+                            cover_pic: 'http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg',
+                            id: 14,
+                            layout: 0,
+                            read_count: '0人浏览',
+                            title: '专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一专题一',
+                        }
+                    ],
+                }
+            }
+        }
+    }
+    ````
+
+## app-special-topic-list
+
+- 代码
+
+    ````html
+    <template v-if="data.style === 'list'">
+        <app-special-topic-normal :topic_list="topic_list" :list="list" :cat_show="cat_show"></app-special-topic-normal>
+    </template>
+    ````
+    
+    ````javascript
+    export default {
+        data() {
+            return {
+                 cat_show: {
+                    type: Boolean,
+                    default: function() {
+                        return false;
+                    }
+                 },
+                list: {
+                    type: Array,
+                    default: function() {
+                        return [
+                            {
+                                cat_id: '18',
+                                cat_name: '123',
+                                children: [
+                                ],
+                                custom: false,
+                                name: '附页',
+                                number: 30,
+                            },
+                            {
+                                cat_id: '18',
+                                cat_name: '123',
+                                children: [
+                                    {
+                                        cover_pic: 'http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg',
+                                        id: 14,
+                                        layout: 0,
+                                        read_count: '0人浏览',
+                                        title: '专题一',
+                                    }
+                                ],
+                                custom: false,
+                                name: '首页',
+                                number: 30,
+                            }
+                        ];
+                    }
+                },
+                topic_list: {
+                    type: Array,
+                    default: function() {
+                        return [
+                            {
+                                cover_pic:'http://www.bangdian.net/web/uploads/mall51/20190724/3d3abd2944d5d32b9a9780fd3525bb50.jpg',
+                                id: 15,
+                                layout:1,
+                                read_count: '0人浏览',
+                                title: '专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二专题二',
+                            }
+                        ]
+                    }
+                }
+            }
+        }
+    }
+    ````
+
+## app-tab-nav
+
+- 代码
+
+````html
+<app-tab-nav setHeight="90" fontSize="32" :tabList="tabList" :activeItem="activeTab" @click="tabStatus" :theme="theme"></app-tab-nav>
+````
+
+- 属性
+
+    - setHeight: 组件高度,不传,默认为90rpx(字符串)--- 单位为rpx,不需要传
+    
+    - fontSize: 字体大小,不传,默认为28rpx(字符串)--- 单位为rpx,不需要传
+    
+    - tabList: 数组,需要显示的tab栏,需name和id字段
+    
+    - activeItem: 当前激活的tab的id
+    
+    - theme: 主题色
+    
+    - tabStatus: 字体大小,不传,默认为32rpx(字符串)--- 单位为rpx,不需要传
+    
+    - click: 点击事件,事件名称可自定义
+    
+    ````javascript
+    export default {
+        data() {
+            return {
+                tabList: [
+                    {id:1, name: '商品'},
+                    {id:2, name: '专题'}
+                ],
+                activeTab: 1,
+            }
+        },
+        methods: {
+            tabStatus(e) {
+                console.log(e)
+            },
+        }
+    }
+    ````
+
+## app-reservation
+
+- 代码
+
+    ````html
+      <app-reservation></app-reservation>
+    ````
+    
+    ````javascript
+    export default {
+        props: {
+            buttonColor: {
+                type: String,
+                default: function() {
+                    return "blue";
+                }
+            },
+            buyBtnStyle: {
+                type: Number,
+                default: function() {
+                    return 4;
+                }
+            },
+            buyBtnText: {
+                type: String,
+                default: function() {
+                    return "预约";
+                }
+            },
+            customizeGoodsTag: {
+                type: Boolean,
+                default: function() {
+                    return false;
+                }
+            },
+            fill: {
+                type: Number,
+                default: function() {
+                    return 0;
+                }
+            },
+            goodsCoverProportion: {
+                type: String,
+                default: function() {
+                    return "3-2";
+                }
+            },
+            goodsStyle: {
+                type: Number,
+                default: function() {
+                    return 3;
+                }
+            },
+            goodsTagPicUrl: {
+                type: String,
+                default: function() {
+                    return "https://shop.9026.com/plugins/diy/assets/images/goods-tag-xp.png";
+                }
+            },
+            list: {
+                type: Array,
+                default: function() {
+                    return [
+                        {
+                            cover_pic: "http://matianxia.oss-cn-qingdao.aliyuncs.com/uploads/20190426/ba493adde2ed99593821c1b5816e6775.png?x-oss-process=style/q90",
+                            id: 13,
+                            name: "TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST1",
+                            page_url: "/plugins/book/goods/goods?goods_id=13",
+                            price: "0.00",
+                            price_content: "¥0.00",
+                        },
+                        {
+                            cover_pic: "http://matianxia.oss-cn-qingdao.aliyuncs.com/uploads/20190428/3609e08f1dfa8c9c8449808b93331a36.png?x-oss-process=style/q90",
+                            id: 47,
+                            name: "预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】预约商品【免费】",
+                            page_url: "/plugins/book/goods/goods?goods_id=47",
+                            price: "10.00",
+                            price_content: "¥10.00",
+                        },
+                    ];
+                }
+            },
+            listStyle: {
+                type: Number,
+                default: function() {
+                    return 1;
+                }
+            },
+            showBuyBtn: {
+                type: Boolean,
+                default: function() {
+                    return true;
+                }
+            },
+            showGoodsName: {
+                type: Boolean,
+                default: function() {
+                    return false;
+                }
+            },
+            showGoodsTag: {
+                type: Boolean,
+                default: function() {
+                    return false;
+                }
+            },
+            scrollTop: {
+                type: Number,
+                default: function() {
+                    return 0;
+                }
+            },
+            value: {
+                type: Boolean,
+                default: function() {
+                    return true;
+                }
+            }
+        }
+    }
+    ````
+
+## app-model
+
+- 代码
+
+    ````html
+    <app-model v-model="input">
+        <view slot="title"></view>
+        <view slot="content"></view>
+    </app-model>
+    ````
+    
+    ````javascript
+    export default {
+        data() {
+            return {
+                input: false,
+            }
+        },
+        methods: {
+            openHidden() {
+                this.input = !this.input;
+            }
+        }
+    }
+    ````
+
+## app-image-ad
+
+- 代码
+
+    ````html
+    <app-image-ad></app-image-ad>
+    ````
+    
+    ``````javascript
+    export default {
+        props: {
+            h: {
+                type: Number,
+                default: function() {
+                    return 1;
+                }
+            },
+            height: {
+                default: function() {
+                    return 750;
+                }
+            },
+            hotspot: {
+                type: Array,
+                default: function() {
+                    return [];
+                }
+            },
+            list: {
+                type: Array,
+                default: function() {
+                    return [
+                    ];
+                }
+            },
+            space: {
+                type: Number,
+                default: function() {
+                    return 0;
+                }
+            },
+            style: {
+                type: Number,
+                default: function() {
+                    return 1;
+                }
+            },
+            w: {
+                type: Number,
+                default: function() {
+                    return 25;
+                }
+            }
+        },
+    }
+    ``````
+
+## app-diy-form
+
+自定义表单
+
+- 代码
+
+    ```vue
+    <app-diy-form
+        :list="formList"
+        :sign="anyValue"
+        @input="handleInput"
+        @validate="handleValidate"></app-diy-form>
+        
+    <script>
+    export default {
+        methods: {
+            handleInput(result, sign) {
+            },
+            handleValidate(result, sign) {
+            },
+        }
+    }
+    </script>    
+    ```
+    
+- 属性
+
+    - title: String,表单标题
+
+    - list: Object,传入的表单数据,实例值:
+    
+    ```
+       [
+           {
+               key: 'text', // 类型(text,textarea,date,time,radio,checkbox,img_upload)
+               name: '姓名', // 名称
+               default: null, // 默认值
+           },
+           {
+               key: 'radio',
+               name: '性别',
+               default: null,
+               list: [
+                   {label: '男', value: false},
+                   {label: '女', value: true},
+                   {label: '隐私', value: false}
+               ],
+           },
+           {
+               key: 'checkbox',
+               name: '其他',
+               default: null,
+               list: [
+                   {label: '不要辣', value: false},
+                   {label: '不加葱', value: true},
+                   {label: '多加盐', value: true}
+               ],
+           },
+           {
+               key: 'img_upload',
+               name: '头像',
+               default: null,
+           },
+           ... 
+       ]
+    ```
+  
+    - sign: Any,自定义传入参数,@input|@validate时将返回
+  
+- 事件
+
+    - @input: 表单值有更新时触发,返回值:
+    
+        - data: 表单内容,示例: 
+        
+        ```
+          [
+            {
+                key: 'text', // 类型(text,textarea,date,time,radio,checkbox,img_upload)
+                name: '姓名', // 名称
+                default: null, // 默认值
+                value: '张三', // 表单值
+            },
+            {
+                key: 'radio',
+                name: '性别',
+                default: null,
+                list: [
+                    {label: '男', value: false},
+                    {label: '女', value: true},
+                    {label: '隐私', value: false}
+                ],
+                value: '女',
+            },
+            {
+                key: 'checkbox',
+                name: '其他',
+                default: null,
+                list: [
+                    {label: '不要辣', value: false},
+                    {label: '不加葱', value: true},
+                    {label: '多加盐', value: true}
+                ],
+                value: ['不加葱', '多加盐'],
+            },
+            {
+                key: 'img_upload',
+                name: '头像',
+                default: null,
+                value: 'http://xxx.xxx/abc.jpg',
+            },
+            ... 
+          ]
+        ```
+    
+        - sign: 自定义传入的值
+    
+    - @validate: 表单验证返回结果,返回值
+    
+        - result: 验证结果,示例:
+          
+        ```
+          {
+            hasError: false, // 表单填写内容是否有错误
+            errors: [
+              {
+                index: 0, // 第几个表单
+                msg: '"姓名不能为空"', // 错误信息
+              },
+            ]
+          }
+        ```
+    
+        - sign: 自定义传入的值

+ 64 - 0
no.plugins.js

xqd
@@ -0,0 +1,64 @@
+/**
+ * 使用参数 --no-plugins参数编译时,app.json中将去除插件使用的配置,其它json文件去除带plugin-private://的配置
+ */
+'use strict';
+
+module.exports = {
+    apply(compiler) {
+        compiler.hooks.emit.tap('compilation', compilation => {
+            if (!(process.argv && process.argv.indexOf('--no-plugins') > -1)) {
+                return;
+            }
+            // 遍历所有资源文件
+            for (let filePathName in compilation.assets) {
+                if (/^app\.json/i.test(filePathName)) {
+                    console.log('\n- app.json中将去除插件使用的配置...');
+                    // 获取文件内容
+                    let content = compilation.assets[filePathName].source() || '';
+                    let data = JSON.parse(content);
+                    if (typeof data.plugins !== 'undefined') {
+                        delete data.plugins;
+                    }
+                    if (typeof data.subPackages !== 'undefined' && data.subPackages.length) {
+                        for (let i in data.subPackages) {
+                            if (typeof data.subPackages[i].plugins !== 'undefined') {
+                                delete data.subPackages[i].plugins;
+                            }
+                        }
+                    }
+                    content = JSON.stringify(data, null, 2);
+                    // 重写指定输出模块内容
+                    compilation.assets[filePathName] = {
+                        source() {
+                            return content;
+                        },
+                        size() {
+                            return content.length;
+                        }
+                    };
+                } else if (/.*\.json/i.test(filePathName)) {
+                    let content = compilation.assets[filePathName].source() || '';
+                    let data = JSON.parse(content);
+                    if (typeof data.usingComponents === 'object') {
+                        for (let i in data.usingComponents) {
+                            if (/^plugin-private:\/\//i.test(data.usingComponents[i])) {
+                                delete data.usingComponents[i];
+                            }
+                        }
+                    }
+                    content = JSON.stringify(data, null, 2);
+                    // 重写指定输出模块内容
+                    compilation.assets[filePathName] = {
+                        source() {
+                            return content;
+                        },
+                        size() {
+                            return content.length;
+                        }
+                    };
+                }
+            }
+
+        });
+    },
+};

+ 11543 - 0
package-lock.json

xqd
@@ -0,0 +1,11543 @@
+{
+  "name": "zjhj_bd_app",
+  "version": "0.1.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@babel/code-frame": {
+      "version": "7.0.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.0.0.tgz",
+      "integrity": "sha1-BuKrGb21NThVWaq7W6WXKUgoAPg=",
+      "dev": true,
+      "requires": {
+        "@babel/highlight": "^7.0.0"
+      }
+    },
+    "@babel/core": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/core/download/@babel/core-7.6.0.tgz",
+      "integrity": "sha1-mwD3NVTt1nvryG34MD72eL49e0g=",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.5.5",
+        "@babel/generator": "^7.6.0",
+        "@babel/helpers": "^7.6.0",
+        "@babel/parser": "^7.6.0",
+        "@babel/template": "^7.6.0",
+        "@babel/traverse": "^7.6.0",
+        "@babel/types": "^7.6.0",
+        "convert-source-map": "^1.1.0",
+        "debug": "^4.1.0",
+        "json5": "^2.1.0",
+        "lodash": "^4.17.13",
+        "resolve": "^1.3.2",
+        "semver": "^5.4.1",
+        "source-map": "^0.5.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.5.5",
+          "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.5.5.tgz",
+          "integrity": "sha1-vAeC9tafe31JUxIZaZuYj2aaj50=",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/types": {
+          "version": "7.6.1",
+          "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.6.1.tgz?cache=0&sync_timestamp=1567831650694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.6.1.tgz",
+          "integrity": "sha1-U6vzMIrdOsKiiE1TkVHFfEs6xkg=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "json5": {
+          "version": "2.1.0",
+          "resolved": "http://registry.npm.taobao.org/json5/download/json5-2.1.0.tgz",
+          "integrity": "sha1-56DGLEgoXGKNIKELhcibuAfDKFA=",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/generator": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.6.0.tgz",
+      "integrity": "sha1-4sIe+/0yk62BmiNZtEjwAr/f2lY=",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.6.0",
+        "jsesc": "^2.5.1",
+        "lodash": "^4.17.13",
+        "source-map": "^0.5.0",
+        "trim-right": "^1.0.1"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.6.1",
+          "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.6.1.tgz?cache=0&sync_timestamp=1567831650694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.6.1.tgz",
+          "integrity": "sha1-U6vzMIrdOsKiiE1TkVHFfEs6xkg=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-annotate-as-pure": {
+      "version": "7.0.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.0.0.tgz",
+      "integrity": "sha1-Mj053QtQ4Qx8Bsp9djjmhk2MXDI=",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@babel/helper-builder-binary-assignment-operator-visitor": {
+      "version": "7.1.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz",
+      "integrity": "sha1-a2lijf5Ah3mODE7Zjj1Kay+9L18=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-explode-assignable-expression": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@babel/helper-call-delegate": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/helper-call-delegate/download/@babel/helper-call-delegate-7.4.4.tgz",
+      "integrity": "sha1-h8H4yhmtVSpzanonscH8+LH/H0M=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-hoist-variables": "^7.4.4",
+        "@babel/traverse": "^7.4.4",
+        "@babel/types": "^7.4.4"
+      }
+    },
+    "@babel/helper-create-class-features-plugin": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.6.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-create-class-features-plugin%2Fdownload%2F%40babel%2Fhelper-create-class-features-plugin-7.6.0.tgz",
+      "integrity": "sha1-dpcRrMqIm+Nx6bwutoZB1VIYAh8=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.1.0",
+        "@babel/helper-member-expression-to-functions": "^7.5.5",
+        "@babel/helper-optimise-call-expression": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-replace-supers": "^7.5.5",
+        "@babel/helper-split-export-declaration": "^7.4.4"
+      }
+    },
+    "@babel/helper-define-map": {
+      "version": "7.5.5",
+      "resolved": "https://registry.npm.taobao.org/@babel/helper-define-map/download/@babel/helper-define-map-7.5.5.tgz",
+      "integrity": "sha1-PewywgRvN+CbKMk+sLED/Sol02k=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.1.0",
+        "@babel/types": "^7.5.5",
+        "lodash": "^4.17.13"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.6.1",
+          "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.6.1.tgz?cache=0&sync_timestamp=1567831650694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.6.1.tgz",
+          "integrity": "sha1-U6vzMIrdOsKiiE1TkVHFfEs6xkg=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-explode-assignable-expression": {
+      "version": "7.1.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.1.0.tgz",
+      "integrity": "sha1-U3+hP28WdN90WwwA7I/k6ZaByPY=",
+      "dev": true,
+      "requires": {
+        "@babel/traverse": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@babel/helper-function-name": {
+      "version": "7.1.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.1.0.tgz",
+      "integrity": "sha1-oM6wFoX3M1XUNgwSR/WCv6/I/1M=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-get-function-arity": "^7.0.0",
+        "@babel/template": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@babel/helper-get-function-arity": {
+      "version": "7.0.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.0.0.tgz",
+      "integrity": "sha1-g1ctQyDipGVyY3NBE8QoaLZOScM=",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@babel/helper-hoist-variables": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.4.4.tgz",
+      "integrity": "sha1-Api18lyMCcUxAtUqxKmPdz6yhQo=",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.4.4"
+      }
+    },
+    "@babel/helper-member-expression-to-functions": {
+      "version": "7.5.5",
+      "resolved": "https://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.5.5.tgz",
+      "integrity": "sha1-H7W47ERTqTxDnun+Ou6kqEt2tZA=",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.5.5"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.6.1",
+          "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.6.1.tgz?cache=0&sync_timestamp=1567831650694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.6.1.tgz",
+          "integrity": "sha1-U6vzMIrdOsKiiE1TkVHFfEs6xkg=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-module-imports": {
+      "version": "7.0.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.0.0.tgz",
+      "integrity": "sha1-lggbcRHkhtpNLNlxrRpP4hbMLj0=",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@babel/helper-module-transforms": {
+      "version": "7.5.5",
+      "resolved": "https://registry.npm.taobao.org/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.5.5.tgz",
+      "integrity": "sha1-+E/4oJA43Lyh/UNVZhpQCTcWW0o=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/helper-simple-access": "^7.1.0",
+        "@babel/helper-split-export-declaration": "^7.4.4",
+        "@babel/template": "^7.4.4",
+        "@babel/types": "^7.5.5",
+        "lodash": "^4.17.13"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.6.1",
+          "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.6.1.tgz?cache=0&sync_timestamp=1567831650694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.6.1.tgz",
+          "integrity": "sha1-U6vzMIrdOsKiiE1TkVHFfEs6xkg=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-optimise-call-expression": {
+      "version": "7.0.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.0.0.tgz",
+      "integrity": "sha1-opIMVwKwc8Fd5REGIAqoytIEl9U=",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@babel/helper-plugin-utils": {
+      "version": "7.0.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.0.0.tgz",
+      "integrity": "sha1-u7P77phmHFaQNCN8wDlnupm08lA=",
+      "dev": true
+    },
+    "@babel/helper-regex": {
+      "version": "7.5.5",
+      "resolved": "https://registry.npm.taobao.org/@babel/helper-regex/download/@babel/helper-regex-7.5.5.tgz",
+      "integrity": "sha1-CqaCT3EAouDonBUnwjk2wVLKs1E=",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.13"
+      }
+    },
+    "@babel/helper-remap-async-to-generator": {
+      "version": "7.1.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.1.0.tgz",
+      "integrity": "sha1-Nh2AghtvONp1vT8HheziCojF/n8=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.0.0",
+        "@babel/helper-wrap-function": "^7.1.0",
+        "@babel/template": "^7.1.0",
+        "@babel/traverse": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@babel/helper-replace-supers": {
+      "version": "7.5.5",
+      "resolved": "https://registry.npm.taobao.org/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.5.5.tgz",
+      "integrity": "sha1-+EzkPfAxIi0rrQaNJibLV5nDS8I=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-member-expression-to-functions": "^7.5.5",
+        "@babel/helper-optimise-call-expression": "^7.0.0",
+        "@babel/traverse": "^7.5.5",
+        "@babel/types": "^7.5.5"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.6.1",
+          "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.6.1.tgz?cache=0&sync_timestamp=1567831650694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.6.1.tgz",
+          "integrity": "sha1-U6vzMIrdOsKiiE1TkVHFfEs6xkg=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/helper-simple-access": {
+      "version": "7.1.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-simple-access/download/@babel/helper-simple-access-7.1.0.tgz",
+      "integrity": "sha1-Ze65VMjCRb6qToWdphiPOdceWFw=",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@babel/helper-split-export-declaration": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.4.4.tgz",
+      "integrity": "sha1-/5SJSjQL549T8GrwOLIFxJ2ZNnc=",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.4.4"
+      }
+    },
+    "@babel/helper-wrap-function": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.2.0.tgz",
+      "integrity": "sha1-xOABJEV2nigVtVKW6tQ6lYVJ9vo=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.1.0",
+        "@babel/template": "^7.1.0",
+        "@babel/traverse": "^7.1.0",
+        "@babel/types": "^7.2.0"
+      }
+    },
+    "@babel/helpers": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/helpers/download/@babel/helpers-7.6.0.tgz",
+      "integrity": "sha1-IZYdFsajw6tZcyXDTEZcCIfTHG4=",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.6.0",
+        "@babel/traverse": "^7.6.0",
+        "@babel/types": "^7.6.0"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.6.1",
+          "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.6.1.tgz?cache=0&sync_timestamp=1567831650694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.6.1.tgz",
+          "integrity": "sha1-U6vzMIrdOsKiiE1TkVHFfEs6xkg=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.5.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.5.0.tgz",
+      "integrity": "sha1-VtETEr2SSPphlZHQJHK+boyzJUA=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.0",
+        "esutils": "^2.0.2",
+        "js-tokens": "^4.0.0"
+      }
+    },
+    "@babel/parser": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.6.0.tgz?cache=0&sync_timestamp=1568408533866&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.6.0.tgz",
+      "integrity": "sha1-PgXQZHQyqDJsso0N4DiVrlpX85s=",
+      "dev": true
+    },
+    "@babel/plugin-proposal-async-generator-functions": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.2.0.tgz",
+      "integrity": "sha1-somzBmadzkrSCwJSiJoVdoydQX4=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-remap-async-to-generator": "^7.1.0",
+        "@babel/plugin-syntax-async-generators": "^7.2.0"
+      }
+    },
+    "@babel/plugin-proposal-class-properties": {
+      "version": "7.5.5",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.5.5.tgz",
+      "integrity": "sha1-qXTPrh43wxEOcfPGouSLjnGVjNQ=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.5.5",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-proposal-decorators": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-decorators/download/@babel/plugin-proposal-decorators-7.6.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-decorators%2Fdownload%2F%40babel%2Fplugin-proposal-decorators-7.6.0.tgz",
+      "integrity": "sha1-ZlnSVyoX1wq9aBI+iaEqQ9kKoww=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.6.0",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-decorators": "^7.2.0"
+      }
+    },
+    "@babel/plugin-proposal-json-strings": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.2.0.tgz",
+      "integrity": "sha1-Vo7MRGxhSK5rJn8CVREwiR4p8xc=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-json-strings": "^7.2.0"
+      }
+    },
+    "@babel/plugin-proposal-object-rest-spread": {
+      "version": "7.5.5",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.5.5.tgz",
+      "integrity": "sha1-YZOXRPcbp2o65Gte6hilTBbSLlg=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
+      }
+    },
+    "@babel/plugin-proposal-optional-catch-binding": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.2.0.tgz",
+      "integrity": "sha1-E12B7baKCB5V5W7EhUHs6AZcOPU=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.2.0"
+      }
+    },
+    "@babel/plugin-proposal-unicode-property-regex": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.4.4.tgz",
+      "integrity": "sha1-UB/9mCbAuR2iJpByByKsfLHKnHg=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-regex": "^7.4.4",
+        "regexpu-core": "^4.5.4"
+      }
+    },
+    "@babel/plugin-syntax-async-generators": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.2.0.tgz",
+      "integrity": "sha1-aeHw2zTG9aDPfiszI78VmnbIy38=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-decorators": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-syntax-decorators/download/@babel/plugin-syntax-decorators-7.2.0.tgz",
+      "integrity": "sha1-xQsblX3MaeSxEntl4cM+72FXDBs=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-dynamic-import": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.2.0.tgz",
+      "integrity": "sha1-acFZ/69JmBIhYa2OvF5tH1XfhhI=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-json-strings": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.2.0.tgz",
+      "integrity": "sha1-cr0T9v/h0lk4Ep0qGGsR/WKVFHA=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-jsx": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-syntax-jsx/download/@babel/plugin-syntax-jsx-7.2.0.tgz",
+      "integrity": "sha1-C4WjtLx830zEuL8jYzW5B8oi58c=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.2.0.tgz",
+      "integrity": "sha1-O3o+czUQxX6CC5FCpleayLDfrS4=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.2.0.tgz",
+      "integrity": "sha1-qUAT1u2okI3+akd+f57ahWVuz1w=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-arrow-functions": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.2.0.tgz",
+      "integrity": "sha1-mur75Nb/xlY7+Pg3IJFijwB3lVA=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-async-to-generator": {
+      "version": "7.5.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.5.0.tgz",
+      "integrity": "sha1-iaOEigFmYjtbxIEWS1k2q5R+iH4=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-remap-async-to-generator": "^7.1.0"
+      }
+    },
+    "@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.2.0.tgz",
+      "integrity": "sha1-XTzBHo1d3XUqpkyRSNDbbLef0ZA=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-block-scoping": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.6.0.tgz",
+      "integrity": "sha1-xJ4hIoxLvUBoo1Zn5tlRx1Q5sdw=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "lodash": "^4.17.13"
+      }
+    },
+    "@babel/plugin-transform-classes": {
+      "version": "7.5.5",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.5.5.tgz",
+      "integrity": "sha1-0JQpnZvWgKFKKg7a44MFrWD7Tek=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.0.0",
+        "@babel/helper-define-map": "^7.5.5",
+        "@babel/helper-function-name": "^7.1.0",
+        "@babel/helper-optimise-call-expression": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-replace-supers": "^7.5.5",
+        "@babel/helper-split-export-declaration": "^7.4.4",
+        "globals": "^11.1.0"
+      }
+    },
+    "@babel/plugin-transform-computed-properties": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.2.0.tgz",
+      "integrity": "sha1-g6ffamWIZbHI9kHVEMbzryICFto=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-destructuring": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.6.0.tgz",
+      "integrity": "sha1-RLvgi1f0SACU1X2f+82W0wkHW6Y=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-dotall-regex": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.4.4.tgz",
+      "integrity": "sha1-NhoUi8lRREMSxpRG127R6o5EUMM=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-regex": "^7.4.4",
+        "regexpu-core": "^4.5.4"
+      }
+    },
+    "@babel/plugin-transform-duplicate-keys": {
+      "version": "7.5.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.5.0.tgz",
+      "integrity": "sha1-xdv1EGv4TN9pEiLAl0wSsd+TGFM=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.2.0.tgz",
+      "integrity": "sha1-pjhoKJ5bQAf3BU1GSRr1FDV2YAg=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-for-of": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.4.4.tgz",
+      "integrity": "sha1-Amf8c14kyAi6FzhmxsTRRA/DxVY=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-function-name": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.4.4.tgz",
+      "integrity": "sha1-4UNhFquwYQwiWQlISHVKxSMJIq0=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.1.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-literals": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.2.0.tgz",
+      "integrity": "sha1-aQNT6B+SZ9rU/Yz9d+r6hqulPqE=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-modules-amd": {
+      "version": "7.5.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.5.0.tgz",
+      "integrity": "sha1-7wBDXUbaCllhqnKKHS7P8GPk+5E=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.1.0",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "babel-plugin-dynamic-import-node": "^2.3.0"
+      }
+    },
+    "@babel/plugin-transform-modules-commonjs": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.6.0.tgz",
+      "integrity": "sha1-Od/pV95EIERfH8+ItoouSqRRVIY=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.4.4",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-simple-access": "^7.1.0",
+        "babel-plugin-dynamic-import-node": "^2.3.0"
+      }
+    },
+    "@babel/plugin-transform-modules-systemjs": {
+      "version": "7.5.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.5.0.tgz",
+      "integrity": "sha1-51JmoT75QgLbKgYgl3dW9R1S0kk=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-hoist-variables": "^7.4.4",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "babel-plugin-dynamic-import-node": "^2.3.0"
+      }
+    },
+    "@babel/plugin-transform-modules-umd": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.2.0.tgz",
+      "integrity": "sha1-dnjOdRafCHe46yI1U4wHQmjdAa4=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.1.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-named-capturing-groups-regex": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.6.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-named-capturing-groups-regex%2Fdownload%2F%40babel%2Fplugin-transform-named-capturing-groups-regex-7.6.0.tgz",
+      "integrity": "sha1-Hm5mMJeBO7T1PULfB1DPKK07s/E=",
+      "dev": true,
+      "requires": {
+        "regexp-tree": "^0.1.13"
+      }
+    },
+    "@babel/plugin-transform-new-target": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.4.4.tgz",
+      "integrity": "sha1-GNEgQ4sMye6VpH8scryXaPvtYKU=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-object-super": {
+      "version": "7.5.5",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.5.5.tgz",
+      "integrity": "sha1-xwAh34NAc8ZethO4Z5zEo4HRqfk=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-replace-supers": "^7.5.5"
+      }
+    },
+    "@babel/plugin-transform-parameters": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.4.4.tgz",
+      "integrity": "sha1-dVbPA/MYvScZ/kySLS2Ai+VXHhY=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-call-delegate": "^7.4.4",
+        "@babel/helper-get-function-arity": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-regenerator": {
+      "version": "7.4.5",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.4.5.tgz",
+      "integrity": "sha1-Yp3IJRLFXO4BNB+ye9/LIQNUaA8=",
+      "dev": true,
+      "requires": {
+        "regenerator-transform": "^0.14.0"
+      }
+    },
+    "@babel/plugin-transform-runtime": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-runtime/download/@babel/plugin-transform-runtime-7.6.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-runtime%2Fdownload%2F%40babel%2Fplugin-transform-runtime-7.6.0.tgz",
+      "integrity": "sha1-haPM5AKyhYYTjjaPziCrMBm5cT4=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "resolve": "^1.8.1",
+        "semver": "^5.5.1"
+      }
+    },
+    "@babel/plugin-transform-shorthand-properties": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.2.0.tgz",
+      "integrity": "sha1-YzOu4vjW7n4oYVRXKYk0o7RhmPA=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-spread": {
+      "version": "7.2.2",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.2.2.tgz",
+      "integrity": "sha1-MQOpq+IvdCttQG7NPNSbd0kZtAY=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-sticky-regex": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.2.0.tgz",
+      "integrity": "sha1-oeRUtZlVYKnB4NU338FQYf0mh+E=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-regex": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-template-literals": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.4.4.tgz",
+      "integrity": "sha1-nSj+p7vOY3+3YSoHUJidgyHUvLA=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-typeof-symbol": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.2.0.tgz",
+      "integrity": "sha1-EX0rzsL79ktLWdH5gZiUaC0p8rI=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-unicode-regex": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.4.4.tgz",
+      "integrity": "sha1-q0Y0u08U02cov1l4Mis1WHeHlw8=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-regex": "^7.4.4",
+        "regexpu-core": "^4.5.4"
+      }
+    },
+    "@babel/preset-env": {
+      "version": "7.3.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/preset-env/download/@babel/preset-env-7.3.4.tgz?cache=0&sync_timestamp=1562698761858&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fpreset-env%2Fdownload%2F%40babel%2Fpreset-env-7.3.4.tgz",
+      "integrity": "sha1-iHzzi20jyC8ZtRNSmL2xYAYuM+E=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
+        "@babel/plugin-proposal-json-strings": "^7.2.0",
+        "@babel/plugin-proposal-object-rest-spread": "^7.3.4",
+        "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.2.0",
+        "@babel/plugin-syntax-async-generators": "^7.2.0",
+        "@babel/plugin-syntax-json-strings": "^7.2.0",
+        "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
+        "@babel/plugin-transform-arrow-functions": "^7.2.0",
+        "@babel/plugin-transform-async-to-generator": "^7.3.4",
+        "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
+        "@babel/plugin-transform-block-scoping": "^7.3.4",
+        "@babel/plugin-transform-classes": "^7.3.4",
+        "@babel/plugin-transform-computed-properties": "^7.2.0",
+        "@babel/plugin-transform-destructuring": "^7.2.0",
+        "@babel/plugin-transform-dotall-regex": "^7.2.0",
+        "@babel/plugin-transform-duplicate-keys": "^7.2.0",
+        "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
+        "@babel/plugin-transform-for-of": "^7.2.0",
+        "@babel/plugin-transform-function-name": "^7.2.0",
+        "@babel/plugin-transform-literals": "^7.2.0",
+        "@babel/plugin-transform-modules-amd": "^7.2.0",
+        "@babel/plugin-transform-modules-commonjs": "^7.2.0",
+        "@babel/plugin-transform-modules-systemjs": "^7.3.4",
+        "@babel/plugin-transform-modules-umd": "^7.2.0",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.3.0",
+        "@babel/plugin-transform-new-target": "^7.0.0",
+        "@babel/plugin-transform-object-super": "^7.2.0",
+        "@babel/plugin-transform-parameters": "^7.2.0",
+        "@babel/plugin-transform-regenerator": "^7.3.4",
+        "@babel/plugin-transform-shorthand-properties": "^7.2.0",
+        "@babel/plugin-transform-spread": "^7.2.0",
+        "@babel/plugin-transform-sticky-regex": "^7.2.0",
+        "@babel/plugin-transform-template-literals": "^7.2.0",
+        "@babel/plugin-transform-typeof-symbol": "^7.2.0",
+        "@babel/plugin-transform-unicode-regex": "^7.2.0",
+        "browserslist": "^4.3.4",
+        "invariant": "^2.2.2",
+        "js-levenshtein": "^1.1.3",
+        "semver": "^5.3.0"
+      }
+    },
+    "@babel/runtime": {
+      "version": "7.5.4",
+      "resolved": "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.5.4.tgz?cache=0&sync_timestamp=1562698759253&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.5.4.tgz",
+      "integrity": "sha1-y30a18bWVnbma0cYZXeTBGW1Jxs=",
+      "dev": true,
+      "requires": {
+        "regenerator-runtime": "^0.13.2"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.13.2",
+          "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.2.tgz",
+          "integrity": "sha1-MuWcmm+5saSv8JtJMMotRHc0NEc=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/runtime-corejs2": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/runtime-corejs2/download/@babel/runtime-corejs2-7.6.0.tgz",
+      "integrity": "sha1-b803wlgAcIF9YvIZ25f2fib1D5w=",
+      "dev": true,
+      "requires": {
+        "core-js": "^2.6.5",
+        "regenerator-runtime": "^0.13.2"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.13.3",
+          "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.3.tgz",
+          "integrity": "sha1-fPanfY9cb2Drc8X8GVWyzrAea/U=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/template": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.6.0.tgz",
+      "integrity": "sha1-fwFZx/UBIjDa1kzKQuyb21yVNuY=",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "@babel/parser": "^7.6.0",
+        "@babel/types": "^7.6.0"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.6.1",
+          "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.6.1.tgz?cache=0&sync_timestamp=1567831650694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.6.1.tgz",
+          "integrity": "sha1-U6vzMIrdOsKiiE1TkVHFfEs6xkg=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/traverse": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.6.0.tgz",
+      "integrity": "sha1-OJOR1RD3m+fOLd1nF75m0/7UtRY=",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.5.5",
+        "@babel/generator": "^7.6.0",
+        "@babel/helper-function-name": "^7.1.0",
+        "@babel/helper-split-export-declaration": "^7.4.4",
+        "@babel/parser": "^7.6.0",
+        "@babel/types": "^7.6.0",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0",
+        "lodash": "^4.17.13"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.5.5",
+          "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.5.5.tgz",
+          "integrity": "sha1-vAeC9tafe31JUxIZaZuYj2aaj50=",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/types": {
+          "version": "7.6.1",
+          "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.6.1.tgz?cache=0&sync_timestamp=1567831650694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.6.1.tgz",
+          "integrity": "sha1-U6vzMIrdOsKiiE1TkVHFfEs6xkg=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
+    "@babel/types": {
+      "version": "7.5.0",
+      "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.5.0.tgz?cache=0&sync_timestamp=1562245150780&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.5.0.tgz",
+      "integrity": "sha1-5H1DhAwuf5EFvE06LDcbTQx4Mqs=",
+      "dev": true,
+      "requires": {
+        "esutils": "^2.0.2",
+        "lodash": "^4.17.11",
+        "to-fast-properties": "^2.0.0"
+      }
+    },
+    "@dcloudio/uni-app-plus": {
+      "version": "2.0.0-26920200409002",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-plus/-/uni-app-plus-2.0.0-26920200409002.tgz",
+      "integrity": "sha512-tLRQSi6TsgG1nt+t+UN14dsb8RFwglhJiGDTrFvx2asK/VdSdy8rDQiqlKMJeNC5dYWes630XpNLTPi1s0aAGQ=="
+    },
+    "@dcloudio/uni-cli-shared": {
+      "version": "0.2.994",
+      "resolved": "https://registry.npm.taobao.org/@dcloudio/uni-cli-shared/download/@dcloudio/uni-cli-shared-0.2.994.tgz",
+      "integrity": "sha1-nwAQDCHNlehezDvmRthvf/5RV1I=",
+      "dev": true,
+      "requires": {
+        "hash-sum": "^1.0.2",
+        "strip-json-comments": "^2.0.1"
+      }
+    },
+    "@dcloudio/uni-h5": {
+      "version": "2.0.0-29820201110001",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-h5/-/uni-h5-2.0.0-29820201110001.tgz",
+      "integrity": "sha512-fRpPfFIekrD8+aC/hYAzaAuNIm3SSt1FJKaQp07rItFKRh9Iq7e9/BUPtoCsH6o7G+MustYbLOr/9YXiotNyaw==",
+      "requires": {
+        "base64-arraybuffer": "^0.2.0",
+        "intersection-observer": "^0.7.0",
+        "safe-area-insets": "^1.4.1"
+      }
+    },
+    "@dcloudio/uni-mp-alipay": {
+      "version": "2.0.0-26920200409002",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-alipay/-/uni-mp-alipay-2.0.0-26920200409002.tgz",
+      "integrity": "sha512-PleZkebyWgg8SGSEKEBH3p+BtlRQ+Ic5PyV7W7ny4FSuzp5Zu61HAHIm9c3XK43EMe6rC6QpjnQ57x5EfglVlg=="
+    },
+    "@dcloudio/uni-mp-baidu": {
+      "version": "2.0.0-26920200409002",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-baidu/-/uni-mp-baidu-2.0.0-26920200409002.tgz",
+      "integrity": "sha512-EkMQTGQCqxn1thsCGb8Rhxr7txwtsAJa+U5GcTIJHJhCE0e7YVbovYgMIFDYE5T4bKNkiQmv2MD949JAIgrCCA=="
+    },
+    "@dcloudio/uni-mp-qq": {
+      "version": "2.0.0-26920200409002",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-qq/-/uni-mp-qq-2.0.0-26920200409002.tgz",
+      "integrity": "sha512-fUQzRiCC7eT8gR29D5fS0M74vOZyEEBCA4g1b2vbxKMgdb13rQdN8JLX0E/WWLrOBFm/i1G1FJRgHrXwnpKEcA=="
+    },
+    "@dcloudio/uni-mp-toutiao": {
+      "version": "2.0.0-26920200409002",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-toutiao/-/uni-mp-toutiao-2.0.0-26920200409002.tgz",
+      "integrity": "sha512-4gDY0ToN9P3C3LtyUYv4wtYqI/UDWj0O+6oxYLc1zxVAC6Er8wPBLvBH8EbB2mz0MWvvvQighsmmFxMpyDaBow=="
+    },
+    "@dcloudio/uni-mp-weixin": {
+      "version": "2.0.0-26920200409002",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-weixin/-/uni-mp-weixin-2.0.0-26920200409002.tgz",
+      "integrity": "sha512-cd3R6lJZD9saRJq9FbHxy4kZ0nsSM9D8ivC1xXbK+hQr3edhcthKkx2PnIV8uaupjDpDVqnjtsD0ENo9fqFfhA=="
+    },
+    "@dcloudio/uni-stat": {
+      "version": "0.0.113",
+      "resolved": "https://registry.npm.taobao.org/@dcloudio/uni-stat/download/@dcloudio/uni-stat-0.0.113.tgz",
+      "integrity": "sha1-M8+IvSDW6c19AdefmeEfTYOgCnQ=",
+      "dev": true
+    },
+    "@dcloudio/uni-template-compiler": {
+      "version": "0.9.183",
+      "resolved": "https://registry.npm.taobao.org/@dcloudio/uni-template-compiler/download/@dcloudio/uni-template-compiler-0.9.183.tgz",
+      "integrity": "sha1-KDIEIBfnn6YG0hppUZSDWdxmOk4=",
+      "dev": true,
+      "requires": {
+        "@babel/parser": "^7.3.3",
+        "@babel/traverse": "^7.3.3",
+        "@babel/types": "^7.3.3",
+        "vue-template-compiler": "^2.6.10"
+      }
+    },
+    "@dcloudio/vue-cli-plugin-hbuilderx": {
+      "version": "1.0.137",
+      "resolved": "https://registry.npm.taobao.org/@dcloudio/vue-cli-plugin-hbuilderx/download/@dcloudio/vue-cli-plugin-hbuilderx-1.0.137.tgz",
+      "integrity": "sha1-KGPqJ6eM5Y3yZnJ9W+ObACzioLU=",
+      "dev": true,
+      "requires": {
+        "acorn": "^5.2.1",
+        "css": "~2.2.1",
+        "escodegen": "^1.8.1"
+      }
+    },
+    "@dcloudio/vue-cli-plugin-uni": {
+      "version": "0.9.538",
+      "resolved": "https://registry.npm.taobao.org/@dcloudio/vue-cli-plugin-uni/download/@dcloudio/vue-cli-plugin-uni-0.9.538.tgz",
+      "integrity": "sha1-JknNF6/1hFQu2TJuEPRGwHXkUlc=",
+      "dev": true,
+      "requires": {
+        "@dcloudio/uni-stat": "*",
+        "copy-webpack-plugin": "^4.6.0",
+        "cross-env": "^5.2.0",
+        "envinfo": "^6.0.1",
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.1.0",
+        "module-alias": "^2.1.0",
+        "postcss": "^7.0.7",
+        "postcss-import": "^12.0.1",
+        "postcss-selector-parser": "^5.0.0",
+        "postcss-value-parser": "^3.3.1",
+        "strip-json-comments": "^2.0.1",
+        "update-check": "^1.5.3",
+        "webpack-merge": "^4.1.4",
+        "wrap-loader": "^0.2.0",
+        "xregexp": "4.0.0"
+      },
+      "dependencies": {
+        "cross-env": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.1.tgz",
+          "integrity": "sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^6.0.5"
+          }
+        }
+      }
+    },
+    "@dcloudio/webpack-uni-mp-loader": {
+      "version": "0.3.644",
+      "resolved": "https://registry.npm.taobao.org/@dcloudio/webpack-uni-mp-loader/download/@dcloudio/webpack-uni-mp-loader-0.3.644.tgz",
+      "integrity": "sha1-YQ8NMn7e0NK0LvplT3+beGzzUXw=",
+      "dev": true
+    },
+    "@dcloudio/webpack-uni-pages-loader": {
+      "version": "0.2.875",
+      "resolved": "https://registry.npm.taobao.org/@dcloudio/webpack-uni-pages-loader/download/@dcloudio/webpack-uni-pages-loader-0.2.875.tgz",
+      "integrity": "sha1-6XzHLFiqz/NHDtolEJB0yCximHg=",
+      "dev": true,
+      "requires": {
+        "merge": "^1.2.1",
+        "strip-json-comments": "^2.0.1"
+      }
+    },
+    "@hapi/address": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/@hapi/address/download/@hapi/address-2.0.0.tgz",
+      "integrity": "sha1-nwVGnIjLL9Pc1iR3a1TulcMSEmo=",
+      "dev": true
+    },
+    "@hapi/hoek": {
+      "version": "6.2.4",
+      "resolved": "https://registry.npm.taobao.org/@hapi/hoek/download/@hapi/hoek-6.2.4.tgz",
+      "integrity": "sha1-S5X7rMv7qQGFaQiQvfGi+72hBZU=",
+      "dev": true
+    },
+    "@hapi/joi": {
+      "version": "15.1.0",
+      "resolved": "https://registry.npm.taobao.org/@hapi/joi/download/@hapi/joi-15.1.0.tgz?cache=0&sync_timestamp=1561256488016&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Fjoi%2Fdownload%2F%40hapi%2Fjoi-15.1.0.tgz",
+      "integrity": "sha1-lAy3SbXFXCarOzTONi6CthYsjno=",
+      "dev": true,
+      "requires": {
+        "@hapi/address": "2.x.x",
+        "@hapi/hoek": "6.x.x",
+        "@hapi/marker": "1.x.x",
+        "@hapi/topo": "3.x.x"
+      }
+    },
+    "@hapi/marker": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/@hapi/marker/download/@hapi/marker-1.0.0.tgz",
+      "integrity": "sha1-ZbCysB0b4GMEiGzptLd7G/shp2k=",
+      "dev": true
+    },
+    "@hapi/topo": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npm.taobao.org/@hapi/topo/download/@hapi/topo-3.1.2.tgz",
+      "integrity": "sha1-V8wTF74ajF9HwST5sOPEnNeEJNI=",
+      "dev": true,
+      "requires": {
+        "@hapi/hoek": "8.x.x"
+      },
+      "dependencies": {
+        "@hapi/hoek": {
+          "version": "8.0.2",
+          "resolved": "https://registry.npm.taobao.org/@hapi/hoek/download/@hapi/hoek-8.0.2.tgz",
+          "integrity": "sha1-9jpf8A6JGk56qY8REZ+VFcZnIDI=",
+          "dev": true
+        }
+      }
+    },
+    "@intervolga/optimize-cssnano-plugin": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz",
+      "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==",
+      "dev": true,
+      "requires": {
+        "cssnano": "^4.0.0",
+        "cssnano-preset-default": "^4.0.0",
+        "postcss": "^7.0.0"
+      }
+    },
+    "@mrmlnc/readdir-enhanced": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+      "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+      "dev": true,
+      "requires": {
+        "call-me-maybe": "^1.0.1",
+        "glob-to-regexp": "^0.3.0"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
+      "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
+      "dev": true
+    },
+    "@soda/friendly-errors-webpack-plugin": {
+      "version": "1.7.1",
+      "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.1.tgz",
+      "integrity": "sha512-cWKrGaFX+rfbMrAxVv56DzhPNqOJPZuNIS2HGMELtgGzb+vsMzyig9mml5gZ/hr2BGtSLV+dP2LUEuAL8aG2mQ==",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "error-stack-parser": "^2.0.0",
+        "string-width": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "@types/events": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
+      "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
+      "dev": true
+    },
+    "@types/glob": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
+      "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
+      "dev": true,
+      "requires": {
+        "@types/events": "*",
+        "@types/minimatch": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/html5plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/@types/html5plus/download/@types/html5plus-1.0.0.tgz",
+      "integrity": "sha1-qIYA/J3oW3hZWXVK6kA8Co0HFLo=",
+      "dev": true
+    },
+    "@types/minimatch": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+      "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "12.7.5",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.5.tgz",
+      "integrity": "sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==",
+      "dev": true
+    },
+    "@types/normalize-package-data": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+      "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
+      "dev": true
+    },
+    "@types/q": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz",
+      "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==",
+      "dev": true
+    },
+    "@types/uni-app": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@types/uni-app/-/uni-app-1.4.0.tgz",
+      "integrity": "sha512-qRrNTzPOVTIDzDQWJ4zXhKxfnk4LfQwkf5HVBMWL/d0ke039eHbmlhZJCm7kIxa0fa/mNgREkWDgvzs2Uz2y3A==",
+      "dev": true,
+      "requires": {
+        "vue": "^2.6.8"
+      }
+    },
+    "@vue/babel-helper-vue-jsx-merge-props": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.0.0.tgz",
+      "integrity": "sha1-BI/leZWNpAj7eosqPsBQtQpmEEA=",
+      "dev": true
+    },
+    "@vue/babel-plugin-transform-vue-jsx": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-plugin-transform-vue-jsx/download/@vue/babel-plugin-transform-vue-jsx-1.0.0.tgz",
+      "integrity": "sha1-68vznDEslBFMjE9AfuT2yXqkVDI=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/plugin-syntax-jsx": "^7.2.0",
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
+        "html-tags": "^2.0.0",
+        "lodash.kebabcase": "^4.1.1",
+        "svg-tags": "^1.0.0"
+      }
+    },
+    "@vue/babel-preset-app": {
+      "version": "3.11.0",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-preset-app/download/@vue/babel-preset-app-3.11.0.tgz",
+      "integrity": "sha1-Ur95wVVgowShP0dw4+VTDgHdYXM=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/plugin-proposal-class-properties": "^7.0.0",
+        "@babel/plugin-proposal-decorators": "^7.1.0",
+        "@babel/plugin-syntax-dynamic-import": "^7.0.0",
+        "@babel/plugin-syntax-jsx": "^7.0.0",
+        "@babel/plugin-transform-runtime": "^7.4.0",
+        "@babel/preset-env": "^7.0.0 < 7.4.0",
+        "@babel/runtime": "^7.0.0",
+        "@babel/runtime-corejs2": "^7.2.0",
+        "@vue/babel-preset-jsx": "^1.0.0",
+        "babel-plugin-dynamic-import-node": "^2.2.0",
+        "babel-plugin-module-resolver": "3.2.0",
+        "core-js": "^2.6.5"
+      }
+    },
+    "@vue/babel-preset-jsx": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-preset-jsx/download/@vue/babel-preset-jsx-1.1.0.tgz",
+      "integrity": "sha1-yAATKfWzcil6MRGiUetPnpVsEmY=",
+      "dev": true,
+      "requires": {
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.0.0",
+        "@vue/babel-sugar-functional-vue": "^1.0.0",
+        "@vue/babel-sugar-inject-h": "^1.0.0",
+        "@vue/babel-sugar-v-model": "^1.0.0",
+        "@vue/babel-sugar-v-on": "^1.1.0"
+      }
+    },
+    "@vue/babel-sugar-functional-vue": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-functional-vue/download/@vue/babel-sugar-functional-vue-1.0.0.tgz",
+      "integrity": "sha1-F+LEyie3SyRNo7kjJA7JHRAEjLM=",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0"
+      }
+    },
+    "@vue/babel-sugar-inject-h": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-inject-h/download/@vue/babel-sugar-inject-h-1.0.0.tgz",
+      "integrity": "sha1-5e+2xbW3mI3AODGvbRM797zeY0c=",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0"
+      }
+    },
+    "@vue/babel-sugar-v-model": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-v-model/download/@vue/babel-sugar-v-model-1.0.0.tgz",
+      "integrity": "sha1-9NpWqmf2WjSb0sJpqV5y5gGvRhM=",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0",
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.0.0",
+        "camelcase": "^5.0.0",
+        "html-tags": "^2.0.0",
+        "svg-tags": "^1.0.0"
+      }
+    },
+    "@vue/babel-sugar-v-on": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-v-on/download/@vue/babel-sugar-v-on-1.1.0.tgz",
+      "integrity": "sha1-Hys17uq7h+r4klkx9NNP2OZASkU=",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.0.0",
+        "camelcase": "^5.0.0"
+      }
+    },
+    "@vue/cli-overlay": {
+      "version": "3.11.0",
+      "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-3.11.0.tgz",
+      "integrity": "sha512-yYZP27vjioWmohwXQ9mTPHHxktfAaTM6RDehyG83yvY07wcdxhwrNNCMm8eE9My/K2F8oAPf8uoDZZmkr/EXBw==",
+      "dev": true
+    },
+    "@vue/cli-plugin-babel": {
+      "version": "3.11.0",
+      "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-babel/download/@vue/cli-plugin-babel-3.11.0.tgz",
+      "integrity": "sha1-JHpyMxAKM+oP2ffTC98rm1VOnog=",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.0.0",
+        "@vue/babel-preset-app": "^3.11.0",
+        "@vue/cli-shared-utils": "^3.11.0",
+        "babel-loader": "^8.0.5",
+        "webpack": "^4.0.0"
+      }
+    },
+    "@vue/cli-service": {
+      "version": "3.11.0",
+      "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-3.11.0.tgz",
+      "integrity": "sha512-HSU4wHlYKQt8O968JUz/AeYvFSokxJjMkr7dgVNVb6rpBn859Emkr960plWGr1z1hc3qNOwLuSUGk5OSfq1inA==",
+      "dev": true,
+      "requires": {
+        "@intervolga/optimize-cssnano-plugin": "^1.0.5",
+        "@soda/friendly-errors-webpack-plugin": "^1.7.1",
+        "@vue/cli-overlay": "^3.11.0",
+        "@vue/cli-shared-utils": "^3.11.0",
+        "@vue/component-compiler-utils": "^3.0.0",
+        "@vue/preload-webpack-plugin": "^1.1.0",
+        "@vue/web-component-wrapper": "^1.2.0",
+        "acorn": "^6.1.1",
+        "acorn-walk": "^6.1.1",
+        "address": "^1.0.3",
+        "autoprefixer": "^9.5.1",
+        "browserslist": "^4.5.4",
+        "cache-loader": "^2.0.1",
+        "case-sensitive-paths-webpack-plugin": "^2.2.0",
+        "chalk": "^2.4.2",
+        "cli-highlight": "^2.1.0",
+        "clipboardy": "^2.0.0",
+        "cliui": "^5.0.0",
+        "copy-webpack-plugin": "^4.6.0",
+        "css-loader": "^1.0.1",
+        "cssnano": "^4.1.10",
+        "current-script-polyfill": "^1.0.0",
+        "debug": "^4.1.1",
+        "default-gateway": "^5.0.2",
+        "dotenv": "^7.0.0",
+        "dotenv-expand": "^5.1.0",
+        "escape-string-regexp": "^1.0.5",
+        "file-loader": "^3.0.1",
+        "fs-extra": "^7.0.1",
+        "globby": "^9.2.0",
+        "hash-sum": "^1.0.2",
+        "html-webpack-plugin": "^3.2.0",
+        "launch-editor-middleware": "^2.2.1",
+        "lodash.defaultsdeep": "^4.6.1",
+        "lodash.mapvalues": "^4.6.0",
+        "lodash.transform": "^4.6.0",
+        "mini-css-extract-plugin": "^0.6.0",
+        "minimist": "^1.2.0",
+        "ora": "^3.4.0",
+        "portfinder": "^1.0.20",
+        "postcss-loader": "^3.0.0",
+        "read-pkg": "^5.0.0",
+        "semver": "^6.0.0",
+        "slash": "^2.0.0",
+        "source-map-url": "^0.4.0",
+        "ssri": "^6.0.1",
+        "string.prototype.padend": "^3.0.0",
+        "terser-webpack-plugin": "^1.2.3",
+        "thread-loader": "^2.1.2",
+        "url-loader": "^1.1.2",
+        "vue-loader": "^15.7.0",
+        "webpack": "^4.0.0",
+        "webpack-bundle-analyzer": "^3.3.0",
+        "webpack-chain": "^4.11.0",
+        "webpack-dev-server": "^3.4.1",
+        "webpack-merge": "^4.2.1"
+      },
+      "dependencies": {
+        "@vue/cli-shared-utils": {
+          "version": "3.11.0",
+          "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-3.11.0.tgz",
+          "integrity": "sha512-D7pst/4v9H1DD66fLxlZOwRR09R03MV0ROdKxBHmh3FmnApCA/RiaolFA/8w+B3CnevYMlV3SJ5fOAgedbswbA==",
+          "dev": true,
+          "requires": {
+            "@hapi/joi": "^15.0.1",
+            "chalk": "^2.4.1",
+            "execa": "^1.0.0",
+            "launch-editor": "^2.2.1",
+            "lru-cache": "^5.1.1",
+            "node-ipc": "^9.1.1",
+            "open": "^6.3.0",
+            "ora": "^3.4.0",
+            "request": "^2.87.0",
+            "request-promise-native": "^1.0.7",
+            "semver": "^6.0.0",
+            "string.prototype.padstart": "^3.0.0"
+          }
+        },
+        "acorn": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz",
+          "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==",
+          "dev": true
+        },
+        "globby": {
+          "version": "9.2.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz",
+          "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==",
+          "dev": true,
+          "requires": {
+            "@types/glob": "^7.1.1",
+            "array-union": "^1.0.2",
+            "dir-glob": "^2.2.2",
+            "fast-glob": "^2.2.6",
+            "glob": "^7.1.3",
+            "ignore": "^4.0.3",
+            "pify": "^4.0.1",
+            "slash": "^2.0.0"
+          }
+        },
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "dev": true
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "yallist": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
+          "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
+          "dev": true
+        }
+      }
+    },
+    "@vue/cli-shared-utils": {
+      "version": "3.11.0",
+      "resolved": "https://registry.npm.taobao.org/@vue/cli-shared-utils/download/@vue/cli-shared-utils-3.11.0.tgz",
+      "integrity": "sha1-o9b4CbDfs2fmJrcUBfhd6gYxMQs=",
+      "dev": true,
+      "requires": {
+        "@hapi/joi": "^15.0.1",
+        "chalk": "^2.4.1",
+        "execa": "^1.0.0",
+        "launch-editor": "^2.2.1",
+        "lru-cache": "^5.1.1",
+        "node-ipc": "^9.1.1",
+        "open": "^6.3.0",
+        "ora": "^3.4.0",
+        "request": "^2.87.0",
+        "request-promise-native": "^1.0.7",
+        "semver": "^6.0.0",
+        "string.prototype.padstart": "^3.0.0"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz",
+          "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1565627380363&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
+          "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=",
+          "dev": true
+        },
+        "yallist": {
+          "version": "3.0.3",
+          "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-3.0.3.tgz",
+          "integrity": "sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=",
+          "dev": true
+        }
+      }
+    },
+    "@vue/component-compiler-utils": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.0.0.tgz",
+      "integrity": "sha512-am+04/0UX7ektcmvhYmrf84BDVAD8afFOf4asZjN84q8xzxFclbk5x0MtxuKGfp+zjN5WWPJn3fjFAWtDdIGSw==",
+      "dev": true,
+      "requires": {
+        "consolidate": "^0.15.1",
+        "hash-sum": "^1.0.2",
+        "lru-cache": "^4.1.2",
+        "merge-source-map": "^1.1.0",
+        "postcss": "^7.0.14",
+        "postcss-selector-parser": "^5.0.0",
+        "prettier": "1.16.3",
+        "source-map": "~0.6.1",
+        "vue-template-es2015-compiler": "^1.9.0"
+      }
+    },
+    "@vue/preload-webpack-plugin": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.1.tgz",
+      "integrity": "sha512-8VCoJeeH8tCkzhkpfOkt+abALQkS11OIHhte5MBzYaKMTqK0A3ZAKEUVAffsOklhEv7t0yrQt696Opnu9oAx+w==",
+      "dev": true
+    },
+    "@vue/web-component-wrapper": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.2.0.tgz",
+      "integrity": "sha512-Xn/+vdm9CjuC9p3Ae+lTClNutrVhsXpzxvoTXXtoys6kVRX9FkueSUAqSWAyZntmVLlR4DosBV4pH8y5Z/HbUw==",
+      "dev": true
+    },
+    "@webassemblyjs/ast": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/ast/download/@webassemblyjs/ast-1.7.11.tgz",
+      "integrity": "sha1-uYhYLK+7Kwlei1VlJvMMkNBXys4=",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/helper-module-context": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/wast-parser": "1.7.11"
+      }
+    },
+    "@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.7.11.tgz",
+      "integrity": "sha1-pp8K9lAuuaPARVVbGmEp09Py4xM=",
+      "dev": true
+    },
+    "@webassemblyjs/helper-api-error": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.7.11.tgz",
+      "integrity": "sha1-x7a7gQX4QDlRGis5zklPGTgYoyo=",
+      "dev": true
+    },
+    "@webassemblyjs/helper-buffer": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.7.11.tgz",
+      "integrity": "sha1-MSLUjcxslFbtmC3r4WyPNxAd85s=",
+      "dev": true
+    },
+    "@webassemblyjs/helper-code-frame": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-code-frame/download/@webassemblyjs/helper-code-frame-1.7.11.tgz",
+      "integrity": "sha1-z48QbnRmYqDaKb3vY1/NPRJINks=",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/wast-printer": "1.7.11"
+      }
+    },
+    "@webassemblyjs/helper-fsm": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-fsm/download/@webassemblyjs/helper-fsm-1.7.11.tgz",
+      "integrity": "sha1-3ziIKmJAgNA/dQP5Pj8XrFrAEYE=",
+      "dev": true
+    },
+    "@webassemblyjs/helper-module-context": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-module-context/download/@webassemblyjs/helper-module-context-1.7.11.tgz",
+      "integrity": "sha1-2HTXIuUeYqwgJHaTXWScgC+g4gk=",
+      "dev": true
+    },
+    "@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.7.11.tgz",
+      "integrity": "sha1-3ZoegX8cLrEFtM8QEwk8ufPJywY=",
+      "dev": true
+    },
+    "@webassemblyjs/helper-wasm-section": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.7.11.tgz",
+      "integrity": "sha1-nJrEHs+fvP/8lvbSZ14t4zgR5oo=",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-buffer": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/wasm-gen": "1.7.11"
+      }
+    },
+    "@webassemblyjs/ieee754": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.7.11.tgz",
+      "integrity": "sha1-yVg562N1ejGICq7HtlEtQZGsZAs=",
+      "dev": true,
+      "requires": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "@webassemblyjs/leb128": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.7.11.tgz",
+      "integrity": "sha1-1yZ6HunEWU/T9+NymIGOxlaH22M=",
+      "dev": true,
+      "requires": {
+        "@xtuc/long": "4.2.1"
+      }
+    },
+    "@webassemblyjs/utf8": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.7.11.tgz",
+      "integrity": "sha1-Btchjqn9yUpnk6qSIIFg2z0m7oI=",
+      "dev": true
+    },
+    "@webassemblyjs/wasm-edit": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.7.11.tgz",
+      "integrity": "sha1-jHTKR01PlR0B266b1wgU7iKoIAU=",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-buffer": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/helper-wasm-section": "1.7.11",
+        "@webassemblyjs/wasm-gen": "1.7.11",
+        "@webassemblyjs/wasm-opt": "1.7.11",
+        "@webassemblyjs/wasm-parser": "1.7.11",
+        "@webassemblyjs/wast-printer": "1.7.11"
+      }
+    },
+    "@webassemblyjs/wasm-gen": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.7.11.tgz",
+      "integrity": "sha1-m7upQvIjdWhqb7dZr816ycRdoag=",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/ieee754": "1.7.11",
+        "@webassemblyjs/leb128": "1.7.11",
+        "@webassemblyjs/utf8": "1.7.11"
+      }
+    },
+    "@webassemblyjs/wasm-opt": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.7.11.tgz",
+      "integrity": "sha1-szHo5874+OLwB9QsOjagWAp9bKc=",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-buffer": "1.7.11",
+        "@webassemblyjs/wasm-gen": "1.7.11",
+        "@webassemblyjs/wasm-parser": "1.7.11"
+      }
+    },
+    "@webassemblyjs/wasm-parser": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.7.11.tgz",
+      "integrity": "sha1-bj0g+mo1GfawhO+Tka1YIR77Cho=",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-api-error": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/ieee754": "1.7.11",
+        "@webassemblyjs/leb128": "1.7.11",
+        "@webassemblyjs/utf8": "1.7.11"
+      }
+    },
+    "@webassemblyjs/wast-parser": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wast-parser/download/@webassemblyjs/wast-parser-1.7.11.tgz",
+      "integrity": "sha1-Jb0RdWLKjAAnIP+BFu+QctnKhpw=",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/floating-point-hex-parser": "1.7.11",
+        "@webassemblyjs/helper-api-error": "1.7.11",
+        "@webassemblyjs/helper-code-frame": "1.7.11",
+        "@webassemblyjs/helper-fsm": "1.7.11",
+        "@xtuc/long": "4.2.1"
+      }
+    },
+    "@webassemblyjs/wast-printer": {
+      "version": "1.7.11",
+      "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.7.11.tgz",
+      "integrity": "sha1-xCRbbeJCy1CizJUBdP2/ZceNeBM=",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/wast-parser": "1.7.11",
+        "@xtuc/long": "4.2.1"
+      }
+    },
+    "@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz",
+      "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=",
+      "dev": true
+    },
+    "@xtuc/long": {
+      "version": "4.2.1",
+      "resolved": "http://registry.npm.taobao.org/@xtuc/long/download/@xtuc/long-4.2.1.tgz",
+      "integrity": "sha1-XIXWYvdvodNFdXZsXc1mFavNMNg=",
+      "dev": true
+    },
+    "abbrev": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz",
+      "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=",
+      "dev": true
+    },
+    "accepts": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+      "dev": true,
+      "requires": {
+        "mime-types": "~2.1.24",
+        "negotiator": "0.6.2"
+      }
+    },
+    "acorn": {
+      "version": "5.7.3",
+      "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-5.7.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-5.7.3.tgz",
+      "integrity": "sha1-Z6ojG/iBKXS4UjWpZ3Hra9B+onk=",
+      "dev": true
+    },
+    "acorn-dynamic-import": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/acorn-dynamic-import/download/acorn-dynamic-import-3.0.0.tgz",
+      "integrity": "sha1-kBzu5Mf6rvfgetKkfokGddpQong=",
+      "dev": true,
+      "requires": {
+        "acorn": "^5.0.0"
+      }
+    },
+    "acorn-walk": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
+      "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==",
+      "dev": true
+    },
+    "address": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz",
+      "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
+      "dev": true
+    },
+    "ajv": {
+      "version": "6.10.2",
+      "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.10.2.tgz",
+      "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=",
+      "requires": {
+        "fast-deep-equal": "^2.0.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "ajv-errors": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/ajv-errors/download/ajv-errors-1.0.1.tgz",
+      "integrity": "sha1-81mGrOuRr63sQQL72FAUlQzvpk0=",
+      "dev": true
+    },
+    "ajv-keywords": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.4.1.tgz",
+      "integrity": "sha1-75FuJxxkrBIXH9g4TqrmsjRYVNo=",
+      "dev": true
+    },
+    "alphanum-sort": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/alphanum-sort/download/alphanum-sort-1.0.2.tgz",
+      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
+      "dev": true
+    },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+      "dev": true
+    },
+    "ansi-colors": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
+      "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
+      "dev": true
+    },
+    "ansi-html": {
+      "version": "0.0.7",
+      "resolved": "http://registry.npm.taobao.org/ansi-html/download/ansi-html-0.0.7.tgz",
+      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
+      "dev": true
+    },
+    "ansi-regex": {
+      "version": "4.1.0",
+      "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz",
+      "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-3.2.1.tgz",
+      "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "any-promise": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz",
+      "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
+      "dev": true
+    },
+    "anymatch": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fanymatch%2Fdownload%2Fanymatch-2.0.0.tgz",
+      "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=",
+      "dev": true,
+      "requires": {
+        "micromatch": "^3.1.4",
+        "normalize-path": "^2.1.1"
+      },
+      "dependencies": {
+        "normalize-path": {
+          "version": "2.1.1",
+          "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz",
+          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+          "dev": true,
+          "requires": {
+            "remove-trailing-separator": "^1.0.1"
+          }
+        }
+      }
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz",
+      "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=",
+      "dev": true
+    },
+    "arch": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz",
+      "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==",
+      "dev": true
+    },
+    "are-we-there-yet": {
+      "version": "1.1.5",
+      "resolved": "http://registry.npm.taobao.org/are-we-there-yet/download/are-we-there-yet-1.1.5.tgz",
+      "integrity": "sha1-SzXClE8GKov82mZBB2A1D+nd/CE=",
+      "dev": true,
+      "requires": {
+        "delegates": "^1.0.0",
+        "readable-stream": "^2.0.6"
+      }
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "arr-diff": {
+      "version": "4.0.0",
+      "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz",
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+      "dev": true
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz",
+      "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=",
+      "dev": true
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "http://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true
+    },
+    "array-filter": {
+      "version": "0.0.1",
+      "resolved": "http://registry.npm.taobao.org/array-filter/download/array-filter-0.0.1.tgz",
+      "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
+      "dev": true
+    },
+    "array-find-index": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+      "dev": true
+    },
+    "array-flatten": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz",
+      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+      "dev": true
+    },
+    "array-map": {
+      "version": "0.0.0",
+      "resolved": "http://registry.npm.taobao.org/array-map/download/array-map-0.0.0.tgz",
+      "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
+      "dev": true
+    },
+    "array-reduce": {
+      "version": "0.0.0",
+      "resolved": "http://registry.npm.taobao.org/array-reduce/download/array-reduce-0.0.0.tgz",
+      "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
+      "dev": true
+    },
+    "array-union": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "dev": true,
+      "requires": {
+        "array-uniq": "^1.0.1"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true
+    },
+    "array-unique": {
+      "version": "0.3.2",
+      "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz",
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+      "dev": true
+    },
+    "asn1": {
+      "version": "0.2.4",
+      "resolved": "http://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz",
+      "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=",
+      "requires": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "asn1.js": {
+      "version": "4.10.1",
+      "resolved": "https://registry.npm.taobao.org/asn1.js/download/asn1.js-4.10.1.tgz",
+      "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "assert": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npm.taobao.org/assert/download/assert-1.5.0.tgz",
+      "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=",
+      "dev": true,
+      "requires": {
+        "object-assign": "^4.1.1",
+        "util": "0.10.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+          "dev": true
+        },
+        "util": {
+          "version": "0.10.3",
+          "resolved": "https://registry.npm.taobao.org/util/download/util-0.10.3.tgz",
+          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.1"
+          }
+        }
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz",
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true
+    },
+    "async": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npm.taobao.org/async/download/async-1.5.2.tgz?cache=0&sync_timestamp=1563147078542&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fasync%2Fdownload%2Fasync-1.5.2.tgz",
+      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+      "dev": true
+    },
+    "async-each": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz",
+      "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=",
+      "dev": true
+    },
+    "async-foreach": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
+      "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
+      "dev": true
+    },
+    "async-limiter": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+      "dev": true
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "http://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz",
+      "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=",
+      "dev": true
+    },
+    "autoprefixer": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz",
+      "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.6.3",
+        "caniuse-lite": "^1.0.30000980",
+        "chalk": "^2.4.2",
+        "normalize-range": "^0.1.2",
+        "num2fraction": "^1.2.2",
+        "postcss": "^7.0.17",
+        "postcss-value-parser": "^4.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz",
+          "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==",
+          "dev": true
+        }
+      }
+    },
+    "aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz",
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+    },
+    "aws4": {
+      "version": "1.8.0",
+      "resolved": "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz",
+      "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8="
+    },
+    "babel-code-frame": {
+      "version": "6.26.0",
+      "resolved": "http://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz",
+      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "esutils": "^2.0.2",
+        "js-tokens": "^3.0.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "js-tokens": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz",
+          "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "babel-loader": {
+      "version": "8.0.6",
+      "resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.0.6.tgz",
+      "integrity": "sha1-4zvbbzYrA/S7FBoMIauHxQG3Dfs=",
+      "dev": true,
+      "requires": {
+        "find-cache-dir": "^2.0.0",
+        "loader-utils": "^1.0.2",
+        "mkdirp": "^0.5.1",
+        "pify": "^4.0.1"
+      },
+      "dependencies": {
+        "find-cache-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-2.1.0.tgz",
+          "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=",
+          "dev": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "make-dir": "^2.0.0",
+            "pkg-dir": "^3.0.0"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz",
+          "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz",
+          "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "make-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz",
+          "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=",
+          "dev": true,
+          "requires": {
+            "pify": "^4.0.1",
+            "semver": "^5.6.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.2.1.tgz",
+          "integrity": "sha1-qgeniMwxUck5tRMfY1cPDdIAlTc=",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz",
+          "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz",
+          "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=",
+          "dev": true
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "http://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz",
+          "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-3.0.0.tgz",
+          "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=",
+          "dev": true,
+          "requires": {
+            "find-up": "^3.0.0"
+          }
+        }
+      }
+    },
+    "babel-plugin-dynamic-import-node": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-plugin-dynamic-import-node%2Fdownload%2Fbabel-plugin-dynamic-import-node-2.3.0.tgz",
+      "integrity": "sha1-8A9Qe9qjw+P/bn5emNkKesq5b38=",
+      "dev": true,
+      "requires": {
+        "object.assign": "^4.1.0"
+      }
+    },
+    "babel-plugin-import": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.12.1.tgz",
+      "integrity": "sha512-3BwVJFEByTUyqZWOxizr/YwYcqqre2EebmgSUtXyToJbHzJv6rTxA0LApDntvwERlmIvcM6lUktUN0snMTjOsA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/runtime": "^7.0.0"
+      }
+    },
+    "babel-plugin-module-resolver": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npm.taobao.org/babel-plugin-module-resolver/download/babel-plugin-module-resolver-3.2.0.tgz",
+      "integrity": "sha1-3fpeMB47mqEthSqZefGLN4gf9ac=",
+      "dev": true,
+      "requires": {
+        "find-babel-config": "^1.1.0",
+        "glob": "^7.1.2",
+        "pkg-up": "^2.0.0",
+        "reselect": "^3.0.1",
+        "resolve": "^1.4.0"
+      }
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "dev": true
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "http://registry.npm.taobao.org/base/download/base-0.11.2.tgz",
+      "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=",
+      "dev": true,
+      "requires": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "base64-arraybuffer": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz",
+      "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ=="
+    },
+    "base64-js": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/base64-js/download/base64-js-1.3.0.tgz",
+      "integrity": "sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM=",
+      "dev": true
+    },
+    "batch": {
+      "version": "0.6.1",
+      "resolved": "http://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+      "dev": true
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "requires": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "bfj": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz",
+      "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.5",
+        "check-types": "^8.0.3",
+        "hoopy": "^0.1.4",
+        "tryer": "^1.0.1"
+      }
+    },
+    "big.js": {
+      "version": "5.2.2",
+      "resolved": "http://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz",
+      "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=",
+      "dev": true
+    },
+    "binary-extensions": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz",
+      "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=",
+      "dev": true
+    },
+    "block-stream": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+      "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+      "dev": true,
+      "requires": {
+        "inherits": "~2.0.0"
+      }
+    },
+    "bluebird": {
+      "version": "3.5.5",
+      "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.5.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbluebird%2Fdownload%2Fbluebird-3.5.5.tgz",
+      "integrity": "sha1-qNCv1zJR7/u9X+OEp31zADwXpx8=",
+      "dev": true
+    },
+    "bn.js": {
+      "version": "4.11.8",
+      "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.8.tgz",
+      "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=",
+      "dev": true
+    },
+    "body-parser": {
+      "version": "1.19.0",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+      "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+      "dev": true,
+      "requires": {
+        "bytes": "3.1.0",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "on-finished": "~2.3.0",
+        "qs": "6.7.0",
+        "raw-body": "2.4.0",
+        "type-is": "~1.6.17"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+          "dev": true
+        }
+      }
+    },
+    "bonjour": {
+      "version": "3.5.0",
+      "resolved": "http://registry.npm.taobao.org/bonjour/download/bonjour-3.5.0.tgz",
+      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+      "dev": true,
+      "requires": {
+        "array-flatten": "^2.1.0",
+        "deep-equal": "^1.0.1",
+        "dns-equal": "^1.0.0",
+        "dns-txt": "^2.0.2",
+        "multicast-dns": "^6.0.1",
+        "multicast-dns-service-types": "^1.1.0"
+      },
+      "dependencies": {
+        "array-flatten": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
+          "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
+          "dev": true
+        }
+      }
+    },
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+      "dev": true
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz",
+      "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz",
+      "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+      "dev": true
+    },
+    "browserify-aes": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.2.0.tgz",
+      "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=",
+      "dev": true,
+      "requires": {
+        "buffer-xor": "^1.0.3",
+        "cipher-base": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.3",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "browserify-cipher": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=",
+      "dev": true,
+      "requires": {
+        "browserify-aes": "^1.0.4",
+        "browserify-des": "^1.0.0",
+        "evp_bytestokey": "^1.0.0"
+      }
+    },
+    "browserify-des": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.2.tgz",
+      "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "des.js": "^1.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "browserify-rsa": {
+      "version": "4.0.1",
+      "resolved": "http://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.0.1.tgz",
+      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "randombytes": "^2.0.1"
+      }
+    },
+    "browserify-sign": {
+      "version": "4.0.4",
+      "resolved": "http://registry.npm.taobao.org/browserify-sign/download/browserify-sign-4.0.4.tgz",
+      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.1",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.2",
+        "elliptic": "^6.0.0",
+        "inherits": "^2.0.1",
+        "parse-asn1": "^5.0.0"
+      }
+    },
+    "browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "http://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=",
+      "dev": true,
+      "requires": {
+        "pako": "~1.0.5"
+      }
+    },
+    "browserslist": {
+      "version": "4.6.6",
+      "resolved": "https://registry.npm.taobao.org/browserslist/download/browserslist-4.6.6.tgz",
+      "integrity": "sha1-bkv0Z83lILydvfN0fa+gNTHOxFM=",
+      "dev": true,
+      "requires": {
+        "caniuse-lite": "^1.0.30000984",
+        "electron-to-chromium": "^1.3.191",
+        "node-releases": "^1.1.25"
+      }
+    },
+    "buffer": {
+      "version": "4.9.1",
+      "resolved": "http://registry.npm.taobao.org/buffer/download/buffer-4.9.1.tgz",
+      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+      "dev": true,
+      "requires": {
+        "base64-js": "^1.0.2",
+        "ieee754": "^1.1.4",
+        "isarray": "^1.0.0"
+      }
+    },
+    "buffer-from": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz",
+      "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=",
+      "dev": true
+    },
+    "buffer-indexof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
+      "dev": true
+    },
+    "buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+      "dev": true
+    },
+    "builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+      "dev": true
+    },
+    "bytes": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+      "dev": true
+    },
+    "cacache": {
+      "version": "10.0.4",
+      "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-10.0.4.tgz?cache=0&sync_timestamp=1560788095566&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-10.0.4.tgz",
+      "integrity": "sha1-ZFI2eZnv+dQYiu/ZoU6dfGomNGA=",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.1",
+        "chownr": "^1.0.1",
+        "glob": "^7.1.2",
+        "graceful-fs": "^4.1.11",
+        "lru-cache": "^4.1.1",
+        "mississippi": "^2.0.0",
+        "mkdirp": "^0.5.1",
+        "move-concurrently": "^1.0.1",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^2.6.2",
+        "ssri": "^5.2.4",
+        "unique-filename": "^1.1.0",
+        "y18n": "^4.0.0"
+      }
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz",
+      "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=",
+      "dev": true,
+      "requires": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      }
+    },
+    "cache-loader": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-2.0.1.tgz",
+      "integrity": "sha512-V99T3FOynmGx26Zom+JrVBytLBsmUCzVG2/4NnUKgvXN4bEV42R1ERl1IyiH/cvFIDA1Ytq2lPZ9tXDSahcQpQ==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "mkdirp": "^0.5.1",
+        "neo-async": "^2.6.0",
+        "normalize-path": "^3.0.0",
+        "schema-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
+      }
+    },
+    "call-me-maybe": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/call-me-maybe/download/call-me-maybe-1.0.1.tgz",
+      "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+      "dev": true
+    },
+    "caller-callsite": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/caller-callsite/download/caller-callsite-2.0.0.tgz?cache=0&sync_timestamp=1562668933683&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaller-callsite%2Fdownload%2Fcaller-callsite-2.0.0.tgz",
+      "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
+      "dev": true,
+      "requires": {
+        "callsites": "^2.0.0"
+      }
+    },
+    "caller-path": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/caller-path/download/caller-path-2.0.0.tgz",
+      "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
+      "dev": true,
+      "requires": {
+        "caller-callsite": "^2.0.0"
+      }
+    },
+    "callsites": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-2.0.0.tgz",
+      "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
+      "dev": true
+    },
+    "camel-case": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz",
+      "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+      "dev": true,
+      "requires": {
+        "no-case": "^2.2.0",
+        "upper-case": "^1.1.1"
+      }
+    },
+    "camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz",
+      "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=",
+      "dev": true
+    },
+    "camelcase-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "dev": true,
+      "requires": {
+        "camelcase": "^2.0.0",
+        "map-obj": "^1.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+          "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+          "dev": true
+        }
+      }
+    },
+    "caniuse-api": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+      "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-lite": "^1.0.0",
+        "lodash.memoize": "^4.1.2",
+        "lodash.uniq": "^4.5.0"
+      }
+    },
+    "caniuse-lite": {
+      "version": "1.0.30000984",
+      "resolved": "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000984.tgz",
+      "integrity": "sha1-3JbDxGnpvPxq1b3STHfskY6nb+A=",
+      "dev": true
+    },
+    "case-sensitive-paths-webpack-plugin": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz",
+      "integrity": "sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g==",
+      "dev": true
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+    },
+    "chalk": {
+      "version": "2.4.2",
+      "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz",
+      "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "dependencies": {
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz",
+          "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "check-types": {
+      "version": "8.0.3",
+      "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz",
+      "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==",
+      "dev": true
+    },
+    "chokidar": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.6.tgz?cache=0&sync_timestamp=1562457945399&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-2.1.6.tgz",
+      "integrity": "sha1-tsrWU6kp4kTOioNCRBZNJB+pVMU=",
+      "dev": true,
+      "requires": {
+        "anymatch": "^2.0.0",
+        "async-each": "^1.0.1",
+        "braces": "^2.3.2",
+        "fsevents": "^1.2.7",
+        "glob-parent": "^3.1.0",
+        "inherits": "^2.0.3",
+        "is-binary-path": "^1.0.0",
+        "is-glob": "^4.0.0",
+        "normalize-path": "^3.0.0",
+        "path-is-absolute": "^1.0.0",
+        "readdirp": "^2.2.1",
+        "upath": "^1.1.1"
+      }
+    },
+    "chownr": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-1.1.2.tgz",
+      "integrity": "sha1-oY8eCyacimpdPIbrKYvrFMPde/Y=",
+      "dev": true
+    },
+    "chrome-trace-event": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/chrome-trace-event/download/chrome-trace-event-1.0.2.tgz",
+      "integrity": "sha1-I0CQ7pfH1K0aLEvq4nUF3v/GCKQ=",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "cipher-base": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/cipher-base/download/cipher-base-1.0.4.tgz",
+      "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "http://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz",
+      "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "clean-css": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
+      "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
+      "dev": true,
+      "requires": {
+        "source-map": "~0.6.0"
+      }
+    },
+    "cli-cursor": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz",
+      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "^2.0.0"
+      }
+    },
+    "cli-highlight": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.1.tgz",
+      "integrity": "sha512-0y0VlNmdD99GXZHYnvrQcmHxP8Bi6T00qucGgBgGv4kJ0RyDthNnnFPupHV7PYv/OXSVk+azFbOeaW6+vGmx9A==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.3.0",
+        "highlight.js": "^9.6.0",
+        "mz": "^2.4.0",
+        "parse5": "^4.0.0",
+        "yargs": "^13.0.0"
+      }
+    },
+    "cli-spinners": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npm.taobao.org/cli-spinners/download/cli-spinners-2.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-spinners%2Fdownload%2Fcli-spinners-2.2.0.tgz",
+      "integrity": "sha1-6LmI2SBsaSMC2O6DTnqFwBRNj3c=",
+      "dev": true
+    },
+    "clipboardy": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.1.0.tgz",
+      "integrity": "sha512-2pzOUxWcLlXWtn+Jd6js3o12TysNOOVes/aQfg+MT/35vrxWzedHlLwyoJpXjsFKWm95BTNEcMGD9+a7mKzZkQ==",
+      "dev": true,
+      "requires": {
+        "arch": "^2.1.1",
+        "execa": "^1.0.0"
+      }
+    },
+    "cliui": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+      "dev": true,
+      "requires": {
+        "string-width": "^3.1.0",
+        "strip-ansi": "^5.2.0",
+        "wrap-ansi": "^5.1.0"
+      },
+      "dependencies": {
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        }
+      }
+    },
+    "clone": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/clone/download/clone-1.0.4.tgz",
+      "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+      "dev": true
+    },
+    "clone-deep": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+      "dev": true,
+      "requires": {
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.2",
+        "shallow-clone": "^3.0.0"
+      }
+    },
+    "coa": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
+      "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+      "dev": true,
+      "requires": {
+        "@types/q": "^1.5.1",
+        "chalk": "^2.4.1",
+        "q": "^1.1.2"
+      }
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+      "dev": true
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "dev": true,
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
+    "color": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz",
+      "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.1",
+        "color-string": "^1.5.2"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz",
+      "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "dev": true
+    },
+    "color-string": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
+      "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
+      "dev": true,
+      "requires": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
+    "combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz",
+      "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=",
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
+    "commander": {
+      "version": "2.20.0",
+      "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.20.0.tgz",
+      "integrity": "sha1-1YuytcHuj4ew00ACfp6U4iLFpCI=",
+      "dev": true
+    },
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+      "dev": true
+    },
+    "component-emitter": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz",
+      "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=",
+      "dev": true
+    },
+    "compressible": {
+      "version": "2.0.17",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz",
+      "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==",
+      "dev": true,
+      "requires": {
+        "mime-db": ">= 1.40.0 < 2"
+      }
+    },
+    "compression": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+      "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.16",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.2",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "bytes": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz",
+          "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+          "dev": true
+        },
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "concat-stream": {
+      "version": "1.6.2",
+      "resolved": "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz",
+      "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
+      }
+    },
+    "connect-history-api-fallback": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+      "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+      "dev": true
+    },
+    "console-browserify": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/console-browserify/download/console-browserify-1.1.0.tgz",
+      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+      "dev": true,
+      "requires": {
+        "date-now": "^0.1.4"
+      }
+    },
+    "console-control-strings": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+      "dev": true
+    },
+    "consolidate": {
+      "version": "0.15.1",
+      "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz",
+      "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.1.1"
+      }
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/constants-browserify/download/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+      "dev": true
+    },
+    "content-disposition": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+      "dev": true
+    },
+    "convert-source-map": {
+      "version": "1.6.0",
+      "resolved": "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.6.0.tgz",
+      "integrity": "sha1-UbU3qMQ+DwTewZk7/83VBOdYrCA=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.1"
+      }
+    },
+    "cookie": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+      "dev": true
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "http://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+      "dev": true
+    },
+    "copy-concurrently": {
+      "version": "1.0.5",
+      "resolved": "http://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1",
+        "fs-write-stream-atomic": "^1.0.8",
+        "iferr": "^0.1.5",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.0"
+      }
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true
+    },
+    "copy-webpack-plugin": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npm.taobao.org/copy-webpack-plugin/download/copy-webpack-plugin-4.6.0.tgz",
+      "integrity": "sha1-5/QN2KaEd9QF3Rt6hUquMksVi64=",
+      "dev": true,
+      "requires": {
+        "cacache": "^10.0.4",
+        "find-cache-dir": "^1.0.0",
+        "globby": "^7.1.1",
+        "is-glob": "^4.0.0",
+        "loader-utils": "^1.1.0",
+        "minimatch": "^3.0.4",
+        "p-limit": "^1.0.0",
+        "serialize-javascript": "^1.4.0"
+      }
+    },
+    "core-js": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-2.6.9.tgz?cache=0&sync_timestamp=1560599811627&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-2.6.9.tgz",
+      "integrity": "sha1-a0shRiDINBUuF5Mjcn/Bl0GwhPI=",
+      "dev": true
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+    },
+    "cosmiconfig": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+      "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+      "dev": true,
+      "requires": {
+        "import-fresh": "^2.0.0",
+        "is-directory": "^0.3.1",
+        "js-yaml": "^3.13.1",
+        "parse-json": "^4.0.0"
+      }
+    },
+    "create-ecdh": {
+      "version": "4.0.3",
+      "resolved": "http://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.3.tgz",
+      "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.0.0"
+      }
+    },
+    "create-hash": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz",
+      "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "inherits": "^2.0.1",
+        "md5.js": "^1.3.4",
+        "ripemd160": "^2.0.1",
+        "sha.js": "^2.4.0"
+      }
+    },
+    "create-hmac": {
+      "version": "1.1.7",
+      "resolved": "http://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.7.tgz",
+      "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.3",
+        "create-hash": "^1.1.0",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "cross-env": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz",
+      "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^7.0.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
+          "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "path-key": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz",
+          "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        },
+        "which": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz",
+          "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "cross-spawn": {
+      "version": "6.0.5",
+      "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz",
+      "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=",
+      "dev": true,
+      "requires": {
+        "nice-try": "^1.0.4",
+        "path-key": "^2.0.1",
+        "semver": "^5.5.0",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      }
+    },
+    "crypto-browserify": {
+      "version": "3.12.0",
+      "resolved": "http://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=",
+      "dev": true,
+      "requires": {
+        "browserify-cipher": "^1.0.0",
+        "browserify-sign": "^4.0.0",
+        "create-ecdh": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.0",
+        "diffie-hellman": "^5.0.0",
+        "inherits": "^2.0.1",
+        "pbkdf2": "^3.0.3",
+        "public-encrypt": "^4.0.0",
+        "randombytes": "^2.0.0",
+        "randomfill": "^1.0.3"
+      }
+    },
+    "css": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npm.taobao.org/css/download/css-2.2.4.tgz",
+      "integrity": "sha1-xkZ1XHOXHyu6amAeLPL9cbEpiSk=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "source-map": "^0.6.1",
+        "source-map-resolve": "^0.5.2",
+        "urix": "^0.1.0"
+      }
+    },
+    "css-color-names": {
+      "version": "0.0.4",
+      "resolved": "http://registry.npm.taobao.org/css-color-names/download/css-color-names-0.0.4.tgz",
+      "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
+      "dev": true
+    },
+    "css-declaration-sorter": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
+      "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.1",
+        "timsort": "^0.3.0"
+      }
+    },
+    "css-loader": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz",
+      "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "^6.26.0",
+        "css-selector-tokenizer": "^0.7.0",
+        "icss-utils": "^2.1.0",
+        "loader-utils": "^1.0.2",
+        "lodash": "^4.17.11",
+        "postcss": "^6.0.23",
+        "postcss-modules-extract-imports": "^1.2.0",
+        "postcss-modules-local-by-default": "^1.2.0",
+        "postcss-modules-scope": "^1.1.0",
+        "postcss-modules-values": "^1.3.0",
+        "postcss-value-parser": "^3.3.0",
+        "source-list-map": "^2.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "6.0.23",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.1",
+            "source-map": "^0.6.1",
+            "supports-color": "^5.4.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "css-select": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz",
+      "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==",
+      "dev": true,
+      "requires": {
+        "boolbase": "^1.0.0",
+        "css-what": "^2.1.2",
+        "domutils": "^1.7.0",
+        "nth-check": "^1.0.2"
+      }
+    },
+    "css-select-base-adapter": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+      "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
+      "dev": true
+    },
+    "css-selector-tokenizer": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz",
+      "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==",
+      "dev": true,
+      "requires": {
+        "cssesc": "^0.1.0",
+        "fastparse": "^1.1.1",
+        "regexpu-core": "^1.0.0"
+      },
+      "dependencies": {
+        "cssesc": {
+          "version": "0.1.0",
+          "resolved": "http://registry.npm.taobao.org/cssesc/download/cssesc-0.1.0.tgz",
+          "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=",
+          "dev": true
+        },
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "http://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+          "dev": true
+        },
+        "regexpu-core": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/regexpu-core/download/regexpu-core-1.0.0.tgz",
+          "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
+          "dev": true,
+          "requires": {
+            "regenerate": "^1.2.1",
+            "regjsgen": "^0.2.0",
+            "regjsparser": "^0.1.4"
+          }
+        },
+        "regjsgen": {
+          "version": "0.2.0",
+          "resolved": "http://registry.npm.taobao.org/regjsgen/download/regjsgen-0.2.0.tgz",
+          "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+          "dev": true
+        },
+        "regjsparser": {
+          "version": "0.1.5",
+          "resolved": "http://registry.npm.taobao.org/regjsparser/download/regjsparser-0.1.5.tgz",
+          "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+          "dev": true,
+          "requires": {
+            "jsesc": "~0.5.0"
+          }
+        }
+      }
+    },
+    "css-tree": {
+      "version": "1.0.0-alpha.33",
+      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz",
+      "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==",
+      "dev": true,
+      "requires": {
+        "mdn-data": "2.0.4",
+        "source-map": "^0.5.3"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "css-unit-converter": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/css-unit-converter/download/css-unit-converter-1.1.1.tgz",
+      "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=",
+      "dev": true
+    },
+    "css-what": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
+      "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
+      "dev": true
+    },
+    "cssesc": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/cssesc/download/cssesc-2.0.0.tgz",
+      "integrity": "sha1-OxO9G7HLNuG8taTc0n9UxdyzVwM=",
+      "dev": true
+    },
+    "cssnano": {
+      "version": "4.1.10",
+      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
+      "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^5.0.0",
+        "cssnano-preset-default": "^4.0.7",
+        "is-resolvable": "^1.0.0",
+        "postcss": "^7.0.0"
+      }
+    },
+    "cssnano-preset-default": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
+      "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
+      "dev": true,
+      "requires": {
+        "css-declaration-sorter": "^4.0.1",
+        "cssnano-util-raw-cache": "^4.0.1",
+        "postcss": "^7.0.0",
+        "postcss-calc": "^7.0.1",
+        "postcss-colormin": "^4.0.3",
+        "postcss-convert-values": "^4.0.1",
+        "postcss-discard-comments": "^4.0.2",
+        "postcss-discard-duplicates": "^4.0.2",
+        "postcss-discard-empty": "^4.0.1",
+        "postcss-discard-overridden": "^4.0.1",
+        "postcss-merge-longhand": "^4.0.11",
+        "postcss-merge-rules": "^4.0.3",
+        "postcss-minify-font-values": "^4.0.2",
+        "postcss-minify-gradients": "^4.0.2",
+        "postcss-minify-params": "^4.0.2",
+        "postcss-minify-selectors": "^4.0.2",
+        "postcss-normalize-charset": "^4.0.1",
+        "postcss-normalize-display-values": "^4.0.2",
+        "postcss-normalize-positions": "^4.0.2",
+        "postcss-normalize-repeat-style": "^4.0.2",
+        "postcss-normalize-string": "^4.0.2",
+        "postcss-normalize-timing-functions": "^4.0.2",
+        "postcss-normalize-unicode": "^4.0.1",
+        "postcss-normalize-url": "^4.0.1",
+        "postcss-normalize-whitespace": "^4.0.2",
+        "postcss-ordered-values": "^4.1.2",
+        "postcss-reduce-initial": "^4.0.3",
+        "postcss-reduce-transforms": "^4.0.2",
+        "postcss-svgo": "^4.0.2",
+        "postcss-unique-selectors": "^4.0.1"
+      }
+    },
+    "cssnano-util-get-arguments": {
+      "version": "4.0.0",
+      "resolved": "http://registry.npm.taobao.org/cssnano-util-get-arguments/download/cssnano-util-get-arguments-4.0.0.tgz",
+      "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=",
+      "dev": true
+    },
+    "cssnano-util-get-match": {
+      "version": "4.0.0",
+      "resolved": "http://registry.npm.taobao.org/cssnano-util-get-match/download/cssnano-util-get-match-4.0.0.tgz",
+      "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=",
+      "dev": true
+    },
+    "cssnano-util-raw-cache": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
+      "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "cssnano-util-same-parent": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
+      "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
+      "dev": true
+    },
+    "csso": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz",
+      "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==",
+      "dev": true,
+      "requires": {
+        "css-tree": "1.0.0-alpha.29"
+      },
+      "dependencies": {
+        "css-tree": {
+          "version": "1.0.0-alpha.29",
+          "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz",
+          "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==",
+          "dev": true,
+          "requires": {
+            "mdn-data": "~1.1.0",
+            "source-map": "^0.5.3"
+          }
+        },
+        "mdn-data": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz",
+          "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "current-script-polyfill": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/current-script-polyfill/download/current-script-polyfill-1.0.0.tgz",
+      "integrity": "sha1-8xz35PPiGLBybnOMqSoC00iO9hU=",
+      "dev": true
+    },
+    "currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+      "dev": true,
+      "requires": {
+        "array-find-index": "^1.0.1"
+      }
+    },
+    "cyclist": {
+      "version": "0.2.2",
+      "resolved": "http://registry.npm.taobao.org/cyclist/download/cyclist-0.2.2.tgz",
+      "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
+      "dev": true
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "date-now": {
+      "version": "0.1.4",
+      "resolved": "http://registry.npm.taobao.org/date-now/download/date-now-0.1.4.tgz",
+      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+      "dev": true
+    },
+    "de-indent": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/de-indent/download/de-indent-1.0.2.tgz",
+      "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=",
+      "dev": true
+    },
+    "debug": {
+      "version": "4.1.1",
+      "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz",
+      "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=",
+      "dev": true,
+      "requires": {
+        "ms": "^2.1.1"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdecamelize%2Fdownload%2Fdecamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "http://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true
+    },
+    "deep-equal": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz",
+      "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==",
+      "dev": true,
+      "requires": {
+        "is-arguments": "^1.0.4",
+        "is-date-object": "^1.0.1",
+        "is-regex": "^1.0.4",
+        "object-is": "^1.0.1",
+        "object-keys": "^1.1.1",
+        "regexp.prototype.flags": "^1.2.0"
+      }
+    },
+    "deep-extend": {
+      "version": "0.6.0",
+      "resolved": "http://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz",
+      "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=",
+      "dev": true
+    },
+    "deep-is": {
+      "version": "0.1.3",
+      "resolved": "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz",
+      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+      "dev": true
+    },
+    "deepmerge": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
+      "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==",
+      "dev": true
+    },
+    "default-gateway": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-5.0.3.tgz",
+      "integrity": "sha512-zW+ld9xtN0+q48wIwhitUzhfERJN7BPgvijPhuCKG6bfWqnoqtSNSnrXfvAME2ZJLpgYpz6UorpBddGfLzrJBw==",
+      "dev": true,
+      "requires": {
+        "execa": "^2.0.3"
+      },
+      "dependencies": {
+        "execa": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.4.tgz",
+          "integrity": "sha512-VcQfhuGD51vQUQtKIq2fjGDLDbL6N1DTQVpYzxZ7LPIXw3HqTuIz6uxRmpV1qf8i31LHf2kjiaGI+GdHwRgbnQ==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^6.0.5",
+            "get-stream": "^5.0.0",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^3.0.0",
+            "onetime": "^5.1.0",
+            "p-finally": "^2.0.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
+          "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "is-stream": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+          "dev": true
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
+        "npm-run-path": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz",
+          "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "onetime": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+          "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "p-finally": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
+          "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
+          "dev": true
+        },
+        "path-key": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz",
+          "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==",
+          "dev": true
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        }
+      }
+    },
+    "defaults": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz",
+      "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+      "dev": true,
+      "requires": {
+        "clone": "^1.0.2"
+      }
+    },
+    "define-properties": {
+      "version": "1.1.3",
+      "resolved": "http://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz",
+      "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=",
+      "dev": true,
+      "requires": {
+        "object-keys": "^1.0.12"
+      }
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz",
+      "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=",
+      "dev": true,
+      "requires": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "del": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
+      "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
+      "dev": true,
+      "requires": {
+        "@types/glob": "^7.1.1",
+        "globby": "^6.1.0",
+        "is-path-cwd": "^2.0.0",
+        "is-path-in-cwd": "^2.0.0",
+        "p-map": "^2.0.0",
+        "pify": "^4.0.1",
+        "rimraf": "^2.6.3"
+      },
+      "dependencies": {
+        "globby": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npm.taobao.org/globby/download/globby-6.1.0.tgz?cache=0&sync_timestamp=1562335642755&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobby%2Fdownload%2Fglobby-6.1.0.tgz",
+          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+          "dev": true,
+          "requires": {
+            "array-union": "^1.0.1",
+            "glob": "^7.0.3",
+            "object-assign": "^4.0.1",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "2.3.0",
+              "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz",
+              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+              "dev": true
+            }
+          }
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "dev": true
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+    },
+    "delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+      "dev": true
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+      "dev": true
+    },
+    "des.js": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/des.js/download/des.js-1.0.0.tgz",
+      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+      "dev": true
+    },
+    "detect-node": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
+      "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
+      "dev": true
+    },
+    "diffie-hellman": {
+      "version": "5.0.3",
+      "resolved": "http://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "miller-rabin": "^4.0.0",
+        "randombytes": "^2.0.0"
+      }
+    },
+    "dir-glob": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-2.2.2.tgz",
+      "integrity": "sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ=",
+      "dev": true,
+      "requires": {
+        "path-type": "^3.0.0"
+      }
+    },
+    "dns-equal": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/dns-equal/download/dns-equal-1.0.0.tgz",
+      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+      "dev": true
+    },
+    "dns-packet": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
+      "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+      "dev": true,
+      "requires": {
+        "ip": "^1.1.0",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "dns-txt": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/dns-txt/download/dns-txt-2.0.2.tgz",
+      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+      "dev": true,
+      "requires": {
+        "buffer-indexof": "^1.0.0"
+      }
+    },
+    "dom-converter": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+      "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+      "dev": true,
+      "requires": {
+        "utila": "~0.4"
+      }
+    },
+    "dom-serializer": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz",
+      "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "entities": "^2.0.0"
+      },
+      "dependencies": {
+        "domelementtype": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
+          "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
+          "dev": true
+        }
+      }
+    },
+    "domain-browser": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz",
+      "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=",
+      "dev": true
+    },
+    "domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+      "dev": true
+    },
+    "domhandler": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+      "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1"
+      }
+    },
+    "domutils": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+      "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "dot-prop": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+      "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+      "dev": true,
+      "requires": {
+        "is-obj": "^1.0.0"
+      }
+    },
+    "dotenv": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz",
+      "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==",
+      "dev": true
+    },
+    "dotenv-expand": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
+      "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
+      "dev": true
+    },
+    "duplexer": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/duplexer/download/duplexer-0.1.1.tgz",
+      "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+      "dev": true
+    },
+    "duplexify": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz",
+      "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "easy-stack": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/easy-stack/download/easy-stack-1.0.0.tgz",
+      "integrity": "sha1-EskbMIWjfwuqM26UhurEv5Tj54g=",
+      "dev": true
+    },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "requires": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "dev": true
+    },
+    "ejs": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz",
+      "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==",
+      "dev": true
+    },
+    "electron-to-chromium": {
+      "version": "1.3.191",
+      "resolved": "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.191.tgz",
+      "integrity": "sha1-xFG0Is2LLquE3tq6tavK4ervtvA=",
+      "dev": true
+    },
+    "elliptic": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npm.taobao.org/elliptic/download/elliptic-6.5.0.tgz",
+      "integrity": "sha1-K47UyJG33jIA4UQSpbgkjHr1Bco=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.4.0",
+        "brorand": "^1.0.1",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.0"
+      }
+    },
+    "emoji-regex": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+      "dev": true
+    },
+    "emojis-list": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz",
+      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+      "dev": true
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+      "dev": true
+    },
+    "end-of-stream": {
+      "version": "1.4.1",
+      "resolved": "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.1.tgz",
+      "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=",
+      "dev": true,
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "enhanced-resolve": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.1.0.tgz",
+      "integrity": "sha1-Qcfgv9/nSsH/4eV61qXGyfN0Kn8=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "memory-fs": "^0.4.0",
+        "tapable": "^1.0.0"
+      }
+    },
+    "entities": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
+      "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==",
+      "dev": true
+    },
+    "envinfo": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npm.taobao.org/envinfo/download/envinfo-6.0.1.tgz",
+      "integrity": "sha1-3sUfLdOPtKH7W/VoSIwGrR5+CKc=",
+      "dev": true
+    },
+    "errno": {
+      "version": "0.1.7",
+      "resolved": "http://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz",
+      "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=",
+      "dev": true,
+      "requires": {
+        "prr": "~1.0.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz",
+      "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "error-stack-parser": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.3.tgz",
+      "integrity": "sha512-vRC4rKv87twMZy92X4+TmUdv3iYMsmePbpG/YguHsfzmZ8bYJZYYep7yrXH09yFUaCEPKgNK5X79+Yq7hwLVOA==",
+      "dev": true,
+      "requires": {
+        "stackframe": "^1.0.4"
+      }
+    },
+    "es-abstract": {
+      "version": "1.13.0",
+      "resolved": "http://registry.npm.taobao.org/es-abstract/download/es-abstract-1.13.0.tgz",
+      "integrity": "sha1-rIYUX91QmdjdSVWMy6Lq+biOJOk=",
+      "dev": true,
+      "requires": {
+        "es-to-primitive": "^1.2.0",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "is-callable": "^1.1.4",
+        "is-regex": "^1.0.4",
+        "object-keys": "^1.0.12"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.0.tgz",
+      "integrity": "sha1-7fckeAM0VujdqO8J4ArZZQcH83c=",
+      "dev": true,
+      "requires": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      }
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "dev": true
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "escodegen": {
+      "version": "1.12.0",
+      "resolved": "https://registry.npm.taobao.org/escodegen/download/escodegen-1.12.0.tgz",
+      "integrity": "sha1-92Pa+ECvFyuzorbdchnA4X9/9UE=",
+      "dev": true,
+      "requires": {
+        "esprima": "^3.1.3",
+        "estraverse": "^4.2.0",
+        "esutils": "^2.0.2",
+        "optionator": "^0.8.1",
+        "source-map": "~0.6.1"
+      }
+    },
+    "eslint-scope": {
+      "version": "4.0.3",
+      "resolved": "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.3.tgz",
+      "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "esprima": {
+      "version": "3.1.3",
+      "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-3.1.3.tgz",
+      "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+      "dev": true
+    },
+    "esrecurse": {
+      "version": "4.2.1",
+      "resolved": "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz",
+      "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=",
+      "dev": true,
+      "requires": {
+        "estraverse": "^4.1.0"
+      }
+    },
+    "estraverse": {
+      "version": "4.2.0",
+      "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-4.2.0.tgz",
+      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz",
+      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+      "dev": true
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "http://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+      "dev": true
+    },
+    "event-pubsub": {
+      "version": "4.3.0",
+      "resolved": "http://registry.npm.taobao.org/event-pubsub/download/event-pubsub-4.3.0.tgz",
+      "integrity": "sha1-9o2Ba8KfHsAsU53FjI3UDOcss24=",
+      "dev": true
+    },
+    "eventemitter3": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
+      "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==",
+      "dev": true
+    },
+    "events": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/events/download/events-3.0.0.tgz",
+      "integrity": "sha1-mgoN+vYok9krh1uPJpjKQRSXPog=",
+      "dev": true
+    },
+    "eventsource": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
+      "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
+      "dev": true,
+      "requires": {
+        "original": "^1.0.0"
+      }
+    },
+    "evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.taobao.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=",
+      "dev": true,
+      "requires": {
+        "md5.js": "^1.3.4",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "execa": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/execa/download/execa-1.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-1.0.0.tgz",
+      "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^6.0.0",
+        "get-stream": "^4.0.0",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^2.0.0",
+        "p-finally": "^1.0.0",
+        "signal-exit": "^3.0.0",
+        "strip-eof": "^1.0.0"
+      }
+    },
+    "expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+      "dev": true,
+      "requires": {
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "express": {
+      "version": "4.17.1",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.7",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.19.0",
+        "content-disposition": "0.5.3",
+        "content-type": "~1.0.4",
+        "cookie": "0.4.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "~1.1.2",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.5",
+        "qs": "6.7.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.1.2",
+        "send": "0.17.1",
+        "serve-static": "1.14.1",
+        "setprototypeof": "1.1.1",
+        "statuses": "~1.5.0",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+          "dev": true
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz",
+      "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo="
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "dev": true,
+      "requires": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz",
+          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "extglob": {
+      "version": "2.0.4",
+      "resolved": "http://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz",
+      "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=",
+      "dev": true,
+      "requires": {
+        "array-unique": "^0.3.2",
+        "define-property": "^1.0.0",
+        "expand-brackets": "^2.1.4",
+        "extend-shallow": "^2.0.1",
+        "fragment-cache": "^0.2.1",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+    },
+    "fast-deep-equal": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz?cache=0&sync_timestamp=1562517919182&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-2.0.1.tgz",
+      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
+    },
+    "fast-glob": {
+      "version": "2.2.7",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
+      "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
+      "dev": true,
+      "requires": {
+        "@mrmlnc/readdir-enhanced": "^2.2.1",
+        "@nodelib/fs.stat": "^1.1.2",
+        "glob-parent": "^3.1.0",
+        "is-glob": "^4.0.0",
+        "merge2": "^1.2.3",
+        "micromatch": "^3.1.10"
+      }
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz",
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+      "dev": true
+    },
+    "fastparse": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
+      "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
+      "dev": true
+    },
+    "faye-websocket": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.10.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffaye-websocket%2Fdownload%2Ffaye-websocket-0.10.0.tgz",
+      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+      "dev": true,
+      "requires": {
+        "websocket-driver": ">=0.5.1"
+      }
+    },
+    "figgy-pudding": {
+      "version": "3.5.1",
+      "resolved": "http://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.1.tgz",
+      "integrity": "sha1-hiRwESkBxyeg5JWoB0S9W6odZ5A=",
+      "dev": true
+    },
+    "file-loader": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz",
+      "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.0.2",
+        "schema-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
+      }
+    },
+    "filesize": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
+      "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==",
+      "dev": true
+    },
+    "fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz",
+      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "statuses": "~1.5.0",
+        "unpipe": "~1.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "find-babel-config": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/find-babel-config/download/find-babel-config-1.2.0.tgz",
+      "integrity": "sha1-qbezF+tbmGDNqdVHQKjIM3oig6I=",
+      "dev": true,
+      "requires": {
+        "json5": "^0.5.1",
+        "path-exists": "^3.0.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "0.5.1",
+          "resolved": "http://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz",
+          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+          "dev": true
+        }
+      }
+    },
+    "find-cache-dir": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-1.0.0.tgz",
+      "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
+      "dev": true,
+      "requires": {
+        "commondir": "^1.0.1",
+        "make-dir": "^1.0.0",
+        "pkg-dir": "^2.0.0"
+      }
+    },
+    "find-up": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz",
+      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+      "dev": true,
+      "requires": {
+        "locate-path": "^2.0.0"
+      }
+    },
+    "flex.css": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/flex.css/-/flex.css-1.1.7.tgz",
+      "integrity": "sha1-/VlC6xBtKyW7NjTd0QuUl68fO6w="
+    },
+    "flush-write-stream": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.1.1.tgz",
+      "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.3.6"
+      }
+    },
+    "flyio": {
+      "version": "0.6.14",
+      "resolved": "https://registry.npm.taobao.org/flyio/download/flyio-0.6.14.tgz",
+      "integrity": "sha1-xdg+t6m0/ByRWkY9LqbfznVcLW8=",
+      "requires": {
+        "request": "^2.85.0"
+      }
+    },
+    "follow-redirects": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz",
+      "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==",
+      "dev": true,
+      "requires": {
+        "debug": "^3.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        }
+      }
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+    },
+    "form-data": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz",
+      "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=",
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      }
+    },
+    "forwarded": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+      "dev": true
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "dev": true,
+      "requires": {
+        "map-cache": "^0.2.2"
+      }
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "http://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+      "dev": true
+    },
+    "from2": {
+      "version": "2.3.0",
+      "resolved": "http://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0"
+      }
+    },
+    "fs-extra": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+      "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
+      }
+    },
+    "fs-write-stream-atomic": {
+      "version": "1.0.10",
+      "resolved": "http://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "iferr": "^0.1.5",
+        "imurmurhash": "^0.1.4",
+        "readable-stream": "1 || 2"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "fsevents": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+      "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nan": "^2.12.1"
+      }
+    },
+    "fstream": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npm.taobao.org/fstream/download/fstream-1.0.12.tgz",
+      "integrity": "sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "inherits": "~2.0.0",
+        "mkdirp": ">=0.5 0",
+        "rimraf": "2"
+      }
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz",
+      "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=",
+      "dev": true
+    },
+    "gauge": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.0.3",
+        "console-control-strings": "^1.0.0",
+        "has-unicode": "^2.0.0",
+        "object-assign": "^4.1.0",
+        "signal-exit": "^3.0.0",
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1",
+        "wide-align": "^1.1.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "dev": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        }
+      }
+    },
+    "gaze": {
+      "version": "1.1.3",
+      "resolved": "http://registry.npm.taobao.org/gaze/download/gaze-1.1.3.tgz",
+      "integrity": "sha1-xEFzPhO5J6yMD/C0w7Az8ogSkko=",
+      "dev": true,
+      "requires": {
+        "globule": "^1.0.0"
+      }
+    },
+    "get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "dev": true
+    },
+    "get-stdin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+      "dev": true
+    },
+    "get-stream": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz",
+      "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=",
+      "dev": true,
+      "requires": {
+        "pump": "^3.0.0"
+      },
+      "dependencies": {
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz",
+          "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        }
+      }
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "http://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "glob": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.4.tgz",
+      "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=",
+      "dev": true,
+      "requires": {
+        "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"
+      }
+    },
+    "glob-parent": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz",
+      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+      "dev": true,
+      "requires": {
+        "is-glob": "^3.1.0",
+        "path-dirname": "^1.0.0"
+      },
+      "dependencies": {
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.0"
+          }
+        }
+      }
+    },
+    "glob-to-regexp": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npm.taobao.org/glob-to-regexp/download/glob-to-regexp-0.3.0.tgz",
+      "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+      "dev": true
+    },
+    "globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz",
+      "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=",
+      "dev": true
+    },
+    "globby": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npm.taobao.org/globby/download/globby-7.1.1.tgz?cache=0&sync_timestamp=1562335642755&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobby%2Fdownload%2Fglobby-7.1.1.tgz",
+      "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=",
+      "dev": true,
+      "requires": {
+        "array-union": "^1.0.1",
+        "dir-glob": "^2.0.0",
+        "glob": "^7.1.2",
+        "ignore": "^3.3.5",
+        "pify": "^3.0.0",
+        "slash": "^1.0.0"
+      }
+    },
+    "globule": {
+      "version": "1.2.1",
+      "resolved": "http://registry.npm.taobao.org/globule/download/globule-1.2.1.tgz",
+      "integrity": "sha1-Xf+xsZHyLSB5epNptJ6rTpg5aW0=",
+      "dev": true,
+      "requires": {
+        "glob": "~7.1.1",
+        "lodash": "~4.17.10",
+        "minimatch": "~3.0.2"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.0.tgz",
+      "integrity": "sha1-jY/cc5d8sEEEchy1NmbBymTNMos=",
+      "dev": true
+    },
+    "gzip-size": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz",
+      "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==",
+      "dev": true,
+      "requires": {
+        "duplexer": "^0.1.1",
+        "pify": "^4.0.1"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "dev": true
+        }
+      }
+    },
+    "handle-thing": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz",
+      "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==",
+      "dev": true
+    },
+    "har-schema": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz",
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+    },
+    "har-validator": {
+      "version": "5.1.3",
+      "resolved": "http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz",
+      "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=",
+      "requires": {
+        "ajv": "^6.5.5",
+        "har-schema": "^2.0.0"
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.taobao.org/has/download/has-1.0.3.tgz",
+      "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        }
+      }
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true
+    },
+    "has-symbols": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.0.tgz",
+      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+      "dev": true
+    },
+    "has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+      "dev": true
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "hash-base": {
+      "version": "3.0.4",
+      "resolved": "http://registry.npm.taobao.org/hash-base/download/hash-base-3.0.4.tgz",
+      "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "hash-sum": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz",
+      "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
+      "dev": true
+    },
+    "hash.js": {
+      "version": "1.1.7",
+      "resolved": "http://registry.npm.taobao.org/hash.js/download/hash.js-1.1.7.tgz",
+      "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "he": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/he/download/he-1.2.0.tgz",
+      "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=",
+      "dev": true
+    },
+    "hex-color-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
+      "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
+      "dev": true
+    },
+    "highlight.js": {
+      "version": "9.15.10",
+      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.10.tgz",
+      "integrity": "sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw==",
+      "dev": true
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "dev": true,
+      "requires": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "hoopy": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
+      "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
+      "dev": true
+    },
+    "hosted-git-info": {
+      "version": "2.7.1",
+      "resolved": "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.7.1.tgz",
+      "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc=",
+      "dev": true
+    },
+    "hpack.js": {
+      "version": "2.1.6",
+      "resolved": "http://registry.npm.taobao.org/hpack.js/download/hpack.js-2.1.6.tgz",
+      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "obuf": "^1.0.0",
+        "readable-stream": "^2.0.1",
+        "wbuf": "^1.1.0"
+      }
+    },
+    "hsl-regex": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/hsl-regex/download/hsl-regex-1.0.0.tgz",
+      "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=",
+      "dev": true
+    },
+    "hsla-regex": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/hsla-regex/download/hsla-regex-1.0.0.tgz",
+      "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
+      "dev": true
+    },
+    "html-comment-regex": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
+      "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
+      "dev": true
+    },
+    "html-entities": {
+      "version": "1.2.1",
+      "resolved": "http://registry.npm.taobao.org/html-entities/download/html-entities-1.2.1.tgz",
+      "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
+      "dev": true
+    },
+    "html-minifier": {
+      "version": "3.5.21",
+      "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz",
+      "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==",
+      "dev": true,
+      "requires": {
+        "camel-case": "3.0.x",
+        "clean-css": "4.2.x",
+        "commander": "2.17.x",
+        "he": "1.2.x",
+        "param-case": "2.1.x",
+        "relateurl": "0.2.x",
+        "uglify-js": "3.4.x"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.17.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+          "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+          "dev": true
+        }
+      }
+    },
+    "html-tags": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz",
+      "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=",
+      "dev": true
+    },
+    "html-webpack-plugin": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz",
+      "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
+      "dev": true,
+      "requires": {
+        "html-minifier": "^3.2.3",
+        "loader-utils": "^0.2.16",
+        "lodash": "^4.17.3",
+        "pretty-error": "^2.0.2",
+        "tapable": "^1.0.0",
+        "toposort": "^1.0.0",
+        "util.promisify": "1.0.0"
+      },
+      "dependencies": {
+        "big.js": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
+          "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
+          "dev": true
+        },
+        "json5": {
+          "version": "0.5.1",
+          "resolved": "http://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz",
+          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+          "dev": true
+        },
+        "loader-utils": {
+          "version": "0.2.17",
+          "resolved": "http://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz",
+          "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
+          "dev": true,
+          "requires": {
+            "big.js": "^3.1.3",
+            "emojis-list": "^2.0.0",
+            "json5": "^0.5.0",
+            "object-assign": "^4.0.1"
+          }
+        }
+      }
+    },
+    "htmlparser2": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+      "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^1.3.1",
+        "domhandler": "^2.3.0",
+        "domutils": "^1.5.1",
+        "entities": "^1.1.1",
+        "inherits": "^2.0.1",
+        "readable-stream": "^3.1.1"
+      },
+      "dependencies": {
+        "entities": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+          "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
+          "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "http-deceiver": {
+      "version": "1.2.7",
+      "resolved": "http://registry.npm.taobao.org/http-deceiver/download/http-deceiver-1.2.7.tgz",
+      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+      "dev": true
+    },
+    "http-errors": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+      "dev": true,
+      "requires": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.1",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.0"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        }
+      }
+    },
+    "http-parser-js": {
+      "version": "0.4.10",
+      "resolved": "https://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.4.10.tgz",
+      "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=",
+      "dev": true
+    },
+    "http-proxy": {
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
+      "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
+      "dev": true,
+      "requires": {
+        "eventemitter3": "^3.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "http-proxy-middleware": {
+      "version": "0.19.1",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
+      "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
+      "dev": true,
+      "requires": {
+        "http-proxy": "^1.17.0",
+        "is-glob": "^4.0.0",
+        "lodash": "^4.17.11",
+        "micromatch": "^3.1.10"
+      }
+    },
+    "http-signature": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz",
+      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      }
+    },
+    "https-browserify": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+      "dev": true
+    },
+    "iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
+    },
+    "icss-replace-symbols": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz",
+      "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
+      "dev": true
+    },
+    "icss-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-2.1.0.tgz",
+      "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=",
+      "dev": true,
+      "requires": {
+        "postcss": "^6.0.1"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "6.0.23",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.1",
+            "source-map": "^0.6.1",
+            "supports-color": "^5.4.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "ieee754": {
+      "version": "1.1.13",
+      "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz",
+      "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=",
+      "dev": true
+    },
+    "iferr": {
+      "version": "0.1.5",
+      "resolved": "http://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+      "dev": true
+    },
+    "ignore": {
+      "version": "3.3.10",
+      "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-3.3.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-3.3.10.tgz",
+      "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=",
+      "dev": true
+    },
+    "import-cwd": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/import-cwd/download/import-cwd-2.1.0.tgz",
+      "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
+      "dev": true,
+      "requires": {
+        "import-from": "^2.1.0"
+      }
+    },
+    "import-fresh": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz?cache=0&sync_timestamp=1561888919431&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-2.0.0.tgz",
+      "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
+      "dev": true,
+      "requires": {
+        "caller-path": "^2.0.0",
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "import-from": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/import-from/download/import-from-2.1.0.tgz",
+      "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "import-local": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
+      "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "^3.0.0",
+        "resolve-cwd": "^2.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
+          "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+          "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+          "dev": true,
+          "requires": {
+            "find-up": "^3.0.0"
+          }
+        }
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "dev": true
+    },
+    "in-publish": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
+      "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
+      "dev": true
+    },
+    "indent-string": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+      "dev": true,
+      "requires": {
+        "repeating": "^2.0.0"
+      }
+    },
+    "indexes-of": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz",
+      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.4.tgz",
+      "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=",
+      "dev": true
+    },
+    "ini": {
+      "version": "1.3.5",
+      "resolved": "http://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz",
+      "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=",
+      "dev": true
+    },
+    "internal-ip": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
+      "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
+      "dev": true,
+      "requires": {
+        "default-gateway": "^4.2.0",
+        "ipaddr.js": "^1.9.0"
+      },
+      "dependencies": {
+        "default-gateway": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
+          "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
+          "dev": true,
+          "requires": {
+            "execa": "^1.0.0",
+            "ip-regex": "^2.1.0"
+          }
+        }
+      }
+    },
+    "intersection-observer": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.7.0.tgz",
+      "integrity": "sha512-Id0Fij0HsB/vKWGeBe9PxeY45ttRiBmhFyyt/geBdDHBYNctMRTE3dC1U3ujzz3lap+hVXlEcVaB56kZP/eEUg=="
+    },
+    "invariant": {
+      "version": "2.2.4",
+      "resolved": "http://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz",
+      "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=",
+      "dev": true,
+      "requires": {
+        "loose-envify": "^1.0.0"
+      }
+    },
+    "invert-kv": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
+      "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
+      "dev": true
+    },
+    "ip": {
+      "version": "1.1.5",
+      "resolved": "http://registry.npm.taobao.org/ip/download/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+      "dev": true
+    },
+    "ip-regex": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/ip-regex/download/ip-regex-2.1.0.tgz",
+      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
+      "dev": true
+    },
+    "ipaddr.js": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
+      "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==",
+      "dev": true
+    },
+    "is-absolute-url": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npm.taobao.org/is-absolute-url/download/is-absolute-url-2.1.0.tgz",
+      "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
+      "dev": true
+    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-arguments": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
+      "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
+      "dev": true
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "dev": true,
+      "requires": {
+        "binary-extensions": "^1.0.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz",
+      "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=",
+      "dev": true
+    },
+    "is-callable": {
+      "version": "1.1.4",
+      "resolved": "http://registry.npm.taobao.org/is-callable/download/is-callable-1.1.4.tgz",
+      "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=",
+      "dev": true
+    },
+    "is-color-stop": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/is-color-stop/download/is-color-stop-1.1.0.tgz",
+      "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
+      "dev": true,
+      "requires": {
+        "css-color-names": "^0.0.4",
+        "hex-color-regex": "^1.1.0",
+        "hsl-regex": "^1.0.0",
+        "hsla-regex": "^1.0.0",
+        "rgb-regex": "^1.0.1",
+        "rgba-regex": "^1.0.0"
+      }
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.1.tgz",
+      "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+      "dev": true
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz",
+      "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+      "dev": true,
+      "requires": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz",
+          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
+          "dev": true
+        }
+      }
+    },
+    "is-directory": {
+      "version": "0.3.1",
+      "resolved": "http://registry.npm.taobao.org/is-directory/download/is-directory-0.3.1.tgz",
+      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
+      "dev": true
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "dev": true
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true
+    },
+    "is-finite": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz",
+      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "^1.0.0"
+      }
+    },
+    "is-fullwidth-code-point": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+      "dev": true
+    },
+    "is-glob": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz",
+      "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
+      "dev": true,
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-number": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz",
+      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz",
+      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+      "dev": true
+    },
+    "is-path-cwd": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+      "dev": true
+    },
+    "is-path-in-cwd": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
+      "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
+      "dev": true,
+      "requires": {
+        "is-path-inside": "^2.1.0"
+      }
+    },
+    "is-path-inside": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
+      "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
+      "dev": true,
+      "requires": {
+        "path-is-inside": "^1.0.2"
+      }
+    },
+    "is-plain-obj": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz",
+      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+      "dev": true
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz",
+      "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "is-regex": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/is-regex/download/is-regex-1.0.4.tgz",
+      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.1"
+      }
+    },
+    "is-resolvable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+      "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+      "dev": true
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true
+    },
+    "is-svg": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
+      "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
+      "dev": true,
+      "requires": {
+        "html-comment-regex": "^1.1.0"
+      }
+    },
+    "is-symbol": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.2.tgz",
+      "integrity": "sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg=",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.0"
+      }
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz",
+      "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz?cache=0&sync_timestamp=1562592096220&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fisarray%2Fdownload%2Fisarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "dev": true
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+    },
+    "javascript-stringify": {
+      "version": "1.6.0",
+      "resolved": "http://registry.npm.taobao.org/javascript-stringify/download/javascript-stringify-1.6.0.tgz",
+      "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=",
+      "dev": true
+    },
+    "js-base64": {
+      "version": "2.5.1",
+      "resolved": "http://registry.npm.taobao.org/js-base64/download/js-base64-2.5.1.tgz",
+      "integrity": "sha1-Hvo57yxfeYC7F4St5KivLeMpESE=",
+      "dev": true
+    },
+    "js-levenshtein": {
+      "version": "1.1.6",
+      "resolved": "http://registry.npm.taobao.org/js-levenshtein/download/js-levenshtein-1.1.6.tgz",
+      "integrity": "sha1-xs7ljrNVA3LfjeuF+tXOZs4B1Z0=",
+      "dev": true
+    },
+    "js-message": {
+      "version": "1.0.5",
+      "resolved": "http://registry.npm.taobao.org/js-message/download/js-message-1.0.5.tgz",
+      "integrity": "sha1-IwDSSxrwjondCVvBpMnJz8uJLRU=",
+      "dev": true
+    },
+    "js-queue": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/js-queue/download/js-queue-2.0.0.tgz",
+      "integrity": "sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug=",
+      "dev": true,
+      "requires": {
+        "easy-stack": "^1.0.0"
+      }
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz",
+      "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=",
+      "dev": true
+    },
+    "js-yaml": {
+      "version": "3.13.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+      "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+      "dev": true,
+      "requires": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      },
+      "dependencies": {
+        "esprima": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+          "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+          "dev": true
+        }
+      }
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+    },
+    "jsesc": {
+      "version": "2.5.2",
+      "resolved": "http://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz",
+      "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=",
+      "dev": true
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=",
+      "dev": true
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA="
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+    },
+    "json3": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
+      "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==",
+      "dev": true
+    },
+    "json5": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz",
+      "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "jsonfile": {
+      "version": "4.0.0",
+      "resolved": "http://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz",
+      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "jsonify": {
+      "version": "0.0.0",
+      "resolved": "http://registry.npm.taobao.org/jsonify/download/jsonify-0.0.0.tgz",
+      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+      "dev": true
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      }
+    },
+    "jweixin-module": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/jweixin-module/-/jweixin-module-1.6.0.tgz",
+      "integrity": "sha512-dGk9cf+ipipHmtzYmKZs5B2toX+p4hLyllGLF6xuC8t+B05oYxd8fYoaRz0T30U2n3RUv8a4iwvjhA+OcYz52w=="
+    },
+    "killable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
+      "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
+      "dev": true
+    },
+    "kind-of": {
+      "version": "6.0.2",
+      "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz",
+      "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=",
+      "dev": true
+    },
+    "launch-editor": {
+      "version": "2.2.1",
+      "resolved": "http://registry.npm.taobao.org/launch-editor/download/launch-editor-2.2.1.tgz",
+      "integrity": "sha1-hxtaPuOdZoD8wm03kwtu7aidsMo=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.3.0",
+        "shell-quote": "^1.6.1"
+      }
+    },
+    "launch-editor-middleware": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz",
+      "integrity": "sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==",
+      "dev": true,
+      "requires": {
+        "launch-editor": "^2.2.1"
+      }
+    },
+    "lcid": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
+      "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
+      "dev": true,
+      "requires": {
+        "invert-kv": "^2.0.0"
+      }
+    },
+    "levn": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz",
+      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2"
+      }
+    },
+    "lines-and-columns": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz",
+      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+      "dev": true
+    },
+    "load-json-file": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0",
+        "strip-bom": "^2.0.0"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+          "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.2.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "loader-runner": {
+      "version": "2.4.0",
+      "resolved": "http://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz",
+      "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=",
+      "dev": true
+    },
+    "loader-utils": {
+      "version": "1.2.3",
+      "resolved": "http://registry.npm.taobao.org/loader-utils/download/loader-utils-1.2.3.tgz",
+      "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=",
+      "dev": true,
+      "requires": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^2.0.0",
+        "json5": "^1.0.1"
+      }
+    },
+    "locate-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz",
+      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+      "dev": true,
+      "requires": {
+        "p-locate": "^2.0.0",
+        "path-exists": "^3.0.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.14",
+      "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.14.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.14.tgz",
+      "integrity": "sha1-nOSHrmbJYlT+ILWZ8htoFgKAeLo=",
+      "dev": true
+    },
+    "lodash.defaultsdeep": {
+      "version": "4.6.1",
+      "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz",
+      "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==",
+      "dev": true
+    },
+    "lodash.kebabcase": {
+      "version": "4.1.1",
+      "resolved": "http://registry.npm.taobao.org/lodash.kebabcase/download/lodash.kebabcase-4.1.1.tgz",
+      "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=",
+      "dev": true
+    },
+    "lodash.mapvalues": {
+      "version": "4.6.0",
+      "resolved": "http://registry.npm.taobao.org/lodash.mapvalues/download/lodash.mapvalues-4.6.0.tgz",
+      "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=",
+      "dev": true
+    },
+    "lodash.memoize": {
+      "version": "4.1.2",
+      "resolved": "http://registry.npm.taobao.org/lodash.memoize/download/lodash.memoize-4.1.2.tgz",
+      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+      "dev": true
+    },
+    "lodash.transform": {
+      "version": "4.6.0",
+      "resolved": "http://registry.npm.taobao.org/lodash.transform/download/lodash.transform-4.6.0.tgz",
+      "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=",
+      "dev": true
+    },
+    "lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "http://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
+      "dev": true
+    },
+    "log-symbols": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npm.taobao.org/log-symbols/download/log-symbols-2.2.0.tgz",
+      "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.1"
+      }
+    },
+    "loglevel": {
+      "version": "1.6.4",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz",
+      "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==",
+      "dev": true
+    },
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "http://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz",
+      "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=",
+      "dev": true,
+      "requires": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      }
+    },
+    "loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+      "dev": true,
+      "requires": {
+        "currently-unhandled": "^0.4.1",
+        "signal-exit": "^3.0.0"
+      }
+    },
+    "lower-case": {
+      "version": "1.1.4",
+      "resolved": "http://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz",
+      "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
+      "dev": true
+    },
+    "lru-cache": {
+      "version": "4.1.5",
+      "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz",
+      "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=",
+      "dev": true,
+      "requires": {
+        "pseudomap": "^1.0.2",
+        "yallist": "^2.1.2"
+      }
+    },
+    "make-dir": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-1.3.0.tgz",
+      "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=",
+      "dev": true,
+      "requires": {
+        "pify": "^3.0.0"
+      }
+    },
+    "map-age-cleaner": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+      "dev": true,
+      "requires": {
+        "p-defer": "^1.0.0"
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "http://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+      "dev": true
+    },
+    "map-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+      "dev": true
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "dev": true,
+      "requires": {
+        "object-visit": "^1.0.0"
+      }
+    },
+    "md5.js": {
+      "version": "1.3.5",
+      "resolved": "http://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz",
+      "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "mdn-data": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
+      "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+      "dev": true
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+      "dev": true
+    },
+    "mem": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
+      "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
+      "dev": true,
+      "requires": {
+        "map-age-cleaner": "^0.1.1",
+        "mimic-fn": "^2.0.0",
+        "p-is-promise": "^2.0.0"
+      },
+      "dependencies": {
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        }
+      }
+    },
+    "memory-fs": {
+      "version": "0.4.1",
+      "resolved": "http://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz",
+      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+      "dev": true,
+      "requires": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "meow": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+      "dev": true,
+      "requires": {
+        "camelcase-keys": "^2.0.0",
+        "decamelize": "^1.1.2",
+        "loud-rejection": "^1.0.0",
+        "map-obj": "^1.0.1",
+        "minimist": "^1.1.3",
+        "normalize-package-data": "^2.3.4",
+        "object-assign": "^4.0.1",
+        "read-pkg-up": "^1.0.1",
+        "redent": "^1.0.0",
+        "trim-newlines": "^1.0.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "merge": {
+      "version": "1.2.1",
+      "resolved": "http://registry.npm.taobao.org/merge/download/merge-1.2.1.tgz",
+      "integrity": "sha1-OL6/gMMiCopIe2/Ps5QbsRcgwUU=",
+      "dev": true
+    },
+    "merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+      "dev": true
+    },
+    "merge-source-map": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
+      "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
+      "dev": true,
+      "requires": {
+        "source-map": "^0.6.1"
+      }
+    },
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
+    },
+    "merge2": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
+      "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
+      "dev": true
+    },
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-3.1.10.tgz",
+      "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      }
+    },
+    "miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "http://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz",
+      "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      }
+    },
+    "mime": {
+      "version": "2.4.4",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
+      "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
+      "dev": true
+    },
+    "mime-db": {
+      "version": "1.40.0",
+      "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.40.0.tgz",
+      "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI="
+    },
+    "mime-types": {
+      "version": "2.1.24",
+      "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.24.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-types%2Fdownload%2Fmime-types-2.1.24.tgz",
+      "integrity": "sha1-tvjQs+lR77d97eyhlM/20W9nb4E=",
+      "requires": {
+        "mime-db": "1.40.0"
+      }
+    },
+    "mimic-fn": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz",
+      "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=",
+      "dev": true
+    },
+    "mini-css-extract-plugin": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz",
+      "integrity": "sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "normalize-url": "^2.0.1",
+        "schema-utils": "^1.0.0",
+        "webpack-sources": "^1.1.0"
+      },
+      "dependencies": {
+        "normalize-url": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz",
+          "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==",
+          "dev": true,
+          "requires": {
+            "prepend-http": "^2.0.0",
+            "query-string": "^5.0.1",
+            "sort-keys": "^2.0.0"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
+      }
+    },
+    "minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=",
+      "dev": true
+    },
+    "minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz",
+      "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "0.0.8",
+      "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz",
+      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+      "dev": true
+    },
+    "mississippi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-2.0.0.tgz",
+      "integrity": "sha1-NEKlCPr8KFAEhv7qmUCWduTuWm8=",
+      "dev": true,
+      "requires": {
+        "concat-stream": "^1.5.0",
+        "duplexify": "^3.4.2",
+        "end-of-stream": "^1.1.0",
+        "flush-write-stream": "^1.0.0",
+        "from2": "^2.1.0",
+        "parallel-transform": "^1.1.0",
+        "pump": "^2.0.1",
+        "pumpify": "^1.3.3",
+        "stream-each": "^1.1.0",
+        "through2": "^2.0.0"
+      }
+    },
+    "mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz?cache=0&sync_timestamp=1561436244196&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmixin-deep%2Fdownload%2Fmixin-deep-1.3.2.tgz",
+      "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=",
+      "dev": true,
+      "requires": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz",
+          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "mkdirp": {
+      "version": "0.5.1",
+      "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz",
+      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "dev": true,
+      "requires": {
+        "minimist": "0.0.8"
+      }
+    },
+    "module-alias": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npm.taobao.org/module-alias/download/module-alias-2.2.1.tgz",
+      "integrity": "sha1-VTrqncf5nNRf1140pXSWDcRlUNo=",
+      "dev": true
+    },
+    "move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz",
+      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1",
+        "copy-concurrently": "^1.0.0",
+        "fs-write-stream-atomic": "^1.0.8",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.3"
+      }
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz",
+      "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
+      "dev": true
+    },
+    "multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+      "dev": true,
+      "requires": {
+        "dns-packet": "^1.3.1",
+        "thunky": "^1.0.2"
+      }
+    },
+    "multicast-dns-service-types": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz",
+      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
+      "dev": true
+    },
+    "mz": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+      "dev": true,
+      "requires": {
+        "any-promise": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "thenify-all": "^1.0.0"
+      }
+    },
+    "nan": {
+      "version": "2.14.0",
+      "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.0.tgz",
+      "integrity": "sha1-eBj3IgJ7JFmobwKV1DTR/CM2xSw=",
+      "dev": true
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "http://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz",
+      "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      }
+    },
+    "negotiator": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+      "dev": true
+    },
+    "neo-async": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fneo-async%2Fdownload%2Fneo-async-2.6.1.tgz",
+      "integrity": "sha1-rCetpmFn+ohJpq3dg39rGJrSCBw=",
+      "dev": true
+    },
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "http://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz",
+      "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=",
+      "dev": true
+    },
+    "no-case": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+      "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+      "dev": true,
+      "requires": {
+        "lower-case": "^1.1.1"
+      }
+    },
+    "node-forge": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.2.tgz",
+      "integrity": "sha512-mXQ9GBq1N3uDCyV1pdSzgIguwgtVpM7f5/5J4ipz12PKWElmPpVWLDuWl8iXmhysr21+WmX/OJ5UKx82wjomgg==",
+      "dev": true
+    },
+    "node-gyp": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npm.taobao.org/node-gyp/download/node-gyp-3.8.0.tgz",
+      "integrity": "sha1-VAMEJhwzDoDQ1e3OJTpoyzlkIYw=",
+      "dev": true,
+      "requires": {
+        "fstream": "^1.0.0",
+        "glob": "^7.0.3",
+        "graceful-fs": "^4.1.2",
+        "mkdirp": "^0.5.0",
+        "nopt": "2 || 3",
+        "npmlog": "0 || 1 || 2 || 3 || 4",
+        "osenv": "0",
+        "request": "^2.87.0",
+        "rimraf": "2",
+        "semver": "~5.3.0",
+        "tar": "^2.0.0",
+        "which": "1"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+          "dev": true
+        }
+      }
+    },
+    "node-ipc": {
+      "version": "9.1.1",
+      "resolved": "http://registry.npm.taobao.org/node-ipc/download/node-ipc-9.1.1.tgz",
+      "integrity": "sha1-TiRe1pOOZRAOWV68XcNLFujdXWk=",
+      "dev": true,
+      "requires": {
+        "event-pubsub": "4.3.0",
+        "js-message": "1.0.5",
+        "js-queue": "2.0.0"
+      }
+    },
+    "node-libs-browser": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-libs-browser%2Fdownload%2Fnode-libs-browser-2.2.1.tgz",
+      "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=",
+      "dev": true,
+      "requires": {
+        "assert": "^1.1.1",
+        "browserify-zlib": "^0.2.0",
+        "buffer": "^4.3.0",
+        "console-browserify": "^1.1.0",
+        "constants-browserify": "^1.0.0",
+        "crypto-browserify": "^3.11.0",
+        "domain-browser": "^1.1.1",
+        "events": "^3.0.0",
+        "https-browserify": "^1.0.0",
+        "os-browserify": "^0.3.0",
+        "path-browserify": "0.0.1",
+        "process": "^0.11.10",
+        "punycode": "^1.2.4",
+        "querystring-es3": "^0.2.0",
+        "readable-stream": "^2.3.3",
+        "stream-browserify": "^2.0.1",
+        "stream-http": "^2.7.2",
+        "string_decoder": "^1.0.0",
+        "timers-browserify": "^2.0.4",
+        "tty-browserify": "0.0.0",
+        "url": "^0.11.0",
+        "util": "^0.11.0",
+        "vm-browserify": "^1.0.1"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true
+        }
+      }
+    },
+    "node-releases": {
+      "version": "1.1.25",
+      "resolved": "https://registry.npm.taobao.org/node-releases/download/node-releases-1.1.25.tgz",
+      "integrity": "sha1-DC19vH/tMPvgKp7jAHuMkL8BM9M=",
+      "dev": true,
+      "requires": {
+        "semver": "^5.3.0"
+      }
+    },
+    "node-sass": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npm.taobao.org/node-sass/download/node-sass-4.12.0.tgz",
+      "integrity": "sha1-CRT1MZMjgBFKMMxfpPpjIzol8Bc=",
+      "dev": true,
+      "requires": {
+        "async-foreach": "^0.1.3",
+        "chalk": "^1.1.1",
+        "cross-spawn": "^3.0.0",
+        "gaze": "^1.0.0",
+        "get-stdin": "^4.0.1",
+        "glob": "^7.0.3",
+        "in-publish": "^2.0.0",
+        "lodash": "^4.17.11",
+        "meow": "^3.7.0",
+        "mkdirp": "^0.5.1",
+        "nan": "^2.13.2",
+        "node-gyp": "^3.8.0",
+        "npmlog": "^4.0.0",
+        "request": "^2.88.0",
+        "sass-graph": "^2.2.4",
+        "stdout-stream": "^1.4.0",
+        "true-case-path": "^1.0.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "cross-spawn": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+          "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "which": "^1.2.9"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "nopt": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+      "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+      "dev": true,
+      "requires": {
+        "abbrev": "1"
+      }
+    },
+    "normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
+      }
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz",
+      "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=",
+      "dev": true
+    },
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/normalize-range/download/normalize-range-0.1.2.tgz",
+      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+      "dev": true
+    },
+    "normalize-url": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
+      "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
+      "dev": true
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "dev": true,
+      "requires": {
+        "path-key": "^2.0.0"
+      }
+    },
+    "npmlog": {
+      "version": "4.1.2",
+      "resolved": "http://registry.npm.taobao.org/npmlog/download/npmlog-4.1.2.tgz",
+      "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=",
+      "dev": true,
+      "requires": {
+        "are-we-there-yet": "~1.1.2",
+        "console-control-strings": "~1.1.0",
+        "gauge": "~2.7.3",
+        "set-blocking": "~2.0.0"
+      }
+    },
+    "nth-check": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+      "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+      "dev": true,
+      "requires": {
+        "boolbase": "~1.0.0"
+      }
+    },
+    "num2fraction": {
+      "version": "1.2.2",
+      "resolved": "http://registry.npm.taobao.org/num2fraction/download/num2fraction-1.2.2.tgz",
+      "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
+      "dev": true
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+      "dev": true
+    },
+    "oauth-sign": {
+      "version": "0.9.0",
+      "resolved": "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz",
+      "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU="
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "dev": true
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "dev": true,
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "object-is": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz",
+      "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=",
+      "dev": true
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz",
+      "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=",
+      "dev": true
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.assign": {
+      "version": "4.1.0",
+      "resolved": "http://registry.npm.taobao.org/object.assign/download/object.assign-4.1.0.tgz",
+      "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.2",
+        "function-bind": "^1.1.1",
+        "has-symbols": "^1.0.0",
+        "object-keys": "^1.0.11"
+      }
+    },
+    "object.getownpropertydescriptors": {
+      "version": "2.0.3",
+      "resolved": "http://registry.npm.taobao.org/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.0.3.tgz",
+      "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.2",
+        "es-abstract": "^1.5.1"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "object.values": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz",
+      "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.12.0",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3"
+      }
+    },
+    "obuf": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+      "dev": true
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "dev": true,
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "onetime": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz",
+      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "^1.0.0"
+      }
+    },
+    "open": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npm.taobao.org/open/download/open-6.4.0.tgz",
+      "integrity": "sha1-XBPpbQ3IlGhhZPGJZez+iJ7PyKk=",
+      "dev": true,
+      "requires": {
+        "is-wsl": "^1.1.0"
+      }
+    },
+    "opener": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz",
+      "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==",
+      "dev": true
+    },
+    "opn": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
+      "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
+      "dev": true,
+      "requires": {
+        "is-wsl": "^1.1.0"
+      }
+    },
+    "optionator": {
+      "version": "0.8.2",
+      "resolved": "http://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz",
+      "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+      "dev": true,
+      "requires": {
+        "deep-is": "~0.1.3",
+        "fast-levenshtein": "~2.0.4",
+        "levn": "~0.3.0",
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2",
+        "wordwrap": "~1.0.0"
+      }
+    },
+    "ora": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npm.taobao.org/ora/download/ora-3.4.0.tgz",
+      "integrity": "sha1-vwdSSRBZo+8+1MhQl1Md6f280xg=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.2",
+        "cli-cursor": "^2.1.0",
+        "cli-spinners": "^2.0.0",
+        "log-symbols": "^2.2.0",
+        "strip-ansi": "^5.2.0",
+        "wcwidth": "^1.0.1"
+      }
+    },
+    "original": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
+      "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
+      "dev": true,
+      "requires": {
+        "url-parse": "^1.4.3"
+      }
+    },
+    "os-browserify": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+      "dev": true
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+      "dev": true
+    },
+    "os-locale": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
+      "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
+      "dev": true,
+      "requires": {
+        "execa": "^1.0.0",
+        "lcid": "^2.0.0",
+        "mem": "^4.0.0"
+      }
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+      "dev": true
+    },
+    "osenv": {
+      "version": "0.1.5",
+      "resolved": "http://registry.npm.taobao.org/osenv/download/osenv-0.1.5.tgz",
+      "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=",
+      "dev": true,
+      "requires": {
+        "os-homedir": "^1.0.0",
+        "os-tmpdir": "^1.0.0"
+      }
+    },
+    "p-defer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/p-defer/download/p-defer-1.0.0.tgz?cache=0&sync_timestamp=1559922734651&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-defer%2Fdownload%2Fp-defer-1.0.0.tgz",
+      "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
+      "dev": true
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
+      "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz",
+      "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=",
+      "dev": true,
+      "requires": {
+        "p-try": "^1.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz",
+      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+      "dev": true,
+      "requires": {
+        "p-limit": "^1.1.0"
+      }
+    },
+    "p-map": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+      "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+      "dev": true
+    },
+    "p-retry": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
+      "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
+      "dev": true,
+      "requires": {
+        "retry": "^0.12.0"
+      }
+    },
+    "p-try": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz",
+      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+      "dev": true
+    },
+    "pako": {
+      "version": "1.0.10",
+      "resolved": "http://registry.npm.taobao.org/pako/download/pako-1.0.10.tgz",
+      "integrity": "sha1-Qyi621CGpCaqkPVBl31JVdpclzI=",
+      "dev": true
+    },
+    "parallel-transform": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.1.0.tgz",
+      "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
+      "dev": true,
+      "requires": {
+        "cyclist": "~0.2.2",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.1.5"
+      }
+    },
+    "param-case": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz",
+      "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+      "dev": true,
+      "requires": {
+        "no-case": "^2.2.0"
+      }
+    },
+    "parse-asn1": {
+      "version": "5.1.4",
+      "resolved": "http://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.4.tgz",
+      "integrity": "sha1-N/Zij4I/vesic7TVQENKIvPvH8w=",
+      "dev": true,
+      "requires": {
+        "asn1.js": "^4.0.0",
+        "browserify-aes": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.0",
+        "pbkdf2": "^3.0.3",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz",
+      "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+      "dev": true,
+      "requires": {
+        "error-ex": "^1.3.1",
+        "json-parse-better-errors": "^1.0.1"
+      }
+    },
+    "parse5": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+      "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+      "dev": true
+    },
+    "parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "dev": true
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true
+    },
+    "path-browserify": {
+      "version": "0.0.1",
+      "resolved": "http://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.1.tgz",
+      "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo=",
+      "dev": true
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "dev": true
+    },
+    "path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+      "dev": true
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
+    },
+    "path-is-inside": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz",
+      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.6",
+      "resolved": "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz",
+      "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=",
+      "dev": true
+    },
+    "path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+      "dev": true
+    },
+    "path-type": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz",
+      "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=",
+      "dev": true,
+      "requires": {
+        "pify": "^3.0.0"
+      }
+    },
+    "pbkdf2": {
+      "version": "3.0.17",
+      "resolved": "http://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.0.17.tgz",
+      "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=",
+      "dev": true,
+      "requires": {
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz",
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+    },
+    "pify": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz",
+      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+      "dev": true
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "dev": true,
+      "requires": {
+        "pinkie": "^2.0.0"
+      }
+    },
+    "pkg-dir": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz",
+      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+      "dev": true,
+      "requires": {
+        "find-up": "^2.1.0"
+      }
+    },
+    "pkg-up": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/pkg-up/download/pkg-up-2.0.0.tgz",
+      "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
+      "dev": true,
+      "requires": {
+        "find-up": "^2.1.0"
+      }
+    },
+    "portfinder": {
+      "version": "1.0.24",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.24.tgz",
+      "integrity": "sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg==",
+      "dev": true,
+      "requires": {
+        "async": "^1.5.2",
+        "debug": "^2.2.0",
+        "mkdirp": "0.5.x"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+      "dev": true
+    },
+    "postcss": {
+      "version": "7.0.17",
+      "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-7.0.17.tgz",
+      "integrity": "sha1-TaG9/1Mi1KCsqrTYfz54JDa60x8=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.2",
+        "source-map": "^0.6.1",
+        "supports-color": "^6.1.0"
+      }
+    },
+    "postcss-calc": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz",
+      "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==",
+      "dev": true,
+      "requires": {
+        "css-unit-converter": "^1.1.1",
+        "postcss": "^7.0.5",
+        "postcss-selector-parser": "^5.0.0-rc.4",
+        "postcss-value-parser": "^3.3.1"
+      }
+    },
+    "postcss-colormin": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
+      "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "color": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-comment": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/postcss-comment/download/postcss-comment-2.0.0.tgz",
+      "integrity": "sha1-bIgI5kzuJcMxRlGKioKUSwXxHm8=",
+      "dev": true,
+      "requires": {
+        "postcss": "^6.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "6.0.23",
+          "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-6.0.23.tgz",
+          "integrity": "sha1-YcgswyisYOZ3ZF+XkFTrmLwOMyQ=",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.1",
+            "source-map": "^0.6.1",
+            "supports-color": "^5.4.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz",
+          "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-convert-values": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
+      "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-discard-comments": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
+      "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-duplicates": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
+      "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-empty": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
+      "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-overridden": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
+      "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-import": {
+      "version": "12.0.1",
+      "resolved": "https://registry.npm.taobao.org/postcss-import/download/postcss-import-12.0.1.tgz",
+      "integrity": "sha1-z4x6sLXMq1ZJAkU25WX4QZKLcVM=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.1",
+        "postcss-value-parser": "^3.2.3",
+        "read-cache": "^1.0.0",
+        "resolve": "^1.1.7"
+      }
+    },
+    "postcss-load-config": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz",
+      "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^5.0.0",
+        "import-cwd": "^2.0.0"
+      }
+    },
+    "postcss-loader": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz",
+      "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "postcss": "^7.0.0",
+        "postcss-load-config": "^2.0.0",
+        "schema-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
+      }
+    },
+    "postcss-merge-longhand": {
+      "version": "4.0.11",
+      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
+      "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
+      "dev": true,
+      "requires": {
+        "css-color-names": "0.0.4",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "stylehacks": "^4.0.0"
+      }
+    },
+    "postcss-merge-rules": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
+      "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "cssnano-util-same-parent": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0",
+        "vendors": "^1.0.0"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "3.1.1",
+          "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz",
+          "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^4.1.1",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "postcss-minify-font-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
+      "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-minify-gradients": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
+      "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "is-color-stop": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-minify-params": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
+      "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "browserslist": "^4.0.0",
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "uniqs": "^2.0.0"
+      }
+    },
+    "postcss-minify-selectors": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
+      "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "3.1.1",
+          "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz",
+          "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^4.1.1",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "postcss-modules-extract-imports": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz",
+      "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==",
+      "dev": true,
+      "requires": {
+        "postcss": "^6.0.1"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "6.0.23",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.1",
+            "source-map": "^0.6.1",
+            "supports-color": "^5.4.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-modules-local-by-default": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-1.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-local-by-default%2Fdownload%2Fpostcss-modules-local-by-default-1.2.0.tgz",
+      "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
+      "dev": true,
+      "requires": {
+        "css-selector-tokenizer": "^0.7.0",
+        "postcss": "^6.0.1"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "6.0.23",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.1",
+            "source-map": "^0.6.1",
+            "supports-color": "^5.4.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-modules-scope": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-1.1.0.tgz",
+      "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
+      "dev": true,
+      "requires": {
+        "css-selector-tokenizer": "^0.7.0",
+        "postcss": "^6.0.1"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "6.0.23",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.1",
+            "source-map": "^0.6.1",
+            "supports-color": "^5.4.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-modules-values": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-1.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-values%2Fdownload%2Fpostcss-modules-values-1.3.0.tgz",
+      "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
+      "dev": true,
+      "requires": {
+        "icss-replace-symbols": "^1.1.0",
+        "postcss": "^6.0.1"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "6.0.23",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.1",
+            "source-map": "^0.6.1",
+            "supports-color": "^5.4.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-normalize-charset": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
+      "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-normalize-display-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
+      "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-positions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
+      "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-repeat-style": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
+      "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-string": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
+      "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-timing-functions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
+      "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-unicode": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
+      "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-url": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
+      "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
+      "dev": true,
+      "requires": {
+        "is-absolute-url": "^2.0.0",
+        "normalize-url": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-whitespace": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
+      "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-ordered-values": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
+      "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-reduce-initial": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
+      "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-reduce-transforms": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
+      "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-selector-parser": {
+      "version": "5.0.0",
+      "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-5.0.0.tgz",
+      "integrity": "sha1-JJBENWaXsztk8aj3yAki3d7nGVw=",
+      "dev": true,
+      "requires": {
+        "cssesc": "^2.0.0",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1"
+      }
+    },
+    "postcss-svgo": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
+      "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
+      "dev": true,
+      "requires": {
+        "is-svg": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "svgo": "^1.0.0"
+      }
+    },
+    "postcss-unique-selectors": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
+      "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "postcss": "^7.0.0",
+        "uniqs": "^2.0.0"
+      }
+    },
+    "postcss-value-parser": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz",
+      "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=",
+      "dev": true
+    },
+    "prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz",
+      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+      "dev": true
+    },
+    "prepend-http": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/prepend-http/download/prepend-http-2.0.0.tgz",
+      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+      "dev": true
+    },
+    "prettier": {
+      "version": "1.16.3",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.3.tgz",
+      "integrity": "sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==",
+      "dev": true
+    },
+    "pretty-error": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.taobao.org/pretty-error/download/pretty-error-2.1.1.tgz",
+      "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
+      "dev": true,
+      "requires": {
+        "renderkid": "^2.0.1",
+        "utila": "~0.4"
+      }
+    },
+    "private": {
+      "version": "0.1.8",
+      "resolved": "http://registry.npm.taobao.org/private/download/private-0.1.8.tgz",
+      "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=",
+      "dev": true
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "http://registry.npm.taobao.org/process/download/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+      "dev": true
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=",
+      "dev": true
+    },
+    "promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz",
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+      "dev": true
+    },
+    "proxy-addr": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
+      "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
+      "dev": true,
+      "requires": {
+        "forwarded": "~0.1.2",
+        "ipaddr.js": "1.9.0"
+      }
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+      "dev": true
+    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+      "dev": true
+    },
+    "psl": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npm.taobao.org/psl/download/psl-1.2.0.tgz",
+      "integrity": "sha1-3xK1sbOjD1HDKerL3vmPOm4TbcY="
+    },
+    "public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "http://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.3.tgz",
+      "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "pump": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz",
+      "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "pumpify": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz",
+      "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=",
+      "dev": true,
+      "requires": {
+        "duplexify": "^3.6.0",
+        "inherits": "^2.0.3",
+        "pump": "^2.0.0"
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz",
+      "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew="
+    },
+    "q": {
+      "version": "1.5.1",
+      "resolved": "http://registry.npm.taobao.org/q/download/q-1.5.1.tgz",
+      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+      "dev": true
+    },
+    "qs": {
+      "version": "6.5.2",
+      "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.5.2.tgz",
+      "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY="
+    },
+    "query-string": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
+      "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
+      "dev": true,
+      "requires": {
+        "decode-uri-component": "^0.2.0",
+        "object-assign": "^4.1.0",
+        "strict-uri-encode": "^1.0.0"
+      }
+    },
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "http://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+      "dev": true
+    },
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.taobao.org/querystring-es3/download/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+      "dev": true
+    },
+    "querystringify": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
+      "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==",
+      "dev": true
+    },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz",
+      "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz",
+      "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "dev": true
+    },
+    "raw-body": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+      "dev": true,
+      "requires": {
+        "bytes": "3.1.0",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      }
+    },
+    "rc": {
+      "version": "1.2.8",
+      "resolved": "http://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz",
+      "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=",
+      "dev": true,
+      "requires": {
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/read-cache/download/read-cache-1.0.0.tgz",
+      "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+      "dev": true,
+      "requires": {
+        "pify": "^2.3.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+      "dev": true,
+      "requires": {
+        "@types/normalize-package-data": "^2.4.0",
+        "normalize-package-data": "^2.5.0",
+        "parse-json": "^5.0.0",
+        "type-fest": "^0.6.0"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
+          "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1",
+            "lines-and-columns": "^1.1.6"
+          }
+        }
+      }
+    },
+    "read-pkg-up": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+      "dev": true,
+      "requires": {
+        "find-up": "^1.0.0",
+        "read-pkg": "^1.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+          "dev": true,
+          "requires": {
+            "path-exists": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "path-type": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+          "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+          "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^1.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^1.0.0"
+          }
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-2.3.6.tgz",
+      "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=",
+      "dev": true,
+      "requires": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "readdirp": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz?cache=0&sync_timestamp=1562457210009&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-2.2.1.tgz",
+      "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.11",
+        "micromatch": "^3.1.10",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "redent": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+      "dev": true,
+      "requires": {
+        "indent-string": "^2.1.0",
+        "strip-indent": "^1.0.1"
+      }
+    },
+    "regenerate": {
+      "version": "1.4.0",
+      "resolved": "http://registry.npm.taobao.org/regenerate/download/regenerate-1.4.0.tgz",
+      "integrity": "sha1-SoVuxLVuQHfFV1icroXnpMiGmhE=",
+      "dev": true
+    },
+    "regenerate-unicode-properties": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-8.1.0.tgz",
+      "integrity": "sha1-71Hg8OpK1CS3e/fLQfPgFccKPw4=",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.4.0"
+      }
+    },
+    "regenerator-runtime": {
+      "version": "0.12.1",
+      "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.12.1.tgz",
+      "integrity": "sha1-+hpxVEdkwDb4xJsToIsllMn4oN4="
+    },
+    "regenerator-transform": {
+      "version": "0.14.1",
+      "resolved": "https://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.14.1.tgz?cache=0&sync_timestamp=1563549978509&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-transform%2Fdownload%2Fregenerator-transform-0.14.1.tgz",
+      "integrity": "sha1-Oy/OThq3cywI9mXf2zFHScfd0vs=",
+      "dev": true,
+      "requires": {
+        "private": "^0.1.6"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz",
+      "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "regexp-tree": {
+      "version": "0.1.13",
+      "resolved": "https://registry.npm.taobao.org/regexp-tree/download/regexp-tree-0.1.13.tgz",
+      "integrity": "sha1-Wxmrk3ftxovDZ5JWhAuymvwVjX8=",
+      "dev": true
+    },
+    "regexp.prototype.flags": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz",
+      "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.2"
+      }
+    },
+    "regexpu-core": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npm.taobao.org/regexpu-core/download/regexpu-core-4.6.0.tgz?cache=0&sync_timestamp=1568375270709&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexpu-core%2Fdownload%2Fregexpu-core-4.6.0.tgz",
+      "integrity": "sha1-IDfBizJ8/Oim/qKk7EQfJDKvuLY=",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.4.0",
+        "regenerate-unicode-properties": "^8.1.0",
+        "regjsgen": "^0.5.0",
+        "regjsparser": "^0.6.0",
+        "unicode-match-property-ecmascript": "^1.0.4",
+        "unicode-match-property-value-ecmascript": "^1.1.0"
+      }
+    },
+    "registry-auth-token": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npm.taobao.org/registry-auth-token/download/registry-auth-token-3.3.2.tgz",
+      "integrity": "sha1-hR/UkDjuy1hpERFa+EUmDuyYPyA=",
+      "dev": true,
+      "requires": {
+        "rc": "^1.1.6",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "registry-url": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npm.taobao.org/registry-url/download/registry-url-3.1.0.tgz",
+      "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+      "dev": true,
+      "requires": {
+        "rc": "^1.0.1"
+      }
+    },
+    "regjsgen": {
+      "version": "0.5.0",
+      "resolved": "http://registry.npm.taobao.org/regjsgen/download/regjsgen-0.5.0.tgz",
+      "integrity": "sha1-p2NNwI+JIJwgSa3aNSVxH7lyZd0=",
+      "dev": true
+    },
+    "regjsparser": {
+      "version": "0.6.0",
+      "resolved": "http://registry.npm.taobao.org/regjsparser/download/regjsparser-0.6.0.tgz",
+      "integrity": "sha1-8eaui32iuulsmTmbhozWyTOiupw=",
+      "dev": true,
+      "requires": {
+        "jsesc": "~0.5.0"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "http://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+          "dev": true
+        }
+      }
+    },
+    "relateurl": {
+      "version": "0.2.7",
+      "resolved": "http://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz",
+      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+      "dev": true
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+      "dev": true
+    },
+    "renderkid": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz",
+      "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==",
+      "dev": true,
+      "requires": {
+        "css-select": "^1.1.0",
+        "dom-converter": "^0.2",
+        "htmlparser2": "^3.3.0",
+        "strip-ansi": "^3.0.0",
+        "utila": "^0.4.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "css-select": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npm.taobao.org/css-select/download/css-select-1.2.0.tgz",
+          "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+          "dev": true,
+          "requires": {
+            "boolbase": "~1.0.0",
+            "css-what": "2.1",
+            "domutils": "1.5.1",
+            "nth-check": "~1.0.1"
+          }
+        },
+        "domutils": {
+          "version": "1.5.1",
+          "resolved": "http://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz",
+          "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+          "dev": true,
+          "requires": {
+            "dom-serializer": "0",
+            "domelementtype": "1"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        }
+      }
+    },
+    "repeat-element": {
+      "version": "1.1.3",
+      "resolved": "http://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz",
+      "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=",
+      "dev": true
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "dev": true
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "dev": true,
+      "requires": {
+        "is-finite": "^1.0.0"
+      }
+    },
+    "request": {
+      "version": "2.88.0",
+      "resolved": "http://registry.npm.taobao.org/request/download/request-2.88.0.tgz",
+      "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=",
+      "requires": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.8.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.6",
+        "extend": "~3.0.2",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.2",
+        "har-validator": "~5.1.0",
+        "http-signature": "~1.2.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "oauth-sign": "~0.9.0",
+        "performance-now": "^2.1.0",
+        "qs": "~6.5.2",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "~2.4.3",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      }
+    },
+    "request-promise-core": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/request-promise-core/download/request-promise-core-1.1.2.tgz",
+      "integrity": "sha1-M59qq6vK/bMceZ/xWHADNjAdM0Y=",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.11"
+      }
+    },
+    "request-promise-native": {
+      "version": "1.0.7",
+      "resolved": "http://registry.npm.taobao.org/request-promise-native/download/request-promise-native-1.0.7.tgz",
+      "integrity": "sha1-pJhopiS96lBp8SUdCoNuDYmqLFk=",
+      "dev": true,
+      "requires": {
+        "request-promise-core": "1.1.2",
+        "stealthy-require": "^1.1.1",
+        "tough-cookie": "^2.3.3"
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "dev": true
+    },
+    "require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+      "dev": true
+    },
+    "requires-port": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+      "dev": true
+    },
+    "reselect": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npm.taobao.org/reselect/download/reselect-3.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freselect%2Fdownload%2Freselect-3.0.1.tgz",
+      "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.11.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve%2Fdownload%2Fresolve-1.11.1.tgz",
+      "integrity": "sha1-6hDYEQN2mC/vV434/DC5rDCgej4=",
+      "dev": true,
+      "requires": {
+        "path-parse": "^1.0.6"
+      }
+    },
+    "resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz",
+      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+      "dev": true
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "dev": true
+    },
+    "restore-cursor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz",
+      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+      "dev": true,
+      "requires": {
+        "onetime": "^2.0.0",
+        "signal-exit": "^3.0.2"
+      }
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz",
+      "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=",
+      "dev": true
+    },
+    "retry": {
+      "version": "0.12.0",
+      "resolved": "http://registry.npm.taobao.org/retry/download/retry-0.12.0.tgz",
+      "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
+      "dev": true
+    },
+    "rgb-regex": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/rgb-regex/download/rgb-regex-1.0.1.tgz",
+      "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=",
+      "dev": true
+    },
+    "rgba-regex": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/rgba-regex/download/rgba-regex-1.0.0.tgz",
+      "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
+      "dev": true
+    },
+    "rimraf": {
+      "version": "2.6.3",
+      "resolved": "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz",
+      "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "ripemd160": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz",
+      "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "run-queue": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz",
+      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1"
+      }
+    },
+    "safe-area-insets": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/safe-area-insets/-/safe-area-insets-1.4.1.tgz",
+      "integrity": "sha512-r/nRWTjFGhhm3w1Z6Kd/jY11srN+lHt2mNl1E/emQGW8ic7n3Avu4noibklfSM+Y34peNphHD/BSZecav0sXYQ=="
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
+      "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "dev": true,
+      "requires": {
+        "ret": "~0.1.10"
+      }
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz",
+      "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
+    },
+    "sass-graph": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
+      "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
+      "dev": true,
+      "requires": {
+        "glob": "^7.0.0",
+        "lodash": "^4.0.0",
+        "scss-tokenizer": "^0.2.3",
+        "yargs": "^7.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true
+        },
+        "cliui": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+          "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+          "dev": true,
+          "requires": {
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wrap-ansi": "^2.0.0"
+          }
+        },
+        "get-caller-file": {
+          "version": "1.0.3",
+          "resolved": "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz",
+          "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=",
+          "dev": true
+        },
+        "invert-kv": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+          "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "lcid": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+          "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+          "dev": true,
+          "requires": {
+            "invert-kv": "^1.0.0"
+          }
+        },
+        "os-locale": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+          "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+          "dev": true,
+          "requires": {
+            "lcid": "^1.0.0"
+          }
+        },
+        "require-main-filename": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+          "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "dev": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "which-module": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+          "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+          "dev": true
+        },
+        "wrap-ansi": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+          "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+          "dev": true,
+          "requires": {
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1"
+          }
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
+        },
+        "yargs": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
+          "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^3.0.0",
+            "cliui": "^3.2.0",
+            "decamelize": "^1.1.1",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^1.4.0",
+            "read-pkg-up": "^1.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^1.0.1",
+            "set-blocking": "^2.0.0",
+            "string-width": "^1.0.2",
+            "which-module": "^1.0.0",
+            "y18n": "^3.2.1",
+            "yargs-parser": "^5.0.0"
+          }
+        },
+        "yargs-parser": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
+          "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^3.0.0"
+          }
+        }
+      }
+    },
+    "sass-loader": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz",
+      "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==",
+      "dev": true,
+      "requires": {
+        "clone-deep": "^4.0.1",
+        "loader-utils": "^1.0.1",
+        "neo-async": "^2.5.0",
+        "pify": "^4.0.1",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "dev": true
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "sax": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+      "dev": true
+    },
+    "schema-utils": {
+      "version": "0.4.7",
+      "resolved": "http://registry.npm.taobao.org/schema-utils/download/schema-utils-0.4.7.tgz",
+      "integrity": "sha1-unT1l9K+LqiAExdG7hfQoJPGgYc=",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.1.0",
+        "ajv-keywords": "^3.1.0"
+      }
+    },
+    "scss-tokenizer": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+      "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
+      "dev": true,
+      "requires": {
+        "js-base64": "^2.1.8",
+        "source-map": "^0.4.2"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+          "dev": true,
+          "requires": {
+            "amdefine": ">=0.0.4"
+          }
+        }
+      }
+    },
+    "select-hose": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/select-hose/download/select-hose-2.0.0.tgz",
+      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+      "dev": true
+    },
+    "selfsigned": {
+      "version": "1.10.6",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.6.tgz",
+      "integrity": "sha512-i3+CeqxL7DpAazgVpAGdKMwHuL63B5nhJMh9NQ7xmChGkA3jNFflq6Jyo1LLJYcr3idWiNOPWHCrm4zMayLG4w==",
+      "dev": true,
+      "requires": {
+        "node-forge": "0.8.2"
+      }
+    },
+    "semver": {
+      "version": "5.7.0",
+      "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.0.tgz",
+      "integrity": "sha1-eQp89v6lRZuslhELKbYEEtyP+Ws=",
+      "dev": true
+    },
+    "send": {
+      "version": "0.17.1",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+      "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "destroy": "~1.0.4",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "~1.7.2",
+        "mime": "1.6.0",
+        "ms": "2.1.1",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.1",
+        "statuses": "~1.5.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+              "dev": true
+            }
+          }
+        },
+        "mime": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+          "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true
+        }
+      }
+    },
+    "serialize-javascript": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-1.7.0.tgz",
+      "integrity": "sha1-1uDfsqODKoyURo5usduX5VoZKmU=",
+      "dev": true
+    },
+    "serve-index": {
+      "version": "1.9.1",
+      "resolved": "http://registry.npm.taobao.org/serve-index/download/serve-index-1.9.1.tgz",
+      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.4",
+        "batch": "0.6.1",
+        "debug": "2.6.9",
+        "escape-html": "~1.0.3",
+        "http-errors": "~1.6.2",
+        "mime-types": "~2.1.17",
+        "parseurl": "~1.3.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "http-errors": {
+          "version": "1.6.3",
+          "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz?cache=0&sync_timestamp=1561418493658&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.6.3.tgz",
+          "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+          "dev": true,
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.0",
+            "statuses": ">= 1.4.0 < 2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "setprototypeof": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+          "dev": true
+        }
+      }
+    },
+    "serve-static": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+      "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+      "dev": true,
+      "requires": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.17.1"
+      }
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+      "dev": true
+    },
+    "set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz",
+      "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "http://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+      "dev": true
+    },
+    "setprototypeof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+      "dev": true
+    },
+    "sha.js": {
+      "version": "2.4.11",
+      "resolved": "http://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz",
+      "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^6.0.2"
+      }
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "dev": true
+    },
+    "shell-quote": {
+      "version": "1.6.1",
+      "resolved": "http://registry.npm.taobao.org/shell-quote/download/shell-quote-1.6.1.tgz",
+      "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
+      "dev": true,
+      "requires": {
+        "array-filter": "~0.0.0",
+        "array-map": "~0.0.0",
+        "array-reduce": "~0.0.0",
+        "jsonify": "~0.0.0"
+      }
+    },
+    "signal-exit": {
+      "version": "3.0.2",
+      "resolved": "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+      "dev": true
+    },
+    "simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "http://registry.npm.taobao.org/simple-swizzle/download/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.3.1"
+      },
+      "dependencies": {
+        "is-arrayish": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+          "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+          "dev": true
+        }
+      }
+    },
+    "slash": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz",
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+      "dev": true
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "http://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz",
+      "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=",
+      "dev": true,
+      "requires": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=",
+      "dev": true,
+      "requires": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.2.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "sockjs": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
+      "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
+      "dev": true,
+      "requires": {
+        "faye-websocket": "^0.10.0",
+        "uuid": "^3.0.1"
+      }
+    },
+    "sockjs-client": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz",
+      "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==",
+      "dev": true,
+      "requires": {
+        "debug": "^3.2.5",
+        "eventsource": "^1.0.7",
+        "faye-websocket": "~0.11.1",
+        "inherits": "^2.0.3",
+        "json3": "^3.3.2",
+        "url-parse": "^1.4.3"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "faye-websocket": {
+          "version": "0.11.3",
+          "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
+          "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
+          "dev": true,
+          "requires": {
+            "websocket-driver": ">=0.5.1"
+          }
+        }
+      }
+    },
+    "sort-keys": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-2.0.0.tgz",
+      "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=",
+      "dev": true,
+      "requires": {
+        "is-plain-obj": "^1.0.0"
+      }
+    },
+    "source-list-map": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz",
+      "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=",
+      "dev": true
+    },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
+      "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+      "dev": true
+    },
+    "source-map-resolve": {
+      "version": "0.5.2",
+      "resolved": "http://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.2.tgz",
+      "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=",
+      "dev": true,
+      "requires": {
+        "atob": "^2.1.1",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-support": {
+      "version": "0.5.12",
+      "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.12.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.5.12.tgz",
+      "integrity": "sha1-tPOxDVGFelrwE4086AA7IBYT1Zk=",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "http://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+      "dev": true
+    },
+    "spdx-correct": {
+      "version": "3.1.0",
+      "resolved": "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.0.tgz",
+      "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.2.0",
+      "resolved": "http://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz",
+      "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc=",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz",
+      "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.5.tgz",
+      "integrity": "sha1-NpS1gEVnpFjTyARYQqY1hjL2JlQ=",
+      "dev": true
+    },
+    "spdy": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz",
+      "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "handle-thing": "^2.0.0",
+        "http-deceiver": "^1.2.7",
+        "select-hose": "^2.0.0",
+        "spdy-transport": "^3.0.0"
+      }
+    },
+    "spdy-transport": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+      "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "detect-node": "^2.0.4",
+        "hpack.js": "^2.1.6",
+        "obuf": "^1.1.2",
+        "readable-stream": "^3.0.6",
+        "wbuf": "^1.7.3"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
+          "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz",
+      "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.0"
+      }
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "dev": true
+    },
+    "sshpk": {
+      "version": "1.16.1",
+      "resolved": "http://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz",
+      "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=",
+      "requires": {
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
+      }
+    },
+    "ssri": {
+      "version": "5.3.0",
+      "resolved": "http://registry.npm.taobao.org/ssri/download/ssri-5.3.0.tgz",
+      "integrity": "sha1-ujhyycbTOgcEp9cf8EXl7EiZnQY=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "stable": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+      "dev": true
+    },
+    "stackframe": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz",
+      "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==",
+      "dev": true
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "dev": true,
+      "requires": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "statuses": {
+      "version": "1.5.0",
+      "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz",
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+      "dev": true
+    },
+    "stdout-stream": {
+      "version": "1.4.1",
+      "resolved": "http://registry.npm.taobao.org/stdout-stream/download/stdout-stream-1.4.1.tgz",
+      "integrity": "sha1-WsF0zdXNcmEEqgwLK9g4FdjVNd4=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "stealthy-require": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/stealthy-require/download/stealthy-require-1.1.1.tgz",
+      "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
+      "dev": true
+    },
+    "stream-browserify": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz",
+      "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=",
+      "dev": true,
+      "requires": {
+        "inherits": "~2.0.1",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "stream-each": {
+      "version": "1.2.3",
+      "resolved": "http://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz",
+      "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "stream-http": {
+      "version": "2.8.3",
+      "resolved": "http://registry.npm.taobao.org/stream-http/download/stream-http-2.8.3.tgz",
+      "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=",
+      "dev": true,
+      "requires": {
+        "builtin-status-codes": "^3.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.3.6",
+        "to-arraybuffer": "^1.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
+    "stream-shift": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.0.tgz",
+      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+      "dev": true
+    },
+    "strict-uri-encode": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz",
+      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
+      "dev": true
+    },
+    "string-width": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz",
+      "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+      "dev": true,
+      "requires": {
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        }
+      }
+    },
+    "string.prototype.padend": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/string.prototype.padend/download/string.prototype.padend-3.0.0.tgz",
+      "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.2",
+        "es-abstract": "^1.4.3",
+        "function-bind": "^1.0.2"
+      }
+    },
+    "string.prototype.padstart": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/string.prototype.padstart/download/string.prototype.padstart-3.0.0.tgz",
+      "integrity": "sha1-W8+tOfRkm7LQMSkuGbzwtRDUskI=",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.2",
+        "es-abstract": "^1.4.3",
+        "function-bind": "^1.0.2"
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz",
+      "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "strip-ansi": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz",
+      "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^4.1.0"
+      }
+    },
+    "strip-bom": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+      "dev": true,
+      "requires": {
+        "is-utf8": "^0.2.0"
+      }
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "dev": true
+    },
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+      "dev": true,
+      "requires": {
+        "get-stdin": "^4.0.1"
+      }
+    },
+    "strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-json-comments%2Fdownload%2Fstrip-json-comments-2.0.1.tgz",
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+      "dev": true
+    },
+    "stylehacks": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
+      "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "3.1.1",
+          "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz",
+          "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^4.1.1",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "supports-color": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz",
+      "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=",
+      "dev": true,
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "svg-tags": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz",
+      "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
+      "dev": true
+    },
+    "svgo": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz",
+      "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "coa": "^2.0.2",
+        "css-select": "^2.0.0",
+        "css-select-base-adapter": "^0.1.1",
+        "css-tree": "1.0.0-alpha.33",
+        "csso": "^3.5.1",
+        "js-yaml": "^3.13.1",
+        "mkdirp": "~0.5.1",
+        "object.values": "^1.1.0",
+        "sax": "~1.2.4",
+        "stable": "^0.1.8",
+        "unquote": "~1.1.1",
+        "util.promisify": "~1.0.0"
+      }
+    },
+    "tapable": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npm.taobao.org/tapable/download/tapable-1.1.3.tgz",
+      "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I=",
+      "dev": true
+    },
+    "tar": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npm.taobao.org/tar/download/tar-2.2.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftar%2Fdownload%2Ftar-2.2.2.tgz",
+      "integrity": "sha1-DKiEhWLHKZuLRG/2pNYM27I+3EA=",
+      "dev": true,
+      "requires": {
+        "block-stream": "*",
+        "fstream": "^1.0.12",
+        "inherits": "2"
+      }
+    },
+    "terser": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npm.taobao.org/terser/download/terser-4.1.2.tgz?cache=0&sync_timestamp=1562580696479&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser%2Fdownload%2Fterser-4.1.2.tgz",
+      "integrity": "sha1-smVsilBvfOgFo/MAov9I2wIvo5E=",
+      "dev": true,
+      "requires": {
+        "commander": "^2.20.0",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.12"
+      }
+    },
+    "terser-webpack-plugin": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-1.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-1.3.0.tgz",
+      "integrity": "sha1-aaoiQmKZ9LWzd1y+2MssXUGaodQ=",
+      "dev": true,
+      "requires": {
+        "cacache": "^11.3.2",
+        "find-cache-dir": "^2.0.0",
+        "is-wsl": "^1.1.0",
+        "loader-utils": "^1.2.3",
+        "schema-utils": "^1.0.0",
+        "serialize-javascript": "^1.7.0",
+        "source-map": "^0.6.1",
+        "terser": "^4.0.0",
+        "webpack-sources": "^1.3.0",
+        "worker-farm": "^1.7.0"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "11.3.3",
+          "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-11.3.3.tgz?cache=0&sync_timestamp=1560788095566&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-11.3.3.tgz",
+          "integrity": "sha1-i9Kd+ManGKbr0tAQ2k15cq47utw=",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.5",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.1.15",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.3",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          }
+        },
+        "find-cache-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-2.1.0.tgz",
+          "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=",
+          "dev": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "make-dir": "^2.0.0",
+            "pkg-dir": "^3.0.0"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz",
+          "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz",
+          "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz",
+          "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "make-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz",
+          "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=",
+          "dev": true,
+          "requires": {
+            "pify": "^4.0.1",
+            "semver": "^5.6.0"
+          }
+        },
+        "mississippi": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-3.0.0.tgz",
+          "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=",
+          "dev": true,
+          "requires": {
+            "concat-stream": "^1.5.0",
+            "duplexify": "^3.4.2",
+            "end-of-stream": "^1.1.0",
+            "flush-write-stream": "^1.0.0",
+            "from2": "^2.1.0",
+            "parallel-transform": "^1.1.0",
+            "pump": "^3.0.0",
+            "pumpify": "^1.3.3",
+            "stream-each": "^1.1.0",
+            "through2": "^2.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.2.0",
+          "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-2.2.0.tgz",
+          "integrity": "sha1-QXyZQeYCepq8ulCS3SkE4lW1+8I=",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz",
+          "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz",
+          "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=",
+          "dev": true
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "http://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz",
+          "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-3.0.0.tgz",
+          "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=",
+          "dev": true,
+          "requires": {
+            "find-up": "^3.0.0"
+          }
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz",
+          "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz",
+          "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "http://registry.npm.taobao.org/ssri/download/ssri-6.0.1.tgz",
+          "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "yallist": {
+          "version": "3.0.3",
+          "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-3.0.3.tgz",
+          "integrity": "sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=",
+          "dev": true
+        }
+      }
+    },
+    "thenify": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npm.taobao.org/thenify/download/thenify-3.3.0.tgz",
+      "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
+      "dev": true,
+      "requires": {
+        "any-promise": "^1.0.0"
+      }
+    },
+    "thenify-all": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npm.taobao.org/thenify-all/download/thenify-all-1.6.0.tgz",
+      "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+      "dev": true,
+      "requires": {
+        "thenify": ">= 3.1.0 < 4"
+      }
+    },
+    "thread-loader": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz",
+      "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==",
+      "dev": true,
+      "requires": {
+        "loader-runner": "^2.3.1",
+        "loader-utils": "^1.1.0",
+        "neo-async": "^2.6.0"
+      }
+    },
+    "through2": {
+      "version": "2.0.5",
+      "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz",
+      "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "~2.3.6",
+        "xtend": "~4.0.1"
+      }
+    },
+    "thunky": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz",
+      "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==",
+      "dev": true
+    },
+    "timers-browserify": {
+      "version": "2.0.10",
+      "resolved": "http://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.10.tgz",
+      "integrity": "sha1-HSjj0qrfHVpZlsTp+VYBzQU0gK4=",
+      "dev": true,
+      "requires": {
+        "setimmediate": "^1.0.4"
+      }
+    },
+    "timsort": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.taobao.org/timsort/download/timsort-0.3.0.tgz",
+      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
+      "dev": true
+    },
+    "to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+      "dev": true
+    },
+    "to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+      "dev": true
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "http://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz",
+      "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=",
+      "dev": true,
+      "requires": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      }
+    },
+    "toidentifier": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+      "dev": true
+    },
+    "toposort": {
+      "version": "1.0.7",
+      "resolved": "http://registry.npm.taobao.org/toposort/download/toposort-1.0.7.tgz",
+      "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
+      "dev": true
+    },
+    "tough-cookie": {
+      "version": "2.4.3",
+      "resolved": "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz",
+      "integrity": "sha1-U/Nto/R3g7CSWvoG/587FlKA94E=",
+      "requires": {
+        "psl": "^1.1.24",
+        "punycode": "^1.4.1"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+        }
+      }
+    },
+    "trim-newlines": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+      "dev": true
+    },
+    "trim-right": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz",
+      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+      "dev": true
+    },
+    "true-case-path": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/true-case-path/download/true-case-path-1.0.3.tgz",
+      "integrity": "sha1-+BO1qMhrQNpZYGcisUTjIleZ9H0=",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.2"
+      }
+    },
+    "tryer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
+      "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
+      "dev": true
+    },
+    "tslib": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.10.0.tgz",
+      "integrity": "sha1-w8GflZc/sKYpc/sJ2Q2WHuQ+XIo=",
+      "dev": true
+    },
+    "tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "http://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+      "dev": true
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "requires": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+    },
+    "type-check": {
+      "version": "0.3.2",
+      "resolved": "http://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz",
+      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "~1.1.2"
+      }
+    },
+    "type-fest": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+      "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+      "dev": true
+    },
+    "type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "dev": true,
+      "requires": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      }
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+      "dev": true
+    },
+    "uglify-js": {
+      "version": "3.4.10",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz",
+      "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==",
+      "dev": true,
+      "requires": {
+        "commander": "~2.19.0",
+        "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.19.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+          "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
+          "dev": true
+        }
+      }
+    },
+    "unicode-canonical-property-names-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+      "integrity": "sha1-JhmADEyCWADv3YNDr33Zkzy+KBg=",
+      "dev": true
+    },
+    "unicode-match-property-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-1.0.4.tgz",
+      "integrity": "sha1-jtKjJWmWG86SJ9Cc0/+7j+1fAgw=",
+      "dev": true,
+      "requires": {
+        "unicode-canonical-property-names-ecmascript": "^1.0.4",
+        "unicode-property-aliases-ecmascript": "^1.0.4"
+      }
+    },
+    "unicode-match-property-value-ecmascript": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.1.0.tgz",
+      "integrity": "sha1-W0tCbgjROoA2Xg1lesemwexGonc=",
+      "dev": true
+    },
+    "unicode-property-aliases-ecmascript": {
+      "version": "1.0.5",
+      "resolved": "http://registry.npm.taobao.org/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.0.5.tgz",
+      "integrity": "sha1-qcxsx85joKMCP8meNBuUQx1AWlc=",
+      "dev": true
+    },
+    "union-value": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz",
+      "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      }
+    },
+    "uniq": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz",
+      "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+      "dev": true
+    },
+    "uniqs": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/uniqs/download/uniqs-2.0.0.tgz",
+      "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
+      "dev": true
+    },
+    "unique-filename": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.1.tgz",
+      "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=",
+      "dev": true,
+      "requires": {
+        "unique-slug": "^2.0.0"
+      }
+    },
+    "unique-slug": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.2.tgz",
+      "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=",
+      "dev": true,
+      "requires": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
+    "universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+      "dev": true
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+      "dev": true
+    },
+    "unquote": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/unquote/download/unquote-1.1.1.tgz",
+      "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
+      "dev": true
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "dev": true,
+      "requires": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "dev": true,
+          "requires": {
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "dev": true,
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+          "dev": true
+        }
+      }
+    },
+    "upath": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/upath/download/upath-1.1.2.tgz",
+      "integrity": "sha1-PbZYYA7a7sy+bbXmhNZ+6MKs0Gg=",
+      "dev": true
+    },
+    "update-check": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npm.taobao.org/update-check/download/update-check-1.5.3.tgz",
+      "integrity": "sha1-RSQPz7h1Wnx/pou92e2gJqQWOe0=",
+      "dev": true,
+      "requires": {
+        "registry-auth-token": "3.3.2",
+        "registry-url": "3.1.0"
+      }
+    },
+    "upper-case": {
+      "version": "1.1.3",
+      "resolved": "http://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz",
+      "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+      "dev": true
+    },
+    "uri-js": {
+      "version": "4.2.2",
+      "resolved": "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz",
+      "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=",
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "dev": true
+    },
+    "url": {
+      "version": "0.11.0",
+      "resolved": "http://registry.npm.taobao.org/url/download/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "dev": true,
+      "requires": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.3.2",
+          "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz",
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+          "dev": true
+        }
+      }
+    },
+    "url-loader": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz",
+      "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "mime": "^2.0.3",
+        "schema-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
+      }
+    },
+    "url-parse": {
+      "version": "1.4.7",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
+      "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
+      "dev": true,
+      "requires": {
+        "querystringify": "^2.1.1",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "http://registry.npm.taobao.org/use/download/use-3.1.1.tgz",
+      "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=",
+      "dev": true
+    },
+    "util": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npm.taobao.org/util/download/util-0.11.1.tgz",
+      "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        }
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "util.promisify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
+      "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.2",
+        "object.getownpropertydescriptors": "^2.0.3"
+      }
+    },
+    "utila": {
+      "version": "0.4.0",
+      "resolved": "http://registry.npm.taobao.org/utila/download/utila-0.4.0.tgz",
+      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
+      "dev": true
+    },
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+      "dev": true
+    },
+    "uuid": {
+      "version": "3.3.2",
+      "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz",
+      "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE="
+    },
+    "uview-ui": {
+      "version": "2.0.9",
+      "resolved": "https://registry.npmmirror.com/uview-ui/download/uview-ui-2.0.9.tgz",
+      "integrity": "sha512-VyEvaLH3GUoEAOetFGCV91FU3P2FomE01De9d3RdwLXzW6lOgLjVO9LZClIrBr+xmNSzL4AL5YYgG5wILbQTjQ=="
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+      "dev": true
+    },
+    "vendors": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz",
+      "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==",
+      "dev": true
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
+    },
+    "vm-browserify": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/vm-browserify/download/vm-browserify-1.1.0.tgz",
+      "integrity": "sha1-vXbWojMj4sqP+hICjcBFWcdfkBk=",
+      "dev": true
+    },
+    "vue": {
+      "version": "2.6.10",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.10.tgz",
+      "integrity": "sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ=="
+    },
+    "vue-hot-reload-api": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
+      "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==",
+      "dev": true
+    },
+    "vue-loader": {
+      "version": "15.7.1",
+      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.7.1.tgz",
+      "integrity": "sha512-fwIKtA23Pl/rqfYP5TSGK7gkEuLhoTvRYW+TU7ER3q9GpNLt/PjG5NLv3XHRDiTg7OPM1JcckBgds+VnAc+HbA==",
+      "dev": true,
+      "requires": {
+        "@vue/component-compiler-utils": "^3.0.0",
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.1.0",
+        "vue-hot-reload-api": "^2.3.0",
+        "vue-style-loader": "^4.1.0"
+      }
+    },
+    "vue-style-loader": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz",
+      "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==",
+      "dev": true,
+      "requires": {
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.0.2"
+      }
+    },
+    "vue-template-compiler": {
+      "version": "2.6.10",
+      "resolved": "https://registry.npm.taobao.org/vue-template-compiler/download/vue-template-compiler-2.6.10.tgz",
+      "integrity": "sha1-MjtPNJXwT6o1AzN6gvXWUHeZycw=",
+      "dev": true,
+      "requires": {
+        "de-indent": "^1.0.2",
+        "he": "^1.1.0"
+      }
+    },
+    "vue-template-es2015-compiler": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz",
+      "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
+      "dev": true
+    },
+    "vuex": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npm.taobao.org/vuex/download/vuex-3.1.1.tgz",
+      "integrity": "sha1-DCZL/jDNvM+Wq52zF30hGCilkQ4="
+    },
+    "watchpack": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.6.0.tgz",
+      "integrity": "sha1-S8EsLr6KonenHx0/FNaFx7RGzQA=",
+      "dev": true,
+      "requires": {
+        "chokidar": "^2.0.2",
+        "graceful-fs": "^4.1.2",
+        "neo-async": "^2.5.0"
+      }
+    },
+    "wbuf": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+      "dev": true,
+      "requires": {
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "wcwidth": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/wcwidth/download/wcwidth-1.0.1.tgz",
+      "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+      "dev": true,
+      "requires": {
+        "defaults": "^1.0.3"
+      }
+    },
+    "webpack": {
+      "version": "4.28.4",
+      "resolved": "https://registry.npm.taobao.org/webpack/download/webpack-4.28.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack%2Fdownload%2Fwebpack-4.28.4.tgz",
+      "integrity": "sha1-HdrmyJiH1++3Uq3ww80yubB+rNA=",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-module-context": "1.7.11",
+        "@webassemblyjs/wasm-edit": "1.7.11",
+        "@webassemblyjs/wasm-parser": "1.7.11",
+        "acorn": "^5.6.2",
+        "acorn-dynamic-import": "^3.0.0",
+        "ajv": "^6.1.0",
+        "ajv-keywords": "^3.1.0",
+        "chrome-trace-event": "^1.0.0",
+        "enhanced-resolve": "^4.1.0",
+        "eslint-scope": "^4.0.0",
+        "json-parse-better-errors": "^1.0.2",
+        "loader-runner": "^2.3.0",
+        "loader-utils": "^1.1.0",
+        "memory-fs": "~0.4.1",
+        "micromatch": "^3.1.8",
+        "mkdirp": "~0.5.0",
+        "neo-async": "^2.5.0",
+        "node-libs-browser": "^2.0.0",
+        "schema-utils": "^0.4.4",
+        "tapable": "^1.1.0",
+        "terser-webpack-plugin": "^1.1.0",
+        "watchpack": "^1.5.0",
+        "webpack-sources": "^1.3.0"
+      }
+    },
+    "webpack-bundle-analyzer": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.5.0.tgz",
+      "integrity": "sha512-NzueflueLSJxWGzDlMq5oUV+P8Qoq6yiaQlXGCbDYUpHEKlmzWdPLBJ4k/B6HTdAP/vHM8ply1Fx08mDnY+S8Q==",
+      "dev": true,
+      "requires": {
+        "acorn": "^6.0.7",
+        "acorn-walk": "^6.1.1",
+        "bfj": "^6.1.1",
+        "chalk": "^2.4.1",
+        "commander": "^2.18.0",
+        "ejs": "^2.6.1",
+        "express": "^4.16.3",
+        "filesize": "^3.6.1",
+        "gzip-size": "^5.0.0",
+        "lodash": "^4.17.15",
+        "mkdirp": "^0.5.1",
+        "opener": "^1.5.1",
+        "ws": "^6.0.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz",
+          "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        }
+      }
+    },
+    "webpack-chain": {
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-4.12.1.tgz",
+      "integrity": "sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==",
+      "dev": true,
+      "requires": {
+        "deepmerge": "^1.5.2",
+        "javascript-stringify": "^1.6.0"
+      }
+    },
+    "webpack-dev-middleware": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.1.tgz",
+      "integrity": "sha512-5MWu9SH1z3hY7oHOV6Kbkz5x7hXbxK56mGHNqHTe6d+ewxOwKUxoUJBs7QIaJb33lPjl9bJZ3X0vCoooUzC36A==",
+      "dev": true,
+      "requires": {
+        "memory-fs": "^0.4.1",
+        "mime": "^2.4.4",
+        "mkdirp": "^0.5.1",
+        "range-parser": "^1.2.1",
+        "webpack-log": "^2.0.0"
+      }
+    },
+    "webpack-dev-server": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz",
+      "integrity": "sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==",
+      "dev": true,
+      "requires": {
+        "ansi-html": "0.0.7",
+        "bonjour": "^3.5.0",
+        "chokidar": "^2.1.6",
+        "compression": "^1.7.4",
+        "connect-history-api-fallback": "^1.6.0",
+        "debug": "^4.1.1",
+        "del": "^4.1.1",
+        "express": "^4.17.1",
+        "html-entities": "^1.2.1",
+        "http-proxy-middleware": "^0.19.1",
+        "import-local": "^2.0.0",
+        "internal-ip": "^4.3.0",
+        "ip": "^1.1.5",
+        "is-absolute-url": "^3.0.0",
+        "killable": "^1.0.1",
+        "loglevel": "^1.6.3",
+        "opn": "^5.5.0",
+        "p-retry": "^3.0.1",
+        "portfinder": "^1.0.21",
+        "schema-utils": "^1.0.0",
+        "selfsigned": "^1.10.4",
+        "semver": "^6.3.0",
+        "serve-index": "^1.9.1",
+        "sockjs": "0.3.19",
+        "sockjs-client": "1.3.0",
+        "spdy": "^4.0.1",
+        "strip-ansi": "^3.0.1",
+        "supports-color": "^6.1.0",
+        "url": "^0.11.0",
+        "webpack-dev-middleware": "^3.7.0",
+        "webpack-log": "^2.0.0",
+        "ws": "^6.2.1",
+        "yargs": "12.0.5"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "cliui": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
+          "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^2.1.1",
+            "strip-ansi": "^4.0.0",
+            "wrap-ansi": "^2.0.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "3.0.0",
+              "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz",
+              "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+              "dev": true
+            },
+            "strip-ansi": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz",
+              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^3.0.0"
+              }
+            }
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "get-caller-file": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+          "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+          "dev": true
+        },
+        "is-absolute-url": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.2.tgz",
+          "integrity": "sha512-+5g/wLlcm1AcxSP7014m6GvbPHswDx980vD/3bZaap8aGV9Yfs7Q6y6tfaupgZ5O74Byzc8dGrSCJ+bFXx0KdA==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
+          "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+          "dev": true
+        },
+        "require-main-filename": {
+          "version": "1.0.1",
+          "resolved": "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz",
+          "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+          "dev": true
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz",
+          "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+          "dev": true,
+          "requires": {
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1"
+          },
+          "dependencies": {
+            "string-width": {
+              "version": "1.0.2",
+              "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz",
+              "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+              "dev": true,
+              "requires": {
+                "code-point-at": "^1.0.0",
+                "is-fullwidth-code-point": "^1.0.0",
+                "strip-ansi": "^3.0.0"
+              }
+            }
+          }
+        },
+        "yargs": {
+          "version": "12.0.5",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
+          "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^4.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^3.0.0",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^1.0.1",
+            "set-blocking": "^2.0.0",
+            "string-width": "^2.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^3.2.1 || ^4.0.0",
+            "yargs-parser": "^11.1.1"
+          }
+        },
+        "yargs-parser": {
+          "version": "11.1.1",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
+          "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "webpack-log": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
+      "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
+      "dev": true,
+      "requires": {
+        "ansi-colors": "^3.0.0",
+        "uuid": "^3.3.2"
+      }
+    },
+    "webpack-merge": {
+      "version": "4.2.1",
+      "resolved": "http://registry.npm.taobao.org/webpack-merge/download/webpack-merge-4.2.1.tgz",
+      "integrity": "sha1-XpI8+ALqKs5P1a8dMkc2imM0ibQ=",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.5"
+      }
+    },
+    "webpack-sources": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/webpack-sources/download/webpack-sources-1.3.0.tgz",
+      "integrity": "sha1-KijcufH0X+lg2PFJMlK17mUw+oU=",
+      "dev": true,
+      "requires": {
+        "source-list-map": "^2.0.0",
+        "source-map": "~0.6.1"
+      }
+    },
+    "websocket-driver": {
+      "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz",
+      "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==",
+      "dev": true,
+      "requires": {
+        "http-parser-js": ">=0.4.0 <0.4.11",
+        "safe-buffer": ">=5.1.0",
+        "websocket-extensions": ">=0.1.1"
+      }
+    },
+    "websocket-extensions": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+      "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
+      "dev": true
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz",
+      "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=",
+      "dev": true,
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "which-module": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz",
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+      "dev": true
+    },
+    "wide-align": {
+      "version": "1.1.3",
+      "resolved": "http://registry.npm.taobao.org/wide-align/download/wide-align-1.1.3.tgz",
+      "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=",
+      "dev": true,
+      "requires": {
+        "string-width": "^1.0.2 || 2"
+      }
+    },
+    "wordwrap": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz",
+      "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+      "dev": true
+    },
+    "worker-farm": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npm.taobao.org/worker-farm/download/worker-farm-1.7.0.tgz",
+      "integrity": "sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag=",
+      "dev": true,
+      "requires": {
+        "errno": "~0.1.7"
+      }
+    },
+    "wrap-ansi": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.0",
+        "string-width": "^3.0.0",
+        "strip-ansi": "^5.0.0"
+      },
+      "dependencies": {
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        }
+      }
+    },
+    "wrap-loader": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npm.taobao.org/wrap-loader/download/wrap-loader-0.2.0.tgz",
+      "integrity": "sha1-ggn4fsgAR6ZXoq2rvP1iz61/Cq4=",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
+    },
+    "ws": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
+      "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
+      "dev": true,
+      "requires": {
+        "async-limiter": "~1.0.0"
+      }
+    },
+    "xregexp": {
+      "version": "4.0.0",
+      "resolved": "http://registry.npm.taobao.org/xregexp/download/xregexp-4.0.0.tgz",
+      "integrity": "sha1-5pgYneSd0qGMxWh7BeF8jkOUMCA=",
+      "dev": true
+    },
+    "xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz",
+      "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=",
+      "dev": true
+    },
+    "y18n": {
+      "version": "4.0.0",
+      "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz",
+      "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=",
+      "dev": true
+    },
+    "yallist": {
+      "version": "2.1.2",
+      "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+      "dev": true
+    },
+    "yargs": {
+      "version": "13.3.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
+      "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
+      "dev": true,
+      "requires": {
+        "cliui": "^5.0.0",
+        "find-up": "^3.0.0",
+        "get-caller-file": "^2.0.1",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^2.0.0",
+        "set-blocking": "^2.0.0",
+        "string-width": "^3.0.0",
+        "which-module": "^2.0.0",
+        "y18n": "^4.0.0",
+        "yargs-parser": "^13.1.1"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
+          "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        }
+      }
+    },
+    "yargs-parser": {
+      "version": "13.1.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
+      "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.0.0",
+        "decamelize": "^1.2.0"
+      }
+    }
+  }
+}

+ 71 - 0
package.json

xqd
@@ -0,0 +1,71 @@
+{
+  "name": "zjhj_bd_app",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "npm run dev:h5",
+    "build": "npm run build:h5",
+    "build:app-plus": "cross-env NODE_ENV=production UNI_PLATFORM=app-plus vue-cli-service uni-build",
+    "build:h5": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build",
+    "build:mp-alipay": "cross-env NODE_ENV=production UNI_PLATFORM=mp-alipay vue-cli-service uni-build",
+    "build:mp-baidu": "cross-env NODE_ENV=production UNI_PLATFORM=mp-baidu vue-cli-service uni-build",
+    "build:mp-qq": "cross-env NODE_ENV=production UNI_PLATFORM=mp-qq vue-cli-service uni-build",
+    "build:mp-toutiao": "cross-env NODE_ENV=production UNI_PLATFORM=mp-toutiao vue-cli-service uni-build",
+    "build:mp-weixin": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
+    "dev:app-plus": "cross-env NODE_ENV=development UNI_PLATFORM=app-plus vue-cli-service uni-build --watch",
+    "dev:h5": "cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-serve",
+    "dev:mp-alipay": "cross-env NODE_ENV=development UNI_PLATFORM=mp-alipay vue-cli-service uni-build --watch",
+    "dev:mp-baidu": "cross-env NODE_ENV=development UNI_PLATFORM=mp-baidu vue-cli-service uni-build --watch",
+    "dev:mp-qq": "cross-env NODE_ENV=development UNI_PLATFORM=mp-qq vue-cli-service uni-build --watch",
+    "dev:mp-toutiao": "cross-env NODE_ENV=development UNI_PLATFORM=mp-toutiao vue-cli-service uni-build --watch",
+    "dev:mp-weixin": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch --minimize",
+    "info": "node node_modules/@dcloudio/vue-cli-plugin-uni/commands/info.js",
+    "build:mp-alipay-np": "cross-env NODE_ENV=production UNI_PLATFORM=mp-alipay vue-cli-service uni-build --no-plugins",
+    "build:mp-baidu-np": "cross-env NODE_ENV=production UNI_PLATFORM=mp-baidu vue-cli-service uni-build --no-plugins",
+    "build:mp-toutiao-np": "cross-env NODE_ENV=production UNI_PLATFORM=mp-toutiao vue-cli-service uni-build --no-plugins",
+    "build:mp-weixin-np": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build --no-plugins",
+    "dev:mp-alipay-np": "cross-env NODE_ENV=development UNI_PLATFORM=mp-alipay vue-cli-service uni-build --watch --no-plugins",
+    "dev:mp-baidu-np": "cross-env NODE_ENV=development UNI_PLATFORM=mp-baidu vue-cli-service uni-build --watch --no-plugins",
+    "dev:mp-toutiao-np": "cross-env NODE_ENV=development UNI_PLATFORM=mp-toutiao vue-cli-service uni-build --watch --no-plugins",
+    "dev:mp-weixin-np": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch --minimize --no-plugins",
+    "build:h5-np": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build --no-plugins"
+  },
+  "dependencies": {
+    "@dcloudio/uni-app-plus": "^2.0.0-26920200409002",
+    "@dcloudio/uni-h5": "^2.0.0-29820201110001",
+    "@dcloudio/uni-mp-alipay": "^2.0.0-26920200409002",
+    "@dcloudio/uni-mp-baidu": "^2.0.0-26920200409002",
+    "@dcloudio/uni-mp-qq": "^2.0.0-26920200409002",
+    "@dcloudio/uni-mp-toutiao": "^2.0.0-26920200409002",
+    "@dcloudio/uni-mp-weixin": "^2.0.0-26920200409002",
+    "flex.css": "^1.1.7",
+    "flyio": "^0.6.14",
+    "jweixin-module": "^1.6.0",
+    "regenerator-runtime": "^0.12.1",
+    "vue": "^2.6.10",
+    "vuex": "^3.1.1"
+  },
+  "devDependencies": {
+    "@dcloudio/uni-cli-shared": "^0.2.971",
+    "@dcloudio/uni-template-compiler": "^0.9.180",
+    "@dcloudio/vue-cli-plugin-hbuilderx": "^1.0.123",
+    "@dcloudio/vue-cli-plugin-uni": "^0.9.498",
+    "@dcloudio/webpack-uni-mp-loader": "^0.3.639",
+    "@dcloudio/webpack-uni-pages-loader": "^0.2.852",
+    "@types/html5plus": "^1.0.0",
+    "@types/uni-app": "^1.3.2",
+    "@vue/cli-plugin-babel": "^3.5.1",
+    "@vue/cli-service": "^3.9.2",
+    "babel-plugin-import": "^1.12.0",
+    "cross-env": "^6.0.0",
+    "node-sass": "^4.12.0",
+    "postcss-comment": "^2.0.0",
+    "sass-loader": "^7.1.0",
+    "vue-template-compiler": "^2.6.10"
+  },
+  "browserslist": [
+    "last 3 versions",
+    "Android >= 4.4",
+    "ios >= 8"
+  ]
+}

+ 11 - 0
postcss.config.js

xqd
@@ -0,0 +1,11 @@
+const pkg = require('./package.json');
+module.exports = {
+  parser: require('postcss-comment'),
+  plugins: [
+    require('postcss-import'),
+    require('autoprefixer')({
+      remove: process.env.UNI_PLATFORM !== 'h5'
+    }),
+    require('@dcloudio/vue-cli-plugin-uni/packages/postcss')
+  ]
+};

+ 68 - 0
project.config.json

xqd
@@ -0,0 +1,68 @@
+{
+  "description": "项目配置文件",
+  "packOptions": {
+    "ignore": []
+  },
+  "setting": {
+    "bundle": false,
+    "userConfirmedBundleSwitch": false,
+    "urlCheck": true,
+    "scopeDataCheck": false,
+    "coverView": true,
+    "es6": true,
+    "postcss": true,
+    "compileHotReLoad": false,
+    "lazyloadPlaceholderEnable": false,
+    "preloadBackgroundData": false,
+    "minified": true,
+    "autoAudits": false,
+    "newFeature": false,
+    "uglifyFileName": false,
+    "uploadWithSourceMap": true,
+    "useIsolateContext": true,
+    "nodeModules": false,
+    "enhance": true,
+    "useMultiFrameRuntime": true,
+    "useApiHook": true,
+    "useApiHostProcess": true,
+    "showShadowRootInWxmlPanel": true,
+    "packNpmManually": false,
+    "enableEngineNative": false,
+    "packNpmRelationList": [],
+    "minifyWXSS": true,
+    "showES6CompileOption": false
+  },
+  "compileType": "miniprogram",
+  "libVersion": "2.21.0",
+  "appid": "wxddabcad88db72f01",
+  "projectname": "%E5%87%A1%E4%BA%91",
+  "debugOptions": {
+    "hidedInDevtools": []
+  },
+  "scripts": {},
+  "staticServerOptions": {
+    "baseURL": "",
+    "servePath": ""
+  },
+  "isGameTourist": false,
+  "condition": {
+    "search": {
+      "list": []
+    },
+    "conversation": {
+      "list": []
+    },
+    "game": {
+      "list": []
+    },
+    "plugin": {
+      "list": []
+    },
+    "gamePlugin": {
+      "list": []
+    },
+    "miniprogram": {
+      "list": []
+    }
+  }
+}

+ 1 - 0
public/ap.js

xqd
@@ -0,0 +1 @@
+(function(){var b={};var a={};a.PADCHAR="=";a.ALPHA="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";a.makeDOMException=function(){var f,d;try{return new DOMException(DOMException.INVALID_CHARACTER_ERR)}catch(d){var c=new Error("DOM Exception 5");c.code=c.number=5;c.name=c.description="INVALID_CHARACTER_ERR";c.toString=function(){return"Error: "+c.name+": "+c.message};return c}};a.getbyte64=function(e,d){var c=a.ALPHA.indexOf(e.charAt(d));if(c===-1){throw a.makeDOMException()}return c};a.decode=function(f){f=""+f;var j=a.getbyte64;var h,e,g;var d=f.length;if(d===0){return f}if(d%4!==0){throw a.makeDOMException()}h=0;if(f.charAt(d-1)===a.PADCHAR){h=1;if(f.charAt(d-2)===a.PADCHAR){h=2}d-=4}var c=[];for(e=0;e<d;e+=4){g=(j(f,e)<<18)|(j(f,e+1)<<12)|(j(f,e+2)<<6)|j(f,e+3);c.push(String.fromCharCode(g>>16,(g>>8)&255,g&255))}switch(h){case 1:g=(j(f,e)<<18)|(j(f,e+1)<<12)|(j(f,e+2)<<6);c.push(String.fromCharCode(g>>16,(g>>8)&255));break;case 2:g=(j(f,e)<<18)|(j(f,e+1)<<12);c.push(String.fromCharCode(g>>16));break}return c.join("")};a.getbyte=function(e,d){var c=e.charCodeAt(d);if(c>255){throw a.makeDOMException()}return c};a.encode=function(f){if(arguments.length!==1){throw new SyntaxError("Not enough arguments")}var g=a.PADCHAR;var h=a.ALPHA;var k=a.getbyte;var e,j;var c=[];f=""+f;var d=f.length-f.length%3;if(f.length===0){return f}for(e=0;e<d;e+=3){j=(k(f,e)<<16)|(k(f,e+1)<<8)|k(f,e+2);c.push(h.charAt(j>>18));c.push(h.charAt((j>>12)&63));c.push(h.charAt((j>>6)&63));c.push(h.charAt(j&63))}switch(f.length-d){case 1:j=k(f,e)<<16;c.push(h.charAt(j>>18)+h.charAt((j>>12)&63)+g+g);break;case 2:j=(k(f,e)<<16)|(k(f,e+1)<<8);c.push(h.charAt(j>>18)+h.charAt((j>>12)&63)+h.charAt((j>>6)&63)+g);break}return c.join("")};b.pay=function(d){var c=encodeURIComponent(a.encode(d));location.href="pay.html?goto="+c};b.decode=function(c){return a.decode(decodeURIComponent(c))};window._AP=b})();

+ 37 - 0
public/index.html

xqd
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+
+    <head>
+        <meta charset="utf-8">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge">
+        <title>
+            <%= htmlWebpackPlugin.options.title %>
+        </title>
+        <script>
+            document.addEventListener('DOMContentLoaded', function() {
+                document.documentElement.style.fontSize = document.documentElement.clientWidth / 20 + 'px'
+            })
+            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' : '') + '" />')
+            document.write('<script src="./siteinfo.js?timestamp='+new Date().getTime()+'" type="text/javascript" charset="utf-8"><\/script>');
+            document.write('<script src="./ap.js?timestamp='+new Date().getTime()+'" type="text/javascript" charset="utf-8"><\/script>');
+            document.write('<script src="./version.js?timestamp='+new Date().getTime()+'" type="text/javascript" charset="utf-8"><\/script>');
+        </script>
+        <link rel="stylesheet" href="<%= BASE_URL %>static/index.css" />
+<!--        <script type="text/javascript" src="./siteinfo.js" ></script>-->
+<!--        <script type="text/javascript" src="./version.js" ></script>-->
+<!--        <script type="text/javascript" src="<%= BASE_URL %>ap.js" ></script>-->
+        <script type="text/javascript" src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js" ></script>
+	    <script charset="utf-8" src="https://3gimg.qq.com/lightmap/components/geolocation/geolocation.min.js"></script>
+	    <script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=GB6BZ-JYG6S-4UXO7-63DDZ-SQKCF-QIFJX"></script>
+    </head>
+
+    <body>
+        <noscript>
+            <strong>Please enable JavaScript to continue.</strong>
+        </noscript>
+        <div id="app"></div>
+        <!-- built files will be auto injected -->
+    </body>
+
+</html>

File diff suppressed because it is too large
+ 102 - 0
public/pay.html


+ 50 - 0
remove.otiose.js

xqd
@@ -0,0 +1,50 @@
+'use strict';
+
+const fs = require("fs");
+
+const keywords = [
+    /.*\.scss$/i,
+    /.*\.sass$/i,
+    /.*\.less$/i,
+    /.*\.vue$/i,
+    /.*\.md$/i,
+    /.*\.txt$/i,
+    /.*\.html$/i,
+    /.*\.log$/i,
+    /.*\.gitignore$/i,
+];
+
+const dirs = [
+    'dist/dev/mp-weixin',
+    'dist/dev/mp-alipay',
+    'dist/dev/mp-baidu',
+    'dist/dev/mp-toutiao',
+    'dist/build/mp-weixin',
+    'dist/build/mp-alipay',
+    'dist/build/mp-baidu',
+    'dist/build/mp-toutiao',
+];
+
+module.exports = {
+    apply(compiler) {
+        compiler.hooks.afterEmit.tap('compilation', compilation => {
+            // 遍历所有文件
+            for (let filePathName in compilation.assets) {
+                for (let i in keywords) {
+                    const keyword = keywords[i];
+                    if (keyword.test(filePathName)) {
+                        for (let j in dirs) {
+                            const dir = dirs[j];
+                            const file = dir + '/' + filePathName;
+                            if (fs.existsSync(file)) {
+                                console.log('\n-  删除文件 ' + file);
+                                fs.unlinkSync(file);
+                            }
+                        }
+                    }
+                }
+            }
+
+        });
+    },
+};

+ 20 - 0
src/.hbuilderx/launch.json

xqd
@@ -0,0 +1,20 @@
+{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version": "0.0",
+    "configurations": [{
+     	"default" : 
+     	{
+     		"launchtype" : "remote"
+     	},
+     	"h5" : 
+     	{
+     		"launchtype" : "remote"
+     	},
+     	"mp-weixin" : 
+     	{
+     		"launchtype" : "remote"
+     	},
+     	"type" : "uniCloud"
+     }
+    ]
+}

+ 144 - 0
src/App.vue

xqd
@@ -0,0 +1,144 @@
+<script>
+    export default {
+        globalData() {
+            return {
+                stystem: {},
+                text: ''
+            }
+        },
+        onLaunch: function (options) {
+            console.log('app onLaunch--->'); // 公众号文章进小程序无底部导航调试,请勿删除
+            console.log(options);            // 公众号文章进小程序无底部导航调试,请勿删除
+            console.log('<---app onLaunch'); // 公众号文章进小程序无底部导航调试,请勿删除
+            // #ifdef H5
+            if (!this.$jwx.isWechat()) {
+               uni.getLocation({
+                   success(res) {
+			console.log("h5 获取地理位置",res);
+                   },
+                   fail(err) {
+			console.log(err);
+                   }
+               });
+            }
+            // #endif
+            if (options && options.scene) {
+                this.$appScene = options.scene;
+            }
+            this.$store.dispatch('mallConfig/actionGetConfig');
+            let _this = this;
+            wx.getSystemInfo({
+                success: function (response) {
+                    _this.$store.dispatch('gConfig/setSystemInfo', response);
+                    _this.$store.dispatch('iPhoneX/setIphone', response);
+                }
+            });
+            // #ifdef MP-WEIXIN
+            if (options.scene == '1011' || options.scene == '1012' || options.scene == '1013'
+                || options.scene == '1047' || options.scene == '1048' || options.scene == '1049') {
+                this.$store.dispatch('page/actionSetIsScanQrCode', true);
+            }
+            // #endif
+            // #ifdef MP-ALIPAY
+            if (typeof options.query != 'undefined') {
+                this.$store.dispatch('page/actionSetQeury', options.query)
+            }
+            // #endif
+            if (options.query && typeof options.query.user_id !== 'undefined') {
+                this.$store.dispatch('user/setTempParentId', options.query.user_id)
+            }
+            // #ifdef H5
+            this.$storage.setStorageSync('platform', 'wechat');
+            if (this.$jwx.isWechat()) {
+                if (!this.$storage.getStorageSync('_USER_SIGN')) {
+                    this.$storage.setStorageSync('isSign', false);
+                    this.$storage.removeStorageSync('_USER_ACCESS_TOKEN');
+                    this.$user.silentLogin();
+                } else {
+                    this.$storage.setStorageSync('_USER_SIGN', false);
+                    let params = this.$utils.getUrlParam('code');
+                    if (params) {
+                        this.$request({
+                            url: this.$api.registered.login,
+                            data: {
+                                code: params,
+                                type: 'wechat'
+                            },
+                            method: 'post'
+                        }).then(response => {
+                            if (response.code === 0) {
+                                this.$storage.setStorageSync('_USER_ACCESS_TOKEN', response.data.access_token);
+                            }
+                            let url = window.location.href;
+                            let res = url.replace(url.slice(url.indexOf('?'), url.indexOf('#')), '');
+                            let index = res.indexOf('#');
+                            let newRes = res.slice(0, index) + '?' + res.slice(index);
+                            this.$storage.setStorageSync('_USER_SIGN', true);
+                            window.location.replace(newRes);
+                            this.$storage.setStorageSync('isSign', true);
+                        });
+                    }
+                    return true;
+                }
+            } else {
+                this.$storage.setStorageSync('isSign', true);
+                if (window.location.href.indexOf('?#') === -1) {
+                    let { hash, origin, pathname } = window.location;
+                    this.$storage.setStorageSync('_USER_SIGN', true);
+                    window.location.replace(`${origin}${pathname}?${hash}`);
+                    return true;
+                }
+            }
+            if (this.$jwx.isWechat()) {
+                let hash= window.location.hash;
+                if (hash.indexOf('isWechat=true') > -1 && hash.indexOf('isPay=ture') > -1 && hash.indexOf('payType=alipay_h5') > -1) {
+                    uni.reLaunch({
+                        url: '/pages/registered/placard'
+                    });
+                }
+                this.$storage.setStorageSync('isSign', true);
+            }
+            // #endif
+
+            // #ifdef MP-WEIXIN
+            this.$user.silentLogin();
+            // #endif
+        },
+        onShow(options) {
+            console.log('app onShow--->'); // 公众号文章进小程序无底部导航调试,请勿删除
+            console.log(options);          // 公众号文章进小程序无底部导航调试,请勿删除
+            console.log('<---app onShow'); // 公众号文章进小程序无底部导航调试,请勿删除
+            if (options && options.scene) {
+                this.$appScene = options.scene;
+            }
+        }
+    };
+</script>
+
+<style lang="scss">
+    /*每个页面公共css */
+    @import "./static/css/flex.scss";
+    @import "./static/css/themeColor.scss";
+    @import "./static/css/text.scss";
+    @import "./static/css/image.scss";
+    @import "./static/css/parse.scss";
+    @import "./static/css/gift.scss";
+    @import "./static/css/u-index.scss";
+    @import "./static/css/border-box.scss";
+    @import './static/css/iconfont.css';
+    .u-goods-detail {
+        background-image: url("https://shop.9026.com/web/statics/img/mall/static/goods.png");
+        background-repeat: no-repeat;
+        background-size: 100% 100%;
+        min-height: 100vh;
+    }
+    .u-border-box {
+        box-sizing: border-box;
+    }
+    /* #ifdef H5 */
+    body.pages-index-index uni-page-body { background: transparent!important;}
+    /* #endif */
+    /* #ifdef H5 */
+    //uni-page-head { display: none}
+    /* #endif */
+</style>

+ 256 - 0
src/components/basic-component/app-button/app-button.vue

xqd
@@ -0,0 +1,256 @@
+<template>
+    <view class="app-view" :style="{
+        'width': `${width ? width : '100%'}${width ? 'rpx': ''}`,
+         'height': `${setHeight}rpx`,
+    }">
+        <button
+            v-if="type === 'important'"
+            :style="[
+                {
+                    'line-height': `${setHeight - 2}rpx`,
+                    'font-size': `${fontSize ? fontSize : 32}rpx`,
+                    'width': `${width ? width : '100%'}${width ? 'rpx': ''}`,
+                    'height': `${setHeight}rpx`,
+                    'background-color': `${background ? background : theme.background}`,
+                    'border-radius': `${roundSize ? roundSize : ''}`,
+                    color: `${color ? color : theme.main_text}`,
+                    padding: padding
+                }
+            ]"
+            @click="handleClick"
+            :class="[
+                'app-button',
+                `app-important`,
+              `${round ? 'is-round' : ''}`,
+               `${disabled ? 'app-important-disabled is-disabled' : ''}`,
+              `${arrangement === 'column' ? 'app-button-column' : arrangement === 'row' ? 'app-button-row' : ''}`
+            ]"
+        >
+            <slot></slot>
+        </button>
+        <button
+                @click="handleClick"
+                v-else-if="type === 'general'"
+                :class="[
+                `app-button`,
+                `app-general`,
+                `${disabled ? 'app-general-disabled  is-disabled' : 'app-general-disabled-not'}`,
+                `${round ? 'is-round': ''}`,
+                `${arrangement === 'column' ? 'app-button-column' : arrangement === 'row' ? 'app-button-row' : ''}`
+                ]"
+                :style="{
+                    'height': `${setHeight}rpx`,
+                    'line-height': `${setHeight - 2}rpx`,
+                    'font-size': `${fontSize ? fontSize : 32}rpx`,
+                    'width': `${width ? width : '100%'}${width ? 'rpx': ''}`,
+                    'background-color': `${background ? background : ''}`,
+                    'border-radius': `${roundSize ? roundSize : ''}`,
+                    color: color,
+                    padding: padding
+                }"
+        >
+            <slot></slot>
+        </button>
+        <button
+                @click="handleClick"
+                v-else
+              :style="{
+                'height': `${setHeight}rpx`,
+                'line-height': `${setHeight - 2}rpx`,
+                'font-size': `${fontSize ? fontSize : 32}rpx`,
+                'width': `${width ? width : '100%'}${width ? 'rpx': ''}`,
+                'background-color': `${background ? background : theme.background}`,
+                'border-radius': `${roundSize ? roundSize : ''}`,
+                'border-color': `${borderColor ? borderColor : theme.border}`,
+                'color': `${color ? color : theme.main_text}`,
+                'padding': padding
+            }"
+              :class="[
+                'app-button',
+                `app-secondary`,
+              `${round ? 'is-round' : ''}`,
+               `${disabled ? 'app-secondary-disabled is-disabled' : ''}`,
+               `${arrangement === 'column' ? 'app-button-column' : arrangement === 'row' ? 'app-button-row' : ''}`
+            ]"
+        >
+            <slot></slot>
+        </button>
+    </view>
+</template>
+
+<script>
+
+    export default {
+    props: {
+        disabled: Boolean,
+        type: String,
+        round: Boolean,
+        theme: Object,
+        height: String,
+        fontSize: String,
+        width: String,
+        color: String,
+        size: String,
+        background: String,
+        form: Boolean,
+        arrangement: String,
+        roundSize: String,
+        padding: String,
+        borderColor: String,
+    },
+    data() {
+        return {
+            touch: false
+        }
+    },
+    methods: {
+        handleClick(e) {
+            this.$emit('click', e);
+        }
+    },
+    computed: {
+        setHeight: function() {
+            if (this.height) {
+                return this.height;
+            } else {
+                switch (this.size) {
+                    case 'large':
+                        return 100;
+                    case 'small':
+                        return 60;
+                    case 'medium':
+                        return 80;
+                    default:
+                        return 80;
+                }
+            }
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+    
+    $border-radius: 40rpx;
+    $height: 80rpx;
+    $border-size: 1px;
+
+    .app-view {
+        position: relative;
+        /*width:100%;*/
+        .app-button {
+            height: $height;
+            text-align: center;
+            line-height: $height;
+        }
+        .is-round {
+            border-radius: $border-radius;
+        }
+        .is-disabled {
+            /*background-color: #cdcdcd;*/
+            pointer-events: none;
+        }
+        .app-general {
+            background-color: #ffffff;
+            border: $border-size solid #cdcdcd;
+        }
+        .app-general-disabled {
+            color: #cdcdcd;
+        }
+        .app-general-disabled-not {
+            color: #353535;
+        }
+        .app-mask {
+            background-color: rgba(0, 0, 0, .2);
+            width: 100%;
+            height: $height;
+            position: absolute;
+            top:0;
+            left: 0;
+        }
+        .app-important {
+            color: #ffffff;
+        }
+        .app-important-disabled {
+            background-color: #cdcdcd;
+        }
+        .app-secondary {
+            border-width: $border-size;
+            border-style: solid;
+        }
+        .app-secondary-disabled {
+            background-color: #ffffff;
+            border-color: #cdcdcd;
+            color: #cdcdcd;
+        }
+    }
+    .app-button:active {
+        box-shadow: inset 0 0 #{1000rpx} rgba(0, 0, 0, .15);
+    }
+</style>
+
+<style scoped lang="scss">
+    /* #ifdef MP-WEIXIN */
+    button {
+        border: none;
+        padding: 0 #{24rpx};
+    }
+    button:after {
+        border: none;
+        border-radius: 0;
+    }
+    
+    /* #endif */
+    
+    /* #ifdef MP-TOUTIAO */
+    div {
+        display: block !important;
+    }
+    button {
+        border-radius: 0;
+        padding: 0;
+        height: 100%;
+        //border-color:inherit;
+    }
+    button:after {
+        border: none;
+        border-radius: 0;
+    }
+    /* #endif */
+    
+    /* #ifdef MP-ALIPAY */
+    button {
+        border: none;
+    //background-color: transparent;
+        border-radius: 0;
+    }
+    /* #endif */
+    
+    /* #ifdef MP-BAIDU*/
+    button {
+        padding: 0;
+    }
+    button:after {
+        border-radius: 0;
+        border: none;
+    }
+    /* #endif */
+
+    .app-button-column {
+	    height: 100%;
+	    width: 100%;
+	    display: flex;
+	    flex-direction: column;
+	    justify-content: center;
+	    align-items: center;
+    }
+
+    .app-button-row {
+	    height: 100%;
+	    width: 100%;
+	    display: flex;
+	    flex-direction: row;
+	    justify-content: center;
+	    align-items: center;
+    }
+</style>

+ 73 - 0
src/components/basic-component/app-cart-image/app-cart-image.vue

xqd
@@ -0,0 +1,73 @@
+<template>
+    <view class="bd-image" :style="cartStyle" :class="cartClass"></view>
+</template>
+
+<script>
+    import {mapGetters} from "vuex";
+
+    export default {
+        name: "app-cart-image",
+
+        data() {
+            return {
+                is_loading: false,
+				disable: 'disable'
+            }
+        },
+
+        props: {
+            imageWidth: {
+                type: String,
+                default: '36rpx'
+            },
+            imageHeight: {
+                type: String,
+                default: '36rpx'
+            },
+            src: {
+                type: String,
+                default: 'https://shop.9026.com/web/statics/image/mall/static/icon/goods-cart.png'
+            },
+            sign: String,
+            theme: String,
+			goods: {
+				type: Object|null,
+				default: null,
+			}
+        },
+
+        computed: {
+            ...mapGetters('mallConfig', {
+                getTheme: 'getTheme',
+            }),
+            cartStyle() {
+                let style = `width: ${this.imageWidth};height: ${this.imageHeight};`;
+                if((!this.goods || this.goods.buy_goods_auth) && this.sign !== 'gift') {
+                    style += `background-color : ${this.getTheme.background}`
+                }
+                return style;
+            },
+			cartClass() {
+				if (!this.goods || this.goods.buy_goods_auth) {
+					return this.sign !== 'gift' ? '' : this.theme + '-background';
+				} else {
+					return this.disable + '-m-back ' + this.disable;
+				}
+			}
+        },
+        methods: {
+            imgLoad() {
+                this.is_loading = true;
+            }
+        }
+
+    }
+</script>
+
+<style scoped>
+.bd-image {
+    background-repeat: no-repeat;
+    background-size: 101% 101%;
+    background-image:url("https://shop.9026.com/web/statics/image/mall/static/icon/goods-cart.png");
+}
+</style>

+ 128 - 0
src/components/basic-component/app-check-box/app-check-box.vue

xqd
@@ -0,0 +1,128 @@
+<template>
+    <view>
+        <view class="app-view" v-if="type === 'all'" @click="selectAll">
+            <view class="app-item"
+                  :style="{'width': `${size ? size : 32}rpx`}"
+                  :class="[
+                {'app-radius': shape === 'round'}
+            ]"
+            ></view>
+            <view class="app-mask"
+                  v-show="value.boolean"
+                  :style="{'width': `${size ? size : 32}rpx`}"
+                  :class="[
+                {'app-radius': shape === 'round'},
+                `${theme}-background`
+                ]"
+            ></view>
+        </view>
+        <view class="app-view" @click="handleCheckBox" v-if="type !== 'all'">
+            <view class="app-item"
+                  :style="{'width': `${size ? size : 32}rpx`}"
+                  :class="[
+                {'app-radius': shape === 'round'}
+            ]"
+            ></view>
+            <view class="app-mask"
+                  v-show="value.boolean"
+                  :style="{'width': `${size ? size : 32}rpx`}"
+                  :class="[
+                {'app-radius': shape === 'round'},
+                `${theme}-background`
+                ]"
+            ></view>
+        </view>
+    </view>
+</template>
+
+<script>
+    export default {
+        name: 'app-check-box',
+        props: {
+            selectData: Array,
+            shape: String,
+            theme: String,
+            size: String,
+            type: String,
+            item: Object,
+            value: {
+                default: {
+                    type: 'all',
+                    boolean: false
+                },
+            },
+            isShow: Boolean,
+        },
+        data() {
+            return {
+                showHidden: this.value,
+                allBoolean: this.value,
+            }
+        },
+       methods: {
+           handleCheckBox() {
+               this.showHidden = !this.showHidden;
+               this.$emit('input', this.showHidden);
+           },
+           selectAll() {
+               this.allBoolean = !this.allBoolean;
+               this.$emit('input', this.allBoolean);
+               
+           }
+       },
+        watch: {
+            selectData: {
+                handler: function() {
+                    // let num = 0;
+                    // let add = this.selectData.length;
+                    // for (let i = 0; i < this.selectData.length; i++) {
+                    //     if (this.selectData[i].boolean === true) {
+                    //         num++;
+                    //     } else {
+                    //         add--;
+                    //     }
+                    // }
+                    // if (add < this.selectData.length) {
+                    //     this.allBoolean = false;
+                    //     this.$emit('input', this.allBoolean);
+                    // }
+                    // if (num === this.selectData.length) {
+                    //     this.allBoolean = true;
+                    //     this.$emit('input', this.allBoolean);
+                    // }
+                },
+                deep: true,
+                immediate: true,
+            },
+            isShow: {
+                handler: function(response) {
+                    // for (let i = 0;i < this.selectData.length; i++) {
+                    //     this.selectData[i].boolean = response;
+                    // }
+                }
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+
+    .app-view {
+        position: relative;
+    }
+    .app-item {
+        width: #{32rpx};
+        height: #{32rpx};
+        border: #{1rpx} solid $uni-general-color-three;
+    }
+    .app-radius {
+        border-radius: 50%;
+    }
+    .app-mask {
+        width: #{32rpx};
+        height: #{32rpx};
+        position: absolute;
+        top: 0;
+        left: 0;
+    }
+</style>

+ 178 - 0
src/components/basic-component/app-city-swiper/app-city-swiper.vue

xqd
@@ -0,0 +1,178 @@
+<template>
+	<view class="app-picker">
+		<view class="app-mask" :class="{'show': showPicker}" v-if="showPicker" @tap="maskTap" @touchmove.stop.prevent catchtouchmove="true"></view>
+		<view class="app-picker-cnt" :class="{'show':showPicker}">
+			<view class="app-picker-hd" @touchmove.stop.prevent catchtouchmove="true">
+				<view class="app-picker-btn" @tap="pickerCancel">取消</view>
+				<view class="app-picker-btn" :style="{'color':themeColor}" @tap="pickerConfirm">确定</view>
+			</view>
+			<view class="app-picker-view" v-if="mode=='region'">
+				<picker-view :indicator-style="itemHeight" :value="pickVal" @change="bindChange">
+					<picker-view-column>
+						<view class="app-picker-item"  v-for="(item,index) in selectData" :key="index">{{item.name}}</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="app-picker-item" v-if="provinceId === item.parent_id_id" v-for="(item,index) in selectData[provinceId].list" :key="index">{{item.name}}</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="app-picker-item" v-if="cityId === item.parent_id_id" v-for="(item,index) in selectData[provinceId].list[cityId].list" :key="index">{{item.name}}</view>
+					</picker-view-column>
+				</picker-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+    export default {
+        name: "app-city",
+	    data() {
+            return {
+                showPicker: false,
+                pickVal: [0,0,0],
+                itemHeight:`height: ${uni.upx2px(88)}px;`,
+                checkArr:[],
+                provinceId: 0,
+	            cityId: 0,
+            }
+	    },
+	    props: {
+            themeColor:{
+                type:String,
+                default(){
+                    return "#f00"
+                }
+            },
+            mode: {
+                type:String,
+                default(){
+                    return "region"
+                }
+            },
+            cityData: {
+                type: Object,
+			    default() {
+                    return {}
+			    }
+		    }
+	    },
+	    methods: {
+            maskTap(){
+                this.showPicker = false;
+            },
+            bindChange(val) {
+                let arr = val.detail.value;
+                this.provinceId = arr[0];
+                this.cityId = arr[1];
+                this.$nextTick().then(() => {
+                    this.pickVal = arr;
+                });
+            },
+            pickerCancel() {
+                this.showPicker = false;
+            },
+            pickerConfirm() {
+                // 返回结果
+                this.showPicker = false;
+            },
+		    initData(list) {
+                for (let i = 0; i < list.length; i++) {
+                    list[i].id_id = i;
+                    for (let j = 0; j < list[i].list.length; j++) {
+                        list[i].list[j].parent_id_id = i;
+                        list[i].list[j].id_id = j;
+                        for (let p = 0; p < list[i].list[j].list.length; p++) {
+                            list[i].list[j].list[p].parent_id_id = j;
+                            list[i].list[j].list[p].id_id = p;
+                        }
+                    }
+                }
+                return list;
+		    }
+	    },
+	    computed: {
+            selectData: function() {
+                return this.initData(this.cityData);
+            }
+	    }
+    }
+</script>
+
+<style scoped lang="scss">
+	.app-picker {
+		position: relative;
+		z-index: 1888;
+		height:100%;
+		.app-mask {
+			position: fixed;
+			z-index: 1000;
+			top: 0;
+			right: 0;
+			left: 0;
+			bottom: 0;
+			background: rgba(0, 0, 0, 0.5);
+			transition: all 0.3s ease;
+			.app-mask.show{
+				visibility: visible;
+				opacity: 1;
+			}
+		}
+		.app-picker-cnt {
+			position: fixed;
+			bottom: 0;
+			left: 0;
+			width: 100%;
+			transition: all 0.3s ease;
+			transform: translateY(100%);
+			z-index: 1600;
+		}
+		.app-picker-cnt.show {
+			transform: translateY(0);
+		}
+		.app-picker-hd {
+			display: flex;
+			align-items: center;
+			padding: 0 #{30rpx};
+			height: #{88rpx};
+			background-color: #fff;
+			position: relative;
+			text-align: center;
+			font-size: #{32rpx};
+			justify-content: space-between;
+			.app-picker-btn{
+				font-size: #{30rpx};
+			}
+		}
+		.app-picker-hd:after {
+			content: ' ';
+			position: absolute;
+			left: 0;
+			bottom: 0;
+			right: 0;
+			height: 1px;
+			border-bottom: 1px solid #e5e5e5;
+			color: #e5e5e5;
+			transform-origin: 0 100%;
+			transform: scaleY(0.5);
+		}
+		.app-picker-view {
+			width: 100%;
+			height: #{476rpx};
+			overflow: hidden;
+			background-color: rgba(255, 255, 255, 1);
+			z-index: 666;
+		}
+		.app-picker-item {
+			text-align: center;
+			width: 100%;
+			height: #{88rpx};
+			line-height: #{88rpx};
+			text-overflow: ellipsis;
+			white-space: nowrap;
+			font-size: #{30rpx};
+		}
+		picker-view{
+			height: 100%;
+		}
+	}
+</style>

+ 201 - 0
src/components/basic-component/app-close/app-close.vue

xqd
@@ -0,0 +1,201 @@
+<template>
+    <view>
+        <u-mask v-if="modal" :show="mallStatus.is_open == 2" zIndex="3000" :maskClickAble="false" :zoom="false">
+            <view style="height: 100%;width: 100%" class="main-center cross-center">
+                <view class="open-dialog">
+                    <view class="open-dialog-title">商家已打烊</view>
+                    <view class="open-dialog-content">
+                        <view v-if="list.length > 0 && list != '商城'">{{list}}已经打烊</view>
+                        <view v-if="!list">您访问的商家已经打烊</view>
+                        <view v-if="mallStatus.auto_open_text.length > 0">{{mallStatus.auto_open_text}}</view>
+                    </view>
+                    <view @click="toIndex" class="dialog-button" :style="{'color':getTheme.color}">继续浏览</view>
+                </view>
+            </view>
+        </u-mask>
+        <view v-else>
+            <view class="dir-left-nowrap cross-center close-tip" v-if="mallStatus.is_open == 2">
+                <image src="https://shop.9026.com/web/statics/image/mall/static/icon/be-close.png"></image>
+                <view class="dir-top-nowrap main-center">
+                    <view>商家已打烊</view>
+                    <view class="close-content" v-if="mallStatus.auto_open_text.length > 0">{{mallStatus.auto_open_text}}</view>
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+
+	import {mapState, mapGetters} from 'vuex';
+    import uMask from "../u-mask/u-mask.vue";
+	
+    export default {
+        name: "app-close",
+        components:{
+            uMask
+        },
+	    props: {
+            modal: {
+                type: Boolean,
+                default() {
+                    return true;
+                }
+            },
+            toBack: {
+                type: Boolean,
+                default() {
+                    return false;
+                }
+            },
+            mch_id: {
+                type: [Number, String],
+                default() {
+                    return 0;
+                }
+            },
+            mch_list: {
+                type: String,
+                default() {
+                    return ''
+                }
+            }
+	    },
+        data() {
+            return {
+                mallStatus: {
+                    is_open: 0,
+                    auto_open_text: ''
+                },
+                isMall: true,
+                list: ''
+            }
+        },
+        created() {
+            let para = {};
+            let mch_list = ''
+            if(this.mch_list) {
+                mch_list = this.mch_list;
+                if(mch_list.length > 0) {
+                    para.mch_id_list = mch_list;
+                    if(mch_list.indexOf(0) == -1) {
+                        this.isMall = false;
+                    }
+                }
+            }
+            if(this.mch_id > 0) {
+                para.mch_id_list = JSON.stringify([this.mch_id]);
+                this.isMall = false;
+            }
+            this.$request({
+                url: this.$api.index.status,
+                data: para
+            }).then(response => {
+                console.log(para)
+                let mallStatus = response.data;
+                if(!this.isMall) {
+                    response.data.shift();
+                }
+                this.mallStatus = response.data[0]
+                if(this.mch_id > 0) {
+                    for(let item of response.data) {
+                        if(item.mch_id == this.mch_id) {
+                            this.mallStatus = item
+                        }
+                    }
+                }
+                if(mch_list.length > 0) {
+                    this.list = '';
+                    for(let item of response.data) {
+                        if(item.is_open == 2) {
+                            if(!this.mallStatus.auto_open_text) {
+                                this.mallStatus.auto_open_text = item.auto_open_text;
+                            }
+                            this.mallStatus.is_open = item.is_open;
+                            if(this.list.length > 0) {
+                                this.list += '、'
+                            }
+                            this.list += item.name
+                        }
+                    }
+                    this.$emit('update', this.mallStatus)
+                }else {
+                    this.$emit('update', this.mallStatus)
+                }
+            })
+        },
+	    computed: {
+            ...mapGetters('mallConfig', {
+                getTheme: 'getTheme',
+            }),
+            ...mapState({
+                mall: state => state.mallConfig.mall,
+                userInfo: state => state.user.info,
+            })
+	    },
+        methods: {
+            toIndex() {
+                if(this.toBack) {
+                    uni.navigateBack();
+                }else {
+                    uni.redirectTo({
+                        url: '/pages/index/index'
+                    })
+                }
+            },
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .close-tip {
+        position: fixed;
+        bottom: 0;
+        left: 0;
+        height: 130rpx;
+        width: 100%;
+        z-index: 20;
+        font-size: 30rpx;
+        color: #353535;
+        background-color: #fff7d7;
+        image {
+            width: 70rpx;
+            height: 70rpx;
+            margin: 0 24rpx;
+        }
+        .close-content {
+            padding-top: 10rpx;
+            font-size: 24rpx;
+            color: #999999;
+        }
+    }
+    .open-dialog {
+        width: 620rpx;
+        border-radius: 16rpx;
+        background-color: #fff;
+        position: relative;
+        padding-top: 40rpx;
+        padding-bottom: 105rpx;
+        font-size: 32rpx;
+        color: #353535;
+        text-align: center;
+        .open-dialog-content {
+            padding: 25rpx 0;
+            font-size: 26rpx;
+            color: #666666;
+            view {
+                margin: 5rpx 0;
+            }
+        }
+        .dialog-button {
+            font-size: 30rpx;
+            position: absolute;
+            bottom: 0;
+            left: 0;
+            border-top: 2rpx solid #e2e2e2;
+            height: 90rpx;
+            line-height: 90rpx;
+            width: 100%;
+        }
+    }
+</style>

+ 210 - 0
src/components/basic-component/app-composition/app-composition.vue

xqd
@@ -0,0 +1,210 @@
+<template>
+    <view class="app-composition dir-left-nowrap">
+        <view @click.stop="open">
+            <view class="app-composition-goods" :class="item.goods_list.length == 2 ? 'two' : item.goods_list.length == 3 ? 'three' : item.goods_list.length == 4 ? 'four': 'five'" v-if="item.type == 1">
+                <image mode="aspectFill" :src="goods.cover_pic" v-for="goods in item.goods_list" :key="goods.id"></image>
+            </view>
+            <view class="app-composition-goods" :class="item.goods_list.length == 1 ? 'two' : item.goods_list.length == 2 ? 'three' : item.goods_list.length == 3 ? 'four': 'five'" v-if="item.type == 2">
+                <image mode="aspectFill" :src="goods.cover_pic" v-for="goods in item.host_list" :key="goods.id"></image>
+                <image mode="aspectFill" :src="goods.cover_pic" v-for="goods in item.goods_list" :key="goods.id"></image>
+            </view>
+            <slot></slot>
+        </view>
+        <view @click.stop="toDetail" class="app-composition-right">
+            <view class="dir-left-nowrap cross-center app-composition-info">
+                <view class="app-composition-type" v-if="item.type == 1 && !large" :style="{'color':theme.color}">固定</view>
+                <view class="app-composition-type" v-if="item.type == 2 && !large" :style="{'color':theme.color}">搭配</view>
+                <view class="app-composition-name t-omit" :class="large ? 'long-name' :  ''">{{item.name}}</view>
+            </view>
+            <view class="app-composition-type" v-if="item.type == 1 && large" :style="{'color':theme.color}">固定套餐</view>
+            <view class="app-composition-type" v-if="item.type == 2 && large" :style="{'color':theme.color}">搭配套餐</view>
+            <view class="app-composition-price">
+                套餐价<text :style="{'color':theme.color}">¥{{item.min_composition_price}}</text>
+            </view>
+            <view class="app-composition-discount">
+                最多可省<text>¥{{item.max_discount}}</text>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+
+	import {mapState} from 'vuex';
+	
+    export default {
+        name: "app-composition",
+	    props: {
+            item: {
+                type: Object
+            },
+            large: Boolean,
+            theme: Object
+	    },
+        data() {
+            return {
+            }
+        },
+        created() {
+            let that = this;
+        },
+        methods: {
+            open(e) {
+                this.$emit('click', e);
+            },
+            toDetail(e) {
+                this.$emit('look', e);
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .app-composition {
+        .app-composition-goods {
+            width: #{288rpx};
+            height: #{140rpx};
+            flex-shrink: 0;
+            margin-right: #{24rpx};
+            position: relative;
+            &.two {
+                image {
+                    position: absolute;
+                    width: #{140rpx};
+                    height: #{140rpx};
+                    border-radius: #{8rpx};
+                    top: 0;
+                }
+                image:first-of-type {
+                    left: 0;
+                }
+                image:last-of-type {
+                    right: 0;
+                }
+            }
+            &.three {
+                image {
+                    position: absolute;
+                    width: #{140rpx};
+                    height: #{66rpx};
+                    border-radius: #{8rpx};
+                }
+                image:first-of-type {
+                    left: 0;
+                    top: 0;
+                    height: #{140rpx};
+                    width: #{140rpx};
+                }
+                image:nth-child(2) {
+                    top: 0;
+                    right: 0;
+                }
+                image:last-of-type {
+                    bottom: 0;
+                    right: 0;
+                }
+            }
+            &.four {
+                image {
+                    position: absolute;
+                    width: #{66rpx};
+                    height: #{66rpx};
+                    border-radius: #{8rpx};
+                }
+                image:first-of-type {
+                    left: 0;
+                    top: 0;
+                    height: #{140rpx};
+                    width: #{140rpx};
+                }
+                image:nth-child(2) {
+                    top: 0;
+                    right: 0;
+                    width: #{140rpx};
+                }
+                image:nth-child(3) {
+                    right: #{74rpx};
+                    bottom: 0;
+                }
+                image:last-of-type {
+                    right: 0;
+                    bottom: 0;
+                }
+            }
+            &.five {
+                image {
+                    position: absolute;
+                    width: #{66rpx};
+                    height: #{66rpx};
+                    border-radius: #{8rpx};
+                }
+                image:first-of-type {
+                    left: 0;
+                    top: 0;
+                    height: #{140rpx};
+                    width: #{140rpx};
+                }
+                image:nth-child(2) {
+                    top: 0;
+                    right: #{74rpx};
+                }
+                image:nth-child(3) {
+                    right: 0;
+                    top: 0;
+                }
+                image:nth-child(4) {
+                    right: #{74rpx};
+                    bottom: 0;
+                }
+                image:last-of-type {
+                    right: 0;
+                    bottom: 0;
+                }
+            }
+        }
+        .app-composition-right {
+            width: #{342rpx};
+        }
+        .app-composition-info {
+            height: #{44rpx};
+            width: #{342rpx};
+            .app-composition-type {
+                font-size: #{22rpx};
+                display: block;
+                margin: 0 #{16rpx} 0 0;
+            }
+            .app-composition-name {
+                height: #{44rpx};
+                line-height: #{44rpx};
+                width: #{260rpx};
+                font-size: #{28rpx};
+                color: #353535;
+                &.long-name {
+                    width: #{342rpx};
+                }
+            }
+        }
+        .app-composition-type {
+            padding: #{2rpx 12rpx};
+            flex-shrink: 0;
+            border: #{2rpx} solid;
+            border-radius: #{20rpx};
+            margin: #{14rpx} 0 0;
+            font-size: #{22rpx};
+            display: inline-block;
+        }
+        .app-composition-price {
+            color: #999999;
+            font-size: #{24rpx};
+            margin: #{14rpx} 0 #{10rpx};
+            text {
+                font-size: #{28rpx};
+            }
+        }
+        .app-composition-discount {
+            color: #999999;
+            font-size: #{24rpx};
+
+        }
+    }
+</style>

+ 115 - 0
src/components/basic-component/app-css-icon/app-css-icon.vue

xqd
@@ -0,0 +1,115 @@
+<template>
+    <view class="app-css-icon"
+          :class="[icon,round?'round':'',padding?'padding':'']"
+          :style="{
+          borderColor: color,
+          fontSize: iSize,
+          transform: transform,
+          backgroundColor: background,
+          }"></view>
+</template>
+
+<script>
+    export default {
+        name: "app-css-icon",
+        props: {
+            icon: {
+                default: 'point',
+                type: String,
+            },
+            size: {
+                default: 50,
+            },
+            color: {
+                default: '#333',
+                type: String,
+            },
+            transform: {
+                default: '',
+            },
+            background: {
+                default: 'transparent',
+                type: String,
+            },
+            round: {
+                default: false,
+                type: Boolean,
+            },
+            padding: {
+                default: false,
+                type: Boolean,
+            },
+        },
+        computed: {
+            iSize() {
+                if (isNaN(this.size)) {
+                    return `${this.size}`;
+                } else {
+                    return `${this.size}rpx`;
+                }
+            },
+        },
+    }
+</script>
+
+<style scoped lang="scss">
+    .app-css-icon {
+        display: inline-block;
+        height: 1em;
+        width: 1em;
+        box-sizing: border-box;
+        text-indent: -#{100em};
+        vertical-align: middle;
+        position: relative;
+        overflow: hidden;
+        transform: translate(0, -10%);
+    }
+
+    .app-css-icon.round {
+        border-radius: 10em;
+    }
+
+    .app-css-icon::before,
+    .app-css-icon::after {
+        content: '';
+        box-sizing: inherit;
+        position: absolute;
+        left: 50%;
+        top: 50%;
+        -ms-transform: translate(-50%, -50%);
+        transform: translate(-50%, -50%);
+        border-color: inherit;
+    }
+
+    .check::before {
+        border-style: solid;
+        border-width: 0 0 .15em .15em;
+        height: .5em;
+        width: .9em;
+        transform: translate(-50%, -.375em) rotate(-45deg);
+    }
+
+    .padding.check::before {
+        border-width: 0 0 .1em .1em;
+        height: .333em;
+        width: .6em;
+        transform: translate(-50%, -.25em) rotate(-45deg);
+    }
+
+
+    .arrow-right::before {
+        height: .65em;
+        width: .65em;
+        border-style: solid;
+        border-width: .15em 0 0 .15em;
+        transform: translate(-75%, -50%) rotate(135deg);
+    }
+
+    .padding.arrow-right::before {
+        height: .4333em;
+        width: .4333em;
+        border-style: solid;
+        border-width: .1em 0 0 .1em;
+        transform: translate(-75%, -50%) rotate(135deg);
+    }
+</style>

+ 167 - 0
src/components/basic-component/app-datetime-picker/app-datetime-picker.vue

xqd
@@ -0,0 +1,167 @@
+<template>
+    <view class="app-datetime-picker" @click="handleClick">
+        <!-- #ifndef MP-ALIPAY -->
+        <picker :mode="mode"
+                :value="timeValue"
+                :start="start"
+                :end="end"
+                :fields="fields"
+                @change="handleChange"
+                @cancel="handleCancel">
+            <view class="dir-left-nowrap cross-center" :style="{
+                'background': `${background}`,
+                'border': showBorder? `1rpx solid ${borderColor}` : 'none',
+                'height': `${height}rpx`,
+                'border-radius': `${radius}rpx`,
+                'color': `${textColor}`,
+            }">
+                <view class="box-grow-1" :class="[`text-align-${textPosition}`]">
+                    <!-- #ifdef MP-TOUTIAO -->
+                    <slot></slot>
+                    <!-- #endif -->
+                    <!-- #ifndef MP-TOUTIAO -->
+                    {{text}}
+                    <!-- #endif -->
+                </view>
+                <view class="box-grow-0" v-if="showArrow" :style="{'padding': padding}">
+                    <image class="arrow" src="https://shop.9026.com/web/statics/image/mall/static/icon/arrow-right.png"
+                           style="width: 12rpx;height: 22rpx;"></image>
+                </view>
+            </view>
+        </picker>
+        <!-- #endif -->
+        <!-- #ifdef MP-ALIPAY -->
+        <view class="dir-left-nowrap cross-center" :style="{
+            'background': `${background}`,
+            'border': showBorder? `1rpx solid ${borderColor}` : 'none',
+            'height': `${height}rpx`,
+            'border-radius': `${radius}rpx`,
+            'color': `${textColor}`,
+        }">
+            <view class="box-grow-1" :class="[`text-align-${textPosition}`]">
+                <!-- #ifdef MP-TOUTIAO -->
+                <slot></slot>
+                <!-- #endif -->
+                <!-- #ifndef MP-TOUTIAO -->
+                {{text}}
+                <!-- #endif -->
+            </view>
+            <view class="box-grow-0" v-if="showArrow" :style="{'padding': padding}">
+                <image class="arrow" src="https://shop.9026.com/web/statics/image/mall/static/icon/arrow-right.png"
+                       style="width: 12rpx;height: 22rpx;"></image>
+            </view>
+        </view>
+        <!-- #endif -->
+    </view>
+</template>
+
+<script>
+    export default {
+        name: 'app-datetime-picker',
+        props: {
+            padding: {
+                type: String,
+                default: '0 24rpx'
+            },
+            value: {
+                type: String,
+                default: '0',
+            },
+            text: null,
+            mode: {
+                type: String,
+                default: 'date',
+            },
+            start: {
+                type: String,
+                default: '',
+            },
+            end: {
+                type: String,
+                default: '',
+            },
+            fields: {
+                type: String,
+                default: 'day',
+            },
+            disabled: false,
+            showArrow: {
+                type: Boolean,
+                default: true,
+            },
+            sign: {
+                default: null,
+            },
+            background: {
+                default: 'transparent',
+            },
+            showBorder: {
+                default: false,
+            },
+            borderColor: {
+                default: 'transparent',
+            },
+            height: {
+                default: 80,
+            },
+            radius: {
+                default: 0,
+            },
+            textColor: {
+                default: '#666666',
+            },
+            textPosition: {
+                default: 'right',
+            },
+            defaultValue: {
+                type: String,
+                default: '',
+            }
+        },
+        data() {
+            return {
+                timeValue: 0
+            }
+        },
+        created() {
+            this.timeValue = this.value != 0 ? this.value : this.defaultValue
+        },
+        methods: {
+            handleChange(e) {
+                this.timeValue = e.detail.value
+                this.$emit('input', e.detail.value, this.sign);
+                this.$emit('change', e, this.sign);
+            },
+            handleCancel(e) {
+                this.$emit('cancel', e.detail.value, this.sign);
+            },
+            handleClick(e) {
+                // #ifdef MP-ALIPAY
+                my.datePicker({
+                    format: this.mode === 'date' ? 'yyyy-MM-dd' : 'HH:mm',
+                    currentDate: this.timeValue,
+                    startDate: this.start,
+                    endDate: this.end,
+                    success: (e) => {
+                        this.handleChange({
+                            detail: {
+                                value: e.date,
+                            },
+                        });
+                    },
+                    fail: this.handleCancel,
+                });
+                // #endif
+            },
+        },
+    }
+</script>
+<style lang="scss" scoped>
+    .text-align-left {
+        text-align: left;
+    }
+
+    .text-align-right {
+        text-align: right;
+    }
+</style>

+ 42 - 0
src/components/basic-component/app-empty-bottom/app-empty-bottom.vue

xqd
@@ -0,0 +1,42 @@
+<template>
+	<view class="empty-bottom" :style="{backgroundColor: backgroundColor,height: `${botBool ?  BotHeight + height : height + emptyHeight}rpx`,}"></view>
+</template>
+
+<script>
+	import {mapGetters} from 'vuex';
+    export default {
+        name: "app-empty-bottom",
+	    props: {
+            backgroundColor: {
+                type: String,
+	            default() {
+                    return 'white';
+	            }
+            },
+            height: {
+                type: Number,
+	            default() {
+                    return 0;
+                }
+            },
+		    botBool: {
+                type: Boolean,
+			    default() {
+                    return false;
+			    }
+		    }
+	    },
+	    computed: {
+            ...mapGetters('iPhoneX', {
+                BotHeight: 'getBotHeight',
+	            emptyHeight: 'getEmpty',
+            })
+	    }
+    }
+</script>
+
+<style scoped lang="scss">
+	.empty-bottom {
+		width: 100%;
+	}
+</style>

+ 30 - 0
src/components/basic-component/app-empty/app-empty.vue

xqd
@@ -0,0 +1,30 @@
+<template>
+    <view class="app-empty" :style="{height: height + 'rpx',backgroundColor: backgroundColor}"></view>
+</template>
+
+<script>
+    export default {
+        name: "app-empty",
+        props: {
+            height: {
+                type: Number,
+                default() {
+                    return 10;
+                }
+            },
+            backgroundColor: {
+                type: String,
+                default() {
+                    return `#ffffff`;
+                }
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .app-empty {
+        width: 100%;
+        display: block;
+    }
+</style>

+ 67 - 0
src/components/basic-component/app-form-id/app-form-id.vue

xqd
@@ -0,0 +1,67 @@
+<template>
+    <view class="app-form-id">
+        <form report-submit @submit="formSubmit">
+            <button formType="submit" :style="{'color': color ? color : ''}" hover-class="none">
+                <slot></slot>
+            </button>
+        </form>
+    </view>
+</template>
+
+<script>
+    import { push } from '../../../core/formId.js';
+
+    export default {
+        name: 'app-form-id',
+        props: {
+            color: String,
+            item: Object,
+        },
+        methods: {
+            formSubmit(e) {
+                push(e.detail.formId);
+                this.$emit('click', e, this.item);
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    form {
+        display: block;
+        height: 100%;
+        width: 100%;
+    }
+    button {
+        height: 100%;
+        width: 100%;
+    }
+    button {
+        display: block;
+        line-height: inherit;
+        text-align: inherit;
+        padding: 0 0;
+        background: transparent;
+        border: none;
+        border-radius: 0;
+        overflow: inherit;
+        font-size: inherit;
+        color: inherit;
+    }
+    button:after {
+        display: none;
+    }
+    button.button-hover {
+        color: inherit;
+        background-color: transparent;
+    }
+
+    .app-form-id {
+        /* #ifndef MP-ALIPAY */
+        height: 100%;
+        /* #endif */
+        /* #ifdef MP-ALIPAY */
+        max-height: 100%;
+        /* #endif */
+    }
+</style>

+ 1140 - 0
src/components/basic-component/app-goods/app-goods.vue

xqd
@@ -0,0 +1,1140 @@
+<template>
+	<view :style="marginStyle" ref="goods" v-if="goods">
+		<view class="app-goods" :class="appGoodsClass" :style="appGoodsStyle">
+			<slot name="extra"></slot>
+			<!-- 商品角标 -->
+			<image @click="toDetail" v-if="showGoodsTag" :src="goodsTagPicUrl" :style="{'border-top-left-radius': c_border_top + 'rpx'}" class="goods-tag"></image>
+			<!-- 套餐组合商品图 -->
+			<view @click="toDetail" v-if="goods.composition_id > 0"
+				 :style="compositionStyle">
+				<app-diy-composition-image
+					:mode="fill === 1 ? 'aspectFill' : 'aspectFit'"
+					:image-list="goods.cover_pic_list"></app-diy-composition-image>
+			</view>
+			<!-- 商品图 -->
+			<view @click="toDetail" v-else>
+				<app-image :borderRadius="coverRadius" :img-src="goods.cover_pic" :width="listStyle == -1 ? coverHeight : '100%'" :height="coverHeight" :mode="fill === 1 ? 'aspectFill' : 'aspectFit'"></app-image>
+			</view>
+			<view @click="toDetail" :style="coverStyle" class="out-dialog goods-cover" v-if="(goods.goods_num == 0 || goods.goods_stock == 0) && appSetting.is_show_stock == '1'">
+				<image :style="coverStyle" :src="appSetting.is_use_stock == '1' ? appImg.plugins_out : appSetting.sell_out_pic"></image>
+			</view>
+			<!-- 一行一个活动倒计时 -->
+			<view @click="toDetail" class="activity-info" :style="{'background-color': themeColor.background}" v-if="(sec > 0 || min > 0 || hour > 0) && listStyle == 1">
+				<image :src="activityImage"></image>
+				<view class="countdown dir-right-nowrap cross-center">
+					<view class="timing">{{sec}}</view>
+					<view>:</view>
+					<view class="timing">{{min}}</view>
+					<view>:</view>
+					<view class="timing">{{hour}}</view>
+					<view class="title">距结束</view>
+				</view>
+			</view>
+			<!-- 活动倒计时 -->
+			<view @click="toDetail" class="countdown-info main-between cross-center" :class="listStyle == 2 ? 'big':'small'" v-if="(sec > 0 || min > 0 || hour > 0) && listStyle != 1 && listStyle != -1">
+				<view>距结束</view>
+				<view class="countdown dir-right-nowrap cross-center">
+					<view class="timing">{{sec}}</view>
+					<view>:</view>
+					<view class="timing">{{min}}</view>
+					<view>:</view>
+					<view class="timing">{{hour}}</view>
+				</view>
+			</view>
+			<!-- 活动结束图 -->
+			<image class="end-info" v-if="endImage && listStyle != -1" :style="{'height': endHeight + 'rpx'}" :src="endImage"></image>
+			<!-- 商品 -->
+			<view @click="toDetail" class="goods-info dir-top-nowrap main-between box-grow-1" :class="[textStyle == 2 ? 'main-center' :'',showTag && pluginTag ? '' : 'no-tag']" v-if="showGoodsName || isUnderLinePrice || showGoodsPrice">
+				<view class="goods-top">
+					<view v-if="showGoodsName" class="goods-name t-omit-two" :style="{textAlign: textStyle == 2 ? 'center' : 'left'}">
+						<text v-if="showTag && pluginTag" :style="{'background-color': themeColor.background}" class="tag">{{pluginTag}}</text>
+						<text>{{goods.name || goods.goods_name}}</text>
+					</view>
+					<slot name="name-end"></slot>
+					<view class="main-between cross-bottom" v-if="listStyle == -1 && goods.sign != 'flash_sale' && !endImage">
+						<!-- 列表活动倒计时 -->
+						<view class="list-countdown dir-left-nowrap cross-center" v-if="sec > 0 || min > 0 || hour > 0">
+							<slot name="timing-before"></slot>
+							<view>距结束</view>
+							<view class="timing">{{hour}}</view>
+							<view>:</view>
+							<view class="timing">{{min}}</view>
+							<view>:</view>
+							<view class="timing">{{sec}}</view>
+						</view>
+						<!-- 超级会员卡 -->
+						<template v-if="goods.vip_card_appoint && goods.vip_card_appoint.discount && ['advance','miaosha'].indexOf(goods.sign) !== -1">
+							<app-sup-vip :new_icon="true" :discount="goods.vip_card_appoint.discount" :is_vip_card_user="goods.vip_card_appoint.is_vip_card_user" :margin="listSvipMargin"></app-sup-vip>
+						</template>
+
+					</view>
+					<!-- 列表活动结束 -->
+					<view class="list-countdown main-between cross-center" v-if="endImage && listStyle == -1">
+						<view>已结束</view>
+						<!-- 超级会员卡 -->
+						<template v-if="goods.vip_card_appoint && goods.vip_card_appoint.discount">
+							<app-sup-vip :new_icon="true" :discount="goods.vip_card_appoint.discount" :is_vip_card_user="goods.vip_card_appoint.is_vip_card_user" :margin="listSvipMargin"></app-sup-vip>
+						</template>
+					</view>
+					<!-- 额外信息 -->
+					<view class="goods-extra" v-if="['weekly_buy','pintuan','advance', 'flash_sale', 'pick'].indexOf(goods.sign) !== -1 || extra || (goods.vip_card_appoint && goods.vip_card_appoint.discount && !(listStyle == -1 && ['advance', 'flash_sale','miaosha'].indexOf(goods.sign) !== -1))" :class="[scrollWidth > 208 ? 'center-bottom' : listStyle == 0 || listStyle == 3 || goods.sign == 'flash_sale'  ? 'dir-top-nowrap' : 'cross-center', textStyle == 2 ? 'main-center cross-center' :'main-between',listStyle == -1 && goods.sign == 'advance' ? 'small-margin': '']">
+						<view v-if="extra" class="extra-info">{{extra}}</view>
+						<view v-else-if="goods.sign == 'weekly_buy' && !no_extra" class="extra-info">{{goods.type_name}}</view>
+						<view v-else-if="goods.sign == 'pintuan' && !no_extra" class="extra-info">{{goods.people_num}}人团</view>
+						<view v-else-if="goods.sign == 'advance' && !no_extra" class="sales-info" :class="goods.vip_card_appoint && goods.vip_card_appoint.discount && goods.vip_card_appoint.discount != 0 ? '' : 'all'">
+							<view :style="{'color': themeColor.color,'border-color': themeColor.border}">定金{{ Number(goods.deposit) }}抵{{ Number(goods.swell_deposit) }}</view>
+						</view>
+						<view v-else-if="goods.sign == 'pick' && !no_extra" class="sales-info" :class="goods.vip_card_appoint && goods.vip_card_appoint.discount && goods.vip_card_appoint.discount != 0 ? '' : 'all'">
+							<view :style="{'color': themeColor.color,'border-color': themeColor.border}">{{ Number(goods.rule_price) }}元任选{{ Number(goods.rule_num) }}{{goods.unit ? goods.unit : goods.goodsWarehouse ? goods.goodsWarehouse.unit : '件'}}</view>
+						</view>
+						<view v-else-if="goods.sign == 'flash_sale' && !(listStyle == 0 &&(!isIndex || scrollWidth > 208))" class="sales-progress" :class="showProgressBar ? 'line' : ''">
+							<view v-if="showProgressBar" class="progress main-center cross-center" :class="listStyle == -1 ? 'short': ''" :style="{'color': themeColor.color,'border-color': themeColor.background}">
+								<view :style="{'width': rate, 'background-color': themeColor.background}" class="rate"></view>
+								<view v-if="listStyle != 0 && listStyle != 3" class="main-center cross-center" style="flex-shrink: 0;white-space: nowrap;">
+									<i class="iconfont">&#xe6e7;</i>
+									<text style="display: block;" v-if="goods.discount_type === 1">{{goods.min_discount}}折</text>
+									<text style="display: block;" v-if="goods.discount_type === 2">减{{goods.min_discount}}元</text>
+								</view>
+								<view :style="{'background-color': themeColor.background}" v-if="listStyle != 0 && listStyle != 3" class="line"></view>
+								<view class="t-omit">已抢购{{goods.sales}}{{goods.unit ? goods.unit : goods.goodsWarehouse ? goods.goodsWarehouse.unit : '件'}}</view>
+							</view>
+							<view v-if="!showProgressBar || (showProgressBar && (listStyle == 0 || listStyle == 3))" class="show-sale dir-left-nowrap cross-center" :style="{'font-size': !showProgressBar ? '24rpx' : '20rpx','color': themeColor.color, 'margin-top': showProgressBar && (listStyle == 0 || listStyle == 3) ? '10rpx' : '0'}" :class="textStyle == 2 ? 'main-center' : 'dir-left-nowrap'">
+								<i class="iconfont" :style="{'font-size': !showProgressBar ? '22rpx' : '20rpx'}">&#xe6e7;</i>
+								<text v-if="goods.discount_type === 1">{{goods.min_discount}}折</text>
+								<text v-if="goods.discount_type === 2">减{{goods.min_discount}}元</text>
+							</view>
+						</view>
+						<!-- 超级会员卡 -->
+						<template v-if="goods.vip_card_appoint && goods.vip_card_appoint.discount && !(listStyle == -1 && ['advance', 'flash_sale','miaosha'].indexOf(goods.sign) !== -1)">
+							<app-sup-vip :discount="goods.vip_card_appoint.discount" :new_icon="true" :is_vip_card_user="goods.vip_card_appoint.is_vip_card_user" :margin="svipMargin"></app-sup-vip>
+						</template>
+					</view>
+					<view class="main-between cross-center" v-if="listStyle == -1 && goods.sign == 'flash_sale'">
+						<!-- 列表活动倒计时 -->
+						<view class="list-countdown dir-left-nowrap cross-center" v-if="sec > 0 || min > 0 || hour > 0">
+							<slot name="timing-before"></slot>
+							<view>距结束</view>
+							<view class="timing">{{hour}}</view>
+							<view>:</view>
+							<view class="timing">{{min}}</view>
+							<view>:</view>
+							<view class="timing">{{sec}}</view>
+						</view>
+						<!-- 超级会员卡 -->
+						<app-sup-vip :discount="goods.vip_card_appoint.discount" :new_icon="true" :is_vip_card_user="goods.vip_card_appoint.is_vip_card_user" v-if="goods.vip_card_appoint && goods.vip_card_appoint.discount" :margin="listSvipMargin"></app-sup-vip>
+					</view>
+				</view>
+				<view class="box-grow-1 cross-bottom" :class="[listStyle == 0 && show_sale ? 'dir-bottom-nowrap':'',textStyle == 2 ? 'main-center' :'main-between']">
+					<view class="sales" style='width: 100%;' v-if="show_sale && listStyle == 0">{{goods.sales}}</view>
+					<view class="price-content dir-bottom-nowrap box-grow-1">
+						<view class="sales" v-if="show_sale && listStyle == -1">{{goods.sales}}</view>
+						<view v-if="goods.sign == 'flash_sale' && scrollWidth > 208 && showProgressBar" class="sales-progress line bottom">
+							<view class="progress main-center cross-center" :class="listStyle == -1 ? 'short': ''" :style="{'color': themeColor.color,'border-color': themeColor.background}">
+								<view :style="{'width': rate, 'background-color': themeColor.background}" class="rate"></view>
+								<view class="main-center cross-center" style="flex-shrink: 0;white-space: nowrap;">
+									<i class="iconfont">&#xe6e7;</i>
+									<text style="display: block" v-if="goods.discount_type === 1">{{goods.min_discount}}折</text>
+									<text style="display: block" v-if="goods.discount_type === 2">减{{goods.min_discount}}元</text>
+								</view>
+								<view class="line" :style="{'background-color': themeColor.background}"></view>
+								<view class="t-omit">已抢购{{goods.sales}}{{goods.unit ? goods.unit : goods.goodsWarehouse ? goods.goodsWarehouse.unit : '件'}}</view>
+							</view>
+						</view>
+						<view :class="priceFlex">
+							<view class="goods-price" v-if="priceFlex  != 'dir-bottom-nowrap' && showGoodsPrice" :class="listStyle == 0 || listStyle == 3 ? 'small': ''" :style="{'color': themeColor.color, 'margin-right': '10rpx','line-height': '1','margin-top': '8rpx'}">
+								<text v-if="price_extra" style="margin-right: 5rpx;display: inline-block;vertical-align: top;margin-top: 8rpx;" class="price-float">{{price_extra}}</text>
+								<text class="price-float">{{price.priceInt > 0 || price.priceInt == 0 ? '¥' :''}}</text>
+								<text class="price-int" :class="price.priceInt > 0 || price.priceInt == 0 ? '' : 'text'">{{price.priceInt}}</text>
+								<text class="price-float">{{price.priceFloat}}</text>
+							</view>
+							<view class="original-price" :class="listStyle == -1 || (listStyle == 1 && textStyle == 1) ? 'overflow' :''" v-if="isUnderLinePrice && goods.original_price && !(showMemberPrice && showGoodsPrice) && goods.is_negotiable != 1">
+								¥{{ goods.original_price }}
+							</view>
+							<view class="box-grow-1" style="height: 28rpx;line-height: 1" v-if="showMemberPrice && showGoodsPrice">
+								<view :style="{'color':themeColor.color,'background-color': themeColor.background_o}" class="goods-member-price">会员价{{goods.level_price == 0 ? ' 免费': '¥' + memberPrice.priceInt + memberPrice.priceFloat}}</view>
+							</view>
+							<view class="goods-price overflow" v-if="priceFlex  == 'dir-bottom-nowrap' && showGoodsPrice" :class="listStyle == 0 || listStyle == 3 ? 'small': ''" :style="{'color': themeColor.color}">
+								<template v-if="goods.sign == 'integral_mall'">
+									<text class="price-int list-style-string">{{Number(goods.integral)}}</text>
+									<text class="price-string">积分{{goods.price > 0 ? '+':''}}</text>
+									<text v-if="goods.price > 0" class="price-int list-style-string">{{goods.price}}</text>
+									<text v-if="goods.price > 0" class="price-string">元</text>
+								</template>
+								<template v-else-if="goods.sign == 'step'">
+									<text class="price-int list-style-string">{{Number(goods.currency)}}</text>
+									<text class="price-string">{{goods.currency_name ? goods.currency_name : '活力币'}}{{goods.price > 0 ? '+':''}}</text>
+									<text v-if="goods.price > 0" class="price-int list-style-string">{{goods.price}}</text>
+									<text v-if="goods.price > 0" class="price-string">元</text>
+								</template>
+								<template v-else>
+									<text class="price-float">{{price.priceInt > 0 || price.priceInt == 0 ? '¥' :''}}</text>
+									<text class="price-int" :class="price.priceInt > 0 || price.priceInt == 0 ? '' : 'text'">{{price.priceInt}}</text>
+									<text class="price-float">{{price.priceFloat}}</text>
+								</template>
+							</view>
+							<slot name="price-after"></slot>
+						</view>
+					</view>
+					<!--购物车-->
+					<view v-if="showBtn" @click.stop="clickBtn" :style="btnStyle" class="buy-btn-class main-center cross-center" :class="listStyle == 1 ? 'big-btn' : ''">{{buyBtnText}}</view>
+					<!--购物车-->
+					<view v-if="showBuyBtn && buyBtnImage && textStyle == 1 && goods.is_negotiable != 1" @click.stop="clickBtn" :style="btnImageStyle">{{buyBtnText}}</view>
+					<view class="sales" v-else-if="show_sale && listStyle > 0">{{goods.sales}}</view>
+				</view>
+			</view>
+			<u-attr
+				v-if="attrGoods.attrShow || attrGoods.goods"
+				v-model="attrGoods.attrShow"
+				:checked="attrGoods.select"
+				:goods="attrGoods.goods"
+				:theme="themeColor"
+				@check="checkClick"
+				@cart="cartResult"
+			></u-attr>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {mapState,mapGetters} from "vuex";
+	import appDiyCompositionImage from '../../page-component/app-diy-goods-list/app-diy-composition-image';
+	import uAttr from '../../page-component/goods/u-attr.vue';
+	export default {
+		name: "app-goods",
+		components: {
+			uAttr,
+			appDiyCompositionImage
+		},
+		data() {
+			return {
+				attrGoods: {
+					goods: null,
+					attrShow: 0,
+					select: null,
+					disable: 'disable'
+				},
+				rate: 0,
+				endHeight: 56,
+				endImage: '',
+				time: 0,
+				countdown: null,
+				hour: '00',
+				min: '00',
+				sec: '00',
+				activityImage: '',
+				itemWidth: 0,
+				price: {
+					priceFloat: '',
+					priceInt: '',
+				},
+				memberPrice: {
+					priceFloat: '',
+					priceInt: '',
+				}
+			}
+		},
+		props: {
+			price_extra: String, // 价格额外字段
+			click: { // 自定义点击事件
+				type: Boolean,
+				default() {
+					return false
+				}
+			},
+			click_btn: { // 自定义点击购买按钮事件
+				type: Boolean,
+				default() {
+					return false
+				}
+			},
+			index: Number, // 下标
+			showTag: {   // 显示商品插件名
+				type: [Number, Boolean],
+				default() {
+					return true
+				}
+			},
+			padding: Number, // 边距
+			extra: String, // 额外信息
+			theme: Object,  // 主题色
+			goods: Object,  // 商品
+			buttonColor: String,  // 按钮颜色
+			listStyle: { // 列表样式
+				type: Number,
+				default() {
+					return -1
+				}
+			},
+			fill: {   //  商品图片显示样式
+				type: Number,
+				default() {
+					return 1
+				}
+			},
+			goodsCoverProportion: { // 商品封面图比例
+				type: String,
+				default() {
+					return '1:1'
+				}
+			},
+			goodsStyle: { // 商品样式
+				type: Number,
+				default() {
+					return -1
+				}
+			},
+			showGoodsName: {  // 是否显示商品名
+				type: [Number, Boolean],
+				default() {
+					return true
+				}
+			},
+			showGoodsPrice: { // 是否显示商品价格
+				type: [Number, Boolean],
+				default() {
+					return true
+				}
+			},
+			textStyle: {  // 价格文字样式
+				type: Number,
+				default() {
+					return 1
+				}
+			},
+			showBuyBtn: {  // 是否显示购买按钮
+				type: [Number, Boolean],
+				default() {
+					return true
+				}
+			},
+			showProgressBar: { // 是否显示进度条
+				type: [Number, Boolean],
+				default() {
+					return false
+				}
+			},
+			buyBtnStyle: {  // 购买按钮样式
+				type: Number,
+				default() {
+					return 1
+				}
+			},
+			buyBtnImage: { // 购买按钮图片
+				type: String,
+				default() {
+					return ''
+				}
+			},
+			btnSize: Number, // 购买按钮图片尺寸
+			buyBtnText: String,  // 购买按钮文字
+			showGoodsTag: {  // 显示商品角标
+				type: [Number, Boolean],
+				default() {
+					return false
+				}
+			},
+			goodsTagPicUrl: String,   // 商品角标图片
+			isUnderLinePrice: {    // 是否显示划线价
+				type: [Number, Boolean],
+				default() {
+					return false
+				}
+			},
+			no_extra: {      //  是否没有额外信息
+				type: [Number, Boolean],
+				default() {
+					return false
+				}
+			},
+			buy: {    //  是否激活购买事件
+				type: [Number, Boolean],
+				default() {
+					return false
+				}
+			},
+			c_border_top: Number,    // 上圆角尺寸
+			c_border_bottom: Number,    // 下圆角尺寸
+			scrollWidth: {    // 滚动模式下元素宽度
+				type: Number,
+				default() {
+					return 208
+				}
+			},
+			show_time: {    // 是否显示倒计时
+				type: [Number, Boolean],
+				default() {
+					return true
+				}
+			},
+			goodsEndColor: {      // 商品背景颜色
+				type: String,
+				default() {
+					return "#FFFFFF"
+				}
+			},
+			goodsBorderColor: String,    // 商品边框颜色
+			show_sale: {    // 是否显示销量
+				type: [Number, Boolean],
+				default() {
+					return false
+				}
+			},
+			isIndex: {    // 是否为首页显示
+				type: [Number, Boolean],
+				default() {
+					return false
+				}
+			},
+		},
+		created() {
+			let that = this;
+			that.activityImage = that.diyImg[that.goods.sign];
+			if(that.goods.is_negotiable != 1) {
+				that.price = that.handlePrice(that.price_extra ? that.goods.min_price : that.goods.price ? that.goods.price : that.goods.goods.price);
+			}else {
+				that.price = that.handlePrice(that.appSetting.negotiable_text);
+			}
+			if(that.showMemberPrice) {
+				that.memberPrice = that.handlePrice(that.goods.level_price);
+			}
+			if(that.goods.sign == 'flash_sale') {
+				that.rate = that.goods.sales / (+that.goods.sales + +that.goods.goods_stock) * 100 + '%'
+			}
+			if(that.goods.end_prepayment_time > 0) {
+				that.time = that.goods.end_prepayment_time;
+			}
+			if(that.goods.end_prepayment_time < 0) {
+				that.countTime();
+			}
+			if(that.time > 0 && !that.isIndex && that.show_time) {
+				that.countdown = setInterval(function() {
+					that.getTime(that.time);
+				}, 1000)
+			}
+		},
+		computed: {
+			...mapState({
+				diyImg: state => state.mallConfig.__wxapp_img.diy,
+				appImg: state => state.mallConfig.__wxapp_img.mall,
+				appSetting: state => state.mallConfig.mall.setting,
+			}),
+			...mapGetters('mallConfig', {
+				getVideo: 'getVideo',
+	            getTheme: 'getTheme',
+	        }),
+	        themeColor() {
+	        	return this.theme ? this.theme : this.getTheme
+	        },
+			showMemberPrice() {
+				return this.goods.is_level == 1 && this.goods.is_negotiable != 1 && (this.goods.level_price > 0 || this.goods.level_price == 0)
+			},
+			showBtn() {
+				return this.showBuyBtn && this.goods.is_negotiable != 1 && this.textStyle == 1 && this.listStyle != 0 && this.listStyle != 3 && this.buyBtnImage == ''
+			},
+			extraMsg() {
+				return (['weekly_buy','pintuan','advance', 'flash_sale', 'pick'].indexOf(this.goods.sign) !== -1 || this.listStyle != 1) && ['step','integral_mall'].indexOf(this.goods.sign) == -1
+			},
+			pluginTag() {
+				if(this.goods.composition_id > 0) {
+					return this.goods.tag
+				}else if(this.goods.sign) {
+					switch (this.goods.sign) {
+						case 'pintuan':
+							return '拼团';
+						case 'miaosha':
+							return '秒杀';
+						case 'pick':
+							return 'N元任选';
+						case 'advance':
+							return '预售';
+						case 'bargain':
+							return '砍价';
+						case 'gift':
+							return '社交送礼';
+						case 'flash_sale':
+							return '限时抢购';
+						case 'exchange':
+							return '礼品卡';
+						case 'wholesale':
+							return '商品批发';
+						case 'step':
+							return '步数宝';
+						case 'weekly_buy':
+							return '周期购';
+						case 'lottery':
+							return '抽奖';
+						case 'booking':
+							return '预约';
+					}
+				}else {
+					return ''
+				}
+			},
+			appGoodsClass() {
+				let className = ''
+				if(this.listStyle == -1) {
+					className += 'list dir-left-nowrap cross-center'
+					if(this.goods.sign == 'flash-sale' || this.goods.sign == 'advance') {
+						className += ' long'
+					}
+				}else if(this.listStyle == 0) {
+					className += 'scroll dir-top-nowrap'
+				}else if(this.listStyle == 3) {
+					className += 'third dir-top-nowrap'
+				}else {
+					className += 'dir-top-nowrap'
+				}
+				if(this.isIndex) {
+					className += ' is-index'
+				}
+				return className
+			},
+			svipMargin() {
+				let style = "0 0 0 20rpx"
+				if((this.listStyle == 0 && this.scrollWidth < 304) || this.listStyle == 3 || this.goods.sign == 'flash_sale' && !this.isIndex) {
+					style = style.replace('0', '8rpx');
+				}
+				if(!(this.textStyle == 2 && !(this.listStyle == 0 && this.scrollWidth < 304) && this.listStyle != 3 && (this.extra || ['weekly_buy','pintuan','advance', 'pick'].indexOf(this.goods.sign) !== -1 ))) {
+					style = style.replace('20rpx', '0');
+				}
+				return style
+			},
+			listSvipMargin() {
+				let style = "0 0 0 20rpx"
+				if((this.listStyle == 0 && this.scrollWidth < 304) || this.listStyle == 3 || this.goods.sign == 'flash_sale') {
+					style = style.replace('0', '8rpx');
+				}
+				if(!(this.textStyle == 2 && this.extraMsg )) {
+					style = style.replace('20rpx', '0');
+				}
+				return style
+			},
+			btnImageStyle() {
+				let style = `background-color: ${this.themeColor.background};width: ${this.btnSize}rpx;height: ${this.btnSize}rpx;flex-shrink:0;background-image: url(${this.buyBtnImage});background-repeat: no-repeat;background-size: 100% 100%;border: 0;border-radius: 50%;margin-left: 12rpx;`
+				return style;
+			},
+			coverRadius() {
+				let radius = '';
+				if(this.isIndex) {
+					radius = `${this.c_border_top}rpx`
+				}else {
+					radius = `${this.c_border_top}rpx ${this.c_border_top}rpx 0 0`
+					if(this.listStyle == -1) {
+						radius = `${this.c_border_top}rpx 0 0 ${this.c_border_bottom}rpx`
+					}
+				}
+				return radius;
+			},
+			coverHeight() {
+				let height = 256
+				if(this.listStyle > 0) {
+					if(this.goodsCoverProportion == '3-2' && this.listStyle == 1) {
+						height = `${this.itemWidth / 3 * 2}`
+					}else {
+						height = `${this.itemWidth}`
+					}
+				}else {
+					height = ['flash_sale','miaosha'].indexOf(this.goods.sign) !== -1 && this.showTag ? 276 : 256
+					if(this.goodsStyle == 2) {
+						height = height - 4;
+					}
+				}
+				if(this.listStyle == 0) {
+					height = `${this.scrollWidth}`
+				}
+				return height + 'rpx';
+			},
+			coverStyle() {
+				let style = `height: ${this.coverHeight > 0 ? this.coverHeight : this.listStyle == 0 ? this.scrollWidth : this.listStyle == -1 ? 256 : this.itemWidth}rpx;border-radius: ${this.coverRadius}`;
+				return style;
+			},
+			priceFlex() {
+				if(this.price_extra) {
+					return ''
+				}else if(((this.listStyle == -1 && (this.goods.sign == 'advance' || this.goods.sign == 'flash_sale')) || (this.listStyle == 1 && this.textStyle == 1) || (this.listStyle == 0 && this.scrollWidth > 208 && !this.isIndex)) && this.goods.sign != 'integral_mall' && this.goods.sign != 'step') {
+					return 'dir-left-nowrap cross-bottom'
+				}else {
+					return 'dir-bottom-nowrap'
+				}
+			},
+			// },
+			marginStyle() {
+	            // #ifdef MP-ALIPAY || H5
+				let style = '';
+	            // #endif
+	            // #ifndef MP-ALIPAY || H5
+				let style = 'height: 100%;';
+	            // #endif
+				this.itemWidth = 750 - this.padding*2;
+				if(this.listStyle != 0) {
+					if(this.listStyle == 2) {
+						this.itemWidth = (750 - this.padding*2 - 20) / 2;
+					}else if(this.listStyle == 3) {
+						this.itemWidth = (750 - this.padding*2 - 32) / 3;
+					}
+					if(this.index % 3 == 1 && this.listStyle == 3) {
+						style += `padding: 20rpx 16rpx 0;width: ${this.itemWidth + 32}rpx;`
+					}else {
+						style += `width: ${this.itemWidth}rpx;`
+					}
+				}
+				if(this.index == 0 || (this.index == 1 && this.listStyle != -1 && this.listStyle != 1) || (this.index == 2 && this.listStyle != -1 && this.listStyle != 1 && this.listStyle != 2) || this.listStyle == 0) {
+					style += `padding-top: 0;`
+				}else {
+					style += `padding-top: 20rpx;`
+				}
+				return style
+			},
+			appGoodsStyle() {
+				let style = `width: 100%;border-radius: ${this.c_border_top}rpx ${this.c_border_top}rpx ${this.c_border_bottom}rpx ${this.c_border_bottom}rpx;background-color: ${this.goodsEndColor};`;
+				if(this.listStyle == 0) {
+					style += `width: ${this.scrollWidth}rpx;`
+				}
+				if(this.goodsStyle == 2) {
+					style += `border: 2rpx solid #CCCCCC;`
+				}else if(this.goodsBorderColor){
+					style += `border: 2rpx solid ${this.goodsBorderColor};`
+				}
+				if(this.index == 0 && this.listStyle == 0) {
+					style += `margin-left: 0;`
+				}
+				if(this.listStyle == -1 && ['flash_sale','miaosha'].indexOf(this.goods.sign) !== -1) {
+					style += `height: 276rpx;`
+				}
+				return style;
+			},
+			btnStyle() {
+				let style = '';
+				if(this.buyBtnStyle > 2) {
+					style += `border-radius: 24rpx;`
+				}
+				if(this.buyBtnStyle % 2 == 1) {
+					style += `background-color: ${this.buttonColor ? this.buttonColor : this.themeColor.color};`
+				}else if(this.buyBtnStyle % 2 == 0) {
+					style += `color: ${this.buttonColor};border: 2rpx solid ${this.buttonColor}`
+				}
+				return style;
+			},
+			compositionStyle() {
+				let style = `border-top-left-radius: ${this.c_border_top}rpx;overflow: hidden;flex-shrink: 0;`;
+				if(this.listStyle == -1) {
+					style += `width: 342rpx;height: 100%;border-bottom-left-radius: ${this.c_border_bottom}rpx;`
+				}else if(this.listStyle == 1) {
+					style += `width: 100%;height: 452rpx;border-top-right-radius: ${this.c_border_top}rpx;`
+				}else if(this.listStyle == 2) {
+					style += `width: 100%;height: 220rpx;border-top-right-radius: ${this.c_border_top}rpx;`
+				}
+				return style;
+			}
+		},
+		destroyed() {
+			clearTimeout(this.countdown)
+		},
+		watch: {
+			'attrGoods.attrShow': {
+				handler(nVal) {
+					this.$emit('show',nVal)
+	            },
+	            deep: true,
+	            immediate: true
+			}
+		},
+		methods: {
+			getTime() {
+				this.time = this.time  - 1;
+				let dd = 0;
+				let hh = parseInt(this.time / 3600);
+				let h = this.time % 3600;
+				let mm = parseInt(h / 60);
+				let ss = h % 60
+				this.hour = hh < 10 ? '0' + hh.toString() : hh;
+				this.min = mm < 10 ? '0' + mm.toString() : mm;
+				this.sec = ss < 10 ? '0' + ss.toString() : ss;
+				if(this.time < 1) {
+					this.countTime();
+					clearTimeout(this.countdown)
+				}
+			},
+			countTime() {
+				this.endHeight = 52
+				if(this.listStyle == 2) {
+					this.endImage = this.diyImg.small_end;
+					this.endHeight = 56
+				}else if(this.listStyle == 3) {
+					this.endImage = this.diyImg.middle_end;
+				}else if(this.listStyle == 0) {
+					this.endImage = this.diyImg.big_end;
+				}else {
+					this.endImage = this.diyImg[this.goods.sign + '_end'];
+					this.endHeight = 80
+				}
+			},
+			route_go(e) {
+				// #ifndef MP-BAIDU
+				if (e.video_url && this.getVideo == 1) {
+					// #ifdef MP
+					uni.navigateTo({
+						url: `/pages/goods/video?goods_id=${e.id}&sign=${e.sign}`
+					});
+					// #endif
+					// #ifdef H5
+					uni.navigateTo({
+						url: e.page_url
+					});
+					// #endif
+				} else {
+					uni.navigateTo({
+						url: e.page_url
+					});
+				}
+				// #endif
+
+				// #ifdef MP-BAIDU
+				uni.navigateTo({
+					url: e.page_url
+				});
+				// #endif
+			},
+			clickBtn() {
+				if(this.buy) {
+					this.specification(this.goods)
+					this.$emit('click', this.goods)
+				}else if(this.click_btn || this.click) {
+					this.$emit('click', this.goods)
+				}else {
+					this.route_go(this.goods);
+				}
+			},
+			toDetail() {
+				if(this.click) {
+					this.$emit('click', this.goods)
+				}else {
+					this.route_go(this.goods);
+				}
+			},
+			specification(goods) {
+				this.attrGoods.select = null;
+				uni.showLoading({
+					text: '',
+					mask: true
+				});
+				this.$request({
+					url: this.$api.goods.attr,
+					data: {
+						id: goods.id,
+						mch_id: goods.mch_id
+					}
+				}).then(e => {
+					uni.hideLoading();
+					if (e.code === 0) {
+						this.attrGoods.goods = Object.assign(goods, e.data);
+						this.$emit('show',true)
+						this.attrGoods.attrShow = true;
+					} else {
+						uni.showToast({
+							title: e.msg,
+							icon: 'none'
+						})
+					}
+				})
+			},
+			checkClick({item}) {
+				this.attrGoods.select = item;
+			},
+			cartResult({checked}) {
+				this.$emit('cart',checked)
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.app-goods {
+		background-color: #FFFFFF;
+		flex-shrink: 0;
+		font-size: 28rpx;
+		position: relative;
+		height: 100%;
+		.goods-tag {
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 64rpx;
+			height: 64rpx;
+			z-index: 10;
+		}
+		.out-dialog {
+			background-color: rgba(0,0,0,.5);
+			position: absolute;
+			top: 0;
+			left: 0;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.timing {
+			font-size: 32rpx;
+			margin: 0 6rpx;
+			padding: 0 8rpx;
+			height: 52rpx;
+			line-height: 52rpx;
+			border-radius: 4rpx;
+			background-color: #333333;
+			color: #FFFFFF;
+			font-weight: 500;
+		}
+		.countdown-info {
+			background: linear-gradient(135deg, #FFE3D6 0%, #FFEADA 43%, #FFF0E8 61%, #FFD0B7 100%);
+			&.big {
+				height: 56rpx;
+				font-size: 24rpx;
+				padding: 0 20rpx;
+				padding-right: 16rpx;
+				.timing {
+					padding: 0 4rpx;
+					height: 40rpx;
+					line-height: 40rpx;
+					margin: 0 4rpx;
+					font-size: 24rpx;
+				}
+			}
+			&.small {
+				height: 52rpx;
+				font-size: 20rpx;
+				padding: 0 10rpx;
+				padding-right: 8rpx;
+				.timing {
+					padding: 0 2rpx;
+					height: 32rpx;
+					line-height: 32rpx;
+					margin: 0 2rpx;
+					font-size: 24rpx;
+					font-weight: 400;
+				}
+			}
+		}
+		.activity-info {
+			position: relative;
+			height: 80rpx;
+			width: 100%;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+			.countdown {
+				position: absolute;
+				right: 14rpx;
+				top: 0;
+				height: 80rpx;
+				font-size: 28rpx;
+				.title {
+					margin-right: 14rpx;
+				}
+			}
+		}
+		.end-info {
+			width: 100%;
+			display: block;
+		}
+		&.list {
+			width: 100%;
+			height: 256rpx;
+			&.long {
+				height: 276rpx;
+			}
+			.goods-cover {
+				flex-shrink: 0;
+				height: 100%;
+				width: 256rpx;
+			}
+			.goods-info {
+				height: 100%;
+				&.no-tag {
+					padding: 16rpx 20rpx;
+				}
+			}
+		}
+		&.scroll {
+			width: 208rpx;
+			
+			margin-left: 16rpx;
+			&.is-index {
+				margin-left: 20rpx;
+				.goods-info {
+					padding: 16rpx 10rpx;
+				}
+			}
+			.goods-info {
+				padding: 16rpx;
+				.goods-top {
+					.goods-extra {
+						.sales-info {
+							max-width: 100%;
+							view {
+								max-width: 100%;
+								display: inline-block;
+							}
+						}
+					}
+				}
+			}
+			.goods-cover {
+				height: 208rpx;
+			}
+		}
+		&.third {
+			.goods-info {
+				padding: 16rpx;
+				.goods-top {
+					.goods-extra {
+						.sales-info {
+							max-width: 100%;
+							view {
+								display: inline-block;
+							}
+						}
+					}
+				}
+			}
+		}
+		.goods-cover {
+			width: 100%;
+			display: block;
+		}
+		.goods-info {
+			padding: 20rpx;
+			&.main-center {
+				text-align: center;
+			}
+			.goods-top {
+				.list-countdown {
+					height: 36rpx;
+					color: #999999;
+					font-size: 24rpx;
+					margin-top: 10rpx;
+					.timing {
+						height: 36rpx;
+						font-size: 24rpx;
+						line-height: 36rpx;
+						padding: 0 4rpx;
+						background-color: #F3F3F3;
+						color: #999999;
+						font-weight: 400;
+					}
+					&+.goods-extra {
+						padding: 10rpx 0 16rpx;
+					}
+				}
+				.goods-name {
+					word-break: break-all;
+					text-align: left;
+					line-height: 36rpx;
+				}
+				.tag {
+					display: inline-block;
+					margin-right: 20rpx;
+					padding: 0 12rpx;
+					height: 36rpx;
+					line-height: 36rpx;
+					border-radius: 8rpx;
+					color: #FFFFFF;
+					font-size: 24rpx;
+				}
+				.goods-extra {
+					width: 100%;
+					padding-top: 16rpx;
+					font-size: 22rpx;
+					color: #999999;
+					&.small-margin{
+						padding: 10rpx 0;
+					}
+					&.dir-top-nowrap {
+						padding: 6rpx 0;
+					}
+					.extra-info {
+						font-size: 24rpx;
+						color: #999999;   
+					}
+					.sales-info {
+						max-width: 50%;
+						&.all {
+							max-width: 100%;
+						}
+						view {
+							color: #FF812D;
+							height: 30rpx;
+							line-height: 26rpx;
+							border-radius: 15rpx;
+							border: 2rpx solid #FF812D;
+							padding: 0 8rpx;
+							font-size: 20rpx;
+							white-space: nowrap;
+							overflow: hidden;
+							text-overflow: ellipsis;
+						}
+					}
+				}
+			}
+			.price-content {
+				.sales {
+					margin-top: 6rpx;
+				}
+				.goods-price {
+					font-family: Alibaba;
+					&.overflow {
+						text-overflow: ellipsis;
+						overflow: hidden;
+						white-space: nowrap;
+					}
+					.price-int {
+						font-size: #{40rpx};
+						font-weight: 500;
+						white-space: nowrap;
+						&.text {
+							font-size: 34rpx;
+						}
+						&.list-style-string {
+							font-size: 36rpx;
+						}
+					}
+					.price-float {
+						font-size: #{28rpx};
+						white-space: nowrap;
+					}
+					.price-string {
+						white-space: nowrap;
+						margin: 0 5rpx;
+						font-size: #{28rpx};
+					}
+					&.small {
+						.price-int {
+							font-size: #{32rpx};
+							&.text {
+								font-size: 30rpx;
+							}
+							&.list-style-string {
+								font-size: 28rpx;
+							}
+						}
+						.price-float {
+							font-size: #{24rpx};
+						}
+						.price-string {
+							margin: 0 3rpx;
+							font-size: #{20rpx};
+						}
+					}
+				}
+				.original-price {
+					font-size: 24rpx;
+					color: #999999;
+					text-decoration: line-through;
+					&.overflow {
+						overflow: hidden;
+						text-overflow: ellipsis;
+						white-space: nowrap;
+					}
+				}
+				.goods-member-price {
+					font-size: 20rpx;
+					height: 28rpx;
+					line-height: 28rpx;
+					padding: 0 10rpx;
+					background-color: rgba(255, 69, 68, 0.1);
+					margin-top: -3rpx;
+					border-radius: 4rpx;
+					display: inline-block;
+					white-space: nowrap;
+					text-overflow: ellipsis;
+					overflow: hidden;
+					max-width: 100%;
+				}
+			}
+			.sales {
+				color: #999999;
+				font-size: 24rpx;
+			}
+			.sales-progress {
+				flex-shrink: 0;
+				&.line {
+					width: 100%;
+				}
+				&.bottom {
+					margin: 20rpx 0;
+				}
+				i {
+					font-size: 22rpx;
+					margin-right: 6rpx;
+				}
+				.show-sale {
+					height: 28rpx;
+					font-size: 20rpx;
+					line-height: 26rpx;
+					color: #ff4544;
+					font-weight: 600;
+				}
+				.progress {
+					height: 28rpx;
+					line-height: 24rpx;
+					text-align: center;
+					border-radius: 14rpx;
+					border: 2rpx solid #ff4544;
+					font-size: 20rpx;
+					color: #ff4544;
+					position: relative;
+					&.short {
+						width: 284rpx;
+					}
+					.line {
+						height: 16rpx;
+						width: 2rpx;
+						background-color: #ff4544;
+						margin: 0 6rpx;
+					}
+					>view:first-of-type {
+						font-weight: 600;
+					}
+					.rate {
+						position: absolute;
+						top: 0;
+						left: 0;
+						min-width: 26rpx;
+						height: 26rpx;
+						background: #FF4544;
+						border-radius: 13rpx;
+						opacity: 0.25;
+					}
+				}
+			}
+			.buy-btn-class {
+				color: #FFFFFF;
+				height: 48rpx;
+				width: 120rpx;
+				border-radius: 4rpx;
+				font-size: 24rpx;
+				flex-shrink: 0;
+				&.big-btn {
+					width: 136rpx;
+					height: 52rpx;
+					font-size: 28rpx;
+				}
+			}
+		}
+	}
+    //#ifdef MP-BAIDU || MP-TOUTIAO
+    @font-face {
+      font-family: 'iconfont';  /* Project id 1819490 */
+      src: url('https://at.alicdn.com/t/font_1819490_uvhnc7hoy3.woff2?t=1628318185237') format('woff2'),
+           url('https://at.alicdn.com/t/font_1819490_uvhnc7hoy3.woff?t=1628318185237') format('woff'),
+           url('https://at.alicdn.com/t/font_1819490_uvhnc7hoy3.ttf?t=1628318185237') format('truetype');
+    }
+    .iconfont{
+        font-family:"iconfont" !important;
+        font-size:12px;font-style:normal;
+        -webkit-font-smoothing: antialiased;
+        -webkit-text-stroke-width: 0.2px;
+        -moz-osx-font-smoothing: grayscale;
+    }
+    //#endif
+</style>

+ 43 - 0
src/components/basic-component/app-hotspot/app-hotspot.vue

xqd
@@ -0,0 +1,43 @@
+<template>
+    <view class="app-hotspot" :style="aa">
+        <app-jump-button :open_type="hotspot.link.openType" :url="hotspot.link.url" :params="hotspot.link.params">
+            <slot></slot>
+        </app-jump-button>
+    </view>
+</template>
+
+<script>
+
+    export default {
+        name: "app-hotspot",
+        props: {
+            hotspot: {
+                type: Object,
+                default() {
+                    return {};
+                }
+            }
+        },
+        data() {
+            return {}
+        },
+        onLoad() {
+        },
+        computed: {
+            aa() {
+                if (this.hotspot) {
+                    return `left:${this.hotspot.left}rpx;top:${this.hotspot.top}rpx;width:${this.hotspot.width}rpx;height:${this.hotspot.height}rpx;`;
+                } else {
+                    return ``;
+                }
+            }
+        }
+    };
+</script>
+
+<style lang="scss" scoped>
+    .app-hotspot {
+        position: absolute;
+        z-index: 1000;
+    }
+</style>

+ 69 - 0
src/components/basic-component/app-image/app-image.vue

xqd
@@ -0,0 +1,69 @@
+<template>
+    <view class="app-image" :style="appBackground" v-if="imgSrc">
+        <image src="https://shop.9026.com/web/statics/image/mall/static/icon/loading-img.png" class="img" :class="is_error ? '' : 'default'"
+               mode="aspectFill" lazy-load v-if="is_loading" :style="imgStyle"></image>
+        <image :src="imgSrc" class="img" :mode="mode" @error="imgError" @load="imgLoad" lazy-load
+               v-if="!is_error" :style="imgStyle"></image>
+    </view>
+</template>
+
+<script>
+    export default {
+        name: "app-image",
+        props: {
+            imgSrc: String,
+            width: String,
+            height: String,
+            mode: {
+                type: String,
+                default() {
+                    return 'aspectFill';
+                }
+            },
+            borderRadius: String,
+        },
+        data() {
+            return {
+                is_loading: true,
+                is_error: false
+            };
+        },
+        computed: {
+            appBackground() {
+                return `width: ${this.width};height: ${this.height};`;
+            },
+            imgStyle() {
+                return `border-radius: ${this.borderRadius}`;
+            },
+        },
+
+        methods: {
+            imgError() {
+                this.is_error = true;
+            },
+            imgLoad() {
+                this.is_loading = false;
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .app-image {
+        display: block;
+        position: relative;
+        .img {
+            width: 100%;
+            height: 100%;
+            display: block;
+            will-change: transform;
+
+            &.default {
+                position: absolute;
+                left: 0;
+                top: 0;
+                z-index: 0;
+            }
+        }
+    }
+</style>

+ 230 - 0
src/components/basic-component/app-input/app-input.vue

xqd
@@ -0,0 +1,230 @@
+<template>
+    <view class="app-view"
+          :style="{'height': `${setHeight}rpx`, 'width': `${width}rpx`}"
+    >
+        <template v-if="type !== 'textarea'">
+            <!--  #ifndef  MP-TOUTIAO -->
+            <input :disabled="disabled"
+                   :value="value ? value : defaultValue"
+                   :class="{'is-disabled': disabled, 'is-round': round, 'is-border': border}"
+                   class="app-input"
+                   :type="type"
+                   :password="password"
+                   :placeholder-style="placeholderStyle"
+                   :placeholder="placeholder"
+                   :focus="focus"
+                   :style="{
+                   'padding-left': !center && icon ? '30rpx' : `${paddingLeft}rpx`,
+                   'text-align': center ? 'center' : 'none',
+                   'height': `${setHeight}rpx`,
+                   'width': `${width}rpx`,
+                   'color': `${color}`,
+                   backgroundColor: backgroundColor,
+                   borderRadius: `${radius}rpx`,
+                   borderColor: borderColor,
+                   }"
+                   @input="changeValue"
+                   @blur="blur"
+                   @confirm="confirm"
+            />
+            <!--  #endif -->
+            <!-- MP-TOUTIAO focus属性有问题,去除。2020-02-24 -->
+            <!--  #ifdef  MP-TOUTIAO -->
+            <input :disabled="disabled"
+                   :value="value || value === 0 ? value : defaultValue"
+                   :class="{'is-disabled': disabled, 'is-round': round, 'is-border': border}"
+                   class="app-input"
+                   :type="type"
+                   :password="password"
+                   :placeholder-style="placeholderStyle"
+                   :placeholder="placeholder"
+                   :style="{
+                   'padding-left': !center && icon ? '30rpx' : `${paddingLeft}rpx`,
+                   'text-align': center ? 'center' : 'none',
+                   'height': `${setHeight}rpx`,
+                   'width': `${width}rpx`,
+                   'color': `${color}`,
+                   backgroundColor: backgroundColor,
+                   borderRadius: `${radius}rpx`,
+                   borderColor: borderColor,
+                   }"
+                   @input="changeValue"
+                   @blur="blur"
+                   @confirm="confirm"
+            />
+            <!--  #endif -->
+            <icon v-if="icon" class="app-icon"
+                  :style="{'background-image': `url(${icon})`, 'left': center ? '42%': '1%'}" type></icon>
+        </template>
+        <template v-else>
+            <textarea :value="value ? value : defaultValue"
+                      :maxlength="maxLength ? maxLength : -1"
+                      @blur="blur"
+                      @confirm="confirm"
+                      :placeholder-style="placeholderStyle"
+                      :show-confirm-bar="showConfirmBar"
+                      :placeholder="placeholder"
+                      :auto-height="autoHeight"
+                      :disabled="disabled"
+                      @input="changeValue"
+                      class="app-input-textarea"
+                      :class="{'is-disabled': disabled, 'is-round': round, 'is-border': border}"
+                      :style="{
+                            'color': `${color}`,
+                            backgroundColor: backgroundColor,
+                            borderRadius: `${radius}rpx`,
+                            padding: `24rpx ${paddingLeft}rpx`,
+                            borderColor: borderColor,
+                      }"
+            >
+            </textarea>
+        </template>
+    </view>
+</template>
+
+<script>
+
+    export default {
+        name: 'app-input',
+        props: {
+            type: String,
+            password: Boolean,
+            disabled: Boolean,
+            placeholder: {
+                default: '',
+                type: String,
+            },
+            autoHeight: Boolean,
+            showConfirmBar: Boolean,
+            placeholderStyle: {
+                type: String,
+                default: function () {
+                    return 'color: #999999';
+                }
+            },
+            maxLength: String,
+            value: {
+                default: '',
+            },
+            round: Boolean,
+            border: {
+                type: [Number, Boolean]
+            },
+            borderColor: {
+                default: '#c0c4cc',
+            },
+            icon: String,
+            center: Boolean,
+            size: String,
+            width: String,
+            color: {
+                default: '#353535',
+                type: String,
+            },
+            height: String,
+            backgroundColor: String,
+            radius: Number,
+            focus: {
+                type: Boolean,
+                default: false,
+            },
+            paddingLeft: {
+                default: 12,
+            },
+            defaultValue: {
+                default: '',
+            },
+        },
+        data() {
+            return {
+                newValue: this.value
+            }
+        },
+        methods: {
+            blur(event) {
+                this.$emit('blur', event.detail);
+            },
+            confirm(event) {
+                this.$emit('confirm', event.detail);
+            },
+            changeValue(value) {
+                this.$emit('input', value.detail.value);
+            }
+        },
+        computed: {
+            setHeight: function () {
+                if (this.height) return this.height;
+                switch (this.size) {
+                    case 'large':
+                        return 100;
+                    case 'small':
+                        return 60;
+                    case 'medium':
+                        return 80;
+                    default:
+                        return 80;
+                }
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+
+    .app-input {
+        border-radius: #{10rpx};
+        box-sizing: border-box;
+        outline: none;
+        height: #{80rpx};
+        width: 100%;
+        line-height: #{80rpx};
+        color: $uni-general-color-three;
+    }
+
+    .is-border {
+        border: #{2rpx} solid #dcdfe6;
+    }
+
+    .app-input:active {
+        border-color: #c0c4cc
+    }
+
+    .app-input.is-disabled {
+        background-color: #f5f7fa;
+        border-color: #e4e7ed;
+        color: #c0c4cc;
+        cursor: not-allowed;
+    }
+
+    .is-round {
+        border-radius: #{50rpx};
+    }
+
+    .app-view {
+        position: relative;
+    }
+
+    .app-icon {
+        width: #{25rpx};
+        height: #{25rpx};
+        position: absolute;
+        top: 50%;
+        transform: translateY(-50%);
+        background-repeat: no-repeat;
+        background-size: 100% 100%;
+    }
+
+    .app-input-textarea {
+        max-height: 100%;
+        width: 100%;
+        word-wrap: break-word;
+    }
+
+    /* #ifdef MP-ALIPAY */
+    .app-input,
+    .app-input-textarea {
+        overflow: hidden;
+    }
+
+    /* #endif */
+</style>

+ 40 - 0
src/components/basic-component/app-iphone-x/app-iphone-x.vue

xqd
@@ -0,0 +1,40 @@
+<template>
+	<view class="iphone-x">
+		<slot name="empty-area"></slot>
+		<view class="x-line" v-if="getBoolEmpty.XBoolean" :style="{height: getBoolEmpty.emptyHeight + 'rpx', backgroundColor: backgroundColor,}"></view>
+	</view>
+</template>
+
+<script>
+    import { mapGetters } from 'vuex';
+
+    export default {
+        props: {
+            backgroundColor: {
+                type: String,
+                default: function() {
+                    return 'white';
+                }
+            }
+        },
+        computed: {
+            ...mapGetters('iPhoneX', {
+                getBoolEmpty: 'getBoolEmpty'
+            }),
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+	.iphone-x {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		width: 100%;
+		z-index: 1500;
+	}
+	.x-line {
+		width: 100%;
+		background-color: pink;
+	}
+</style>

+ 444 - 0
src/components/basic-component/app-jump-button/app-jump-button.vue

xqd
@@ -0,0 +1,444 @@
+<template>
+	<form v-if="form" report-submit @submit="jumpLogic">
+		<!-- #ifndef MP-ALIPAY  -->
+		<button :open-type="open_type === 'contact' ? 'contact': open_type === 'share' ? 'share' : ''"
+			hover-class="none"
+			:style="{'background-color': `${backgroundColor ? backgroundColor : '' }`, 'height': `${height}%`, 'width': `${width}%`}"
+			:class="[`${arrangement === 'column' ? 'app-button-column' : arrangement === 'row' ? 'app-button-row' : arrangement === 'left' ? 'app-button-left': arrangement === 'topCenter' ? 'app-button-top-cross-center' : arrangement === 'a' ? 'app-left' : arrangement === 'b' ? 'app-left-between' : ''}`]"
+			formType="submit">
+			<slot></slot>
+		</button>
+		<!-- #endif -->
+		<!-- #ifdef MP-ALIPAY -->
+		<template>
+			<button :open-type="open_type === 'share' ? 'share' : ''" hover-class="none"
+				:style="{'background-color': `${backgroundColor ? backgroundColor : '' }`, 'height': `${height}%`, 'width': `${width}%`}"
+				:class="[`${arrangement === 'column' ? 'app-button-column' : arrangement === 'row' ? 'app-button-row' : arrangement === 'left' ? 'app-button-left': arrangement === 'topCenter' ? 'app-button-top-cross-center' : arrangement === 'a' ? 'app-left' : arrangement === 'b' ? 'app-left-between' : ''}`]"
+				formType="submit">
+				<slot></slot>
+			</button>
+		</template>
+		<!-- #endif -->
+	</form>
+	<button v-else :open-type="open_type === 'contact' ? 'contact': ''" hover-class="none"
+		:style="{'background-color': `${backgroundColor ? backgroundColor : '' }`, 'height': `${height}%`, 'width': `${width}%`}"
+		:class="[`${arrangement === 'column' ? 'app-button-column' : arrangement === 'row' ? 'app-button-row' :  arrangement === 'left' ? 'app-button-left':  arrangement === 'topCenter' ? 'app-button-top-cross-center' : arrangement === 'a' ? 'app-left' : arrangement === 'b' ? 'app-left-between' : ''}`]"
+		@click="jumpLogic">
+		<slot></slot>
+	</button>
+</template>
+
+<script>
+	import {
+		push
+	} from '../../../core/formId.js';
+
+	export default {
+		name: 'app-jump-button',
+		props: {
+			item: Object,
+			arrangement: {
+				type: String,
+				default: function() {
+					return 'row';
+				},
+				required: false
+			},
+			backgroundColor: {
+				type: String,
+				required: false
+			},
+			form: {
+				type: Boolean,
+				default: function() {
+					return true;
+				},
+				required: false
+			},
+			height: {
+				type: String,
+				default: function() {
+					return '100';
+				},
+				required: false
+			},
+			width: {
+				type: String,
+				default: function() {
+					return '100';
+				},
+				required: false
+			},
+			open_type: {
+				type: String,
+				default: function() {
+					return 'navigate';
+				},
+				required: false
+			},
+			url: {
+				type: String,
+				default: function() {
+					return '';
+				},
+				required: false
+			},
+			params: {
+				type: [Array, String],
+				default: function() {
+					return [];
+				},
+				required: false
+			},
+			number: {
+				type: String,
+				default: function() {
+					return '';
+				},
+				required: false
+			},
+			appId: {
+				type: String,
+				default: function() {
+					return '';
+				},
+				required: false
+			},
+			path: {
+				type: String,
+				default: function() {
+					return '';
+				},
+				required: false
+			},
+			latitude: {
+				type: String,
+				default: function() {
+					return '0';
+				},
+				required: false
+			},
+			longitude: {
+				type: String,
+				default: function() {
+					return '0';
+				},
+				required: false
+			},
+			address: {
+				type: String,
+				default: function() {
+					return '';
+				},
+				required: false
+			}
+		},
+		methods: {
+			jumpLogic(e) {
+				if (this.form) push(e.detail.formId);
+				console.log(this.open_type)
+				switch (this.open_type) {
+					case 'reLaunch':
+						uni.reLaunch({
+							url: this.url,
+						});
+						break;
+					case 'redirect':
+						uni.redirectTo({
+							url: this.url
+						});
+						break;
+					case 'navigate':
+						if (this.url) {
+							let url = this.url;
+							if (this.params != '""' && this.params && this.params.length > 0) {
+								let p = `?`;
+								for (let i = 0; i < this.params.length; i++) {
+									p += `${this.params[i].key}=${this.params[i].value}&`
+								}
+								url = url.split('?')[0];
+								url += p.slice(0, p.length - 1);
+							}
+							/* #ifdef MP-BAIDU */
+							if (this.url !== '/plugins/step/index/index') {
+								uni.navigateTo({
+									url: url
+								});
+							}
+							/* #endif */
+							/* #ifdef MP-TOUTIAO */
+							if (this.url !== '/plugins/step/index/index' && this.url.indexOf('/plugins/community') === -
+								1) {
+								uni.navigateTo({
+									url: url
+								});
+							}
+							/* #endif */
+							/* #ifdef MP-WEIXIN || MP-ALIPAY || H5 */
+							uni.navigateTo({
+								url: url
+							});
+							/* #endif */
+						}
+
+						break;
+					case 'app_admin':
+						if (this.$store.state.user.info.identity.is_admin == 1) {
+							uni.navigateTo({
+								url: this.url,
+							});
+						}
+						break;
+					case 'back':
+						uni.navigateBack({});
+						break;
+					case 'tel':
+						if (this.params.length === 1) {
+							uni.makePhoneCall({
+								phoneNumber: this.params[0].value
+							});
+						} else if (this.number) {
+							uni.makePhoneCall({
+								phoneNumber: this.number
+							});
+						} else {
+							uni.makePhoneCall({
+								phoneNumber: this.url.split('?')[1].split('=')[1],
+							});
+						}
+						break;
+					case 'web':
+						if (this.params.length > 0) {
+							uni.navigateTo({
+								url: `${this.url}?url=${encodeURIComponent(this.params[0].value)}`
+							});
+						} else {
+							uni.navigateTo({
+								url: this.url
+							});
+						}
+						break;
+						// #ifdef MP
+					case 'app':
+						if (this.url) {
+							let originalPath = '';
+							if (this.url !== 'app') {
+								originalPath = this.url.split('app?')[1];
+							} else {
+								for (let i = 0; i < this.params.length; i++) {
+									originalPath += `${this.params[i].key}=${this.params[i].value}&`;
+								}
+							}
+							if (typeof originalPath !== 'string') return;
+							let groups = originalPath.split('&');
+							let obj = {};
+							for (let i in groups) {
+								if (typeof groups[i] !== 'string') continue;
+								if (!groups[i].length) continue;
+								let kvs = groups[i].split('=');
+								if (kvs.length !== 2) {
+									let s = '';
+									for (let i = 1; i < kvs.length; i++) {
+										if (i + 1 === kvs.length) {
+											continue;
+										} else {
+											s += `${kvs[i]}=${kvs[i+1]}`
+										}
+									}
+									obj[kvs[0]] = s;
+								} else {
+									obj[kvs[0]] = kvs[1];
+								}
+							}
+							let params = obj;
+							let appId = '';
+							let path = '';
+							// #ifdef MP-WEIXIN
+							appId = params.app_id || '';
+							path = params.path || '';
+							// #endif
+							// #ifdef MP-ALIPAY
+							appId = params.ali_app_id || '';
+							path = params.ali_path || '';
+							// #endif
+							// #ifdef MP-TOUTIAO
+							appId = params.tt_app_id || '';
+							path = params.tt_path || '';
+							// #endif
+							// #ifdef MP-BAIDU
+							appId = params.bd_app_key || '';
+							path = params.bd_path || '';
+							// #endif
+							uni.navigateToMiniProgram({
+								appId: appId,
+								path: path
+							});
+						} else if (this.appId) {
+							uni.navigateToMiniProgram({
+								appId: this.appId,
+								path: this.path ? this.path : ''
+							});
+						}
+						break;
+						// #endif
+					case 'clear_cache':
+						uni.showModal({
+							content: '确定要清理缓存?',
+							cancelText: '取消',
+							confirmText: '确认',
+							success: (e) => {
+								if (e.confirm) {
+									this.$storage.clearStorage();
+									// #ifdef H5
+									this.$storage.setStorageSync('platform', 'wechat');
+									this.$storage.setStorageSync('isSign', true);
+									// #endif
+									if (this.$user && this.$store && this.$store.state.user.accessToken) {
+										this.$user.loginByToken(this.$store.state.user.accessToken);
+									}
+									this.$store.dispatch('mallConfig/actionResetConfig');
+									// uni.hideLoading();
+									uni.showToast({
+										title: '清理完成',
+										duration: 1000,
+										icon: 'none',
+									});
+								}
+							},
+						});
+						break;
+					case 'map':
+						uni.openLocation({
+							latitude: Number(this.latitude),
+							longitude: Number(this.longitude),
+							name: this.address,
+							address: this.address
+						});
+						break;
+					case 'share':
+						// uni.share({
+						//     provider: 'weixin',
+						//     type: 5,
+						//     imageUrl: 'https://img-cdn-qiniu.dcloud.net.cn/uniapp/app/share-logo@3.png',
+						//     title: '欢迎体验uniapp',
+						//     miniProgram: {
+						//         id: 'gh_abcdefg',
+						//         path: 'pages/index/index',
+						//         type: 0,
+						//         webUrl: 'http://uniapp.dcloud.io'
+						//     },
+						//     success: ret => {
+						//     }
+						// });
+						
+				}
+			},
+			getUrlParam(url, name) {
+				let search = url.split('?')[1];
+				if (search) {
+					let r = search.substr(0).match(new RegExp('(^|&)' + name + '=([^&]*)(&|$)'))
+					if (r !== null) {
+						return unescape(r[2])
+					}
+					return null
+				} else {
+					return null
+				}
+			}
+		},
+		// #ifdef H5
+		computed: {
+			isWechat: function() {
+				return this.$jwx.isWechat();
+			}
+		}
+		// #endif
+	}
+</script>
+
+<style scoped lang="scss">
+	button {
+		display: block;
+		line-height: inherit;
+		text-align: inherit;
+		padding: 0 0;
+		background: transparent;
+		border: none;
+		border-radius: 0;
+		overflow: inherit;
+		font-size: inherit;
+		color: inherit;
+	}
+
+	button:after {
+		display: none;
+	}
+
+	button.button-hover {
+		color: inherit;
+		background-color: transparent;
+	}
+
+	form {
+		display: block;
+		height: 100%;
+		width: 100%;
+	}
+
+	.app-button-column {
+		height: 100%;
+		width: 100%;
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.app-button-row {
+		height: 100%;
+		width: 100%;
+		display: flex;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.app-button-left {
+		height: 100%;
+		width: 100%;
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-start;
+	}
+
+	.app-button-top-cross-center {
+		display: -webkit-box;
+		display: -webkit-flex;
+		display: flex;
+		-webkit-box-orient: vertical;
+		-webkit-flex-direction: column;
+		flex-direction: column;
+		flex-wrap: nowrap;
+		-webkit-align-items: center;
+		align-items: center;
+	}
+
+	.app-left {
+		height: 100%;
+		width: 100%;
+		display: flex;
+		flex-direction: column;
+		justify-content: flex-start;
+	}
+
+	.app-left-between {
+		display: -webkit-box;
+		display: -webkit-flex;
+		display: flex;
+		-webkit-flex-direction: row;
+		flex-direction: row;
+		flex-wrap: nowrap;
+		justify-content: space-between;
+		align-items: center;
+	}
+</style>

+ 259 - 0
src/components/basic-component/app-layout/app-coupon-modal/app-coupon-modal.vue

xqd
@@ -0,0 +1,259 @@
+<!-- 初版 代和yu分支融合 -->
+<template>
+    <view class="app-coupon-modal main-center cross-center" v-if="coupon && coupon.list && coupon.list.length > 0">
+        <view class="coupon-modal">
+            <image class="title-img" :src="img"></image>
+            <view class="get-coupon-content">
+                <view v-if="coupon.type === `receive` && coupon.list[0].rest >= 0"
+                      class="rest dir-left-nowrap main-center cross-center">
+                    <view>还剩</view>
+                    <view class="rest-count">{{coupon.list[0].rest}}</view>
+                    <view>次领取次数</view>
+                </view>
+                <view class="invite coupon-head-label" v-if="coupon.type === `invite`">
+                    <view>成功邀请{{coupon.list[0].id}}位好友,获得奖励</view>
+                </view>
+                <view v-else class="coupon-head-label">*{{labelText}}</view>
+                <scroll-view scroll-y="true" class='coupon-list'>
+                    <view class="dir-left-nowrap cross-center coupon-item" v-for="(item, index) in coupon.list"
+                          :key="index">
+                        <view class="price box-grow-0" >
+                            <image v-if="item.share_type === 1" src='https://shop.9026.com/web/statics/img/mall/static/hongbao.png'/>
+                            <image v-if="item.share_type === 2" src='https://shop.9026.com/web/statics/img/mall/static/integral.png'/>
+                            <image v-if="item.share_type === 3" :src="item.pic_url" class="card"/>
+                            <block v-if="item.share_type === 4">
+                                <template v-if="item.type == 2">
+                                    <app-price :price="item.sub_price"></app-price>
+                                </template>
+                                <template v-else>
+                                    <view class="discount">{{item.discount}}</view>
+                                </template>
+                            </block>
+                        </view>
+                        <view class="right dir-top-nowrap main-center box-grow-1">
+                            <view v-if="[1,2,3].includes(item.share_type)"
+                                  :class="[`t-omit${item.share_type === 3 ? '-two': ''}`]">{{item.name}}
+                            </view>
+                            <view v-else class="t-omit">{{item.name}}</view>
+
+                            <view class="t-omit content">{{item.content}}</view>
+                            <view class="content" v-if="item.discount_limit">优惠上限:¥{{item.discount_limit}}</view>
+                        </view>
+                        <view class="box-grow-0 btn"  @click="toGoods(item.page_url)">
+                            去使用
+                        </view>
+                    </view>
+                </scroll-view>
+            </view>
+            <view class='main-center' @click='closeCouponBox'>
+                <image src='https://shop.9026.com/web/statics/image/mall/static/icon/icon-popup-close.png' class="bottom-close"></image>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    import {mapState} from "vuex";
+    import appPrice from "../../../page-component/goods/app-price.vue";
+
+    export default {
+        name: "app-coupon-modal",
+        components: {
+            'app-price': appPrice,
+        },
+        data() {
+            return {};
+        },
+        computed: {
+            ...mapState({
+                mallConfig: state => state.mallConfig,
+                coupon: state => state.page.coupon
+            }),
+            labelText() {
+                if (this.coupon && this.coupon.list && this.coupon.list.length) {
+                    const first = this.coupon.list[0];
+                    switch (first.share_type) {
+                        case 4:
+                            return '优惠券已发放到账户,请到我的优惠券查看';
+                        case 2:
+                            return '积分已发放到账户,请到我的积分查看';
+                        case 1:
+                            return '余额红包已发放到账户,请到我的余额查看';
+                        case 3:
+                            return '卡劵已发放到账户,请到我的卡劵查看';
+                        default:
+                            return '';
+                    }
+                }
+            },
+            img() {
+                let img = '';
+                if (this.coupon.type == 'register') {
+                    img = this.mallConfig.__wxapp_img.coupon.get_coupon_title;
+                } else if (this.coupon.type == 'share') {
+                    img = this.mallConfig.__wxapp_img.coupon.get_coupon_share;
+                } else if (this.coupon.type == 'receive') {
+                    img = this.mallConfig.__wxapp_img.coupon.get_coupon_receive;
+                } else if (this.coupon.type === 'award') {
+                    img = this.mallConfig.__wxapp_img.coupon.get_coupon_award;
+                }
+                return img
+            }
+        },
+        methods: {
+            closeCouponBox() {
+                let coupon = {
+                    list: [],
+                    type: ''
+                };
+                this.$store.dispatch('page/actionSetCoupon', coupon)
+            },
+            toGoods(page_url) {
+                uni.navigateTo({
+                    url: page_url
+                });
+                this.closeCouponBox();
+            },
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .invite {
+        text-align: center;
+        margin-top: #{20px - 24px};
+
+        view {
+            padding: #{16rpx} #{24rpx};
+            color: #ffffff;
+            background: rgba(0, 0, 0, 0.2);
+            font-size: #{26rpx};
+            line-height: 1;
+            display: inline-block;
+            border-radius: #{34rpx};
+        }
+    }
+
+    .invite-text {
+        font-size: #{22rpx};
+        line-height: 1;
+        padding-top: #{16rpx};
+
+        text:first-child {
+            color: #ffee01;
+            font-weight: bold;
+        }
+    }
+
+    .app-coupon-modal {
+        position: fixed;
+        top: 0;
+        left: 0;
+        width: 100%;
+        height: 100%;
+        background: rgba(0, 0, 0, 0.5);
+        z-index: 1700;
+
+        .coupon-modal {
+            width: 100%;
+            overflow: visible;
+            margin-top: #{-50rpx};
+
+            .title-img {
+                width: #{750rpx};
+                height: #{360rpx};
+                display: block;
+            }
+
+            .get-coupon-content {
+                width: #{580rpx};
+                background: #ef3030;
+                border-radius: 0 0 #{16rpx 16rpx};
+                padding: #{24rpx 30rpx 30rpx 30rpx};
+                margin: 0 auto;
+                color: #ffffff;
+                font-size: $uni-font-size-weak-two;
+
+                .rest {
+                    color: #ffffff;
+                    font-size: $uni-font-size-general-one;
+                    margin-bottom: #{24rpx};
+
+                    .rest-count {
+                        color: #EE3030;
+                        font-size: $uni-font-size-import-one;
+                        background-color: #ffffff;
+                        padding: #{0 10rpx};
+                        margin: #{0 10rpx};
+                        border-radius: #{4rpx};
+                    }
+                }
+
+                .coupon-head-label {
+                    margin-bottom: #{16rpx};
+                }
+
+                .coupon-list {
+                    max-height: #{312rpx};
+
+                    view:first-child {
+                        margin-top: 0;
+                    }
+
+                    .coupon-item {
+                        width: 100%;
+                        padding: #{0 32rpx};
+                        margin-top: #{16rpx};
+                        border-radius: #{16rpx};
+                        background-color: #ffffff;
+                        height: #{144rpx};
+
+                        .price {
+                            font-size: #{56rpx};
+                            color: #ff4544;
+                            .discount:after {
+                                content: '折';
+                                font-size: 50%;
+                            }
+
+                            image {
+                                height: #{80rpx};
+                                width: #{80rpx};
+                                display: block;
+                            }
+
+                            .card {
+                                border-radius: 50%;
+                            }
+                        }
+
+                        .right {
+                            margin-left: #{26rpx};
+                            font-size: $uni-font-size-general-one;
+                            color: $uni-important-color-black;
+
+                            .content {
+                                font-size: #{$uni-font-size-weak-two};
+                                color: $uni-general-color-two;
+                            }
+                        }
+
+                        .btn {
+                            padding: #{12rpx 16rpx};
+                            border-radius: #{50rpx};
+                            font-size: $uni-font-size-weak-one;
+                            margin-left: #{19rpx};
+                            background-color: #ff4544;
+                        }
+                    }
+                }
+            }
+
+            .bottom-close {
+                width: #{30rpx};
+                height: #{30rpx};
+                margin-top: #{64rpx};
+            }
+        }
+    }
+</style>

+ 383 - 0
src/components/basic-component/app-layout/app-layout.vue

xqd
@@ -0,0 +1,383 @@
+<template>
+    <!--   #ifdef MP -->
+    <view class="app-layout" :style="[layoutStyle]" :class="haveBackground ? 'app-layout-background' : ''" >
+        <app-prompt-box v-if="promptBox.show" :text="promptBox.text"></app-prompt-box>
+        <app-user-login v-if="isGuest"></app-user-login>
+        <!--#ifndef MP_BAIDU-->
+        <u-iphone-frame v-else-if="!isGuest && is_mobile_auth == 1"></u-iphone-frame>
+        <!--#endif-->
+        <app-payment></app-payment>
+        <app-report-error :content="reportAndError.content" v-if="reportAndError.boolean"></app-report-error>
+        <app-coupon-modal></app-coupon-modal>
+        <view>
+            <slot></slot>
+        </view>
+        <app-loading :type="loadingType" :text="loadingText" :color="loadingColor" v-if="loadingIsShow"
+                     :backgroundImage="loadingBackgroundImage"></app-loading>
+        <template v-if="tabbarbool">
+            <view class="safe-area-inset-bottom">
+                <view :style="{height: '110rpx'}" class="nav-margin "
+                      :class="haveBackground ? 'app-layout-background' : ''"></view>
+            </view>
+            <app-tab-bar :page-count="page_count"></app-tab-bar>
+        </template>
+    </view>
+    <!--    #endif-->
+    <!--   #ifdef H5 -->
+    <view class="app-layout" :style="[layoutStyle]" :class="haveBackground ? 'app-layout-background' : ''" v-if="isSign">
+        <app-prompt-box v-if="promptBox.show" :text="promptBox.text"></app-prompt-box>
+        <app-user-login v-if="isGuest"></app-user-login>
+        <bd-mandatory-attention v-if="attention"></bd-mandatory-attention>
+        <app-payment></app-payment>
+        <app-wechat-share></app-wechat-share>
+        <app-report-error :content="reportAndError.content" v-if="reportAndError.boolean"></app-report-error>
+        <app-coupon-modal></app-coupon-modal>
+        <view>
+            <slot></slot>
+        </view>
+        <app-loading :type="loadingType" :text="loadingText" :color="loadingColor" v-if="loadingIsShow"
+                     :backgroundImage="loadingBackgroundImage"></app-loading>
+        <template v-if="tabbarbool">
+            <view class="safe-area-inset-bottom">
+                <view :style="{height: '110rpx'}" class="nav-margin "
+                      :class="haveBackground ? 'app-layout-background' : ''"></view>
+            </view>
+            <app-tab-bar :page-count="page_count"></app-tab-bar>
+        </template>
+    </view>
+    <!--    #endif-->
+</template>
+
+<script>
+   import {mapState, mapGetters} from 'vuex';
+   import appTabBar from '../../../components/basic-component/app-tab-bar/app-tab-bar.vue';
+   import AppPayment from './app-payment/app-payment';
+   import tabBar from '../../../core/tabbar.js';
+   import AppUserLogin from './app-user-login/app-user-login';
+   import appLoading from '../app-loading/app-loading.vue';
+   import appRepeatError from '../app-report-error/app-report-error.vue';
+   import appPromptBox from '../app-prompt-box/app-prompt-box.vue';
+   import appCouponModal from "./app-coupon-modal/app-coupon-modal.vue";
+   // #ifndef MP_BAIDU
+   import uIphoneFrame from './u-authorized-iphone/u-authorized-iphone.vue';
+   // #endif
+   // #ifdef H5
+   import bdMandatoryAttention from './bd-mandatory-attention/bd-mandatory-attention.vue';
+   import appWechatShare from "../../page-component/app-common/app-wechat-share.vue";
+   // #endif
+
+   export default {
+       name: "app-layout",
+       data() {
+           return {
+               currentRoute: '',
+               tabbarbool: true,
+               navigationBarTitle: '',
+               page_count: getCurrentPages().length,
+               isAttention:false
+           };
+       },
+       components: {
+           'app-tab-bar': appTabBar,
+           'app-payment': AppPayment,
+           'app-user-login': AppUserLogin,
+           'app-loading': appLoading,
+           'app-report-error': appRepeatError,
+           'app-prompt-box': appPromptBox,
+           'app-coupon-modal': appCouponModal,
+           // #ifndef MP_BAIDU
+           'u-iphone-frame': uIphoneFrame,
+            // #endif
+            // #ifdef H5
+            'bd-mandatory-attention': bdMandatoryAttention,
+            appWechatShare,
+            // #endif
+       },
+       props: {
+           haveBackground: {
+               type: Boolean,
+               default() {
+                   return true;
+               }
+           },
+            overflow: {
+                type: Boolean,
+                default() {
+                    return true;
+                }
+            }
+       },
+       computed: {
+           ...mapState('mallConfig', {
+               tabBarNavs: state => state.navbar.navs,
+               bar_title: state => state.bar_title,
+               top_background_color: state => state.navbar.top_background_color,
+               top_text_color: state => state.navbar.top_text_color,
+               bottom_background_color: (state) => {
+                   return state.navbar.bottom_background_color;
+               },
+               is_must_login: state => state.mall.setting.is_must_login,
+               // #ifndef MP_BAIDU
+               is_mobile_auth: state => state.mall.setting.is_mobile_auth
+               // #endif
+           }),
+           ...mapState('user', {
+               accessToken: state => state.accessToken,
+           }),
+           ...mapState('gConfig', {
+               reportAndError: state => state.reportAndError,
+               promptBox: state => state.promptBox,
+               iphone: (data) => {
+                   return data.iphone;
+               },
+           }),
+           isGuest() {
+               if ((this.$store.state.user.accessToken === '' || this.$store.state.user.accessToken === null) && 1) {
+                   return true;
+               } else {
+                   return false;
+               }
+           },
+           ...mapState('loading', {
+               loadingType: state => state.type,
+               loadingText: state => state.text,
+               loadingColor: state => state.color,
+               loadingBackgroundImage: state => state.backgroundImage,
+               loadingIsShow: state => state.isShow,
+           }),
+           ...mapGetters('iPhoneX', {
+               BotHeight: 'getBotHeight',
+               getNavHei: 'getNavHei',
+           }),
+           // #ifdef H5
+           ...mapGetters({
+               userInfo: 'user/info',
+               showAttention: 'user/showAttention'
+           }),
+           isSign: function() {
+               return this.$storage.getStorageSync('isSign');
+           },
+           // #endif
+           layoutStyle() {
+               if (this.overflow) {
+                   return {
+                       overflow: 'hidden'
+                   }
+               } else {
+                   return ''
+               }
+           },
+            // #ifdef H5
+            attention: function() {
+                return this.showAttention && this.$jwx.isWechat();
+            }
+            // #endif
+       },
+       watch: {
+           tabBarNavs: {
+               handler: function () {
+                   this.setTabbar();
+                   // #ifndef MP-TOUTIAO
+                   if (this.top_background_color !== undefined) {
+                       uni.setNavigationBarColor({
+                           backgroundColor: this.top_background_color,
+                           // #ifndef MP-ALIPAY
+                           frontColor: this.top_text_color,
+                           // #endif
+                       });
+                   }
+                   // #endif
+               },
+               immediate: true,
+           },
+           is_must_login: {
+               handler: function () {
+                    if ((this.$user.isLogin() || this.is_must_login === 1) && this.$platDiff.route() != '/pages/disabled/disabled') {
+                        this.$store.dispatch('user/info');
+                    }
+               },
+               immediate: true,
+           },
+           accessToken: {
+               handler: function () {
+                   if (!this.accessToken) {
+                    this.$store.commit('user/info', null);
+                   }
+               },
+               immediate: true,
+           },
+           // #ifdef H5
+           '$route': {
+               handler: function(data) {
+                   let { query, meta } = data;
+                   let str = '?';
+                   for (let key in query) {
+                       str += `${key}=${query[key]}&`
+                   }
+                   str.slice(0, str.length - 1);
+               },
+               deep: true
+           },
+           isSign: {
+               handler(newVal) {
+                   if (newVal) {
+                       // #ifndef H5
+                       if (this.top_background_color !== undefined) {
+                           uni.setNavigationBarColor({
+                               backgroundColor: this.top_background_color,
+                               frontColor: this.top_text_color,
+                           });
+                       }
+                       // #endif
+                   }
+               },
+               deep: true,
+               immediate: true
+           }
+           // #endif
+       },
+       created() {
+           this.$store.dispatch('mallConfig/actionGetConfig');
+           this.$nextTick(() => {
+               // #ifdef MP
+               let currentRoute = this.$platDiff.route();
+               // #endif
+               // #ifdef H5
+               let hash = window.location.hash;
+               if (hash.split('#')[1] === '/' || hash.split('#')[1].indexOf('/?id') > -1) {
+                   hash = '/pages/index/index';
+               }
+               let currentRoute = hash;
+               // #endif
+               tabBar.setNavigationBarTitle(this.bar_title, currentRoute).then(res => {
+                   if(currentRoute != '/pages/article/article-detail/article-detail') {
+                       this.navigationBarTitle = res;
+                   }
+               });
+           });
+           if ((this.$user.isLogin() || this.is_must_login === 1) && this.$platDiff.route() != '/pages/disabled/disabled') {
+               this.$store.dispatch('user/info');
+           }
+           this.$hideLoading();
+       },
+       mounted() {
+           // #ifdef MP-WEIXIN
+           // 直播转发绑定分销关系
+           try {
+               let pages = getCurrentPages();
+               if (pages.length) {
+                   let page = pages[pages.length - 1];
+                   let options = page.options;
+                   let customParams = {};
+                   if (typeof options.custom_params !== 'undefined') {
+                       customParams = JSON.parse(decodeURIComponent(options.custom_params));
+                   }
+                   if (typeof options.user_id !== 'undefined') {
+                       this.$store.dispatch('user/setTempParentId', options.user_id)
+                   } else if (typeof customParams.user_id !== 'undefined') {
+                       this.$store.dispatch('user/setTempParentId', customParams.user_id)
+                   }
+               }
+           } catch (e) {
+           }
+           // #endif
+
+           this.currentRoute = this.$platDiff.tabBarUrl(null, this.page_count);
+           this.setTabbar();
+
+           // #ifdef MP
+           // #ifndef MP-TOUTIAO
+           if (this.top_background_color !== undefined) {
+               uni.setNavigationBarColor({
+                   backgroundColor: this.top_background_color,
+                   // #ifndef MP-ALIPAY
+                   frontColor: this.top_text_color,
+                   // #endif
+               });
+           }
+           // #endif
+           // #endif
+       },
+       beforeDestroy() {
+           this.$hideLoading();
+       },
+       methods: {
+           touchMove() {
+               return true;
+           },
+           setTabbar() {
+               let currentRoute = this.currentRoute;
+               if (
+                   this.$appScene
+                   && [1001, 1045, 1046, 1058, 1067, 1084, 1091].indexOf(this.$appScene) > -1
+                   && (currentRoute.indexOf('appid') > -1 || currentRoute.indexOf('appmsg_compact_url') > -1 || currentRoute .indexOf('wxwork_userid') > -1 || currentRoute .indexOf('weixinadinfo') > -1 || currentRoute .indexOf('gdt_vid') > -1)
+               ) {
+                   currentRoute = this.$utils.deleteUrlParam(currentRoute, ['appid', 'appmsg_compact_url', 'wxwork_userid', 'weixinadinfo', 'gdt_vid'], true);
+               }
+		console.log(currentRoute,"--------=========")
+		console.log(this.tabBarNavs,"---------=========")
+               for (let i = 0; i < this.tabBarNavs.length; i++) {
+                   if (currentRoute == this.tabBarNavs[i].url) {
+                       return this.tabbarbool = true;
+                   }
+               }
+		console.log(this.tabbarbool)
+               return this.tabbarbool = false;
+           },
+           // #ifdef H5
+           getUrlParam(name) {
+               let url = window.location.href.split('#')[0];
+               let search = url.split('?')[1]
+               if (search) {
+                   let r = search.substr(0).match(new RegExp('(^|&)' + name + '=([^&]*)(&|$)'))
+                   if (r !== null) return unescape(r[2])
+                   return null
+               } else {
+                   return null
+               }
+           }
+           // #endif
+       }
+   }
+</script>
+
+<style scoped lang="scss">
+   .app-layout {
+       max-width: 100%;
+       //#ifdef MP-ALIPAY
+       position: relative;
+       min-height: 100vh;
+       z-index: 1;
+       //#endif
+   }
+
+   .app-layout-background {
+       background-color: #f7f7f7;
+   }
+
+   .app-scroll-y {
+       width: 100%;
+       height: 100%;
+   }
+
+   .app-bottom {
+       height: #{160rpx};
+   }
+
+   .nav-margin {
+       width: #{750rpx};
+   }
+
+   .app-tabbar {
+       height: #{110rpx};
+   }
+
+   .model {
+       position: fixed;
+       bottom: 0;
+       left: 0;
+       width: #{750rpx};
+       height: #{50rpx};
+       z-index: 1600;
+   }
+</style>

+ 899 - 0
src/components/basic-component/app-layout/app-payment/app-payment.vue

xqd
@@ -0,0 +1,899 @@
+<!-- 全局支付组件 -->
+<template>
+	<view class="app-payment main-center cross-center" :class="showPayment?'show':''">
+		<view class="modal" v-if="payData">
+			<view class="title">
+				<view>支付方式</view>
+				<view class="cancel" @click="cancel">
+					<image src="https://shop.9026.com/web/statics/image/mall/static/icon/close.png"></image>
+				</view>
+			</view>
+			<view class="pay-amount">支付金额 ¥{{balance <0 ? setPrice(payData.amount, balance) : payData.amount}} 元</view>
+			<view class="pay-type-list">
+				<view v-for="(item, index) in payData.list" @click="checkPayType(index)" :key="index"
+					class="pay-type-item cross-center">
+					<view class="box-grow-0">
+						<image class="pay-type-icon" :src="item.icon"></image>
+					</view>
+					<view class="box-grow-1">
+						<view class="pay-type-name">{{item.name}}</view>
+						<view class="pay-type-desc" v-if="item.desc">{{item.desc}}</view>
+					</view>
+					<view class="box-grow-0">
+						<view v-if="item.key === 'balance' && item.desc === '账户余额不足'" style="height: 26rpx;width:113rpx"
+							@click.prevent.stop="navPay">
+							<image style="height: 100%;width:100%" load-lazy="true"
+								src="https://shop.9026.com/web/statics/img/mall/static/pay-td.png"></image>
+						</view>
+						<app-radio v-else-if="item.checked" :theme="getTheme" v-model="item.checked" type="round">
+						</app-radio>
+					</view>
+					<view class="into-modal main-center cross-center" v-if="printPassword && item.key === 'balance'">
+						<view class="password-tip" v-if="item.is_pay_password == 0 && !setPassword">
+							<view class="password-content dir-top-nowrap main-center cross-center">
+								<view>您的账户尚未设置余额支付密码</view>
+								<view>是否立即设置?</view>
+							</view>
+							<view class="password-btn main-center cross-center">
+								<view @click="payByBalance">暂不设置</view>
+								<view class="line"></view>
+								<view @click="setPassword = !setPassword;password=''" :style="{'color':getTheme.color}">
+									确认</view>
+							</view>
+						</view>
+						<view class="password-view" v-else-if="printPassword">
+							<image class="password-close"
+								@click="printPassword = false;setPassword = false;verifyPassword = false;"
+								src="https://shop.9026.com/web/statics/image/mall/static/icon/icon-close.png"></image>
+							<view class="password-title">请{{verifyPassword ? '确认':'输入'}}余额支付密码</view>
+							<!-- #ifdef MP-ALIPAY -->
+							<input type="number" :class="!haveFocus ? 'input' :''" @focus="haveFocus=true"
+								@input="passwordInput" @blur="haveFocus=false;getFocus=false" v-model="password">
+							<!-- #endif -->
+							<!-- #ifdef MP-WEIXIN -->
+							<input type="number" style="top:0;right: 400%" @input="passwordInput" :focus="getFocus"
+								@blur="getFocus=false" v-model="password">
+							<!-- #endif -->
+							<!-- #ifndef MP-ALIPAY || MP-WEIXIN -->
+							<input type="number" v-show="getFocus" style="top:0;right: 400%" @input="passwordInput"
+								:focus="getFocus" @blur="getFocus=false" v-model="password">
+							<!-- #endif -->
+							<view @click="getInputFocus" class="passoword-input main-center cross-center">
+								<view class="password-item main-center cross-center">
+									<view v-if="password.length > 0" class="password-placeholder"></view>
+								</view>
+								<view class="password-item main-center cross-center">
+									<view v-if="password.length > 1" class="password-placeholder"></view>
+								</view>
+								<view class="password-item main-center cross-center">
+									<view v-if="password.length > 2" class="password-placeholder"></view>
+								</view>
+								<view class="password-item main-center cross-center">
+									<view v-if="password.length > 3" class="password-placeholder"></view>
+								</view>
+								<view class="password-item main-center cross-center">
+									<view v-if="password.length > 4" class="password-placeholder"></view>
+								</view>
+								<view class="password-item main-center cross-center">
+									<view v-if="password.length > 5" class="password-placeholder"></view>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="footer">
+				<!--  #ifdef MP -->
+				<app-button type="important" :theme="getTheme" @click="confirm" round>提交订单</app-button>
+				<!--  #endif-->
+				<!--  #ifdef H5 -->
+				<app-button type="important" :theme="getTheme" @click.native.stop="confirm" round>提交订单</app-button>
+				<!--  #endif-->
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import Vue from 'vue';
+	import {
+		mapGetters,
+		mapState
+	} from 'vuex';
+	import AppRadio from '@/components/basic-component/app-radio/app-radio';
+
+	export default {
+		name: 'app-payment',
+		components: {
+			AppRadio
+		},
+		computed: {
+			...mapState({
+				mall: state => state.mallConfig.mall,
+				userInfo: state => state.user.info,
+				showPayment: function(state) {
+					return state.payment.showPayment;
+				},
+				payData: state => state.payment.payData,
+			}),
+			...mapGetters('mallConfig', {
+				getTheme: 'getTheme',
+			}),
+		},
+		data() {
+			return {
+				balance: 0, // 余额
+				is_need_pay_password: 0,
+				haveFocus: false,
+				getFocus: false,
+				printPassword: false,
+				setPassword: false,
+				verifyPassword: false,
+				password: '',
+				verify_pay_password: '',
+				pay_password: '',
+				payPassword: '',
+			}
+		},
+		created() {
+			this.setPayment();
+			this.getSetting();
+		},
+		destroyed(){
+			this.$store.commit('payment/showPayment', false);
+		},
+		methods: {
+			getInputFocus() {
+				this.$nextTick(() => {
+					this.getFocus = true;
+				})
+			},
+			passwordInput() {
+				if (this.password.length == 6) {
+					setTimeout(() => {
+						if (this.setPassword) {
+							this.setPayPassword();
+						} else {
+							uni.showLoading({
+								mask: true
+							});
+							uni.hideKeyboard();
+							this.verifyPayPassword();
+						}
+					})
+				}
+			},
+			setPayPassword() {
+				if (this.password.length < 6) {
+					return false;
+				}
+				if (!this.verifyPassword) {
+					this.pay_password = this.password.toString().substring(0, 6);
+					this.verifyPassword = true;
+					this.password = '';
+				} else {
+					this.verify_pay_password = this.password.toString().substring(0, 6);;
+					if (this.pay_password === this.verify_pay_password) {
+						uni.showLoading({
+							mask: true
+						});
+						let data = {
+							pay_password: this.pay_password,
+							verify_pay_password: this.verify_pay_password,
+						}
+						this.$request({
+							url: this.$api.member.set_password,
+							method: "post",
+							data: data
+						}).then(response => {
+							uni.hideLoading();
+							if (response.code === 0) {
+								this.payPassword = this.pay_password;
+								this.printPassword = false;
+								this.setPassword = false;
+								this.verifyPassword = false;
+								this.password = '';
+								this.pay_password = '';
+								this.verify_pay_password = '';
+								this.$store.commit('payment/showPayment', false);
+								this.payByBalance();
+							} else {
+								this.password = '';
+								this.pay_password = '';
+								this.verify_pay_password = '';
+								uni.showToast({
+									icon: 'none',
+									title: response.msg
+								});
+							}
+						});
+					} else {
+						this.verifyPassword = false;
+						this.password = '';
+						this.pay_password = '';
+						this.verify_pay_password = '';
+						uni.showToast({
+							icon: 'none',
+							title: '两次输入的密码不一致'
+						})
+					}
+				}
+			},
+			navPay() {
+				this.$store.commit('payment/showPayment', false);
+				this.$store.state.payment.reject({
+					errMsg: '5b03b6e009796c698d132908cb635fca',
+				});
+				uni.navigateTo({
+					url: "/pages/balance/recharge"
+				});
+			},
+			// 获取余额接口
+			getSetting: function() {
+				if ((this.$store.state.user.accessToken === '' || this.$store.state.user.accessToken === null)) {
+					return true;
+				}
+				const self = this;
+				self.$request({
+					url: self.$api.balance.index,
+				}).then(info => {
+					if (info.code === 0) {
+						this.balance = Number(info.data.balance);
+					}
+				});
+			},
+			setPrice(price, balance) {
+				price = Number(price)
+				balance = Math.abs(balance)
+				return price + balance
+			},
+			setPayment() {
+				const vm = this;
+				Vue.use({
+					install(Vue, options) {
+						Vue.prototype.$payment = {
+							pay: vm.pay,
+						};
+					},
+				});
+			},
+			pay(id) {
+				return new Promise((resolve, reject) => {
+					this.$store.commit('payment/setAll', {
+						showPayment: false,
+						payData: null,
+						payType: null,
+						id: id,
+						resolve: resolve,
+						reject: reject,
+					});
+					console.log('debug payment, setAll ok, id:', this.$store.state.payment.id);
+					console.log('debug payment, setAll ok, resolve:', this.$store.state.payment.resolve);
+					console.log('debug payment, setAll ok, reject:', this.$store.state.payment.reject);
+					uni.showLoading({
+						mask: true,
+						title: '请求支付...',
+					});
+					this.$request({
+						url: this.$api.payment.get_payments,
+						data: {
+							id: id,
+						}
+					}).then(response => {
+						uni.hideLoading();
+						console.log('debug 1--->', response);
+						if (response.code === 0) {
+							console.log('debug payment, set resolve 2,', this.$store.state.payment
+							.resolve);
+							return this.showPaymentModal(response.data);
+						} else {
+							response.errMsg = response.msg || '';
+							return this.$store.state.payment.reject(response.msg);
+						}
+					}).catch(e => {
+						uni.hideLoading();
+						e.errMsg = e.msg || '';
+						return this.$store.state.payment.reject(e);
+					});
+				});
+			},
+			showPaymentModal(data) {
+				console.log('debug 2--->', data);
+				for (let i in data.list) {
+					if (typeof data.list[i].checked === 'undefined') {
+						data.list[i].checked = false;
+					}
+				}
+				this.$store.commit('payment/payData', data);
+				if (data.amount === 0 || data.amount === 0.00 || data.amount === '0' || data.amount === '0.00') {
+					this.$store.commit('payment/payType', 'balance');
+					for (let i in this.$store.state.payment.payData.list) {
+						if (this.$store.state.payment.payData.list[i].key === 'balance') {
+							this.$store.state.payment.payData.list[i].checked = true;
+						} else {
+							this.$store.state.payment.payData.list[i].checked = false;
+						}
+					}
+					this.confirm();
+					return;
+				}
+				this.$store.commit('payment/showPayment', true);
+			},
+			confirm() {
+				console.log('payment confirm 1:');
+				console.log('debug payment, confirm 1,', this.$store.state.payment.resolve);
+				for (let i in this.$store.state.payment.payData.list) {
+					if (this.$store.state.payment.payData.list[i].checked) {
+						this.$store.commit('payment/payType', this.$store.state.payment.payData.list[i].key);
+					}
+				}
+				if (!this.$store.state.payment.payType) {
+					uni.showModal({
+						title: '提示',
+						content: '请选择支付方式',
+						showCancel: false,
+					});
+					return;
+				}
+				this.$store.commit('payment/showPayment', false);
+				console.log('payment confirm 2:', this.$store.state.payment.payType);
+				console.log('debug payment, confirm 2,', this.$store.state.payment.resolve);
+				return this.getPayData();
+			},
+			cancel() {
+				this.$store.commit('payment/showPayment', false);
+				return this.$store.state.payment.reject({
+					errMsg: '支付取消',
+				});
+			},
+			checkPayType(index) {
+				if (this.$store.state.payment.payData.list[index].disabled || this.$store.state.payment.payData.list[index]
+					.checked) {
+					return false;
+				}
+				const payData = this.$store.state.payment.payData;
+				for (let i in payData.list) {
+					if (i == index) {
+						payData.list[i].checked = true;
+					} else {
+						payData.list[i].checked = false;
+					}
+				}
+				this.$store.commit('payment/payData', payData);
+			},
+			getPayData() {
+				console.log('debug payment, getPayData 1,', this.$store.state.payment.resolve);
+				uni.showLoading({
+					mask: true,
+					title: '请求支付...',
+				});
+				let _this = this;
+				let data = {
+					id: this.$store.state.payment.id,
+					pay_type: this.$store.state.payment.payType,
+				}
+				// #ifdef H5
+				this.$storage.setStorageSync('WEB_URL', window.location.href + '&pay_id_weChart=' + data.id +
+					'&isWechat=true');
+				if (window.location.hash.indexOf('/pages/balance/recharge') > -1) {
+					data.url = window.location.href.split('#')[0] + '#/pages/balance/recharge?isPay=ture';
+				} else {
+					if (window.location.hash.indexOf('?') > -1) {
+						data.url = window.location.href + '&isPay=ture'
+					} else {
+						data.url = window.location.href + '?isPay=ture'
+					}
+				}
+				data.url += `&isWechat=true&payType=${this.$store.state.payment.payType}`
+				if (!this.$jwx.isWechat()) {
+					data.url += '&pay_id_weChart=' + data.id
+				}
+				// #endif
+				this.$request({
+					url: this.$api.payment.pay_data,
+					data: data
+				}).then(response => {
+					uni.hideLoading();
+					if (response.code === 0) {
+						switch (this.$store.state.payment.payType) {
+							case 'balance':
+								this.callBranch(response.data);
+								break;
+							case 'huodao':
+								this.callHuodao(response.data);
+								break;
+								// #ifdef H5
+							case 'wechat_h5':
+								console.log('debug payment, wechat_h5');
+								this.$jwx.chooseWXPay({
+									timestamp: response.data.timeStamp,
+									nonceStr: response.data.nonceStr,
+									packAge: response.data.package,
+									signType: response.data.signType,
+									paySign: response.data.paySign,
+									webUrl: response.data.mweb_url,
+									success() {
+										_this.$store.state.payment.resolve({
+											errMsg: '支付成功',
+										});
+									},
+									fail(res) {
+										_this.$store.state.payment.reject({
+											errMsg: res.msg
+										});
+									}
+								});
+								uni.showModal({
+									content: '确定已完成支付?',
+									confirmText: '确定',
+									cancelText: '返回支付',
+									success(res) {
+										if (res.confirm) {
+											_this.weChartPay(_this.$store.state.payment.id);
+										} else if (res.cancel) {
+											_this.$store.state.payment.reject({
+												errMsg: '支付取消'
+											});
+										}
+									}
+								});
+								break;
+							case 'alipay_h5':
+								if (this.$jwx.isWechat()) {
+									_AP.pay(response.data.url);
+								} else {
+									window.location.href = response.data.url;
+									uni.showModal({
+										content: '确定已完成支付?',
+										confirmText: '确定',
+										cancelText: '返回支付',
+										success(res) {
+											if (res.confirm) {
+												_this.weChartPay(_this.$store.state.payment.id);
+												// _this.$store.state.payment.resolve({
+												//     errMsg: '支付成功',
+												// });
+											} else if (res.cancel) {
+												_this.$store.state.payment.reject({
+													errMsg: '支付取消'
+												});
+											}
+										},
+										fail() {}
+									});
+								}
+								console.log('debug payment, alipay_h5');
+								break;
+								// #endif
+							default:
+								// #ifdef MP
+								console.log('debug payment, getPayData 2,', this.$store.state.payment.resolve);
+								this.callPlatformPayment(response.data);
+								// #endif
+								break;
+						}
+					} else {
+						return this.$store.state.payment.reject(response.msg);
+					}
+				}).catch(e => {
+					uni.hideLoading();
+					e.errMsg = e.msg || '';
+					return this.$store.state.payment.reject(e);
+				});
+			},
+			callBranch(data) {
+				let that = this;
+				if (data.order_amount === 0 || data.order_amount === 0.00 || data.order_amount === '0' || data
+					.order_amount === '0.00') {
+					this.payByBalance();
+				} else {
+					uni.showModal({
+						title: '余额支付确认',
+						content: `账户余额:${data.balance_amount},支付金额:${data.order_amount}`,
+						success: (e) => {
+							if (e.confirm) {
+								for (let item of this.payData.list) {
+									if (item.key == 'balance') {
+										if (item.is_open_pay_password == 1) {
+											this.payPassword = '';
+											this.is_need_pay_password = item.is_pay_password;
+											this.password = '';
+											this.$store.commit('payment/showPayment', true);
+											this.printPassword = true;
+											setTimeout(() => {
+												this.getFocus = true;
+											}, 800)
+										} else {
+											this.payByBalance();
+										}
+										break
+									}
+								}
+							} else {
+								return this.$store.state.payment.reject({
+									errMsg: '支付取消.',
+								});
+							}
+						}
+					});
+				}
+			},
+			verifyPayPassword() {
+				if (this.password.length < 6) {
+					return false;
+				}
+				this.payPassword = this.password.toString().substring(0, 6);
+				this.$request({
+					url: this.$api.member.verify_password,
+					data: {
+						pay_password: this.payPassword,
+					},
+					method: 'post'
+				}).then(response => {
+					this.password = '';
+					uni.hideLoading();
+					if (response.code === 0) {
+						this.$store.commit('payment/showPayment', false);
+						this.payByBalance();
+					} else {
+						this.password = '';
+						this.payPassword = '';
+						uni.showModal({
+							title: '提示',
+							content: response.msg,
+							showCancel: false
+						});
+					}
+				}).catch(e => {
+					uni.hideLoading();
+					e.errMsg = e.msg || '';
+					return this.$store.state.payment.reject(e);
+				});
+			},
+			payByBalance() {
+				uni.showLoading({
+					mask: true,
+					title: '支付中...',
+				});
+				let para = {
+					id: this.$store.state.payment.id,
+					pay_password: this.payPassword ? this.payPassword : '',
+					is_need_pay_password: this.is_need_pay_password
+				}
+				this.$request({
+					url: this.$api.payment.pay_buy_balance,
+					data: para
+				}).then(response => {
+					uni.hideLoading();
+					if (response.code === 0) {
+						this.$store.commit('payment/showPayment', false);
+						return this.$store.state.payment.resolve({
+							errMsg: '支付成功',
+						});
+					} else {
+						return this.$store.state.payment.reject({
+							errMsg: response.msg,
+						});
+					}
+				}).catch(e => {
+					e.errMsg = e.msg || '';
+					return this.$store.state.payment.reject(e);
+				});
+			},
+			callHuodao() {
+				uni.showLoading({
+					mask: true,
+					title: '提交中...',
+				});
+				this.$request({
+					url: this.$api.payment.pay_buy_huodao,
+					data: {
+						id: this.$store.state.payment.id,
+					},
+				}).then(response => {
+					uni.hideLoading();
+					if (response.code === 0) {
+						return this.$store.state.payment.resolve({
+							errMsg: '支付成功',
+						});
+					} else {
+						return this.$store.state.payment.reject({
+							errMsg: response.msg,
+						});
+					}
+				}).catch(e => {
+					uni.hideLoading();
+					e.errMsg = e.msg || '';
+					return this.$store.state.payment.reject(e);
+				});
+			},
+			// #ifdef MP
+			callPlatformPayment(data) {
+				console.log('debug payment, callPlatformPayment 1,', this.$store.state.payment.resolve);
+				let paymentProvider = null;
+				// #ifdef MP-WEIXIN
+				paymentProvider = ['wxpay'];
+				// #endif
+				// #ifdef MP-ALIPAY
+				paymentProvider = ['alipay'];
+				// #endif
+				// #ifdef MP-BAIDU
+				paymentProvider = ['baidu'];
+				// #endif
+				// #ifdef MP-TOUTIAO
+				paymentProvider = ['toutiao'];
+				// #endif
+				uni.requestPayment({
+					provider: paymentProvider,
+					success: (e) => {
+						console.log('debug payment, callPlatformPayment 3,', this.$store.state.payment
+						.resolve);
+						console.log('success:', e);
+						// #ifndef MP-ALIPAY
+						return this.$store.state.payment.resolve(e);
+						// #endif
+						// #ifdef MP-ALIPAY
+						if (e.resultCode === 9000 || e.resultCode === '9000') {
+							return this.$store.state.payment.resolve(e);
+						} else {
+							return this.$store.state.payment.reject({
+								errMsg: e.memo,
+							});
+						}
+						// #endif
+					},
+					fail: (e) => {
+						const cancelMsgList = [
+							'requestPayment:fail cancel',
+						];
+						if (e.errMsg && cancelMsgList.indexOf(e.errMsg) >= 0) {
+							e.errMsg = '取消支付';
+						}
+						console.log('debug payment, callPlatformPayment 4,', this.$store.state.payment
+						.resolve);
+						console.log('fail:', e);
+						return this.$store.state.payment.reject(e);
+					},
+					...data
+				});
+			},
+			// #endif
+			// #ifdef H5
+			alipayH5Pay() {},
+			weChartPay(id) {
+				this.$request({
+					url: this.$api.registered.pay,
+					method: 'get',
+					data: {
+						payment_order_union_id: id
+					}
+				}).then((res) => {
+					if (res.code === 0) {
+						if (res.data.status === 1) {
+							this.$store.state.payment.resolve({
+								errMsg: '支付成功',
+							});
+							uni.redirectTo({
+								url: `/pages/order-submit/pay-result?payment_order_union_id=${id}`,
+							});
+						} else {
+							uni.redirectTo({
+								url: '/pages/order/index/index'
+							});
+						}
+					}
+				})
+			}
+			// #endif
+		},
+	}
+</script>
+
+<style scoped lang="scss">
+	$bigPadding: #{50rpx};
+	$smallPadding: #{25rpx};
+	$middlePadding: #{30rpx};
+	$smallFont: #{24rpx};
+	$lineWidth: #{1rpx};
+	$modalWidth: #{600rpx};
+	$iconWidth: #{60rpx};
+
+	.app-payment {
+		background: rgba(0, 0, 0, .5);
+		position: fixed;
+		z-index: 2000;
+		left: 0;
+		top: 0;
+		width: 100%;
+		height: 100%;
+		visibility: hidden;
+		opacity: 0;
+		transition: 150ms;
+
+		.modal {
+			background: #fff;
+			width: $modalWidth;
+			border-radius: #{15rpx};
+
+			.title {
+				text-align: center;
+				padding: $middlePadding;
+				border-bottom: $lineWidth solid #e2e2e2;
+				position: relative;
+			}
+
+			.cancel {
+				position: absolute;
+				right: 0;
+				top: 0;
+				padding: $middlePadding;
+
+				image {
+					width: #{36rpx};
+					height: #{36rpx};
+				}
+			}
+
+			.pay-amount {
+				text-align: center;
+				padding: $bigPadding;
+				font-weight: bolder;
+			}
+
+			.pay-type-list {
+				padding: 0 $bigPadding;
+			}
+
+			.pay-type-item {
+				border-bottom: $lineWidth solid #e2e2e2;
+				padding: $smallPadding 0;
+
+				.pay-type-icon {
+					width: $iconWidth;
+					height: $iconWidth;
+					margin-right: $smallPadding;
+				}
+
+				.pay-type-desc {
+					color: #909090;
+					font-size: $smallFont;
+				}
+			}
+
+			.pay-type-item:last-child {
+				border-bottom: none;
+			}
+
+			.footer {
+				padding: $bigPadding;
+			}
+		}
+	}
+
+	.app-payment.show {
+		visibility: visible;
+		opacity: 1;
+	}
+
+	.into-modal {
+		background: rgba(0, 0, 0, .5);
+		position: fixed;
+		z-index: 2100;
+		left: 0;
+		top: 0;
+		width: 100%;
+		height: 100%;
+		opacity: 1;
+		transition: 150ms;
+
+		.password-tip {
+			width: #{630rpx};
+			height: #{340rpx};
+			position: relative;
+			border-radius: #{16rpx};
+			background-color: #fff;
+
+			.password-content {
+				height: #{240rpx};
+				width: 100%;
+				color: #353535;
+			}
+
+			.password-btn {
+				position: absolute;
+				bottom: 0;
+				left: 0;
+				width: 100%;
+				color: #666666;
+				height: #{88rpx};
+				border-top: #{2rpx} solid #e2e2e2;
+
+				>view {
+					width: 50%;
+					text-align: center;
+					height: #{88rpx};
+					line-height: #{88rpx};
+				}
+
+				.line {
+					width: #{2rpx};
+					height: #{32rpx};
+					background-color: #e2e2e2;
+				}
+			}
+		}
+
+		.password-view {
+			position: relative;
+			width: #{560rpx};
+			height: #{300rpx};
+			border-radius: #{16rpx};
+			background-color: #fff;
+			margin-top: #{-200rpx};
+
+			.password-close {
+				position: absolute;
+				top: #{29rpx};
+				right: #{28rpx};
+				width: #{30rpx};
+				height: #{30rpx};
+				z-index: 2101;
+			}
+
+			.password-title {
+				height: #{140rpx};
+				line-height: #{140rpx};
+				text-align: center;
+				margin-bottom: #{128rpx};
+			}
+
+			.password-button {
+				padding: 0 #{60rpx};
+				position: relative;
+				z-index: 2101;
+			}
+
+			input {
+				position: absolute;
+				top: -300%;
+				width: #{475rpx};
+				height: #{78rpx};
+				margin: 0 auto;
+				z-index: 9999;
+			}
+
+			.input {
+				top: #{144rpx};
+				height: #{70rpx};
+				left: #{42.5rpx};
+				color: #fff;
+				font-size: #{1rpx};
+				background-color: transparent;
+				opacity: 0;
+			}
+
+			.passoword-input {
+				position: absolute;
+				background-color: #fff;
+				top: #{140rpx};
+				left: 0;
+				width: 100%;
+				z-index: 2101;
+
+				.password-item {
+					border: #{2rpx} solid #e2e2e2;
+					margin-left: #{-2rpx};
+					height: #{78rpx};
+					width: #{78rpx};
+
+					.password-placeholder {
+						width: #{24rpx};
+						height: #{24rpx};
+						border-radius: 50%;
+						background-color: #353535;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 151 - 0
src/components/basic-component/app-layout/app-permissions-auth/app-permissions-auth.vue

xqd
@@ -0,0 +1,151 @@
+<template>
+    <view v-if='isShow' class="permissions show bt">
+        <view class="permissions-bg"></view>
+        <view class="permissions-pic main-center">
+            <view class="info-model cross-center dir-top-nowrap">
+                <view class="order-title">提示</view>
+                <view class="info-box dir-left-nowrap cross-center">
+                    {{text}}
+                </view>
+                <view class="info-end dir-left-nowrap cross-center">
+                    <view @click='cancel' class="box-grow-1 main-center cross-center">取消</view>
+                    <view class="box-grow-0 info-line"></view>
+                    <view class="box-grow-1 red main-center cross-center">
+                        <button @click='cancel' open-type="openSetting" class="btn">去设置</button>
+                    </view>
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    export default {
+        name: 'app-permissions-auth',
+        data() {
+            return {}
+        },
+        props: {
+            isShow: {
+                type: Boolean,
+                default: false,
+            },
+            text: {
+                type: String,
+                default: '请在设置中打开相应权限',
+            }
+        },
+        methods: {
+            cancel() {
+                this.$emit('cancel', false);
+            },
+        }
+    }
+</script>
+
+<style lang="scss" scoped>
+    .permissions {
+        position: fixed;
+        left: 0;
+        top: 0;
+        width: 100%;
+        height: 100%;
+        z-index: 1000;
+        transition: 200ms;
+    }
+
+    .permissions.show {
+        visibility: visible;
+        opacity: 1;
+    }
+
+    .permissions.bt {
+        -webkit-animation-name: fadeIn; /*动画名称*/
+        -webkit-animation-duration: 0.25s; /*动画持续时间*/
+        -webkit-animation-iteration-count: 1; /*动画次数*/
+        -webkit-animation-delay: 0s; /*延迟时间*/
+    }
+
+    .permissions .permissions-bg {
+        background: rgba(0, 0, 0, 0.8);
+        position: fixed;
+        left: 0;
+        top: 0;
+        width: 100%;
+        height: 100%;
+        z-index: 1;
+    }
+
+    .permissions .permissions-pic {
+        position: fixed;
+        left: 0;
+        top: #{188rpx};
+        width: 100%;
+        height: 100%;
+        z-index: 1;
+    }
+
+    .permissions .permissions-close image {
+        width: #{50rpx};
+        height: #{50rpx};
+        margin-top: #{50rpx};
+    }
+
+    .permissions .info-model {
+        height: #{360rpx};
+        width: #{620rpx};
+        background: #fff;
+        border-radius: #{16rpx};
+    }
+
+    .permissions .order-title {
+        margin: #{48rpx} 0
+    }
+
+    .permissions .place {
+        color: #cdcdcd
+    }
+
+    .permissions .info-box {
+        height: #{88rpx};
+        margin-bottom: #{48rpx};
+        padding: 0 60rpx;
+    }
+
+    .permissions .info-input {
+        font-size: #{32rpx};
+        color: #353535;
+    }
+
+    .permissions .info-line {
+        height: #{32rpx} !important;
+        width: 1px !important;
+        background: #e2e2e2;
+    }
+
+    .permissions .info-end {
+        color: #666666;
+        height: #{88rpx};
+        font-size: #{32rpx};
+        border-top: #{1rpx} solid #e2e2e2;
+        width: 100%;
+    }
+
+    .permissions .info-end view {
+        height: 100%;
+        width: 100%;
+    }
+
+    button::after {
+        border: none;
+        content: '';
+    }
+
+    .btn {
+        border: none;
+        padding: 0;
+        background-color: #fff;
+        font-size: 32#{rpx};
+        color: $uni-general-color-one;
+    }
+</style>

+ 300 - 0
src/components/basic-component/app-layout/app-user-login/app-user-login.vue

xqd
@@ -0,0 +1,300 @@
+<template>
+    <view class="login-1 dir-left-nowrap main-center cross-center" :class="showLoginModal ? 'show' : ''">
+        <view class="login-content">
+            <image :src="auth_page && auth_page.pic_url" class="login-img"></image>
+            <view>
+                <app-hotspot :hotspot="auth_page.hotspot_link">
+                    <button class="login-btn" @click="link"></button>
+                </app-hotspot>
+            </view>
+            <view>
+                <app-hotspot :hotspot="auth_page.hotspot_cancel">
+                    <button class="login-btn" @click="cancel"></button>
+                </app-hotspot>
+            </view>
+            <view>
+                <app-hotspot :hotspot="auth_page.hotspot">
+                    <!-- #ifdef MP -->
+                    <button class="login-btn" v-if="canIUseGetUserProfile"
+                            scope="userInfo"
+                            @click="getUserInfoClick"
+                    >
+                    </button>
+                    <button class="login-btn" v-else
+                            :open-type="openType"
+                            scope="userInfo"
+                            @getAuthorize="getUserInfo"
+                            @getuserinfo="getUserInfo"
+                            @click="getUserInfoClick"
+                    >
+                    </button>
+                    <!-- #endif -->
+                    <!-- #ifdef H5 -->
+                    <view class="login-btn" @click="getUserInfo"></view>
+                    <!-- #endif -->
+                </app-hotspot>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    import Vue from 'vue';
+    import {mapState} from 'vuex';
+    import appHotspot from '../../../basic-component/app-hotspot/app-hotspot.vue';
+
+    export default {
+        name: 'app-user-login',
+        components: {
+            appHotspot,
+        },
+        data() {
+            return {};
+        },
+        computed: {
+            openType() {
+                // #ifdef MP-ALIPAY
+                return 'getAuthorize';
+                // #endif
+                return 'getUserInfo';
+            },
+            ...mapState('mallConfig', {
+                auth_page: state => state.auth_page,
+            }),
+            ...mapState({
+                showLoginModal: function(state) {
+                    return state.user.showLoginModal
+                }
+            }),
+			canIUseGetUserProfile() {
+				return this.$user.canIUseGetUserProfile();
+			}
+        },
+        created() {
+            const vm = this;
+            Vue.use({
+                install(Vue, options) {
+                    Vue.prototype.$layout = {
+                        getUserInfo() {
+                            vm.showLoginModal = true;
+                            return new Promise((resolve, reject) => {
+                                vm.getUserInfo = (e) => {
+                                };
+                            });
+                        },
+                    };
+                },
+            });
+        },
+        methods: {
+            link() {
+                this.$store.commit('user/showLoginModal', false);
+            },
+            cancel() {
+                this.$store.commit('user/showLoginModal', false);
+                this.$user.getUserInfoReject('getUserInfo fail: cancel.');
+                let pages = getCurrentPages();
+                let list = ['/pages/index/index', '/pages/user-center/user-center'];
+                // #ifdef MP
+                let url = this.$platDiff.route();
+                // #endif
+                // #ifdef H5
+                let {hash} = window.location;
+                hash = hash.split('#')[1];
+                let url =hash;
+                if (url === '/') {
+                    url = '/pages/index/index'
+                }
+                // #endif
+
+                if (list.includes(url)) {
+                    // #ifdef MP
+                    url = this.$platDiff.routeWithOption();
+                    // #endif
+                    // #ifdef H5
+                    url = window.location.hash;
+                    // #endif
+                    uni.redirectTo({
+                        url: url
+                    });
+                } else if (pages.length >= 2) {
+                    uni.navigateBack({
+                        delta: 1
+                    });
+                } else {
+                    uni.redirectTo({
+                        url: '/pages/index/index'
+                    });
+                }
+            },
+            // #ifdef MP
+            getUserInfoClick(e) {
+				this.$store.commit("user/showLoginModal", false);
+                // #ifdef MP-TOUTIAO
+                this.getUserInfo(e);
+                // #endif
+				// #ifdef MP-WEIXIN
+				this.$user.getUserProfile(e).then(res => {
+					console.log(res)
+					this.getUserInfo(res);
+				}).catch(res => {
+					console.log(res)
+				})
+				// #endif
+            },
+            // #endif
+            getUserInfo(e) {
+                // #ifdef H5
+                if (this.$jwx.isWechat()) {
+                    this.$request({
+                        url: this.$api.registered.url,
+                        method: 'get',
+                        data: {
+                            scope: 'snsapi_userinfo',
+                            response_type: 'code',
+                            url: `${window.location.href}`
+                        }
+                    }).then(res => {
+                        if (res.code === 0) {
+                            this.$storage.setStorageSync('_USER_SIGN', true);
+                            window.location.replace(res.data.url);
+                        } else {
+                            uni.navigateTo({
+                                url: '/pages/registered/sign'
+                            });
+                        }
+                    });
+                } else {
+                    uni.navigateTo({
+                        url: '/pages/registered/sign'
+                    });
+                }
+                // #endif
+                // #ifdef MP
+                this.$store.commit('user/showLoginModal', false);
+                const resolve = this.$user.getUserInfoResolve;
+                const reject = this.$user.getUserInfoReject;
+                this.$event.on(this.$const.EVENT_USER_LOGIN, true).then(() => {
+                    this.$jump({
+                        open_type: 'reload'
+                    })
+                });
+                // #ifdef MP-WEIXIN
+                if (e.detail.errMsg !== 'getUserInfo:ok') {
+                    this.$store.commit('user/showLoginModal', true);
+                    return reject(e.detail.errMsg);
+                } else {
+                    return resolve(e);
+                }
+                // #endif
+
+                // #ifdef MP-ALIPAY
+                my.getOpenUserInfo({
+                    success(openUserInfo) {
+                        const response = JSON.parse(openUserInfo.response);
+                        e.detail = {
+                            rawData: JSON.stringify(response.response),
+                            encryptedData: '',
+                            iv: '',
+                            signature: '',
+                        };
+                        return resolve(e);
+                    },
+                    fail(failE) {
+                        console.log('getOpenUserInfo:', failE);
+                    },
+                });
+                // #endif
+
+                // #ifdef MP-BAIDU
+                e.detail.rawData = JSON.stringify(e.detail.userInfo);
+                e.detail.encryptedData = '';
+                e.detail.iv = '';
+                e.detail.signature = '';
+                return resolve(e);
+                // #endif
+
+                // #ifdef MP-TOUTIAO
+                uni.login({
+                    success() {
+                        uni.getUserInfo({
+                            success(result) {
+                                e.detail = {
+                                    rawData: result.rawData,
+                                    encryptedData: '',
+                                    iv: '',
+                                    signature: '',
+                                };
+                                return resolve(e);
+                            },
+                            fail(e) {
+                                console.log('getUserInfo fail:', e);
+                            },
+                        });
+                    },
+                    fail(e) {
+                        console.log('login fail:', e);
+                    },
+                });
+                // #endif
+                // #endif
+            },
+            // #ifdef H5
+            getUrlParam(name) {
+                let url = window.location.href.split('#')[0];
+                let search = url.split('?')[1]
+                if (search) {
+                    let r = search.substr(0).match(new RegExp('(^|&)' + name + '=([^&]*)(&|$)'))
+                    if (r !== null) return unescape(r[2])
+                    return null
+                } else {
+                    return null
+                }
+            }
+            // #endif
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    $login-padding: #{200rpx} #{50rpx};
+
+    .login-1 {
+        box-sizing: border-box;
+        position: fixed;
+        top: 0;
+        left: 0;
+        z-index: 10000;
+        width: 100%;
+        height: 100%;
+        background: rgba(0, 0, 0, .5);
+        padding: $login-padding;
+        visibility: hidden;
+        opacity: 0;
+        transition: opacity 200ms;
+
+        .login-btn {
+            display: block;
+            width: 100%;
+            height: 100%;
+            opacity: 0;
+            padding: 0;
+        }
+
+        .login-content {
+            position: relative;
+            width: #{650rpx};
+            height: #{700rpx};
+        }
+
+        .login-img {
+            width: #{650rpx};
+            height: #{700rpx};
+        }
+    }
+
+    .login-1.show {
+        visibility: visible;
+        opacity: 1;
+    }
+</style>

+ 140 - 0
src/components/basic-component/app-layout/bd-mandatory-attention/bd-mandatory-attention.vue

xqd
@@ -0,0 +1,140 @@
+<template>
+  <view class="app-mandatory-attention">
+      <u-popup v-model="newValue" mode="center" :maskCloseAble="false" border-radius="14" :safeAreaInsetBottom="true" >
+          <view class="bd-model" @touchmove.stop.prevent>
+<!--               <view class="bd-h5" v-if="!isWechat">-->
+<!--                   需要关注公众号才购买-->
+<!--               </view>-->
+              <view class="bd-wechat cross-center dir-top-nowrap" v-if="isWechat">
+                  <view class="bd-title">关注公众号</view>
+                  <image class="bd-logo" :src="userInfo && userInfo.wechat_logo"></image>
+                  <view class="bd-name">{{userInfo.wechat_name}}</view>
+                  <image :src="userInfo && userInfo.qrcode" class="bd-qrcode"></image>
+                  <view class="bd-info">长按识别二维码关注公众号</view>
+              </view>
+              <view class="bd-btn" @click="close">
+                  确认关注
+              </view>
+          </view>
+      </u-popup>
+  </view>
+</template>
+
+<script>
+import uPopup from '../../u-popup/u-popup.vue';
+import {mapGetters} from "vuex";
+
+export default {
+  name: "app-mandatory-attention",
+    data() {
+        return {
+            newValue: true,
+            isWechat: false
+        }
+    },
+    computed: {
+        ...mapGetters({
+            userInfo: 'user/info',
+            showAttentionTwo: 'user/showAttentionTwo',
+        }),
+    },
+    methods: {
+        close() {
+            if (this.showAttentionTwo) {
+                this.$user.getInfo({
+                    refresh: true
+                }).then(() => {
+                    this.newValue = false;
+                });
+                this.$store.dispatch('user/showAttentionTwo', false);
+            } else {
+                this.$request({
+                    url: this.$api.registered.update,
+                    method: 'get'
+                }).then(response => {
+                    if (response.code === 0) {
+                        if (response.data.subscribe === 1) {
+                            this.$user.getInfo({
+                                refresh: true
+                            }).then(() => {
+                                this.newValue = false;
+                            });
+                        } else {
+                            uni.showToast({
+                                icon: 'none',
+                                title: '请关注'
+                            });
+                        }
+                    }
+                });
+            }
+        }
+    },
+    created() {
+        this.isWechat = this.$jwx.isWechat();
+    },
+    components: {
+        uPopup
+    },
+    watch: {
+      newValue: {
+          handler(newVal) {
+              if (newVal === false) {
+                  this.$store.dispatch('user/showAttention', false);
+              }
+          }
+      }
+    }
+}
+</script>
+
+<style scoped lang="scss">
+.bd-model {
+    background-color: #ffffff;
+    width: 630upx;
+}
+.bd-btn {
+    font-size: 30upx;
+    border-top: 1upx solid #f1f1f1;
+    color: #ff4544;
+    line-height: 88upx;
+    text-align: center;
+}
+.bd-h5 {
+    font-size: 32upx;
+    color: #353535;
+    text-align: center;
+    line-height: 204upx;
+}
+.bd-wechat {
+    .bd-title {
+        font-size: 32upx;
+        color: #353535;
+        text-align: center;
+        margin-top: 40upx;
+    }
+    .bd-logo {
+        width: 110upx;
+        height: 110upx;
+        margin-bottom: 10upx;
+        margin-top:30upx;
+    }
+    .bd-name {
+        font-size: 32upx;
+        margin-top: 15upx;
+        margin-bottom:20upx;
+        color: #353535;
+    }
+    .bd-qrcode {
+        width:330upx;
+        height:330upx;
+        margin: 10upx 0;
+    }
+    .bd-info {
+        font-size:22upx;
+        color: #353535;
+        margin-bottom: 40upx;
+        margin-top:10upx;
+    }
+}
+</style>

+ 174 - 0
src/components/basic-component/app-layout/u-authorized-iphone/u-authorized-iphone.vue

xqd
@@ -0,0 +1,174 @@
+<template>
+    <u-popup v-model="show" mode="center" border-radius="16" :length="630" :maskCloseAble="false">
+        <view class="u-content" >
+            <view class='u-header'>授权获取手机号</view>
+            <view class="u-body dir-top-nowrap cross-center">
+                <image class="u-img" :src="img"></image>
+                <text class="u-text">申请获取您绑定的手机号</text>
+                <!--#ifndef MP-ALIPAY-->
+                <button
+                    hover-class="u-hover-class"
+                    class="u-btn"
+                    open-type="getPhoneNumber"
+                    @getphonenumber="getPhoneNumber"
+                >确认</button>
+                <!--#endif-->
+                <!--#ifdef MP-ALIPAY-->
+                <button
+                    class="u-btn"
+                    hover-class="u-hover-class"
+                    open-type="getAuthorize"
+                    scope='phoneNumber'
+                    @getAuthorize="onGetAuthorize"
+                >点击授权</button>
+                <!--#endif-->
+            </view>
+        </view>
+    </u-popup>
+</template>
+
+<script>
+    import {mapState} from "vuex";
+    import uPopup from '../../u-popup/u-popup.vue';
+
+    export default {
+        name: "u-authorized-iphone",
+        computed: {
+            ...mapState({
+                _app_config: state => state.mallConfig
+            }),
+            showPhone() {
+                return this.$store.state.user.info;
+            },
+            img() {
+                let img = '';
+                // #ifdef MP-WEIXIN
+                img = this._app_config.__wxapp_img.mall.icon_wechat;
+                // #endif
+                // #ifdef MP-ALIPAY
+                img = this._app_config.__wxapp_img.mall.icon_alipay;
+                // #endif
+                // #ifdef MP-TOUTIAO
+                img = this._app_config.__wxapp_img.mall.icon_ttapp;
+                // #endif
+                return img;
+            }
+        },
+        data() {
+            return {
+                // #ifndef MP-ALIPAY
+                code: null,
+                // #endif
+                show: false
+            };
+        },
+        watch: {
+            showPhone: {
+                handler(newVal) {
+                    newVal && this.$validation.isEmpty(newVal.mobile) ? this.show = true : this.show = false;
+                },
+                immediate: true
+            }
+        },
+        created() {
+            // #ifndef MP-ALIPAY
+            let _this= this;
+            uni.login({
+                scopes: 'auth_base',
+                success(res) {
+                    if (res.errMsg === 'login:ok') {
+                        _this.code = res.code;
+                    }
+                }
+            })
+            // #endif
+        },
+        destroyed() {
+            this.show = false;
+        },
+        methods: {
+            // #ifndef MP-ALIPAY
+            getPhoneNumber(e) {
+                if (e.detail.errMsg === 'getPhoneNumber:fail user deny') return;
+                this.$request({
+                    method: 'post',
+                    url: this.$api.phone.binding,
+                    data: {
+                        encryptedData: e.detail.encryptedData,
+                        iv: e.detail.iv,
+                        code: this.code
+                    }
+                }).then(() => {
+                    this.show = false;
+                    this.$store.dispatch('user/refresh');
+                });
+            },
+            // #endif
+            // #ifdef MP-ALIPAY
+            onGetAuthorize() {
+                let _this = this;
+                my.getPhoneNumber({
+                    success: (res) => {
+                        this.$request({
+                            method: 'post',
+                            url: _this.$api.phone.binding,
+                            data: {
+                                data: JSON.parse(res.response).response,
+                            }
+                        }).then(() => {
+                            _this.show = false;
+                            _this.$store.dispatch('user/refresh');
+                        });
+                    },
+                    fail: () => {
+                    }
+                });
+            }
+            // #endif
+        },
+        components: {
+            uPopup
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .u-content {
+        background-color: #ffffff;
+    }
+
+    .u-header {
+        text-align: center;
+        padding: 30upx 0;
+        line-height: 60upx;
+        border-bottom: 1upx solid #eeeeee;
+        color: #353535;
+        font-size: 35upx;
+    }
+    .u-img {
+        width: 88upx;
+        height: 88upx;
+        text-align: center;
+        margin: 32upx 0 40upx;
+    }
+    .u-body {
+        padding: 0 24upx;
+
+    }
+    .u-text {
+        margin-bottom: 40upx;
+        font-size: 26upx;
+        color: #666666;
+    }
+    .u-btn {
+        background-color: #04be01;
+        width: 500upx;
+        height: 80upx;
+        line-height: 80upx;
+        border-radius: 80upx;
+        color: #ffffff;
+        font-size: 30upx;
+        margin-bottom: 40upx;
+        padding: 0;
+    }
+</style>

+ 24 - 0
src/components/basic-component/app-load-text/app-load-text.vue

xqd
@@ -0,0 +1,24 @@
+<template>
+	<view class="app-load-text">
+		<icon class="app-load image-no-rep image-cover" type></icon>
+	</view>
+</template>
+
+<script>
+    export default {
+        name: 'app-load-data'
+    }
+</script>
+
+<style scoped lang="scss">
+	.app-load-text {
+		width: #{750rpx};
+		text-align: center;
+		height: #{42rpx};
+	}
+	.app-load {
+		width: #{70rpx};
+		height: #{42rpx};
+		background-image: url("./image/load.gif");
+	}
+</style>

BIN
src/components/basic-component/app-load-text/image/load.gif


+ 109 - 0
src/components/basic-component/app-loading/app-loading.vue

xqd
@@ -0,0 +1,109 @@
+<template>
+   <view>
+       <view v-if="type === 'global'" class="app-loading app-loading-global">
+           <view class="app-loading-image app-loading-global-image" :style="{'background-image': `url(${background})`}"></view>
+           <text :style="{'color': color}" class="app-loading-global-text" v-if="text">{{text}}</text>
+       </view>
+       <view v-else-if="type === 'toast'" class="app-loading app-loading-toast">
+            <view class="app-loading-image app-loading-toast-image"
+                  :style="{'background-image': `url(${background})`}"
+            ></view>
+            <text :style="{'color': color}" class="app-loading-toast-text" v-if="text">{{text}}</text>
+       </view>
+   </view>
+</template>
+
+<script>
+    export default {
+        name: 'app-loading',
+        props: {
+            type: {
+                type: String,
+                default() {
+                    return "";
+                }
+            },
+            text: {
+                type: String,
+                default() {
+                    return "";
+                }
+            },
+            color: {
+                type: String,
+                default() {
+                    return "";
+                }
+            },
+            backgroundImage: {
+                type: String,
+	            default() {
+                    return "";
+	            }
+            },
+        },
+	    computed: {
+            background: function() {
+                return this.backgroundImage;
+            }
+	    }
+    }
+</script>
+
+<style scoped lang="scss">
+
+    .app-loading {
+        position: fixed;
+        z-index: 1501;
+    }
+    .app-loading-toast {
+        top: 50%;
+        left:50%;
+        transform: translate(-50%, -50%);
+    }
+    .app-loading-global {
+        top: 0;
+        width: 100%;
+        height: 100%;
+        background-color: rgba(31,31,31, .5);
+    }
+    .app-loading-global-text {
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        transform: translate(-50%, -50%);
+    }
+    .app-loading-global-image {
+        position: absolute;
+        top: 40%;
+        left: 50%;
+        width: #{80rpx};
+        height: #{80rpx};
+        border-radius: 50%;
+        transform: translate(-50%, -50%);
+    }
+    .app-loading-toast-image {
+        width: #{130rpx};
+        height: #{130rpx};
+        border-radius: 50%;
+    }
+    .app-loading-toast {
+        width: #{80rpx};
+        height: #{80rpx};
+        background-color: rgba(0, 0, 0, 0.5);
+        border-radius: #{20rpx};
+        color: white;
+        display: flex;
+        flex-direction: column;
+        flex-wrap: nowrap;
+        justify-content:center;
+        align-items: center;
+    }
+    .app-loading-toast-text {
+        font-size:#{30rpx};
+    }
+    .app-loading-image {
+        opacity: .8;
+        background-size: 100% 100%;
+    }
+</style>

+ 202 - 0
src/components/basic-component/app-model/app-model.vue

xqd
@@ -0,0 +1,202 @@
+<template>
+    <view class="app-mode" :class="{'app-show': display}" @click.stop="close">
+	    <view v-if="type === '1'" class="app-content" :style="{backgroundColor: background, bottom: setHeight, height: `${height+108}rpx`}">
+		    <view class="app-top">
+			    <!-- <slot name="title">赠卡券</slot> -->
+				<view name="title">赠卡券</view>
+			    <view class="app-icon">
+				    <app-form-id @click="close()">
+					    <icon class="app-icon-close image-no-rep image-cover" type></icon>
+                    </app-form-id>
+                </view>
+            </view>
+            <view class="app-bottom">
+                <slot name="content"></slot>
+            </view>
+        </view>
+        <view v-if="type === '2'" class="app-center" :style="{backgroundColor: background}">
+            <view class="app-top">
+                <!-- <slot name="title">限购</slot> -->
+				<!-- <view name="title">限购</view> -->
+                <view class="app-icon">
+                    <app-form-id @click.stop="close()">
+                        <icon class="app-icon-close image-no-rep image-cover" type></icon>
+                    </app-form-id>
+                </view>
+            </view>
+            <view class="app-bottom">
+                <slot name="content"></slot>
+            </view>
+        </view>
+
+        <view v-if="type === '3'" class="app-content" :style="{backgroundColor: background, bottom: setHeight}"
+              @click.stop="bubble">
+            <view class="app-common main-center">
+                <!-- <slot name="title">提现方式</slot> -->
+				<view name="title">提现方式</view>
+                <view class="app-icon">
+                    <app-form-id @click="close()">
+                        <icon class="app-icon-close image-no-rep image-cover" type></icon>
+                    </app-form-id>
+                </view>
+            </view>
+            <view class="app-bottom">
+                <slot name="content"></slot>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    export default {
+        name: 'app-model',
+	    props: {
+            type: {
+                type: String,
+                default: function() {
+                    return '1';
+                }
+            },
+		    background: {
+                type: String,
+			    default: function() {
+			        return 'white';
+			    }
+		    },
+		    height: {
+                type: Number,
+			    default: function() {
+			        return 500;
+			    }
+		    },
+		    value: {
+                type: Boolean,
+			    default: function() {
+			        return false;
+			    }
+		    }
+	    },
+	    data() {
+            return {
+                display: this.value
+            }
+        },
+        methods: {
+            bubble() {
+                return false;
+            },
+            close() {
+                this.display = false;
+                this.$emit('input', this.display);
+            },
+        },
+        computed: {
+            setHeight() {
+                if (this.display === true) {
+                    return `0`;
+                } else {
+                    return `-${this.height + 108}rpx`;
+                }
+            }
+        },
+        watch: {
+            value: function() {
+                this.display = this.value;
+            }
+	    }
+    }
+</script>
+
+<style scoped lang="scss">
+	.app-mode {
+        position: fixed;
+        z-index: 1600;
+        top: 0;
+        left: 0;
+        width: #{750rpx};
+        height: 100%;
+        background-color: rgba(127, 127, 127, 0.4);
+        transition: all 0.2s linear;
+        visibility: hidden;
+        opacity: 0;
+        overflow: hidden;
+
+        .app-common {
+            color: #353535;
+            font-size: #{36rpx};
+            width: 100%;
+            line-height: #{100rpx};
+            border-bottom: 1px solid #E2E2E2;
+
+            .app-icon-close {
+                width: #{30rpx};
+                height: #{30rpx};
+                position: absolute;
+                background-image: url("https://shop.9026.com/web/statics/image/mall/static/icon/icon-close.png");
+                top: #{35rpx};
+                right: #{32rpx};
+            }
+        }
+
+        .app-icon {
+            position: absolute;
+            top: 0;
+            right: 0;
+            height: #{108rpx};
+            width: #{54rpx};
+        }
+
+        .app-icon-close {
+            width: #{30rpx};
+            height: #{30rpx};
+            position: absolute;
+            background-image: url("https://shop.9026.com/web/statics/image/mall/static/icon/icon-close.png");
+            top: #{24rpx};
+            right: #{24rpx};
+        }
+
+        .app-content {
+            position: absolute;
+            width: #{750rpx};
+            transition: bottom 0.5s linear;
+            border-top-left-radius: #{16rpx};
+            border-top-right-radius: #{16rpx};
+
+            .app-top {
+                width: #{750rpx};
+                height: #{108rpx};
+            }
+        }
+
+        .app-center {
+            width: #{600rpx};
+            border-radius: #{16rpx};
+            position: absolute;
+            top: 50%;
+            left: 50%;
+            transform: translate(-50%, -50%);
+
+            .app-top {
+                width: #{600rpx};
+                height: #{108rpx};
+            }
+
+            .app-bottom {
+                width: #{520rpx};
+                margin: 0 #{40rpx} #{48rpx} #{40rpx};
+                font-size: #{28rpx};
+                color: #353535;
+            }
+        }
+    }
+	.app-show {
+		opacity: 1;
+		visibility: visible;
+        position: fixed;
+        top: 0;
+        left: 0;
+        right: 0;
+        bottom: 0;
+        transform: scale(1);
+	}
+</style>

BIN
src/components/basic-component/app-model/image/close.png


+ 186 - 0
src/components/basic-component/app-order/app-form-data.vue

xqd
@@ -0,0 +1,186 @@
+<template>
+    <view class="app-form-data">
+        <block v-if="formList && formList.length">
+            <slot></slot>
+            <view v-for="(row,idx) in formList" :class="['goods-form', `${idx == 0? 'more':''}`]" :key="idx">
+                <view v-for="(goods,index) in row" :key="index" v-if="formList.length > 1">
+                    <view class="goods">
+                        <image class="goods-img" :src='goods.goods_info.goods_attr.pic_url ? goods.goods_info.goods_attr.pic_url : goods.goods_info.goods_attr.cover_pic'></image>
+                        <view class='t-omit-two goods-name'>{{goods.goods_info.goods_attr.name}}</view>
+                        <view class="goods-attr t-omit" v-if="goods.goods_type === 'goods'">
+                            <text v-for="attr in goods.attr_list" :key="item.attr_id">{{attr.attr_group_name}}:{{attr.attr_name}}</text>
+                        </view>
+                        <view class="goods-num">x{{goods.num}}</view>
+                        <view class="goods-price">¥{{goods.total_original_price}}</view>
+                    </view>
+                </view>
+                <view v-for="(item,index) in row[0]['form_data']" v-if="item.value" :key="index" :class="[ `${item.key !== 'img_upload' ? 'dir-left-nowrap' : ''}`,`price-item`]">
+                    <view class="price-label">{{item.label}}:</view>
+                    <view v-if="item.key === 'img_upload'">
+                        <view v-if="Array.isArray(item.value)">
+                            <block v-for="(img,key) in item.value" :key="key">
+                                <image v-if="img" v-show="!item.loadOver" @load="imageFormLoad(idx,index)" @click='look(img)' class="form-img" :src='img'></image>
+                            </block>
+                        </view>
+                        <view v-else>
+                            <image v-if="item.value" v-show="!item.loadOver" @load="imageFormLoad(idx,index)" @click='look(item.value)' class="form-img" :src='item.value'></image>
+                        </view>
+                    </view>
+                    <view style="word-break: break-all" v-else>{{item.value}}</view>
+                </view>
+            </view>
+        </block>
+        <view v-if="detail.order_form.length > 0">
+            <slot></slot>
+            <view v-for="(item,index) in detail.order_form" v-if="item.value" :key="index" :class="[ `${item.key !== 'img_upload' ? 'dir-left-nowrap' : ''}`,`price-item`]">
+                <view class="price-label">{{item.label}}:</view>
+                <view v-if="item.key === 'img_upload'">
+                    <view v-if="Array.isArray(item.value)">
+                        <block v-for="(img,key) in item.value" :key="key">
+                            <image v-if="img" v-show="!item.loadOver" @load="imageLoad(index)" @click.stop='look(img)' class="form-img" :src='img'></image>
+                        </block>
+                    </view>
+                    <view v-else>
+                        <image v-if="item.value" v-show="!item.loadOver" @load="imageLoad(index)" @click.stop='look(item.value)' class="form-img" :src='item.value'></image>
+                    </view>
+                </view>
+                <view style="word-break: break-all" v-else>{{item.value}}</view>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    export default {
+        props: {
+            order: {
+                type: Object,
+            }
+        },
+        data() {
+            return {
+                detail: this.order
+            }
+        },
+        computed: {
+            formList() {
+                const self = this;
+                let orderDetail = self.detail.detail;
+                let newArr = {};
+                let form_ids = [];
+
+                if (orderDetail && orderDetail.length) {
+                    for (let goods of orderDetail) {
+                        if (goods.form_id == '0') {
+                            continue;
+                        }
+                        if (form_ids.indexOf(goods.form_id) === -1) {
+                            form_ids.push(goods.form_id);
+                            newArr[goods.form_id] = [goods];
+                        } else {
+                            newArr[goods.form_id].push(goods);
+                        }
+                    }
+                }
+                let list = Object.values(newArr)
+                this.$emit('show', list);
+                return list;
+            }
+        },
+        watch: {
+            order: {
+                handler (newValue) {
+                    this.detail = newValue
+                },
+                deep: true
+            }
+        },
+        methods: {
+            imageLoad(index) {
+                this.order.order_form[index].loadOver = false;
+            },
+            // 查看图片
+            look(e) {
+                uni.previewImage({
+                    current: e, // 当前显示图片的http链接
+                    urls: [e] // 需要预览的图片http链接列表
+                })
+            },
+            imageFormLoad(idx,index) {
+                this.order.detail[idx].form_data[index].loadOver = false;
+            },
+        }
+    }
+</script>
+
+<style lang="scss" scoped>
+    .app-form-data {
+        .goods-form {
+            border-top: #{2rpx solid #e2e2e2};
+            margin-top: #{20rpx};
+            &.more {
+                border-top: 0;
+                margin-top: #{10rpx};
+            }
+        }
+
+        .form-img {
+            height: #{120rpx};
+            width: #{120rpx};
+            margin-right: #{10rpx};
+            margin-top: #{10rpx};
+        }
+
+        .price-label {
+            color: #999;
+            margin-right: #{10rpx};
+        }
+        .price-item {
+            margin-bottom: #{10rpx};
+            font-size: #{24rpx};
+            color: #353535;
+        }
+
+        .goods {
+            height: #{160rpx};
+            margin-top: #{24rpx};
+            position: relative;
+            font-size: #{24rpx};
+            color: #353535;
+            margin-bottom: #{24rpx};
+            .goods-img {
+                height: #{160rpx};
+                width: #{160rpx};
+                float: left;
+                margin-right: #{20rpx};
+                border-radius: #{4rpx};
+            }
+            .goods-attr {
+                font-size: #{24rpx};
+                color: #999;
+                width: 70%;
+                position: absolute;
+                width: 70%;
+                top: #{78rpx};
+                left: #{180rpx};
+                text {
+                    margin-right: #{20rpx};
+                }
+            }
+            .goods-num {
+                font-size: #{24rpx};
+                color: #999;
+                position: absolute;
+                top: #{126rpx};
+                left: #{180rpx};
+            }
+            .goods-price {
+                font-size: #{24rpx};
+                color: #353535;
+                position: absolute;
+                bottom: 0;
+                right: 0;
+            }
+        }
+    }
+</style>

+ 120 - 0
src/components/basic-component/app-preview-image/app-preview-image.vue

xqd
@@ -0,0 +1,120 @@
+<template>
+	<view @click="close" class="app-preview-image">
+        <!-- #ifdef MP-ALIPAY -->
+        <swiper class="swiper" :current="currentIndex" @change="changIndex">
+        <!-- #endif -->
+        <!-- #ifndef MP-ALIPAY -->
+        <swiper class="swiper" :current-item-id="currentIndex" @change="changIndex">
+        <!-- #endif -->
+            <swiper-item v-for="(item,index) in list" :key="index" :item-id="index">
+                <view class="swiper-item main-center cross-center">
+                    <image v-show="item.height" :src="item.pic_url" :style="[{'height':`${item.height}`}]" @load="imageLoad(index,$event)"></image>
+                </view>
+            </swiper-item>
+        </swiper>
+        <view class="attr-name main-center cross-center"><view>{{currentName}}</view></view>
+        <view class="attr-index">{{currentIndex + 1}}/{{list.length}}</view>
+	</view>
+</template>
+
+<script>
+    export default {
+        name: "app-preview-image",
+	    data() {
+            return {
+                currentIndex: 0,
+                currentName: '',
+                list: []
+            }
+        },
+	    props: {
+            cover_list: Array,
+            index: {
+                type: Number,
+                default() {
+                    return 0
+                }
+            }
+	    },
+        created() {
+            this.list = JSON.parse(JSON.stringify(this.cover_list));
+            this.currentIndex = this.index;
+            this.currentName = this.list[this.currentIndex].name;
+        },
+	    methods: {
+            close() {
+                this.$emit('change', this.currentIndex);
+            },
+            changIndex(e) {
+                this.currentIndex = e.detail.current;
+                this.currentName = this.list[e.detail.current].name;
+            },
+            imageLoad(index,e) {
+                let $height = e.detail.height; //获取图片真实高度
+                let $width = e.detail.width; //获取图片真实宽度
+                let height = $height * (750 / $width);
+                this.list[index].height = height + 'rpx';
+                this.$forceUpdate();
+            }
+	    }
+    }
+</script>
+
+<style scoped lang="scss">
+	.app-preview-image {
+        position: fixed;
+        top: 0;
+        left: 0;
+        width: 100%;
+        height: 100%;
+        background-color: #000;
+        z-index: 10000;
+        .swiper {
+            width: 100%;
+            height: 100%;
+            .swiper-item {
+                height: 100%;
+                image {
+                    display: block;
+                    width: 100%;
+                }
+            }
+        }
+        .attr-name {
+            height: 76rpx;
+            position: fixed;
+            bottom: 160rpx;
+            left: 0;
+            width: 100%;
+            z-index: 10001;
+            color: #fff;
+            font-size: 32rpx;
+            >view {
+                height: 76rpx;
+                line-height: 76rpx;
+                border-radius: 38rpx;
+                display: inline-block;
+                padding: 0 40rpx;
+                background-color: rgba(255,255,255,.25);
+                max-width: 80%;
+                white-space: nowrap;
+                overflow: hidden;
+                text-overflow: ellipsis;
+            }
+        }
+        .attr-index {
+            color: #fff;
+            height: 60rpx;
+            line-height: 60rpx;
+            padding: 0 30rpx;
+            display: inline-block;
+            background-color: rgba(255,255,255,.25);
+            position: fixed;
+            bottom: 60rpx;
+            right: 40rpx;
+            border-radius: 30rpx;
+            font-size: 26rpx;
+            z-index: 10001;
+        }
+	}
+</style>

+ 90 - 0
src/components/basic-component/app-prompt-box/app-prompt-box.vue

xqd
@@ -0,0 +1,90 @@
+<template>
+	<view class="app-prompt-box">
+		<view class="app-content">
+			<text class="app-title">提示</text>
+			<view class="app-text">
+				{{text}}
+			</view>
+			<view class="app-buttons dir-left-nowrap">
+                <view class="app-button app-close" @click="close(false)">取消</view>
+				<view class="app-line"></view>
+                <view class="app-button app-sure" @click="close(true)">确认</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+    export default {
+        name: 'app-prompt-box',
+	    props: {
+            text: {
+                type: String,
+            }
+	    },
+	    methods: {
+            close(boolean) {
+                this.$emit('click', boolean);
+            }
+	    }
+    }
+</script>
+
+<style scoped lang="scss">
+	.app-prompt-box {
+		width: 100%;
+		height: 100%;
+		position: fixed;
+		top: 0;
+		left: 0;
+		background-color: rgba(153, 153, 153, 0.3);
+		z-index: 1500;
+		.app-content {
+			width: #{620rpx};
+			border-radius: #{8rpx};
+			background-color: white;
+			position: absolute;
+			top: 50%;
+			left: 50%;
+			transform: translate(-50%, -50%);
+			text-align: center;
+			
+			.app-title {
+				display: inline-block;
+				font-size: #{32rpx};
+				margin-top: #{40rpx};
+				margin-bottom: #{64rpx};
+				color: #353535;
+				text-align: center;
+			}
+			.app-text {
+				font-size: #{32rpx};
+				color: #353535;
+				text-align: center;
+				margin-bottom: #{64rpx};
+			}
+			.app-buttons {
+				border-top: #{1rpx} solid #e2e2e2;
+				.app-button {
+					font-size: #{32rpx};
+					width: #{309.5rpx};
+					height: #{88rpx};
+					line-height: #{88rpx};
+					text-align: center;
+				}
+				.app-sure {
+					color: #ff4544;
+				}
+				.app-close {
+					color: #666666;
+				}
+				.app-line {
+					width: #{1rpx};
+					height: #{32rpx};
+					margin-top: #{30rpx};
+					color: #e2e2e2;
+				}
+			}
+		}
+	}
+</style>

+ 150 - 0
src/components/basic-component/app-radio/app-radio-group.vue

xqd
@@ -0,0 +1,150 @@
+<template>
+    <view class="app-radio-group">
+        <view style="overflow-y:hidden;">
+        <view class="dir-left-wrap">
+            <template v-for="(item, index) in model">
+                <view :key="index" class="item cross-center dir-left-nowrap" :style="{height: `${height}rpx`,}">
+                    <template v-if="type==='round'">
+                        <view class="item-round text-ellipsis"
+                              :class="[
+                                `white-background`,
+                                item.value?`background`:``,
+                                ]"
+                              :style="{color: color ? color: '#FF4544',
+                                  borderColor: color ? color: '#FF4544',
+                                  backgroundColor: item.value ? color: '#FFFFFF'}"
+                              @click="handleClick(index)">{{item.label}}
+                        </view>
+                    </template>
+                    <template v-else>
+                        <view class="checker">
+                            <app-radio v-model="item.value" type="round" @input="handleInput" :sign="index"></app-radio>
+                        </view>
+                        <view class="label text-ellipsis">{{item.label}}</view>
+                    </template>
+                </view>
+            </template>
+        </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    import AppRadio from "./app-radio";
+
+    export default {
+        name: 'app-radio-group',
+        components: {AppRadio},
+        props: {
+            type: {
+                default: 'default',
+            },
+            value: {
+                default: null,
+            },
+            list: {
+                type: Array,
+                default: [],
+            },
+            height: {
+                type: Number,
+                default: 88,
+            },
+            sign: {
+                default: null,
+            },
+            color: {
+                default: '#ff4544',
+            }
+        },
+        data() {
+            const list = this.list;
+            for (let i in list) {
+                if (list[i].label === this.value) {
+                    list[i].value = true;
+                }
+            }
+            return {
+                model: this.list,
+            };
+        },
+        methods: {
+            handleInput(e, index) {
+                if (e === false) {
+                    this.model[index].value = true;
+                    return;
+                }
+                for (let i in this.model) {
+                    if (index != i) {
+                        this.model[i].value = false;
+                    }
+                }
+                this.$emit('input', this.model[index].label, this.sign);
+                this.$emit('change', this.model, this.sign);
+            },
+            handleClick(index) {
+                for (let i in this.model) {
+                    if (i == index) {
+                        if (!this.model[i].value) {
+                            this.model[i].value = true;
+                            this.$emit('input', this.model[index].label, this.sign);
+                            this.$emit('change', this.model, this.sign);
+                        }
+                    } else {
+                        this.model[i].value = false;
+                    }
+                }
+            },
+        },
+    }
+</script>
+
+<style scoped lang="scss">
+    .label {
+        color: #666666;
+    }
+
+    .item {
+        margin-bottom: #{12rpx};
+        margin-top: #{12rpx};
+        margin-right: #{10rpx};
+    }
+
+    .item:last-child {
+        margin-right: 0;
+    }
+
+    .checker {
+        margin-right: #{16rpx};
+    }
+
+    .item-round {
+        display: inline-block;
+        height: #{56rpx};
+        line-height: #{54rpx};
+        border: #{2rpx} solid;
+        padding: 0 #{24rpx};
+        border-radius: #{1000rpx};
+        font-size: $uni-font-size-general-one;
+    }
+
+    .background {
+        background-color: #ff4544;
+        color: #ffffff !important;
+    }
+
+    .border {
+        border-color: #ff4544;
+    }
+
+    .color {
+        color: #ff4544;
+    }
+
+    .text-ellipsis {
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        max-width: #{420rpx};
+    }
+</style>

+ 108 - 0
src/components/basic-component/app-radio/app-radio.vue

xqd
@@ -0,0 +1,108 @@
+<template>
+	<view class="app-default" :style="{'width': `${width}rpx`, 'height': `${height}rpx`}" @click.stop="radioSelection">
+		<view v-if="value" styke class="app-default-active" :style="{'background-color': sign ? '' : theme.background}"
+			:class="[
+            {'round-active' : type === 'round'},
+            sign ? theme +'-background' : '',
+            theme
+           ]"></view>
+		<view v-if="!value" class="app-default-border" :class="{'round-border' : type === 'round'}" :style="{
+              borderColor: borderColor,
+              }"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'app-radio',
+		props: {
+			type: String,
+			theme: [Object, String],
+			value: {
+				default: false,
+				type: Boolean,
+			},
+			width: {
+				type: String,
+				default: '40'
+			},
+			height: {
+				type: String,
+				default: '40'
+			},
+			item: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			sign: {
+				default: null,
+			},
+			borderColor: {
+				default: '#cccccc',
+			},
+		},
+		data() {
+			return {
+				active: this.value,
+			}
+		},
+		methods: {
+			radioSelection() {
+				this.active = !this.active;
+				this.$emit('input', {
+					active: this.active,
+					item: this.sign
+				});
+				this.$emit('click', {
+					active: this.active,
+					item: this.item
+				});
+			}
+		},
+		watch: {
+			value: {
+				handler(value) {
+					this.active = value;
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.round-active {
+		border-radius: 50%;
+	}
+
+	.round-border {
+		border-radius: 50%;
+	}
+
+	.app-default {
+		position: relative;
+	}
+
+	.app-default-active {
+		position: absolute;
+		background-image: url("https://shop.9026.com/web/statics/image/mall/static/icon/yes-radio.png");
+		background-size: 100% 100%;
+		top: 50%;
+		left: 50%;
+		transform: translate(-50%, -50%);
+		background-repeat: no-repeat;
+		width: #{40rpx};
+		height: #{40rpx};
+	}
+
+	.app-default-border {
+		position: absolute;
+		border: #{2rpx} solid #cccccc;
+		top: 50%;
+		left: 50%;
+		transform: translate(-50%, -50%);
+		width: #{40rpx};
+		height: #{40rpx};
+	}
+</style>

BIN
src/components/basic-component/app-radio/image/yes.png


+ 112 - 0
src/components/basic-component/app-report-error/app-report-error.vue

xqd
@@ -0,0 +1,112 @@
+<template>
+    <view class="app-view">
+        <view class="app-spring-board dir-top-nowrap main-justify-between">
+            <view class="app-text">
+                <view class="app-title">网络错误</view>
+                <view class="app-content">{{content}}</view>
+            </view>
+            <view class="app-buttons dir-left-nowrap ">
+                <app-form-button @handleClick="copyText" class="app-button">复制错误</app-form-button>
+                <app-form-button @handleClick="refreshPage" class="app-button button-border" color="#7e8dae">刷新页面</app-form-button>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    import appFormButton from '../app-form-id/app-form-id.vue';
+
+    export default {
+        name: 'app-prompt-dialog',
+        components: {
+            "app-form-button": appFormButton,
+        },
+        props: {
+            content: String,
+        },
+        computed: {},
+        methods: {
+            handleClick(boolean) {
+                this.$emit('toastModelClick', boolean);
+            },
+            copyText() {
+                this.$store.dispatch('gConfig/reportAndErrorB', false);
+                // #ifndef MP-ALIPAY
+                this.$utils.uniCopy({
+                    data: this.content
+                });
+                // #endif
+                // #ifdef MP-ALIPAY
+                my.setClipboard({
+                    text: this.content // 剪贴板数据
+                });
+                // #endif
+            },
+            refreshPage() {
+                this.$store.dispatch('gConfig/reportAndErrorB', false);
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .app-view {
+        width: 100%;
+        height: 100%;
+        background-color: rgba(0,0,0, .3);
+        position: absolute;
+        z-index: 1501;
+        top: 0;
+    }
+    .app-spring-board {
+        background-color: #ffffff;
+        width: 80%;
+        min-height: 20%;
+        position: absolute;
+        border-radius: #{10rpx};
+        box-shadow: 0 0 #{2rpx} #000000;
+        left: 50%;
+        top: 50%;
+        transform: translate(-50%, -90%);
+    }
+    .app-buttons {
+        width:100%;
+        height: #{100rpx};
+        border: #{1rpx} solid #dddddd;
+    }
+    .app-button {
+        width: 50%;
+    }
+    .button-border {
+        border-left: #{1rpx} solid #dddddd;
+        color: blue;
+    }
+    .app-button /deep/ form {
+        display: block;
+        width: 100%;
+        height: 100%;
+    }
+    .app-button /deep/ button {
+        display: block;
+        width: 100%;
+        height: 100%;
+        text-align: center;
+        line-height: #{100rpx};
+        background-color: #ffffff;
+    }
+    .app-title {
+        font-weight: bold;
+        font-size: #{39rpx};
+        text-align: center;
+        height: #{70rpx};
+        line-height:  #{70rpx};
+        margin-top: #{30rpx};
+    }
+    .app-content {
+        padding-left: #{20rpx};
+        padding-right: #{20rpx};
+        text-align: center;
+        margin-bottom: #{30rpx};
+        font-size: #{38rpx};
+    }
+</style>

+ 28 - 0
src/components/basic-component/app-rich/components/wxParseAudio.vue

xqd
@@ -0,0 +1,28 @@
+<template>
+	<!-- '<audio/>' 组件不再维护,建议使用能力更强的 'uni.createInnerAudioContext' 接口 有时间再改-->
+  <!--增加audio标签支持-->
+  <audio
+    :id="node.attr.id"
+    :class="node.classStr"
+    :style="node.styleStr"
+    :src="node.attr.src"
+    :loop="node.attr.loop"
+    :poster="node.attr.poster"
+    :name="node.attr.name"
+    :author="node.attr.author"
+    controls></audio>
+</template>
+
+<script>
+export default {
+  name: 'wxParseAudio',
+  props: {
+    node: {
+      type: Object,
+      default() {
+        return {};
+      },
+    },
+  },
+};
+</script>

+ 114 - 0
src/components/basic-component/app-rich/components/wxParseImg.vue

xqd
@@ -0,0 +1,114 @@
+<template>
+    <image
+        :lazy-load="newNode.attr.lazyLoad"
+        :class="newNode.classStr"
+        :style="newStyleStr || newNode.styleStr"
+        :data-src="newNode.attr.src"
+        :src="newNode.attr.src"
+        @tap="wxParseImgTap"
+        @load="wxParseImgLoad"
+    />
+</template>
+
+<script>
+    import {mapState} from 'vuex';
+
+    export default {
+        name: 'wxParseImg',
+
+        data() {
+            return {
+                style: '',
+                preview: true
+            };
+        },
+
+        props: {
+            node: {
+                type: Object,
+                default() {
+                    return {};
+                }
+            },
+            parentNode: {}
+        },
+
+        computed: {
+            newStyleStr: function() {
+                if (this.parentNode.styleStr && this.parentNode.styleStr.indexOf('text-align: center') > -1) {
+                    this.style += 'margin: 0 auto';
+                }
+                return this.style;
+            },
+            ...mapState('gConfig', {
+                windowWidth: (state) => {
+                    return state.imageWidth;
+                },
+            }),
+            newNode: function() {
+                return this.node;
+            }
+        },
+        methods: {
+            wxParseImgTap(e) {
+                if (!this.preview) return;
+                const { src } = e.currentTarget.dataset;
+                if (!src) return;
+                let parent = this.$parent;
+                while (!parent.preview || typeof parent.preview !== 'function') {
+                    parent = parent.$parent;
+                }
+                parent.preview(src, e);
+            },
+            // 图片视觉宽高计算函数区
+            wxParseImgLoad(e) {
+                const { src } = e.currentTarget.dataset;
+                if (!src) return;
+                let { width, height } = e.mp.detail;
+                const recal = this.wxAutoImageCal(width, height);
+                const { imageheight, imageWidth } = recal;
+                const { padding, mode } = this.newNode.attr;//删除padding
+                const { styleStr } = this.newNode;
+                const imageHeightStyle = mode === 'widthFix' ? '' : `height: ${imageheight}px;`;
+                this.$nextTick().then(() => {
+                    this.style = `${styleStr ? styleStr: null}; ${imageHeightStyle}; width: ${imageWidth}; padding: 0 ${+padding}px;display:block;`;//删除padding
+                });
+            },
+            wxAutoImageCal(originalWidth, originalHeight) {
+                // 获取图片的原始长宽
+                const windowWidth = this.windowWidth;
+
+                const results = {};
+
+                if (originalWidth < 60 || originalHeight < 60) {
+                    const { src } = this.newNode.attr;
+                    let parent = this.$parent;
+                    while (!parent.preview || typeof parent.preview !== 'function') {
+                        parent = parent.$parent;
+                    }
+                    parent.removeImageUrl(src);
+                    this.preview = false;
+                }
+                results.imageWidth = originalWidth;
+                results.imageheight = originalHeight;
+                // 判断按照那种方式进行缩放
+                if (originalWidth  > windowWidth) {
+                    // 在图片width大于手机屏幕width时候
+                    results.imageWidth = `100%`;
+                    results.imageheight = windowWidth * (uni.upx2px(originalHeight) / uni.upx2px(originalWidth));
+                } else {
+                    // 否则展示原来的数据
+                    results.imageWidth = `${uni.upx2px(originalWidth)}px`;
+                    results.imageheight = uni.upx2px(originalHeight);
+                }
+                return results;
+            }
+        }
+    };
+</script>
+
+<style lang="scss">
+    image:host{
+        width: 702upx;
+    }
+</style>

+ 52 - 0
src/components/basic-component/app-rich/components/wxParseTable.vue

xqd
@@ -0,0 +1,52 @@
+<template>
+	<rich-text style="width: 100%" :nodes="nodes" :class="node.classStr"></rich-text>
+</template>
+<script>
+export default {
+	name: 'wxParseTable',
+	props: {
+		node: {
+			type: Object,
+			default() {
+				return {};
+			},
+		},
+	},
+	data() {
+		return {
+			nodes:[]
+		};
+	},
+	mounted() {
+		this.nodes=this.loadNode([this.node]);
+	},
+	methods: {
+		loadNode(node) {
+			let obj = [];
+			for (let children of node) {
+				if (children.node=='element') {
+					let t = {
+						name:children.tag,
+						attrs: {
+							class: children.classStr,
+							style: children.styleStr,
+						},
+						children: children.nodes?this.loadNode(children.nodes):[]
+					};
+					
+					obj.push(t)
+				} else if(children.node=='text'){
+					obj.push({
+						type: 'text',
+						text: children.text
+					})
+				}
+			}
+			return obj
+		}
+	}
+};
+</script>
+<style>
+	@import url("../parse.scss");
+</style>

+ 143 - 0
src/components/basic-component/app-rich/components/wxParseTemplate0.vue

xqd
@@ -0,0 +1,143 @@
+<template>
+	<!--判断是否是标签节点-->
+	<block v-if="node.node === 'element'">
+
+		<!--button类型-->
+		<button v-if="node.tag === 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<we-parse-template-1 :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag === 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(item, index) of node.nodes" :key="index">
+				<we-parse-template-1 :node="item" :parent-node="node"/>
+			</block>
+		</view>
+		
+		<!--div类型-->
+		<view v-else-if="node.tag === 'div'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(item, index) of node.nodes" :key="index">
+				<we-parse-template-1 :node="item" :parent-node="node"/>
+			</block>
+		</view>
+		
+		<!--span类型-->
+		<view v-else-if="node.tag === 'span'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(item, index) of node.nodes" :key="index">
+				<we-parse-template-1 :node="item" :parent-node="node"/>
+			</block>
+		</view>
+		
+		<!--p类型-->
+		<view v-else-if="node.tag === 'p'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(item, index) of node.nodes" :key="index">
+				<we-parse-template-1 :node="item" :parent-node="node"/>
+			</block>
+		</view>
+		
+		<!--ul类型-->
+		<view v-else-if="node.tag === 'ul'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(item, index) of node.nodes" :key="index">
+				<we-parse-template-1 :node="item" :parent-node="node"/>
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag === 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(item, index) of node.nodes" :key="index">
+				<we-parse-template-1 :node="item" :parent-node="node"/>
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag === 'table'" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<text v-else-if="node.tag === 'br'">\n</text>
+
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag === 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag === 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :parent-node="parentNode" :node="node" v-else-if="node.tag === 'img'" :style="node.styleStr"/>
+		
+		<!-- strong标签 -->
+		<view v-else-if="node.tag === 'strong'" style="font-weight: bold;display: inline;">
+			<block v-for="(item, index) of node.nodes" :key="index">
+				<we-parse-template-1 :node="item" :parent-node="node"/>
+			</block>
+		</view>
+		
+		<!-- em标签 -->
+		<view v-else-if="node.tag === 'em'" style="font-style: italic">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<we-parse-template-1 :node="node" />
+			</block>
+		</view>
+		
+		<!-- section标签 -->
+		<view v-else-if="node.tag === 'section'" >
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<we-parse-template-1 :node="node" />
+			</block>
+		</view>
+		
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(item, index) of node.nodes" :key="index">
+				<we-parse-template-1 :node="item" :parent-node="node"/>
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node === 'text'">
+		<text>{{node.text}}</text>
+	</block>
+</template>
+
+<script>
+	
+	import wxParseTemplate from './wxParseTemplate1';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+
+	export default {
+		name: 'wxParseTemplate0',
+
+		props: {
+			node: {
+			    type: Object,
+				default() {
+			        return {}
+				}
+			},
+            parentNode: {}
+		},
+		components: {
+			'we-parse-template-1': wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;// TODO currentTarget才有dataset
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {// TODO 遍历获取父节点执行方法
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			},
+		}
+	};
+</script>

+ 139 - 0
src/components/basic-component/app-rich/components/wxParseTemplate1.vue

xqd
@@ -0,0 +1,139 @@
+<template>
+	<!--判断是否是标签节点-->
+	<block v-if="node.node === 'element'">
+		<!--button类型-->
+		<button v-if="node.tag === 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag === 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(item, index) of node.nodes" :key="index">
+				<wx-parse-template :node="item" :parent-node="node"/>
+			</block>
+		</view>
+		
+		<!--div类型-->
+		<view v-else-if="node.tag === 'div'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(item, index) of node.nodes" :key="index">
+				<wx-parse-template :node="item" :parent-node="node"/>
+			</block>
+		</view>
+		
+		<!--span类型-->
+		<view v-else-if="node.tag === 'span'" :class="node.classStr" :style="node.styleStr">
+            <block v-for="(item, index) of node.nodes" :key="index">
+                <wx-parse-template :node="item" :parent-node="node"/>
+            </block>
+		</view>
+		
+		<!--p类型-->
+		<view v-else-if="node.tag === 'p'" :class="node.classStr" :style="node.styleStr">
+            <block v-for="(item, index) of node.nodes" :key="index">
+                <wx-parse-template :node="item" :parent-node="node"/>
+            </block>
+		</view>
+		
+		<!--ul类型-->
+		<view v-else-if="node.tag === 'ul'" :class="node.classStr" :style="node.styleStr">
+            <block v-for="(item, index) of node.nodes" :key="index">
+                <wx-parse-template :node="item" :parent-node="node"/>
+            </block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag === 'li'" :class="node.classStr" :style="node.styleStr">
+            <block v-for="(item, index) of node.nodes" :key="index">
+                <wx-parse-template :node="item" :parent-node="node"/>
+            </block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag === 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<text v-else-if="node.tag === 'br'">\n</text>
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag === 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag === 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :parent-node="parentNode" :node="node" v-else-if="node.tag === 'img'" :style="node.styleStr"/>
+		
+		<!-- strong标签 -->
+		<view v-else-if="node.tag === 'strong'" style="display: inline;font-weight: bold;">
+            <block v-for="(item, index) of node.nodes" :key="index">
+                <wx-parse-template :node="item" :parent-node="node"/>
+            </block>
+		</view>
+		
+		<!-- em标签 -->
+		<view v-else-if="node.tag === 'em'" style="font-style: italic">
+            <block v-for="(item, index) of node.nodes" :key="index">
+                <wx-parse-template :node="item" :parent-node="node"/>
+            </block>
+		</view>
+		
+		<!-- section标签 -->
+		<view v-else-if="node.tag === 'section'" >
+            <block v-for="(item, index) of node.nodes" :key="index">
+                <wx-parse-template :node="item" :parent-node="node"/>
+            </block>
+		</view>
+		
+<!--		&lt;!&ndash;其他标签&ndash;&gt;-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(item, index) of node.nodes" :key="index">
+				<wx-parse-template :node="item" :parent-node="node"/>
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node === 'text'">
+		<text>{{node.text}}</text>
+	</block>
+</template>
+
+<script>
+    // #ifdef MP
+	import wxParseTemplate from './wxParseTemplate0';
+	// #endif
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate1',
+		props: {
+			node: {},
+            parentNode: {}
+		},
+		components: {
+		    // #ifdef MP
+			wxParseTemplate,
+            // #endif
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			},
+		},
+	};
+</script>

+ 15 - 0
src/components/basic-component/app-rich/components/wxParseVideo.vue

xqd
@@ -0,0 +1,15 @@
+<template>
+    <!--增加video标签支持,并循环添加-->
+    <view :class="node.classStr" :style="node.styleStr">
+        <video :class="node.classStr" :style="node.styleStr" class="video-video" :src="node.attr.src"></video>
+    </view>
+</template>
+
+<script>
+    export default {
+        name: 'wxParseVideo',
+        props: {
+            node: {},
+        },
+    };
+</script>

+ 234 - 0
src/components/basic-component/app-rich/libs/html2json.js

xqd
@@ -0,0 +1,234 @@
+import wxDiscode from './wxDiscode';
+import HTMLParser from './htmlparser';
+
+function makeMap(str) {
+    const obj = {};
+    const items = str.split(',');
+    for (let i = 0; i < items.length; i += 1) obj[items[i]] = true;
+    return obj;
+}
+
+const block = makeMap('br,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video');
+
+const inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var');
+
+const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
+
+function removeDOCTYPE(html) {
+    return /<body.*>([^]*)<\/body>/.test(html) ? RegExp.$1 : html;
+}
+
+function trimHtml(html) {
+    return html.replace(/<!--.*?-->/gi, '').replace(/\/\*.*?\*\//gi, '').replace(/[ ]+</gi, '<').replace(/<script[^]*<\/script>/gi, '').replace(/<style[^]*<\/style>/gi, '');
+}
+
+function getScreenInfo() {
+    const screen = {};
+    wx.getSystemInfo({
+        success: (res) => {
+            screen.width = res.windowWidth;
+            screen.height = res.windowHeight;
+        },
+    });
+    return screen;
+}
+
+function html2json(html, customHandler, imageProp, host) {
+    // 处理字符串
+    html = removeDOCTYPE(html);
+    // 去除注释 样式 js
+    html = trimHtml(html);
+    html = wxDiscode.strDiscode(html);
+    const bufArray = [];
+
+    const results = {
+        nodes: [],
+        imageUrls: [],
+    };
+
+    const screen = getScreenInfo();
+    function Node(tag) {
+        this.node = 'element';
+        this.tag = tag;
+        this.$screen = screen;
+    }
+
+    HTMLParser(html, {
+        start(tag, attrs, unary) {
+            const node = new Node(tag);
+
+            if (bufArray.length !== 0) {
+                const parent = bufArray[0];
+                if (parent.nodes === undefined) {
+                    parent.nodes = [];
+                }
+            }
+
+            if (block[tag]) {
+                node.tagType = 'block';
+            } else if (inline[tag]) {
+                node.tagType = 'inline';
+            } else if (closeSelf[tag]) {
+                node.tagType = 'closeSelf';
+            }
+
+            node.attr = attrs.reduce((pre, attr) => {
+                const { name } = attr;
+                let { value } = attr;
+                if (name === 'class') {
+                    node.classStr = value;
+                }
+
+                if (name === 'style') {
+                    node.styleStr = value;
+                }
+
+                if (value.match(/ /)) {
+                    value = value.split(' ');
+                }
+
+                // merge it
+                if (pre[name]) {
+                    if (Array.isArray(pre[name])) {
+                        // already array, push to last
+                        pre[name].push(value);
+                    } else {
+                        // single value, make it array
+                        pre[name] = [pre[name], value];
+                    }
+                } else {
+                    // not exist, put it
+                    pre[name] = value;
+                }
+
+                return pre;
+            }, {});
+
+            // 优化样式相关属性
+            if (node.classStr) {
+                node.classStr += ` ${node.tag}`;
+            } else {
+                node.classStr = node.tag;
+            }
+            if (node.tagType === 'inline') {
+                node.classStr += ' inline';
+            }
+
+            // 对img添加额外数据
+            if (node.tag === 'img') {
+                let imgUrl = node.attr.src;
+                imgUrl = wxDiscode.urlToHttpUrl(imgUrl, imageProp.domain);
+                Object.assign(node.attr, imageProp, {
+                    src: imgUrl || '',
+                });
+                if (imgUrl) {
+                    results.imageUrls.push(imgUrl);
+                }
+            }
+            // 处理a标签属性
+            if (node.tag === 'a') {
+                node.attr.href = node.attr.href || '';
+            }
+
+            // 处理font标签样式属性
+            if (node.tag === 'font') {
+                const fontSize = [
+                    'x-small',
+                    'small',
+                    'medium',
+                    'large',
+                    'x-large',
+                    'xx-large',
+                    '-webkit-xxx-large',
+                ];
+                const styleAttrs = {
+                    color: 'color',
+                    face: 'font-family',
+                    size: 'font-size',
+                };
+                if (!node.styleStr) node.styleStr = '';
+                Object.keys(styleAttrs).forEach((key) => {
+                    if (node.attr[key]) {
+                        const value = key === 'size' ? fontSize[node.attr[key] - 1] : node.attr[key];
+                        node.styleStr += `${styleAttrs[key]}: ${value};`;
+                    }
+                });
+            }
+
+            // 临时记录source资源
+            if (node.tag === 'source') {
+                results.source = node.attr.src;
+            }
+
+            // #ifndef MP-BAIDU
+            if (customHandler.start) {
+                customHandler.start(node, results);
+            }
+            // #endif
+
+            if (unary) {
+                // if this tag doesn't have end tag
+                // like <img src="hoge.png"/>
+                // add to parents
+                const parent = bufArray[0] || results;
+                if (parent.nodes === undefined) {
+                    parent.nodes = [];
+                }
+                parent.nodes.push(node);
+            } else {
+                bufArray.unshift(node);
+            }
+        },
+        end(tag) {
+            const node = bufArray.shift();
+            if (node.tag !== tag) {
+                console.error('invalid state: mismatch end tag');
+            }
+
+            if (node.tag === 'video' && results.source) {
+                node.attr.src = results.source;
+                delete results.source;
+            }
+
+            if (customHandler.end) {
+                customHandler.end(node, results);
+            }
+
+            if (bufArray.length === 0) {
+                results.nodes.push(node);
+            } else {
+                const parent = bufArray[0];
+                if (!parent.nodes) {
+                    parent.nodes = [];
+                }
+                parent.nodes.push(node);
+            }
+        },
+        chars(text) {
+            if (!text.trim()) return;
+
+            const node = {
+                node: 'text',
+                text,
+            };
+
+            if (customHandler.chars) {
+                customHandler.chars(node, results);
+            }
+
+            if (bufArray.length === 0) {
+                results.nodes.push(node);
+            } else {
+                const parent = bufArray[0];
+                if (parent.nodes === undefined) {
+                    parent.nodes = [];
+                }
+                parent.nodes.push(node);
+            }
+        },
+    });
+
+    return results;
+}
+
+export default html2json;

+ 126 - 0
src/components/basic-component/app-rich/libs/htmlparser.js

xqd
@@ -0,0 +1,126 @@
+
+const startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z0-9_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
+const endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
+const attr = /([a-zA-Z0-9_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
+
+function makeMap(str) {
+    const obj = {};
+    const items = str.split(',');
+    for (let i = 0; i < items.length; i += 1) obj[items[i]] = true;
+    return obj;
+}
+
+const empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr');
+
+const block = makeMap('address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video');
+
+const inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var');
+
+const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
+
+const fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected');
+
+function HTMLParser(html, handler) {
+    let index;
+    let chars;
+    let match;
+    let last = html;
+    const stack = [];
+
+    stack.last = () => stack[stack.length - 1];
+
+    function parseEndTag(tag, tagName) {
+        let pos;
+        if (!tagName) {
+            pos = 0;
+        } else {
+            tagName = tagName.toLowerCase();
+            for (pos = stack.length - 1; pos >= 0; pos -= 1) {
+                if (stack[pos] === tagName) break;
+            }
+        }
+        if (pos >= 0) {
+            for (let i = stack.length - 1; i >= pos; i -= 1) {
+                if (handler.end) handler.end(stack[i]);
+            }
+            stack.length = pos;
+        }
+    }
+
+    function parseStartTag(tag, tagName, rest, unary) {
+        tagName = tagName.toLowerCase();
+
+        if (block[tagName]) {
+            while (stack.last() && inline[stack.last()]) {
+                parseEndTag('', stack.last());
+            }
+        }
+
+        if (closeSelf[tagName] && stack.last() === tagName) {
+            parseEndTag('', tagName);
+        }
+
+        unary = empty[tagName] || !!unary;
+
+        if (!unary) stack.push(tagName);
+
+        if (handler.start) {
+            const attrs = [];
+
+            rest.replace(attr, function genAttr(matches, name) {
+                const value = arguments[2] || arguments[3] || arguments[4] || (fillAttrs[name] ? name : '');
+
+                attrs.push({
+                    name,
+                    value,
+                    escaped: value.replace(/(^|[^\\])"/g, '$1\\"'), // "
+                });
+            });
+
+            if (handler.start) {
+                handler.start(tagName, attrs, unary);
+            }
+        }
+    }
+
+    while (html) {
+        chars = true;
+
+        if (html.indexOf('</') === 0) {
+            match = html.match(endTag);
+            if (match) {
+                html = html.substring(match[0].length);
+                match[0].replace(endTag, parseEndTag);
+                chars = false;
+            }
+        } else if (html.indexOf('<') === 0) {
+            match = html.match(startTag);
+            if (match) {
+                html = html.substring(match[0].length);
+                match[0].replace(startTag, parseStartTag);
+                chars = false;
+            }
+        }
+
+        if (chars) {
+            index = html.indexOf('<');
+            let text = '';
+            while (index === 0) {
+                text += '<';
+                html = html.substring(1);
+                index = html.indexOf('<');
+            }
+            text += index < 0 ? html : html.substring(0, index);
+            html = index < 0 ? '' : html.substring(index);
+
+            if (handler.chars) handler.chars(text);
+        }
+
+        if (html === last) throw new Error(`Parse Error: ${html}`);
+        last = html;
+    }
+
+    parseEndTag();
+}
+
+export default HTMLParser;

+ 210 - 0
src/components/basic-component/app-rich/libs/wxDiscode.js

xqd
@@ -0,0 +1,210 @@
+// HTML 支持的数学符号
+function strNumDiscode(str) {
+    str = str.replace(/&forall;/g, '∀');
+    str = str.replace(/&part;/g, '∂');
+    str = str.replace(/&exist;/g, '∃');
+    str = str.replace(/&empty;/g, '∅');
+    str = str.replace(/&nabla;/g, '∇');
+    str = str.replace(/&isin;/g, '∈');
+    str = str.replace(/&notin;/g, '∉');
+    str = str.replace(/&ni;/g, '∋');
+    str = str.replace(/&prod;/g, '∏');
+    str = str.replace(/&sum;/g, '∑');
+    str = str.replace(/&minus;/g, '−');
+    str = str.replace(/&lowast;/g, '∗');
+    str = str.replace(/&radic;/g, '√');
+    str = str.replace(/&prop;/g, '∝');
+    str = str.replace(/&infin;/g, '∞');
+    str = str.replace(/&ang;/g, '∠');
+    str = str.replace(/&and;/g, '∧');
+    str = str.replace(/&or;/g, '∨');
+    str = str.replace(/&cap;/g, '∩');
+    str = str.replace(/&cup;/g, '∪');
+    str = str.replace(/&int;/g, '∫');
+    str = str.replace(/&there4;/g, '∴');
+    str = str.replace(/&sim;/g, '∼');
+    str = str.replace(/&cong;/g, '≅');
+    str = str.replace(/&asymp;/g, '≈');
+    str = str.replace(/&ne;/g, '≠');
+    str = str.replace(/&le;/g, '≤');
+    str = str.replace(/&ge;/g, '≥');
+    str = str.replace(/&sub;/g, '⊂');
+    str = str.replace(/&sup;/g, '⊃');
+    str = str.replace(/&nsub;/g, '⊄');
+    str = str.replace(/&sube;/g, '⊆');
+    str = str.replace(/&supe;/g, '⊇');
+    str = str.replace(/&oplus;/g, '⊕');
+    str = str.replace(/&otimes;/g, '⊗');
+    str = str.replace(/&perp;/g, '⊥');
+    str = str.replace(/&sdot;/g, '⋅');
+    return str;
+}
+
+// HTML 支持的希腊字母
+function strGreeceDiscode(str) {
+    str = str.replace(/&Alpha;/g, 'Α');
+    str = str.replace(/&Beta;/g, 'Β');
+    str = str.replace(/&Gamma;/g, 'Γ');
+    str = str.replace(/&Delta;/g, 'Δ');
+    str = str.replace(/&Epsilon;/g, 'Ε');
+    str = str.replace(/&Zeta;/g, 'Ζ');
+    str = str.replace(/&Eta;/g, 'Η');
+    str = str.replace(/&Theta;/g, 'Θ');
+    str = str.replace(/&Iota;/g, 'Ι');
+    str = str.replace(/&Kappa;/g, 'Κ');
+    str = str.replace(/&Lambda;/g, 'Λ');
+    str = str.replace(/&Mu;/g, 'Μ');
+    str = str.replace(/&Nu;/g, 'Ν');
+    str = str.replace(/&Xi;/g, 'Ν');
+    str = str.replace(/&Omicron;/g, 'Ο');
+    str = str.replace(/&Pi;/g, 'Π');
+    str = str.replace(/&Rho;/g, 'Ρ');
+    str = str.replace(/&Sigma;/g, 'Σ');
+    str = str.replace(/&Tau;/g, 'Τ');
+    str = str.replace(/&Upsilon;/g, 'Υ');
+    str = str.replace(/&Phi;/g, 'Φ');
+    str = str.replace(/&Chi;/g, 'Χ');
+    str = str.replace(/&Psi;/g, 'Ψ');
+    str = str.replace(/&Omega;/g, 'Ω');
+
+    str = str.replace(/&alpha;/g, 'α');
+    str = str.replace(/&beta;/g, 'β');
+    str = str.replace(/&gamma;/g, 'γ');
+    str = str.replace(/&delta;/g, 'δ');
+    str = str.replace(/&epsilon;/g, 'ε');
+    str = str.replace(/&zeta;/g, 'ζ');
+    str = str.replace(/&eta;/g, 'η');
+    str = str.replace(/&theta;/g, 'θ');
+    str = str.replace(/&iota;/g, 'ι');
+    str = str.replace(/&kappa;/g, 'κ');
+    str = str.replace(/&lambda;/g, 'λ');
+    str = str.replace(/&mu;/g, 'μ');
+    str = str.replace(/&nu;/g, 'ν');
+    str = str.replace(/&xi;/g, 'ξ');
+    str = str.replace(/&omicron;/g, 'ο');
+    str = str.replace(/&pi;/g, 'π');
+    str = str.replace(/&rho;/g, 'ρ');
+    str = str.replace(/&sigmaf;/g, 'ς');
+    str = str.replace(/&sigma;/g, 'σ');
+    str = str.replace(/&tau;/g, 'τ');
+    str = str.replace(/&upsilon;/g, 'υ');
+    str = str.replace(/&phi;/g, 'φ');
+    str = str.replace(/&chi;/g, 'χ');
+    str = str.replace(/&psi;/g, 'ψ');
+    str = str.replace(/&omega;/g, 'ω');
+    str = str.replace(/&thetasym;/g, 'ϑ');
+    str = str.replace(/&upsih;/g, 'ϒ');
+    str = str.replace(/&piv;/g, 'ϖ');
+    str = str.replace(/&middot;/g, '·');
+    return str;
+}
+
+function strcharacterDiscode(str) {
+    // 加入常用解析
+    str = str.replace(/&nbsp;/g, ' ');
+    str = str.replace(/&ensp;/g, ' ');
+    str = str.replace(/&emsp;/g, ' ');
+    str = str.replace(/&quot;/g, "'");
+    str = str.replace(/&amp;/g, '&');
+    str = str.replace(/&lt;/g, '<');
+    str = str.replace(/&gt;/g, '>');
+    str = str.replace(/&#8226;/g, '•');
+
+    return str;
+}
+
+// HTML 支持的其他实体
+function strOtherDiscode(str) {
+    str = str.replace(/&OElig;/g, 'Œ');
+    str = str.replace(/&oelig;/g, 'œ');
+    str = str.replace(/&Scaron;/g, 'Š');
+    str = str.replace(/&scaron;/g, 'š');
+    str = str.replace(/&Yuml;/g, 'Ÿ');
+    str = str.replace(/&fnof;/g, 'ƒ');
+    str = str.replace(/&circ;/g, 'ˆ');
+    str = str.replace(/&tilde;/g, '˜');
+    str = str.replace(/&ensp;/g, '');
+    str = str.replace(/&emsp;/g, '');
+    str = str.replace(/&thinsp;/g, '');
+    str = str.replace(/&zwnj;/g, '');
+    str = str.replace(/&zwj;/g, '');
+    str = str.replace(/&lrm;/g, '');
+    str = str.replace(/&rlm;/g, '');
+    str = str.replace(/&ndash;/g, '–');
+    str = str.replace(/&mdash;/g, '—');
+    str = str.replace(/&lsquo;/g, '‘');
+    str = str.replace(/&rsquo;/g, '’');
+    str = str.replace(/&sbquo;/g, '‚');
+    str = str.replace(/&ldquo;/g, '“');
+    str = str.replace(/&rdquo;/g, '”');
+    str = str.replace(/&bdquo;/g, '„');
+    str = str.replace(/&dagger;/g, '†');
+    str = str.replace(/&Dagger;/g, '‡');
+    str = str.replace(/&bull;/g, '•');
+    str = str.replace(/&hellip;/g, '…');
+    str = str.replace(/&permil;/g, '‰');
+    str = str.replace(/&prime;/g, '′');
+    str = str.replace(/&Prime;/g, '″');
+    str = str.replace(/&lsaquo;/g, '‹');
+    str = str.replace(/&rsaquo;/g, '›');
+    str = str.replace(/&oline;/g, '‾');
+    str = str.replace(/&euro;/g, '€');
+    str = str.replace(/&trade;/g, '™');
+
+    str = str.replace(/&larr;/g, '←');
+    str = str.replace(/&uarr;/g, '↑');
+    str = str.replace(/&rarr;/g, '→');
+    str = str.replace(/&darr;/g, '↓');
+    str = str.replace(/&harr;/g, '↔');
+    str = str.replace(/&crarr;/g, '↵');
+    str = str.replace(/&lceil;/g, '⌈');
+    str = str.replace(/&rceil;/g, '⌉');
+
+    str = str.replace(/&lfloor;/g, '⌊');
+    str = str.replace(/&rfloor;/g, '⌋');
+    str = str.replace(/&loz;/g, '◊');
+    str = str.replace(/&spades;/g, '♠');
+    str = str.replace(/&clubs;/g, '♣');
+    str = str.replace(/&hearts;/g, '♥');
+
+    str = str.replace(/&diams;/g, '♦');
+    str = str.replace(/&#39;/g, "'");
+    return str;
+}
+
+function strDiscode(str) {
+    str = strNumDiscode(str);
+    str = strGreeceDiscode(str);
+    str = strcharacterDiscode(str);
+    str = strOtherDiscode(str);
+    return str;
+}
+
+function urlToHttpUrl(url, domain) {
+    if (/^\/\//.test(url)) {
+        return `https:${url}`;
+    } else if (/^\//.test(url)) {
+        return `https://${domain}${url}`;
+    } else if (Array.isArray(url)) {
+        return arrUrl(url, domain);
+    }
+    return url;
+}
+
+function arrUrl(data, domain) {
+    for (let i = 0; i < data.length; i++) {
+        if (data[i] !== '') {
+            if (/^\/\//.test(data[i])) {
+                return `https:${data[i]}`;
+            } else if (/^\//.test(data[i])) {
+                return `https://${domain}${data[i]}`;
+            }
+            return data[i];
+        }
+    }
+}
+
+export default {
+    strDiscode,
+    urlToHttpUrl,
+};

+ 228 - 0
src/components/basic-component/app-rich/parse.scss

xqd
@@ -0,0 +1,228 @@
+.wxParse {
+	user-select:none;
+	width: 100%;
+	color: #333;
+	line-height: 1.5;
+	font-size: 1em;
+	text-align:justify;/* //左右两端对齐 */
+	white-space: pre-wrap
+}
+.wxParse view ,.wxParse uni-view{
+	word-break: break-word;
+}
+.wxParse .p {
+	padding-bottom: 0.5em;
+	clear: both;
+	/* letter-spacing: 0;//字间距 */
+}
+.wxParse .inline {
+  display: inline;
+  margin: 0;
+  padding: 0;
+}
+
+.wxParse .div {
+  margin: 0;
+  padding: 0;
+  display: block;
+}
+
+.wxParse .h1{
+  font-size: 2em;
+  line-height: 1.2em;
+  margin: 0.67em 0;
+}
+.wxParse .h2{
+  font-size: 1.5em;
+  margin: 0.83em 0;
+}
+.wxParse .h3{
+  font-size: 1.17em;
+  margin: 1em 0;
+}
+.wxParse .h4{
+  margin: 1.33em 0;
+}
+.wxParse .h5{
+  font-size: 0.83em;
+  margin: 1.67em 0;
+}
+.wxParse .h6{
+  font-size: 0.83em;
+  margin: 1.67em 0;
+}
+
+.wxParse .h1,
+.wxParse .h2,
+.wxParse .h3,
+.wxParse .h4,
+.wxParse .h5,
+.wxParse .h6,
+.wxParse .b,
+.wxParse .strong{
+  font-weight: bolder;
+}
+
+.wxParse .i,
+.wxParse .cite,
+.wxParse .em,
+.wxParse .var,
+.wxParse .address {
+  font-style: italic;
+}
+
+.wxParse .pre,
+.wxParse .tt,
+.wxParse .code,
+.wxParse .kbd,
+.wxParse .samp {
+  font-family: monospace;
+}
+.wxParse .pre {
+  overflow: auto;
+  background: #f5f5f5;
+  padding: 16rpx;
+  white-space: pre;
+  margin: 1em 0rpx;
+}
+.wxParse .code {
+  display: inline;
+  background: #f5f5f5;
+}
+
+.wxParse .big {
+  font-size: 1.17em;
+}
+
+.wxParse .small,
+.wxParse .sub,
+.wxParse .sup {
+  font-size: 0.83em;
+}
+
+.wxParse .sub {
+  vertical-align: sub;
+}
+.wxParse .sup {
+  vertical-align: super;
+}
+
+.wxParse .s,
+.wxParse .strike,
+.wxParse .del {
+  text-decoration: line-through;
+}
+
+.wxParse .strong,
+.wxParse .s {
+  display: inline;
+}
+
+.wxParse .a {
+  color: deepskyblue;
+}
+
+.wxParse .video {
+  text-align: center;
+  margin: 22rpx 0;
+}
+
+.wxParse .video-video {
+  width: 100%;
+}
+.wxParse .uni-image{
+	max-width: 100%;
+}
+.wxParse .img {
+  display: block;
+  max-width: 100%;
+  margin-bottom: 0em;/* //与p标签底部padding同时修改 */
+  overflow: hidden;
+}
+
+.wxParse .blockquote {
+  margin: 10rpx 0;
+  padding: 22rpx 0 22rpx 22rpx;
+  //font-family: Courier, Calibri, '宋体';
+  background: #f5f5f5;
+  border-left: 6rpx solid #dbdbdb;
+}
+.wxParse .blockquote .p {
+  margin: 0;
+}
+.wxParse .ul, .wxParse .ol {
+  display: block;
+  margin: 1em 0;
+  padding-left: 2em;
+}
+.wxParse .ol {
+  list-style-type: disc;
+}
+.wxParse .ol {
+  list-style-type: decimal;
+}
+.wxParse .ol>weixin-parse-template,.wxParse .ul>weixin-parse-template {
+  display: list-item;
+  align-items: baseline;
+  text-align: match-parent;
+}
+
+.wxParse .ol>.li,.wxParse .ul>.li {
+  display: list-item;
+  align-items: baseline;
+  text-align: match-parent;
+}
+.wxParse .ul .ul, .wxParse .ol .ul {
+  list-style-type: circle;
+}
+.wxParse .ol .ol .ul, .wxParse .ol .ul .ul, .wxParse .ul .ol .ul, .wxParse .ul .ul .ul {
+    list-style-type: square;
+}
+
+.wxParse .u {
+  text-decoration: underline;
+}
+.wxParse .hide {
+  display: none;
+}
+.wxParse .del {
+  display: inline;
+}
+.wxParse .figure {
+  overflow: hidden;
+}
+.wxParse .table .table{
+	border-collapse:collapse;
+	box-sizing: border-box;
+	/* 内边框 */
+	border: 1px solid #dadada;
+	width: 100%;
+}
+.wxParse .tbody{
+	border-collapse:collapse;
+	box-sizing: border-box;
+	/* 内边框 */
+	border: 1px solid #dadada;
+}
+.wxParse .thead, .wxParse .tfoot, .wxParse .th{
+	border-collapse:collapse;
+	box-sizing: border-box;
+	background: #ececec;
+	font-weight: 40;
+}
+.wxParse .tr {
+	border-collapse:collapse;
+	box-sizing: border-box;
+	border: 2px solid #F0AD4E; 
+	overflow:auto;
+}
+.wxParse .th,
+.wxParse .td{
+	border-collapse:collapse;
+	box-sizing: border-box;
+	border: 2rpx solid #dadada;
+	overflow:auto;
+}
+.wxParse .audio, .wxParse .uni-audio-default{
+	display: block;
+}

+ 138 - 0
src/components/basic-component/app-rich/parse.vue

xqd
@@ -0,0 +1,138 @@
+
+<template>
+	<!--基础元素-->
+	<view class="wxParse" :class="className" :style="'user-select:' + userSelect + ';background-color: ' + background">
+		<template v-if="!loading">
+			<block v-for="(node, index) of nodes" :key="index"  >
+				<wxParseTemplate :node="node" :parent-node="nodes"/>
+			</block>
+		</template>
+	</view>
+</template>
+
+<script>
+import HtmlToJson from './libs/html2json';
+import wxParseTemplate from './components/wxParseTemplate0';
+
+export default {
+	name: 'wxParse',
+	props: {
+		userSelect:{
+			type:String,
+			default:'text'
+		},
+		imgOptions:{
+			type:[Object,Boolean],
+			default:function(){
+				return {
+					loop: false,
+					indicator:'number',
+					longPressActions:false
+				}
+			}
+		},
+		loading: {
+			type: Boolean,
+			default: false
+		},
+		background: {
+			type: String,
+			default: '#ffffff'
+		},
+		className: {
+			type: String,
+			default: ''
+		},
+		content: {
+			type: String,
+			default: ''
+		},
+		noData: {
+			type: String,
+			default: ''
+		},
+		startHandler: {
+			type: Function,
+			default() {
+				return node => {
+					node.attr.class = null;
+					node.attr.style = null;
+				};
+			}
+		},
+		endHandler: {
+			type: Function,
+			default: null
+		},
+		charsHandler: {
+			type: Function,
+			default: null
+		},
+		imageProp: {
+			type: Object,
+			default() {
+				return {
+					mode: 'aspectFit',
+					padding: 0,
+					lazyLoad: false,
+					domain: ''
+				};
+			}
+		},
+	},
+	components: {
+		wxParseTemplate,
+	},
+	data() {
+		return {
+			nodes:{},
+			imageUrls: [],
+			wxParseWidth:{
+				value:0
+			}
+		};
+	},
+	mounted() {
+		this.setHtml();
+	},
+	methods: {
+		setHtml(){
+			let { content, noData, imageProp, startHandler, endHandler, charsHandler } = this;
+			let parseData = content || noData;
+			let customHandler = {
+				start: startHandler,
+				end: endHandler,
+				chars: charsHandler
+			};
+			let results = HtmlToJson(parseData, customHandler, imageProp, this);
+			this.imageUrls = results.imageUrls;
+			this.nodes = results.nodes;
+		},
+		navigate(href, $event) {
+			this.$emit('navigate', href, $event);
+		},
+		preview(src, $event) {
+			if (!this.imageUrls.length || typeof this.imgOptions === 'boolean'){
+			} else {
+				uni.previewImage({
+					current: src,
+					urls: this.imageUrls,
+					loop: this.imgOptions.loop,
+					indicator: this.imgOptions.indicator,
+					longPressActions: this.imgOptions.longPressActions
+				});
+			}
+			this.$emit('preview', src, $event);
+		},
+		removeImageUrl(src) {
+			const { imageUrls } = this;
+			imageUrls.splice(imageUrls.indexOf(src), 1);
+		}
+	},
+	watch: {
+      content() {
+        this.setHtml();
+      }
+    }
+};
+</script>

+ 82 - 0
src/components/basic-component/app-switch-tab/app-switch-tab.vue

xqd
@@ -0,0 +1,82 @@
+<template>
+    <view class='app-switch-tab dir-left-nowrap'
+          :class="isborderBottom ? 'tab-bottom-border' : ''"
+          :style="{'background-color':bgColor,'height': tabHeight + 'rpx'}">
+        <view v-for="(item, index) in list" :key="index" @click='tabClick(index)' class='box-grow-1 main-center'>
+            <view class="item cross-center" :class="dIndex == index ? theme + '-m-text active-item ' + theme : 'no-active-item'">
+                {{item.name}}
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    export default {
+        props: {
+            bgColor: {
+                type: String,
+                default: '#fff'
+            },
+            list: {
+                type: Array,
+                default: []
+            },
+            tabHeight: {
+                // 高度
+                type: Number,
+                default: 80
+            },
+            currentIndex: {
+                // 当前点击的元素索引
+                type: Number,
+                default: 0,
+            },
+            isborderBottom: {
+                type: Boolean,
+                default: true
+            },
+            theme: {
+                type: String,
+                default: 'default'
+            }
+        },
+        data() {
+            return {}
+        },
+        computed: {
+            dIndex: function () {
+                return this.currentIndex;
+            }
+        },
+        methods: {
+            tabClick(index) {
+                this.$emit('tabEvent', {
+                    currentIndex: index
+                });
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .item {
+        height: 100%;
+    }
+   
+    .tab-bottom-border {
+        border-bottom: #{1rpx} solid $uni-weak-color-one;
+    }
+
+    .no-active-item {
+        border-bottom: #{4rpx} solid trasparent;
+    }
+    .active-item {
+        border-bottom: #{4rpx} solid;
+    }
+    .default-m-text {
+        color: #ff4544;
+    }
+    .blue-m-text {
+        color: #446dfd;
+    }
+</style>

+ 110 - 0
src/components/basic-component/app-tab-bar/app-tab-bar.vue

xqd
@@ -0,0 +1,110 @@
+<template>
+	<view class="app-navigation-bar safe-area-inset-bottom" :style="{backgroundColor: bottom_background_color}"
+		:class="{'app-tab-bar-shadow': shadow}">
+		<view v-for="(item, index) in tabBarNavs.navs" :key="index" class="app-tab-bar-item box-grow-1"
+			:style="{height: botNavHei + 'rpx',backgroundColor: bottom_background_color, width: `${100/tabBarNavs.navs.length}%`}">
+			<app-jump-button :backgroundColor="bottom_background_color" form class="app-button" :url="item.url"
+				:open_type="item.open_type" :params="item.params" arrangement="column">
+				<image class="app-icon" :src=" router === item.url ? item.active_icon : item.icon"></image>
+				<text class="app-nav-text"
+					v-bind:style="{'color': router === item.url ? item.active_color : item.color}">
+					{{item.text}}
+				</text>
+			</app-jump-button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapGetters,
+		mapState
+	} from 'vuex';
+
+	export default {
+		data() {
+			return {
+				router: '',
+			}
+		},
+		props: {
+			pageCount: Number,
+		},
+		computed: {
+			...mapGetters('mallConfig', {
+				tabBarNavs: 'getNavBar'
+			}),
+			...mapGetters('iPhoneX', {
+				botNavHei: 'getNavHei',
+			}),
+			...mapState('mallConfig', {
+				bottom_background_color: state => state.navbar.bottom_background_color,
+				shadow: state => state.navbar.shadow,
+			}),
+		},
+		// #ifdef MP
+		created() {
+			this.router = this.$platDiff.tabBarUrl(null, this.pageCount);
+		},
+		// #endif
+		watch: {
+			// #ifdef H5
+			'$route': {
+				handler: function(data) {
+					let {
+						query,
+						meta
+					} = data;
+					let str = '?';
+					for (let key in query) {
+						str += `${key}=${query[key]}&`
+					}
+					let url = '/' + meta.pagePath + str;
+					url = url.slice(0, url.length - 1);
+					this.router = url;
+				},
+				deep: true,
+				immediate: true
+			}
+			// #endif
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	.app-navigation-bar {
+		display: flex;
+		flex-direction: row;
+		width: 100%;
+		bottom: 0;
+		left: 0;
+		background-color: white;
+		z-index: 1600;
+		position: fixed;
+	}
+
+	.app-nav-text {
+		font-size: #{22rpx};
+		line-height: #{22rpx};
+		margin-top: #{75rpx};
+	}
+
+	.app-icon {
+		width: #{50rpx};
+		height: #{50rpx};
+		position: absolute;
+		top: 0;
+		left: 50%;
+		margin-top: #{20rpx};
+		transform: translateX(-50%);
+	}
+
+	.app-tab-bar-item {
+		flex-grow: 1;
+		position: relative;
+	}
+
+	.app-tab-bar-shadow {
+		border-top: 1rpx solid $uni-weak-color-one;
+	}
+</style>

+ 110 - 0
src/components/basic-component/app-tab-nav/app-tab-nav.vue

xqd
@@ -0,0 +1,110 @@
+<template>
+    <view>
+        <view 
+            :class="[shadow ? `main-between app-nav shadow` : 'main-between app-nav']"
+            :style="[
+                {
+                    'line-height': `${setHeight ? setHeight : 90}rpx`,
+                    'font-size': `${fontSize ? fontSize : 28}rpx`,
+                    'height': `${setHeight ? setHeight : 90}rpx`,
+                    'top': `${setTop > 0 ? setTop + 'rpx' : '0'}`,
+                    'backgroundColor': `${background ? background : '#fff'}`,
+                }
+            ]"
+        >
+            <view @click="handleClick" v-for="(item) in tabList" :key="item.id" :data-id="item.id" class="box-grow-1 nav-item"
+            :style="[
+                {
+                    'borderBottom': `${border ? 1 : 0}rpx solid #e2e2e2`,
+                }
+            ]"
+            >
+                <text
+                    :class="[item.id == activeItem ? `active-text` : '']"
+                    :style="[
+                        {
+                            'color': `${ item.id == activeItem ? theme.color : '#353535'}`,
+                            'border-color':  `${ item.id == activeItem ? theme.color : ''}`,
+                            'height': `${setHeight ? setHeight : 90}rpx`,
+                            'padding': `0 ${padding}rpx`,
+                        }
+                    ]"
+                >{{item.name}}</text>
+            </view>
+        </view>
+        <view
+            :style="[
+                {'height': `${placeHeight ? placeHeight : 90}rpx`}
+            ]"
+        >
+        </view>
+    </view>
+</template>
+
+<script>
+
+    export default {
+        name: 'app-tab-nav',
+        props: {
+            background: String,
+            setTop: {
+                type: [Number, String]
+            },
+            padding: {
+                default: 45,
+                type: [Number, String],
+            },
+            setHeight: Number,
+            placeHeight: Number,
+            fontSize: Number,
+            theme: {
+                type: Object,
+            },
+            border: {
+                default: true,
+                type: Boolean,
+            },
+            shadow: {
+                default: true,
+                type: Boolean,
+            },
+            activeItem: {
+                type: [Number, String]
+            },
+            tabList: Array
+        },
+        methods: {
+            handleClick(e) {
+                this.$emit('click', e);
+            }
+        },
+       
+    }
+</script>
+
+<style scoped lang="scss">
+    .app-nav {
+        color: #353535;
+        width: 100%;
+        position: fixed;
+        left: 0;
+        background-color: #fff;
+        z-index: 11;
+        .nav-item {
+            text-align: center;
+            text {
+                display: inline-block;
+            }
+        }
+        .active-text {
+            color: #ff4544;
+            border-bottom: #{4rpx} solid #ff4544;
+        }
+    }
+    .app-nav.shadow {
+        box-shadow: 0 #{2rpx} #{10rpx} rgba(0, 0, 0, 0.06);
+    }
+    .blue-m-text {
+        color: #446dfd;
+    }
+</style>

+ 153 - 0
src/components/basic-component/app-tabs/app-tabs.vue

xqd
@@ -0,0 +1,153 @@
+<template>
+	<view class="tab-box" id="tab-box" v-if="tabList.length > 0">
+		<view class="horizontal">
+			<scroll-view :scroll-x="true" style="white-space: nowrap; display: flex;" scroll-with-animation :scroll-left="slider.scrollLeft">
+				<block v-for="(item, index) in tabList" :key="index" >
+				<view class="item" :class="{ active: activeIndex === index }" :id="'tab_'+index" @click="tabClick(index)">{{ item.text || item.name}}</view>
+				</block>
+				<view class="underline" :style="'transform:translateX(' + slider.left + 'px;width:' + slider.width + 'px'"></view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'liuyuno-tabs',
+		props: {
+			tabData: {
+				type: Array,
+				default: () => []
+			},
+			defaultIndex: {
+				type: Number,
+				default: 0
+			},
+			underLinePadding: {
+				type: Number,
+				default: 10
+			},
+		},
+		data() {
+			return {
+				tabList: [],
+				tabListSlider: [],
+				box: {
+					left: 0,
+					right: 0,
+					top: 0,
+					width: 0,
+					height: 0,
+					bottom: 0,
+				},
+				slider: {
+					left: 0,
+					width: 0,
+					scrollLeft: 0
+				},
+				activeIndex: 0
+			};
+		},
+		watch: {
+			tabData(value) {
+				this.tabList = value;
+				setTimeout(() => {
+					this.updateTabWidth();
+				}, 0);
+			},
+		},
+		mounted() {
+			this.tabList = this.tabData;
+			this.activeIndex = this.defaultIndex;
+			
+			setTimeout(() => {
+				
+				const query = uni.createSelectorQuery().in(this);
+				query.select('.tab-box').boundingClientRect((res) => {
+					this.box = res;
+					this.updateTabWidth();
+				}).exec();
+				
+			}, 0);
+			
+		},
+		methods: {
+			
+			tabClick(index) {
+				this.activeIndex = index;
+				this.tabToIndex(index);
+				this.$emit('tabClick', index);
+			},
+			
+			tabToIndex(index) {
+				let _slider = this.tabListSlider[index];
+
+				this.slider = {
+					left: _slider.left + this.underLinePadding,
+					width: _slider.width - this.underLinePadding * 2,
+					scrollLeft: _slider.scrollLeft,
+				}
+			},
+			
+			updateTabWidth(index = 0) {
+				let data = this.tabList;
+				
+				if (data.length == 0) return false;
+				
+				const query = uni.createSelectorQuery().in(this);
+				
+				query.select('#tab_' + index).boundingClientRect((res) => {
+					let _prev_slider = this.tabListSlider[index - 1];
+					this.tabListSlider[index] = {
+						left: res.left - this.box.left,
+						width: res.width,
+						scrollLeft: res.left - this.box.left - (_prev_slider ? _prev_slider.width : 0),
+					}
+
+					if (this.activeIndex == index) {
+						this.tabToIndex(this.activeIndex);
+					}
+
+					index++;
+					if (data.length > index) {
+						this.updateTabWidth(index);
+					}
+				}).exec();
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.tab-box {
+		width: 100%;
+		color: rgba(0, 0, 0, 0.8);
+		display: flex;
+		height: 90upx;
+		background: #fff;
+		font-size: 28upx;
+		box-shadow: 0 1px 5px rgba(0, 0, 0, 0.06);
+		position: relative;
+		z-index: 10;
+		overflow: hidden;
+		.active {
+			color: #e54d42;
+		}
+		.horizontal {
+			width: 100%;
+			.item {
+				display: inline-block;
+				text-align: center;
+				padding: 0 30upx;
+				height: 86upx;
+				line-height: 90upx;
+			}
+			.underline {
+				height: 4upx;
+				background-color: #e54d42;
+				border-radius: 3px;
+				transition: .5s;
+			}
+		}
+	}
+</style>

+ 25 - 0
src/components/basic-component/app-text/app-text.vue

xqd
@@ -0,0 +1,25 @@
+<template>
+    <text :style="textStyle">
+        <slot></slot>
+    </text>
+</template>
+
+<script>
+    export default {
+        name: 'app-text',
+        props: {
+            theme: Object,
+            fontSize: String,
+            color: String,
+        },
+        computed: {
+            textStyle() {
+                let style = `font-size: ${this.fontSize ? this.fontSize : 32}rpx;color: ${this.color ? this.color : this.theme.color};`;
+                return style;
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+</style>

+ 162 - 0
src/components/basic-component/app-textarea/app-textarea.vue

xqd
@@ -0,0 +1,162 @@
+<template>
+    <view class="app-textarea">
+        <view class="a"
+              @click="showInput=true"
+              :style="{
+              background: background,
+              fontSize: `${fontSize}rpx`,
+              color: color,
+              borderRadius: `${borderRadius}rpx`,
+              border: showBorder ? `2rpx solid ${borderColor}` : 'none',
+              padding: `${paddingY}rpx ${paddingX}rpx`,
+              }">
+            <text v-if="inValue" class="content" :style="{
+            color: color,
+            }">{{inValue}}</text>
+            <view v-else
+                  class="placeholder"
+                  :style="placeholderStyle"
+                  :class="placeholderClass">{{placeholder}}
+            </view>
+        </view>
+        <view class="b" v-if="showInput">
+            <textarea class="textarea"
+                      :value="inValue"
+                      :placeholder="placeholder"
+                      :focus="showInput"
+                      :maxlength="maxlength"
+                      @input="handleInput"
+                      @blur="complete"
+                      @confirm="complete"/>
+            <view class="c" @click="complete"></view>
+        </view>
+    </view>
+</template>
+
+<script>
+    export default {
+        name: 'app-textarea',
+        props: {
+            value: {
+                default: '',
+            },
+            placeholder: {
+                default: '',
+            },
+            placeholderStyle: {
+                type: [String, Array],
+                default: function () {
+                    return '';
+                }
+            },
+            placeholderClass: {
+                type: Array,
+                default: function () {
+                    return [];
+                },
+            },
+            disable: {
+                default: false,
+            },
+            maxlength: {
+                default: 10000,
+            },
+            focus: {
+                default: false,
+            },
+            confirmType: {
+                default: 'done'
+            },
+
+            showBorder: {
+                default: true,
+            },
+            borderColor: {
+                default: '#cccccc',
+            },
+            borderRadius: {
+                default: 8,
+            },
+            fontSize: {
+                default: 32,
+            },
+            color: {
+                default: '#555',
+            },
+            background: {
+                default: '#fff',
+            },
+            paddingX: {
+                default: 24,
+            },
+            paddingY: {
+                default: 24,
+            },
+            defaultValue: {
+                default: '',
+            },
+        },
+        data() {
+            return {
+                showInput: !!this.focus,
+                inValue: this.value ? this.value : this.defaultValue,
+            };
+        },
+        methods: {
+            handleInput(e) {
+                this.inValue = e.detail.value;
+            },
+            complete(e) {
+                this.showInput = false;
+                this.$emit('input', this.inValue);
+            },
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .a {
+
+        .content {
+            color: #444;
+            display: block;
+            width: 100%;
+            min-height: $uni-font-size;
+            word-wrap: break-word;
+        }
+
+        .placeholder {
+            color: #aaa;
+            min-height: $uni-font-size;
+        }
+    }
+
+    .b {
+        position: fixed;
+        background: rgba(0, 0, 0, 0.5);
+        padding: #{50rpx};
+        top: 0;
+        left: 0;
+        right: 0;
+        bottom: 0;
+        z-index: 2000;
+
+        .textarea {
+            width: 100%;
+            background: #fff;
+            border: #{1rpx} solid #ccc;
+            z-index: 1;
+            padding: #{24rpx};
+            border-radius: #{5rpx};
+        }
+
+        .c {
+            position: fixed;
+            left: 0;
+            top: 0;
+            right: 0;
+            bottom: 0;
+            z-index: 0;
+        }
+    }
+</style>

+ 55 - 0
src/components/basic-component/app-timer/app-timer.vue

xqd
@@ -0,0 +1,55 @@
+<template>
+	<text :style="{color: color, fontSize: `${fontSize}rpx`}">{{html}}</text>
+</template>
+
+<script>
+    export default {
+        name: 'app-timer',
+	    data() {
+            return {
+                time: null,
+	            html: ''
+            }
+	    },
+	    props: {
+            startTime: {
+                type: String,
+	            default: function() {
+	                return '2019-8-30 10:00:00';
+	            }
+            },
+            color: {
+                type: String,
+	            default: function() {
+	                return 'white';
+	            }
+            },
+            fontSize: {
+                type: String,
+	            default: function() {
+	                return '26';
+	            }
+            }
+	    },
+	    beforeDestroy() {
+            clearInterval(this.time);
+        },
+	    watch: {
+            startTime: {
+                handler: function(v) {
+                    let timelog = new Date(v.replace(/-/g, '/'));
+                    this.time = setInterval(() =>{
+                        let timenow = new Date();//获取当前时间
+                        let time = timelog.getTime() - timenow.getTime();//时间差的所有毫秒数
+                        let day = parseInt((time/1000/60/60/24)%30);
+                        let hou = parseInt((time/1000/60/60)%24);
+                        let min = parseInt((time/1000/60)%60);
+                        let sec = parseInt((time/1000)%60);
+                        this.html = day+"天"+hou+":"+(min<10?"0"+min:min) + ":"+(sec<10?"0"+sec:sec);
+                    },1000);
+                },
+	            immediate: true
+            }
+	    }
+    }
+</script>

+ 302 - 0
src/components/basic-component/app-upload-image/app-upload-image.vue

xqd
@@ -0,0 +1,302 @@
+<template>
+    <view class="app-upload-image">
+        <view class='upload-box' :style="{'background':backgroundColor}">
+            <view class='flex-wrap'>
+                <view v-for='(item, index) in imageList' :key='item.id' class='img-box'>
+                    <view mode="aspectFill" @click='remove(index)' class='remove cross-center main-center'>x</view>
+                    <image @click='previewImage(index)' :src='item' mode="aspectFill" class='img'></image>
+                </view>
+                <view @click='chooseImage'>
+                    <view v-if='isAddImg' :style="{'margin':margin + 'rpx'}" :class="{'other-border': diy ? true : false}" class="add-img dir-top-nowrap cross-center main-center">
+                        <image mode="aspectFill" class='add-img-icon' :src='defaultImg'></image>
+                        <text class='text'>{{text}}</text>
+                        <text class='text' v-if="showNumber">(最多{{maxNum}}张)</text>
+                    </view>
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+<script>
+import uploadFile from '@/core/upload.js';
+
+export default {
+    name: 'app-upload-image',
+    props: {
+        value: {
+            default: null,
+        },
+        defaultImg: {
+            // 添加图片的默认背景图片
+            type: String,
+            default: 'https://shop.9026.com/web/statics/image/mall/static/icon/icon-image.png'
+        },
+        maxNum: {
+            // 可添加最大图片数量
+            type: [Number, String],
+            default: 3
+        },
+        // 标记
+        // 当组件用于循环时使用
+        sign: {
+            type: String,
+            default: ''
+        },
+        backgroundColor: {
+            type: String,
+            default: '#f7f7f7',
+        },
+        margin: {
+            type: String,
+            default: '10'
+        },
+        diy: {
+            type: Boolean,
+            default: false
+        },
+        showNumber: {
+            type: Boolean,
+            default: true,
+        },
+        text: {
+            type: String,
+            default: '上传图片',
+        },
+        count: {
+            type: Number,
+            default: 9
+        }
+    },
+    data() {
+        return {
+            imageList: this.value ? this.value : [],
+            isAddImg: true
+        }
+    },
+    methods: {
+        // 上传最大图片数量
+        checkMaxNum() {
+            let status = this.imageList.length >= this.maxNum ? false : true;
+            this.isAddImg = status;
+        },
+        // 移除图片
+        remove(index) {
+            let imageList = this.imageList;
+            let data = imageList.splice(index, 1);
+            this.imageList = imageList;
+            this.checkMaxNum();
+
+            // 触发事件 tabEvent
+            this.$emit('imageEvent', {
+                imageList: imageList,
+                sign: this.sign
+            })
+        },
+        // 选择图片
+        chooseImage() {
+            let self = this;
+            let imageList = self.imageList;
+            // #ifdef MP
+            uni.chooseImage({
+                count: self.maxNum,
+                success: function(e) {
+                    for (let i in e.tempFilePaths) {
+                        if (i >= (self.maxNum - imageList.length)) {
+                            break;
+                        }
+                        let fileName = '';
+                        // #ifdef MP-BAIDU
+                        fileName = e.tempFilePaths[i].substr(e.tempFilePaths[i].lastIndexOf('/') + 1);
+                        // #endif
+                        uni.uploadFile({
+                            url: self.$api.upload.file,
+                            filePath: e.tempFilePaths[i],
+                            name: 'file',
+                            fileType: 'image',
+                            formData: {
+                                file: e.tempFilePaths[i],
+                                file_name: fileName,
+                            },
+                            success(res) {
+                                const data = res.data;
+                                let result = null;
+                                if (typeof data === 'string') {
+                                    result = JSON.parse(data);
+                                } else {
+                                    result = data;
+                                }
+                                if (result.code == 0) {
+                                    imageList.push(result.data.url)
+                                    self.imageList = imageList;
+                                    self.checkMaxNum();
+                                    self.$emit('imageEvent', {
+                                        imageList: imageList,
+                                        sign: self.sign
+                                    });
+                                } else {
+                                    uni.showModal({
+                                        title: '',
+                                        content: result.msg,
+                                        showCancel: false,
+                                    });
+                                }
+                            },
+                            fail(e) {
+                                if (e && e.errMsg) {
+                                    uni.showModal({
+                                        title: '错误',
+                                        content: e.errMsg,
+                                        showCancel: false,
+                                    });
+                                }
+                            },
+                        });
+                    }
+                },
+                complete: function(e) {
+                    // 触发事件 tabEvent
+                    self.$emit('imageEvent', {
+                        imageList: imageList,
+                        sign: self.sign
+                    })
+                }
+            })
+            // #endif
+
+
+
+            // #ifdef H5
+            uni.chooseImage({
+                count: Number(self.maxNum),
+                success: function(e) {
+                    for (let i in e.tempFilePaths) {
+                        if (i >= (self.maxNum - imageList.length)) {
+                            break;
+                        }
+                        let image = new Image();
+                        image.src = e.tempFilePaths[i];
+                        image.onload = () => {
+                            let canvas = document.createElement("canvas");
+                            canvas.width = image.width;
+                            canvas.height = image.height;
+                            let ctx = canvas.getContext("2d");
+                            ctx.drawImage(image, 0, 0, image.width, image.height);
+                            let ext = image.src.substring(image.src.lastIndexOf(".") + 1).toLowerCase();
+                            let dataURL = canvas.toDataURL("image/" + ext);
+                            uploadFile({
+                                url: self.$api.upload.file,
+                                maxNum: self.maxNum,
+                                success: function({res, header}) {
+                                    self.$request({
+                                        url: self.$api.upload.file + '&name=base64',
+                                        header: header,
+                                        method: 'post',
+                                        data: {
+                                            database: dataURL
+                                        }
+                                    }).then(res => {
+                                        if (res.code === 0) {
+                                            self.imageList.push(res.data.url);
+                                            self.checkMaxNum();
+                                            self.$emit('imageEvent', {
+                                                imageList: self.imageList,
+                                                sign: self.sign
+                                            });
+                                        } else {
+                                            uni.showModal({
+                                                title: '',
+                                                content: res.msg,
+                                                showCancel: false,
+                                            });
+                                        }
+                                    })
+                                }
+                            });
+                        };
+                    }
+                },
+                complete: function(e) {
+                    // 触发事件 tabEvent
+                    self.$emit('imageEvent', {
+                        imageList: imageList,
+                        sign: self.sign
+                    })
+                }
+            });
+            // #endif
+
+        },
+        // 图片预览
+        previewImage(index) {
+            let imageList = this.imageList;
+            uni.previewImage({
+                current: imageList[index],
+                urls: imageList
+            })
+        },
+        createObjectURL(blob) {
+            return (window.URL) ? window.URL.createObjectURL(blob) : window.webkitURL.createObjectURL(blob);
+        }
+    },
+    created() {
+        this.checkMaxNum();
+    }
+}
+</script>
+<style lang="scss" scoped>
+.upload-box {
+    background-color: #fff;
+}
+
+.upload-box .title {
+    padding: 15#{rpx} 0 15#{rpx} 20#{rpx};
+}
+
+.upload-box .img {
+    width: 188#{rpx};
+    height: 188#{rpx};
+    margin: 10#{rpx};
+    display: block;
+}
+
+.upload-box .add-img {
+    width: 188#{rpx};
+    height: 188#{rpx};
+    border: 1#{rpx} dotted $uni-weak-color-one;
+    background-color: #fff;
+}
+
+.upload-box .add-img .text {
+    color: $uni-general-color-two;
+    font-size: $uni-font-size-weak-two;
+}
+
+.upload-box .add-img-icon {
+    width: 56#{rpx};
+    height: 56#{rpx};
+    margin-bottom: 10#{rpx};
+}
+
+.upload-box .img-box {
+    position: relative;
+}
+
+
+.upload-box .remove {
+    width: 40#{rpx};
+    height: 40#{rpx};
+    position: absolute;
+    right: -5rpx;
+    top: -10rpx;
+    background: $uni-important-color-red;
+    color: #fff;
+    border-radius: 50%;
+    padding-bottom: 8#{rpx};
+    font-size: 24#{rpx};
+    z-index: 968;
+}
+
+.upload-box .add-img.other-border {
+    border: 1#{rpx} solid $uni-weak-color-one
+}
+</style>

+ 219 - 0
src/components/basic-component/u-count-to/u-count-to.vue

xqd
@@ -0,0 +1,219 @@
+<template>
+    <view
+        class="u-count-num"
+        :style="{
+			fontSize: fontSize + 'rpx',
+			fontWeight: bold ? 'bold' : 'normal',
+			color: color
+		}"
+    >
+        {{ displayValue }}
+    </view>
+</template>
+
+<script>
+/**
+ * countTo 数字滚动
+ * @description 该组件一般用于需要滚动数字到某一个值的场景,目标要求是一个递增的值。
+ * @property {String Number} start-val 开始值
+ * @property {String Number} end-val 结束值
+ * @property {String Number} duration 滚动过程所需的时间,单位ms(默认2000)
+ * @property {Boolean} autoplay 是否自动开始滚动(默认true)
+ * @property {String Number} decimals 要显示的小数位数,见官网说明(默认0)
+ * @property {Boolean} use-easing 滚动结束时,是否缓动结尾,见官网说明(默认true)
+ * @property {String} separator 千位分隔符,见官网说明
+ * @property {String} color 字体颜色(默认#303133)
+ * @property {String Number} font-size 字体大小,单位rpx(默认50)
+ * @property {Boolean} bold 字体是否加粗(默认false)
+ * @event {Function} end 数值滚动到目标值时触发
+ * @example <u-count-to ref="uCountTo" :end-val="endVal" :autoplay="autoplay"></u-count-to>
+ */
+export default {
+    name: 'u-count-to',
+    props: {
+        startVal: {
+            type: [Number, String],
+            default: 0
+        },
+        endVal: {
+            type: [Number, String],
+            default: 0,
+            required: true
+        },
+        duration: {
+            type: [Number, String],
+            default: 2000
+        },
+        autoplay: {
+            type: Boolean,
+            default: true
+        },
+        decimals: {
+            type: [Number, String],
+            default: 0
+        },
+        useEasing: {
+            type: Boolean,
+            default: true
+        },
+        decimal: {
+            type: [Number, String],
+            default: '.'
+        },
+        color: {
+            type: String,
+            default: '#303133'
+        },
+        fontSize: {
+            type: [Number, String],
+            default: 50
+        },
+        bold: {
+            type: Boolean,
+            default: false
+        },
+        separator: {
+            type: String,
+            default: ''
+        }
+    },
+    data() {
+        return {
+            localStartVal: this.startVal,
+            displayValue: this.formatNumber(this.startVal),
+            printVal: null,
+            paused: false,
+            localDuration: Number(this.duration),
+            startTime: null,
+            timestamp: null,
+            remaining: null,
+            rAF: null,
+            lastTime: 0
+        };
+    },
+    computed: {
+        countDown() {
+            return this.startVal > this.endVal;
+        }
+    },
+    watch: {
+        startVal() {
+            this.autoplay && this.start();
+        },
+        endVal() {
+            this.autoplay && this.start();
+        }
+    },
+    mounted() {
+        this.autoplay && this.start();
+    },
+    methods: {
+        easingFn(t, b, c, d) {
+            return (c * (-Math.pow(2, (-10 * t) / d) + 1) * 1024) / 1023 + b;
+        },
+        requestAnimationFrame(callback) {
+            const currTime = new Date().getTime();
+            const timeToCall = Math.max(0, 16 - (currTime - this.lastTime));
+            const id = setTimeout(() => {
+                callback(currTime + timeToCall);
+            }, timeToCall);
+            this.lastTime = currTime + timeToCall;
+            return id;
+        },
+        cancelAnimationFrame(id) {
+            clearTimeout(id);
+        },
+        start() {
+            this.localStartVal = this.startVal;
+            this.startTime = null;
+            this.localDuration = this.duration;
+            this.paused = false;
+            this.rAF = this.requestAnimationFrame(this.count);
+        },
+        reStart() {
+            if (this.paused) {
+                this.resume();
+                this.paused = false;
+            } else {
+                this.stop();
+                this.paused = true;
+            }
+        },
+        stop() {
+            this.cancelAnimationFrame(this.rAF);
+        },
+        resume() {
+            this.startTime = null;
+            this.localDuration = this.remaining;
+            this.localStartVal = this.printVal;
+            this.requestAnimationFrame(this.count);
+        },
+        reset() {
+            this.startTime = null;
+            this.cancelAnimationFrame(this.rAF);
+            this.displayValue = this.formatNumber(this.startVal);
+        },
+        count(timestamp) {
+            if (!this.startTime) this.startTime = timestamp;
+            this.timestamp = timestamp;
+            const progress = timestamp - this.startTime;
+            this.remaining = this.localDuration - progress;
+            if (this.useEasing) {
+                if (this.countDown) {
+                    this.printVal = this.localStartVal - this.easingFn(progress, 0, this.localStartVal - this.endVal, this.localDuration);
+                } else {
+                    this.printVal = this.easingFn(progress, this.localStartVal, this.endVal - this.localStartVal, this.localDuration);
+                }
+            } else {
+                if (this.countDown) {
+                    this.printVal = this.localStartVal - (this.localStartVal - this.endVal) * (progress / this.localDuration);
+                } else {
+                    this.printVal = this.localStartVal + (this.endVal - this.localStartVal) * (progress / this.localDuration);
+                }
+            }
+            if (this.countDown) {
+                this.printVal = this.printVal < this.endVal ? this.endVal : this.printVal;
+            } else {
+                this.printVal = this.printVal > this.endVal ? this.endVal : this.printVal;
+            }
+            this.displayValue = this.formatNumber(this.printVal);
+            if (progress < this.localDuration) {
+                this.rAF = this.requestAnimationFrame(this.count);
+            } else {
+                this.$emit('end');
+            }
+        },
+        isNumber(val) {
+            return !isNaN(parseFloat(val));
+        },
+        formatNumber(num) {
+            num = Number(num);
+            num = num.toFixed(Number(this.decimals));
+            num += '';
+            const x = num.split('.');
+            let x1 = x[0];
+            const x2 = x.length > 1 ? this.decimal + x[1] : '';
+            const rgx = /(\d+)(\d{3})/;
+            if (this.separator && !this.isNumber(this.separator)) {
+                while (rgx.test(x1)) {
+                    x1 = x1.replace(rgx, '$1' + this.separator + '$2');
+                }
+            }
+            return x1 + x2;
+        },
+        destroyed() {
+            this.cancelAnimationFrame(this.rAF);
+        }
+    }
+};
+</script>
+
+<style lang="scss" scoped>
+
+.u-count-num {
+    /* #ifndef APP-NVUE */
+    display: inline-flex;
+    /* #endif */
+    text-align: center;
+}
+</style>

+ 85 - 0
src/components/basic-component/u-mask/u-mask.vue

xqd
@@ -0,0 +1,85 @@
+<template>
+	<view class="u-mask" :style="[maskStyle]" :class="[show ? 'u-mask-show' : '']" @tap="click" @touchmove.stop.prevent>
+		<slot />
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			// 是否显示遮罩
+			show: {
+				type: [Boolean, Number],
+				default: false
+			},
+			// 层级z-index
+			zIndex: {
+				type: [Number, String],
+				default: 1001
+			},
+			// 用户自定义样式
+			customStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 遮罩的动画样式, 是否使用使用zoom进行scale进行缩放
+			zoom: {
+				type: Boolean,
+				default: true
+			},
+			// 遮罩的过渡时间,单位为ms
+			duration: {
+				type: [Number, String],
+				default: 300
+			},
+			// 是否可以通过点击遮罩进行关闭
+			maskClickAble: {
+				type: Boolean,
+				default: true
+			}
+		},
+		computed: {
+			maskStyle() {
+				let style = {};
+				style.backgroundColor = "rgba(0, 0, 0, 0.6)";
+				style.zIndex = this.zIndex;
+				style.transition = `all ${this.duration / 1000}s ease-in-out`;
+				// 缩放
+				if (this.zoom == true) style.transform = 'scale(1.2, 1.2)';
+				// 判断用户传递的对象是否为空
+				if (Object.keys(this.customStyle).length) style = { ...style,
+					...this.customStyle
+				};
+				// 合并自定义的样式
+				//Object.assign(style, customStyle);
+				return style;
+			}
+		},
+		methods: {
+			click() {
+				if(!this.maskClickAble) return ;
+				this.$emit('click');
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.u-mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		opacity: 0;
+		visibility: hidden;
+	}
+
+	.u-mask-show {
+		opacity: 1;
+		visibility: visible;
+		transform: scale(1);
+	}
+</style>

+ 322 - 0
src/components/basic-component/u-popup/u-popup.vue

xqd
@@ -0,0 +1,322 @@
+<template>
+    <view v-if="visibleSync" :style="[customStyle]" :class="{ 'u-drawer-visible': showDrawer }" class="u-drawer"  @touchmove.stop.prevent>
+        <u-mask :maskClickAble="maskCloseAble" :show="showDrawer && mask" @click="maskClick"></u-mask>
+        <view
+                class="u-drawer-content"
+                @tap="modeCenterClose(mode)"
+                :class="[
+				safeAreaInsetBottom ? 'safe-area-inset-bottom' : '',
+				'u-drawer-' + mode,
+				showDrawer ? 'u-drawer-content-visible' : '',
+				zoom && mode == 'center' ? 'u-animation-zoom' : ''
+			]"
+                :style="[style]"
+        >
+            <view class="u-mode-center-box" @tap.stop v-if="mode == 'center'" :style="[centerStyle]"><slot /></view>
+            <block v-else><slot /></block>
+        </view>
+    </view>
+</template>
+
+<script>
+    import uMask from '../u-mask/u-mask.vue';
+
+    export default {
+        name: 'uDrawer',
+        props: {
+            /**
+             * 显示状态
+             */
+            show: {
+                type: Boolean,
+                default: false
+            },
+            /**
+             * 弹出方向,left|right|top|bottom|center
+             */
+            mode: {
+                type: String,
+                default: 'left'
+            },
+            /**
+             * 是否显示遮罩
+             */
+            mask: {
+                type: Boolean,
+                default: true
+            },
+            // 抽屉的宽度(mode=left|right),或者高度(mode=top|bottom),单位rpx,或者"auto"
+            // 或者百分比"50%",表示由内容撑开高度或者宽度
+            length: {
+                type: [Number, String],
+                default: 'auto'
+            },
+            // 是否开启缩放动画,只在mode=center时有效
+            zoom: {
+                type: Boolean,
+                default: true
+            },
+            // 是否开启底部安全区适配,开启的话,会在iPhoneX机型底部添加一定的内边距
+            safeAreaInsetBottom: {
+                type: Boolean,
+                default: false
+            },
+            // 是否可以通过点击遮罩进行关闭
+            maskCloseAble: {
+                type: Boolean,
+                default: true
+            },
+            // 用户自定义样式
+            customStyle: {
+                type: Object,
+                default() {
+                    return {};
+                }
+            },
+            value: {
+                type: [Boolean, Number],
+                default: false
+            },
+            // 此为内部参数,不在文档对外使用,为了解决Picker和keyboard等融合了弹窗的组件
+            // 对v-model双向绑定多层调用造成报错不能修改props值的问题
+            popup: {
+                type: Boolean,
+                default: true
+            },
+            // 显示显示弹窗的圆角,单位rpx
+            borderRadius: {
+                type: [Number, String],
+                default: 0
+            }
+        },
+        data() {
+            return {
+                visibleSync: false,
+                showDrawer: false,
+                timer: null,
+                style1: {}
+            };
+        },
+        computed: {
+            // 根据mode的位置,设定其弹窗的宽度(mode = left|right),或者高度(mode = top|bottom)
+            style() {
+                let style = {};
+                let translate = '100%';
+                // 判断是否是否百分比或者auto值,是的话,直接使用该值,否则默认为rpx单位的数值
+                let length = (/%$/.test(this.length) || this.length == 'auto') ? this.length : uni.upx2px(this.length) + 'px';
+                // 如果是左边或者上边弹出时,需要给translate设置为负值,用于隐藏
+                if (this.mode == 'left' || this.mode == 'top') translate = length == 'auto' ? '-100%' : '-' + length;
+                if (this.mode == 'left' || this.mode == 'right') {
+                    style = {
+                        width: length,
+                        height: '100%',
+                        transform: `translate3D(${translate},0px,0px)`
+                    };
+                } else if (this.mode == 'top' || this.mode == 'bottom') {
+                    style = {
+                        width: '100%',
+                        height: length,
+                        transform: `translate3D(0px,${translate},0px)`
+                    };
+                }
+                // 如果用户设置了borderRadius值,添加弹窗的圆角
+                if (this.borderRadius) {
+                    switch (this.mode) {
+                        case 'left':
+                            style.borderRadius = `0 ${this.borderRadius}rpx ${this.borderRadius}rpx 0`;
+                            break;
+                        case 'top':
+                            style.borderRadius = `0 0 ${this.borderRadius}rpx ${this.borderRadius}rpx`;
+                            break;
+                        case 'right':
+                            style.borderRadius = `${this.borderRadius}rpx 0 0 ${this.borderRadius}rpx`;
+                            break;
+                        case 'bottom':
+                            style.borderRadius = `${this.borderRadius}rpx ${this.borderRadius}rpx 0 0`;
+                            break;
+                        default: ;
+                    }
+                    // 不加可能圆角无效
+                    // style.overflow = 'hidden';
+                }
+                return style;
+            },
+            // 中部弹窗的特有样式
+            centerStyle() {
+                let style = {};
+                let length = (/%$/.test(this.length) || this.length == 'auto') ? this.length : uni.upx2px(this.length) + 'px';
+                style.width = length;
+                if(this.borderRadius) {
+                    style.borderRadius = `${this.borderRadius}rpx`;
+                    // // 不加可能圆角无效
+                    style.overflow = 'hidden';
+                }
+                return style;
+            }
+        },
+        watch: {
+            value(val) {
+                if (val) {
+                    this.open();
+                } else {
+                    this.close();
+                }
+            }
+        },
+        created() {
+            // 先让弹窗组件渲染,再改变遮罩和抽屉元素的样式,让其动画其起作用(必须要有延时,才会有效果)
+            this.visibleSync = this.value;
+            setTimeout(() => {
+                this.showDrawer = this.value;
+            }, 30);
+        },
+        methods: {
+            // 遮罩被点击
+            maskClick() {
+                this.close();
+            },
+            close() {
+                this.change('showDrawer', 'visibleSync', false);
+            },
+            // 中部弹出时,需要.u-drawer-content将居中内容,此元素会铺满屏幕,点击需要关闭弹窗
+            // 让其只在mode=center时起作用
+            modeCenterClose(mode) {
+                if (mode != 'center' || !this.maskCloseAble) return;
+                this.close();
+            },
+            open() {
+                this.change('visibleSync', 'showDrawer', true);
+            },
+            // 此处的原理是,关闭时先通过动画隐藏弹窗和遮罩,再移除整个组件
+            // 打开时,先渲染组件,延时一定时间再让遮罩和弹窗的动画起作用
+            change(param1, param2, status) {
+                // 如果this.popup为false,以为着为picker,actionsheet等组件调用了popup组件
+                if (this.popup == true) this.$emit('input', status);
+                this[param1] = status;
+                if (this.timer) {
+                    clearTimeout(this.timer);
+                }
+                this.timer = setTimeout(
+                    () => {
+                        this[param2] = status;
+                        this.$emit(status ? 'open' : 'close');
+                    },
+                    status ? 30 : 300
+                );
+            }
+        },
+        components: {
+            uMask
+        }
+    };
+</script>
+
+<style scoped lang="scss">
+    .u-drawer {
+        /* #ifndef APP-NVUE */
+        display: block;
+        /* #endif */
+        position: fixed;
+        top: 0;
+        left: 0;
+        right: 0;
+        bottom: 0;
+        overflow: hidden;
+        z-index: 1999;
+    }
+
+    .u-drawer-content {
+        /* #ifndef APP-NVUE */
+        display: block;
+        /* #endif */
+        position: absolute;
+        z-index: 1003;
+        transition: all 0.25s linear;
+    }
+
+    .u-drawer-left {
+        top: 0;
+        bottom: 0;
+        left: 0;
+        background-color: #ffffff;
+    }
+
+    .u-drawer-right {
+        right: 0;
+        top: 0;
+        bottom: 0;
+        background-color: #ffffff;
+    }
+
+    .u-drawer-top {
+        top: 0;
+        left: 0;
+        right: 0;
+        background-color: #ffffff;
+    }
+
+    .u-drawer-bottom {
+        bottom: 0;
+        left: 0;
+        right: 0;
+        background-color: #ffffff;
+    }
+
+    .u-drawer-center {
+        /* #ifndef APP-NVUE */
+        display: flex;
+        flex-direction: column;
+        /* #endif */
+        bottom: 0;
+        left: 0;
+        right: 0;
+        top: 0;
+        justify-content: center;
+        align-items: center;
+        opacity: 0;
+        z-index: 99999;
+    }
+
+    .u-mode-center-box {
+        min-width: 100rpx;
+        min-height: 100rpx;
+        /* #ifndef APP-NVUE */
+        display: block;
+        /* #endif */
+        position: relative;
+    }
+
+    .u-drawer-content-visible.u-drawer-center {
+        transform: scale(1);
+        opacity: 1;
+    }
+
+    .u-animation-zoom {
+        transform: scale(1.15);
+    }
+
+    .u-drawer-content-visible {
+        transform: translate3D(0px, 0px, 0px) !important;
+    }
+
+    .u-drawer-mask {
+        /* #ifndef APP-NVUE */
+        display: block;
+        /* #endif */
+        opacity: 0;
+        position: absolute;
+        top: 0;
+        left: 0;
+        bottom: 0;
+        right: 0;
+        background-color: rgba(0, 0, 0, 0.4);
+        transition: opacity 0.25s;
+    }
+
+    .u-drawer-mask-visible {
+        /* #ifndef APP-NVUE */
+        display: block;
+        /* #endif */
+        opacity: 1;
+    }
+</style>

+ 424 - 0
src/components/basic-component/u-tabs-swiper/u-tabs-swiper.vue

xqd
@@ -0,0 +1,424 @@
+<template>
+    <view
+            class="u-tabs"
+            :style="{
+			zIndex: zIndex,
+			background: bgColor
+		}"
+    >
+        <scroll-view scroll-x class="u-scroll-view" :scroll-left="scrollLeft" scroll-with-animation :style="{ zIndex: zIndex + 1 }">
+            <view class="u-tabs-scroll-box" :class="{'u-tabs-scorll-flex': !isScroll}">
+                <view
+                        class="u-tabs-item"
+                        :style="{
+						height: height + 'rpx',
+						lineHeight: height + 'rpx',
+						padding: `0 ${gutter / 2}rpx`,
+						color: tabsInfo.length > 0 ? (tabsInfo[index] ? tabsInfo[index].color : activeColor) : inactiveColor,
+						fontSize: fontSize + 'rpx',
+						zIndex: zIndex + 2,
+						fontWeight: (index == getCurrent && bold) ? 'bold' : 'normal'
+					}"
+                        v-for="(item, index) in getTabs"
+                        :key="index"
+                        :class="[preId + index]"
+                        @tap="emit(index)"
+                >
+                    {{ item[name] || item['name']}}
+                </view>
+                <view
+                        class="u-scroll-bar"
+                        :style="{
+						width: barWidthPx + 'px',
+						height: barHeight + 'rpx',
+						borderRadius: '100px',
+						backgroundColor: activeColor,
+						left: scrollBarLeft + 'px'
+					}"
+                ></view>
+            </view>
+        </scroll-view>
+    </view>
+</template>
+
+<script>
+    import colorGradient from '../../../core/libs/function/colorGradient';
+    let color = colorGradient;
+    const { windowWidth } = uni.getSystemInfoSync();
+    const preId = 'UEl_';
+
+    export default {
+        props: {
+            // 导航菜单是否需要滚动,如只有2或者3个的时候,就不需要滚动了,此时使用flex平分tab的宽度
+            isScroll: {
+                type: Boolean,
+                default: true
+            },
+            //需循环的标签列表
+            list: {
+                type: Array,
+                default() {
+                    return [];
+                }
+            },
+            // 当前活动tab的索引
+            current: {
+                type: [Number, String],
+                default: 0
+            },
+            // 导航栏的高度和行高,单位rpx
+            height: {
+                type: [Number, String],
+                default: 80
+            },
+            // 字体大小,单位rpx
+            fontSize: {
+                type: [Number, String],
+                default: 30
+            },
+            // 过渡动画时长, 单位s
+            // duration: {
+            // 	type: [Number, String],
+            // 	default: 0.5
+            // },
+            swiperWidth: {
+                //line3生效, 外部swiper的宽度, 单位rpx
+                type: [String, Number],
+                default: 750
+            },
+            // 选中项的主题颜色
+            activeColor: {
+                type: String,
+                default: '#2979ff'
+            },
+            // 未选中项的颜色
+            inactiveColor: {
+                type: String,
+                default: '#303133'
+            },
+            // 菜单底部移动的bar的宽度,单位rpx
+            barWidth: {
+                type: [Number, String],
+                default: 40
+            },
+            // 移动bar的高度
+            barHeight: {
+                type: [Number, String],
+                default: 6
+            },
+            // 单个tab的左或右内边距(各占一半),单位rpx
+            gutter: {
+                type: [Number, String],
+                default: 40
+            },
+            // 如果是绝对定位,添加z-index值
+            zIndex: {
+                type: [Number, String],
+                default: 1
+            },
+            // 导航栏的背景颜色
+            bgColor: {
+                type: String,
+                default: '#ffffff'
+            },
+            //滚动至中心目标类型
+            autoCenterMode: {
+                type: String,
+                default: 'window'
+            },
+            // 读取传入的数组对象的属性
+            name: {
+                type: String,
+                default: 'name'
+            },
+            // 活动tab字体是否加粗
+            bold: {
+                type: Boolean,
+                default: true
+            }
+        },
+        data() {
+            return {
+                scrollLeft: 0, // 滚动scroll-view的左边滚动距离
+                tabQueryInfo: [], // 存放对tab菜单查询后的节点信息
+                windowWidth: 0, // 屏幕宽度,单位为px
+                //scrollBarLeft: 0, // 移动bar需要通过translateX()移动的距离
+                animationFinishCurrent: this.current,
+                componentsWidth: 0,
+                line3AddDx: 0,
+                line3Dx: 0,
+                preId,
+                sW: 0,
+                tabsInfo: [],
+                colorGradientArr: [],
+                colorStep: 100 // 两个颜色之间的渐变等分
+            };
+        },
+        computed: {
+            // 获取当前活跃的current值
+            getCurrent() {
+                const current = Number(this.current);
+                // 判断是否超出边界
+                if (current > this.getTabs.length - 1) {
+                    return this.getTabs.length - 1;
+                }
+                if (current < 0) return 0;
+                return current;
+            },
+            getTabs() {
+                return this.list;
+            },
+            // 滑块需要移动的距离
+            scrollBarLeft() {
+                return Number(this.line3Dx) + Number(this.line3AddDx);
+            },
+            // 滑块的宽度转为px单位
+            barWidthPx() {
+                return uni.upx2px(this.barWidth);
+            }
+        },
+        watch: {
+            current(n, o) {
+                this.change(n);
+                this.setFinishCurrent(n);
+            },
+            list() {
+                this.$nextTick(() => {
+                    this.init();
+                })
+            }
+        },
+        mounted() {
+            this.init();
+        },
+        methods: {
+
+            async init() {
+                this.countPx();
+                await this.getTabsInfo();
+                this.countLine3Dx();
+                this.getQuery(() => {
+                    this.setScrollViewToCenter();
+                });
+                // 颜色渐变过程数组
+                this.colorGradientArr = color.colorGradient(this.inactiveColor, this.activeColor, this.colorStep);
+            },
+            // 获取各个tab的节点信息
+            getTabsInfo() {
+                return new Promise((resolve, reject) => {
+                    let view = uni.createSelectorQuery().in(this);
+                    for (let i = 0; i < this.list.length; i++) {
+                        view.select('.' + preId + i).boundingClientRect();
+                    }
+                    view.exec(res => {
+                        const arr = [];
+                        for (let i = 0; i < res.length; i++) {
+                            // 给每个tab添加其文字颜色属性
+                            res[i].color = this.inactiveColor;
+                            // 当前tab直接赋予activeColor
+                            if (i == this.getCurrent) res[i].color = this.activeColor;
+                            arr.push(res[i]);
+                        }
+                        this.tabsInfo = arr;
+                        resolve();
+                    });
+                })
+            },
+            // 当swiper滑动结束,计算滑块最终要停留的位置
+            countLine3Dx() {
+                const tab = this.tabsInfo[this.animationFinishCurrent];
+                // 让滑块中心点和当前tab中心重合
+                if (tab) this.line3Dx = tab.left + tab.width / 2 - this.barWidthPx / 2;
+            },
+            countPx() {
+                // swiper宽度由rpx转为px单位,因为dx等,都是px单位
+                this.sW = uni.upx2px(Number(this.swiperWidth));
+            },
+            emit(index) {
+                this.$emit('change', index);
+            },
+            change() {
+                this.setScrollViewToCenter();
+            },
+            getQuery(cb) {
+                try {
+                    let view = uni.createSelectorQuery().in(this).select('.u-tabs');
+                    view.fields(
+                        {
+                            size: true
+                        },
+                        data => {
+                            if (data) {
+                                this.componentsWidth = data.width;
+                                if (cb && typeof cb === 'function') cb(data);
+                            } else {
+                                this.getQuery(cb);
+                            }
+                        }
+                    ).exec();
+                } catch (e) {
+                    this.componentsWidth = windowWidth;
+                }
+            },
+            // 把活动tab移动到屏幕中心点
+            setScrollViewToCenter() {
+                let tab;
+                tab = this.tabsInfo[this.animationFinishCurrent];
+                if (tab) {
+                    let tabCenter = tab.left + tab.width / 2;
+                    let fatherWidth;
+                    // 活动tab移动到中心时,以屏幕还是tab组件为宽度为基准
+                    if (this.autoCenterMode === 'window') {
+                        fatherWidth = windowWidth;
+                    } else {
+                        fatherWidth = this.componentsWidth;
+                    }
+                    this.scrollLeft = tabCenter - fatherWidth / 2;
+                }
+            },
+            setDx(dx) {
+                let nextTabIndex = dx > 0 ? this.animationFinishCurrent + 1 : this.animationFinishCurrent - 1;
+                // 判断索引是否超出边界
+                nextTabIndex = nextTabIndex <= 0 ? 0 : nextTabIndex;
+                nextTabIndex = nextTabIndex >= this.list.length ? this.list.length - 1 : nextTabIndex;
+                const tab = this.tabsInfo[nextTabIndex];
+                // 当前tab中心点x轴坐标
+                let nowTab = this.tabsInfo[this.animationFinishCurrent];
+                let nowTabX = nowTab.left + nowTab.width / 2;
+                // 下一个tab
+                let nextTab = this.tabsInfo[nextTabIndex];
+                let nextTabX = nextTab.left + nextTab.width / 2;
+                // 两个tab之间的距离,因为下一个tab可能在当前tab的左边或者右边,取绝对值即可
+                let distanceX = Math.abs(nextTabX - nowTabX);
+                this.line3AddDx = (dx / this.sW) * distanceX;
+                this.setTabColor(this.animationFinishCurrent, nextTabIndex, dx);
+            },
+            // 设置tab的颜色
+            setTabColor(nowTabIndex, nextTabIndex, dx) {
+                let colorIndex = Math.abs(Math.ceil((dx / this.sW) * 100));
+                let colorLength = this.colorGradientArr.length;
+                // 处理超出索引边界的情况
+                colorIndex = colorIndex >= colorLength ? colorLength - 1 : colorIndex <= 0 ? 0 : colorIndex;
+                // 设置下一个tab的颜色
+                this.tabsInfo[nextTabIndex].color = this.colorGradientArr[colorIndex];
+                // 设置当前tab的颜色
+                this.tabsInfo[nowTabIndex].color = this.colorGradientArr[colorLength - 1 - colorIndex];
+            },
+            // swiper结束滑动
+            setFinishCurrent(current) {
+                // 如果滑动的索引不一致,修改tab颜色变化,因为可能会有直接点击tab的情况
+                if (current != this.animationFinishCurrent) {
+                    this.tabsInfo.map((val, index) => {
+                        if (current == index) val.color = this.activeColor;
+                        else val.color = this.inactiveColor;
+                        return val;
+                    });
+                }
+                this.line3AddDx = 0;
+                this.animationFinishCurrent = current;
+                this.countLine3Dx();
+            }
+        }
+    };
+</script>
+
+<style scoped lang="scss">
+    view,
+    scroll-view {
+        box-sizing: border-box;
+    }
+
+    .u-tabs {
+        width: 100%;
+        transition-property: background-color, color;
+    }
+
+    ::-webkit-scrollbar,
+    ::-webkit-scrollbar,
+    ::-webkit-scrollbar {
+        display: none;
+        width: 0 !important;
+        height: 0 !important;
+        -webkit-appearance: none;
+        background: transparent;
+    }
+
+    /* #ifdef H5 */
+    // 通过样式穿透,隐藏H5下,scroll-view下的滚动条
+    scroll-view /deep/ ::-webkit-scrollbar {
+        display: none;
+        width: 0 !important;
+        height: 0 !important;
+        -webkit-appearance: none;
+        background: transparent;
+    }
+    /* #endif */
+
+    .u-scroll-view {
+        width: 100%;
+        white-space: nowrap;
+        position: relative;
+    }
+
+    .u-tabs-scroll-box {
+        position: relative;
+    }
+
+    .u-tabs-scorll-flex {
+        display: flex;
+        justify-content: space-between;
+    }
+
+    .u-tabs-scorll-flex .u-tabs-item {
+        flex: 1;
+    }
+
+    .u-tabs-item {
+        position: relative;
+        display: inline-block;
+        text-align: center;
+        transition-property: background-color, color, font-weight;
+    }
+
+    .content {
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+    }
+
+    .boxStyle {
+        pointer-events: none;
+        position: absolute;
+        transition-property: all;
+    }
+
+    .boxStyle2 {
+        pointer-events: none;
+        position: absolute;
+        bottom: 0;
+        transition-property: all;
+        transform: translateY(-100%);
+    }
+
+    .itemBackgroundBox {
+        pointer-events: none;
+        position: absolute;
+        top: 0;
+        transition-property: left, background-color;
+        display: flex;
+        flex-direction: row;
+        justify-content: center;
+        align-items: center;
+    }
+
+    .itemBackground {
+        height: 100%;
+        width: 100%;
+        transition-property: all;
+    }
+
+    .u-scroll-bar {
+        position: absolute;
+        bottom: 4rpx;
+    }
+</style>

+ 199 - 0
src/components/basic-component/uni-swiper-dot/uni-swiper-dot.vue

xqd
@@ -0,0 +1,199 @@
+<template>
+	<view class="uni-swiper__warp">
+		<slot />
+		<view v-if="mode === 'default'" :style="{'bottom':dots.bottom}" class="uni-swiper__dots-box" key='default'>
+			<view v-for="(item,index) in info" :style="{
+        'width': (index === current? dots.width*2:dots.width ) + 'px','height':dots.width/3 +'px' ,'background-color':index !== current?dots.backgroundColor:dots.selectedBackgroundColor,'border-radius':'0px'}"
+			 :key="index" class="uni-swiper__dots-item uni-swiper__dots-bar" />
+		</view>
+		<view v-if="mode === 'dot'" :style="{'bottom':dots.bottom}" class="uni-swiper__dots-box" key='dot'>
+			<view v-for="(item,index) in info" :style="{
+        'width': dots.width + 'px','height':dots.height +'px' ,'background-color':index !== current?dots.backgroundColor:dots.selectedBackgroundColor,'border':index !==current ? dots.border:dots.selectedBorder}"
+			 :key="index" class="uni-swiper__dots-item" />
+		</view>
+		<view v-if="mode === 'round'" :style="{'bottom':dots.bottom}" class="uni-swiper__dots-box" key='round'>
+			<view v-for="(item,index) in info" :class="[index === current&&'uni-swiper__dots-long']" :style="{
+		    'width':(index === current? dots.width*3:dots.width ) + 'px','height':dots.height +'px' ,'background-color':index !== current?dots.backgroundColor:dots.selectedBackgroundColor,'border':index !==current ? dots.border:dots.selectedBorder}"
+			 :key="index" class="uni-swiper__dots-item " />
+		</view>
+		<view v-if="mode === 'nav'" key='nav' :style="{'background-color':dotsStyles.backgroundColor,'bottom':'0'}" class="uni-swiper__dots-box uni-swiper__dots-nav">
+			<text :style="{'color':dotsStyles.color}" class="uni-swiper__dots-nav-item">{{ (current+1)+"/"+info.length +' ' +info[current][field] }}</text>
+		</view>
+		<view v-if="mode === 'indexes'" key='indexes' :style="{'bottom':dots.bottom}" class="uni-swiper__dots-box">
+			<view v-for="(item,index) in info" :style="{
+        'width':dots.width + 'px','height':dots.height +'px' ,'color':index === current?dots.selectedColor:dots.color,'background-color':index !== current?dots.backgroundColor:dots.selectedBackgroundColor,'border':index !==current ? dots.border:dots.selectedBorder}"
+			 :key="index" class="uni-swiper__dots-item uni-swiper__dots-indexes"><text class="uni-swiper__dots-indexes-text">{{ index+1 }}</text></view>
+		</view>
+		<view v-if="mode === 'customize' &&info.length > 1" key='indexes' class="uni-swiper__dots-box customize">
+			<view v-for="(item,index) in info" :style="{'width':index === current?'20rpx':'16rpx','height': '6rpx','background-color': index === current ? theme.background : '#e2e2e2'}" :key="index" class="uni-swiper__dots-item uni-swiper__dots-indexes"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'UniSwiperDot',
+		props: {
+			info: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			current: {
+				type: Number,
+				default: 0
+			},
+			dotsStyles: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 类型 :default(默认) indexes long nav
+			mode: {
+				type: String,
+				default: 'default'
+			},
+			// 只在 nav 模式下生效,变量名称
+			field: {
+				type: String,
+				default: ''
+			},
+			theme: Object
+		},
+		data() {
+			return {
+				dots: {
+					width: 8,
+					height: 8,
+					bottom: 10,
+					color: '#fff',
+					backgroundColor: 'rgba(0, 0, 0, .3)',
+					border: '1px rgba(0, 0, 0, .3) solid',
+					selectedBackgroundColor: '#333',
+					selectedBorder: '1px rgba(0, 0, 0, .9) solid'
+				}
+			}
+		},
+		watch: {
+			dotsStyles(newVal) {
+				this.dots = Object.assign(this.dots, this.dotsStyles)
+			},
+			mode(newVal) {
+				if (newVal === 'indexes') {
+					this.dots.width = 20
+					this.dots.height = 20
+				} else {
+					this.dots.width = 8
+					this.dots.height = 8
+				}
+			}
+
+		},
+		created() {
+			if (this.mode === 'indexes') {
+				this.dots.width = 20
+				this.dots.height = 20
+			}
+			this.dots = Object.assign(this.dots, this.dotsStyles)
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.customize {
+		bottom: #{24rpx};
+		.uni-swiper__dots-item {
+			margin-left: #{4rpx};
+			border-radius: #{6rpx};
+		}
+	}
+	.uni-swiper__warp {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: column;
+		position: relative;
+		overflow: hidden;
+	}
+
+	.uni-swiper__dots-box {
+		/* #ifndef MP-ALIPAY */
+		position: absolute;
+		/* #endif */
+		/* #ifdef MP-ALIPAY */
+		margin: #{10px 0 0 0};
+		/* #endif */
+		bottom: 10px;
+		left: 0;
+		right: 0;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.uni-swiper__dots-item {
+		width: 8px;
+		border-radius: 100px;
+		margin-left: 6px;
+		// transition: width 0.2s linear;  不要取消注释,不然会不能变色
+	}
+	
+	.uni-swiper__dots-item:first-child {
+		margin: 0;
+	}
+
+	.uni-swiper__dots-default {
+		border-radius: 100px;
+	}
+
+	.uni-swiper__dots-long {
+		border-radius: 50px;
+	}
+
+	.uni-swiper__dots-bar {
+		border-radius: 50px;
+	}
+
+	.uni-swiper__dots-nav {
+		bottom: 0px;
+		height: 40px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		justify-content: flex-start;
+		align-items: center;
+		background-color: rgba(0, 0, 0, 0.2);
+	}
+
+	.uni-swiper__dots-nav-item {
+		/* overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap; */
+		font-size: $uni-font-size-base;
+		color: #fff;
+		margin: 0 15px;
+	}
+
+	.uni-swiper__dots-indexes {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		// flex: 1;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.uni-swiper__dots-indexes-text {
+		color: #fff;
+		font-size: $uni-font-size-sm;
+	}
+</style>

+ 151 - 0
src/components/page-component/app-account-balance/app-account-balance.vue

xqd
@@ -0,0 +1,151 @@
+<template>
+    <view class="app-account-balance dir-left-nowrap cross-center"
+          :class="[!margin?'no-margin':'', !round?'no-round':'',]" v-if="showBar">
+        <template v-if="showIntegral">
+            <view class="box-grow-1 split" :class="[showCount > 1?'':'data-col']">
+                <app-account-style :show-count="showCount" :icon="userCenter.account_bar.integral.icon"
+                                   :text="userCenter.account_bar.integral.text"
+                                   :value="userInfo?userInfo.integral:'-'"
+                                   :page="userCenter.account_bar.integral.navigate_enabled?'/plugins/integral_mall/index/index':'/pages/user-center/integral-detail/integral-detail'"></app-account-style>
+            </view>
+        </template>
+        <template v-if="showBalance">
+            <view class="box-grow-1 split" :class="[showCount > 1?'':'data-col']">
+                <app-account-style :show-count="showCount" :icon="userCenter.account_bar.balance.icon"
+                                   :text="userCenter.account_bar.balance.text"
+                                   :value="userInfo?userInfo.balance:'-'"
+                                   page="/pages/balance/balance"></app-account-style>
+            </view>
+        </template>
+        <template v-if="showCoupon">
+            <view class="box-grow-1 split" :class="[showCount > 1?'':'data-col']">
+                <app-account-style :show-count="showCount" :icon="userCenter.account_bar.coupon.icon"
+                                   :text="userCenter.account_bar.coupon.text"
+                                   :value="userInfo?userInfo.coupon:'-'"
+                                   page="/pages/coupon/index/index"></app-account-style>
+            </view>
+        </template>
+        <template v-if="showCard">
+            <view class="box-grow-1 split" :class="[showCount > 1?'':'data-col']">
+                <app-account-style :show-count="showCount" :icon="userCenter.account_bar.card.icon"
+                                   :text="userCenter.account_bar.card.text"
+                                   :value="userInfo?userInfo.card:'-'"
+                                   page="/pages/card/index/index"></app-account-style>
+            </view>
+        </template>
+    </view>
+</template>
+
+<script>
+    import {mapState} from 'vuex';
+    import appAccountStyle from "./app-account-style.vue";
+
+    export default {
+        name: 'app-account-balance',
+        components: {
+            'app-account-style': appAccountStyle,
+        },
+        props: {
+            margin: {
+                type: Boolean,
+                default: false,
+            },
+            round: {
+                type: Boolean,
+                default: false,
+            },
+            inputUserCenter: null,
+        },
+        computed: {
+            ...mapState({
+                userInfo: state => state.user.info,
+                storeUserCenter: state => state.mallConfig.user_center,
+            }),
+            showBar() {
+                if (this.userCenter
+                    && this.userCenter.account_bar
+                    && this.userCenter.account_bar.status == 0
+                ) return false;
+                return this.showBalance || this.showIntegral;
+            },
+            userCenter() {
+                if (this.inputUserCenter) return this.inputUserCenter;
+                return this.storeUserCenter;
+            },
+            showIntegral() {
+                if (!this.userCenter) return false;
+                if (this.userCenter.account_bar && this.userCenter.account_bar.integral.status == 1) return true;
+                return false;
+            },
+            showBalance() {
+                if (!this.userCenter) return false;
+                if (this.userCenter.recharge_setting
+                    && this.userCenter.recharge_setting.status == 1
+                    && this.userCenter.account_bar
+                    && this.userCenter.account_bar.balance.status == 1
+                ) return true;
+                return false;
+            },
+            showCoupon() {
+                if (!this.userCenter) return false;
+                if (this.userCenter.account_bar && this.userCenter.account_bar.coupon.status == 1) return true;
+                return false;
+            },
+            showCard() {
+                if (!this.userCenter) return false;
+                if (this.userCenter.account_bar && this.userCenter.account_bar.card.status == 1) return true;
+                return false;
+            },
+            showCount() {
+                let count = 0;
+                if (this.showIntegral) {
+                    count++;
+                }
+                if (this.showBalance) {
+                    count++;
+                }
+                if (this.showCoupon) {
+                    count++;
+                }
+                if (this.showCard) {
+                    count++;
+                }
+                return count;
+            }
+        }
+    }
+</script>
+
+<style lang="scss" scoped>
+    .app-account-balance.no-margin {
+        width: 100%;
+        margin: 0 auto;
+        box-shadow: none;
+    }
+
+    .app-account-balance.no-round {
+        border-radius: 0;
+    }
+
+    .app-account-balance {
+        width: #{702rpx};
+        height: #{100rpx};
+        background: #fff;
+        border-radius: #{16rpx};
+        margin: #{24rpx} auto;
+        box-shadow: 0 0 #{8rpx} rgba(0, 0, 0, .05);
+    }
+
+    .data-col {
+        width: 100%;
+        padding: 0 #{32rpx};
+    }
+
+    .split {
+        border-left: #{1rpx #eeeeee solid};
+
+        &:first-child {
+            border: none;
+        }
+    }
+</style>

+ 67 - 0
src/components/page-component/app-account-balance/app-account-style.vue

xqd
@@ -0,0 +1,67 @@
+<template>
+    <view class="app-account-style" :style="{width: 702/showCount + 'rpx'}">
+        <app-jump-button form arrangement="column" :url="page">
+            <template v-if="showCount >= 3">
+                <view class="dir-top-nowrap cross-center" style="width: 100%;overflow: hidden">
+                    <view class="value box-grow-0 t-omit">{{value}}</view>
+                    <view class="box-grow-1 dir-left-nowrap cross-center">
+                        <view class="box-grow-0">
+                            <image class="icon" :src="icon"></image>
+                        </view>
+                        <view class="unit box-grow-1">
+                            <view class="t-omit">{{text}}</view>
+                        </view>
+                    </view>
+                </view>
+            </template>
+            <template v-else>
+                <view class="dir-left-nowrap cross-center" :class="[showCount > 1?'':'data-col']">
+                    <view :class="[showCount > 1?'':'box-grow-0']">
+                        <image class="icon" :src="icon"></image>
+                    </view>
+                    <view class="unit" :class="[showCount > 1?'':'box-grow-1']">
+                        <view class="t-omit">{{text}}</view>
+                    </view>
+                    <view class="value t-omit" :class="[showCount > 1?'':'box-grow-0']">{{value}}</view>
+                </view>
+            </template>
+        </app-jump-button>
+    </view>
+</template>
+
+<script>
+    export default {
+        name: "app-account-style",
+        props: {
+            showCount: Number,
+            icon: String,
+            text: String,
+            value: [Number, String],
+            page: String,
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .app-account-style {
+    }
+
+    .icon {
+        width: #{26rpx};
+        height: #{26rpx};
+        display: block;
+        margin-right: #{12rpx};
+    }
+
+    .unit {
+        color: $uni-general-color-one;
+        margin-right: #{16rpx};
+        font-size: $uni-font-size-general-two;
+    }
+
+    .value {
+        color: #ffbb43;
+        font-weight: bold;
+        padding: 0 10upx;
+    }
+</style>

+ 146 - 0
src/components/page-component/app-ad/app-ad.vue

xqd
@@ -0,0 +1,146 @@
+<template>
+    <view>
+        <!--#ifndef MP-ALIPAY-->
+        <ad v-if="type=== ``" :unit-id="unitId" @load="onAdLoad" @error="onAdError" @close="onAdClose" ad-intervals="0"/>
+        <ad v-else-if="type === `video`" :unit-id="unitId" :ad-type="type" :ad-theme="theme" @load="onAdLoad" @error="onAdError" @close="onAdClose"/>
+        <ad v-else-if="type === `grid`" :unit-id="unitId" :ad-theme="theme" :ad-type="type" @load="onAdLoad" @error="onAdError" @close="onAdClose" grid-opacity="0.8" grid-count="5"/>
+        <!--#endif-->
+        <!--#ifdef MP-WEIXIN-->
+        <img v-else-if="type === `rewarded-video`" class="ad-img" @click="showRewardedVideoAd" :src="picUrl"/>
+        <img v-else-if="type === `interstitial`" class="ad-img" @click="showInterstitialAd" :src="picUrl"/>
+        <!--#endif-->
+        <view v-if="type ===`before-video`" class="ad-video">
+            <video :src="videoUrl" :ad-unit-id="unitId" :poster="picUrl" @adplay="onAdPlay" @adload="onAdLoad" @adclose="onAdClose" @aderror="onAdError"/>
+        </view>
+    </view>
+</template>
+
+<script>
+    export default {
+        name: "app-ad",
+        props: {
+            type: String,
+            unitId: String,
+            picUrl: String,
+            videoUrl: String,
+            // #ifndef MP-ALIPAY
+            theme: {
+                type: String,
+                default() {
+                    return 'white';
+                }
+            },
+            //#endif
+            //#ifdef MP-WEIXIN
+            couponUrl: String,
+            couponParams: Object,
+            //#endif
+        },
+        //#ifdef MP-WEIXIN
+        data() {
+            return {
+                //单屏问题
+                rewardedVideoAd: null,
+                interstitialAd: null
+            }
+        },
+        //#endif
+        //#ifdef MP-WEIXIN
+        created: function () {
+            this.init();
+        },
+        //#endif
+        methods: {
+            onAdLoad() {},
+            onAdPlay() {},
+            onAdClose() {},
+            onAdError() {},
+            //#ifdef MP-WEIXIN
+            init: function () {
+                switch (this.type) {
+                    case 'rewarded-video':
+                        this.initRewardedVideoAd();
+                        break;
+                    case 'interstitial':
+                        this.initInterstitialAd();
+                        break;
+                    default:
+                        break;
+                }
+            },
+            //#endif
+            //#ifdef MP-WEIXIN
+            initRewardedVideoAd: function () {
+                if (wx.createRewardedVideoAd) {
+                    this.rewardedVideoAd = wx.createRewardedVideoAd({adUnitId: this.unitId});
+                    this.rewardedVideoAd.onClose((res) => {
+                        if (res && res.isEnded) {
+                            this.getUserCoupon();
+                        }
+                    });
+                }
+            },
+            //#endif
+            //#ifdef MP-WEIXIN
+            initInterstitialAd: function () {
+                if (wx.createInterstitialAd) {
+                    this.interstitialAd = wx.createInterstitialAd({adUnitId: this.unitId});
+                }
+            },
+            //#endif
+            //#ifdef MP-WEIXIN
+            showRewardedVideoAd: function () {
+                this.rewardedVideoAd.show().catch(() => {
+                    this.rewardedVideoAd.load().then(() => this.rewardedVideoAd.show()).catch(err => {
+                        uni.showToast({title: err.errMsg, icon: 'none'});
+                    })
+                });
+            },
+            //#endif
+            //#ifdef MP-WEIXIN
+            showInterstitialAd: function () {
+                this.interstitialAd.show().catch((err) => {
+                    uni.showToast({title: err.errMsg, icon: 'none'});
+                });
+            },
+            //#endif
+            //#ifdef MP-WEIXIN
+            getUserCoupon() {
+                this.$request({
+                    url: this.couponUrl,
+                    method: 'POST',
+                    data: Object.assign({}, this.couponParams)
+                }).then(info => {
+                    if (info.code === 0) {
+                        this.$store.dispatch('page/actionSetCoupon', {
+                            list: info.data.list,
+                            type: 'award'
+                        })
+                    } else {
+                        uni.showToast({title: info.msg, icon: 'none'});
+                    }
+                })
+            },
+            //#endif
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    //#ifdef MP-WEIXIN
+    .ad-img {
+        display: block;
+        height: 139px;
+        width: 100vw;
+    }
+    //#endif
+    .ad-video {
+        height: 230px;
+        width: 100vw;
+
+        video {
+            height: 100%;
+            width: 100%;
+        }
+    }
+</style>

+ 347 - 0
src/components/page-component/app-area-picker/app-area-picker.vue

xqd
@@ -0,0 +1,347 @@
+<template>
+    <view class="dir-left-nowrap cross-center">
+        <!-- #ifdef MP-WEIXIN || MP-BAIDU || H5 -->
+        <picker class="box-grow-1 area-picker-left"
+                mode="multiSelector"
+                @change="bindMultiPickerChange"
+                @columnchange="bindMultiPickerColumnChange"
+                :value="multiIndex"
+                range-key="name"
+                :range="multiArray">
+            <text v-if="place!==`请选择`" class="address-name-color">{{place}}</text>
+            <text v-else class="address-place-name-color">{{place}}</text>
+        </picker>
+        <!-- #endif -->
+
+        <!-- #ifdef MP-ALIPAY || MP-TOUTIAO -->
+        <view class="area-picker-left" @click="showAreaPicker">
+            <text v-if="place!==`请选择`" class="address-name-color">{{place}}</text>
+            <text v-else class="address-place-name-color">{{place}}</text>
+        </view>
+        <view class="area-picker" :class="area_picker_show">
+            <view class="area-picker-bg" bindtap="hideAreaPicker">
+                <scroll-view></scroll-view>
+            </view>
+            <view class="area-picker-body">
+                <scroll-view>
+                    <view class="area-picker-top">
+                        <text class="area-picker-cancel" @click="hideAreaPicker">取消</text>
+                        <text class="area-picker-confirm" @click="areaPickerConfirm">确认</text>
+                    </view>
+                    <view class="area-picker-row">
+                        <picker-view v-if="multiIndex && multiIndex.length" indicator-style="height: 50px" style="width: 100%; height: 250px;"
+                                     :value="multiIndex" @change="areaPickerChange">
+                            <picker-view-column>
+                                <view v-if="multiArray[0]" v-for="(item,index) in multiArray[0]" :key="index"
+                                      style="line-height: 50px;height: 50px;text-align: center">{{item.name}}
+                                </view>
+                            </picker-view-column>
+                            <picker-view-column>
+                                <view v-if="multiArray[1]" v-for="(item,index) in multiArray[1]" :key="index"
+                                      style="line-height: 50px;height: 50px;text-align: center">{{item.name}}
+                                </view>
+                            </picker-view-column>
+                            <picker-view-column>
+                                <view v-if="multiArray[2]" v-for="(item,index) in multiArray[2]" :key="index"
+                                      style="line-height: 50px;height: 50px;text-align: center">{{item.name}}
+                                </view>
+                            </picker-view-column>
+                        </picker-view>
+                    </view>
+                </scroll-view>
+            </view>
+        </view>
+        <!-- #endif -->
+        <image class="box-grow-0 arrow-image" src="https://shop.9026.com/web/statics/image/mall/static/icon/arrow-right.png"></image>
+    </view>
+</template>
+
+<script>
+    export default {
+        name: "app-area-picker",
+        props: {
+            ids: {
+                type: Array,
+                default: function () {
+                    return []
+                }
+            }
+        },
+        data() {
+            return {
+                tempIds : this.ids,
+                area_picker_show: '',
+                list: [],
+                multiIndex: [],
+                multiArray: [],
+                place: '',
+            }
+        },
+        created: function () {
+            this.tempIds = this.tempIds.concat();
+        },
+        watch: {
+            ids: {
+                handler:function (newData,oldData){
+                    this.tempIds = this.ids;
+                },
+            },
+            tempIds: {
+                handler:function (newData,oldData){
+                    const self = this;
+                    self.before((data) => {
+                        self.init(data);
+                    })
+                    this.$emit('ids', this.tempIds);
+                },
+                deep: true,
+                immediate: true,
+            },
+        },
+
+        methods: {
+            //#ifdef MP-ALIPAY || MP-TOUTIAO
+            showAreaPicker: function () {
+                this.area_picker_show = 'active';
+            },
+
+            hideAreaPicker: function () {
+                this.area_picker_show = '';
+            },
+
+            areaPickerConfirm: function (e) {
+                this.bindMultiPickerChange({detail: {value: this.multiIndex}});
+                this.hideAreaPicker();
+            },
+
+            areaPickerChange: function (e) {
+                const self = this;
+                if (self.area_picker_show == '') return;
+                let detail = {
+                    column: '',
+                    value: '',
+                };
+                for (let i = 0; i < 3; i++) {
+                    if (e.detail.value[i] !== self.multiIndex[i]) {
+                        detail.column = i;
+                        detail.value = e.detail.value[i];
+                        break;
+                    }
+                }
+                self.multiIndex = e.detail.value;
+                self.bindMultiPickerColumnChange({detail: detail});
+            },
+            //#endif
+
+            before(cb) {
+                const self = this;
+                const district = this.$storage.getStorageSync("_DISTRICT");
+                if (district) {
+                    cb(district);
+                } else {
+                    this.$request({
+                        url: self.$api.default.district,
+                    }).then(info => {
+                        if (info.code === 0) {
+                            this.$storage.setStorageSync("_DISTRICT", info.data.list);
+                            cb(info.data.list);
+                        }
+                    })
+                }
+            },
+
+            init: function (list) {
+                const null_status = this.tempIds.length === 3 && this.tempIds[0] != 0;
+                const ids = null_status ? this.tempIds : [2, 3, 4];
+                const multiIndex = this.getIndex(list, ids);
+                const multiArray = [
+                    list,
+                    list[multiIndex[0]].list,
+                    list[multiIndex[0]].list[multiIndex[1]].list
+                ];
+                let place = multiArray[0][multiIndex[0]].name
+                    + ','
+                    + multiArray[1][multiIndex[1]].name
+                    + ','
+                    + multiArray[2][multiIndex[2]].name;
+
+                /////初始化
+                let eve = [
+                    multiArray[0][multiIndex[0]],
+                    multiArray[1][multiIndex[1]],
+                    multiArray[2][multiIndex[2]],
+                ];
+                ////
+                this.setEvent(eve, null_status);
+                [this.list, this.multiArray, this.multiIndex, this.place] = [list, multiArray, multiIndex, null_status ? place : '请选择']
+            },
+
+            getIndex: function (list, data) {
+                let arr = [];
+                list.map((item, index) => {
+                    if (data[0] == item.id) arr.push(index)
+                });
+
+                list[arr[0]].list.map((item, index) => {
+                    if (data[1] == item.id) arr.push(index)
+                });
+
+                list[arr[0]].list[arr[1]].list.map((item, index) => {
+                    if (data[2] == item.id) arr.push(index);
+                });
+                return arr;
+            },
+
+            bindMultiPickerChange: function (e) {
+                let list = [
+                    this.multiArray[0][e.detail.value[0]],
+                    this.multiArray[1][e.detail.value[1]],
+                    this.multiArray[2][e.detail.value[2]],
+                ];
+
+                let place = list[0].name
+                    + ','
+                    + list[1].name
+                    + ','
+                    + list[2].name;
+                [this.multiIndex, this.place] = [e.detail.value, place];
+                this.setEvent(list);
+            },
+
+            setEvent: function (list, status = true) {
+                let data = {
+                    province: {
+                        id: list[0].id,
+                        name: list[0].name
+                    },
+                    city: {
+                        id: list[1].id,
+                        name: list[1].name
+                    },
+                    district: {
+                        id: list[2].id,
+                        name: list[2].name
+                    },
+                };
+                this.$emit('customevent', status ? data : null);
+            },
+
+            bindMultiPickerColumnChange: function (e) {
+                let data = {
+                    multiArray: this.multiArray,
+                    multiIndex: this.multiIndex
+                };
+                data.multiIndex[e.detail.column] = e.detail.value;
+                switch (e.detail.column) {
+                    case 0:
+                        data.multiIndex.splice(1, 1, 0);
+                        data.multiIndex.splice(2, 1, 0);
+                        data.multiArray.splice(1, 1, this.list[data.multiIndex[0]].list);
+                        data.multiArray.splice(2, 1, this.list[data.multiIndex[0]].list[data.multiIndex[1]].list);
+                        break;
+                    case 1:
+                        data.multiIndex.splice(2, 1, 0);
+                        data.multiArray.splice(2, 1, this.list[data.multiIndex[0]].list[data.multiIndex[1]].list);
+                        break;
+                }
+                [this.multiArray, this.multiIndex] = [data.multiArray, data.multiIndex]
+            },
+        },
+    }
+</script>
+
+<style scoped lang="scss">
+    .area-picker-left {
+        min-width: #{115rpx};
+        font-size: #{28rpx};
+        padding-right: #{24rpx};
+        line-height: 1.5;
+        margin-left: auto;
+
+        .address-name-color {
+            color: #353535;
+        }
+
+        .address-place-name-color {
+            color: #999999;
+        }
+    }
+
+    .arrow-image {
+        width: #{12rpx};
+        height: #{24rpx};
+    }
+
+    /* #ifdef MP-ALIPAY || MP-TOUTIAO  */
+    .area-picker {
+        position: fixed;
+        z-index: 1600;
+        left: 0;
+        top: 0;
+        width: 100%;
+        height: 100%;
+        display: flex;
+        flex-direction: column;
+        transform: translateY(100%);
+        transition: 250ms opacity;
+        opacity: 0;
+        background: rgba(0, 0, 0, .3);
+    }
+
+    .area-picker.active {
+        transform: translateY(0);
+        opacity: 1;
+    }
+
+    .area-picker .area-picker-bg {
+        flex-grow: 1;
+        position: relative;
+    }
+
+    .area-picker .area-picker-bg > scroll-view {
+        left: 0;
+        top: 0;
+        height: 100%;
+        width: 100%;
+        position: absolute;
+    }
+
+    .area-picker .area-picker-body {
+        flex-grow: 0;
+        height: #{600rpx};
+        background: #fff;
+        transform: translateY(100%);
+        transition: 250ms transform;
+        position: relative;
+    }
+
+    .area-picker.active .area-picker-body {
+        transform: translateY(0);
+    }
+
+    .area-picker .area-picker-body > scroll-view {
+        left: 0;
+        top: 0;
+        height: 100%;
+        width: 100%;
+        position: absolute;
+    }
+
+    .area-picker .area-picker-cancel,
+    .area-picker .area-picker-confirm {
+        display: inline-block;
+        padding: #{24rpx};
+        color: #888;
+    }
+
+    .area-picker .area-picker-confirm {
+        float: right;
+        color: #00aa00;
+    }
+
+    .area-picker .area-picker-row {
+        width: 100%;
+        height: #{500rpx};
+    }
+    /* #endif */
+</style>

+ 240 - 0
src/components/page-component/app-associated-link/app-associated-link.vue

xqd
@@ -0,0 +1,240 @@
+<template>
+	<view class="app-associated-link dir-left-nowrap main-left cross-center" :style="{backgroundColor: background}">
+		<app-jump-button style="width: 100%" form :open_type="link.open_type" :url="link.value" :params="link.params">
+			<view class="dir-left-nowrap" :class="[`${className}`]" :style="{backgroundColor: background}">
+				<view v-if="styleNum == '1'" class="app-link-title box-grow-1" :style="{textAlign: position}">
+					<image class="app-title-icon" v-if="picSwitch" :src="picUrl">
+					</image>
+					<text :style="{color: color}">{{title}}</text>
+				</view>
+				<view v-else-if="styleNum == '2'" class="app-link-title box-grow-1 main-center cross-center">
+                    <image :style="{backgroundColor: styleColor}" class="app-title-line" :src="styleImg.line"></image>
+                    <view :style="{color: color}">{{title}}</view>
+                    <image :style="{backgroundColor: styleColor}" class="app-title-line" :src="styleImg.line"></image>
+                </view>
+                <view v-else-if="styleNum == '3'" class="app-link-title box-grow-1 main-center cross-center">
+                    <view class="app-title-line star">
+                    	<view :style="{backgroundColor: styleColor}" class="top-icon"></view>
+                    	<view :style="{backgroundColor: styleColor}" class="bottom-icon"></view>
+                    </view>
+                    <view :style="{color: color}">{{title}}</view>
+                    <view class="app-title-line star">
+                    	<view :style="{backgroundColor: styleColor}" class="top-icon"></view>
+                    	<view :style="{backgroundColor: styleColor}" class="bottom-icon"></view>
+                    </view>
+                </view>
+                <view v-else-if="styleNum == '4'" class="app-link-title box-grow-1 dir-left-nowrap cross-center">
+                    <image :style="{backgroundColor: styleColor}" class="app-title-line div" :src="styleImg.div"></image>
+                    <view :style="{color: color}">{{title}}</view>
+                </view>
+                <view v-else-if="styleNum == '5'" class="app-link-title box-grow-1 dir-left-nowrap cross-center">
+                    <view :style="[{'border-color':`${styleColor}`,'background-color':`${background}`}]" class="app-title-line radius"></view>
+                    <view :style="{color: color}">{{title}}</view>
+                </view>
+                <view v-if="arrowsSwitch" class="app-more-text">更多</view>
+				<icon class="app-icon" v-if="arrowsSwitch" type></icon>
+			</view>
+		</app-jump-button>
+	</view>
+</template>
+
+<script>
+    import {mapState} from 'vuex';
+
+    export default {
+        name: "app-associated-link",
+        data() {
+            return {
+                className: ''
+            }
+        },
+        computed: {
+            ...mapState({
+                styleImg: state => state.mallConfig.__wxapp_img.diy
+            })
+        },
+	    props: {
+            arrowsSwitch: {
+                type: Boolean,
+	            default: function() {
+	                return false;
+	            }
+            },
+            background: {
+                type: String,
+	            default: function() {
+	                return '#E11B1B';
+	            }
+            },
+            color: {
+                type: String,
+	            default: function() {
+	                return '#F4EBEB';
+	            }
+            },
+            link: {
+                type: Object,
+	            default: function() {
+	                return {
+                        open_type: "tel",
+                        params: [
+	                        {
+                                value: "111",
+	                        }
+                        ],
+	                }
+	            }
+            },
+            styleColor: {
+                type: String,
+	            default: function() {
+	                return '#353535';
+	            }
+            },
+            picSwitch: {
+                type:Boolean,
+	            default: function() {
+	                return false;
+	            }
+            },
+            picUrl: {
+                type: String,
+	            default: function() {
+	                return '';
+	            }
+            },
+		    position: {
+                type: String,
+	            default: function() {
+	                return 'left';
+	            }
+		    },
+		    title: {
+                type: String,
+			    default: function() {
+			        return '';
+			    }
+		    },
+		    styleNum: {
+                type: String,
+			    default: function() {
+			        return '1';
+			    }
+		    },
+		    fontSize: {
+                type: String,
+			    default: function() {
+			        return '36';
+			    }
+		    }
+	    },
+        created() {
+            let that = this;
+            if(this.fontSize == '36') {
+            	this.className = 'big-style'
+            }else if(this.fontSize == '28') {
+            	this.className = 'medium-style'
+            }else {
+            	this.className = 'small-style'
+            }
+        },
+    }
+</script>
+
+<style scoped lang="scss">
+	.app-associated-link {
+		width: #{750rpx};
+		height: #{72rpx};
+		position: relative;
+		.app-more-text {
+			font-size: #{24rpx};
+			color: #999;
+			white-space: nowrap;
+		}
+		.app-icon {
+			background-image: url("https://shop.9026.com/web/statics/image/mall/static/icon/arrow-right.png");
+			width: #{12rpx};
+			height: #{22rpx};
+			background-repeat: no-repeat;
+			background-size: cover;
+			position: absolute;
+			right: #{24rpx};
+			top: 50%;
+			transform: translateY(-50%);
+		}
+		.app-link-title {
+        	flex-grow: 1;
+        	width: 100%;
+        	padding: 0 24rpx;
+        	.app-title-line {
+		        width: 82rpx;
+		        height: 5rpx;
+		        margin: 0 20rpx;
+		    }
+		    .app-title-line.star {
+		        width: 28rpx;
+		        height: 20rpx;
+		        .top-icon {
+		        	width: 28rpx;
+		        	height: 4rpx;
+		        	margin-bottom: 12rpx;
+		        }
+		        .bottom-icon {
+		        	width: 28rpx;
+		        	height: 4rpx;
+		        }
+		    }
+		    .app-title-line.div {
+		        width: 8rpx;
+		        height: 28rpx;
+		        margin: 0 10rpx 0 0;
+		    }
+		    .app-title-line.radius {
+		        width: 28rpx;
+		        margin: 0 10rpx 0 0;
+		        border-radius: 14rpx;
+		        border: 2rpx solid #353535;
+		        height: 28rpx;
+		    }
+		}
+    	.big-style {
+	        height: 50rpx;
+	        line-height: 50rpx;
+	        font-size: 36rpx;
+	        width: 100%;
+          padding-right: 48rpx;
+	        .app-title-icon {
+		        width: 50rpx;
+		        height: 50rpx;
+		        margin-right: 16rpx;
+		        vertical-align: top;
+		    }
+    	}
+    	.medium-style {
+	        height: 36rpx;
+	        line-height: 36rpx;
+	        font-size: 28rpx;
+	        width: 100%;
+	        padding-right: 48rpx;
+	        .app-title-icon {
+		        width: 36rpx;
+		        height: 36rpx;
+		        margin-right: 16rpx;
+		        vertical-align: top;
+		    }
+    	}
+    	.small-style {
+	        height: 28rpx;
+	        line-height: 28rpx;
+	        font-size: 24rpx;
+	        width: 100%;
+	        padding-right: 48rpx;
+	        .app-title-icon {
+		        width: 28rpx;
+		        height: 28rpx;
+		        margin-right: 16rpx;
+		        vertical-align: top;
+		    }
+    	}
+	}
+</style>

+ 1200 - 0
src/components/page-component/app-attr/app-attr.vue

xqd
@@ -0,0 +1,1200 @@
+<template>
+    <view class="app-attr">
+        <view @click="alert">
+            <slot name="button"></slot>
+        </view>
+	   <view class="modal" v-if="display === 'block'"  @click="close" >
+		   <view class="safe-area-inset-bottom u-attr-fixed" >
+			   <view class="content" @tap.native.stop="preventD">
+				   <image src="https://shop.9026.com/web/statics/image/mall/static/icon/close.png" class="close" @click="close"></image>
+				   <view class="first dir-left-nowrap" :class="sign =='wholesale' ? 'no-border' : ''">
+					   <view class="box-grow-0 img" @click.stop="clickImg(attrPic)">
+						   <app-image :img-src="attrPic" width="100%" height="100%"></app-image>
+					   </view>
+					   <view class="info">
+						   <view class="dir-left-nowrap cross-center" :class="priceColor">
+							   <view class="dir-left-nowrap cross-center">
+								   <view class="dir-left-nowrap cross-center" :style="{'color':getTheme.color}" v-if="(selectAttr && selectAttr.extra) || goods.extra">
+									   <view>{{selectAttr.extra ? selectAttr.extra.value + selectAttr.extra.name :
+										   goods.extra.value + goods.extra.name}}
+									   </view>
+									   <view v-if="!(goods.sign === 'integral_mall' && attrPrice == 0)">+</view>
+								   </view>
+								   <app-price :theme="theme" v-if="!(goods.sign === 'integral_mall' && attrPrice == 0) && sign !== 'wholesale'" type="text-price-all" :price="attrPrice"
+											  :default-price="goods.price"></app-price>
+                                   <app-price :theme="theme" v-if="sign === 'wholesale'" type="text-price-all" :price="attrPrice" :max="goods.level_show == 1 ? goods.price_member_max : goods.price_max" :min="goods.level_show == 1 ? goods.price_member_min : goods.price_min"></app-price>
+							   </view>
+							   <view v-if="goods.level_show === 1 && (selectAttr || sign == 'wholesale')">
+								   <app-member-mark :theme="theme"></app-member-mark>
+							   </view>
+						   </view>
+						   <view class="stock">库存:{{attrNum}}</view>
+					   </view>
+				   </view>
+				   <view class="second" :class="sign ==='wholesale' ? 'no-padding' : ''">
+					   <slot name="extra"></slot>
+                        <view class="wholesale" v-if="sign ==='wholesale'">
+                            <view class="wholesale-attr-list dir-left-nowrap cross-center" v-if="index != goods.attr_groups.length -1" v-for="(item, index) in goods.attr_groups" :key="index">
+                                <view class="position cross-center">
+                                    <view class="wholesale-attr-group t-omit-two">{{item.attr_group_name}}</view>
+                                </view>
+                                <scroll-view @scroll="scrollGet($event,index)" :scroll-left="item.scrollLeft" class="wholesale-attr-item" scroll-x="true">
+                                    <view class="scroll-attr-group cross-center">
+                                        <view class="wholesale-attr-group t-omit">{{item.attr_group_name.length > 10 ? item.less_attr_group_name : item.attr_group_name}}</view>
+                                    </view>
+                                    <view class="attr-name attr-background" v-for="(attr, key) in item.attr_list" :key="key" :style="{'background-color': attr.active ? theme.background : '#f2f2f2'}" @click.stop="chooseAttr(index,attr)">{{attr.attr_name}}
+                                        <view class="attr-number" :style="{'right':`${attr.length + 'rpx'}`,'background-color': `${theme.background}`}" v-if="index == 0 && attr.number > 0">{{attr.number}}</view>
+                                    </view>
+                                    <view class="attr-name attr-background" style="visibility: hidden">
+                                    </view>
+                                </scroll-view>
+                                <view @click.stop="toBottom(index)" class="right-icon">
+                                    <view></view>
+                                    <image src="https://shop.9026.com/web/statics/image/mall/static/icon/right.png"></image>
+                                </view>
+                            </view>
+                            <view class="wholesale-attr-group-list">
+                                <view class="wholesale-attr-group" v-for="(item, index) in goodsAttr" :key="index">
+                                   <view class="dir-left-nowrap">
+                                        <view class="wholesale-attr-item main-between">
+                                            <view class="dir-top-nowrap main-center attr-name t-omit">
+                                                <view class="t-omit">{{item.attr_list[item.attr_list.length - 1].attr_name}}</view>
+                                                <view class="attr-price">¥{{goods.level_show === 1 ? item.price_member : item.price}}</view>
+                                            </view>
+                                            <view class="dir-left-nowrap wholesale-number-box cross-center">
+                                               <image :src="item.number <= 0 ? 'https://shop.9026.com/web/statics/image/mall/static/plugins/un-low.png' : 'https://shop.9026.com/web/statics/image/mall/static/plugins/low.png'" class="block box-grow-0 cross-center main-center" @click.stop="wholesaleNumberSub(index)">
+                                               </image>
+                                               <view class="wholesale-number-input box-grow-0 cross-center main-center">
+                                                   <app-input height="60" type="number" v-model="item.number" paddingLeft="0" :center="true" placeholder=" " @blur="wholesaleNumberBlur(index)" :focus="false" width="88"></app-input>
+                                               </view>
+                                               <image :src="item.number >= item.stock? 'https://shop.9026.com/web/statics/image/mall/static/plugins/un-add.png' : 'https://shop.9026.com/web/statics/image/mall/static/plugins/add.png'" class="block box-grow-0 cross-center main-center" @click.stop="wholesaleNumberAdd(index)"></image>
+                                            </view>
+                                        </view>
+                                   </view>
+                               </view>
+                           </view>
+                        </view>
+					   <view class="attr-group" v-if="goods.type === 'goods' && sign !='wholesale'" v-for="(item, index) in newAttrGroupList" :key="index">
+						   <view class="attr-group-name">{{item.attr_group_name}}</view>
+						   <view class="dir-left-wrap">
+							   <view v-for="(attr, key) in item.attr_list" :key="key" class="attr-item"
+                                     :style="{'background-color':attr.checked && sign !== 'gift' ? theme.background : ''}"
+									 :class="attr.checked && sign !== 'gift' ?  'active' : attr.checked && sign === 'gift' ?  theme + '-background active' : 'attr-item-default' + (attr.attr_num_0 ? ' attr_num_0' : '')"
+									 @click.stop="storeAttrClick(attr.attr_id, item.attr_group_id)">{{attr.attr_name}}
+							   </view>
+						   </view>
+					   </view>
+					   <view v-if="chooseNumber" class="dir-left-nowrap number-box cross-center">
+						   <view class="box-grow-1">数量</view>
+						   <image :src="number <= 1 ? 'https://shop.9026.com/web/statics/image/mall/static/icon/can-be-reduced.png' : 'https://shop.9026.com/web/statics/image/mall/static/cart/can-be-reduced.png'" class="block box-grow-0 cross-center main-center" @click.stop="numberSub">
+						   </image>
+						   <view class="number-input box-grow-0 cross-center main-center">
+							   <app-input type="number" v-model="number" paddingLeft="0" :center="true" placeholder=" " @blur="numberBlur"
+										  :focus="false" width="88"></app-input>
+						   </view>
+						   <image src="https://shop.9026.com/web/statics/image/mall/static/cart/can-be-added.png" class="block box-grow-0 cross-center main-center" @click.stop="numberAdd"></image>
+					   </view>
+				   </view>
+                    <view v-if="sign ==='wholesale'" class="total">已选<text>{{totalNumber}}</text>件 总计<text>¥{{totalPrice > 0? totalPrice : '0.00'}}</text></view>
+					<view v-if="sell_time > 0">
+						<app-sell-tip :time="sell_time" @changeTime="changeTime"></app-sell-tip>
+					</view>
+					<app-jump-button form>
+					<view class="three dir-left-nowrap">
+						<view class="bd-btn box-grow-1" v-if="cartShow"
+                             :style="{'background-color': theme.background_s,'color': theme.secondary_text}" @click="cart">{{addText}}
+						</view>
+						<view v-if="showRight" class="bd-btn box-grow-1  buy"  :style="{'background-color': theme.background,'color': theme.main_text}" @click="buy">
+						   {{rightRemindText}}
+						</view>
+					</view>
+					</app-jump-button>
+			   </view>
+		   </view>
+	   </view>
+    </view>
+</template>
+
+<script>
+    import { mapState, mapGetters } from "vuex";
+    import appPrice from "../../page-component/goods/app-price.vue";
+    import appMemberMark from '../../page-component/app-member-mark/app-member-mark.vue';
+    import appSellTip from '@/components/page-component/goods/app-sell-tip.vue';
+	import goodsMixin from '@/core/goods-mixin.js';
+    export default {
+        name: "app-attr",
+		mixins: [goodsMixin],
+        components: {
+            appPrice,
+            appMemberMark,
+			appSellTip
+        },
+        props: {
+            goods: Object,
+            attrGroupList: Array,
+            attrCart: {
+                type: Array,
+                default() {
+                    return [];
+                }
+            },
+            cartShow: {
+                type: [Boolean, Number],
+                default() {
+                    return true
+                }
+            },
+            previewUrl: String,
+            submitUrl: String,
+            goodsId: {
+                type:Number,
+                default() {
+                    return 0
+                }
+            },
+            show: Number,
+            buyText: {
+                type: String,
+                default() {
+                    return '立即购买';
+                }
+            },
+            plugin: {
+                default: '',
+            },
+	        theme: {
+                type: Object,
+	        },
+            chooseNumber: {
+                type: Boolean,
+                default: true,
+            },
+            noPay: {
+                type: Boolean,
+	            default: false,
+            },
+			buyClick: {
+                type: Boolean,
+				default: false,
+			},
+			addText: {
+				type: String,
+				default: '加入购物车',
+			},
+			is_show_buy: {
+				type: Boolean,
+				default: true,
+			},
+            sign: {
+                type: String
+            },
+            totalPrice: {
+                type: String,
+                default: '0.00',
+            },
+            totalNumber: {
+                type: Number,
+                default: 0,
+            },
+            discount: {
+                type: Number,
+                default: 0,
+            },
+            wholesaleType: {
+                type: Number,
+                default: 0,
+            },
+            attentionSign: {
+                type: String
+            }
+        },
+        data() {
+            return {
+                display: 'none',
+                number: 1,
+                selectAttr: null,
+                newAttrGroupList: null,
+				pic_url: null,
+                // 商品批发
+                activeAttr: [],
+                goodsAttr: [],
+				sell_time: 0,
+            };
+        },
+        watch: {
+            show() {
+                if (this.display === 'block') {
+                	this.selectAttr = null;
+					this.close();
+				} else if (this.display === 'none') {
+					this.alert();
+				}
+            },
+            newData: {
+                handler() {
+                    this.$emit('attr', this.newData)
+                },
+                immediate: true,
+            },
+            attrGroupList: {
+                handler() {
+					this.newAttrGroupList = this.attrGroupList;
+					if (this.display == 'block') {
+                        this.alert();
+					}
+				},
+				immediate: true
+			},
+	        goods: {
+                handler() {
+                    if (this.display == 'block') {
+                        this.alert();
+                    }
+					if (this.goods) {
+						this.sell_time = this.goods.sell_time;
+					}
+                },
+		        immediate: true
+	        }
+        },
+        mounted() {
+            if(this.sign == 'wholesale') {
+                this.pic_url = this.goods.attr_groups[0].attr_list[0].pic_url
+                if(this.goods.attr_groups.length == 1) {
+                    this.goodsAttr = this.goods.attr;
+                }else {
+                    for(let item of this.goods.attr_groups) {
+                        let para = {
+                            attr_group_name: '',
+                            attr_group_id: '',
+                            attr_id: '',
+                            attr_name: ''
+                        };
+                        para.attr_group_name = item.attr_group_name
+                        para.attr_group_id = item.attr_group_id
+                        para.attr_id = item.attr_list[0].attr_id
+                        para.attr_name = item.attr_list[0].attr_name
+                        this.activeAttr.push(para)
+                    }
+                    for(let item of this.goods.attr) {
+                        let same = true;
+                        for(let i = 0;i < item.attr_list.length -1;i++) {
+                            let first = {
+                                attr_group_name: item.attr_list[i].attr_group_name,
+                                attr_group_id: item.attr_list[i].attr_group_id,
+                                attr_id: item.attr_list[i].attr_id,
+                                attr_name: item.attr_list[i].attr_name
+                            }
+                            if(JSON.stringify(first) != JSON.stringify(this.activeAttr[i])) {
+                                same = false;
+                            }
+                        }
+                        if(same) {
+                            this.goodsAttr.push(item)
+                        }
+                    }
+                }
+            }
+        },
+        methods: {
+            alert() {
+                if (this.attrGroupList && this.attrGroupList.length === 0) {
+                    return;
+                }
+                if(this.sign !== 'wholesale') {
+                    let attr_group_list = this.attrGroupList;
+                    let attrs = this.goods.attr;
+                    let select_attr = null;
+                    this.number = 1;
+                    if (attr_group_list.length === 1) {
+                        for (let i in attrs) {
+                            for (let j in attr_group_list[0].attr_list) {
+                                if (attr_group_list[0].attr_list[j].attr_id == attrs[i].attr_list[0].attr_id) {
+                                    if (attrs[i].stock > 0) {
+                                        if (attrs.length === 1) {
+                                            attr_group_list[0].attr_list[j].checked = true;
+                                        }
+                                        attr_group_list[0].attr_list[j].attr_num_0 = false;
+                                        this.pic_url = attr_group_list[0].attr_list[j].pic_url;
+                                    } else {
+                                        this.number = 0;
+                                        attr_group_list[0].attr_list[j].checked = false;
+                                        attr_group_list[0].attr_list[j].attr_num_0 = true;
+                                    }
+                                }
+                            }
+                        }
+                        if (attrs.length === 1) {
+                            select_attr = attrs[0];
+                            this.$emit('attrtap', select_attr);
+                        }
+                    }
+                    this.newAttrGroupList = attr_group_list;
+                    if(this.goods.selectAttr) {
+                        this.selectAttr = this.goods.selectAttr
+                    }else {
+                        this.selectAttr = select_attr;
+                    }
+                }
+                this.display = 'block';
+            },
+            scrollGet(e,index) {
+                this.goods.attr_groups[index].scrollLeft = e.detail.scrollLeft;
+                this.$forceUpdate();
+            },
+            toBottom(index) {
+                this.$nextTick().then(() => {
+                    this.goods.attr_groups[index].scrollLeft = 99999;
+                    this.$forceUpdate();
+                })
+            },
+            chooseAttr(index,attrItem) {
+                let that = this;
+                for(let attr of that.goods.attr_groups[index].attr_list) {
+                    attr.active = false;
+                    if(attr.attr_id == attrItem.attr_id && attr.attr_name == attrItem.attr_name) {
+                        attr.active = true;
+                    }
+                }
+                if(index == 0) {
+                    that.pic_url = attrItem.pic_url;
+                }
+                that.activeAttr[index].attr_id = attrItem.attr_id
+                that.activeAttr[index].attr_name = attrItem.attr_name
+                that.goodsAttr = [];
+                for(let item of that.goods.attr) {
+                    let same = true;
+                    for(let i = 0;i < item.attr_list.length -1;i++) {
+                        let first = {
+                            attr_group_name: item.attr_list[i].attr_group_name,
+                            attr_group_id: item.attr_list[i].attr_group_id,
+                            attr_id: item.attr_list[i].attr_id,
+                            attr_name: item.attr_list[i].attr_name
+                        }
+                        if(JSON.stringify(first) != JSON.stringify(this.activeAttr[i])) {
+                            same = false;
+                        }
+                    }
+                    if(same) {
+                        that.goodsAttr.push(item)
+                    }
+                }
+                that.$forceUpdate();
+                that.count();
+            },
+            wholesaleNumberSub(index) {
+                if(this.goodsAttr[index].number == 0) {
+                    return  false;
+                }
+                this.goodsAttr[index].number--;
+                if(this.goods.attr_groups.length == 1) {
+                    this.pic_url = this.goodsAttr[index].pic_url;
+                }
+                this.count(index);
+            },
+            wholesaleNumberAdd(index) {
+                if(this.goodsAttr[index].number > this.goodsAttr[index].stock || this.goodsAttr[index].number == this.goodsAttr[index].stock) {
+                    return false
+                }
+                this.goodsAttr[index].number++;
+                if(this.goods.attr_groups.length == 1) {
+                    this.pic_url = this.goodsAttr[index].pic_url;
+                }
+                this.count(index);
+            },
+            wholesaleNumberBlur(index) {
+                if(+this.goodsAttr[index].number > +this.goodsAttr[index].stock) {
+                    this.goodsAttr[index].number = this.goodsAttr[index].stock
+                }
+                if(this.goods.attr_groups.length == 1) {
+                    this.pic_url = this.goodsAttr[index].pic_url;
+                }
+                this.count(index);
+            },
+            count(index) {
+                let that =this;
+                this.$emit('attrtap', {goods: that.goods, goodsAttr:that.goodsAttr});
+                setTimeout(()=>{
+                    that.selectAttr = that.goodsAttr[index];
+                })
+            },
+            close() {
+                this.display = 'none';
+                this.$emit('close', false)
+            },
+            preventD() {
+            },
+            storeAttrClick(attr_id, attr_group_id) {
+                let attr_group_list = JSON.parse(JSON.stringify(this.newAttrGroupList));
+                let attrs = this.goods.attr;
+                let checkedAttr = [];
+                let attr_cart = this.attrCart;
+                for (let i in attr_group_list) {
+                    for (let j in attr_group_list[i].attr_list) {
+                        let temp = attr_group_list[i].attr_list[j];
+                        if (parseInt(attr_group_list[i].attr_group_id) == parseInt(attr_group_id)) {
+                            if (parseInt(temp.attr_id) === parseInt(attr_id)) {
+                                if (temp.checked) {
+                                    temp.checked = false;
+                                } else {
+                                    temp.checked = true;
+                                }
+                                if (temp.attr_num_0) {
+                                    return;
+                                }
+                            } else {
+                                temp.checked = false;
+                            }
+                        }
+                        if (temp.checked) {
+                            if (i == 0) {
+                                this.pic_url = attr_group_list[0].attr_list[j].pic_url;
+							}
+                            checkedAttr.push(attr_group_list[i].attr_group_id + '-' + temp.attr_id);
+                        }
+                    }
+                }
+
+                function inArray(val, arr) {
+                    return arr.some(function (v) {
+                        return val == v;
+                    })
+                }
+
+                let attrNum_0 = [];
+                let select_attr = null;
+                let number = 1;
+                for (let i in attrs) {
+                    let arr = [];
+                    let sign = 0;
+                    for (let j in attrs[i].attr_list) {
+                        let param = attrs[i].attr_list[j].attr_group_id + '-' + attrs[i].attr_list[j].attr_id;
+                        if (!inArray(param, checkedAttr)) {
+                            sign += 1;
+                            arr.push(param);
+                        }
+                    }
+                    if (attrs[i].stock == 0 && sign <= 1) {
+                        attrNum_0 = attrNum_0.concat(arr);
+                    }
+                    if (sign == 0) {
+                        if (!select_attr) {
+                            select_attr = {};
+                        }
+                        select_attr = attrs[i];
+                        attr_cart.forEach(item => {
+
+                            if (item.attr_id == select_attr.id) {
+                                number = item.num;
+                            }
+                        });
+                        if (select_attr.stock <= 0) {
+                            uni.showToast({
+                                title: '库存不足',
+                                icon: 'none'
+                            });
+                            return;
+                        }
+                        if (select_attr.stock <= number) {
+                            number = select_attr.stock;
+                        }
+                    }
+                }
+                if (checkedAttr.length == 0) {
+                    select_attr = null;
+                }
+
+                //库存为0的规格添加标识
+                for (let i in attr_group_list) {
+                    for (let j in attr_group_list[i].attr_list) {
+                        let cAttr = attr_group_list[i].attr_list[j];
+                        let cParam = attr_group_list[i].attr_group_id + '-' + cAttr.attr_id;
+                        if (inArray(cParam, attrNum_0) && !inArray(cParam, checkedAttr)) {
+                            cAttr.attr_num_0 = true;
+                        } else {
+                            cAttr.attr_num_0 = false;
+                        }
+                    }
+                }
+                this.newAttrGroupList = attr_group_list;
+                this.selectAttr = select_attr;
+                this.number = number;
+                this.$emit('attrtap', this.selectAttr);
+            },
+            numberBlur(number) {
+                number = parseInt(number.value);
+                if (number > this.attrNum) {
+                    uni.showToast({
+                        title: '库存不足',
+                        icon: 'none'
+                    });
+                    number = this.attrNum;
+                }
+                this.$emit('attrtap', this.selectAttr);
+                return this.number = number;
+            },
+            numberSub() {
+                let number = this.number;
+                if (number <= 1) {
+                    return true;
+                }
+                number--;
+                this.number = number;
+                this.$emit('attrtap', this.selectAttr);
+            },
+            numberAdd() {
+                let number = this.number;
+                number++;
+                if (number > this.attrNum) {
+                    uni.showToast({
+                        title: '库存不足',
+                        icon: 'none'
+                    });
+                    this.number = this.attrNum;
+                    return;
+                }
+                this.number = number;
+                this.$emit('attrtap', this.selectAttr);
+            },
+            cart() {
+                if (!this.submit()) {
+                    return false;
+                }
+                let select_attr = this.selectAttr;
+                if (this.goods.sign === 'pick' || this.goods.sign === 'community') {
+                	this.$emit('add', select_attr, this.number);
+                	return;
+				}
+			// 普通商品
+			if (this.goods.type === 'goods') {
+                if (this.goods.sign === 'miaosha') {
+                    this.$request({
+                        url: this.$api.miaosha.add_cart,
+                        data: {
+                            miaosha_goods_id: select_attr.goods_id,
+                            attr_id: select_attr.id,
+                            num: this.number
+                        },
+                        method: 'post'
+                    }).then(e => {
+                        uni.showToast({
+                            title: e.msg,
+                            type: 'success'
+                        });
+                        this.display = 'none';
+                        this.selectAttr.number = this.number;
+                        this.$emit('selectNumber', this.selectAttr);
+                    }).catch(() => {
+                        this.display = 'none';
+                    });
+                } else if (this.goods.sign === 'flash_sale') {
+					this.$request({
+						url: this.$api.flash_sale.add_cart,
+						data: {
+							flash_goods_id: select_attr.goods_id,
+							attr_id: select_attr.id,
+							num: this.number
+						},
+						method: 'post'
+					}).then(e => {
+						uni.showToast({
+							title: e.msg,
+							type: 'success'
+						});
+						this.display = 'none';
+						this.selectAttr.number = this.number;
+						this.$emit('selectNumber', this.selectAttr);
+					}).catch(() => {
+						this.display = 'none';
+					});
+				}else if(this.goods.sign == 'wholesale') {
+                    if(this.totalNumber < this.goods.wholesaleGoods.rise_num) {
+                        uni.showToast({
+                            title: '至少采购' + this.goods.wholesaleGoods.rise_num + this.goods.unit,
+                            image: 'https://shop.9026.com/web/statics/image/mall/static/plugins/tip.png',
+                            duration: 1000
+                        });
+                        return false
+                    }
+                    let para = [];
+                    for(let item of this.goods.attr) {
+                        if(item.number > 0) {
+                            para.push(item)
+                        }
+                    }
+                    this.$request({
+                        url: this.$api.wholesale.cart,
+                        data: {
+                            attr:  JSON.stringify(para)
+                        },
+                        method:'post'
+                    }).then(response => {
+                        this.display = 'none';
+                        if (response.code === 0) {
+                            for(let item of this.goods.attr) {
+                                item.number = '0'
+                            }
+                            for(let item of this.goodsAttr) {
+                                item.number = '0'
+                            }
+                            this.count();
+                            uni.hideLoading();
+                            uni.showToast({
+                                title: '添加成功',
+                                duration: 1000
+                            });
+                        }
+                    }).catch(response => {
+                        this.display = 'none';
+                    })
+                } else {
+                    this.$request({
+                        url: this.$api.cart.add,
+                        data: {
+                            goods_id: select_attr.goods_id,
+                            attr: select_attr.id,
+                            num: this.number
+                        },
+                        method: 'post'
+                    }).then(e => {
+                        if (e.code === 0) {
+							uni.showToast({
+								title: e.msg,
+								type: 'success'
+							});
+							this.display = 'none';
+							this.selectAttr.number = this.number;
+							this.$emit('selectNumber', this.selectAttr);
+						} else {
+							uni.showToast({
+								title: e.msg,
+								icon: "none",
+								duration: 2500
+							});
+							this.display = 'none';
+						}
+						}).catch(() => {
+							this.display = 'none';
+						});
+					}
+				//	虚拟商品
+				} else if (this.goods.type === 'ecard') {
+					uni.showToast({
+						title: '虚拟商品不允许加入购物车',
+						icon: 'none'
+					});
+				}
+            },
+            buy() {
+                // 判断登入
+                if (!this.$user.isLogin()) {
+                    this.$user.getInfo();
+                    return;
+                }
+				if (this.goods.sell_time > 0) {
+					this.rightTip();
+					return ;
+				}
+                if (!this.submit()) return false;
+                if (this.noPay) {
+                    this.$emit('pay', this.number);
+                    return;
+                }
+                if (this.buyClick) {
+                    this.display = 'none';
+                    this.selectAttr.number = this.number;
+                    this.$emit('buyClick', this.selectAttr);
+                    return false;
+				}
+                if(this.goods.sign == 'wholesale') {
+                    if(this.totalNumber < this.goods.wholesaleGoods.rise_num) {
+                        uni.showToast({
+                            title: '至少采购' + this.goods.wholesaleGoods.rise_num + this.goods.unit,
+                            image: 'https://shop.9026.com/web/statics/image/mall/static/plugins/tip.png',
+                            duration: 1000
+                        });
+                        return false
+                    }
+                    let para = {};
+                    let mch_list = [{
+                        mch_id: 0,
+                        goods_list: []
+                    }];
+                    for(let item of this.goods.attr) {
+                        if(item.number > 0) {
+                           para = {
+                                id: item.goods_id,
+                                attr: [],
+                                num: item.number,
+                                cat_id: 0,
+                                goods_attr_id: item.id
+                            }
+                            for(let attr of item.attr_list) {
+                                let attrList = {
+                                    attr_id: attr.attr_id,
+                                    attr_group_id: attr.attr_group_id
+                                }
+                                para.attr.push(attrList)
+
+                            }
+                            mch_list[0].goods_list.push(para)
+                        }
+                    }
+                    let url = `/pages/order-submit/order-submit?mch_list=${JSON.stringify(mch_list)}`;
+                    if (this.submitUrl && this.previewUrl) {
+                        url += `&preview_url=${encodeURIComponent(this.previewUrl)}&submit_url=${encodeURIComponent(this.submitUrl)}&plugin=${this.plugin}`;
+                    }
+                    uni.navigateTo({
+                        url: url
+                    })
+                }else {
+                    let goods = this.goods;
+                    let number = this.number;
+                    let select_attr = this.selectAttr;
+                    let goods_attr_id = select_attr.id;
+                    let attr = [];
+                    for (let i in select_attr.attr_list) {
+                        attr.push({
+                            attr_id: select_attr.attr_list[i].attr_id,
+                            attr_group_id: select_attr.attr_list[i].attr_group_id
+                        });
+                    }
+                    let mch_list = [{
+                        mch_id: goods.mch_id ? goods.mch_id : 0,
+                        goods_list: [{
+                            id: this.goodsId ? this.goodsId: goods.id,
+                            attr: attr,
+                            num: number,
+                            cat_id: 0,
+                            goods_attr_id: goods_attr_id
+                        }]
+                    }];
+                    let url = `/pages/order-submit/order-submit?mch_list=${JSON.stringify(mch_list)}`;
+                    if (this.submitUrl && this.previewUrl) {
+                        url += `&preview_url=${encodeURIComponent(this.previewUrl)}&submit_url=${encodeURIComponent(this.submitUrl)}&plugin=${this.plugin}`;
+                    }
+                    uni.navigateTo({
+                        url: url
+                    })
+                }
+            },
+            submit() {
+                let select_attr = this.selectAttr;
+                if(this.goods.sign === 'wholesale') {
+                    return true;
+                }
+                if (!select_attr) {
+                    uni.showToast({
+                        title: '请先选规格',
+                        icon: 'none'
+                    });
+                    return false;
+                }
+                if (select_attr.stock <= 0) {
+                    uni.showToast({
+                        title: '库存不足',
+                        icon: 'none'
+                    });
+                    return false;
+				}
+                if (this.number <= 0) {
+                    uni.showToast({
+                        title: '数量不能为0',
+                        icon: 'none'
+                    });
+                    return false;
+                }
+                if (!this.goods) {
+                    return false;
+                }
+
+                return true;
+            },
+            clickImg(src) {
+                uni.previewImage({
+                    current: 0,
+                    urls: [src]
+                });
+            },
+			changeTime(time) {
+				this.sell_time = time;
+			}
+        },
+        computed: {
+            ...mapState({
+                gConfig: state => state.gConfig,
+				isTip: state => state.mallConfig.mall.setting.is_remind_sell_time
+            }),
+            attrPic() {
+                if (this.pic_url) {
+                    return this.pic_url;
+                } else if (this.goods) {
+					return this.goods.cover_pic;
+                } else {
+					return ``;
+				}
+            },
+            priceColor:{
+				get(){
+					if (this.goods && this.goods.level_show === 1) {
+					    return `member`;
+					} else {
+					    return this.theme + '-color';
+					}
+				},
+				set(newVal){
+					return newVal
+				} 
+            },
+            attrNum() {
+                if (this.selectAttr) {
+                    return this.selectAttr.stock;
+                } else if (this.goods) {
+					return this.goods.goods_num;
+                }  else {
+					return 0;
+				}
+            },
+            attrPrice() {
+				if (this.selectAttr) {
+                    let price;
+					if (this.goods.level_show === 1) {
+                        price = this.selectAttr.price_member
+					} else {
+						price = this.selectAttr.price;
+					}
+                    if(this.sign == 'wholesale') {
+                        if(this.selectAttr.number == 0) {
+                            return 'undefined'
+                        }
+                        if(this.wholesaleType == 0) {
+                            price = (price*(this.discount/10)).toFixed(2);
+                            return price
+                        }else {
+                            price = (price - this.discount).toFixed(2);
+                            return price
+                        }
+                    }else {
+                        return price
+                    }
+				} else if(this.sign == 'wholesale') {
+                    return 'undefined';
+                } else if (this.goods) {
+                    if (this.goods.hasOwnProperty('price_min')) {
+    					return this.goods.price_min;
+    				} else {
+    					return this.goods.price;
+    				}
+				} else {
+					return 0;
+				}
+            },
+            newData() {
+                const { number, display, selectAttr } = this;
+                return {
+                    number,
+                    display,
+                    selectAttr
+                }
+            },
+	        ...mapGetters('iPhoneX', {
+                boolEmpty: 'getBoolEmpty'
+	        }),
+            ...mapGetters({
+                userInfo: 'user/info',
+            }),
+			showRight() {
+				return !(this.isTip == 0 && this.goods.sell_time > 0) && this.is_show_buy
+			},
+			remindParams() {
+				return {
+					sell_time: this.sell_time,
+					goods_id: this.goods.id,
+					template_message_list: this.goods.template_message_list,
+					buy_text: this.buyText
+				};
+			},
+        }
+    }
+
+</script>
+
+<style scoped lang="scss">
+    .app-attr {
+        background-color: #ffffff;
+        .modal {
+            background-color: rgba(0, 0, 0, 0.5);
+            position: fixed;
+            top: 0;
+            left: 0;
+            width: 100%;
+            height: 100%;
+			z-index: 1603;
+        }
+		.content {
+			width: 100%;
+			background-color: #ffffff;
+			border-radius: #{16rpx} #{16rpx} 0 0;
+			.close {
+				width: #{30rpx};
+				height: #{30rpx};
+				position: absolute;
+				right: #{24rpx};
+				top: #{24rpx};
+				background-color: #ffffff;
+			}
+			.first {
+				margin: 0 #{24rpx};
+				border-bottom: #{1rpx} solid #e2e2e2;
+                &.no-border {
+                    border-bottom: 0;
+                }
+				.img {
+					width: #{200rpx};
+					height: #{200rpx};
+					border: #{4rpx} solid #ffffff;
+					border-radius: #{8rpx};
+					margin-top: #{-64rpx};
+					display: block;
+				}
+				.info {
+					margin: #{36rpx} 0 #{26rpx} #{24rpx};
+					font-size: $uni-font-size-import-two;
+					line-height: 1;
+					.stock {
+						font-size: $uni-font-size-weak-one;
+						color: $uni-general-color-two;
+						margin-top: #{18rpx};
+					}
+					view {
+						&:first-child {
+							margin-right: #{12rpx};
+						}
+					}
+					>.member {
+						color: #f39800;
+					}
+				}
+			}
+			.second {
+				max-height: #{650rpx};
+                overflow-y: auto;
+				overflow-x: hidden;
+				padding: #{4rpx} #{24rpx};
+				font-size: $uni-font-size-general-two;
+                &.no-padding {
+                    padding: 0;
+                }
+				.attr-group {
+					padding: #{32rpx} 0;
+					border-bottom: #{1rpx} solid #e2e2e2;
+					.attr-group-name {
+						color: $uni-general-color-one;
+						margin-bottom: #{20rpx};
+					}
+					.attr-item {
+						margin-right: #{20rpx};
+						padding: #{15rpx 24rpx};
+						border-radius: #{8rpx};
+						margin-bottom: #{20rpx};
+						&.attr-item-default {
+							background-color: #f2f2f2;
+							color: $uni-important-color-black;
+						}
+						&.active {
+							color: #ffffff;
+						}
+						&.attr_num_0 {
+							color: #cdcdcd;
+							background-color: #f7f7f7;
+						}
+					}
+				}
+				.number-box {
+					color: $uni-general-color-one;
+					height: #{124rpx};
+					.block {
+						width: #{60rpx};
+						height: #{60rpx};
+						margin: 0 #{4rpx};
+						&.disabled {
+							background-color: #fbfbfb;
+							color: $uni-general-color-two;
+						}
+					}
+					.number-input {
+						width: #{88rpx};
+						height: #{60rpx};
+						color: $uni-important-color-black;
+						font-size: $uni-font-size-general-one;
+						background-color: $uni-weak-color-two;
+					}
+				}
+			}
+			.three {
+				height: #{110rpx};
+				width: 100%;
+                padding: 20upx 24upx;
+				font-size: $uni-font-size-general-one;
+			}
+		}
+    }
+	.buy {
+		color: #ffffff;
+        margin-left: 20upx;
+	}
+    .wholesale {      
+        .wholesale-attr-list {
+            height: #{88rpx};
+            margin: 0 #{24rpx};
+            border-bottom: #{1rpx} solid #e2e2e2;
+            position: relative;
+            &:first-of-type {
+                border-top: #{1rpx} solid #e2e2e2;
+            }
+            .position {
+                position: absolute;
+                left: 0;
+                top: #{2rpx};
+                z-index: 10000;
+                background-color: #fff;
+                height: #{83rpx};
+            }
+            .wholesale-attr-group {
+                max-width: #{200rpx};
+                flex-shrink: 0;
+                margin-right: #{4rpx};
+                font-size: #{20rpx};
+                color: #666666;
+                background-color: #fff;
+            }
+            .right-icon {
+                position: absolute;
+                right: #{-24rpx};
+                top: 0;
+                height: #{84rpx};
+                padding-left: #{10rpx};
+                width: #{50rpx};
+                z-index: 10000;
+                background-color: #fff;
+                view {
+                    height: #{40rpx};
+                    width: #{3rpx};
+                    background-color: #e2e2e2;
+                    position: absolute;
+                    left: 0;
+                    top: #{24rpx};
+                }
+                image {
+                    margin-top: #{33rpx};
+                    height: #{22rpx};
+                    width: #{16rpx};
+                }
+            }
+            .wholesale-attr-item {
+                height: 100%;
+                width: 100%;
+                white-space : nowrap;
+                .scroll-attr-group {
+                    display: inline-block;
+                    visibility: hidden;
+                    .wholesale-attr-group {
+                        height: #{44rpx};
+                    }
+                }
+                .attr-name {
+                    color: #fff;
+                    padding: 0 #{22rpx};
+                    height: #{56rpx};
+                    line-height: #{56rpx};
+                    border-radius: #{8rpx};
+                    font-size: #{26rpx};
+                    margin-left: #{20rpx};
+                    display: inline-block;
+                    position: relative;
+                    min-width: #{10rpx};
+                    .attr-number {
+                        color: #fff;
+                        position: absolute;
+                        top: #{-15rpx};
+                        height: #{30rpx};
+                        line-height: #{26rpx};
+                        border: #{2rpx} solid #fff;
+                        padding: 0 #{10rpx};
+                        border-radius: #{15rpx};
+                        font-size: #{20rpx};
+                        z-index: 100;
+                    }
+                    &.attr-background {
+                        background-color: #f2f2f2;
+                        color: #353535;
+                    }
+                }
+            }
+        }
+        .wholesale-attr-group-list {
+            margin-top: #{20rpx};
+            .wholesale-attr-group {
+                margin-bottom: #{20rpx};
+                .wholesale-attr-item {
+                    padding: #{20rpx};
+                    background-color: #f7f7f7;
+                    width: 100%;
+                    .attr-name {
+                        width: 60%;
+                        .attr-price {
+                            color: #999999;
+                            font-size: #{24rpx};
+                        }
+                    }
+                    .wholesale-number-box {
+                        color: $uni-general-color-one;
+                        .block {
+                            width: #{60rpx};
+                            height: #{60rpx};
+                            margin: 0 #{4rpx};
+                            &.disabled {
+                                background-color: #fbfbfb;
+                                color: $uni-general-color-two;
+                            }
+                        }
+
+                        .wholesale-number-input {
+                            width: #{88rpx};
+                            height: #{60rpx};
+                            color: $uni-important-color-black;
+                            font-size: $uni-font-size-general-one;
+                            background-color: #fff;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    .total {
+        width: 100%;
+        height: #{80rpx};
+        line-height: #{80rpx};
+        text-align: right;
+        padding: 0 24rpx;
+        color: #353535;
+        font-size: #{28rpx};
+        border-top: #{1rpx} solid #e2e2e2;
+        text {
+            color: #ff4544;
+        }
+    }
+    .u-attr-fixed {
+        position: fixed;
+        bottom: 0;
+        left: 0;
+        width: 100%;
+        background-color: #ffffff;
+    }
+    .bd-btn {
+        line-height: 70upx;
+        text-align: center;
+        font-size: 26upx;
+        border-radius: 35upx;
+    }
+</style>

+ 125 - 0
src/components/page-component/app-buy-prompt/app-buy-prompt.vue

xqd
@@ -0,0 +1,125 @@
+<template>
+    <view v-if="buy_data && buy_data.length" class="buy-prompt-box" :style="[hiddenHeight()]">
+        <swiper circular vertical autoplay>
+            <block v-for="(item,index) in buy_data" :key="index">
+                <swiper-item @touchmove.stop.prevent catchtouchmove='catchTouchMove'>
+                    <view class="box">
+                        <view class="cross-center center dir-left-nowrap">
+                            <image class="box-grow-0 image" :src="item.avatar"></image>
+                            <view class="box-grow-0 text-a">{{item.time_str}}</view>
+                            <view class="box-grow-0 text-b">{{item.content}}</view>
+                        </view>
+                    </view>
+                </swiper-item>
+            </block>
+        </swiper>
+    </view>
+</template>
+
+<script>
+    import { mapState} from "vuex";
+    export default {
+        name: "app-buy-prompt",
+        props: {
+            isShowAttention: Boolean,
+            url: String,
+            height: [Number,String]
+        },
+        data() {
+            return {
+                isWechat: false,
+                buy_data: null,
+            }
+        },
+        computed: {
+            ...mapState({
+                systemInfo: state => state.gConfig.systemInfo,
+                mBarHeight: state => state.gConfig.mBarHeight
+            }),
+            // #ifdef H5
+            isWechat: function() {
+                return this.$jwx.isWechat();
+            },
+            // #endif
+            hiddenHeight() {
+                return () => {
+                    let n;
+                    if (this.isShowAttention) {
+                        n = uni.upx2px(280);
+                    } else {
+                        n = uni.upx2px(97);
+                    }
+                    // #ifdef MP-WEIXIN || MP-BAIDU || MP-TOUTIAO
+                    n = n + this.systemInfo.statusBarHeight + this.mBarHeight;
+                    // #endif
+
+                    // #ifdef H5
+                    if(!this.isWechat) {
+                        n = n + this.systemInfo.statusBarHeight + this.mBarHeight;
+                    }
+                    // #endif
+                    return Object.assign({}, {
+                        top: this.height ? this.height  + 'px' : n + 'px',
+                    })
+                }
+            },
+        },
+        created: function () {
+            const self = this;
+            self.$request({
+                url: self.url ? self.url : self.$api.index.buy_data,
+            }).then(info => {
+                if (info.code === 0) {
+                    self.buy_data = info.data;
+                }
+            });
+        },
+        methods: {
+            catchTouchMove: function () {
+                return false
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    swiper {
+        height: #{60rpx};
+        width: #{568rpx};
+    }
+
+    .buy-prompt-box {
+        position: fixed;
+        top: #{97rpx};
+        left: #{24rpx};
+        z-index: 9999;
+    }
+
+    .buy-prompt-box .box {
+        display: inline-block
+    }
+
+    .buy-prompt-box .center {
+        height: #{60rpx};
+        background-color: rgba(0, 0, 0, 0.5);
+        border-radius: #{30rpx};
+        color: #fff;
+    }
+
+    .buy-prompt-box .image {
+        height: #{60rpx};
+        width: #{60rpx};
+        border-radius: 50%;
+    }
+
+    .buy-prompt-box .text-a {
+        padding-left: #{10rpx};
+        font-size: #{24rpx};
+    }
+
+    .buy-prompt-box .text-b {
+        padding-right: #{24rpx};
+        font-size: #{24rpx};
+        white-space: nowrap;
+    }
+</style>

+ 195 - 0
src/components/page-component/app-cash-model/app-cash-model.vue

xqd
@@ -0,0 +1,195 @@
+<template>
+    <view>
+        <app-model v-model="display" type="3">
+            <view slot="title">{{title}}</view>
+            <view slot="content">
+                <view class="dir-top-nowrap">
+                    <view class="cash-type-item dir-left-nowrap cross-center" v-if="isAuto">
+                        <image class="icon" src="https://shop.9026.com/web/statics/image/mall/static/icon/cash/icon-auto.png"></image>
+                        <view class="dir-left-nowrap box-grow-1 cash-type-box cross-center"
+                              @click="payTypeChange(`auto`)">
+                            <!--  #ifdef MP-WEIXIN -->
+                            <view class="box-grow-1 cross-center">微信零钱</view>
+                            <!--  #endif -->
+                            <!--  #ifdef MP-ALIPAY -->
+                            <view class="box-grow-1 cross-center">支付宝余额</view>
+                            <!--  #endif -->
+                            <!--  #ifndef MP-WEIXIN || MP-ALIPAY -->
+                            <view class="box-grow-1 cross-center">自动</view>
+                            <!--  #endif -->
+                            <view class="cross-center">
+                                <view v-if="payType === `auto`" class="radio-single-active" :style="{'background-color': theme.background}"></view>
+                                <view v-else class="radio-single"></view>
+                            </view>
+                        </view>
+                    </view>
+                    <view class="cash-type-item dir-left-nowrap cross-center" v-if="isWx">
+                        <image class="icon" src="https://shop.9026.com/web/statics/image/mall/static/icon/cash/icon-wechat.png"></image>
+                        <view class="dir-left-nowrap cross-center box-grow-1 cash-type-box"
+                              @click="payTypeChange(`wx`)">
+                            <view class="box-grow-1">微信线下打款</view>
+                            <view class="box-grow-0">
+                                <view v-if="payType === `wx`" class="radio-single-active" :style="{'background-color': theme.background}"></view>
+                                <view v-else class="radio-single"></view>
+                            </view>
+                        </view>
+                    </view>
+                    <view class="cash-type-item dir-left-nowrap cross-center" v-if="isAlipay">
+                        <image class="icon" src="https://shop.9026.com/web/statics/image/mall/static/icon/cash/icon-alipay.png"></image>
+                        <view class="dir-left-nowrap cross-center box-grow-1 cash-type-box"
+                              @click="payTypeChange(`alipay`)">
+                            <view class="box-grow-1">支付宝线下打款</view>
+                            <view class="box-grow-0">
+                                <view v-if="payType === `alipay`" class="radio-single-active" :style="{'background-color': theme.background}"></view>
+                                <view v-else class="radio-single"></view>
+                            </view>
+                        </view>
+                    </view>
+                    <view class="cash-type-item dir-left-nowrap cross-center" v-if="isBank">
+                        <image class="icon" src="https://shop.9026.com/web/statics/image/mall/static/icon/cash/icon-bank.png"></image>
+                        <view class="dir-left-nowrap cross-center box-grow-1 cash-type-box"
+                              @click="payTypeChange(`bank`)">
+                            <view class="box-grow-1">银联线下打款</view>
+                            <view class="box-grow-0">
+                                <view v-if="payType === `bank`" class="radio-single-active" :style="{'background-color': theme.background}"></view>
+                                <view v-else class="radio-single"></view>
+                            </view>
+                        </view>
+                    </view>
+                    <view class="cash-type-item dir-left-nowrap cross-center" v-if="isBalance">
+                        <image class="icon" src="https://shop.9026.com/web/statics/image/mall/static/icon/cash/icon-balance.png"></image>
+                        <view class="dir-left-nowrap cross-center box-grow-1 cash-type-box"
+                              @click="payTypeChange(`balance`)">
+                            <view class="box-grow-1">商城余额</view>
+                            <view class="box-grow-0">
+                                <view v-if="payType === `balance`" class="radio-single-active" :style="{'background-color': theme.background}"></view>
+                                <view v-else class="radio-single"></view>
+                            </view>
+                        </view>
+                    </view>
+                </view>
+            </view>
+        </app-model>
+    </view>
+</template>
+
+<script>
+    import appModel from '../../basic-component/app-model/app-model.vue';
+
+    export default {
+        name: "app-cash-model",
+        components: {appModel},
+        props: {
+            title: {
+                type: String,
+                default() {
+                    return '提现方式';
+                }
+            },
+            payType: String,
+            /* balance bank alipay wx auto*/
+            isAuto: {
+                type: Boolean,
+                default() {
+                    return false
+                }
+            },
+            isWx: {
+                type: Boolean,
+                default() {
+                    return false
+                }
+            },
+            isAlipay: {
+                type: Boolean,
+                default() {
+                    return false
+                }
+            },
+            isBank: {
+                type: Boolean,
+                default() {
+                    return false
+                }
+            },
+            isBalance: {
+                type: Boolean,
+                default() {
+                    return false
+                }
+            },
+            value: {
+                type: Boolean,
+                default() {
+                    return false
+                }
+            },
+            theme: {
+                type: Object,
+            }
+        },
+        data() {
+            return {
+                display: this.value
+            }
+        },
+        watch: {
+            value: function (value) {
+                this.display = value;
+            },
+            display: function (value) {
+                this.$emit('input', value);
+            }
+        },
+        computed: {},
+        methods: {
+            payTypeChange(pay_type) {
+                // this.payType = pay_type;
+                this.$emit('change', pay_type);
+                this.display = false;
+            },
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .cash-type-item {
+        height: #{120rpx};
+        padding-left: #{32rpx};
+
+        > view {
+            height: 100%;
+        }
+
+        .cash-type-box {
+            border-bottom: 1px solid #E2E2E2;
+            padding-right: #{32rpx};
+
+
+            .radio-single {
+                width: #{40rpx};
+                height: #{40rpx};
+                border-radius: 50%;
+                background-color: white;
+                border: #{1rpx} solid #e2e2e2;
+            }
+
+            .radio-single-active {
+                width: #{40rpx};
+                height: #{40rpx};
+                border-radius: 50%;
+                background-repeat: repeat;
+                background-size: 100% 100%;
+                background-image: url("https://shop.9026.com/web/statics/image/mall/static/icon/yes-radio.png");
+            }
+        }
+
+        .icon {
+            height: #{40rpx};
+            width: #{40rpx};
+            margin-right: #{16rpx};
+            display: flex;
+            justify-content: center;
+        }
+    }
+</style>

+ 94 - 0
src/components/page-component/app-category-list/app-category-list.vue

xqd
@@ -0,0 +1,94 @@
+<template>
+    <scroll-view scroll-y class="app-category-list"
+                 :style="{height: `${noSetHeight}` ? `${noSetHeight}` : `${setHeight}`}">
+		<view class="app-item dir-left-nowrap" v-for="(item, index) in list" :key="index" @click="active(item, index)">
+			<view class="app-border" :style="{'background-color': item.active === true ? theme.background : '#f7f7f7'}"></view>
+			<view class="app-text" :style="{'color': item.active === true ? theme.color : ''}">{{item.name}}</view>
+		</view>
+	</scroll-view>
+</template>
+
+<script>
+
+    export default {
+        name: 'app-category-list',
+	    props: {
+            list: {
+                type: Array,
+	            default() {
+                    return [];
+	            }
+            },
+            windowHeight: {
+                type: Number,
+	            default() {
+                    return 0
+	            }
+            },
+            windowWidth: {
+                type: Number,
+                default() {
+                    return 0
+                }
+            },
+            botHeight: {
+                type: Number,
+                default() {
+                    return 0
+                }
+            },
+            noSetHeight: {
+                type: String
+            },
+			theme: Object
+	    },
+	    methods: {
+            active(item, index) {
+                this.$emit('click', {
+                    item, index
+                });
+            }
+	    },
+	    computed: {
+		    setHeight() {
+                let bottom = 0;
+                if (this.$parent.$parent.$children[0].tabbarbool) {
+                    bottom = this.botHeight;
+                }
+                return (this.windowHeight * (750 / this.windowWidth)) - bottom - 88 + 'rpx';
+		    }
+	    }
+    }
+</script>
+
+<style lang="scss">
+	.app-border {
+		width: #{8rpx};
+		height: #{106rpx};
+		background-color: #f7f7f7;
+	}
+	.app-category-list {
+		width: #{204rpx};
+		background-color: #f7f7f7;
+	}
+	.app-item {
+		width: #{204rpx};
+		height: #{106rpx};
+		background-color: #f7f7f7;
+	}
+	.app-text {
+		background-color: #f7f7f7;
+		width: #{196rpx};
+		height: #{106rpx};
+		line-height: #{106rpx};
+		text-align: center;
+		font-size: #{28rpx};
+		color: #666666;
+		word-break: break-all;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-box-orient: vertical;
+		-webkit-line-clamp: 1;
+		overflow: hidden;
+	}
+</style>

+ 87 - 0
src/components/page-component/app-check-in/app-check-in.vue

xqd
@@ -0,0 +1,87 @@
+<template>
+    <view class="app-check-in dir-left-nowrap" :class="'main-' + textPosition" :style="{backgroundImage: `url(`+backgroundPicUrl+`)`}">
+        <app-hotspot :hotspot="hotspot">
+            <view @click='checkIn' style="width:100%;height:100%;"></view>
+        </app-hotspot>
+        <view class="dir-top-nowrap main-center" v-if="userInfo.check_in && showText" :style="{color:textColor,textAlign: textPosition}">
+            <view class="box-grow-0 first">今天签到可获得{{userInfo.check_in.todayAward}}</view>
+            <view class="box-grow-0 second">已连续签到{{userInfo.check_in.continue}}天</view>
+        </view>
+    </view>
+</template>
+
+<script>
+    import {mapGetters} from 'vuex';
+    import appHotspot from '../../basic-component/app-hotspot/app-hotspot.vue';
+    import checkInAward from './check-in-award.js';
+
+    export default {
+        name: "app-check-in",
+        components: {
+            'app-hotspot': appHotspot
+        },
+        props: {
+            backgroundPicUrl: {
+                type: String,
+                default() {
+                    return '';
+                }
+            },
+            hotspot: {
+                type: Object,
+                default() {
+                    return {};
+                }
+            },
+            showText: {
+                type: Boolean,
+                default() {
+                    return false;
+                }
+            },
+            textColor: String,
+            textPosition: String,
+        },
+        computed: {
+            ...mapGetters({
+                userInfo: 'user/info',
+            })
+        },
+        methods: {
+            checkIn() {
+                uni.showLoading({
+                    title: '签到中'
+                });
+                checkInAward.getAward(1, 1).then(result => {
+                    uni.hideLoading();
+                    uni.showToast({
+                        title: '签到成功',
+                        icon: 'success',
+                        mask: false
+                    });
+                    this.$store.dispatch('user/info');
+                }).catch(e => {
+                    uni.hideLoading();
+                    uni.showToast({
+                        title: e,
+                        mask: false,
+                        icon: 'none'
+                    })
+                });
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .app-check-in {
+        width: 100%;
+        height: #{200rpx};
+        padding: 0 #{50rpx};
+        position: relative;
+
+        background-position: center;
+        background-size: cover;
+        background-repeat: no-repeat;
+    }
+</style>

+ 55 - 0
src/components/page-component/app-check-in/check-in-award.js

xqd
@@ -0,0 +1,55 @@
+import request from '../../../core/request.js';
+import api from '../../../core/appOnLaunch.js';
+
+export default {
+    getAward(status,day) {
+        return new Promise((resolve, reject) => {
+            request({
+                url: api.check_in.sign_in,
+                data: {
+                    status: status,
+                    day: day ? day : 1
+                }
+            }).then(response=>{
+                if(response.code == 0) {
+                    this.checkInResult(response.data.queueId, response.data.token).then(result => {
+                        return resolve(result);
+                    }).catch(e => {
+                        return reject(e);
+                    });
+                }else {
+                    return reject(response.msg);
+                }
+            }).catch(response => {
+                return reject(response);
+            });
+        });
+    },
+    checkInResult(queueId, token) {
+        return new Promise((resolve, reject) => {
+            request({
+                url: api.check_in.sign_in_result,
+                data: {
+                    queueId: queueId,
+                    token: token
+                }
+            }).then(response=>{
+                if(response.code == 0) {
+                    if (response.data.retry == 1) {
+                        this.checkInResult(queueId, token).then(result => {
+                            return resolve(result);
+                        }).catch(e => {
+                            return reject(e);
+                        });
+                    } else {
+                        return resolve(response.data);
+                    }
+                }else {
+                    return reject(response.msg);
+                }
+            }).catch(response => {
+                return reject(response);
+            });
+        });
+    },
+}

+ 197 - 0
src/components/page-component/app-clerk-historys/app-clerk-historys.vue

xqd
@@ -0,0 +1,197 @@
+<template>
+    <view @touchmove.stop.prevent="" class="app-clerk-historys" v-show="visible">
+        <view class="history-box">
+            <view class="top-box">
+                <span class="text">历史核销记录</span>
+                <image @click="close" class="close" src="https://shop.9026.com/web/statics/image/mall/static/icon/icon-close.png"></image>
+            </view>
+            <scroll-view class="scroll-view" scroll-y="true" @scrolltolower="lower">
+                <view class="item" v-for="item in list" :key="item.id">
+                    <view class="title">已核销({{item.use_number}}次)</view>
+                    <view class="clerk-info">
+                        <view class="list-item">
+                            核销时间:{{item.clerked_at}}
+                        </view>
+                        <view class="list-item">
+                            核销门店:{{item.store_name}}
+                        </view>
+                        <view class="list-item">
+                            核销员:{{item.clerk_user}}
+                        </view>
+                    </view>
+                </view>
+                <view class="not-more" v-if="isMore">没有更多数据!</view>
+            </scroll-view>
+        </view>
+    </view>
+</template>
+
+<script>
+    export default {
+        name: 'app-clerk-historys',
+        components: {},
+        props: {
+            isShow: {
+                type: Boolean,
+                default: false
+            },
+            userCardId: {
+                type: Number,
+                default: 0,
+            }
+        },
+        watch: {
+            isShow(newVal) {
+                if (!newVal) {
+                    this.visible = false;
+                }
+
+                if (newVal) {
+                    this.page = 1;
+                    this.list = [];
+                    this.getList();
+                }
+            }
+        },
+        data() {
+            return {
+                visible: false,
+                list: [],
+                page: 1,
+                isMore: false,
+            }
+        },
+        methods: {
+            close() {
+                this.$emit('update:isShow', false);
+            },
+            getList() {
+                let that = this;
+                that.$showLoading({
+                    text: '加载中...'
+                });
+                that.$request({
+                    url: that.$api.card.history,
+                    data: {
+                        user_card_id: that.userCardId,
+                        page: that.page,
+                    },
+                }).then(response => {
+                    that.$hideLoading();
+                    that.visible = true;
+                    if (response.code === 0) {
+                        that.list = that.list.concat(response.data.list);
+                        that.page = response.data.list.length > 0 ? that.page + 1 : that.page;
+                        if (response.data.list.length === 0) {
+                            that.isMore = true;
+                        }
+                    } else {
+                        uni.showToast({
+                            title: response.msg,
+                            icon: 'none',
+                            duration: 2000,
+                        });
+                    }
+                }).catch(() => {
+                    that.$hideLoading();
+                });
+            },
+            lower() {
+                this.getList();
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .app-clerk-historys {
+        width: 100%;
+        height: 100vh;
+        background: rgba(0, 0, 0, 0.5);
+        position: fixed;
+        top: 0;
+        left: 0;
+
+        .history-box {
+            position: absolute;
+            left: 0;
+            bottom: 0;
+            width: 100%;
+            max-height: 920#{rpx};
+            overflow: hidden;
+            border-top-left-radius: 16#{rpx};
+            border-top-right-radius: 16#{rpx};
+            background: #f7f7f7;
+
+            .top-box {
+                width: 100%;
+                height: 120#{rpx};
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                position: relative;
+                background: #ffffff;
+
+                .text {
+                    font-size: 38#{rpx};
+                    color: #353535;
+                }
+
+                .close {
+                    width: 35#{rpx};
+                    height: 35#{rpx};
+                    position: absolute;
+                    right: 24#{rpx};
+                    top: 24#{rpx};
+                }
+            }
+
+            .scroll-view {
+                max-height: 800#{rpx};
+
+                .item {
+                    display: flex;
+                    flex-direction: column;
+                    margin-top: 18#{rpx};
+                    background: #ffffff;
+                    max-height: 800#{rpx};
+
+                    .title {
+                        height: 80#{rpx};
+                        display: flex;
+                        align-items: center;
+                        font-size: 28#{rpx};
+                        color: #353535;
+                        border-bottom: 1#{rpx} solid #dcdcdc;
+                        padding-left: 24#{rpx};
+                    }
+
+                    .clerk-info {
+                        display: flex;
+                        flex-direction: column;
+                        padding: 25#{rpx} 24#{rpx};
+
+                        .list-item {
+                            margin-bottom: 20#{rpx};
+                            font-size: 28#{rpx};
+                            color: #353535;
+                        }
+                        .list-item:last-child {
+                            margin-bottom: 0;
+                        }
+                    }
+                }
+
+                .not-more {
+                    width: 100%;
+                    display: flex;
+                    justify-content:center;
+                    align-items: center;
+                    color: #353535;
+                    font-size:28#{rpx};
+                    padding:20#{rpx} 0;
+                }
+            }
+        }
+    }
+</style>

+ 103 - 0
src/components/page-component/app-common/app-wechat-share.vue

xqd
@@ -0,0 +1,103 @@
+<template>
+    <view v-if='is_add_show' class="app-view" @click="close">
+        <view class="app-wechat-share point-box"
+              :style="{'background-color':setting.add_app_bg_color,
+              'opacity':setting.add_app_bg_transparency / 100,
+              'border-radius': setting.add_app_bg_radius + `rpx`}"
+        >
+            <view class='triangle'
+                  :style="{'border-bottom':'16rpx solid ' + setting.add_app_bg_color,'opacity': setting.add_app_bg_transparency / 100}"
+            ></view>
+            <view class='dir-left-nowrap cross-center'>
+                <image @click='close'
+                       v-if='setting.add_app_icon_color_type == 2'
+                       class='icon-fork'
+                       src='https://shop.9026.com/web/statics/image/mall/static/icon/fork_black.png'
+                ></image>
+                <view class='cross-center point-text'
+                      :style="{'color':setting.add_app_text_color}">
+                    {{ setting.add_app_text }}
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+<script>
+
+export default {
+    name: "app-wechat-share",
+    data() {
+        return {
+            //is_add_show: false,
+            setting: {
+                add_app_bg_color: '#FFFFFF',
+                add_app_bg_radius: 36,
+                add_app_bg_transparency: 100,
+                add_app_icon_color_type: 2,
+                add_app_text: '请点击右上角的“...”按钮,分享给好友',
+                add_app_text_color: '#353535',
+            },
+        }
+    },
+    computed: {
+        is_add_show() {
+            // #ifdef H5
+            return this.$store.state.share.status;
+            // #endif
+        },
+    },
+    methods: {
+        close: function () {
+            this.$store.commit('share/status', false);
+        }
+    },
+    destroyed(){
+        // #ifdef H5
+        this.$store.commit('share/status', false);
+        // #endif
+    },
+    created() {
+        // #ifdef H5
+        this.$store.commit('share/status', false);
+        // #endif
+    }
+}
+</script>
+
+<style scoped lang="scss">
+.app-view {
+    position: fixed;
+    height: 100vh;
+    width: 100vw;
+    background-color: rgba(0, 0, 0, 0.5);
+    z-index: 2002;
+}
+
+.point-box {
+    position: fixed;
+    z-index: 2003;
+    top: 16#{rpx};
+    right: 24#{rpx};
+    height: 72#{rpx};
+
+    .triangle {
+        width: 0;
+        height: 0;
+        border-right: 16#{rpx} solid transparent;
+        border-left: 16#{rpx} solid transparent;
+        position: absolute;
+        top: -15#{rpx};
+        right: 50#{rpx};
+    }
+
+    .icon-fork {
+        width: 72#{rpx};
+        height: 72#{rpx};
+    }
+
+    .point-text {
+        margin: 0 28#{rpx};
+        font-size: $uni-font-size-general-one;
+    }
+}
+</style>

+ 56 - 0
src/components/page-component/app-copyright/app-copyright.vue

xqd
@@ -0,0 +1,56 @@
+<template>
+    <view class="app-view">
+        <app-jump-button form :url="link.url" :open_type="link.openType" :params="link.params?link.params:[]">
+            <view class="app-view dir-top-nowrap cross-center" :style="{backgroundColor: backgroundColor}">
+                <icon class="app-icon" v-if="picUrl" :style="{backgroundImage: `url(${picUrl})`}" type></icon>
+                <text class="app-text" :style="{marginTop: picUrl ? '16rpx': '24rpx'}">{{text}}</text>
+            </view>
+        </app-jump-button>
+    </view>
+</template>
+
+<script>
+
+    export default {
+        name: 'app-copyright',
+        props: {
+            backgroundColor: {
+                type: String,
+                default() {
+                    return '#ff4544';
+                }
+            },
+            link: {
+                type: Object,
+                default() {
+                    return null;
+                }
+            },
+            picUrl: String,
+            text: String,
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .app-view {
+        width: #{750rpx};
+        border: none;
+        border-radius: 0;padding-bottom: 24rpx;
+    }
+
+    .app-text {
+        font-size: #{24rpx};
+        text-align: center;
+        color: #999999;
+    }
+
+    .app-icon {
+        width: #{160rpx};
+        height: #{50rpx};
+        margin-top: #{36rpx};
+        background-size: 100% 100%;
+        background-repeat: no-repeat;
+    }
+
+</style>

+ 177 - 0
src/components/page-component/app-coupon-center/app-coupon-center.vue

xqd
@@ -0,0 +1,177 @@
+<template>
+	<view class="app-coupon-center">
+		<view class="app-coupon-item"
+		      v-for="(item, index) in list"
+		      :key="index"
+		      @click="jump(item)"
+		>
+			<view class="app-top dir-left-nowrap main-between"  :class="{'app-unexpired': item.is_receive === '0', 'app-received': item.is_receive > '0'}">
+				<view class="app-text dir-left-nowrap main-left">
+					<view class="app-price">
+						<text class="app-symbol">¥</text>
+						<text class="app-number">{{item.sub_price}}</text>
+					</view>
+					<view class="app-amount dir-top-nowrap main-left">
+						<text>优惠券</text>
+						<text>满{{item.min_price}}使用</text>
+					</view>
+				</view>
+				<view class="app-button">
+					<app-button type="important"
+					            height="56"
+					            background="#ffffff"
+					            round
+					            :color="`${item.is_receive === '0' ? '#ff4544' : item.is_receive > '0' ? '#999999' : ''}`"
+					            fontSize="28"
+					            @click="use(item.id)"
+					>{{item.is_receive === '0' ? '立即领取' : item.is_receive > '0' ? '已领取' : ''}}</app-button>
+				</view>
+			</view>
+			<view class="app-bottom dir-top-nowrap main-between">
+				<text class="app-time">
+					有效时间: {{item.begin_time}} - {{item.end_time}}
+				</text>
+				<text class="app-range">
+					适用范围: {{setRange(item.appoint_type)}}
+				</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import jump from '../../../core/jump.js';
+	
+    export default {
+        name: 'app-coupon-center',
+	    props: {
+            list: {
+                type: Array,
+	            default: function() {
+	                return [
+		                {
+                            appoint_type: "",
+                            begin_time: "",
+                            cat: [],
+                            couponGoods: [],
+                            created_at: "",
+                            deleted_at: "",
+                            desc: "",
+                            discount: "",
+                            end_time: "",
+                            expire_day: "",
+                            expire_type: "",
+                            goods: [],
+                            id: "",
+                            is_delete: "",
+                            is_member: "",
+                            is_receive: "",
+                            mall_id: "",
+                            min_price: "",
+                            name: "",
+                            pic_url: "",
+                            rule: "",
+                            sort: "",
+                            sub_price: "",
+                            total_count: "",
+                            type: "",
+                            updated_at: "",
+		                }
+	                ]
+	            }
+            }
+	    },
+	    methods: {
+            setRange: function(appoint_type) {
+                if (appoint_type === '1') {
+                    return '限品类';
+                } else if (appoint_type === '2') {
+                    return '限商品';
+                } else if (appoint_type === '3') {
+                    return '全场通用';
+                }
+            },
+            jump(item) {
+                jump({
+	                open_type: 'navigate',
+	                url: `/pages/coupon/details/details?id=${item.id}`
+                });
+            },
+            use() {
+            }
+	    }
+    }
+</script>
+
+<style scoped lang="scss">
+	.app-coupon-center {
+		width: #{750rpx};
+		overflow: hidden;
+		.app-coupon-item {
+			margin: #{20rpx} #{24rpx} #{0} #{24rpx};
+			width: #{702rpx};
+			height: #{160+112rpx};
+			.app-top {
+				width: #{702rpx};
+				height: #{160rpx};
+				background-size: 100% 100%;
+				background-repeat: no-repeat;
+				.app-button {
+					width: #{160+24rpx};
+					padding-right: #{24rpx};
+					padding-top: #{48rpx};
+					/deep/ button {
+						padding: 0 #{10rpx} !important;
+					}
+				}
+				.app-text {
+					width: #{702-160-24rpx};
+					height: #{160rpx};
+					margin-left: #{24rpx};
+					.app-price {
+						padding-top: #{52rpx};
+						color: #ffffff;
+						.app-symbol {
+							font-size: #{36rpx};
+						}
+						.app-number {
+							font-size: #{72rpx};
+						}
+					}
+					.app-amount {
+						padding-top: #{50rpx};
+						color: #ffffff;
+						font-size: #{28rpx};
+						margin-left: #{20rpx};
+					}
+				}
+			}
+			.app-unexpired {
+				background-image: url("https://shop.9026.com/web/statics/image/mall/static/icon/unexpired-coupon.png");
+			}
+			.app-received {
+				background-image: url("https://shop.9026.com/web/statics/image/mall/static/icon/received-coupon.png");
+			}
+			.app-bottom {
+				width: #{702rpx};
+				height: #{112rpx};
+				border-left: #{1rpx} solid #cfcfcf;
+				border-bottom: #{1rpx} solid #cfcfcf;
+				border-right: #{1rpx} solid #cfcfcf;
+				border-bottom-left-radius: #{16rpx};
+				border-bottom-right-radius: #{16rpx};
+				text {
+					font-size: #{24rpx};
+					color: #666666;
+					margin-left: #{24rpx};
+				}
+				.app-time {
+					margin-top: #{24rpx};
+				}
+				.app-range {
+					margin-bottom: #{32rpx};
+				}
+			}
+		}
+	}
+</style>

+ 246 - 0
src/components/page-component/app-customer/app-customer.vue

xqd
@@ -0,0 +1,246 @@
+<template>
+    <view class="app-customer" :style="[styleA]">
+        <view v-if="selectStyle === '1'" class="customer-box dir-top-nowrap cross-center" :style="[styleB]">
+            <view :style="{color: titleColor}" class="title">{{ title }}</view>
+            <image :src="we.qrcode" @click="clickImg(we.qrcode)" show-menu-by-longpress></image>
+            <view v-if="we.name" :style="{color: wechatColor}" class="wechat-name">微信号:{{ we.name }}</view>
+            <view class="customer-btn dir-left-nowrap">
+                <view :style="[styleD]" @click="handlerSave">{{ saveTitle }}</view>
+                <view :style="[styleC]" @click="handleCopy">{{ copyTitle }}</view>
+            </view>
+        </view>
+        <view v-if="selectStyle === '2'" class="customer-box-two dir-left-nowrap cross-center" :style="[styleB]">
+            <image :src="twoIcon" class="box-grow-0"></image>
+            <view class="dir-top-nowrap">
+                <view :style="{color: titleColor}" class="title">{{ title }}</view>
+                <view :style="{color: subTitleColor}" class="sub-title">{{ subTitle }}</view>
+            </view>
+            <view class="customer-two-btn box-grow-0">
+                <view :style="[styleE]" @click="handleCopy">{{ twoTitle }}</view>
+            </view>
+        </view>
+    </view>
+</template>
+<script>
+export default {
+    name: 'app-customer',
+    props: {
+        bg: String,
+        bgPadding: [String, Number],
+
+        title: String,
+        titleColor: String,
+        wechat: Array,
+        wechatColor: String,
+
+        cBorderBottom: [String, Number],
+        cBorderTop: [String, Number],
+        cPaddingTop: [String, Number],
+        cPaddingLr: [String, Number],
+        cPaddingBottom: [String, Number],
+        copyBg: String,
+        copyBorder: String,
+        copyColor: String,
+        copyRadius: [String, Number],
+        copyTitle: String,
+        saveBg: String,
+        saveBorder: String,
+        saveColor: String,
+        saveRadius: [String, Number],
+        saveTitle: String,
+
+        twoIcon: String,
+        twoBg: String,
+        twoBorder: String,
+        twoColor: String,
+        twoRadius: [String, Number],
+        twoTitle: String,
+        subTitle: String,
+        subTitleColor: String,
+        selectStyle: [Number, String],
+    },
+    computed: {
+        we() {
+            let {wechat} = this;
+            if (wechat && wechat.length) {
+                return wechat[parseInt(Math.random() * wechat.length)];
+            } else {
+                return {
+                    qrcode: '',
+                    name: '',
+                }
+            }
+        },
+        styleA() {
+            let {
+                bgPadding,
+                cPaddingTop,
+                cPaddingLr,
+                cPaddingBottom,
+            } = this;
+            return {
+                backgroundColor: bgPadding,
+                padding: `${cPaddingTop}rpx ${cPaddingLr}rpx ${cPaddingBottom}rpx`
+            }
+        },
+        styleB() {
+            let {
+                bg,
+                cBorderTop,
+                cBorderBottom
+            } = this;
+            return {
+                backgroundColor: `${bg}`,
+                borderTopLeftRadius: `${cBorderTop}rpx`,
+                borderTopRightRadius: `${cBorderTop}rpx`,
+                borderBottomLeftRadius: `${cBorderBottom}rpx`,
+                borderBottomRightRadius: `${cBorderBottom}rpx`,
+            }
+        },
+        styleC() {
+            let {
+                copyBg,
+                copyBorder,
+                copyColor,
+                copyRadius,
+            } = this;
+            return {
+                backgroundColor: copyBg,
+                borderColor: copyBorder ? copyBorder : copyBg,
+                color: copyColor,
+                borderRadius: copyRadius + 'rpx',
+            }
+        },
+        styleD() {
+            let {
+                saveBg,
+                saveBorder,
+                saveColor,
+                saveRadius,
+            } = this;
+            return {
+                backgroundColor: saveBg,
+                borderColor: saveBorder ? saveBorder: saveBg,
+                color: saveColor,
+                borderRadius: saveRadius + 'rpx',
+            }
+        },
+        styleE() {
+            let {
+                twoBg,
+                twoBorder,
+                twoColor,
+                twoRadius,
+            } = this;
+            return {
+                backgroundColor: twoBg,
+                borderColor: twoBorder ? twoBorder : twoBg,
+                color: twoColor,
+                borderRadius: twoRadius + 'rpx',
+            }
+        },
+    },
+    methods: {
+        clickImg(src) {
+            // #ifdef MP
+            uni.previewImage({
+                current: 0,
+                urls: [src]
+            });
+            // #endif
+            // #ifdef H5
+            this.$jwx.previewImage({
+                current: src,
+                urls: [src]
+            });
+            // #endif
+        },
+        handleCopy() {
+            this.$utils.uniCopy({
+                data: this.we.name,
+                success: function () {
+                    uni.showToast({
+                        title: '复制成功',
+                        icon: 'none',
+                    })
+                }
+            });
+        },
+        handlerSave() {
+            this.$utils.batchSave(this.we.qrcode).then(() => {
+                uni.showToast({title: '保存成功'});
+            });
+        }
+    }
+}
+</script>
+
+<style scoped lang="scss">
+.app-customer {
+    .customer-box-two {
+        padding: #{20rpx};
+
+        .customer-two-btn {
+            margin-left: auto;
+            > view {
+                border-width: #{1upx};
+                border-style: solid;
+                font-size: #{28upx};
+                background: #ff4544;
+                color:#FFFFFF;
+                padding: #{14upx} #{28upx};
+            }
+        }
+        image {
+            height: #{100rpx};
+            width: #{100rpx};
+            display: block;
+            margin-right: #{20rpx};
+        }
+
+        .title {
+            font-size: #{28rpx};
+            color: #353535;
+        }
+
+        .sub-title {
+            margin-top: #{10rpx};
+            font-size: #{24rpx};
+            color: #999999;
+        }
+    }
+
+    .customer-box {
+        .title {
+            font-size: #{34upx};
+            color: #353535;
+            margin: #{32upx} 0;
+        }
+
+        image {
+            display: block;
+            height: #{360rpx};
+            width: #{360rpx};
+            margin-bottom: #{32rpx};
+        }
+
+        .wechat-name {
+            font-size: #{28upx};
+            color: #999999;
+            margin-bottom: #{24upx};
+        }
+    }
+
+    .customer-btn {
+        margin-bottom: #{32upx};
+        z-index: 1;
+        > view {
+            border-width: #{1upx};
+            border-style: solid;
+            font-size: #{24upx};
+            margin: 0 #{20upx};
+            padding: #{20upx} #{22upx};
+        }
+    }
+}
+</style>

+ 122 - 0
src/components/page-component/app-diy-form/app-diy-form-checkbox-group.vue

xqd
@@ -0,0 +1,122 @@
+<template>
+    <view class="app-diy-form-checkbox-group">
+        <view class="list dir-left-wrap">
+            <view v-for="(item, index) in model"
+                  :key="index"
+                  @click="handleClick(index)" class="out-of-item box-grow-0">
+                <view class="item text-ellipsis"
+                      :style="{color: color ? color: '#FF4544',
+                              borderColor: color ? color: '#FF4544',
+                              backgroundColor: item.value ? color: '#FFFFFF',
+                              }"
+                      :class="[
+                        `white-background`,
+                        item.value?`background`:``,
+                        ]">{{item.label}}
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+
+    export default {
+        name: 'app-diy-form-checkbox-group',
+        props: {
+            sign: {
+                default: null,
+            },
+            value: {
+                type: Array,
+                default: [],
+            },
+            list: {
+                type: Array,
+                default: [],
+            },
+            color: {
+                default: '#ff4544',
+            }
+        },
+        data() {
+            const model = this.list;
+            for (let i in model) {
+                let inArray = false;
+                for (let j in this.value) {
+                    if (model[i].label === this.value[j]) {
+                        inArray = true;
+                        break;
+                    }
+                }
+                if (inArray) {
+                    model[i].value = true;
+                }
+            }
+            return {
+                model: model,
+            };
+        },
+        methods: {
+            handleClick(index) {
+                this.model[index].value = !this.model[index].value;
+                this.outputData();
+            },
+            outputData() {
+                const value = [];
+                for (let i in this.model) {
+                    if (this.model[i].value === true) {
+                        value.push(this.model[i].label);
+                    }
+                }
+                this.$emit('change', value, this.sign);
+                this.$emit('input', value, this.sign);
+            },
+        },
+    }
+</script>
+
+<style scoped lang="scss">
+    .app-diy-form-checkbox-group {
+        width: 100%;
+        overflow-y: hidden;
+        //overflow-x: hidden;
+    }
+
+    .list {
+        //margin-bottom: #{-24rpx};
+        //margin: 0 -#{6rpx};
+    }
+
+    .out-of-item {
+        margin-bottom: #{12rpx};
+        margin-top: #{12rpx};
+        margin-right: #{10rpx};
+        display: inline-block;
+    }
+
+    .item {
+        //display: inline-block;
+        height: #{56rpx};
+        line-height: #{54rpx};
+        border: #{2rpx} solid;
+        padding: 0 #{24rpx};
+        border-radius: #{1000rpx};
+        font-size: $uni-font-size-general-one;
+    }
+    .background {
+        color: #ffffff !important;
+    }
+    .border {
+        border-color: #ff4544;
+    }
+    .color {
+        color: #ff4544;
+    }
+    .text-ellipsis{
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        max-width: #{420rpx};
+    }
+</style>

+ 861 - 0
src/components/page-component/app-diy-form/app-diy-form.vue

xqd
@@ -0,0 +1,861 @@
+<template>
+    <view class="app-diy-form" :style="{
+        paddingTop: `${marginTop}rpx`,
+        paddingBottom: `${marginBottom}rpx`,
+        backgroundColor: `${marginColor}`
+    }">
+        <view class="title" v-if="title !== '' && title !== null">{{title}}</view>
+        <!--<view style="border: 1rpx solid #ff3455">
+            <view v-for="(item, index) in myList" :key="index">{{item.name}}:{{item.value}}</view>
+        </view>-->
+        <view :style="{
+            backgroundColor: backgroundColor,
+            backgroundImage: backgroundImage ? `url(${backgroundImage})` : `none`,
+            backgroundPosition: backgroundPosition,
+            backgroundSize: `${backgroundWidth}% ${backgroundHeight}%`,
+            backgroundRepeat: backgroundRepeat,
+            paddingTop: `${paddingTop}rpx`,
+            paddingBottom: `${paddingBottom}rpx`,
+        }">
+            <view class="list"
+                  :class="[showItemBorder?'item-border':'', showAllItems?'show-all':'show-first',labelFs28?'label-fs-28':'']">
+                <template v-for="(item, index) in myList">
+
+                    <view :key="index" v-if="item.key=='text'"
+                          class="item"
+                          :class="[itemClass, index===0 ? `is-first-item` : ``,]"
+                          :style="{
+                      'padding': `0 ${itemPaddingX}rpx`,
+                      'margin-bottom': `${itemMarginY}rpx`,
+                      }">
+                        <view v-if="labelPosition !== 'inset'" class="box-grow-0 cross-top label">
+                            <image v-if="showRequiredIcon && (item.is_required == 1 || item.is_required == '1')"
+                                   class="required-icon"
+                                   src="https://shop.9026.com/web/statics/image/mall/static/icon/required.png"></image>
+                            <view class="name-key"
+                                  :class="[`text-align-${labelTextAlign}`]"
+                                  :style="{
+                                  'color': labelColor
+                                  }">{{item.name}}
+                            </view>
+                        </view>
+                        <view class="box-grow-1">
+                            <app-input v-model="item.value"
+                                       :default-value="item.value"
+                                       :background-color="inputBackground"
+                                       @input="textInput"
+                                       :color="inputTextColor"
+                                       :placeholder="labelPosition === 'inset' ? item.name:item.hint"
+                                       :height="`${itemHeight}`"
+                                       :border="showInputBorder"
+                                       :radius="inputRadius"
+                                       :placeholder-style="`color:${inputPlaceholderColor}`"
+                                       :padding-left="getInputPaddingLeft"
+                                       :border-color="inputBorderColor"></app-input>
+                        </view>
+                    </view>
+
+                    <view :key="index" v-if="item.key=='textarea'"
+                          class="item"
+                          :class="[itemClass, index===0 ? `is-first-item` : ``,]"
+                          :style="{
+                      'padding': `0 ${itemPaddingX}rpx`,
+                      'margin-bottom': `${itemMarginY}rpx`,
+                      }">
+                        <view v-if="labelPosition !== 'inset'" class="box-grow-0 cross-top label">
+                            <image v-if="showRequiredIcon && (item.is_required == 1 || item.is_required == '1')"
+                                   class="required-icon"
+                                   src="https://shop.9026.com/web/statics/image/mall/static/icon/required.png"></image>
+                            <view class="name-key"
+                                  :class="[`text-align-${labelTextAlign}`]"
+                                  :style="{
+                                  'color': labelColor
+                                  }">{{item.name}}
+                            </view>
+                        </view>
+                        <view class="box-grow-1">
+                            <app-textarea v-model="item.value"
+                                          :default-value="item.value"
+                                          :background="inputBackground"
+                                          @input="textInput"
+                                          :color="inputTextColor"
+                                          :placeholder="labelPosition === 'inset' ? item.name:item.hint"
+                                          :show-border="showInputBorder"
+                                          :border-radius="inputRadius"
+                                          :padding-x="getInputPaddingLeft"
+                                          :placeholder-style="[`color:${inputPlaceholderColor}`]"
+                                          :border-color="inputBorderColor"></app-textarea>
+                        </view>
+                    </view>
+
+                    <view :key="index" v-if="item.key=='date'"
+                          class="item"
+                          :class="[itemClass, index===0 ? `is-first-item` : ``,]"
+                          :style="{
+                      'padding': `0 ${itemPaddingX}rpx`,
+                      'margin-bottom': `${itemMarginY}rpx`,
+                      }">
+                        <view class="box-grow-0 cross-top label">
+                            <image v-if="showRequiredIcon && (item.is_required == 1 || item.is_required == '1')"
+                                   class="required-icon"
+                                   src="https://shop.9026.com/web/statics/image/mall/static/icon/required.png"></image>
+                            <view class="name-key"
+                                  :class="[`text-align-${labelTextAlign}`]"
+                                  :style="{
+                                  'color': labelColor
+                                  }">{{item.name}}
+                            </view>
+                        </view>
+                        <view class="box-grow-1">
+                            <app-datetime-picker v-model="item.value"
+                                                 @change="datetimeChange"
+                                                 :text="item.value||''"
+                                                 :sign="index"
+                                                 :show-border="showInputBorder"
+                                                 :background="inputBackground"
+                                                 :height="itemHeight"
+                                                 :radius="inputRadius"
+                                                 :default-value="item.default"
+                                                 :text-color="inputTextColor"
+                                                 :text-position="getDateTimeTextPosition"
+                                                 :border-color="inputBorderColor"
+                                                 :start="item.min ? item.min : ''"
+                                                 :padding="datePadding"
+                                                 :end="item.max ? item.max : ''">
+                                <!-- #ifdef MP-TOUTIAO -->
+                                {{item.value||''}}
+                                <!-- #endif -->
+                            </app-datetime-picker>
+                        </view>
+                    </view>
+
+                    <view :key="index" v-if="item.key=='time'"
+                          class="item"
+                          :class="[itemClass, index===0 ? `is-first-item` : ``,]"
+                          :style="{
+                      'padding': `0 ${itemPaddingX}rpx`,
+                      'margin-bottom': `${itemMarginY}rpx`,
+                      }">
+                        <view class="box-grow-0 cross-top label">
+                            <image v-if="showRequiredIcon && (item.is_required == 1 || item.is_required == '1')"
+                                   class="required-icon"
+                                   src="https://shop.9026.com/web/statics/image/mall/static/icon/required.png"></image>
+                            <view class="name-key"
+                                  :class="[`text-align-${labelTextAlign}`]"
+                                  :style="{
+                                  'color': labelColor
+                                  }">{{item.name}}
+                            </view>
+                        </view>
+                        <view class="box-grow-1">
+                            <app-datetime-picker v-model="item.value"
+                                                 @change="datetimeChange"
+                                                 mode="time"
+                                                 :text="item.value||''"
+                                                 :sign="index"
+                                                 :default-value="item.default"
+                                                 :show-border="showInputBorder"
+                                                 :background="inputBackground"
+                                                 :height="itemHeight"
+                                                 :radius="inputRadius"
+                                                 :text-color="inputTextColor"
+                                                 :text-position="getDateTimeTextPosition"
+                                                 :border-color="inputBorderColor"
+                                                 :start="item.min ? item.min : ''"
+                                                 :end="item.max ? item.max : ''">
+                                <!-- #ifdef MP-TOUTIAO -->
+                                {{item.value||''}}
+                                <!-- #endif -->
+                            </app-datetime-picker>
+                        </view>
+                    </view>
+
+                    <view :key="index" v-if="item.key=='radio'"
+                          class="item"
+                          :class="[itemClass, index===0 ? `is-first-item` : ``,]"
+                          :style="{
+                      'padding': `0 ${itemPaddingX}rpx`,
+                      'margin-bottom': `${itemMarginY}rpx`,
+                      }">
+                        <view class="box-grow-0 cross-top label">
+                            <image v-if="showRequiredIcon && (item.is_required == 1 || item.is_required == '1')"
+                                   class="required-icon"
+                                   src="https://shop.9026.com/web/statics/image/mall/static/icon/required.png"></image>
+                            <view class="name-key"
+                                  :class="[`text-align-${labelTextAlign}`]"
+                                  :style="{
+                                  'color': labelColor
+                                  }">{{item.name}}
+                            </view>
+                        </view>
+                        <view class="box-grow-1" :style="{
+                        padding: labelPosition === 'top' ? `0 0` : `0 12rpx`,
+                        }">
+                            <app-radio-group :list="item.list" v-model="item.value"
+                                             :color="selectBoxColor"
+                                             type="round"
+                                             :height="74"
+                                             @change="checkChange"></app-radio-group>
+                        </view>
+                    </view>
+
+                    <view :key="index" v-if="item.key=='checkbox'"
+                          class="item"
+                          :class="[itemClass, index===0 ? `is-first-item` : ``,]"
+                          :style="{
+                      'padding': `0 ${itemPaddingX}rpx`,
+                      'margin-bottom': `${itemMarginY}rpx`,
+                      }">
+                        <view class="box-grow-0 cross-top label">
+                            <image v-if="showRequiredIcon && (item.is_required == 1 || item.is_required == '1')"
+                                   class="required-icon"
+                                   src="https://shop.9026.com/web/statics/image/mall/static/icon/required.png"></image>
+                            <view class="name-key"
+                                  :class="[`text-align-${labelTextAlign}`]"
+                                  :style="{
+                                  'color': labelColor
+                                  }">{{item.name}}
+                            </view>
+                        </view>
+                        <view class="box-grow-1 dir-left-wrap" :style="{
+                        padding: labelPosition === 'top' ? `0 0` : `0 12rpx`,
+                        }">
+                            <app-diy-form-checkbox-group :list="item.list"
+                                                         v-model="item.value"
+                                                         :color="selectBoxColor"
+                                                         @change="checkChange"></app-diy-form-checkbox-group>
+                        </view>
+                    </view>
+
+                    <view :key="index" v-if="item.key=='img_upload'"
+                          class="item"
+                          :class="[itemClass, index===0 ? `is-first-item` : ``,]"
+                          :style="{
+                      'padding': `0 ${itemPaddingX}rpx`,
+                      'margin-bottom': `${itemMarginY}rpx`,
+                      }">
+                        <view class="box-grow-0 cross-top label">
+                            <image v-if="showRequiredIcon && (item.is_required == 1 || item.is_required == '1')"
+                                   class="required-icon"
+                                   src="https://shop.9026.com/web/statics/image/mall/static/icon/required.png"></image>
+                            <view class="name-key"
+                                  :class="[`text-align-${labelTextAlign}`]"
+                                  :style="{
+                                  'color': labelColor
+                                  }">{{item.name}}
+                            </view>
+                        </view>
+                        <view class="box-grow-1 dir-left-wrap" :style="{
+                        padding: labelPosition === 'top' ? `12rpx 0` : `12rpx 12rpx`,
+                        }">
+                            <!-- 普通图片 -->
+                            <template v-if="item.img_type == 1">
+                                <app-upload-image
+                                        :value="uploadShowImage(item)"
+                                        :max-num="item.num ? item.num:1"
+                                        @imageEvent="handleImageUpload"
+                                        :sign="`${index}`"
+                                        :show-number="false"
+                                ></app-upload-image>
+                            </template>
+
+                            <!-- 身份证,正反面 -->
+                            <template v-if="item.img_type == 2">
+                                <app-upload-image
+                                        :value="(item.value && item.value[0])?[item.value[0]]:null"
+                                        style="margin-right: 12rpx"
+                                        :max-num="1"
+                                        @imageEvent="handleUserIdFrontUpload"
+                                        :sign="`${index}`"
+                                        text="身份证正面"
+                                        :show-number="false"
+                                        default-img="https://shop.9026.com/web/statics/img/mall/static/user-id-card-front.png"></app-upload-image>
+                                <app-upload-image
+                                        :value="(item.value && item.value[1])?[item.value[1]]:null"
+                                        :max-num="1"
+                                        @imageEvent="handleUserIdBackUpload"
+                                        :sign="`${index}`"
+                                        text="身份证反面"
+                                        :show-number="false"
+                                        default-img="https://shop.9026.com/web/statics/img/mall/static/user-id-card-back.png"></app-upload-image>
+                            </template>
+
+                            <!-- 营业执照 -->
+                            <template v-if="item.img_type == 3">
+                                <app-upload-image
+                                        :value="item.value?[item.value]:null"
+                                        :max-num="1"
+                                        @imageEvent="handleImageUpload"
+                                        :sign="`${index}`"
+                                        text="营业执照"
+                                        :show-number="false"
+                                        default-img="https://shop.9026.com/web/statics/img/mall/static/company-license.png"></app-upload-image>
+                            </template>
+                        </view>
+                    </view>
+
+                </template>
+            </view>
+
+            <view class="main-center cross-center scroll-bar" v-if="showScrollBtn"
+                  @click="showAllItems = !showAllItems">
+                <view class="cross-center">点击{{showAllItems?'收起':'展开'}}</view>
+                <view class="cross-center">
+                    <image v-if="showAllItems" src="https://shop.9026.com/web/statics/image/mall/static/icon/icon-up.png"
+                           style="width: 18rpx;height: 10rpx;"></image>
+                    <image v-else src="https://shop.9026.com/web/statics/image/mall/static/icon/icon-down.png"
+                           style="width: 18rpx;height: 10rpx;"></image>
+                </view>
+            </view>
+
+            <view v-if="showSubmit" class="submit" :style="{
+                'padding': `${submitBtnMargin}rpx ${submitBtnPadding}rpx 24rpx`,
+                }">
+                <app-form-id @click="submit">
+                    <view class="submit-button" :style="{
+                'background-color': submitBtnBackground,
+                'border-color': submitBtnBorderColor,
+                'color': submitBtnTextColor,
+                'border-radius': `${submitBtnRadius}rpx`,
+                'height': `${submitBtnHeight}rpx`,
+                'line-height': `${submitBtnHeight-2}rpx`,
+                }">{{submitBtnText}}
+                    </view>
+                </app-form-id>
+            </view>
+
+        </view>
+
+    </view>
+</template>
+
+<script>
+    import AppDatetimePicker from '../../basic-component/app-datetime-picker/app-datetime-picker.vue';
+    import AppRadio from "../../basic-component/app-radio/app-radio";
+    import AppRadioGroup from "../../basic-component/app-radio/app-radio-group";
+    import AppDiyFormCheckboxGroup from "./app-diy-form-checkbox-group";
+    import AppUploadImage from "../../basic-component/app-upload-image/app-upload-image";
+    import AppTextarea from "../../basic-component/app-textarea/app-textarea";
+
+    export default {
+        name: 'app-diy-form',
+        components: {AppTextarea, AppUploadImage, AppDiyFormCheckboxGroup, AppRadioGroup, AppRadio, AppDatetimePicker},
+        props: {
+            sign: {
+                default: null,
+            },
+            datePadding: {
+                type: String,
+                default: '0 24rpx',
+            },
+            title: {
+                type: String,
+                default: null,
+            },
+            backgroundColor: {
+                default: '#ffffff',
+            },
+            backgroundImage: {
+                default: null,
+            },
+            backgroundPosition: {
+                default: 'center',
+            },
+            backgroundWidth: {
+                default: 100,
+            },
+            backgroundHeight: {
+                default: 100,
+            },
+            backgroundRepeat: {
+                default: 'no-repeat',
+            },
+            marginTop: {
+                default: 0,
+            },
+            marginBottom: {
+                default: 0,
+            },
+            paddingTop: {
+                default: 0,
+            },
+            paddingBottom: {
+                default: 0,
+            },
+            list: {
+                type: Array,
+                default: [],
+            },
+            showRequiredIcon: {
+                type: Boolean,
+                default: false,
+            },
+            itemPaddingX: {
+                default: 24,
+            },
+            itemMarginY: {
+                default: 0,
+            },
+            itemHeight: {
+                type: Number,
+                default: 88,
+            },
+            showItemBorder: {
+                default: true,
+            },
+            labelPosition: {
+                default: 'left',
+            },
+            labelColor: {
+                default: '#666666',
+            },
+            labelTextAlign: {
+                default: 'right',
+            },
+            showInputBorder: {
+                type: Boolean,
+                default: false,
+            },
+            inputBackground: {
+                default: '#ffffff',
+            },
+            inputBorderColor: {
+                default: '#c0c4cc',
+            },
+            inputTextColor: {
+                default: '#666666',
+            },
+            inputPlaceholderColor: {
+                default: '#bbbbbb',
+            },
+            inputRadius: {
+                default: 0,
+            },
+
+            showSubmit: {
+                type: Boolean,
+                default: false,
+            },
+            submitUrl: {
+                type: String,
+                default: null,
+            },
+            submitBtnText: {
+                default: '提交',
+            },
+            submitBtnHeight: {
+                default: 80,
+            },
+            submitBtnPadding: {
+                default: 24,
+            },
+            submitBtnMargin: {
+                default: 40,
+            },
+            submitBtnRadius: {
+                default: 40,
+            },
+            submitBtnBackground: {
+                default: '#ff4544',
+            },
+            submitBtnBorderColor: {
+                default: '#ff4544',
+            },
+            submitBtnTextColor: {
+                default: '#ffffff',
+            },
+            showScrollBtn: {
+                default: false,
+            },
+            labelFs28: {
+                default: false,
+            },
+            marginColor: {
+                default: '#ffffff',
+            },
+            selectBoxColor: {
+                default: '#ff4544',
+            },
+        },
+        data() {
+            const newList = [];
+            for (let i in this.list) {
+                const item = this.list[i];
+                // if (typeof item.default === 'undefined') {
+                //     item.default = null;
+                // }
+                if (typeof item.default === 'undefined' || item.default === null || item.default === '') {
+                    if (item.key === 'text' || item.key === 'textarea' || item.key === 'time' || item.key === 'date') {
+                        item.default = '';
+                    }
+                    if (item.key === 'radio' || item.key === 'checkbox') {
+                        item.default = [];
+                    }
+                }
+                if (typeof item.value === 'undefined' || item.value === null || item.value === '') {
+                    item.value = item.default;
+                }
+                item.hint = item.hint || '';
+                if (item.key === 'radio' || item.key === 'checkbox') {
+                    if (!item.list) item.list = [];
+                    for (let j in item.list) {
+                        if (!item.list[j].value || item.list[j].value === false || item.list[j].value === 'false') {
+                            item.list[j].value = false;
+                        } else {
+                            item.list[j].value = true;
+                        }
+                    }
+                }
+                if (item.key === 'img_upload' && (item.img_type === 2 || item.img_type === '2') && !item.value) {
+                    item.value = ['', ''];
+                }
+                if(item.key == 'text') {
+                }
+                newList[i] = item;
+            }
+            return {
+                myList: newList,
+                randomString: '',
+                validateResult: {
+                    hasError: false,
+                    errors: [],
+                },
+                showAllItems: true, //默认展开全部
+            };
+        },
+        computed: {
+            uploadShowImage() {
+                return function (item) {
+                    if (Array.isArray(item.value)) {
+                        return item.value;
+                    }
+                    if (item.value) {
+                        return [item.value];
+                    }
+                    return null;
+                }
+            },
+            itemClass() {
+                if (this.labelPosition === 'left') {
+                    return 'label-left dir-left-nowrap cross-top';
+                }
+                if (this.labelPosition === 'inset') {
+                    return 'label-inset dir-left-nowrap cross-top';
+                }
+                if (this.labelPosition === 'top') {
+                    return 'label-top';
+                }
+            },
+            getDateTimeTextPosition() {
+                if (this.labelPosition === 'top') {
+                    return 'left';
+                }
+                return 'right';
+            },
+            getInputPaddingLeft() {
+                if (this.labelPosition === 'top') {
+                    if (this.showInputBorder) {
+                        return 24;
+                    } else {
+                        return 0;
+                    }
+                }
+                return 24;
+            },
+        },
+        created() {
+            this.validate();
+            this.outputData();
+        },
+        methods: {
+            textInput() {
+                this.outputData();
+                // #ifdef H5
+                this.$forceUpdate()
+                // #endif
+            },
+            datetimeChange() {
+                this.outputData();
+                // #ifdef H5
+                this.$forceUpdate()
+                // #endif
+            },
+            checkChange() {
+                setTimeout(() => {
+                    this.outputData();
+                }, 10);
+            },
+            handleImageUpload({sign, imageList}) {
+                const index = parseInt(sign);
+                if (imageList.length === 1) {
+                    this.myList[index].value = imageList[0];
+                } else if (imageList.length > 0) {
+                    this.myList[index].value = imageList;
+                } else {
+                    this.myList[index].value = '';
+                }
+                this.outputData();
+            },
+            handleUserIdFrontUpload({sign, imageList}) {
+                const index = parseInt(sign);
+                if (imageList.length > 0) {
+                    this.myList[index].value[0] = imageList[0];
+                } else {
+                    this.myList[index].value[0] = '';
+                }
+                this.outputData();
+            },
+            handleUserIdBackUpload({sign, imageList}) {
+                const index = parseInt(sign);
+                if (imageList.length > 0) {
+                    this.myList[index].value[1] = imageList[0];
+                } else {
+                    this.myList[index].value[1] = '';
+                }
+                this.outputData();
+            },
+            validate() {
+                this.validateResult = {
+                    hasError: false,
+                    errors: [],
+                };
+                for (let i in this.myList) {
+                    const item = this.myList[i];
+                    if (item.is_required === 1 || item.is_required === '1') {
+                        if ((typeof item.value === 'undefined'
+                            || item.value === null
+                            || item.value === ''
+                            || ['radio', 'checkbox'].indexOf(item.key) !== -1 && !item.value.length)
+                        ) {
+                            this.validateResult.hasError = true;
+                            this.validateResult.errors.push({
+                                index: i,
+                                msg: `"${item.name}"不能为空。`,
+                            });
+                            continue;
+                        }
+                        if (item.img_type && parseInt(item.img_type) === 2) {
+                            if (!item.value || !item.value.length) {
+                                this.validateResult.hasError = true;
+                                this.validateResult.errors.push({
+                                    index: i,
+                                    msg: `"${item.name}"不能为空。`,
+                                });
+                                continue;
+                            }
+                            let imgErr = false;
+                            for (let j in item.value) {
+                                if (item.value[j] === null || item.value[j] === '') {
+                                    imgErr = true;
+                                    break;
+                                }
+                            }
+                            if (imgErr) {
+                                this.validateResult.hasError = true;
+                                this.validateResult.errors.push({
+                                    index: i,
+                                    msg: `"${item.name}"不能为空。`,
+                                });
+                                continue;
+                            }
+                        }
+                    }
+                }
+                this.$emit('validate',{
+                    result: this.validateResult,
+                    sign: this.sign
+                });
+            },
+            outputData() {
+                this.validate();
+                for (let i in this.myList) {
+                    this.myList[i].label = this.myList[i].name;
+                    this.myList[i].required = this.myList[i].is_required;
+                }
+                this.$emit('input',{
+                    data: this.myList,
+                    sign: this.sign
+                });
+                // #ifdef MP-TOUTIAO
+                setTimeout(() => {
+                    this.randomString = this.$utils.randomString(32);
+                }, 1);
+                // #endif
+            },
+            submit() {
+                this.outputData();
+                if (this.validateResult.hasError && this.validateResult.errors) {
+                    uni.showModal({
+                        title: '提示',
+                        content: this.validateResult.errors[0].msg,
+                        showCancel: false,
+                    });
+                    return;
+                }
+                uni.showLoading({
+                    mask: true,
+                    title: '正在提交...',
+                });
+                this.$request({
+                    url: this.submitUrl ? this.submitUrl : this.$api.diy.page_store,
+                    method: 'post',
+                    data: {
+                        form_data: JSON.stringify(this.myList),
+                    },
+                }).then(response => {
+                    uni.hideLoading();
+                    if (response.code === 0) {
+                        setTimeout(() => {
+                            let copyList = this.myList;
+                            for (let i in copyList) {
+                                copyList[i].value = copyList[i].default;
+                            }
+                            this.myList = [];
+                            setTimeout(() => {
+                                this.myList = copyList;
+                            }, 0);
+                        }, 300);
+                        uni.showModal({
+                            title: '提示',
+                            content: response.msg || '提交成功',
+                            showCancel: false,
+                        });
+                    } else {
+                        uni.showModal({
+                            title: '提示',
+                            content: response.msg || '提交失败',
+                            showCancel: false,
+                        });
+                    }
+                }).catch(() => {
+                    uni.hideLoading();
+                });
+            },
+        },
+    }
+</script>
+
+<style scoped lang="scss">
+    .name-key {
+        width: 100%;
+        text-align: right;
+        font-size: #{32rpx};
+        color: #353535
+    }
+
+    .name-key.text-align-left {
+        text-align: left;
+    }
+
+    .name-key.text-align-right {
+        text-align: right;
+    }
+
+    .title {
+        padding: #{24rpx};
+        color: #999;
+        font-size: #{26rpx};
+    }
+
+    .arrow {
+        width: #{12rpx};
+        height: #{22rpx};
+    }
+
+    .scroll-bar {
+        border-top: #{1rpx} solid $uni-weak-color-one;
+        height: #{72rpx};
+        color: $uni-general-color-two;
+
+        image {
+            margin-left: #{16rpx};
+        }
+    }
+
+    .list {
+        .item {
+            height: 0 !important;
+            overflow: hidden;
+
+            .label {
+                min-width: #{125rpx};
+                padding: #{24rpx} #{12rpx} #{12rpx} 0;
+                height: 100%;
+                position: relative;
+            }
+
+            .required-icon {
+                width: #{15rpx};
+                height: #{15rpx};
+                display: inline-block;
+                position: absolute;
+                left: #{-14rpx};
+                top: #{23rpx};
+            }
+        }
+
+        .item.is-first-item {
+            height: auto !important;
+            overflow: auto;
+        }
+
+        .item.label-left {
+            .name-key {
+                max-width: #{200rpx};
+            }
+        }
+
+        .item.label-top {
+            .name-key {
+                text-align: left;
+            }
+
+            .label {
+                padding: #{20rpx} #{12rpx} #{8rpx} 0;
+            }
+        }
+
+        .item:last-child {
+            margin-bottom: 0 !important;
+        }
+    }
+
+    .show-all {
+        .item {
+            height: auto !important;
+            overflow: auto;
+        }
+    }
+
+    .show-first {
+        .item {
+            margin-bottom: 0 !important;
+            border: none !important;
+        }
+    }
+
+    .item-border {
+        .item {
+            border-bottom: #{2rpx} solid $uni-weak-color-one;
+        }
+
+        .item:last-child {
+            border-bottom: none;
+        }
+    }
+
+    .submit-button {
+        text-align: center;
+        border: #{1rpx} solid;
+    }
+
+    .submit-button:active {
+        box-shadow: inset 0 0 #{1000rpx} rgba(0, 0, 0, .15);
+    }
+
+    .label-fs-28 {
+        .name-key {
+            font-size: #{28rpx};
+        }
+    }
+</style>

+ 209 - 0
src/components/page-component/app-diy-goods-list/app-diy-composition-image.vue

xqd
@@ -0,0 +1,209 @@
+<template>
+    <view class="app-diy-composition-image">
+        <view class="goods-one dir-left-wrap" :class="imageClass">
+            <block v-for="(item,key) in imageList" :key="key">
+                <image :mode="mode" :src="item"></image>
+            </block>
+        </view>
+    </view>
+</template>
+
+<script>
+    export default {
+        name: "app-diy-composition-image",
+        props: {
+            imageList: Array,
+            mode: String,
+        },
+        computed: {
+            imageClass() {
+                let count = this.imageList.length;
+                switch (count) {
+                    case 1:
+                        return 'goods-one';
+                    case 2:
+                        return 'goods-two';
+                    case 3:
+                        return 'goods-three';
+                    case 4:
+                        return 'goods-four';
+                    case 5:
+                        return 'goods-five';
+                }
+            },
+        },
+    }
+</script>
+
+<style scoped lang="scss">
+
+    .app-diy-composition-image {
+        height: 100%;
+        width: 100%;
+        position: relative;
+        overflow: hidden;
+
+        .plugin-text-class {
+            position: absolute;
+            z-index: 11;
+        }
+
+        .plugin-image-class {
+            position: absolute;
+            z-index: 10;
+
+            image {
+                height: 100%;
+                width: 100%;
+            }
+        }
+
+        image {
+            display: block;
+        }
+
+        .goods-one {
+            height: 100%;
+            width: 100%;
+
+            image {
+                height: 100%;
+                width: 100%;
+
+            }
+        }
+
+        .goods-two {
+            height: 100%;
+            width: 100%;
+
+            image:nth-child(1) {
+                position: absolute;
+                top: 0;
+                left: 0;
+                height: 100%;
+                width: 48.8%;
+            }
+
+            image:nth-child(2) {
+                position: absolute;
+                top: 0;
+                right: 0;
+                height: 100%;
+                width: 48.8%;
+            }
+        }
+
+        .goods-three {
+            height: 100%;
+            width: 100%;
+
+            image:nth-child(1) {
+                position: absolute;
+                top: 0;
+                left: 0;
+                height: 100%;
+                width: 48.8%;
+            }
+
+            image:nth-child(2) {
+                position: absolute;
+                top: 0;
+                right: 0;
+                height: 48.8%;
+                width: 48.8%;
+            }
+
+            image:nth-child(3) {
+                position: absolute;
+                bottom: 0;
+                right: 0;
+                height: 48.8%;
+                width: 48.8%;
+            }
+        }
+
+        .goods-four {
+            height: 100%;
+            width: 100%;
+
+            image:nth-child(1) {
+                position: absolute;
+                top: 0;
+                left: 0;
+                height: 100%;
+                width: 48.8%;
+            }
+
+            image:nth-child(2) {
+                position: absolute;
+                top: 0;
+                right: 0;
+                height: 48.8%;
+                width: 48.8%;
+            }
+
+            image:nth-child(3) {
+                position: absolute;
+                bottom: 0;
+                left: calc(50% + 4rpx);
+                height: 48.8%;
+                width: calc(24.4% - 4rpx);
+            }
+
+            image:nth-child(4) {
+                position: absolute;
+                bottom: 0;
+                right: 0;
+                height: 48.8%;
+                width: calc(24.4% - 4rpx);
+            }
+        }
+
+        .goods-five {
+            height: 100%;
+            width: 100%;
+            position: relative;
+
+            image:nth-child(1) {
+                position: absolute;
+                top: 0;
+                left: 0;
+                height: 100%;
+                width: 48.8%;
+            }
+
+            image:nth-child(2) {
+                position: absolute;
+                top: 0;
+                left: calc(50% + 4rpx);
+                height: 48.8%;
+                width: calc(24.4% - 4rpx);
+            }
+
+            image:nth-child(3) {
+                position: absolute;
+                top: 0;
+                right: 0;
+                height: 48.8%;
+                width: calc(24.4% - 4rpx);
+            }
+
+            image:nth-child(4) {
+                position: absolute;
+                bottom: 0;
+                left: calc(50% + 4rpx);
+                height: 48.8%;
+                width: calc(24.4% - 4rpx);
+            }
+
+            image:nth-child(5) {
+                position: absolute;
+                bottom: 0;
+                right: 0;
+                height: 48.8%;
+                width: calc(24.4% - 4rpx);
+            }
+        }
+    }
+</style>

Some files were not shown because too many files changed in this diff