Your Name 1 month ago
commit
c808fa9f50
100 changed files with 48945 additions and 0 deletions
  1. 5 0
      .env.development
  2. 1 0
      .env.mock
  3. 1 0
      .env.production
  4. 36 0
      .eslintrc.js
  5. 21 0
      .gitignore
  6. 36 0
      README.en.md
  7. 39 0
      README.md
  8. 12 0
      babel.config.js
  9. 11838 0
      package-lock.json
  10. 68 0
      package.json
  11. 0 0
      public/area.json
  12. 3 0
      public/domain.js
  13. BIN
      public/favicon.ico
  14. 12235 0
      public/geojson.json
  15. 32 0
      public/index.html
  16. 264 0
      public/reset.css
  17. 170 0
      public/resetui.css
  18. 37 0
      src/App.vue
  19. 77 0
      src/assets/js/directives.js
  20. 257 0
      src/assets/js/filters.js
  21. 21 0
      src/assets/js/loadBMap.js
  22. 5 0
      src/assets/js/map.js
  23. 23 0
      src/assets/js/public.js
  24. 32 0
      src/assets/js/reg.js
  25. 196 0
      src/assets/js/utils.js
  26. 272 0
      src/assets/main.styl
  27. 257 0
      src/assets/mobile.styl
  28. 332 0
      src/assets/public.styl
  29. 175 0
      src/components/common/InputItem.vue
  30. 117 0
      src/components/common/NumberControl.vue
  31. 339 0
      src/components/common/amap.vue
  32. 409 0
      src/components/common/category.vue
  33. 161 0
      src/components/common/deliveryMode.vue
  34. 51 0
      src/components/common/dialogItem.vue
  35. 134 0
      src/components/common/header.vue
  36. 158 0
      src/components/common/imgUpLoader.vue
  37. 142 0
      src/components/common/navTop.vue
  38. 173 0
      src/components/common/singleImg.vue
  39. 69 0
      src/components/common/upImg.vue
  40. 208 0
      src/components/common/wang-edit.vue
  41. 18 0
      src/components/common/whatever2excel.js
  42. 699 0
      src/components/goods/goodsAttr.vue
  43. 711 0
      src/components/goods/goodsAttr2.vue
  44. 97 0
      src/components/goods/goodsClass.vue
  45. 276 0
      src/components/goods/goodsExt.vue
  46. 139 0
      src/components/goods/goodsFreight.vue
  47. 163 0
      src/components/goods/imgUpLoader.vue
  48. 163 0
      src/components/goods/imgUpLoader1.vue
  49. 102 0
      src/components/goods/selectIcon.vue
  50. 97 0
      src/components/goods/singleImg.vue
  51. 246 0
      src/components/goods/upImgDetail.vue
  52. 166 0
      src/components/goods/uploadFile.vue
  53. 115 0
      src/config.js
  54. 56 0
      src/main.js
  55. 255 0
      src/request/action.js
  56. 258 0
      src/request/api.js
  57. 34 0
      src/request/request.js
  58. 11 0
      src/router/modules/Base.js
  59. 17 0
      src/router/modules/Business.js
  60. 103 0
      src/router/modules/Fund.js
  61. 53 0
      src/router/modules/Goods.js
  62. 76 0
      src/router/modules/Mall.js
  63. 31 0
      src/router/modules/Order.js
  64. 67 0
      src/router/modules/UserManage.js
  65. 34 0
      src/router/router.js
  66. 41 0
      src/store/modules/common.js
  67. 66 0
      src/store/modules/login.js
  68. 19 0
      src/store/store.js
  69. 16 0
      src/view/Error.vue
  70. 390 0
      src/view/Index.vue
  71. 421 0
      src/view/Login.vue
  72. 450 0
      src/view/Main.vue
  73. 384 0
      src/view/base/operation-log.vue
  74. 799 0
      src/view/business/apply-detail.vue
  75. 697 0
      src/view/business/business-apply.vue
  76. 432 0
      src/view/business/business-type.vue
  77. 384 0
      src/view/fund/add-pay.vue
  78. 458 0
      src/view/fund/balance-examine.vue
  79. 461 0
      src/view/fund/balance-list.vue
  80. 588 0
      src/view/fund/balance-record.vue
  81. 310 0
      src/view/fund/financial-reconciliation.vue
  82. 461 0
      src/view/fund/gold-list.vue
  83. 435 0
      src/view/fund/hq-record.vue
  84. 407 0
      src/view/fund/hz-record.vue
  85. 461 0
      src/view/fund/integral-list.vue
  86. 161 0
      src/view/fund/message-detail.vue
  87. 395 0
      src/view/fund/message-publish.vue
  88. 273 0
      src/view/fund/pay-record.vue
  89. 613 0
      src/view/fund/profit-sharing-record.vue
  90. 427 0
      src/view/fund/reward-inquiry.vue
  91. 423 0
      src/view/fund/team.vue
  92. 814 0
      src/view/fund/withdraw.vue
  93. 435 0
      src/view/fund/wx-charge.vue
  94. 405 0
      src/view/goods/business.vue
  95. 624 0
      src/view/goods/freight.vue
  96. 822 0
      src/view/goods/good.vue
  97. 926 0
      src/view/goods/good2.vue
  98. 915 0
      src/view/goods/goods-category.vue
  99. 731 0
      src/view/goods/goods-manage.vue
  100. 908 0
      src/view/goods/goods-manage2.vue

+ 5 - 0
.env.development

@@ -0,0 +1,5 @@
+NODE_ENV = 'development'
+
+# development模式下 不使用懒加载import()加快构建调试速度 
+# Detail:  https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 1 - 0
.env.mock

@@ -0,0 +1 @@
+NODE_ENV = 'mock'

+ 1 - 0
.env.production

@@ -0,0 +1 @@
+NODE_ENV = 'production'

+ 36 - 0
.eslintrc.js

@@ -0,0 +1,36 @@
+// https://eslint.org/docs/user-guide/configuring
+
+module.exports = {
+    root: true,
+    parserOptions: {
+        parser: 'babel-eslint'
+    },
+    env: {
+        browser: true,
+    },
+    extends: [
+        // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
+        // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
+        'plugin:vue/essential',
+        // https://github.com/standard/standard/blob/master/docs/RULES-en.md
+        'standard'
+    ],
+    // required to lint *.vue files
+    plugins: [
+        'vue'
+    ],
+    // add your custom rules here
+    rules: {
+        // allow async-await
+        'generator-star-spacing': 'off',
+        // allow debugger during development
+        'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
+        // 可空行
+        'indent': 0,
+        // 句尾加;
+        'semi': ["error", "always"],
+        // data()之间不空格
+        'space-before-function-paren': 0,
+        'camelcase': [1, {"properties": "never"}]
+    }
+};

+ 21 - 0
.gitignore

@@ -0,0 +1,21 @@
+.DS_Store
+node_modules
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw*

+ 36 - 0
README.en.md

@@ -0,0 +1,36 @@
+# lananxx-web
+
+#### Description
+蓝桉喜喜后台管理pc
+
+#### Software Architecture
+Software architecture description
+
+#### Installation
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### Instructions
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### Contribution
+
+1. Fork the repository
+2. Create Feat_xxx branch
+3. Commit your code
+4. Create Pull Request
+
+
+#### Gitee Feature
+
+1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
+2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
+3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
+4. The most valuable open source project [GVP](https://gitee.com/gvp)
+5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
+6. The most popular members  [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 39 - 0
README.md

@@ -0,0 +1,39 @@
+# lananxx-web
+
+#### 介绍
+
+蓝桉喜喜后台管理 pc
+
+#### 软件架构
+
+软件架构说明
+
+asdas
+
+#### 安装教程
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### 使用说明
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### 参与贡献
+
+1. Fork 本仓库
+2. 新建 Feat_xxx 分支
+3. 提交代码
+4. 新建 Pull Request
+
+#### 码云特技
+
+1. 使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md
+2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com)
+3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目
+4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目
+5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
+6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 12 - 0
babel.config.js

@@ -0,0 +1,12 @@
+module.exports = {
+  presets: [
+    '@vue/app'
+  ],
+  plugins: [
+    ['import', {
+      libraryName: 'vant',
+      libraryDirectory: 'es',
+      style: true
+    }, 'vant']
+  ]
+}

+ 11838 - 0
package-lock.json

@@ -0,0 +1,11838 @@
+{
+  "name": "undefined-manage",
+  "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.3.3",
+      "resolved": "http://registry.npm.taobao.org/@babel/core/download/@babel/core-7.3.3.tgz",
+      "integrity": "sha1-0JDRV7fFBg0FoFrK68BIvSsDeUc=",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "@babel/generator": "^7.3.3",
+        "@babel/helpers": "^7.2.0",
+        "@babel/parser": "^7.3.3",
+        "@babel/template": "^7.2.2",
+        "@babel/traverse": "^7.2.2",
+        "@babel/types": "^7.3.3",
+        "convert-source-map": "^1.1.0",
+        "debug": "^4.1.0",
+        "json5": "^2.1.0",
+        "lodash": "^4.17.11",
+        "resolve": "^1.3.2",
+        "semver": "^5.4.1",
+        "source-map": "^0.5.0"
+      }
+    },
+    "@babel/generator": {
+      "version": "7.3.3",
+      "resolved": "http://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.3.3.tgz",
+      "integrity": "sha1-GFlireWaUuAMor38/R1Y5SjU454=",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.3.3",
+        "jsesc": "^2.5.1",
+        "lodash": "^4.17.11",
+        "source-map": "^0.5.0",
+        "trim-right": "^1.0.1"
+      }
+    },
+    "@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.1.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-call-delegate/download/@babel/helper-call-delegate-7.1.0.tgz",
+      "integrity": "sha1-apV/EF83dV6GRTQ9MDiiLhRJzEo=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-hoist-variables": "^7.0.0",
+        "@babel/traverse": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@babel/helper-create-class-features-plugin": {
+      "version": "7.3.2",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.3.2.tgz",
+      "integrity": "sha1-uhaFYD6xyfL1HJEG1RgBNcFj/nM=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.1.0",
+        "@babel/helper-member-expression-to-functions": "^7.0.0",
+        "@babel/helper-optimise-call-expression": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-replace-supers": "^7.2.3"
+      }
+    },
+    "@babel/helper-define-map": {
+      "version": "7.1.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-define-map/download/@babel/helper-define-map-7.1.0.tgz",
+      "integrity": "sha1-O3TK7DKbPIDBFikIh8DdmuRowgw=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.1.0",
+        "@babel/types": "^7.0.0",
+        "lodash": "^4.17.10"
+      }
+    },
+    "@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.0.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.0.0.tgz",
+      "integrity": "sha1-Rq3ExedYZFrnpF3rkrqwkYwju4g=",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@babel/helper-member-expression-to-functions": {
+      "version": "7.0.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.0.0.tgz",
+      "integrity": "sha1-jNFLCg33/wDwCefXpDaUX0fHoW8=",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.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.2.2",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.2.2.tgz",
+      "integrity": "sha1-qy+OjSMUCfg3DIg9IMM1GQKEuWM=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/helper-simple-access": "^7.1.0",
+        "@babel/helper-split-export-declaration": "^7.0.0",
+        "@babel/template": "^7.2.2",
+        "@babel/types": "^7.2.2",
+        "lodash": "^4.17.10"
+      }
+    },
+    "@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.0.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-regex/download/@babel/helper-regex-7.0.0.tgz",
+      "integrity": "sha1-LBcYkjtX+bvmRwX/5WQKxk2b2yc=",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.10"
+      }
+    },
+    "@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.2.3",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.2.3.tgz",
+      "integrity": "sha1-GZcAIM8iZ31is6aJVh29lkTYxeU=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-member-expression-to-functions": "^7.0.0",
+        "@babel/helper-optimise-call-expression": "^7.0.0",
+        "@babel/traverse": "^7.2.3",
+        "@babel/types": "^7.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.0.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.0.0.tgz",
+      "integrity": "sha1-Oq4oXAMRwqsJXZl7jJqUytVH2BM=",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@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.3.1",
+      "resolved": "http://registry.npm.taobao.org/@babel/helpers/download/@babel/helpers-7.3.1.tgz",
+      "integrity": "sha1-lJ7snqS0XTIQ/rfcHCLbZkyeRLk=",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.1.2",
+        "@babel/traverse": "^7.1.5",
+        "@babel/types": "^7.3.0"
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.0.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.0.0.tgz",
+      "integrity": "sha1-9xDDjI1Fjm3ZogGvtjf8t4HOmeQ=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.0",
+        "esutils": "^2.0.2",
+        "js-tokens": "^4.0.0"
+      }
+    },
+    "@babel/parser": {
+      "version": "7.3.3",
+      "resolved": "http://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.3.3.tgz",
+      "integrity": "sha1-CS1FDbAr22zLHKj/1H2HdKka74c=",
+      "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.3.3",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.3.3.tgz",
+      "integrity": "sha1-5p7hFKg0pnEpOs4AFwjMFoLtY/k=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.3.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-proposal-decorators": {
+      "version": "7.3.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-proposal-decorators/download/@babel/plugin-proposal-decorators-7.3.0.tgz",
+      "integrity": "sha1-Y3ugdfp4Cx910IGG6PtDV9A6cqc=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.3.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.3.2",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.3.2.tgz",
+      "integrity": "sha1-bRhZiC1Nd4V45B+CzF1789Xa9sE=",
+      "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.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.2.0.tgz",
+      "integrity": "sha1-q+coH+Rsld3BQ6ZeU1hkd5IDlSA=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-regex": "^7.0.0",
+        "regexpu-core": "^4.2.0"
+      }
+    },
+    "@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.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.2.0.tgz",
+      "integrity": "sha1-aLikOGY+iFGeZbd2+JOPNEWxov8=",
+      "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.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.2.0.tgz",
+      "integrity": "sha1-8XxJ2R7tvN9d1QWX0W9fL3cBMtQ=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "lodash": "^4.17.10"
+      }
+    },
+    "@babel/plugin-transform-classes": {
+      "version": "7.3.3",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.3.3.tgz",
+      "integrity": "sha1-oFMtaInFNNCV6PYE6SV/kThsS1E=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.0.0",
+        "@babel/helper-define-map": "^7.1.0",
+        "@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.1.0",
+        "@babel/helper-split-export-declaration": "^7.0.0",
+        "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.3.2",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.3.2.tgz",
+      "integrity": "sha1-8vVSC+BVuhw4xBwOCU2KRh3Xjy0=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-dotall-regex": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.2.0.tgz",
+      "integrity": "sha1-8Kq7k9EgqKxh6SXqC6RAgS2+Dkk=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-regex": "^7.0.0",
+        "regexpu-core": "^4.1.3"
+      }
+    },
+    "@babel/plugin-transform-duplicate-keys": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.2.0.tgz",
+      "integrity": "sha1-2VLEkw8xKk2//xjwspFOYMNVMLM=",
+      "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.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.2.0.tgz",
+      "integrity": "sha1-q3RovvqA92S7A9PLXu+MyZjhytk=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-function-name": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.2.0.tgz",
+      "integrity": "sha1-95MDYoKf+ZoxdMOfCvzAJO9Zcxo=",
+      "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.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.2.0.tgz",
+      "integrity": "sha1-gqm85FuVRB9heiQBHcidEtp/TuY=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.1.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-modules-commonjs": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.2.0.tgz",
+      "integrity": "sha1-xPGTP1mR1RRenPrR39hI6hcn9AQ=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.1.0",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-simple-access": "^7.1.0"
+      }
+    },
+    "@babel/plugin-transform-modules-systemjs": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.2.0.tgz",
+      "integrity": "sha1-kSv+nl/5gpJMgdCTfJLSSZS7kGg=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-hoist-variables": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.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.3.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.3.0.tgz",
+      "integrity": "sha1-FAtSmFstbvDLCS7zspUCuZD5zVA=",
+      "dev": true,
+      "requires": {
+        "regexp-tree": "^0.1.0"
+      }
+    },
+    "@babel/plugin-transform-new-target": {
+      "version": "7.0.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.0.0.tgz",
+      "integrity": "sha1-ro+9iVF/p4ktIOZWTmQeh3DDqko=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-object-super": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.2.0.tgz",
+      "integrity": "sha1-s11MEPVrq11lAEfa0PHY6IFLZZg=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-replace-supers": "^7.1.0"
+      }
+    },
+    "@babel/plugin-transform-parameters": {
+      "version": "7.3.3",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.3.3.tgz",
+      "integrity": "sha1-Ooc+BxFOGlvuF9BIFWYsgxfxDjA=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-call-delegate": "^7.1.0",
+        "@babel/helper-get-function-arity": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-regenerator": {
+      "version": "7.0.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.0.0.tgz",
+      "integrity": "sha1-W0Foa07UC++HTX7WqEvdhJwT4ME=",
+      "dev": true,
+      "requires": {
+        "regenerator-transform": "^0.13.3"
+      }
+    },
+    "@babel/plugin-transform-runtime": {
+      "version": "7.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-runtime/download/@babel/plugin-transform-runtime-7.2.0.tgz",
+      "integrity": "sha1-VmvEP30K7ciA6t29KRaNDySJZuo=",
+      "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.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.2.0.tgz",
+      "integrity": "sha1-2H7QG46qx6kkc/YIyXwIneK6Hls=",
+      "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.2.0",
+      "resolved": "http://registry.npm.taobao.org/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.2.0.tgz",
+      "integrity": "sha1-TrjbFvly+Ku1BiwWG4sRVUat4Is=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-regex": "^7.0.0",
+        "regexpu-core": "^4.1.3"
+      }
+    },
+    "@babel/preset-env": {
+      "version": "7.3.1",
+      "resolved": "http://registry.npm.taobao.org/@babel/preset-env/download/@babel/preset-env-7.3.1.tgz",
+      "integrity": "sha1-OJ6MprF65nqvmiERZlAwvpI1Fds=",
+      "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.1",
+        "@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.2.0",
+        "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
+        "@babel/plugin-transform-block-scoping": "^7.2.0",
+        "@babel/plugin-transform-classes": "^7.2.0",
+        "@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.2.0",
+        "@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.0.0",
+        "@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.3.1",
+      "resolved": "http://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.3.1.tgz",
+      "integrity": "sha1-V0sD6OipiY6vSocqkuogt4Rvbyo=",
+      "requires": {
+        "regenerator-runtime": "^0.12.0"
+      }
+    },
+    "@babel/runtime-corejs2": {
+      "version": "7.3.1",
+      "resolved": "http://registry.npm.taobao.org/@babel/runtime-corejs2/download/@babel/runtime-corejs2-7.3.1.tgz",
+      "integrity": "sha1-DBEyQuIyj5Z01CcDqJvubr6+moI=",
+      "dev": true,
+      "requires": {
+        "core-js": "^2.5.7",
+        "regenerator-runtime": "^0.12.0"
+      }
+    },
+    "@babel/template": {
+      "version": "7.2.2",
+      "resolved": "http://registry.npm.taobao.org/@babel/template/download/@babel/template-7.2.2.tgz",
+      "integrity": "sha1-AFs/3w7ZbogEEzA3ng2ppwjrKQc=",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "@babel/parser": "^7.2.2",
+        "@babel/types": "^7.2.2"
+      }
+    },
+    "@babel/traverse": {
+      "version": "7.2.3",
+      "resolved": "http://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.2.3.tgz",
+      "integrity": "sha1-f/UM76nHwL0tgSMf2sEi85V3SNg=",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "@babel/generator": "^7.2.2",
+        "@babel/helper-function-name": "^7.1.0",
+        "@babel/helper-split-export-declaration": "^7.0.0",
+        "@babel/parser": "^7.2.3",
+        "@babel/types": "^7.2.2",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0",
+        "lodash": "^4.17.10"
+      }
+    },
+    "@babel/types": {
+      "version": "7.3.3",
+      "resolved": "http://registry.npm.taobao.org/@babel/types/download/@babel/types-7.3.3.tgz",
+      "integrity": "sha1-bETRzawqdiW2JCFmV9W8bBB6tDY=",
+      "dev": true,
+      "requires": {
+        "esutils": "^2.0.2",
+        "lodash": "^4.17.11",
+        "to-fast-properties": "^2.0.0"
+      }
+    },
+    "@intervolga/optimize-cssnano-plugin": {
+      "version": "1.0.6",
+      "resolved": "http://registry.npm.taobao.org/@intervolga/optimize-cssnano-plugin/download/@intervolga/optimize-cssnano-plugin-1.0.6.tgz",
+      "integrity": "sha1-vnx4RhKLiPapsdEmGgrQbrXA/fg=",
+      "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": "http://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz",
+      "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=",
+      "dev": true,
+      "requires": {
+        "call-me-maybe": "^1.0.1",
+        "glob-to-regexp": "^0.3.0"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "1.1.3",
+      "resolved": "http://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz",
+      "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=",
+      "dev": true
+    },
+    "@popperjs/core": {
+      "version": "2.9.2",
+      "resolved": "https://registry.npm.taobao.org/@popperjs/core/download/@popperjs/core-2.9.2.tgz?cache=0&sync_timestamp=1617290324040&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40popperjs%2Fcore%2Fdownload%2F%40popperjs%2Fcore-2.9.2.tgz",
+      "integrity": "sha1-rep7aVPLs0ZRdmsFSEaOdDxqI1M="
+    },
+    "@soda/friendly-errors-webpack-plugin": {
+      "version": "1.7.1",
+      "resolved": "http://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.7.1.tgz",
+      "integrity": "sha1-cG9kvLSouWQrSK46zkRMcDNNYV0=",
+      "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": "http://registry.npm.taobao.org/ansi-styles/download/ansi-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": "http://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": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "@types/q": {
+      "version": "1.5.1",
+      "resolved": "http://registry.npm.taobao.org/@types/q/download/@types/q-1.5.1.tgz",
+      "integrity": "sha1-SP2YwVYf5xi2FzPa7Ub/EVtJbhg=",
+      "dev": true
+    },
+    "@vant/icons": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npm.taobao.org/@vant/icons/download/@vant/icons-1.5.2.tgz?cache=0&sync_timestamp=1613997821784&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vant%2Ficons%2Fdownload%2F%40vant%2Ficons-1.5.2.tgz",
+      "integrity": "sha1-Pz6jU6DqzTjBE3V70xg2SJ+ssQs="
+    },
+    "@vant/popperjs": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npm.taobao.org/@vant/popperjs/download/@vant/popperjs-1.1.0.tgz",
+      "integrity": "sha1-tO3uW7+m+xhwWYbjE9T9XxeUKg8=",
+      "requires": {
+        "@popperjs/core": "^2.9.2"
+      }
+    },
+    "@vue/babel-helper-vue-jsx-merge-props": {
+      "version": "1.0.0-beta.2",
+      "resolved": "http://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.0.0-beta.2.tgz",
+      "integrity": "sha1-8+INd7id23pLm3p1Ny8FzTrCLZI=",
+      "dev": true
+    },
+    "@vue/babel-plugin-transform-vue-jsx": {
+      "version": "1.0.0-beta.2",
+      "resolved": "http://registry.npm.taobao.org/@vue/babel-plugin-transform-vue-jsx/download/@vue/babel-plugin-transform-vue-jsx-1.0.0-beta.2.tgz",
+      "integrity": "sha1-b3kD/majSgIWP0GMQmz0Gehi2X4=",
+      "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-beta.2",
+        "html-tags": "^2.0.0",
+        "lodash.kebabcase": "^4.1.1",
+        "svg-tags": "^1.0.0"
+      }
+    },
+    "@vue/babel-preset-app": {
+      "version": "3.4.0",
+      "resolved": "http://registry.npm.taobao.org/@vue/babel-preset-app/download/@vue/babel-preset-app-3.4.0.tgz",
+      "integrity": "sha1-kmxxgGa6vAEX7nDOv4kNOqqBK/o=",
+      "dev": true,
+      "requires": {
+        "@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.0.0",
+        "@babel/preset-env": "^7.0.0",
+        "@babel/runtime": "^7.0.0",
+        "@babel/runtime-corejs2": "^7.2.0",
+        "@vue/babel-preset-jsx": "^1.0.0-beta.2",
+        "babel-plugin-dynamic-import-node": "^2.2.0",
+        "core-js": "^2.6.3"
+      }
+    },
+    "@vue/babel-preset-jsx": {
+      "version": "1.0.0-beta.2",
+      "resolved": "http://registry.npm.taobao.org/@vue/babel-preset-jsx/download/@vue/babel-preset-jsx-1.0.0-beta.2.tgz",
+      "integrity": "sha1-Pl3Ctz2lg5HBxzJ8K9LvFU/k5G4=",
+      "dev": true,
+      "requires": {
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0-beta.2",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.0.0-beta.2",
+        "@vue/babel-sugar-functional-vue": "^1.0.0-beta.2",
+        "@vue/babel-sugar-inject-h": "^1.0.0-beta.2",
+        "@vue/babel-sugar-v-model": "^1.0.0-beta.2",
+        "@vue/babel-sugar-v-on": "^1.0.0-beta.2"
+      }
+    },
+    "@vue/babel-sugar-functional-vue": {
+      "version": "1.0.0-beta.2",
+      "resolved": "http://registry.npm.taobao.org/@vue/babel-sugar-functional-vue/download/@vue/babel-sugar-functional-vue-1.0.0-beta.2.tgz",
+      "integrity": "sha1-iDH2hudhTygtUXC5Akg+9Tje7zg=",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0"
+      }
+    },
+    "@vue/babel-sugar-inject-h": {
+      "version": "1.0.0-beta.2",
+      "resolved": "http://registry.npm.taobao.org/@vue/babel-sugar-inject-h/download/@vue/babel-sugar-inject-h-1.0.0-beta.2.tgz",
+      "integrity": "sha1-X5L5lL9LQSb62GM/VU6KQmtRtBM=",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0"
+      }
+    },
+    "@vue/babel-sugar-v-model": {
+      "version": "1.0.0-beta.2",
+      "resolved": "http://registry.npm.taobao.org/@vue/babel-sugar-v-model/download/@vue/babel-sugar-v-model-1.0.0-beta.2.tgz",
+      "integrity": "sha1-BR064+9ecNUU4JBY7FeQ9qQujCg=",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0",
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0-beta.2",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.0.0-beta.2",
+        "camelcase": "^5.0.0",
+        "html-tags": "^2.0.0",
+        "svg-tags": "^1.0.0"
+      }
+    },
+    "@vue/babel-sugar-v-on": {
+      "version": "1.0.0-beta.2",
+      "resolved": "http://registry.npm.taobao.org/@vue/babel-sugar-v-on/download/@vue/babel-sugar-v-on-1.0.0-beta.2.tgz",
+      "integrity": "sha1-Pi0SLiKbEAF/CR0Xg0a2AdkkUmA=",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.0.0-beta.2",
+        "camelcase": "^5.0.0"
+      }
+    },
+    "@vue/cli-overlay": {
+      "version": "3.4.0",
+      "resolved": "http://registry.npm.taobao.org/@vue/cli-overlay/download/@vue/cli-overlay-3.4.0.tgz",
+      "integrity": "sha1-f+fPQerLrx8Vee/K2T4jtl1Fgds=",
+      "dev": true
+    },
+    "@vue/cli-plugin-babel": {
+      "version": "3.4.0",
+      "resolved": "http://registry.npm.taobao.org/@vue/cli-plugin-babel/download/@vue/cli-plugin-babel-3.4.0.tgz",
+      "integrity": "sha1-1ueWeZX4YLlCBL37F5APrdSuotk=",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.0.0",
+        "@vue/babel-preset-app": "^3.4.0",
+        "@vue/cli-shared-utils": "^3.4.0",
+        "babel-loader": "^8.0.5",
+        "webpack": ">=4 < 4.29"
+      }
+    },
+    "@vue/cli-plugin-eslint": {
+      "version": "3.4.0",
+      "resolved": "http://registry.npm.taobao.org/@vue/cli-plugin-eslint/download/@vue/cli-plugin-eslint-3.4.0.tgz",
+      "integrity": "sha1-6fzv+HNmGEi+fhNBsx2tIzAs0Kw=",
+      "dev": true,
+      "requires": {
+        "@vue/cli-shared-utils": "^3.4.0",
+        "babel-eslint": "^10.0.1",
+        "eslint": "^4.19.1",
+        "eslint-loader": "^2.1.1",
+        "eslint-plugin-vue": "^4.7.1",
+        "globby": "^9.0.0",
+        "webpack": ">=4 < 4.29"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "^4.6.0",
+            "fast-deep-equal": "^1.0.0",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.3.0"
+          }
+        },
+        "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
+        },
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz",
+          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "eslint": {
+          "version": "4.19.1",
+          "resolved": "http://registry.npm.taobao.org/eslint/download/eslint-4.19.1.tgz",
+          "integrity": "sha1-MtHWU+HZBAiFS/spbwdux+GGowA=",
+          "dev": true,
+          "requires": {
+            "ajv": "^5.3.0",
+            "babel-code-frame": "^6.22.0",
+            "chalk": "^2.1.0",
+            "concat-stream": "^1.6.0",
+            "cross-spawn": "^5.1.0",
+            "debug": "^3.1.0",
+            "doctrine": "^2.1.0",
+            "eslint-scope": "^3.7.1",
+            "eslint-visitor-keys": "^1.0.0",
+            "espree": "^3.5.4",
+            "esquery": "^1.0.0",
+            "esutils": "^2.0.2",
+            "file-entry-cache": "^2.0.0",
+            "functional-red-black-tree": "^1.0.1",
+            "glob": "^7.1.2",
+            "globals": "^11.0.1",
+            "ignore": "^3.3.3",
+            "imurmurhash": "^0.1.4",
+            "inquirer": "^3.0.6",
+            "is-resolvable": "^1.0.0",
+            "js-yaml": "^3.9.1",
+            "json-stable-stringify-without-jsonify": "^1.0.1",
+            "levn": "^0.3.0",
+            "lodash": "^4.17.4",
+            "minimatch": "^3.0.2",
+            "mkdirp": "^0.5.1",
+            "natural-compare": "^1.4.0",
+            "optionator": "^0.8.2",
+            "path-is-inside": "^1.0.2",
+            "pluralize": "^7.0.0",
+            "progress": "^2.0.0",
+            "regexpp": "^1.0.1",
+            "require-uncached": "^1.0.3",
+            "semver": "^5.3.0",
+            "strip-ansi": "^4.0.0",
+            "strip-json-comments": "~2.0.1",
+            "table": "4.0.2",
+            "text-table": "~0.2.0"
+          }
+        },
+        "eslint-plugin-vue": {
+          "version": "4.7.1",
+          "resolved": "http://registry.npm.taobao.org/eslint-plugin-vue/download/eslint-plugin-vue-4.7.1.tgz",
+          "integrity": "sha1-yCm5/GJYLBiXtaC5Sv1E7MpRHmM=",
+          "dev": true,
+          "requires": {
+            "vue-eslint-parser": "^2.0.3"
+          }
+        },
+        "eslint-scope": {
+          "version": "3.7.3",
+          "resolved": "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-3.7.3.tgz",
+          "integrity": "sha1-u1ByANPRf2AkdjYWC0gmKEsQhTU=",
+          "dev": true,
+          "requires": {
+            "esrecurse": "^4.1.0",
+            "estraverse": "^4.1.1"
+          }
+        },
+        "fast-deep-equal": {
+          "version": "1.1.0",
+          "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.1.0.tgz",
+          "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+          "dev": true
+        },
+        "json-schema-traverse": {
+          "version": "0.3.1",
+          "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz",
+          "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+          "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"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz",
+          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+          "dev": true
+        }
+      }
+    },
+    "@vue/cli-service": {
+      "version": "3.4.0",
+      "resolved": "http://registry.npm.taobao.org/@vue/cli-service/download/@vue/cli-service-3.4.0.tgz",
+      "integrity": "sha1-0hYO5M+d6NxOnXgMzWHMFYYvKVA=",
+      "dev": true,
+      "requires": {
+        "@intervolga/optimize-cssnano-plugin": "^1.0.5",
+        "@soda/friendly-errors-webpack-plugin": "^1.7.1",
+        "@vue/cli-overlay": "^3.4.0",
+        "@vue/cli-shared-utils": "^3.4.0",
+        "@vue/component-compiler-utils": "^2.5.2",
+        "@vue/preload-webpack-plugin": "^1.1.0",
+        "@vue/web-component-wrapper": "^1.2.0",
+        "acorn": "^6.0.6",
+        "acorn-walk": "^6.1.1",
+        "address": "^1.0.3",
+        "autoprefixer": "^9.4.7",
+        "cache-loader": "^2.0.1",
+        "case-sensitive-paths-webpack-plugin": "^2.2.0",
+        "chalk": "^2.4.2",
+        "clipboardy": "^1.2.3",
+        "cliui": "^4.1.0",
+        "copy-webpack-plugin": "^4.6.0",
+        "css-loader": "^1.0.1",
+        "cssnano": "^4.1.8",
+        "debug": "^4.1.1",
+        "escape-string-regexp": "^1.0.5",
+        "file-loader": "^3.0.1",
+        "fs-extra": "^7.0.1",
+        "globby": "^9.0.0",
+        "hash-sum": "^1.0.2",
+        "html-webpack-plugin": "^3.2.0",
+        "launch-editor-middleware": "^2.2.1",
+        "lodash.defaultsdeep": "^4.6.0",
+        "lodash.mapvalues": "^4.6.0",
+        "lodash.transform": "^4.6.0",
+        "mini-css-extract-plugin": "^0.5.0",
+        "minimist": "^1.2.0",
+        "ora": "^3.0.0",
+        "portfinder": "^1.0.20",
+        "postcss-loader": "^3.0.0",
+        "read-pkg": "^4.0.1",
+        "semver": "^5.6.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.1",
+        "thread-loader": "^2.1.2",
+        "url-loader": "^1.1.2",
+        "vue-loader": "^15.6.2",
+        "webpack": ">=4 < 4.29",
+        "webpack-bundle-analyzer": "^3.0.3",
+        "webpack-chain": "^4.11.0",
+        "webpack-dev-server": "^3.1.14",
+        "webpack-merge": "^4.2.1",
+        "yorkie": "^2.0.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "6.1.0",
+          "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-6.1.0.tgz",
+          "integrity": "sha1-sKO+MXUsl6D3ATxfSQO3GgXbaBg=",
+          "dev": true
+        }
+      }
+    },
+    "@vue/cli-shared-utils": {
+      "version": "3.4.0",
+      "resolved": "http://registry.npm.taobao.org/@vue/cli-shared-utils/download/@vue/cli-shared-utils-3.4.0.tgz",
+      "integrity": "sha1-QzHLkmNR45m/cwWpMGvwnQ8qG50=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "execa": "^1.0.0",
+        "joi": "^14.3.0",
+        "launch-editor": "^2.2.1",
+        "lru-cache": "^5.1.1",
+        "node-ipc": "^9.1.1",
+        "opn": "^5.3.0",
+        "ora": "^3.0.0",
+        "request": "^2.87.0",
+        "request-promise-native": "^1.0.5",
+        "semver": "^5.5.0",
+        "string.prototype.padstart": "^3.0.0"
+      }
+    },
+    "@vue/component-compiler-utils": {
+      "version": "2.5.2",
+      "resolved": "http://registry.npm.taobao.org/@vue/component-compiler-utils/download/@vue/component-compiler-utils-2.5.2.tgz",
+      "integrity": "sha1-qNV+dzNUqxDkdCx9ao3YYYTU174=",
+      "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.8.2"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "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
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz",
+          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+          "dev": true
+        }
+      }
+    },
+    "@vue/preload-webpack-plugin": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/@vue/preload-webpack-plugin/download/@vue/preload-webpack-plugin-1.1.0.tgz",
+      "integrity": "sha1-12jboAQmHAKbU6d8XqLV+e5PPM4=",
+      "dev": true
+    },
+    "@vue/web-component-wrapper": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/@vue/web-component-wrapper/download/@vue/web-component-wrapper-1.2.0.tgz",
+      "integrity": "sha1-uw5G8VhafiibTuYGfcxaauYvHdE=",
+      "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
+    },
+    "accepts": {
+      "version": "1.3.5",
+      "resolved": "http://registry.npm.taobao.org/accepts/download/accepts-1.3.5.tgz",
+      "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+      "dev": true,
+      "requires": {
+        "mime-types": "~2.1.18",
+        "negotiator": "0.6.1"
+      }
+    },
+    "acorn": {
+      "version": "5.7.3",
+      "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-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-jsx": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-3.0.1.tgz",
+      "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+      "dev": true,
+      "requires": {
+        "acorn": "^3.0.4"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "3.3.0",
+          "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-3.3.0.tgz",
+          "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+          "dev": true
+        }
+      }
+    },
+    "acorn-walk": {
+      "version": "6.1.1",
+      "resolved": "http://registry.npm.taobao.org/acorn-walk/download/acorn-walk-6.1.1.tgz",
+      "integrity": "sha1-02O2b1+sXwGP+cOh57b44xDMORM=",
+      "dev": true
+    },
+    "address": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.taobao.org/address/download/address-1.0.3.tgz",
+      "integrity": "sha1-tfUGMfjWzsi9IMljljr7VeBsvOk=",
+      "dev": true
+    },
+    "adler-32": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/adler-32/download/adler-32-1.2.0.tgz",
+      "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=",
+      "requires": {
+        "exit-on-epipe": "~1.0.1",
+        "printj": "~1.1.0"
+      }
+    },
+    "ajv": {
+      "version": "6.9.1",
+      "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-6.9.1.tgz",
+      "integrity": "sha1-pNNoPXSrxWcOdfCxZSD3CiDqjcE=",
+      "dev": true,
+      "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.0",
+      "resolved": "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.4.0.tgz",
+      "integrity": "sha1-S4Mee1MUFafMUYzUBOc/YZPGNJ0=",
+      "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": "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz",
+      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+      "dev": true
+    },
+    "ansi-colors": {
+      "version": "3.2.3",
+      "resolved": "http://registry.npm.taobao.org/ansi-colors/download/ansi-colors-3.2.3.tgz",
+      "integrity": "sha1-V9NbhoboUeLMBMQD8cACA5dqGBM=",
+      "dev": true
+    },
+    "ansi-escapes": {
+      "version": "3.2.0",
+      "resolved": "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.2.0.tgz",
+      "integrity": "sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s=",
+      "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.0.0",
+      "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.0.0.tgz",
+      "integrity": "sha1-cN55Ht8CFATD/WFaqJEYrgQy5ak=",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz",
+      "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "anymatch": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/anymatch/download/anymatch-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": "http://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz",
+      "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=",
+      "dev": true
+    },
+    "arch": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.taobao.org/arch/download/arch-2.1.1.tgz",
+      "integrity": "sha1-j1wnMao1owkpIhuwZA7tZRdeyE4=",
+      "dev": true
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "http://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz",
+      "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=",
+      "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-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": "http://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": "http://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=",
+      "dev": true,
+      "requires": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "asn1.js": {
+      "version": "4.10.1",
+      "resolved": "http://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.4.1",
+      "resolved": "http://registry.npm.taobao.org/assert/download/assert-1.4.1.tgz",
+      "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+      "dev": true,
+      "requires": {
+        "util": "0.10.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+          "dev": true
+        },
+        "util": {
+          "version": "0.10.3",
+          "resolved": "http://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=",
+      "dev": true
+    },
+    "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
+    },
+    "astral-regex": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/astral-regex/download/astral-regex-1.0.0.tgz",
+      "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=",
+      "dev": true
+    },
+    "async": {
+      "version": "1.5.2",
+      "resolved": "http://registry.npm.taobao.org/async/download/async-1.5.2.tgz",
+      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+      "dev": true
+    },
+    "async-each": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/async-each/download/async-each-1.0.1.tgz",
+      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+      "dev": true
+    },
+    "async-limiter": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.0.tgz",
+      "integrity": "sha1-ePrtjD0HSrgfIrTphdeehzj3IPg=",
+      "dev": true
+    },
+    "async-validator": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
+      "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
+      "requires": {
+        "babel-runtime": "6.x"
+      }
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+      "dev": true
+    },
+    "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.4.7",
+      "resolved": "http://registry.npm.taobao.org/autoprefixer/download/autoprefixer-9.4.7.tgz",
+      "integrity": "sha1-+ZeZT5qBDq5Hs4+m2KEZdyBRxP8=",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.4.1",
+        "caniuse-lite": "^1.0.30000932",
+        "normalize-range": "^0.1.2",
+        "num2fraction": "^1.2.2",
+        "postcss": "^7.0.14",
+        "postcss-value-parser": "^3.3.1"
+      }
+    },
+    "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=",
+      "dev": true
+    },
+    "aws4": {
+      "version": "1.8.0",
+      "resolved": "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz",
+      "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=",
+      "dev": true
+    },
+    "axios": {
+      "version": "0.18.0",
+      "resolved": "http://registry.npm.taobao.org/axios/download/axios-0.18.0.tgz",
+      "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
+      "requires": {
+        "follow-redirects": "^1.3.0",
+        "is-buffer": "^1.1.5"
+      }
+    },
+    "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": "http://registry.npm.taobao.org/ansi-styles/download/ansi-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": "http://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": "http://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": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "babel-eslint": {
+      "version": "10.0.1",
+      "resolved": "http://registry.npm.taobao.org/babel-eslint/download/babel-eslint-10.0.1.tgz",
+      "integrity": "sha1-kZaB3AmWFM19MdRciQhpUJKh+u0=",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "@babel/parser": "^7.0.0",
+        "@babel/traverse": "^7.0.0",
+        "@babel/types": "^7.0.0",
+        "eslint-scope": "3.7.1",
+        "eslint-visitor-keys": "^1.0.0"
+      },
+      "dependencies": {
+        "eslint-scope": {
+          "version": "3.7.1",
+          "resolved": "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-3.7.1.tgz",
+          "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+          "dev": true,
+          "requires": {
+            "esrecurse": "^4.1.0",
+            "estraverse": "^4.1.1"
+          }
+        }
+      }
+    },
+    "babel-helper-vue-jsx-merge-props": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
+      "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
+    },
+    "babel-loader": {
+      "version": "8.0.5",
+      "resolved": "http://registry.npm.taobao.org/babel-loader/download/babel-loader-8.0.5.tgz",
+      "integrity": "sha1-IlMi11CcIVdlWEC7pS5GtsLy/jM=",
+      "dev": true,
+      "requires": {
+        "find-cache-dir": "^2.0.0",
+        "loader-utils": "^1.0.2",
+        "mkdirp": "^0.5.1",
+        "util.promisify": "^1.0.0"
+      }
+    },
+    "babel-plugin-dynamic-import-node": {
+      "version": "2.2.0",
+      "resolved": "http://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.2.0.tgz",
+      "integrity": "sha1-wK37B9lfSkSV6aqsbsOGxNfCUk4=",
+      "dev": true,
+      "requires": {
+        "object.assign": "^4.1.0"
+      }
+    },
+    "babel-plugin-import": {
+      "version": "1.13.3",
+      "resolved": "https://registry.npm.taobao.org/babel-plugin-import/download/babel-plugin-import-1.13.3.tgz",
+      "integrity": "sha1-nbu6fRrHK9QSkXqDDUReAJQdJtc=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/runtime": "^7.0.0"
+      }
+    },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "http://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz",
+      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+      "requires": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.11.1",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+          "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+        }
+      }
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+    },
+    "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.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.2.0.tgz",
+      "integrity": "sha1-S5RPrAGRqlkHr+LYyZnMxXzoD0U="
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "benchmark": {
+      "version": "2.1.4",
+      "resolved": "http://registry.npm.taobao.org/benchmark/download/benchmark-2.1.4.tgz",
+      "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=",
+      "requires": {
+        "lodash": "^4.17.4",
+        "platform": "^1.3.3"
+      }
+    },
+    "bfj": {
+      "version": "6.1.1",
+      "resolved": "http://registry.npm.taobao.org/bfj/download/bfj-6.1.1.tgz",
+      "integrity": "sha1-BaO3eE+9cs+jwi5WAC75kzZRbEg=",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.1",
+        "check-types": "^7.3.0",
+        "hoopy": "^0.1.2",
+        "tryer": "^1.0.0"
+      }
+    },
+    "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.0",
+      "resolved": "http://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.0.tgz",
+      "integrity": "sha1-lSPgATBqMkRLkHQj8d4hZCIvarE=",
+      "dev": true
+    },
+    "bluebird": {
+      "version": "3.5.3",
+      "resolved": "http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.3.tgz",
+      "integrity": "sha1-fQHG+WFsmlGrD4xUmnnf5uwz76c=",
+      "dev": true
+    },
+    "bn.js": {
+      "version": "4.11.8",
+      "resolved": "http://registry.npm.taobao.org/bn.js/download/bn.js-4.11.8.tgz",
+      "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=",
+      "dev": true
+    },
+    "body-parser": {
+      "version": "1.18.3",
+      "resolved": "http://registry.npm.taobao.org/body-parser/download/body-parser-1.18.3.tgz",
+      "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
+      "dev": true,
+      "requires": {
+        "bytes": "3.0.0",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "http-errors": "~1.6.3",
+        "iconv-lite": "0.4.23",
+        "on-finished": "~2.3.0",
+        "qs": "6.5.2",
+        "raw-body": "2.3.3",
+        "type-is": "~1.6.16"
+      },
+      "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"
+          }
+        },
+        "iconv-lite": {
+          "version": "0.4.23",
+          "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.23.tgz",
+          "integrity": "sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM=",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "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": "http://registry.npm.taobao.org/array-flatten/download/array-flatten-2.1.2.tgz",
+          "integrity": "sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk=",
+          "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=",
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "2.3.2",
+      "resolved": "http://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.4.1",
+      "resolved": "http://registry.npm.taobao.org/browserslist/download/browserslist-4.4.1.tgz",
+      "integrity": "sha1-QugolUtrKaelPjUid75ClHimkGI=",
+      "dev": true,
+      "requires": {
+        "caniuse-lite": "^1.0.30000929",
+        "electron-to-chromium": "^1.3.103",
+        "node-releases": "^1.1.3"
+      }
+    },
+    "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": "http://registry.npm.taobao.org/buffer-indexof/download/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=",
+      "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.0.0",
+      "resolved": "http://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz",
+      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+      "dev": true
+    },
+    "cacache": {
+      "version": "11.3.2",
+      "resolved": "http://registry.npm.taobao.org/cacache/download/cacache-11.3.2.tgz",
+      "integrity": "sha1-LYHjCOPSWMo4Eltna5iyrJzmm/o=",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.3",
+        "chownr": "^1.1.1",
+        "figgy-pudding": "^3.5.1",
+        "glob": "^7.1.3",
+        "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.2",
+        "ssri": "^6.0.1",
+        "unique-filename": "^1.1.1",
+        "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": "http://registry.npm.taobao.org/cache-loader/download/cache-loader-2.0.1.tgz",
+      "integrity": "sha1-V1j0GmLXwjlB48PHAW5vrrA6ywc=",
+      "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": "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"
+          }
+        }
+      }
+    },
+    "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": "http://registry.npm.taobao.org/caller-callsite/download/caller-callsite-2.0.0.tgz",
+      "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
+      "dev": true,
+      "requires": {
+        "callsites": "^2.0.0"
+      },
+      "dependencies": {
+        "callsites": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/callsites/download/callsites-2.0.0.tgz",
+          "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
+          "dev": true
+        }
+      }
+    },
+    "caller-path": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.taobao.org/caller-path/download/caller-path-0.1.0.tgz",
+      "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+      "dev": true,
+      "requires": {
+        "callsites": "^0.2.0"
+      }
+    },
+    "callsites": {
+      "version": "0.2.0",
+      "resolved": "http://registry.npm.taobao.org/callsites/download/callsites-0.2.0.tgz",
+      "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+      "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.0.0",
+      "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-5.0.0.tgz",
+      "integrity": "sha1-AylVJ9WL081Kp1Nj81sujZe+L0I=",
+      "dev": true
+    },
+    "caniuse-api": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/caniuse-api/download/caniuse-api-3.0.0.tgz",
+      "integrity": "sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA=",
+      "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.30000938",
+      "resolved": "http://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000938.tgz",
+      "integrity": "sha1-tkvxQnQ430AYP86RD+JONP7aej8=",
+      "dev": true
+    },
+    "case-sensitive-paths-webpack-plugin": {
+      "version": "2.2.0",
+      "resolved": "http://registry.npm.taobao.org/case-sensitive-paths-webpack-plugin/download/case-sensitive-paths-webpack-plugin-2.2.0.tgz",
+      "integrity": "sha1-M3HvY2XvnCX6S4HBas4OnH3FjD4=",
+      "dev": true
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+      "dev": true
+    },
+    "cfb": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/cfb/download/cfb-1.1.0.tgz",
+      "integrity": "sha1-RPsbMO7gFPpWM6DtXybIf9dleZo=",
+      "requires": {
+        "adler-32": "~1.2.0",
+        "commander": "^2.16.0",
+        "crc-32": "~1.2.0",
+        "printj": "~1.1.2"
+      }
+    },
+    "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"
+      }
+    },
+    "chardet": {
+      "version": "0.4.2",
+      "resolved": "http://registry.npm.taobao.org/chardet/download/chardet-0.4.2.tgz",
+      "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+      "dev": true
+    },
+    "check-types": {
+      "version": "7.4.0",
+      "resolved": "http://registry.npm.taobao.org/check-types/download/check-types-7.4.0.tgz",
+      "integrity": "sha1-A3jsG5YW7HH3dJMaPGUW+tjBUvQ=",
+      "dev": true
+    },
+    "chokidar": {
+      "version": "2.1.2",
+      "resolved": "http://registry.npm.taobao.org/chokidar/download/chokidar-2.1.2.tgz",
+      "integrity": "sha1-nCPqQLAWOEOeBROGTTYq6sxa0Fg=",
+      "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.0"
+      }
+    },
+    "chownr": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/chownr/download/chownr-1.1.1.tgz",
+      "integrity": "sha1-VHJri4//TfBTxCGH6AH7RBLfFJQ=",
+      "dev": true
+    },
+    "chrome-trace-event": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/chrome-trace-event/download/chrome-trace-event-1.0.0.tgz",
+      "integrity": "sha1-Rakb0sIMlBHwljtarrmhuV4JzEg=",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "ci-info": {
+      "version": "1.6.0",
+      "resolved": "http://registry.npm.taobao.org/ci-info/download/ci-info-1.6.0.tgz",
+      "integrity": "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc=",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "circular-json": {
+      "version": "0.3.3",
+      "resolved": "http://registry.npm.taobao.org/circular-json/download/circular-json-0.3.3.tgz",
+      "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=",
+      "dev": true
+    },
+    "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": "http://registry.npm.taobao.org/clean-css/download/clean-css-4.2.1.tgz",
+      "integrity": "sha1-LUEe92uFabbQyEBo2r6FsKpeXBc=",
+      "dev": true,
+      "requires": {
+        "source-map": "~0.6.0"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "cli-cursor": {
+      "version": "2.1.0",
+      "resolved": "http://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-spinners": {
+      "version": "1.3.1",
+      "resolved": "http://registry.npm.taobao.org/cli-spinners/download/cli-spinners-1.3.1.tgz",
+      "integrity": "sha1-ACwZkJEtDVlYDJO9NsBW3pnkJZo=",
+      "dev": true
+    },
+    "cli-width": {
+      "version": "2.2.0",
+      "resolved": "http://registry.npm.taobao.org/cli-width/download/cli-width-2.2.0.tgz",
+      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+      "dev": true
+    },
+    "clipboardy": {
+      "version": "1.2.3",
+      "resolved": "http://registry.npm.taobao.org/clipboardy/download/clipboardy-1.2.3.tgz",
+      "integrity": "sha1-BSY2G/eHJMHyC+JI1CjjZUM8B+8=",
+      "dev": true,
+      "requires": {
+        "arch": "^2.1.0",
+        "execa": "^0.8.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "0.8.0",
+          "resolved": "http://registry.npm.taobao.org/execa/download/execa-0.8.0.tgz",
+          "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^5.0.1",
+            "get-stream": "^3.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"
+          }
+        },
+        "get-stream": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz",
+          "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+          "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"
+          }
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz",
+          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+          "dev": true
+        }
+      }
+    },
+    "cliui": {
+      "version": "4.1.0",
+      "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-4.1.0.tgz",
+      "integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=",
+      "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": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        }
+      }
+    },
+    "clone": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/clone/download/clone-1.0.4.tgz",
+      "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+      "dev": true
+    },
+    "co": {
+      "version": "4.6.0",
+      "resolved": "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz",
+      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+      "dev": true
+    },
+    "coa": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/coa/download/coa-2.0.2.tgz",
+      "integrity": "sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM=",
+      "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
+    },
+    "codepage": {
+      "version": "1.14.0",
+      "resolved": "http://registry.npm.taobao.org/codepage/download/codepage-1.14.0.tgz",
+      "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=",
+      "requires": {
+        "commander": "~2.14.1",
+        "exit-on-epipe": "~1.0.1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.14.1",
+          "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.14.1.tgz",
+          "integrity": "sha1-IjUSPjevjKPGXfRbAm29NXsBuao="
+        }
+      }
+    },
+    "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.0",
+      "resolved": "http://registry.npm.taobao.org/color/download/color-3.1.0.tgz",
+      "integrity": "sha1-2On7CWcyh1d0yEv5IoFd8DCND/w=",
+      "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": "http://registry.npm.taobao.org/color-string/download/color-string-1.5.3.tgz",
+      "integrity": "sha1-ybvF8BtYtUkvPWhXRZy2WQziBMw=",
+      "dev": true,
+      "requires": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
+    "colors": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/colors/download/colors-1.1.2.tgz",
+      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+      "dev": true
+    },
+    "combined-stream": {
+      "version": "1.0.7",
+      "resolved": "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.7.tgz",
+      "integrity": "sha1-LR0kMXr7ir6V1tLAsHtXgTU52Cg=",
+      "dev": true,
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
+    "commander": {
+      "version": "2.17.1",
+      "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz",
+      "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78="
+    },
+    "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.2.1",
+      "resolved": "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz",
+      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+      "dev": true
+    },
+    "compressible": {
+      "version": "2.0.16",
+      "resolved": "http://registry.npm.taobao.org/compressible/download/compressible-2.0.16.tgz",
+      "integrity": "sha1-pJv5hY84IbZM4b4Clq/HOARmp38=",
+      "dev": true,
+      "requires": {
+        "mime-db": ">= 1.38.0 < 2"
+      }
+    },
+    "compression": {
+      "version": "1.7.3",
+      "resolved": "http://registry.npm.taobao.org/compression/download/compression-1.7.3.tgz",
+      "integrity": "sha1-J+DhdqryYPfywoE8PkQK258Zk9s=",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.14",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.1",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      },
+      "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"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/ms/download/ms-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="
+    },
+    "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": "http://registry.npm.taobao.org/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz",
+      "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w=",
+      "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"
+      }
+    },
+    "consolidate": {
+      "version": "0.15.1",
+      "resolved": "http://registry.npm.taobao.org/consolidate/download/consolidate-0.15.1.tgz",
+      "integrity": "sha1-IasEMjXHGgfUXZqtmFk7DbpWurc=",
+      "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
+    },
+    "contains-path": {
+      "version": "0.1.0",
+      "resolved": "http://registry.npm.taobao.org/contains-path/download/contains-path-0.1.0.tgz",
+      "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+      "dev": true
+    },
+    "content-disposition": {
+      "version": "0.5.2",
+      "resolved": "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.2.tgz",
+      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+      "dev": true
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz",
+      "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=",
+      "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.3.1",
+      "resolved": "http://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz",
+      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+      "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": "http://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"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "10.0.4",
+          "resolved": "http://registry.npm.taobao.org/cacache/download/cacache-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"
+          }
+        },
+        "find-cache-dir": {
+          "version": "1.0.0",
+          "resolved": "http://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": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz",
+          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
+        },
+        "globby": {
+          "version": "7.1.1",
+          "resolved": "http://registry.npm.taobao.org/globby/download/globby-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"
+          }
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "http://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"
+          }
+        },
+        "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"
+          }
+        },
+        "mississippi": {
+          "version": "2.0.0",
+          "resolved": "http://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"
+          }
+        },
+        "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": "http://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-try": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz",
+          "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+          "dev": true,
+          "requires": {
+            "find-up": "^2.1.0"
+          }
+        },
+        "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"
+          }
+        },
+        "slash": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz",
+          "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz",
+          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+          "dev": true
+        }
+      }
+    },
+    "core-js": {
+      "version": "2.6.5",
+      "resolved": "http://registry.npm.taobao.org/core-js/download/core-js-2.6.5.tgz",
+      "integrity": "sha1-RLyNJJ5/sv9dAOA0Gn/7lPv2eJU="
+    },
+    "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=",
+      "dev": true
+    },
+    "cosmiconfig": {
+      "version": "5.1.0",
+      "resolved": "http://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-5.1.0.tgz",
+      "integrity": "sha1-bFw16X83+YUGHN9lPxFHhCMRhc8=",
+      "dev": true,
+      "requires": {
+        "import-fresh": "^2.0.0",
+        "is-directory": "^0.3.1",
+        "js-yaml": "^3.9.0",
+        "lodash.get": "^4.4.2",
+        "parse-json": "^4.0.0"
+      }
+    },
+    "crc-32": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/crc-32/download/crc-32-1.2.0.tgz",
+      "integrity": "sha1-yy224puIUI4y2d0OwWk+e0Ghggg=",
+      "requires": {
+        "exit-on-epipe": "~1.0.1",
+        "printj": "~1.1.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-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-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": "http://registry.npm.taobao.org/css-declaration-sorter/download/css-declaration-sorter-4.0.1.tgz",
+      "integrity": "sha1-wZiUD2OnbX42wecQGLABchBUyyI=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.1",
+        "timsort": "^0.3.0"
+      }
+    },
+    "css-line-break": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/css-line-break/download/css-line-break-1.1.1.tgz",
+      "integrity": "sha1-1em90peEAJnrBQPHMQ/TSSegJu8=",
+      "requires": {
+        "base64-arraybuffer": "^0.2.0"
+      }
+    },
+    "css-loader": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/css-loader/download/css-loader-1.0.1.tgz",
+      "integrity": "sha1-aIW7UjOzXsR7AGBX2gHMZAtref4=",
+      "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": "http://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"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "css-parse": {
+      "version": "1.7.0",
+      "resolved": "http://registry.npm.taobao.org/css-parse/download/css-parse-1.7.0.tgz",
+      "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=",
+      "dev": true
+    },
+    "css-select": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/css-select/download/css-select-2.0.2.tgz",
+      "integrity": "sha1-q0OGzsnh9miFVWSxfDcztDsqXt4=",
+      "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": "http://registry.npm.taobao.org/css-select-base-adapter/download/css-select-base-adapter-0.1.1.tgz",
+      "integrity": "sha1-Oy/0lyzDYquIVhUHqVQIoUMhNdc=",
+      "dev": true
+    },
+    "css-selector-tokenizer": {
+      "version": "0.7.1",
+      "resolved": "http://registry.npm.taobao.org/css-selector-tokenizer/download/css-selector-tokenizer-0.7.1.tgz",
+      "integrity": "sha1-oXcnGovKUBkXL0+JH8bu2cv2jV0=",
+      "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.28",
+      "resolved": "http://registry.npm.taobao.org/css-tree/download/css-tree-1.0.0-alpha.28.tgz",
+      "integrity": "sha1-joloGQ2IbJR3vI1h6W9hrz9/+n8=",
+      "dev": true,
+      "requires": {
+        "mdn-data": "~1.1.0",
+        "source-map": "^0.5.3"
+      }
+    },
+    "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-url-regex": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/css-url-regex/download/css-url-regex-1.1.0.tgz",
+      "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=",
+      "dev": true
+    },
+    "css-what": {
+      "version": "2.1.3",
+      "resolved": "http://registry.npm.taobao.org/css-what/download/css-what-2.1.3.tgz",
+      "integrity": "sha1-ptdgRXM2X+dGhsPzEcVlE9iChfI=",
+      "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": "http://registry.npm.taobao.org/cssnano/download/cssnano-4.1.10.tgz",
+      "integrity": "sha1-CsQfCxPRPUZUh+ERt3jULaYxuLI=",
+      "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": "http://registry.npm.taobao.org/cssnano-preset-default/download/cssnano-preset-default-4.0.7.tgz",
+      "integrity": "sha1-UexmLM/KD4izltzZZ5zbkxvhf3Y=",
+      "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": "http://registry.npm.taobao.org/cssnano-util-raw-cache/download/cssnano-util-raw-cache-4.0.1.tgz",
+      "integrity": "sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "cssnano-util-same-parent": {
+      "version": "4.0.1",
+      "resolved": "http://registry.npm.taobao.org/cssnano-util-same-parent/download/cssnano-util-same-parent-4.0.1.tgz",
+      "integrity": "sha1-V0CC+yhZ0ttDOFWDXZqEVuoYu/M=",
+      "dev": true
+    },
+    "csso": {
+      "version": "3.5.1",
+      "resolved": "http://registry.npm.taobao.org/csso/download/csso-3.5.1.tgz",
+      "integrity": "sha1-e564vmFiiXPBsmHhadLwJACOdYs=",
+      "dev": true,
+      "requires": {
+        "css-tree": "1.0.0-alpha.29"
+      },
+      "dependencies": {
+        "css-tree": {
+          "version": "1.0.0-alpha.29",
+          "resolved": "http://registry.npm.taobao.org/css-tree/download/css-tree-1.0.0-alpha.29.tgz",
+          "integrity": "sha1-P6nU7zFCy9HDAedmTB81K9gvWjk=",
+          "dev": true,
+          "requires": {
+            "mdn-data": "~1.1.0",
+            "source-map": "^0.5.3"
+          }
+        }
+      }
+    },
+    "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=",
+      "dev": true,
+      "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
+    },
+    "dayjs": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npm.taobao.org/dayjs/download/dayjs-1.10.4.tgz",
+      "integrity": "sha1-jlRKm4aD9heD9XCYCoqA6vVKseI="
+    },
+    "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": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/decamelize/download/decamelize-2.0.0.tgz",
+      "integrity": "sha1-ZW17vICUxMeI6lPFhAkIycfQY8c=",
+      "dev": true,
+      "requires": {
+        "xregexp": "4.0.0"
+      }
+    },
+    "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.0.1",
+      "resolved": "http://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz",
+      "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU="
+    },
+    "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": "http://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz",
+      "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M="
+    },
+    "default-gateway": {
+      "version": "2.7.2",
+      "resolved": "http://registry.npm.taobao.org/default-gateway/download/default-gateway-2.7.2.tgz",
+      "integrity": "sha1-t+8znl4CSwRUZ69APVA0jbRkLQ8=",
+      "dev": true,
+      "requires": {
+        "execa": "^0.10.0",
+        "ip-regex": "^2.1.0"
+      },
+      "dependencies": {
+        "execa": {
+          "version": "0.10.0",
+          "resolved": "http://registry.npm.taobao.org/execa/download/execa-0.10.0.tgz",
+          "integrity": "sha1-/0Vqj1P5D47MxxqW0Rvfx/CCy1A=",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^6.0.0",
+            "get-stream": "^3.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"
+          }
+        },
+        "get-stream": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz",
+          "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+          "dev": true
+        }
+      }
+    },
+    "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": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/del/download/del-3.0.0.tgz",
+      "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+      "dev": true,
+      "requires": {
+        "globby": "^6.1.0",
+        "is-path-cwd": "^1.0.0",
+        "is-path-in-cwd": "^1.0.0",
+        "p-map": "^1.1.1",
+        "pify": "^3.0.0",
+        "rimraf": "^2.2.8"
+      },
+      "dependencies": {
+        "globby": {
+          "version": "6.1.0",
+          "resolved": "http://registry.npm.taobao.org/globby/download/globby-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
+            }
+          }
+        }
+      }
+    },
+    "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=",
+      "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": "http://registry.npm.taobao.org/detect-node/download/detect-node-2.0.4.tgz",
+      "integrity": "sha1-AU7o+PZpxcWAI9pkuBecCDooxGw=",
+      "dev": true
+    },
+    "diff": {
+      "version": "1.0.8",
+      "resolved": "http://registry.npm.taobao.org/diff/download/diff-1.0.8.tgz",
+      "integrity": "sha1-NDJ2MI7Jkbe8giZ+1VvBQR+XFmY="
+    },
+    "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": "http://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": "http://registry.npm.taobao.org/dns-packet/download/dns-packet-1.3.1.tgz",
+      "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=",
+      "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"
+      }
+    },
+    "doctrine": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.taobao.org/doctrine/download/doctrine-2.1.0.tgz",
+      "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=",
+      "dev": true,
+      "requires": {
+        "esutils": "^2.0.2"
+      }
+    },
+    "dom-converter": {
+      "version": "0.2.0",
+      "resolved": "http://registry.npm.taobao.org/dom-converter/download/dom-converter-0.2.0.tgz",
+      "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=",
+      "dev": true,
+      "requires": {
+        "utila": "~0.4"
+      }
+    },
+    "dom-serializer": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.1.1.tgz",
+      "integrity": "sha1-HsQFnihLq+027sKUHUqXChic58A=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^1.3.0",
+        "entities": "^1.1.1"
+      }
+    },
+    "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": "http://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz",
+      "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=",
+      "dev": true
+    },
+    "domhandler": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.taobao.org/domhandler/download/domhandler-2.1.0.tgz",
+      "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1"
+      }
+    },
+    "domutils": {
+      "version": "1.7.0",
+      "resolved": "http://registry.npm.taobao.org/domutils/download/domutils-1.7.0.tgz",
+      "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "dot-prop": {
+      "version": "4.2.0",
+      "resolved": "http://registry.npm.taobao.org/dot-prop/download/dot-prop-4.2.0.tgz",
+      "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=",
+      "dev": true,
+      "requires": {
+        "is-obj": "^1.0.0"
+      }
+    },
+    "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": "http://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=",
+      "dev": true,
+      "requires": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "echarts": {
+      "version": "4.9.0",
+      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-4.9.0.tgz",
+      "integrity": "sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==",
+      "dev": true,
+      "requires": {
+        "zrender": "4.3.2"
+      }
+    },
+    "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.6.1",
+      "resolved": "http://registry.npm.taobao.org/ejs/download/ejs-2.6.1.tgz",
+      "integrity": "sha1-SY7A1JVlWrxvI81hho2SZGQHGqA=",
+      "dev": true
+    },
+    "electron-to-chromium": {
+      "version": "1.3.113",
+      "resolved": "http://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.113.tgz",
+      "integrity": "sha1-scz2Gd9yla6he8aVHcaJYyYp5Kk=",
+      "dev": true
+    },
+    "element-ui": {
+      "version": "2.13.2",
+      "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.13.2.tgz",
+      "integrity": "sha512-r761DRPssMPKDiJZWFlG+4e4vr0cRG/atKr3Eqr8Xi0tQMNbtmYU1QXvFnKiFPFFGkgJ6zS6ASkG+sellcoHlQ==",
+      "requires": {
+        "async-validator": "~1.8.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.0",
+        "deepmerge": "^1.2.0",
+        "normalize-wheel": "^1.0.1",
+        "resize-observer-polyfill": "^1.5.0",
+        "throttle-debounce": "^1.0.1"
+      }
+    },
+    "elliptic": {
+      "version": "6.4.1",
+      "resolved": "http://registry.npm.taobao.org/elliptic/download/elliptic-6.4.1.tgz",
+      "integrity": "sha1-wtC3d2kRuGcixjLDwGxg8vgZk5o=",
+      "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": "http://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz",
+      "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=",
+      "dev": true
+    },
+    "emojis-list": {
+      "version": "2.1.0",
+      "resolved": "http://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": "http://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": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz",
+      "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=",
+      "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.2",
+      "resolved": "http://registry.npm.taobao.org/error-stack-parser/download/error-stack-parser-2.0.2.tgz",
+      "integrity": "sha1-Sujbqiv5CotFBwe5FJ3KvKE1Ug0=",
+      "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": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "eslint": {
+      "version": "5.14.1",
+      "resolved": "http://registry.npm.taobao.org/eslint/download/eslint-5.14.1.tgz",
+      "integrity": "sha1-SQookGvjE2hcVczUOjno0i78BLo=",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "ajv": "^6.9.1",
+        "chalk": "^2.1.0",
+        "cross-spawn": "^6.0.5",
+        "debug": "^4.0.1",
+        "doctrine": "^3.0.0",
+        "eslint-scope": "^4.0.0",
+        "eslint-utils": "^1.3.1",
+        "eslint-visitor-keys": "^1.0.0",
+        "espree": "^5.0.1",
+        "esquery": "^1.0.1",
+        "esutils": "^2.0.2",
+        "file-entry-cache": "^5.0.1",
+        "functional-red-black-tree": "^1.0.1",
+        "glob": "^7.1.2",
+        "globals": "^11.7.0",
+        "ignore": "^4.0.6",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "inquirer": "^6.2.2",
+        "js-yaml": "^3.12.0",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.3.0",
+        "lodash": "^4.17.11",
+        "minimatch": "^3.0.4",
+        "mkdirp": "^0.5.1",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.8.2",
+        "path-is-inside": "^1.0.2",
+        "progress": "^2.0.0",
+        "regexpp": "^2.0.1",
+        "semver": "^5.5.1",
+        "strip-ansi": "^4.0.0",
+        "strip-json-comments": "^2.0.1",
+        "table": "^5.2.3",
+        "text-table": "^0.2.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "6.1.0",
+          "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-6.1.0.tgz",
+          "integrity": "sha1-sKO+MXUsl6D3ATxfSQO3GgXbaBg=",
+          "dev": true
+        },
+        "acorn-jsx": {
+          "version": "5.0.1",
+          "resolved": "http://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-5.0.1.tgz",
+          "integrity": "sha1-MqBk/ZJUKSFqCbFBECv90YX65A4=",
+          "dev": true
+        },
+        "chardet": {
+          "version": "0.7.0",
+          "resolved": "http://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz",
+          "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=",
+          "dev": true
+        },
+        "doctrine": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz",
+          "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2"
+          }
+        },
+        "espree": {
+          "version": "5.0.1",
+          "resolved": "http://registry.npm.taobao.org/espree/download/espree-5.0.1.tgz",
+          "integrity": "sha1-XWUm+k/H8HiKXPdbFfMDI+L4H3o=",
+          "dev": true,
+          "requires": {
+            "acorn": "^6.0.7",
+            "acorn-jsx": "^5.0.0",
+            "eslint-visitor-keys": "^1.0.0"
+          }
+        },
+        "external-editor": {
+          "version": "3.0.3",
+          "resolved": "http://registry.npm.taobao.org/external-editor/download/external-editor-3.0.3.tgz",
+          "integrity": "sha1-WGbbKal4Jtvkvzr9JAcOrZ6kOic=",
+          "dev": true,
+          "requires": {
+            "chardet": "^0.7.0",
+            "iconv-lite": "^0.4.24",
+            "tmp": "^0.0.33"
+          }
+        },
+        "file-entry-cache": {
+          "version": "5.0.1",
+          "resolved": "http://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-5.0.1.tgz",
+          "integrity": "sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w=",
+          "dev": true,
+          "requires": {
+            "flat-cache": "^2.0.1"
+          }
+        },
+        "flat-cache": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/flat-cache/download/flat-cache-2.0.1.tgz",
+          "integrity": "sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA=",
+          "dev": true,
+          "requires": {
+            "flatted": "^2.0.0",
+            "rimraf": "2.6.3",
+            "write": "1.0.3"
+          }
+        },
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz",
+          "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=",
+          "dev": true
+        },
+        "import-fresh": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/import-fresh/download/import-fresh-3.0.0.tgz",
+          "integrity": "sha1-o9iX9CDKsOZxI2iX91vBS0iFw5A=",
+          "dev": true,
+          "requires": {
+            "parent-module": "^1.0.0",
+            "resolve-from": "^4.0.0"
+          }
+        },
+        "inquirer": {
+          "version": "6.2.2",
+          "resolved": "http://registry.npm.taobao.org/inquirer/download/inquirer-6.2.2.tgz",
+          "integrity": "sha1-RpQRdvZcnrIIBGJxSbdDohjyVAY=",
+          "dev": true,
+          "requires": {
+            "ansi-escapes": "^3.2.0",
+            "chalk": "^2.4.2",
+            "cli-cursor": "^2.1.0",
+            "cli-width": "^2.0.0",
+            "external-editor": "^3.0.3",
+            "figures": "^2.0.0",
+            "lodash": "^4.17.11",
+            "mute-stream": "0.0.7",
+            "run-async": "^2.2.0",
+            "rxjs": "^6.4.0",
+            "string-width": "^2.1.0",
+            "strip-ansi": "^5.0.0",
+            "through": "^2.3.6"
+          },
+          "dependencies": {
+            "strip-ansi": {
+              "version": "5.0.0",
+              "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.0.0.tgz",
+              "integrity": "sha1-949otdCGbCCyybjGG1KYUI3IdW8=",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^4.0.0"
+              }
+            }
+          }
+        },
+        "regexpp": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/regexpp/download/regexpp-2.0.1.tgz",
+          "integrity": "sha1-jRnTHPYySCtYkEn4KB+T28uk0H8=",
+          "dev": true
+        },
+        "resolve-from": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz",
+          "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=",
+          "dev": true
+        },
+        "slice-ansi": {
+          "version": "2.1.0",
+          "resolved": "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz",
+          "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "astral-regex": "^1.0.0",
+            "is-fullwidth-code-point": "^2.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.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
+            }
+          }
+        },
+        "table": {
+          "version": "5.2.3",
+          "resolved": "http://registry.npm.taobao.org/table/download/table-5.2.3.tgz",
+          "integrity": "sha1-zeDMbrBnUcAJ76sn6Mggyltnt/I=",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.9.1",
+            "lodash": "^4.17.11",
+            "slice-ansi": "^2.1.0",
+            "string-width": "^3.0.0"
+          },
+          "dependencies": {
+            "string-width": {
+              "version": "3.0.0",
+              "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-3.0.0.tgz",
+              "integrity": "sha1-WhaQpXzHghH//ZvyS74k0JBgTrE=",
+              "dev": true,
+              "requires": {
+                "emoji-regex": "^7.0.1",
+                "is-fullwidth-code-point": "^2.0.0",
+                "strip-ansi": "^5.0.0"
+              }
+            },
+            "strip-ansi": {
+              "version": "5.0.0",
+              "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.0.0.tgz",
+              "integrity": "sha1-949otdCGbCCyybjGG1KYUI3IdW8=",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^4.0.0"
+              }
+            }
+          }
+        },
+        "write": {
+          "version": "1.0.3",
+          "resolved": "http://registry.npm.taobao.org/write/download/write-1.0.3.tgz",
+          "integrity": "sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM=",
+          "dev": true,
+          "requires": {
+            "mkdirp": "^0.5.1"
+          }
+        }
+      }
+    },
+    "eslint-config-standard": {
+      "version": "12.0.0",
+      "resolved": "http://registry.npm.taobao.org/eslint-config-standard/download/eslint-config-standard-12.0.0.tgz",
+      "integrity": "sha1-Y4tMZdsL1aQTGflruh8V3a0hB9k=",
+      "dev": true
+    },
+    "eslint-import-resolver-node": {
+      "version": "0.3.2",
+      "resolved": "http://registry.npm.taobao.org/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.2.tgz",
+      "integrity": "sha1-WPFfuDm40FdsqYBBNHaqskcttmo=",
+      "dev": true,
+      "requires": {
+        "debug": "^2.6.9",
+        "resolve": "^1.5.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"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "eslint-loader": {
+      "version": "2.1.2",
+      "resolved": "http://registry.npm.taobao.org/eslint-loader/download/eslint-loader-2.1.2.tgz",
+      "integrity": "sha1-RTVCoSMNb/rJDk58ucrbqdhRvmg=",
+      "dev": true,
+      "requires": {
+        "loader-fs-cache": "^1.0.0",
+        "loader-utils": "^1.0.2",
+        "object-assign": "^4.0.1",
+        "object-hash": "^1.1.4",
+        "rimraf": "^2.6.1"
+      }
+    },
+    "eslint-module-utils": {
+      "version": "2.3.0",
+      "resolved": "http://registry.npm.taobao.org/eslint-module-utils/download/eslint-module-utils-2.3.0.tgz",
+      "integrity": "sha1-VGF42rXgRsi1Yru1BwXiRW172kk=",
+      "dev": true,
+      "requires": {
+        "debug": "^2.6.8",
+        "pkg-dir": "^2.0.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"
+          }
+        },
+        "find-up": {
+          "version": "2.1.0",
+          "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz",
+          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "http://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"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "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": "http://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-try": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz",
+          "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+          "dev": true,
+          "requires": {
+            "find-up": "^2.1.0"
+          }
+        }
+      }
+    },
+    "eslint-plugin-es": {
+      "version": "1.4.0",
+      "resolved": "http://registry.npm.taobao.org/eslint-plugin-es/download/eslint-plugin-es-1.4.0.tgz",
+      "integrity": "sha1-R19luyDJk/wQ6Mj+d9HWAGgHLaY=",
+      "dev": true,
+      "requires": {
+        "eslint-utils": "^1.3.0",
+        "regexpp": "^2.0.1"
+      },
+      "dependencies": {
+        "regexpp": {
+          "version": "2.0.1",
+          "resolved": "http://registry.npm.taobao.org/regexpp/download/regexpp-2.0.1.tgz",
+          "integrity": "sha1-jRnTHPYySCtYkEn4KB+T28uk0H8=",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-import": {
+      "version": "2.16.0",
+      "resolved": "http://registry.npm.taobao.org/eslint-plugin-import/download/eslint-plugin-import-2.16.0.tgz",
+      "integrity": "sha1-l6w+ddB5HE+sDhXvOIUQIXvn9m8=",
+      "dev": true,
+      "requires": {
+        "contains-path": "^0.1.0",
+        "debug": "^2.6.9",
+        "doctrine": "1.5.0",
+        "eslint-import-resolver-node": "^0.3.2",
+        "eslint-module-utils": "^2.3.0",
+        "has": "^1.0.3",
+        "lodash": "^4.17.11",
+        "minimatch": "^3.0.4",
+        "read-pkg-up": "^2.0.0",
+        "resolve": "^1.9.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"
+          }
+        },
+        "doctrine": {
+          "version": "1.5.0",
+          "resolved": "http://registry.npm.taobao.org/doctrine/download/doctrine-1.5.0.tgz",
+          "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "isarray": "^1.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-node": {
+      "version": "8.0.1",
+      "resolved": "http://registry.npm.taobao.org/eslint-plugin-node/download/eslint-plugin-node-8.0.1.tgz",
+      "integrity": "sha1-Va41YAIoY9FB+noReZUyNApoWWQ=",
+      "dev": true,
+      "requires": {
+        "eslint-plugin-es": "^1.3.1",
+        "eslint-utils": "^1.3.1",
+        "ignore": "^5.0.2",
+        "minimatch": "^3.0.4",
+        "resolve": "^1.8.1",
+        "semver": "^5.5.0"
+      },
+      "dependencies": {
+        "ignore": {
+          "version": "5.0.5",
+          "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-5.0.5.tgz",
+          "integrity": "sha1-xmPFSNbOGG+zNhaozLXUbla9u/k=",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-promise": {
+      "version": "4.0.1",
+      "resolved": "http://registry.npm.taobao.org/eslint-plugin-promise/download/eslint-plugin-promise-4.0.1.tgz",
+      "integrity": "sha1-LQdLZT81oj0bqJ2Ol2qYURfRxqI=",
+      "dev": true
+    },
+    "eslint-plugin-standard": {
+      "version": "4.0.0",
+      "resolved": "http://registry.npm.taobao.org/eslint-plugin-standard/download/eslint-plugin-standard-4.0.0.tgz",
+      "integrity": "sha1-+EW0UQnJnNkOd3lpQKNEVGyPa1w=",
+      "dev": true
+    },
+    "eslint-plugin-vue": {
+      "version": "5.2.2",
+      "resolved": "http://registry.npm.taobao.org/eslint-plugin-vue/download/eslint-plugin-vue-5.2.2.tgz",
+      "integrity": "sha1-hmAYI7dyG3C8ktVPFyjPwDs2KDw=",
+      "dev": true,
+      "requires": {
+        "vue-eslint-parser": "^5.0.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "6.1.0",
+          "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-6.1.0.tgz",
+          "integrity": "sha1-sKO+MXUsl6D3ATxfSQO3GgXbaBg=",
+          "dev": true
+        },
+        "acorn-jsx": {
+          "version": "5.0.1",
+          "resolved": "http://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-5.0.1.tgz",
+          "integrity": "sha1-MqBk/ZJUKSFqCbFBECv90YX65A4=",
+          "dev": true
+        },
+        "espree": {
+          "version": "4.1.0",
+          "resolved": "http://registry.npm.taobao.org/espree/download/espree-4.1.0.tgz",
+          "integrity": "sha1-co1UUeD9FWwEOEp62J7VH/VOsl8=",
+          "dev": true,
+          "requires": {
+            "acorn": "^6.0.2",
+            "acorn-jsx": "^5.0.0",
+            "eslint-visitor-keys": "^1.0.0"
+          }
+        },
+        "vue-eslint-parser": {
+          "version": "5.0.0",
+          "resolved": "http://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-5.0.0.tgz",
+          "integrity": "sha1-APTk2pTsl0uCGib/DtD3p4QCuKE=",
+          "dev": true,
+          "requires": {
+            "debug": "^4.1.0",
+            "eslint-scope": "^4.0.0",
+            "eslint-visitor-keys": "^1.0.0",
+            "espree": "^4.1.0",
+            "esquery": "^1.0.1",
+            "lodash": "^4.17.11"
+          }
+        }
+      }
+    },
+    "eslint-scope": {
+      "version": "4.0.0",
+      "resolved": "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.0.tgz",
+      "integrity": "sha1-UL8wcekzi83EMzF5Sgy1M/ATYXI=",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "eslint-utils": {
+      "version": "1.3.1",
+      "resolved": "http://registry.npm.taobao.org/eslint-utils/download/eslint-utils-1.3.1.tgz",
+      "integrity": "sha1-moUbqJ7nxGA0b5fPiTnHKYgn5RI=",
+      "dev": true
+    },
+    "eslint-visitor-keys": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.0.0.tgz",
+      "integrity": "sha1-PzGA+y4pEBdxastMnW1bXDSmqB0=",
+      "dev": true
+    },
+    "espree": {
+      "version": "3.5.4",
+      "resolved": "http://registry.npm.taobao.org/espree/download/espree-3.5.4.tgz",
+      "integrity": "sha1-sPRHGHyKi+2US4FaZgvd9d610ac=",
+      "dev": true,
+      "requires": {
+        "acorn": "^5.5.0",
+        "acorn-jsx": "^3.0.0"
+      }
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz",
+      "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=",
+      "dev": true
+    },
+    "esquery": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/esquery/download/esquery-1.0.1.tgz",
+      "integrity": "sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg=",
+      "dev": true,
+      "requires": {
+        "estraverse": "^4.0.0"
+      }
+    },
+    "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.0",
+      "resolved": "http://registry.npm.taobao.org/eventemitter3/download/eventemitter3-3.1.0.tgz",
+      "integrity": "sha1-CQtNbNvWRe0Qv3UNS1QHlC17oWM=",
+      "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": "http://registry.npm.taobao.org/eventsource/download/eventsource-1.0.7.tgz",
+      "integrity": "sha1-j7xyyT/NNAiAkLwKTmT0tc7m2NA=",
+      "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": "http://registry.npm.taobao.org/execa/download/execa-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"
+      }
+    },
+    "exit-on-epipe": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/exit-on-epipe/download/exit-on-epipe-1.0.1.tgz",
+      "integrity": "sha1-C92S6H1ShdJn2qgXHQ6wYVlolpI="
+    },
+    "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": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "express": {
+      "version": "4.16.4",
+      "resolved": "http://registry.npm.taobao.org/express/download/express-4.16.4.tgz",
+      "integrity": "sha1-/d72GSYQniTFFeqX/S8b2/Yt8S4=",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.5",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.18.3",
+        "content-disposition": "0.5.2",
+        "content-type": "~1.0.4",
+        "cookie": "0.3.1",
+        "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.1",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.2",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.4",
+        "qs": "6.5.2",
+        "range-parser": "~1.2.0",
+        "safe-buffer": "5.1.2",
+        "send": "0.16.2",
+        "serve-static": "1.13.2",
+        "setprototypeof": "1.1.0",
+        "statuses": "~1.4.0",
+        "type-is": "~1.6.16",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "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"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "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"
+          }
+        }
+      }
+    },
+    "external-editor": {
+      "version": "2.2.0",
+      "resolved": "http://registry.npm.taobao.org/external-editor/download/external-editor-2.2.0.tgz",
+      "integrity": "sha1-BFURz9jRM/OEZnPRBHwVTiFK09U=",
+      "dev": true,
+      "requires": {
+        "chardet": "^0.4.0",
+        "iconv-lite": "^0.4.17",
+        "tmp": "^0.0.33"
+      }
+    },
+    "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=",
+      "dev": true
+    },
+    "eyes": {
+      "version": "0.1.8",
+      "resolved": "http://registry.npm.taobao.org/eyes/download/eyes-0.1.8.tgz",
+      "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A="
+    },
+    "fast-deep-equal": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz",
+      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+      "dev": true
+    },
+    "fast-diff": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
+      "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
+    },
+    "fast-glob": {
+      "version": "2.2.6",
+      "resolved": "http://registry.npm.taobao.org/fast-glob/download/fast-glob-2.2.6.tgz",
+      "integrity": "sha1-pdW2l+yN7aRo2Fp0A1KQoCWpUpU=",
+      "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=",
+      "dev": true
+    },
+    "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": "http://registry.npm.taobao.org/fastparse/download/fastparse-1.1.2.tgz",
+      "integrity": "sha1-kXKMWllC7O2FMSg8eUQe5BIsNak=",
+      "dev": true
+    },
+    "faye-websocket": {
+      "version": "0.10.0",
+      "resolved": "http://registry.npm.taobao.org/faye-websocket/download/faye-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
+    },
+    "figures": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz",
+      "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.5"
+      }
+    },
+    "file-entry-cache": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-2.0.0.tgz",
+      "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+      "dev": true,
+      "requires": {
+        "flat-cache": "^1.2.1",
+        "object-assign": "^4.0.1"
+      }
+    },
+    "file-loader": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.taobao.org/file-loader/download/file-loader-3.0.1.tgz",
+      "integrity": "sha1-+OC6C1mZGLUa3+RdZtHnca1WD6o=",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.0.2",
+        "schema-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
+      }
+    },
+    "filesize": {
+      "version": "3.6.1",
+      "resolved": "http://registry.npm.taobao.org/filesize/download/filesize-3.6.1.tgz",
+      "integrity": "sha1-CQuz7gG2+AGoqL6Z0xcQs0Irsxc=",
+      "dev": true
+    },
+    "fill-range": {
+      "version": "4.0.0",
+      "resolved": "http://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.1",
+      "resolved": "http://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.1.tgz",
+      "integrity": "sha1-7r9O2EAHnIP0JJA4ydcDAIMBsQU=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.2",
+        "statuses": "~1.4.0",
+        "unpipe": "~1.0.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"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "find-cache-dir": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-2.0.0.tgz",
+      "integrity": "sha1-TB+u1Z9FGEUw+51/oSOk0EqYRy0=",
+      "dev": true,
+      "requires": {
+        "commondir": "^1.0.1",
+        "make-dir": "^1.0.0",
+        "pkg-dir": "^3.0.0"
+      }
+    },
+    "find-up": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz",
+      "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=",
+      "dev": true,
+      "requires": {
+        "locate-path": "^3.0.0"
+      }
+    },
+    "flat-cache": {
+      "version": "1.3.4",
+      "resolved": "http://registry.npm.taobao.org/flat-cache/download/flat-cache-1.3.4.tgz",
+      "integrity": "sha1-LC73dSXMKSkAff/6HdMUqpyd7m8=",
+      "dev": true,
+      "requires": {
+        "circular-json": "^0.3.1",
+        "graceful-fs": "^4.1.2",
+        "rimraf": "~2.6.2",
+        "write": "^0.2.1"
+      }
+    },
+    "flatted": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/flatted/download/flatted-2.0.0.tgz",
+      "integrity": "sha1-VRIrZTbqSWtLRIk+4mCBQdENmRY=",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "follow-redirects": {
+      "version": "1.7.0",
+      "resolved": "http://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.7.0.tgz",
+      "integrity": "sha1-SJ68GY3A5/ZBZ70jsDxMGbV4THY=",
+      "requires": {
+        "debug": "^3.2.6"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz",
+          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
+          "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=",
+      "dev": true
+    },
+    "form-data": {
+      "version": "2.3.3",
+      "resolved": "http://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz",
+      "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=",
+      "dev": true,
+      "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
+    },
+    "frac": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/frac/download/frac-1.1.2.tgz",
+      "integrity": "sha1-PXT39keMiKG1AgMG10fcYxPHTQs="
+    },
+    "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": "http://registry.npm.taobao.org/fs-extra/download/fs-extra-7.0.1.tgz",
+      "integrity": "sha1-TxicRKoSO4lfcigE9V6iPq3DSOk=",
+      "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="
+    },
+    "fsevents": {
+      "version": "1.2.7",
+      "resolved": "http://registry.npm.taobao.org/fsevents/download/fsevents-1.2.7.tgz",
+      "integrity": "sha1-SFG2ZKN4PlIAOzxm6w7uEHSTOqQ=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nan": "^2.9.2",
+        "node-pre-gyp": "^0.10.0"
+      },
+      "dependencies": {
+        "abbrev": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "aproba": {
+          "version": "1.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "are-we-there-yet": {
+          "version": "1.1.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "delegates": "^1.0.0",
+            "readable-stream": "^2.0.6"
+          }
+        },
+        "balanced-match": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "brace-expansion": {
+          "version": "1.1.11",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "balanced-match": "^1.0.0",
+            "concat-map": "0.0.1"
+          }
+        },
+        "chownr": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "code-point-at": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "console-control-strings": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "debug": {
+          "version": "2.6.9",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "deep-extend": {
+          "version": "0.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "delegates": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "detect-libc": {
+          "version": "1.0.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "fs-minipass": {
+          "version": "1.2.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "minipass": "^2.2.1"
+          }
+        },
+        "fs.realpath": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "gauge": {
+          "version": "2.7.4",
+          "bundled": true,
+          "dev": true,
+          "optional": 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"
+          }
+        },
+        "glob": {
+          "version": "7.1.3",
+          "bundled": true,
+          "dev": true,
+          "optional": 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"
+          }
+        },
+        "has-unicode": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "iconv-lite": {
+          "version": "0.4.24",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        },
+        "ignore-walk": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "minimatch": "^3.0.4"
+          }
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "once": "^1.3.0",
+            "wrappy": "1"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "ini": {
+          "version": "1.3.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        },
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "minipass": {
+          "version": "2.3.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.0"
+          }
+        },
+        "minizlib": {
+          "version": "1.2.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "minipass": "^2.2.1"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "needle": {
+          "version": "2.2.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "debug": "^2.1.2",
+            "iconv-lite": "^0.4.4",
+            "sax": "^1.2.4"
+          }
+        },
+        "node-pre-gyp": {
+          "version": "0.10.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "detect-libc": "^1.0.2",
+            "mkdirp": "^0.5.1",
+            "needle": "^2.2.1",
+            "nopt": "^4.0.1",
+            "npm-packlist": "^1.1.6",
+            "npmlog": "^4.0.2",
+            "rc": "^1.2.7",
+            "rimraf": "^2.6.1",
+            "semver": "^5.3.0",
+            "tar": "^4"
+          }
+        },
+        "nopt": {
+          "version": "4.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "abbrev": "1",
+            "osenv": "^0.1.4"
+          }
+        },
+        "npm-bundled": {
+          "version": "1.0.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "npm-packlist": {
+          "version": "1.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ignore-walk": "^3.0.1",
+            "npm-bundled": "^1.0.1"
+          }
+        },
+        "npmlog": {
+          "version": "4.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "are-we-there-yet": "~1.1.2",
+            "console-control-strings": "~1.1.0",
+            "gauge": "~2.7.3",
+            "set-blocking": "~2.0.0"
+          }
+        },
+        "number-is-nan": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "wrappy": "1"
+          }
+        },
+        "os-homedir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "os-tmpdir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "osenv": {
+          "version": "0.1.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "os-homedir": "^1.0.0",
+            "os-tmpdir": "^1.0.0"
+          }
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "process-nextick-args": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "rc": {
+          "version": "1.2.8",
+          "bundled": true,
+          "dev": true,
+          "optional": 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",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "readable-stream": {
+          "version": "2.3.6",
+          "bundled": true,
+          "dev": true,
+          "optional": 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"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "safer-buffer": {
+          "version": "2.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "sax": {
+          "version": "1.2.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "semver": {
+          "version": "5.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "set-blocking": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "signal-exit": {
+          "version": "3.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "tar": {
+          "version": "4.4.8",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chownr": "^1.1.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.3.4",
+            "minizlib": "^1.1.1",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.2"
+          }
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "wide-align": {
+          "version": "1.1.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "string-width": "^1.0.2 || 2"
+          }
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "yallist": {
+          "version": "3.0.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "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
+    },
+    "functional-red-black-tree": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+      "dev": true
+    },
+    "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
+    },
+    "get-stream": {
+      "version": "4.1.0",
+      "resolved": "http://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz",
+      "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=",
+      "dev": true,
+      "requires": {
+        "pump": "^3.0.0"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "glob": {
+      "version": "7.1.3",
+      "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz",
+      "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=",
+      "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": "http://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": "http://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": "http://registry.npm.taobao.org/glob-to-regexp/download/glob-to-regexp-0.3.0.tgz",
+      "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+      "dev": true
+    },
+    "globals": {
+      "version": "11.11.0",
+      "resolved": "http://registry.npm.taobao.org/globals/download/globals-11.11.0.tgz",
+      "integrity": "sha1-3Pk3V/ot5Uhvvu1xGFOK33ienC4=",
+      "dev": true
+    },
+    "globby": {
+      "version": "9.0.0",
+      "resolved": "http://registry.npm.taobao.org/globby/download/globby-9.0.0.tgz",
+      "integrity": "sha1-OADfc23HESZt85tM4z/g1IH5TCM=",
+      "dev": true,
+      "requires": {
+        "array-union": "^1.0.2",
+        "dir-glob": "^2.2.1",
+        "fast-glob": "^2.2.6",
+        "glob": "^7.1.3",
+        "ignore": "^4.0.3",
+        "pify": "^4.0.1",
+        "slash": "^2.0.0"
+      },
+      "dependencies": {
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz",
+          "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=",
+          "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
+        }
+      }
+    },
+    "graceful-fs": {
+      "version": "4.1.15",
+      "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.15.tgz",
+      "integrity": "sha1-/7cD4QZuig7qpMi4C6klPu77+wA=",
+      "dev": true
+    },
+    "gzip-size": {
+      "version": "5.0.0",
+      "resolved": "http://registry.npm.taobao.org/gzip-size/download/gzip-size-5.0.0.tgz",
+      "integrity": "sha1-pV7NmSIvTEj9jAHGJc47NJ0KDoA=",
+      "dev": true,
+      "requires": {
+        "duplexer": "^0.1.1",
+        "pify": "^3.0.0"
+      }
+    },
+    "handle-thing": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.0.tgz",
+      "integrity": "sha1-DgOWlf9QyT/CiFV9aW88HcZ3Z1Q=",
+      "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=",
+      "dev": true
+    },
+    "har-validator": {
+      "version": "5.1.3",
+      "resolved": "http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz",
+      "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=",
+      "dev": true,
+      "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": "http://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-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": "http://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": "http://registry.npm.taobao.org/hex-color-regex/download/hex-color-regex-1.1.0.tgz",
+      "integrity": "sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4=",
+      "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"
+      }
+    },
+    "hoek": {
+      "version": "6.1.2",
+      "resolved": "http://registry.npm.taobao.org/hoek/download/hoek-6.1.2.tgz",
+      "integrity": "sha1-mebQcFYYOd507kJ7YapHa9a939Y=",
+      "dev": true
+    },
+    "hoopy": {
+      "version": "0.1.4",
+      "resolved": "http://registry.npm.taobao.org/hoopy/download/hoopy-0.1.4.tgz",
+      "integrity": "sha1-YJIH1mEQADOpqUAq096mdzgcGx0=",
+      "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": "http://registry.npm.taobao.org/html-comment-regex/download/html-comment-regex-1.1.2.tgz",
+      "integrity": "sha1-l9RoiutcgYhqNk+qDK0d2hTUM6c=",
+      "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": "http://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz",
+      "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=",
+      "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"
+      }
+    },
+    "html-tags": {
+      "version": "2.0.0",
+      "resolved": "http://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": "http://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": "http://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz",
+          "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=",
+          "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"
+          }
+        }
+      }
+    },
+    "html2canvas": {
+      "version": "1.0.0-rc.7",
+      "resolved": "https://registry.npm.taobao.org/html2canvas/download/html2canvas-1.0.0-rc.7.tgz?cache=0&sync_timestamp=1597040085083&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtml2canvas%2Fdownload%2Fhtml2canvas-1.0.0-rc.7.tgz",
+      "integrity": "sha1-cMFZzg5jlUqRFpUxiU0IrVYnrJg=",
+      "requires": {
+        "css-line-break": "1.1.1"
+      }
+    },
+    "htmlparser2": {
+      "version": "3.3.0",
+      "resolved": "http://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.3.0.tgz",
+      "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1",
+        "domhandler": "2.1",
+        "domutils": "1.1",
+        "readable-stream": "1.0"
+      },
+      "dependencies": {
+        "domutils": {
+          "version": "1.1.6",
+          "resolved": "http://registry.npm.taobao.org/domutils/download/domutils-1.1.6.tgz",
+          "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=",
+          "dev": true,
+          "requires": {
+            "domelementtype": "1"
+          }
+        },
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "1.0.34",
+          "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz",
+          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
+            "isarray": "0.0.1",
+            "string_decoder": "~0.10.x"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true
+        }
+      }
+    },
+    "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.6.3",
+      "resolved": "http://registry.npm.taobao.org/http-errors/download/http-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"
+      }
+    },
+    "http-parser-js": {
+      "version": "0.5.0",
+      "resolved": "http://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.5.0.tgz",
+      "integrity": "sha1-1l7b7ehDSdDcMDIIFaFdOcw8u9g=",
+      "dev": true
+    },
+    "http-proxy": {
+      "version": "1.17.0",
+      "resolved": "http://registry.npm.taobao.org/http-proxy/download/http-proxy-1.17.0.tgz",
+      "integrity": "sha1-etOElGWPhGBeL220Q230EPTlvpo=",
+      "dev": true,
+      "requires": {
+        "eventemitter3": "^3.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "http-proxy-middleware": {
+      "version": "0.18.0",
+      "resolved": "http://registry.npm.taobao.org/http-proxy-middleware/download/http-proxy-middleware-0.18.0.tgz",
+      "integrity": "sha1-CYfmu1pWBuWmkWjY+WeofxXdiqs=",
+      "dev": true,
+      "requires": {
+        "http-proxy": "^1.16.2",
+        "is-glob": "^4.0.0",
+        "lodash": "^4.17.5",
+        "micromatch": "^3.1.9"
+      }
+    },
+    "http-signature": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz",
+      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "dev": true,
+      "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": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz",
+      "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=",
+      "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": "http://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": "http://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"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "ieee754": {
+      "version": "1.1.12",
+      "resolved": "http://registry.npm.taobao.org/ieee754/download/ieee754-1.1.12.tgz",
+      "integrity": "sha1-UL8k5bnIu5ivSWTJQc2wkY2ntgs=",
+      "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": "http://registry.npm.taobao.org/ignore/download/ignore-3.3.10.tgz",
+      "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=",
+      "dev": true
+    },
+    "import-cwd": {
+      "version": "2.1.0",
+      "resolved": "http://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": "http://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz",
+      "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
+      "dev": true,
+      "requires": {
+        "caller-path": "^2.0.0",
+        "resolve-from": "^3.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "resolve-from": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz",
+          "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+          "dev": true
+        }
+      }
+    },
+    "import-from": {
+      "version": "2.1.0",
+      "resolved": "http://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"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz",
+          "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+          "dev": true
+        }
+      }
+    },
+    "import-local": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/import-local/download/import-local-2.0.0.tgz",
+      "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "^3.0.0",
+        "resolve-cwd": "^2.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
+    },
+    "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
+    },
+    "indexof": {
+      "version": "0.0.1",
+      "resolved": "http://registry.npm.taobao.org/indexof/download/indexof-0.0.1.tgz",
+      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.3",
+      "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+    },
+    "inquirer": {
+      "version": "3.3.0",
+      "resolved": "http://registry.npm.taobao.org/inquirer/download/inquirer-3.3.0.tgz",
+      "integrity": "sha1-ndLyrXZdyrH/BEO0kUQqILoifck=",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^3.0.0",
+        "chalk": "^2.0.0",
+        "cli-cursor": "^2.1.0",
+        "cli-width": "^2.0.0",
+        "external-editor": "^2.0.4",
+        "figures": "^2.0.0",
+        "lodash": "^4.3.0",
+        "mute-stream": "0.0.7",
+        "run-async": "^2.2.0",
+        "rx-lite": "^4.0.8",
+        "rx-lite-aggregates": "^4.0.8",
+        "string-width": "^2.1.0",
+        "strip-ansi": "^4.0.0",
+        "through": "^2.3.6"
+      },
+      "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": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        }
+      }
+    },
+    "internal-ip": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npm.taobao.org/internal-ip/download/internal-ip-3.0.1.tgz",
+      "integrity": "sha1-31yZh24dLrLqLXT1IOP2aaAOzic=",
+      "dev": true,
+      "requires": {
+        "default-gateway": "^2.6.0",
+        "ipaddr.js": "^1.5.2"
+      }
+    },
+    "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": "http://registry.npm.taobao.org/invert-kv/download/invert-kv-2.0.0.tgz",
+      "integrity": "sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI=",
+      "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": "http://registry.npm.taobao.org/ip-regex/download/ip-regex-2.1.0.tgz",
+      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
+      "dev": true
+    },
+    "ipaddr.js": {
+      "version": "1.8.0",
+      "resolved": "http://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.8.0.tgz",
+      "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
+      "dev": true
+    },
+    "is-absolute-url": {
+      "version": "2.1.0",
+      "resolved": "http://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-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": "http://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="
+    },
+    "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-ci": {
+      "version": "1.2.1",
+      "resolved": "http://registry.npm.taobao.org/is-ci/download/is-ci-1.2.1.tgz",
+      "integrity": "sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw=",
+      "dev": true,
+      "requires": {
+        "ci-info": "^1.5.0"
+      }
+    },
+    "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-fullwidth-code-point": {
+      "version": "2.0.0",
+      "resolved": "http://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.0",
+      "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-4.0.0.tgz",
+      "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+      "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": "http://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz",
+      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+      "dev": true
+    },
+    "is-path-cwd": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/is-path-cwd/download/is-path-cwd-1.0.0.tgz",
+      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+      "dev": true
+    },
+    "is-path-in-cwd": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/is-path-in-cwd/download/is-path-in-cwd-1.0.1.tgz",
+      "integrity": "sha1-WsSLNF72dTOb1sekipEhELJBz1I=",
+      "dev": true,
+      "requires": {
+        "is-path-inside": "^1.0.0"
+      }
+    },
+    "is-path-inside": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/is-path-inside/download/is-path-inside-1.0.1.tgz",
+      "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+      "dev": true,
+      "requires": {
+        "path-is-inside": "^1.0.1"
+      }
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "http://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-promise": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz",
+      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+      "dev": true
+    },
+    "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": "http://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.1.0.tgz",
+      "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=",
+      "dev": true
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "http://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": "http://registry.npm.taobao.org/is-svg/download/is-svg-3.0.0.tgz",
+      "integrity": "sha1-kyHb0pwhLlypnE+peUxxS8r6L3U=",
+      "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=",
+      "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": "http://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isemail": {
+      "version": "3.2.0",
+      "resolved": "http://registry.npm.taobao.org/isemail/download/isemail-3.2.0.tgz",
+      "integrity": "sha1-WTEKAhkxqfsGu7UeFVzgs/I2gyw=",
+      "dev": true,
+      "requires": {
+        "punycode": "2.x.x"
+      }
+    },
+    "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": "http://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=",
+      "dev": true
+    },
+    "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
+    },
+    "joi": {
+      "version": "14.3.1",
+      "resolved": "http://registry.npm.taobao.org/joi/download/joi-14.3.1.tgz",
+      "integrity": "sha1-FkomLsC4VUZuDDXuoqiFrotscDw=",
+      "dev": true,
+      "requires": {
+        "hoek": "6.x.x",
+        "isemail": "3.x.x",
+        "topo": "3.x.x"
+      }
+    },
+    "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": "http://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz",
+      "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=",
+      "dev": true
+    },
+    "js-yaml": {
+      "version": "3.12.1",
+      "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.12.1.tgz",
+      "integrity": "sha1-KVyGMqGKI+BUz1ydPOyv5ngWdgA=",
+      "dev": true,
+      "requires": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      }
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "json3": {
+      "version": "3.3.2",
+      "resolved": "http://registry.npm.taobao.org/json3/download/json3-3.3.2.tgz",
+      "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      }
+    },
+    "killable": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz",
+      "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=",
+      "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": "http://registry.npm.taobao.org/launch-editor-middleware/download/launch-editor-middleware-2.2.1.tgz",
+      "integrity": "sha1-4UsH5scVSwpLhqD9NFeE5FgEwVc=",
+      "dev": true,
+      "requires": {
+        "launch-editor": "^2.2.1"
+      }
+    },
+    "lcid": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/lcid/download/lcid-2.0.0.tgz",
+      "integrity": "sha1-bvXS32DlL4LrIopMNz6NHzlyU88=",
+      "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"
+      }
+    },
+    "load-json-file": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz",
+      "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "strip-bom": "^3.0.0"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "2.2.0",
+          "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz",
+          "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.2.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "loader-fs-cache": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/loader-fs-cache/download/loader-fs-cache-1.0.1.tgz",
+      "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=",
+      "dev": true,
+      "requires": {
+        "find-cache-dir": "^0.1.1",
+        "mkdirp": "0.5.1"
+      },
+      "dependencies": {
+        "find-cache-dir": {
+          "version": "0.1.1",
+          "resolved": "http://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-0.1.1.tgz",
+          "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=",
+          "dev": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "mkdirp": "^0.5.1",
+            "pkg-dir": "^1.0.0"
+          }
+        },
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "http://registry.npm.taobao.org/find-up/download/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": "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "pkg-dir": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/pkg-dir/download/pkg-dir-1.0.0.tgz",
+          "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
+          "dev": true,
+          "requires": {
+            "find-up": "^1.0.0"
+          }
+        }
+      }
+    },
+    "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"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
+      }
+    },
+    "locate-path": {
+      "version": "3.0.0",
+      "resolved": "http://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"
+      }
+    },
+    "lodash": {
+      "version": "4.17.11",
+      "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.17.11.tgz",
+      "integrity": "sha1-s56mIp72B+zYniyN8SU2iRysm40="
+    },
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "http://registry.npm.taobao.org/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+      "dev": true
+    },
+    "lodash.defaultsdeep": {
+      "version": "4.6.0",
+      "resolved": "http://registry.npm.taobao.org/lodash.defaultsdeep/download/lodash.defaultsdeep-4.6.0.tgz",
+      "integrity": "sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E=",
+      "dev": true
+    },
+    "lodash.get": {
+      "version": "4.4.2",
+      "resolved": "http://registry.npm.taobao.org/lodash.get/download/lodash.get-4.4.2.tgz",
+      "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
+      "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": "http://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.1",
+      "resolved": "http://registry.npm.taobao.org/loglevel/download/loglevel-1.6.1.tgz",
+      "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
+      "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"
+      }
+    },
+    "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": "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": "1.3.0",
+      "resolved": "http://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": "http://registry.npm.taobao.org/map-age-cleaner/download/map-age-cleaner-0.1.3.tgz",
+      "integrity": "sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo=",
+      "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-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": "1.1.4",
+      "resolved": "http://registry.npm.taobao.org/mdn-data/download/mdn-data-1.1.4.tgz",
+      "integrity": "sha1-ULXU/8RXUnZXPE7tuHgIEqhBnwE=",
+      "dev": true
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+      "dev": true
+    },
+    "mem": {
+      "version": "4.1.0",
+      "resolved": "http://registry.npm.taobao.org/mem/download/mem-4.1.0.tgz",
+      "integrity": "sha1-rrm+LSH0fnivKeSsWXjor6LKW4o=",
+      "dev": true,
+      "requires": {
+        "map-age-cleaner": "^0.1.1",
+        "mimic-fn": "^1.0.0",
+        "p-is-promise": "^2.0.0"
+      }
+    },
+    "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"
+      }
+    },
+    "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": "http://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz",
+      "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=",
+      "dev": true,
+      "requires": {
+        "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "merge2": {
+      "version": "1.2.3",
+      "resolved": "http://registry.npm.taobao.org/merge2/download/merge2-1.2.3.tgz",
+      "integrity": "sha1-fumdvWm7ZIFoklPwGEiKG5ArDtU=",
+      "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": "http://registry.npm.taobao.org/micromatch/download/micromatch-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.0",
+      "resolved": "http://registry.npm.taobao.org/mime/download/mime-2.4.0.tgz",
+      "integrity": "sha1-4FH9iBNYWF8yed8zP+aU2gvP/dY=",
+      "dev": true
+    },
+    "mime-db": {
+      "version": "1.38.0",
+      "resolved": "http://registry.npm.taobao.org/mime-db/download/mime-db-1.38.0.tgz",
+      "integrity": "sha1-GiqrFtqesWe0nG5N8tnGjWPY4q0=",
+      "dev": true
+    },
+    "mime-types": {
+      "version": "2.1.22",
+      "resolved": "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.22.tgz",
+      "integrity": "sha1-/ms1WhkJJqt2mMmgVWoRGZshmb0=",
+      "dev": true,
+      "requires": {
+        "mime-db": "~1.38.0"
+      }
+    },
+    "mimic-fn": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz",
+      "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=",
+      "dev": true
+    },
+    "mini-css-extract-plugin": {
+      "version": "0.5.0",
+      "resolved": "http://registry.npm.taobao.org/mini-css-extract-plugin/download/mini-css-extract-plugin-0.5.0.tgz",
+      "integrity": "sha1-rABZsCuWklFaY3EVsMyf7To1x7A=",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "schema-utils": "^1.0.0",
+        "webpack-sources": "^1.1.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
+      }
+    },
+    "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=",
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz",
+      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+      "dev": true
+    },
+    "mississippi": {
+      "version": "3.0.0",
+      "resolved": "http://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"
+      }
+    },
+    "mixin-deep": {
+      "version": "1.3.1",
+      "resolved": "http://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.1.tgz",
+      "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=",
+      "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"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "0.0.8",
+          "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz",
+          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+          "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.1",
+      "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz",
+      "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo="
+    },
+    "multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "http://registry.npm.taobao.org/multicast-dns/download/multicast-dns-6.2.3.tgz",
+      "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=",
+      "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
+    },
+    "mute-stream": {
+      "version": "0.0.7",
+      "resolved": "http://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz",
+      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+      "dev": true
+    },
+    "nan": {
+      "version": "2.12.1",
+      "resolved": "http://registry.npm.taobao.org/nan/download/nan-2.12.1.tgz",
+      "integrity": "sha1-exqhk+mqhgV+PHu9CsRI53CSVVI=",
+      "dev": true,
+      "optional": 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"
+      }
+    },
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "http://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz",
+      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+      "dev": true
+    },
+    "negotiator": {
+      "version": "0.6.1",
+      "resolved": "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz",
+      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+      "dev": true
+    },
+    "neo-async": {
+      "version": "2.6.0",
+      "resolved": "http://registry.npm.taobao.org/neo-async/download/neo-async-2.6.0.tgz",
+      "integrity": "sha1-udFeTXHGdikIZUtRg+04t1M0CDU=",
+      "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": "http://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz",
+      "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=",
+      "dev": true,
+      "requires": {
+        "lower-case": "^1.1.1"
+      }
+    },
+    "node-forge": {
+      "version": "0.7.5",
+      "resolved": "http://registry.npm.taobao.org/node-forge/download/node-forge-0.7.5.tgz",
+      "integrity": "sha1-bBUsNFzhHFL0ZcKr2VfoY5zWdN8=",
+      "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.0",
+      "resolved": "http://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.2.0.tgz",
+      "integrity": "sha1-xy9g2dRt4IqUDe27JfP/ovm7qnc=",
+      "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.0",
+        "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": "0.0.4"
+      },
+      "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.8",
+      "resolved": "http://registry.npm.taobao.org/node-releases/download/node-releases-1.1.8.tgz",
+      "integrity": "sha1-MqY//2PF5Rt+D1QKyVlH0iD8aGI=",
+      "dev": true,
+      "requires": {
+        "semver": "^5.3.0"
+      }
+    },
+    "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": "http://registry.npm.taobao.org/normalize-url/download/normalize-url-3.3.0.tgz",
+      "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=",
+      "dev": true
+    },
+    "normalize-wheel": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/normalize-wheel/download/normalize-wheel-1.0.1.tgz",
+      "integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU="
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "http://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"
+      }
+    },
+    "nth-check": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/nth-check/download/nth-check-1.0.2.tgz",
+      "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=",
+      "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=",
+      "dev": true
+    },
+    "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="
+    },
+    "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-hash": {
+      "version": "1.3.1",
+      "resolved": "http://registry.npm.taobao.org/object-hash/download/object-hash-1.3.1.tgz",
+      "integrity": "sha1-/eRSCYqVHLFF8Dm7fUVUSd3BJt8=",
+      "dev": true
+    },
+    "object-keys": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/object-keys/download/object-keys-1.1.0.tgz",
+      "integrity": "sha1-Eb0iNI3S4JagRasG9shbzDQPoDI=",
+      "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": "http://registry.npm.taobao.org/object.values/download/object.values-1.1.0.tgz",
+      "integrity": "sha1-v2gQ712j5TJXkOqqK+IT6oRiTak=",
+      "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": "http://registry.npm.taobao.org/obuf/download/obuf-1.1.2.tgz",
+      "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=",
+      "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.1",
+      "resolved": "http://registry.npm.taobao.org/on-headers/download/on-headers-1.0.1.tgz",
+      "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "onetime": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz",
+      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "^1.0.0"
+      }
+    },
+    "opener": {
+      "version": "1.5.1",
+      "resolved": "http://registry.npm.taobao.org/opener/download/opener-1.5.1.tgz",
+      "integrity": "sha1-bS8Od/GgrwAyrKcWwsH7uOfoq+0=",
+      "dev": true
+    },
+    "opn": {
+      "version": "5.4.0",
+      "resolved": "http://registry.npm.taobao.org/opn/download/opn-5.4.0.tgz",
+      "integrity": "sha1-y1Reeqt4VivrEao7+rxwQuF2EDU=",
+      "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.1.0",
+      "resolved": "http://registry.npm.taobao.org/ora/download/ora-3.1.0.tgz",
+      "integrity": "sha1-2+3YwDtdAX+2cIPofuUvXsiYI+0=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.2",
+        "cli-cursor": "^2.1.0",
+        "cli-spinners": "^1.3.1",
+        "log-symbols": "^2.2.0",
+        "strip-ansi": "^5.0.0",
+        "wcwidth": "^1.0.1"
+      }
+    },
+    "original": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/original/download/original-1.0.2.tgz",
+      "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=",
+      "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-locale": {
+      "version": "3.1.0",
+      "resolved": "http://registry.npm.taobao.org/os-locale/download/os-locale-3.1.0.tgz",
+      "integrity": "sha1-qAKm7hfyTBBIOrmTVxnO9O0Wvxo=",
+      "dev": true,
+      "requires": {
+        "execa": "^1.0.0",
+        "lcid": "^2.0.0",
+        "mem": "^4.0.0"
+      }
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+      "dev": true
+    },
+    "p-defer": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/p-defer/download/p-defer-1.0.0.tgz",
+      "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
+      "dev": true
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-is-promise": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/p-is-promise/download/p-is-promise-2.0.0.tgz",
+      "integrity": "sha1-dVTj1XIQmofh8/U/an2F0bGU9MU=",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-2.1.0.tgz",
+      "integrity": "sha1-HVoNIPsScHx1imVfa7xDhrWTDWg=",
+      "dev": true,
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "3.0.0",
+      "resolved": "http://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-map": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/p-map/download/p-map-1.2.0.tgz",
+      "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=",
+      "dev": true
+    },
+    "p-try": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-2.0.0.tgz",
+      "integrity": "sha1-hQgLuHxkaI+keZb+j3376CEXYLE=",
+      "dev": true
+    },
+    "pako": {
+      "version": "1.0.8",
+      "resolved": "http://registry.npm.taobao.org/pako/download/pako-1.0.8.tgz",
+      "integrity": "sha1-aESJCqucY1r4aK1f7MYuisu6PqQ=",
+      "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"
+      }
+    },
+    "parchment": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz",
+      "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg=="
+    },
+    "parent-module": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/parent-module/download/parent-module-1.0.0.tgz",
+      "integrity": "sha1-3yUL3FOR9KCF+1idrXYfWta4ZbU=",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0"
+      },
+      "dependencies": {
+        "callsites": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/callsites/download/callsites-3.0.0.tgz",
+          "integrity": "sha1-+361abcq16RYEvk/2UMKPkELPdM=",
+          "dev": true
+        }
+      }
+    },
+    "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": "http://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"
+      }
+    },
+    "parseurl": {
+      "version": "1.3.2",
+      "resolved": "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.2.tgz",
+      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+      "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.0",
+      "resolved": "http://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.0.tgz",
+      "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+      "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": "http://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="
+    },
+    "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": "http://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=",
+      "dev": true
+    },
+    "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": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/pkg-dir/download/pkg-dir-3.0.0.tgz",
+      "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=",
+      "dev": true,
+      "requires": {
+        "find-up": "^3.0.0"
+      }
+    },
+    "platform": {
+      "version": "1.3.5",
+      "resolved": "http://registry.npm.taobao.org/platform/download/platform-1.3.5.tgz",
+      "integrity": "sha1-+2lYxpbgfikY0u7aDwvJRI1zNEQ="
+    },
+    "pluralize": {
+      "version": "7.0.0",
+      "resolved": "http://registry.npm.taobao.org/pluralize/download/pluralize-7.0.0.tgz",
+      "integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c=",
+      "dev": true
+    },
+    "portfinder": {
+      "version": "1.0.20",
+      "resolved": "http://registry.npm.taobao.org/portfinder/download/portfinder-1.0.20.tgz",
+      "integrity": "sha1-vqaGMuVLLhOrewxHdem0G/Jw5Eo=",
+      "dev": true,
+      "requires": {
+        "async": "^1.5.2",
+        "debug": "^2.2.0",
+        "mkdirp": "0.5.x"
+      },
+      "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"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/ms/download/ms-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.14",
+      "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-7.0.14.tgz",
+      "integrity": "sha1-RSftaxyg2CxTzl7BogQcI0a71uU=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.2",
+        "source-map": "^0.6.1",
+        "supports-color": "^6.1.0"
+      },
+      "dependencies": {
+        "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
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "http://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"
+          }
+        }
+      }
+    },
+    "postcss-calc": {
+      "version": "7.0.1",
+      "resolved": "http://registry.npm.taobao.org/postcss-calc/download/postcss-calc-7.0.1.tgz",
+      "integrity": "sha1-Ntd7qwI7Dsu5eJ2E3LI8SUEUVDY=",
+      "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": "http://registry.npm.taobao.org/postcss-colormin/download/postcss-colormin-4.0.3.tgz",
+      "integrity": "sha1-rgYLzpPteUrHEmTwgTLVUJVr04E=",
+      "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-convert-values": {
+      "version": "4.0.1",
+      "resolved": "http://registry.npm.taobao.org/postcss-convert-values/download/postcss-convert-values-4.0.1.tgz",
+      "integrity": "sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-discard-comments": {
+      "version": "4.0.2",
+      "resolved": "http://registry.npm.taobao.org/postcss-discard-comments/download/postcss-discard-comments-4.0.2.tgz",
+      "integrity": "sha1-H7q9LCRr/2qq15l7KwkY9NevQDM=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-duplicates": {
+      "version": "4.0.2",
+      "resolved": "http://registry.npm.taobao.org/postcss-discard-duplicates/download/postcss-discard-duplicates-4.0.2.tgz",
+      "integrity": "sha1-P+EzzTyCKC5VD8myORdqkge3hOs=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-empty": {
+      "version": "4.0.1",
+      "resolved": "http://registry.npm.taobao.org/postcss-discard-empty/download/postcss-discard-empty-4.0.1.tgz",
+      "integrity": "sha1-yMlR6fc+2UKAGUWERKAq2Qu592U=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-overridden": {
+      "version": "4.0.1",
+      "resolved": "http://registry.npm.taobao.org/postcss-discard-overridden/download/postcss-discard-overridden-4.0.1.tgz",
+      "integrity": "sha1-ZSrvipZybwKfXj4AFG7npOdV/1c=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-load-config": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/postcss-load-config/download/postcss-load-config-2.0.0.tgz",
+      "integrity": "sha1-8TEt2/WRLNdHF3CDxe96GdYu5IQ=",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^4.0.0",
+        "import-cwd": "^2.0.0"
+      },
+      "dependencies": {
+        "cosmiconfig": {
+          "version": "4.0.0",
+          "resolved": "http://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-4.0.0.tgz",
+          "integrity": "sha1-dgORVJWAu9LfHlYrwXexPCkJctw=",
+          "dev": true,
+          "requires": {
+            "is-directory": "^0.3.1",
+            "js-yaml": "^3.9.0",
+            "parse-json": "^4.0.0",
+            "require-from-string": "^2.0.1"
+          }
+        }
+      }
+    },
+    "postcss-loader": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/postcss-loader/download/postcss-loader-3.0.0.tgz",
+      "integrity": "sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0=",
+      "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": "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"
+          }
+        }
+      }
+    },
+    "postcss-merge-longhand": {
+      "version": "4.0.11",
+      "resolved": "http://registry.npm.taobao.org/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz",
+      "integrity": "sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ=",
+      "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": "http://registry.npm.taobao.org/postcss-merge-rules/download/postcss-merge-rules-4.0.3.tgz",
+      "integrity": "sha1-NivqT/Wh+Y5AdacTxsslrv75plA=",
+      "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": "http://registry.npm.taobao.org/postcss-minify-font-values/download/postcss-minify-font-values-4.0.2.tgz",
+      "integrity": "sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-minify-gradients": {
+      "version": "4.0.2",
+      "resolved": "http://registry.npm.taobao.org/postcss-minify-gradients/download/postcss-minify-gradients-4.0.2.tgz",
+      "integrity": "sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE=",
+      "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": "http://registry.npm.taobao.org/postcss-minify-params/download/postcss-minify-params-4.0.2.tgz",
+      "integrity": "sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ=",
+      "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": "http://registry.npm.taobao.org/postcss-minify-selectors/download/postcss-minify-selectors-4.0.2.tgz",
+      "integrity": "sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g=",
+      "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": "http://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-1.2.1.tgz",
+      "integrity": "sha1-3IfjQUjsfqtfeR981YSYMzdbdBo=",
+      "dev": true,
+      "requires": {
+        "postcss": "^6.0.1"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "6.0.23",
+          "resolved": "http://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"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "postcss-modules-local-by-default": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-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": "http://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"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "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": "http://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"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "postcss-modules-values": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/postcss-modules-values/download/postcss-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": "http://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"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "postcss-normalize-charset": {
+      "version": "4.0.1",
+      "resolved": "http://registry.npm.taobao.org/postcss-normalize-charset/download/postcss-normalize-charset-4.0.1.tgz",
+      "integrity": "sha1-izWt067oOhNrBHHg1ZvlilAoXdQ=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-normalize-display-values": {
+      "version": "4.0.2",
+      "resolved": "http://registry.npm.taobao.org/postcss-normalize-display-values/download/postcss-normalize-display-values-4.0.2.tgz",
+      "integrity": "sha1-Db4EpM6QY9RmftK+R2u4MMglk1o=",
+      "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": "http://registry.npm.taobao.org/postcss-normalize-positions/download/postcss-normalize-positions-4.0.2.tgz",
+      "integrity": "sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8=",
+      "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": "http://registry.npm.taobao.org/postcss-normalize-repeat-style/download/postcss-normalize-repeat-style-4.0.2.tgz",
+      "integrity": "sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw=",
+      "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": "http://registry.npm.taobao.org/postcss-normalize-string/download/postcss-normalize-string-4.0.2.tgz",
+      "integrity": "sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw=",
+      "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": "http://registry.npm.taobao.org/postcss-normalize-timing-functions/download/postcss-normalize-timing-functions-4.0.2.tgz",
+      "integrity": "sha1-jgCcoqOUnNr4rSPmtquZy159KNk=",
+      "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": "http://registry.npm.taobao.org/postcss-normalize-unicode/download/postcss-normalize-unicode-4.0.1.tgz",
+      "integrity": "sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs=",
+      "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": "http://registry.npm.taobao.org/postcss-normalize-url/download/postcss-normalize-url-4.0.1.tgz",
+      "integrity": "sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE=",
+      "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": "http://registry.npm.taobao.org/postcss-normalize-whitespace/download/postcss-normalize-whitespace-4.0.2.tgz",
+      "integrity": "sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI=",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-ordered-values": {
+      "version": "4.1.2",
+      "resolved": "http://registry.npm.taobao.org/postcss-ordered-values/download/postcss-ordered-values-4.1.2.tgz",
+      "integrity": "sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4=",
+      "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": "http://registry.npm.taobao.org/postcss-reduce-initial/download/postcss-reduce-initial-4.0.3.tgz",
+      "integrity": "sha1-f9QuvqXpyBRgljniwuhK4nC6SN8=",
+      "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": "http://registry.npm.taobao.org/postcss-reduce-transforms/download/postcss-reduce-transforms-4.0.2.tgz",
+      "integrity": "sha1-F++kBerMbge+NBSlyi0QdGgdTik=",
+      "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": "http://registry.npm.taobao.org/postcss-svgo/download/postcss-svgo-4.0.2.tgz",
+      "integrity": "sha1-F7mXvHEbMzurFDqu07jT1uPTglg=",
+      "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": "http://registry.npm.taobao.org/postcss-unique-selectors/download/postcss-unique-selectors-4.0.1.tgz",
+      "integrity": "sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w=",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "postcss": "^7.0.0",
+        "uniqs": "^2.0.0"
+      }
+    },
+    "postcss-value-parser": {
+      "version": "3.3.1",
+      "resolved": "http://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
+    },
+    "prettier": {
+      "version": "1.16.3",
+      "resolved": "http://registry.npm.taobao.org/prettier/download/prettier-1.16.3.tgz",
+      "integrity": "sha1-jGIWhFO63vcC80tFtu6JlXSmpl0=",
+      "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"
+      }
+    },
+    "printj": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/printj/download/printj-1.1.2.tgz",
+      "integrity": "sha1-2Q3rKXWoufYA+zoclOP0xTx4oiI="
+    },
+    "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.0",
+      "resolved": "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz",
+      "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=",
+      "dev": true
+    },
+    "progress": {
+      "version": "2.0.3",
+      "resolved": "http://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz",
+      "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=",
+      "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.4",
+      "resolved": "http://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.4.tgz",
+      "integrity": "sha1-7PxzO/Iv+Mb0B/onUye5q2fki5M=",
+      "dev": true,
+      "requires": {
+        "forwarded": "~0.1.2",
+        "ipaddr.js": "1.8.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.1.31",
+      "resolved": "http://registry.npm.taobao.org/psl/download/psl-1.1.31.tgz",
+      "integrity": "sha1-6aqG0BAbWxBcvpOsa3hM1UcnYYQ=",
+      "dev": true
+    },
+    "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": "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"
+      }
+    },
+    "pumpify": {
+      "version": "1.5.1",
+      "resolved": "http://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"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz",
+      "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=",
+      "dev": true
+    },
+    "q": {
+      "version": "1.5.1",
+      "resolved": "http://registry.npm.taobao.org/q/download/q-1.5.1.tgz",
+      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+      "dev": true
+    },
+    "qr": {
+      "version": "0.2.4",
+      "resolved": "http://registry.npm.taobao.org/qr/download/qr-0.2.4.tgz",
+      "integrity": "sha1-q7E5f+KEs4ThGPX7emolCO1iF7M=",
+      "requires": {
+        "benchmark": "^2.1.4",
+        "vows": ">= 0.5.8"
+      }
+    },
+    "qs": {
+      "version": "6.5.2",
+      "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz",
+      "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=",
+      "dev": true
+    },
+    "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.0",
+      "resolved": "http://registry.npm.taobao.org/querystringify/download/querystringify-2.1.0.tgz",
+      "integrity": "sha1-fe2N+/eHncxg0KZErGdUsoOtF+8=",
+      "dev": true
+    },
+    "quill": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz",
+      "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
+      "requires": {
+        "clone": "^2.1.1",
+        "deep-equal": "^1.0.1",
+        "eventemitter3": "^2.0.3",
+        "extend": "^3.0.2",
+        "parchment": "^1.1.4",
+        "quill-delta": "^3.6.2"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+          "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
+        },
+        "eventemitter3": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz",
+          "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo="
+        }
+      }
+    },
+    "quill-delta": {
+      "version": "3.6.3",
+      "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz",
+      "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
+      "requires": {
+        "deep-equal": "^1.0.1",
+        "extend": "^3.0.2",
+        "fast-diff": "1.1.2"
+      }
+    },
+    "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.0",
+      "resolved": "http://registry.npm.taobao.org/range-parser/download/range-parser-1.2.0.tgz",
+      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+      "dev": true
+    },
+    "raw-body": {
+      "version": "2.3.3",
+      "resolved": "http://registry.npm.taobao.org/raw-body/download/raw-body-2.3.3.tgz",
+      "integrity": "sha1-GzJOzmtXBuFThVvBFIxlu39uoMM=",
+      "dev": true,
+      "requires": {
+        "bytes": "3.0.0",
+        "http-errors": "1.6.3",
+        "iconv-lite": "0.4.23",
+        "unpipe": "1.0.0"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.4.23",
+          "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.23.tgz",
+          "integrity": "sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM=",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        }
+      }
+    },
+    "read-pkg": {
+      "version": "4.0.1",
+      "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-4.0.1.tgz",
+      "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=",
+      "dev": true,
+      "requires": {
+        "normalize-package-data": "^2.3.2",
+        "parse-json": "^4.0.0",
+        "pify": "^3.0.0"
+      }
+    },
+    "read-pkg-up": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz",
+      "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+      "dev": true,
+      "requires": {
+        "find-up": "^2.0.0",
+        "read-pkg": "^2.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "2.1.0",
+          "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz",
+          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "http://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"
+          }
+        },
+        "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": "http://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-try": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "dev": true
+        },
+        "path-type": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz",
+          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+          "dev": true,
+          "requires": {
+            "pify": "^2.0.0"
+          }
+        },
+        "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": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz",
+          "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^2.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^2.0.0"
+          }
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.6",
+      "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-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": "http://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz",
+      "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.11",
+        "micromatch": "^3.1.10",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "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": "7.0.0",
+      "resolved": "http://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-7.0.0.tgz",
+      "integrity": "sha1-EHQFr8xKGQ7F7UUOyqAO0Mr6ekw=",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.4.0"
+      }
+    },
+    "regenerator-runtime": {
+      "version": "0.12.1",
+      "resolved": "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.12.1.tgz",
+      "integrity": "sha1-+hpxVEdkwDb4xJsToIsllMn4oN4="
+    },
+    "regenerator-transform": {
+      "version": "0.13.3",
+      "resolved": "http://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.13.3.tgz",
+      "integrity": "sha1-JkvZ/zioziSwbgY2SWsshWtXvLs=",
+      "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.5",
+      "resolved": "http://registry.npm.taobao.org/regexp-tree/download/regexp-tree-0.1.5.tgz",
+      "integrity": "sha1-fNcfyhcZjQS0F279eXE/KZgAk5c=",
+      "dev": true
+    },
+    "regexpp": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/regexpp/download/regexpp-1.1.0.tgz",
+      "integrity": "sha1-DjUW3Qt5BPQT0tQZPc5GGMOmias=",
+      "dev": true
+    },
+    "regexpu-core": {
+      "version": "4.4.0",
+      "resolved": "http://registry.npm.taobao.org/regexpu-core/download/regexpu-core-4.4.0.tgz",
+      "integrity": "sha1-jUPg0SZog5aXIDRecMJ17grsDTI=",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.4.0",
+        "regenerate-unicode-properties": "^7.0.0",
+        "regjsgen": "^0.5.0",
+        "regjsparser": "^0.6.0",
+        "unicode-match-property-ecmascript": "^1.0.4",
+        "unicode-match-property-value-ecmascript": "^1.0.2"
+      }
+    },
+    "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.2",
+      "resolved": "http://registry.npm.taobao.org/renderkid/download/renderkid-2.0.2.tgz",
+      "integrity": "sha1-EtMQ8lU2DAetj94lP2yeneNy0qo=",
+      "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": "http://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
+    },
+    "request": {
+      "version": "2.88.0",
+      "resolved": "http://registry.npm.taobao.org/request/download/request-2.88.0.tgz",
+      "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=",
+      "dev": true,
+      "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-from-string": {
+      "version": "2.0.2",
+      "resolved": "http://registry.npm.taobao.org/require-from-string/download/require-from-string-2.0.2.tgz",
+      "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=",
+      "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
+    },
+    "require-uncached": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.taobao.org/require-uncached/download/require-uncached-1.0.3.tgz",
+      "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+      "dev": true,
+      "requires": {
+        "caller-path": "^0.1.0",
+        "resolve-from": "^1.0.0"
+      }
+    },
+    "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
+    },
+    "resize-observer-polyfill": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+    },
+    "resolve": {
+      "version": "1.10.0",
+      "resolved": "http://registry.npm.taobao.org/resolve/download/resolve-1.10.0.tgz",
+      "integrity": "sha1-O9qur0XMB/N1ZW39LlTtCBCxAbo=",
+      "dev": true,
+      "requires": {
+        "path-parse": "^1.0.6"
+      }
+    },
+    "resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^3.0.0"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz",
+          "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+          "dev": true
+        }
+      }
+    },
+    "resolve-from": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-1.0.1.tgz",
+      "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+      "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": "http://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": "http://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz",
+      "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=",
+      "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-async": {
+      "version": "2.3.0",
+      "resolved": "http://registry.npm.taobao.org/run-async/download/run-async-2.3.0.tgz",
+      "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+      "dev": true,
+      "requires": {
+        "is-promise": "^2.1.0"
+      }
+    },
+    "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"
+      }
+    },
+    "rx-lite": {
+      "version": "4.0.8",
+      "resolved": "http://registry.npm.taobao.org/rx-lite/download/rx-lite-4.0.8.tgz",
+      "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
+      "dev": true
+    },
+    "rx-lite-aggregates": {
+      "version": "4.0.8",
+      "resolved": "http://registry.npm.taobao.org/rx-lite-aggregates/download/rx-lite-aggregates-4.0.8.tgz",
+      "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+      "dev": true,
+      "requires": {
+        "rx-lite": "*"
+      }
+    },
+    "rxjs": {
+      "version": "6.4.0",
+      "resolved": "http://registry.npm.taobao.org/rxjs/download/rxjs-6.4.0.tgz",
+      "integrity": "sha1-87sP572n+2nerAwW8XtQsLh5BQQ=",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
+      "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "sax": {
+      "version": "1.2.4",
+      "resolved": "http://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz",
+      "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=",
+      "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"
+      }
+    },
+    "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.4",
+      "resolved": "http://registry.npm.taobao.org/selfsigned/download/selfsigned-1.10.4.tgz",
+      "integrity": "sha1-zdfsz8pO12NdR6CL8tXTB0CS4s0=",
+      "dev": true,
+      "requires": {
+        "node-forge": "0.7.5"
+      }
+    },
+    "semver": {
+      "version": "5.6.0",
+      "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.6.0.tgz",
+      "integrity": "sha1-fnQlb7qknHWqfHogXMInmcrIAAQ=",
+      "dev": true
+    },
+    "send": {
+      "version": "0.16.2",
+      "resolved": "http://registry.npm.taobao.org/send/download/send-0.16.2.tgz",
+      "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=",
+      "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.6.2",
+        "mime": "1.4.1",
+        "ms": "2.0.0",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.0",
+        "statuses": "~1.4.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"
+          }
+        },
+        "mime": {
+          "version": "1.4.1",
+          "resolved": "http://registry.npm.taobao.org/mime/download/mime-1.4.1.tgz",
+          "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "serialize-javascript": {
+      "version": "1.6.1",
+      "resolved": "http://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-1.6.1.tgz",
+      "integrity": "sha1-TR9pfsSUKahHym9EKip1USbE2Hk=",
+      "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": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "serve-static": {
+      "version": "1.13.2",
+      "resolved": "http://registry.npm.taobao.org/serve-static/download/serve-static-1.13.2.tgz",
+      "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=",
+      "dev": true,
+      "requires": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.2",
+        "send": "0.16.2"
+      }
+    },
+    "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.0",
+      "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-2.0.0.tgz",
+      "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=",
+      "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.0",
+      "resolved": "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz",
+      "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=",
+      "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"
+      }
+    },
+    "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": "http://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": "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.3.2.tgz",
+          "integrity": "sha1-RXSirlb3qyBolvtDHq7tBm/fjwM=",
+          "dev": true
+        }
+      }
+    },
+    "slash": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz",
+      "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=",
+      "dev": true
+    },
+    "slice-ansi": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-1.0.0.tgz",
+      "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=",
+      "dev": true,
+      "requires": {
+        "is-fullwidth-code-point": "^2.0.0"
+      }
+    },
+    "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": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "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": "http://registry.npm.taobao.org/sockjs/download/sockjs-0.3.19.tgz",
+      "integrity": "sha1-2Xa76ACve9IK4IWY1YI5NQiZPA0=",
+      "dev": true,
+      "requires": {
+        "faye-websocket": "^0.10.0",
+        "uuid": "^3.0.1"
+      }
+    },
+    "sockjs-client": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/sockjs-client/download/sockjs-client-1.3.0.tgz",
+      "integrity": "sha1-EvydbLZj2lc509xftuhofalcsXc=",
+      "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": "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz",
+          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "faye-websocket": {
+          "version": "0.11.1",
+          "resolved": "http://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.11.1.tgz",
+          "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
+          "dev": true,
+          "requires": {
+            "websocket-driver": ">=0.5.1"
+          }
+        }
+      }
+    },
+    "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.5.7",
+      "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+      "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.10",
+      "resolved": "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.10.tgz",
+      "integrity": "sha1-IhQIC8nVGDJRHuK6uW48L5NTEgw=",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      },
+      "dependencies": {
+        "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-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.3",
+      "resolved": "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.3.tgz",
+      "integrity": "sha1-gcDOjyFHR1YUi7tfO/wPNr8V124=",
+      "dev": true
+    },
+    "spdy": {
+      "version": "4.0.0",
+      "resolved": "http://registry.npm.taobao.org/spdy/download/spdy-4.0.0.tgz",
+      "integrity": "sha1-gfIitadDoymqEs6mo5DmDpthPFI=",
+      "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": "http://registry.npm.taobao.org/spdy-transport/download/spdy-transport-3.0.0.tgz",
+      "integrity": "sha1-ANSGOmQArXXfkzYaFghgXl3NzzE=",
+      "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.1.1",
+          "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-3.1.1.tgz",
+          "integrity": "sha1-7Wu8bFuliwkAOf8YzmcFFXla6wY=",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "http://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
+    },
+    "ssf": {
+      "version": "0.10.2",
+      "resolved": "http://registry.npm.taobao.org/ssf/download/ssf-0.10.2.tgz",
+      "integrity": "sha1-ZbK0/N/ZZ7yOg4OkE0kAmJMRWXY=",
+      "requires": {
+        "frac": "~1.1.2"
+      }
+    },
+    "sshpk": {
+      "version": "1.16.1",
+      "resolved": "http://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz",
+      "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=",
+      "dev": true,
+      "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": "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"
+      }
+    },
+    "stable": {
+      "version": "0.1.8",
+      "resolved": "http://registry.npm.taobao.org/stable/download/stable-0.1.8.tgz",
+      "integrity": "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=",
+      "dev": true
+    },
+    "stackframe": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/stackframe/download/stackframe-1.0.4.tgz",
+      "integrity": "sha1-NXskqZL5Qny6a1RdlqFO0svKGHs=",
+      "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.4.0",
+      "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.4.0.tgz",
+      "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=",
+      "dev": true
+    },
+    "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
+    },
+    "string-width": {
+      "version": "2.1.1",
+      "resolved": "http://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": "http://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.0.0",
+      "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.0.0.tgz",
+      "integrity": "sha1-949otdCGbCCyybjGG1KYUI3IdW8=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^4.0.0"
+      }
+    },
+    "strip-bom": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+      "dev": true
+    },
+    "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-indent": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/strip-indent/download/strip-indent-2.0.0.tgz",
+      "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+      "dev": true
+    },
+    "strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+      "dev": true
+    },
+    "stylehacks": {
+      "version": "4.0.3",
+      "resolved": "http://registry.npm.taobao.org/stylehacks/download/stylehacks-4.0.3.tgz",
+      "integrity": "sha1-Zxj8r00eB9ihMYaQiB6NlnJqcdU=",
+      "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"
+          }
+        }
+      }
+    },
+    "stylus": {
+      "version": "0.54.5",
+      "resolved": "http://registry.npm.taobao.org/stylus/download/stylus-0.54.5.tgz",
+      "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=",
+      "dev": true,
+      "requires": {
+        "css-parse": "1.7.x",
+        "debug": "*",
+        "glob": "7.0.x",
+        "mkdirp": "0.5.x",
+        "sax": "0.5.x",
+        "source-map": "0.1.x"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.0.6",
+          "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.0.6.tgz",
+          "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.2",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "sax": {
+          "version": "0.5.8",
+          "resolved": "http://registry.npm.taobao.org/sax/download/sax-0.5.8.tgz",
+          "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.1.43",
+          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.1.43.tgz",
+          "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+          "dev": true,
+          "requires": {
+            "amdefine": ">=0.0.4"
+          }
+        }
+      }
+    },
+    "stylus-loader": {
+      "version": "3.0.2",
+      "resolved": "http://registry.npm.taobao.org/stylus-loader/download/stylus-loader-3.0.2.tgz",
+      "integrity": "sha1-J6cGQgsFo44DjnyssVNXjUUFE8Y=",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.0.2",
+        "lodash.clonedeep": "^4.5.0",
+        "when": "~3.6.x"
+      }
+    },
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "http://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"
+      }
+    },
+    "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.1.1",
+      "resolved": "http://registry.npm.taobao.org/svgo/download/svgo-1.1.1.tgz",
+      "integrity": "sha1-EjhLAzNbzs2Fz6X04zdf7WccuYU=",
+      "dev": true,
+      "requires": {
+        "coa": "~2.0.1",
+        "colors": "~1.1.2",
+        "css-select": "^2.0.0",
+        "css-select-base-adapter": "~0.1.0",
+        "css-tree": "1.0.0-alpha.28",
+        "css-url-regex": "^1.1.0",
+        "csso": "^3.5.0",
+        "js-yaml": "^3.12.0",
+        "mkdirp": "~0.5.1",
+        "object.values": "^1.0.4",
+        "sax": "~1.2.4",
+        "stable": "~0.1.6",
+        "unquote": "~1.1.1",
+        "util.promisify": "~1.0.0"
+      }
+    },
+    "table": {
+      "version": "4.0.2",
+      "resolved": "http://registry.npm.taobao.org/table/download/table-4.0.2.tgz",
+      "integrity": "sha1-ozRHN1OR52atNNNIbm4q7chNLjY=",
+      "dev": true,
+      "requires": {
+        "ajv": "^5.2.3",
+        "ajv-keywords": "^2.1.0",
+        "chalk": "^2.1.0",
+        "lodash": "^4.17.4",
+        "slice-ansi": "1.0.0",
+        "string-width": "^2.1.1"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "^4.6.0",
+            "fast-deep-equal": "^1.0.0",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.3.0"
+          }
+        },
+        "ajv-keywords": {
+          "version": "2.1.1",
+          "resolved": "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-2.1.1.tgz",
+          "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+          "dev": true
+        },
+        "fast-deep-equal": {
+          "version": "1.1.0",
+          "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.1.0.tgz",
+          "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+          "dev": true
+        },
+        "json-schema-traverse": {
+          "version": "0.3.1",
+          "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz",
+          "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+          "dev": true
+        }
+      }
+    },
+    "tapable": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/tapable/download/tapable-1.1.1.tgz",
+      "integrity": "sha1-TSl5I8WnKkI2DeKrUtrfquwAAY4=",
+      "dev": true
+    },
+    "terser": {
+      "version": "3.16.1",
+      "resolved": "http://registry.npm.taobao.org/terser/download/terser-3.16.1.tgz",
+      "integrity": "sha1-Ww3U+h/9CwtDwkk7LDZP0XkWBJM=",
+      "dev": true,
+      "requires": {
+        "commander": "~2.17.1",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.9"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "terser-webpack-plugin": {
+      "version": "1.2.2",
+      "resolved": "http://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-1.2.2.tgz",
+      "integrity": "sha1-m/86iRrWFIVafd4NcH99takn49k=",
+      "dev": true,
+      "requires": {
+        "cacache": "^11.0.2",
+        "find-cache-dir": "^2.0.0",
+        "schema-utils": "^1.0.0",
+        "serialize-javascript": "^1.4.0",
+        "source-map": "^0.6.1",
+        "terser": "^3.16.1",
+        "webpack-sources": "^1.1.0",
+        "worker-farm": "^1.5.2"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "http://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+      "dev": true
+    },
+    "thread-loader": {
+      "version": "2.1.2",
+      "resolved": "http://registry.npm.taobao.org/thread-loader/download/thread-loader-2.1.2.tgz",
+      "integrity": "sha1-9YXdOOhSx/nN7V0JKZIQgUj16zA=",
+      "dev": true,
+      "requires": {
+        "loader-runner": "^2.3.1",
+        "loader-utils": "^1.1.0",
+        "neo-async": "^2.6.0"
+      }
+    },
+    "throttle-debounce": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
+      "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+      "dev": true
+    },
+    "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": "http://registry.npm.taobao.org/thunky/download/thunky-1.0.3.tgz",
+      "integrity": "sha1-9d9zJFNAewkZHa5z4qjMc/OBqCY=",
+      "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
+    },
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "http://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz",
+      "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=",
+      "dev": true,
+      "requires": {
+        "os-tmpdir": "~1.0.2"
+      }
+    },
+    "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": "http://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"
+      }
+    },
+    "topo": {
+      "version": "3.0.3",
+      "resolved": "http://registry.npm.taobao.org/topo/download/topo-3.0.3.tgz",
+      "integrity": "sha1-1aZ/suaTB+vusIQC7Coqb1962Vw=",
+      "dev": true,
+      "requires": {
+        "hoek": "6.x.x"
+      }
+    },
+    "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=",
+      "dev": true,
+      "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=",
+          "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
+    },
+    "tryer": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/tryer/download/tryer-1.0.1.tgz",
+      "integrity": "sha1-8shUBoALmw90yfdGW4HqrSQSUvg=",
+      "dev": true
+    },
+    "tslib": {
+      "version": "1.9.3",
+      "resolved": "http://registry.npm.taobao.org/tslib/download/tslib-1.9.3.tgz",
+      "integrity": "sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY=",
+      "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=",
+      "dev": true,
+      "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=",
+      "dev": true
+    },
+    "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-is": {
+      "version": "1.6.16",
+      "resolved": "http://registry.npm.taobao.org/type-is/download/type-is-1.6.16.tgz",
+      "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=",
+      "dev": true,
+      "requires": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.18"
+      }
+    },
+    "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.9",
+      "resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.9.tgz",
+      "integrity": "sha1-rwLxgMEgfXZDLkc+0koo9KeCuuM=",
+      "dev": true,
+      "requires": {
+        "commander": "~2.17.1",
+        "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "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.0.2",
+      "resolved": "http://registry.npm.taobao.org/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.0.2.tgz",
+      "integrity": "sha1-nx3HaSbWzPRSMQVk/YNKzgWWY9Q=",
+      "dev": true
+    },
+    "unicode-property-aliases-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.0.4.tgz",
+      "integrity": "sha1-WlM/MbQxfqdvF9gH+g0RZUYRHdA=",
+      "dev": true
+    },
+    "union-value": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/union-value/download/union-value-1.0.0.tgz",
+      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^0.4.3"
+      },
+      "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"
+          }
+        },
+        "set-value": {
+          "version": "0.4.3",
+          "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-0.4.3.tgz",
+          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-extendable": "^0.1.1",
+            "is-plain-object": "^2.0.1",
+            "to-object-path": "^0.3.0"
+          }
+        }
+      }
+    },
+    "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.1",
+      "resolved": "http://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.1.tgz",
+      "integrity": "sha1-Xp7cbRzo+yZNsYpQfvm9hURFHKY=",
+      "dev": true,
+      "requires": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
+    "universalify": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz",
+      "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=",
+      "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": "http://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.0",
+      "resolved": "http://registry.npm.taobao.org/upath/download/upath-1.1.0.tgz",
+      "integrity": "sha1-NSVll+RqWB20eT0M5H+prr/J+r0=",
+      "dev": true
+    },
+    "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=",
+      "dev": true,
+      "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": "http://registry.npm.taobao.org/url-loader/download/url-loader-1.1.2.tgz",
+      "integrity": "sha1-uXHRkbg69pPF4/6kBkvp4fLX+Ng=",
+      "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": "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"
+          }
+        }
+      }
+    },
+    "url-parse": {
+      "version": "1.4.4",
+      "resolved": "http://registry.npm.taobao.org/url-parse/download/url-parse-1.4.4.tgz",
+      "integrity": "sha1-ysFVbpX6oDA2kf7Fz51aG8NGSPg=",
+      "dev": true,
+      "requires": {
+        "querystringify": "^2.0.0",
+        "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": "http://registry.npm.taobao.org/util/download/util-0.11.1.tgz",
+      "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3"
+      }
+    },
+    "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": "http://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz",
+      "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=",
+      "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=",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "vant": {
+      "version": "2.12.13",
+      "resolved": "https://registry.npm.taobao.org/vant/download/vant-2.12.13.tgz?cache=0&sync_timestamp=1618130670186&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvant%2Fdownload%2Fvant-2.12.13.tgz",
+      "integrity": "sha1-Bp+kKWvNJibBwfTfRR3J1a50LsM=",
+      "requires": {
+        "@babel/runtime": "7.x",
+        "@vant/icons": "1.5.2",
+        "@vant/popperjs": "^1.0.0",
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
+        "vue-lazyload": "1.2.3"
+      },
+      "dependencies": {
+        "@vue/babel-helper-vue-jsx-merge-props": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.2.1.tgz?cache=0&sync_timestamp=1602851174430&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-helper-vue-jsx-merge-props%2Fdownload%2F%40vue%2Fbabel-helper-vue-jsx-merge-props-1.2.1.tgz",
+          "integrity": "sha1-MWJKelBfsU2h1YAjclpMXycOaoE="
+        }
+      }
+    },
+    "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.2",
+      "resolved": "http://registry.npm.taobao.org/vendors/download/vendors-1.0.2.tgz",
+      "integrity": "sha1-f8te759WI7FWvOqJ7DfWNnbyGAE=",
+      "dev": true
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
+    },
+    "vm-browserify": {
+      "version": "0.0.4",
+      "resolved": "http://registry.npm.taobao.org/vm-browserify/download/vm-browserify-0.0.4.tgz",
+      "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+      "dev": true,
+      "requires": {
+        "indexof": "0.0.1"
+      }
+    },
+    "vows": {
+      "version": "0.8.2",
+      "resolved": "http://registry.npm.taobao.org/vows/download/vows-0.8.2.tgz",
+      "integrity": "sha1-aR95qybM3oC6cm3en+yOc9a88us=",
+      "requires": {
+        "diff": "~1.0.8",
+        "eyes": "~0.1.6",
+        "glob": "^7.1.2"
+      }
+    },
+    "vue": {
+      "version": "2.6.6",
+      "resolved": "http://registry.npm.taobao.org/vue/download/vue-2.6.6.tgz",
+      "integrity": "sha1-3eQeSDwRxGp79SOQn08vgWq2DSU="
+    },
+    "vue-bus": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/vue-bus/-/vue-bus-1.2.0.tgz",
+      "integrity": "sha512-9Rg3YqiCaNEew9rQpLnxCd8bare/mnOkbcejOHzgmuAzt/LUCVQX2yaUN9veH2NfM1isJ+jZK4cYMPhOuj6bSA=="
+    },
+    "vue-eslint-parser": {
+      "version": "2.0.3",
+      "resolved": "http://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-2.0.3.tgz",
+      "integrity": "sha1-wmjJbG2Uz+PZOKX3WTlZsMozYNE=",
+      "dev": true,
+      "requires": {
+        "debug": "^3.1.0",
+        "eslint-scope": "^3.7.1",
+        "eslint-visitor-keys": "^1.0.0",
+        "espree": "^3.5.2",
+        "esquery": "^1.0.0",
+        "lodash": "^4.17.4"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz",
+          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "eslint-scope": {
+          "version": "3.7.3",
+          "resolved": "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-3.7.3.tgz",
+          "integrity": "sha1-u1ByANPRf2AkdjYWC0gmKEsQhTU=",
+          "dev": true,
+          "requires": {
+            "esrecurse": "^4.1.0",
+            "estraverse": "^4.1.1"
+          }
+        }
+      }
+    },
+    "vue-hot-reload-api": {
+      "version": "2.3.2",
+      "resolved": "http://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.2.tgz",
+      "integrity": "sha1-H8wUle/+CKeQkJtGv3tcTP628hs=",
+      "dev": true
+    },
+    "vue-lazyload": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npm.taobao.org/vue-lazyload/download/vue-lazyload-1.2.3.tgz?cache=0&sync_timestamp=1613791460988&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-lazyload%2Fdownload%2Fvue-lazyload-1.2.3.tgz",
+      "integrity": "sha1-kB+ewVx+bKeHgaK65KNDaGve2yw="
+    },
+    "vue-loader": {
+      "version": "15.6.4",
+      "resolved": "http://registry.npm.taobao.org/vue-loader/download/vue-loader-15.6.4.tgz",
+      "integrity": "sha1-6m6kjK2kJNoswjBElTd2eOSw9qc=",
+      "dev": true,
+      "requires": {
+        "@vue/component-compiler-utils": "^2.5.1",
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.1.0",
+        "vue-hot-reload-api": "^2.3.0",
+        "vue-style-loader": "^4.1.0"
+      }
+    },
+    "vue-quill-editor": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/vue-quill-editor/-/vue-quill-editor-3.0.6.tgz",
+      "integrity": "sha512-g20oSZNWg8Hbu41Kinjd55e235qVWPLfg4NvsLW6d+DhgBTFbEuMpcWlUdrD6qT3+Noim6DRu18VLM9lVShXOQ==",
+      "requires": {
+        "object-assign": "^4.1.1",
+        "quill": "^1.3.4"
+      }
+    },
+    "vue-router": {
+      "version": "3.0.2",
+      "resolved": "http://registry.npm.taobao.org/vue-router/download/vue-router-3.0.2.tgz",
+      "integrity": "sha1-3txnr+bE4rwlaCyLHCqMDXx+Vr4="
+    },
+    "vue-style-loader": {
+      "version": "4.1.2",
+      "resolved": "http://registry.npm.taobao.org/vue-style-loader/download/vue-style-loader-4.1.2.tgz",
+      "integrity": "sha1-3t80mAbyXOtOZPOtfApE+6c1/Pg=",
+      "dev": true,
+      "requires": {
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.0.2"
+      }
+    },
+    "vue-template-compiler": {
+      "version": "2.6.6",
+      "resolved": "http://registry.npm.taobao.org/vue-template-compiler/download/vue-template-compiler-2.6.6.tgz",
+      "integrity": "sha1-qAesvz1Rlx03IddeyxuSe1F8GgI=",
+      "dev": true,
+      "requires": {
+        "de-indent": "^1.0.2",
+        "he": "^1.1.0"
+      }
+    },
+    "vue-template-es2015-compiler": {
+      "version": "1.8.2",
+      "resolved": "http://registry.npm.taobao.org/vue-template-es2015-compiler/download/vue-template-es2015-compiler-1.8.2.tgz",
+      "integrity": "sha1-3XPoC6WLtl3XqKoq7vYInPYRbyo=",
+      "dev": true
+    },
+    "vuex": {
+      "version": "3.1.0",
+      "resolved": "http://registry.npm.taobao.org/vuex/download/vuex-3.1.0.tgz",
+      "integrity": "sha1-Y0uBUVzwz+l2vR/+lgF1XlH4Q7k="
+    },
+    "wangeditor": {
+      "version": "3.1.1",
+      "resolved": "https://registry.nlark.com/wangeditor/download/wangeditor-3.1.1.tgz?cache=0&sync_timestamp=1625190725869&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwangeditor%2Fdownload%2Fwangeditor-3.1.1.tgz",
+      "integrity": "sha1-+9PB1JdpI8nt67hbKdMLNVEq0Dk=",
+      "dev": true
+    },
+    "watchpack": {
+      "version": "1.6.0",
+      "resolved": "http://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": "http://registry.npm.taobao.org/wbuf/download/wbuf-1.7.3.tgz",
+      "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=",
+      "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": "http://registry.npm.taobao.org/webpack/download/webpack-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.0.4",
+      "resolved": "http://registry.npm.taobao.org/webpack-bundle-analyzer/download/webpack-bundle-analyzer-3.0.4.tgz",
+      "integrity": "sha1-CVY4SHpmQWLxnjsvt+YhtwAq9Lg=",
+      "dev": true,
+      "requires": {
+        "acorn": "^5.7.3",
+        "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.10",
+        "mkdirp": "^0.5.1",
+        "opener": "^1.5.1",
+        "ws": "^6.0.0"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.19.0",
+          "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz",
+          "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=",
+          "dev": true
+        }
+      }
+    },
+    "webpack-chain": {
+      "version": "4.12.1",
+      "resolved": "http://registry.npm.taobao.org/webpack-chain/download/webpack-chain-4.12.1.tgz",
+      "integrity": "sha1-bIQ5u7KrVQlS1g4eqTGRQZBsAqY=",
+      "dev": true,
+      "requires": {
+        "deepmerge": "^1.5.2",
+        "javascript-stringify": "^1.6.0"
+      }
+    },
+    "webpack-dev-middleware": {
+      "version": "3.4.0",
+      "resolved": "http://registry.npm.taobao.org/webpack-dev-middleware/download/webpack-dev-middleware-3.4.0.tgz",
+      "integrity": "sha1-ETL+zJAm/ZDw7O2sXL/3XR+0WJA=",
+      "dev": true,
+      "requires": {
+        "memory-fs": "~0.4.1",
+        "mime": "^2.3.1",
+        "range-parser": "^1.0.3",
+        "webpack-log": "^2.0.0"
+      }
+    },
+    "webpack-dev-server": {
+      "version": "3.1.14",
+      "resolved": "http://registry.npm.taobao.org/webpack-dev-server/download/webpack-dev-server-3.1.14.tgz",
+      "integrity": "sha1-YPsim5l/xaCh/GI3QhAwGAlZ1Gk=",
+      "dev": true,
+      "requires": {
+        "ansi-html": "0.0.7",
+        "bonjour": "^3.5.0",
+        "chokidar": "^2.0.0",
+        "compression": "^1.5.2",
+        "connect-history-api-fallback": "^1.3.0",
+        "debug": "^3.1.0",
+        "del": "^3.0.0",
+        "express": "^4.16.2",
+        "html-entities": "^1.2.0",
+        "http-proxy-middleware": "~0.18.0",
+        "import-local": "^2.0.0",
+        "internal-ip": "^3.0.1",
+        "ip": "^1.1.5",
+        "killable": "^1.0.0",
+        "loglevel": "^1.4.1",
+        "opn": "^5.1.0",
+        "portfinder": "^1.0.9",
+        "schema-utils": "^1.0.0",
+        "selfsigned": "^1.9.1",
+        "semver": "^5.6.0",
+        "serve-index": "^1.7.2",
+        "sockjs": "0.3.19",
+        "sockjs-client": "1.3.0",
+        "spdy": "^4.0.0",
+        "strip-ansi": "^3.0.0",
+        "supports-color": "^5.1.0",
+        "url": "^0.11.0",
+        "webpack-dev-middleware": "3.4.0",
+        "webpack-log": "^2.0.0",
+        "yargs": "12.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
+        },
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz",
+          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.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"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "http://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"
+          }
+        }
+      }
+    },
+    "webpack-log": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/webpack-log/download/webpack-log-2.0.0.tgz",
+      "integrity": "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8=",
+      "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"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "websocket-driver": {
+      "version": "0.7.0",
+      "resolved": "http://registry.npm.taobao.org/websocket-driver/download/websocket-driver-0.7.0.tgz",
+      "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
+      "dev": true,
+      "requires": {
+        "http-parser-js": ">=0.4.0",
+        "websocket-extensions": ">=0.1.1"
+      }
+    },
+    "websocket-extensions": {
+      "version": "0.1.3",
+      "resolved": "http://registry.npm.taobao.org/websocket-extensions/download/websocket-extensions-0.1.3.tgz",
+      "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=",
+      "dev": true
+    },
+    "when": {
+      "version": "3.6.4",
+      "resolved": "http://registry.npm.taobao.org/when/download/when-3.6.4.tgz",
+      "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=",
+      "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
+    },
+    "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.6.0",
+      "resolved": "http://registry.npm.taobao.org/worker-farm/download/worker-farm-1.6.0.tgz",
+      "integrity": "sha1-rsxAWXb6talVJhgIRvDboojzpKA=",
+      "dev": true,
+      "requires": {
+        "errno": "~0.1.7"
+      }
+    },
+    "wrap-ansi": {
+      "version": "2.1.0",
+      "resolved": "http://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": {
+        "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
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "http://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"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "http://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"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "http://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"
+          }
+        }
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    },
+    "write": {
+      "version": "0.2.1",
+      "resolved": "http://registry.npm.taobao.org/write/download/write-0.2.1.tgz",
+      "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+      "dev": true,
+      "requires": {
+        "mkdirp": "^0.5.1"
+      }
+    },
+    "ws": {
+      "version": "6.1.4",
+      "resolved": "http://registry.npm.taobao.org/ws/download/ws-6.1.4.tgz",
+      "integrity": "sha1-W1yIAK+rkl6UzLKdFTyNAsF3bvk=",
+      "dev": true,
+      "requires": {
+        "async-limiter": "~1.0.0"
+      }
+    },
+    "xlsx": {
+      "version": "0.14.1",
+      "resolved": "http://registry.npm.taobao.org/xlsx/download/xlsx-0.14.1.tgz",
+      "integrity": "sha1-7O31Nr0elAVUhv9IT1iI3KqJvT0=",
+      "requires": {
+        "adler-32": "~1.2.0",
+        "cfb": "^1.1.0",
+        "codepage": "~1.14.0",
+        "commander": "~2.17.1",
+        "crc-32": "~1.2.0",
+        "exit-on-epipe": "~1.0.1",
+        "ssf": "~0.10.2"
+      }
+    },
+    "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.1",
+      "resolved": "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz",
+      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+      "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": "3.0.3",
+      "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-3.0.3.tgz",
+      "integrity": "sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=",
+      "dev": true
+    },
+    "yargs": {
+      "version": "12.0.2",
+      "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-12.0.2.tgz",
+      "integrity": "sha1-/lgjQ2k5KvM+y+9TgZFx7/D1qtw=",
+      "dev": true,
+      "requires": {
+        "cliui": "^4.0.0",
+        "decamelize": "^2.0.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": "^10.1.0"
+      }
+    },
+    "yargs-parser": {
+      "version": "10.1.0",
+      "resolved": "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-10.1.0.tgz",
+      "integrity": "sha1-cgImW4n36eny5XZeD+c1qQXtuqg=",
+      "dev": true,
+      "requires": {
+        "camelcase": "^4.1.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        }
+      }
+    },
+    "yorkie": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/yorkie/download/yorkie-2.0.0.tgz",
+      "integrity": "sha1-kkEZEtQ1IU4SxRwq4Qk+VLa7g9k=",
+      "dev": true,
+      "requires": {
+        "execa": "^0.8.0",
+        "is-ci": "^1.0.10",
+        "normalize-path": "^1.0.0",
+        "strip-indent": "^2.0.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "0.8.0",
+          "resolved": "http://registry.npm.taobao.org/execa/download/execa-0.8.0.tgz",
+          "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^5.0.1",
+            "get-stream": "^3.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"
+          }
+        },
+        "get-stream": {
+          "version": "3.0.0",
+          "resolved": "http://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz",
+          "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+          "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"
+          }
+        },
+        "normalize-path": {
+          "version": "1.0.0",
+          "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-1.0.0.tgz",
+          "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=",
+          "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
+        }
+      }
+    },
+    "zrender": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-4.3.2.tgz",
+      "integrity": "sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g==",
+      "dev": true
+    }
+  }
+}

+ 68 - 0
package.json

@@ -0,0 +1,68 @@
+{
+  "name": "undefined-manage",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "axios": "^0.18.0",
+    "dayjs": "^1.10.4",
+    "element-ui": "^2.13.2",
+    "html2canvas": "^1.0.0-rc.7",
+    "qr": "^0.2.4",
+    "vant": "^2.12.13",
+    "vue": "^2.5.22",
+    "vue-bus": "^1.2.0",
+    "vue-quill-editor": "^3.0.6",
+    "vue-router": "^3.0.2",
+    "vuex": "^3.1.0",
+    "xlsx": "^0.14.1"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "^3.4.0",
+    "@vue/cli-plugin-eslint": "^3.4.0",
+    "@vue/cli-service": "^3.4.0",
+    "babel-eslint": "^10.0.1",
+    "babel-plugin-import": "^1.13.3",
+    "dayjs": "^1.10.4",
+    "echarts": "^4.9.0",
+    "eslint": "^5.14.1",
+    "eslint-config-standard": "^12.0.0",
+    "eslint-plugin-import": "^2.16.0",
+    "eslint-plugin-node": "^8.0.1",
+    "eslint-plugin-promise": "^4.0.1",
+    "eslint-plugin-standard": "^4.0.0",
+    "eslint-plugin-vue": "^5.0.0",
+    "stylus": "^0.54.5",
+    "stylus-loader": "^3.0.2",
+    "vue-template-compiler": "^2.5.21",
+    "wangeditor": "^3.1.1"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [
+      "plugin:vue/essential",
+      "eslint:recommended"
+    ],
+    "rules": {},
+    "parserOptions": {
+      "parser": "babel-eslint"
+    }
+  },
+  "postcss": {
+    "plugins": {
+      "autoprefixer": {}
+    }
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
+}

File diff suppressed because it is too large
+ 0 - 0
public/area.json


+ 3 - 0
public/domain.js

@@ -0,0 +1,3 @@
+//production模式下,可在此设置api请求domain以覆盖工程内配置
+//示例:'yjxgy.test.datounet.com',不要协议、端口号和斜杠
+var domain = ''

BIN
public/favicon.ico


+ 12235 - 0
public/geojson.json

@@ -0,0 +1,12235 @@
+{
+  "type": "FeatureCollection",
+  "features": [
+    {
+      "type": "Feature",
+      "id": "xin_jiang",
+      "properties": {
+        "name": "新疆",
+        "cp": [
+          84.9023,
+          41.748
+        ],
+        "childNum": 18
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              96.416,
+              42.7588
+            ],
+            [
+              96.416,
+              42.7148
+            ],
+            [
+              95.9766,
+              42.4951
+            ],
+            [
+              96.0645,
+              42.3193
+            ],
+            [
+              96.2402,
+              42.2314
+            ],
+            [
+              95.9766,
+              41.9238
+            ],
+            [
+              95.2734,
+              41.6162
+            ],
+            [
+              95.1855,
+              41.792
+            ],
+            [
+              94.5703,
+              41.4844
+            ],
+            [
+              94.043,
+              41.0889
+            ],
+            [
+              93.8672,
+              40.6934
+            ],
+            [
+              93.0762,
+              40.6494
+            ],
+            [
+              92.6367,
+              39.6387
+            ],
+            [
+              92.373,
+              39.3311
+            ],
+            [
+              92.373,
+              39.1113
+            ],
+            [
+              92.373,
+              39.0234
+            ],
+            [
+              90.1758,
+              38.4961
+            ],
+            [
+              90.3516,
+              38.2324
+            ],
+            [
+              90.6152,
+              38.3203
+            ],
+            [
+              90.5273,
+              37.8369
+            ],
+            [
+              91.0547,
+              37.4414
+            ],
+            [
+              91.3184,
+              37.0898
+            ],
+            [
+              90.7031,
+              36.7822
+            ],
+            [
+              90.791,
+              36.6064
+            ],
+            [
+              91.0547,
+              36.5186
+            ],
+            [
+              91.0547,
+              36.0791
+            ],
+            [
+              90.8789,
+              36.0352
+            ],
+            [
+              90,
+              36.2549
+            ],
+            [
+              89.9121,
+              36.0791
+            ],
+            [
+              89.7363,
+              36.0791
+            ],
+            [
+              89.209,
+              36.2988
+            ],
+            [
+              88.7695,
+              36.3428
+            ],
+            [
+              88.5938,
+              36.4746
+            ],
+            [
+              87.3633,
+              36.4307
+            ],
+            [
+              86.2207,
+              36.167
+            ],
+            [
+              86.1328,
+              35.8594
+            ],
+            [
+              85.6055,
+              35.6836
+            ],
+            [
+              85.0781,
+              35.7275
+            ],
+            [
+              84.1992,
+              35.376
+            ],
+            [
+              83.1445,
+              35.4199
+            ],
+            [
+              82.8809,
+              35.6836
+            ],
+            [
+              82.4414,
+              35.7275
+            ],
+            [
+              82.002,
+              35.332
+            ],
+            [
+              81.6504,
+              35.2441
+            ],
+            [
+              80.4199,
+              35.4199
+            ],
+            [
+              80.2441,
+              35.2881
+            ],
+            [
+              80.332,
+              35.1563
+            ],
+            [
+              80.2441,
+              35.2002
+            ],
+            [
+              79.8926,
+              34.8047
+            ],
+            [
+              79.8047,
+              34.4971
+            ],
+            [
+              79.1016,
+              34.4531
+            ],
+            [
+              79.0137,
+              34.3213
+            ],
+            [
+              78.2227,
+              34.7168
+            ],
+            [
+              78.0469,
+              35.2441
+            ],
+            [
+              78.0469,
+              35.5078
+            ],
+            [
+              77.4316,
+              35.4639
+            ],
+            [
+              76.8164,
+              35.6396
+            ],
+            [
+              76.5527,
+              35.8594
+            ],
+            [
+              76.2012,
+              35.8154
+            ],
+            [
+              75.9375,
+              36.0352
+            ],
+            [
+              76.0254,
+              36.4746
+            ],
+            [
+              75.8496,
+              36.6943
+            ],
+            [
+              75.498,
+              36.7383
+            ],
+            [
+              75.4102,
+              36.958
+            ],
+            [
+              75.0586,
+              37.002
+            ],
+            [
+              74.8828,
+              36.9141
+            ],
+            [
+              74.7949,
+              37.0459
+            ],
+            [
+              74.5313,
+              37.0898
+            ],
+            [
+              74.5313,
+              37.2217
+            ],
+            [
+              74.8828,
+              37.2217
+            ],
+            [
+              75.1465,
+              37.4414
+            ],
+            [
+              74.8828,
+              37.5732
+            ],
+            [
+              74.9707,
+              37.749
+            ],
+            [
+              74.8828,
+              38.4521
+            ],
+            [
+              74.3555,
+              38.6719
+            ],
+            [
+              74.1797,
+              38.6719
+            ],
+            [
+              74.0918,
+              38.54
+            ],
+            [
+              73.8281,
+              38.584
+            ],
+            [
+              73.7402,
+              38.8477
+            ],
+            [
+              73.8281,
+              38.9795
+            ],
+            [
+              73.4766,
+              39.375
+            ],
+            [
+              73.916,
+              39.5068
+            ],
+            [
+              73.916,
+              39.6826
+            ],
+            [
+              73.8281,
+              39.7705
+            ],
+            [
+              74.0039,
+              40.0342
+            ],
+            [
+              74.8828,
+              40.3418
+            ],
+            [
+              74.7949,
+              40.5176
+            ],
+            [
+              75.2344,
+              40.4297
+            ],
+            [
+              75.5859,
+              40.6494
+            ],
+            [
+              75.7617,
+              40.2979
+            ],
+            [
+              76.377,
+              40.3857
+            ],
+            [
+              76.9043,
+              41.001
+            ],
+            [
+              77.6074,
+              41.001
+            ],
+            [
+              78.1348,
+              41.2207
+            ],
+            [
+              78.1348,
+              41.3965
+            ],
+            [
+              80.1563,
+              42.0557
+            ],
+            [
+              80.2441,
+              42.2754
+            ],
+            [
+              80.1563,
+              42.627
+            ],
+            [
+              80.2441,
+              42.8467
+            ],
+            [
+              80.5078,
+              42.8906
+            ],
+            [
+              80.4199,
+              43.0664
+            ],
+            [
+              80.7715,
+              43.1982
+            ],
+            [
+              80.4199,
+              44.165
+            ],
+            [
+              80.4199,
+              44.6045
+            ],
+            [
+              79.9805,
+              44.8242
+            ],
+            [
+              79.9805,
+              44.9561
+            ],
+            [
+              81.7383,
+              45.3955
+            ],
+            [
+              82.0898,
+              45.2197
+            ],
+            [
+              82.5293,
+              45.2197
+            ],
+            [
+              82.2656,
+              45.6592
+            ],
+            [
+              83.0566,
+              47.2412
+            ],
+            [
+              83.6719,
+              47.0215
+            ],
+            [
+              84.7266,
+              47.0215
+            ],
+            [
+              84.9023,
+              46.8896
+            ],
+            [
+              85.5176,
+              47.0654
+            ],
+            [
+              85.6934,
+              47.2852
+            ],
+            [
+              85.5176,
+              48.1201
+            ],
+            [
+              85.7813,
+              48.4277
+            ],
+            [
+              86.5723,
+              48.5596
+            ],
+            [
+              86.8359,
+              48.8232
+            ],
+            [
+              86.748,
+              48.9551
+            ],
+            [
+              86.8359,
+              49.1309
+            ],
+            [
+              87.8027,
+              49.1748
+            ],
+            [
+              87.8906,
+              48.999
+            ],
+            [
+              87.7148,
+              48.9111
+            ],
+            [
+              88.0664,
+              48.7354
+            ],
+            [
+              87.9785,
+              48.6035
+            ],
+            [
+              88.5059,
+              48.3838
+            ],
+            [
+              88.6816,
+              48.1641
+            ],
+            [
+              89.1211,
+              47.9883
+            ],
+            [
+              89.5605,
+              48.0322
+            ],
+            [
+              89.7363,
+              47.8564
+            ],
+            [
+              90.0879,
+              47.8564
+            ],
+            [
+              90.3516,
+              47.6807
+            ],
+            [
+              90.5273,
+              47.2412
+            ],
+            [
+              90.8789,
+              46.9775
+            ],
+            [
+              91.0547,
+              46.582
+            ],
+            [
+              90.8789,
+              46.3184
+            ],
+            [
+              91.0547,
+              46.0107
+            ],
+            [
+              90.7031,
+              45.7471
+            ],
+            [
+              90.7031,
+              45.5273
+            ],
+            [
+              90.8789,
+              45.2197
+            ],
+            [
+              91.582,
+              45.0879
+            ],
+            [
+              93.5156,
+              44.9561
+            ],
+            [
+              94.7461,
+              44.3408
+            ],
+            [
+              95.3613,
+              44.2969
+            ],
+            [
+              95.3613,
+              44.0332
+            ],
+            [
+              95.5371,
+              43.9014
+            ],
+            [
+              95.8887,
+              43.2422
+            ],
+            [
+              96.3281,
+              42.9346
+            ],
+            [
+              96.416,
+              42.7588
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "xi_zang",
+      "properties": {
+        "name": "西藏",
+        "cp": [
+          88.7695,
+          31.6846
+        ],
+        "childNum": 7
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              79.0137,
+              34.3213
+            ],
+            [
+              79.1016,
+              34.4531
+            ],
+            [
+              79.8047,
+              34.4971
+            ],
+            [
+              79.8926,
+              34.8047
+            ],
+            [
+              80.2441,
+              35.2002
+            ],
+            [
+              80.332,
+              35.1563
+            ],
+            [
+              80.2441,
+              35.2881
+            ],
+            [
+              80.4199,
+              35.4199
+            ],
+            [
+              81.6504,
+              35.2441
+            ],
+            [
+              82.002,
+              35.332
+            ],
+            [
+              82.4414,
+              35.7275
+            ],
+            [
+              82.8809,
+              35.6836
+            ],
+            [
+              83.1445,
+              35.4199
+            ],
+            [
+              84.1992,
+              35.376
+            ],
+            [
+              85.0781,
+              35.7275
+            ],
+            [
+              85.6055,
+              35.6836
+            ],
+            [
+              86.1328,
+              35.8594
+            ],
+            [
+              86.2207,
+              36.167
+            ],
+            [
+              87.3633,
+              36.4307
+            ],
+            [
+              88.5938,
+              36.4746
+            ],
+            [
+              88.7695,
+              36.3428
+            ],
+            [
+              89.209,
+              36.2988
+            ],
+            [
+              89.7363,
+              36.0791
+            ],
+            [
+              89.3848,
+              36.0352
+            ],
+            [
+              89.4727,
+              35.9033
+            ],
+            [
+              89.7363,
+              35.7715
+            ],
+            [
+              89.7363,
+              35.4199
+            ],
+            [
+              89.4727,
+              35.376
+            ],
+            [
+              89.4727,
+              35.2441
+            ],
+            [
+              89.5605,
+              34.8926
+            ],
+            [
+              89.8242,
+              34.8486
+            ],
+            [
+              89.7363,
+              34.6729
+            ],
+            [
+              89.8242,
+              34.3652
+            ],
+            [
+              89.6484,
+              34.0137
+            ],
+            [
+              90.0879,
+              33.4863
+            ],
+            [
+              90.7031,
+              33.1348
+            ],
+            [
+              91.4063,
+              33.1348
+            ],
+            [
+              91.9336,
+              32.8271
+            ],
+            [
+              92.1973,
+              32.8271
+            ],
+            [
+              92.2852,
+              32.7393
+            ],
+            [
+              92.9883,
+              32.7393
+            ],
+            [
+              93.5156,
+              32.4756
+            ],
+            [
+              93.7793,
+              32.5635
+            ],
+            [
+              94.1309,
+              32.4316
+            ],
+            [
+              94.6582,
+              32.6074
+            ],
+            [
+              95.1855,
+              32.4316
+            ],
+            [
+              95.0098,
+              32.2998
+            ],
+            [
+              95.1855,
+              32.3438
+            ],
+            [
+              95.2734,
+              32.2119
+            ],
+            [
+              95.3613,
+              32.168
+            ],
+            [
+              95.3613,
+              31.9922
+            ],
+            [
+              95.4492,
+              31.8164
+            ],
+            [
+              95.8008,
+              31.6846
+            ],
+            [
+              95.9766,
+              31.8164
+            ],
+            [
+              96.1523,
+              31.5967
+            ],
+            [
+              96.2402,
+              31.9482
+            ],
+            [
+              96.5039,
+              31.7285
+            ],
+            [
+              96.8555,
+              31.6846
+            ],
+            [
+              96.7676,
+              31.9922
+            ],
+            [
+              97.2949,
+              32.0801
+            ],
+            [
+              97.3828,
+              32.5635
+            ],
+            [
+              97.7344,
+              32.5195
+            ],
+            [
+              98.1738,
+              32.3438
+            ],
+            [
+              98.4375,
+              31.8604
+            ],
+            [
+              98.877,
+              31.4209
+            ],
+            [
+              98.6133,
+              31.2012
+            ],
+            [
+              98.9648,
+              30.7617
+            ],
+            [
+              99.1406,
+              29.2676
+            ],
+            [
+              98.9648,
+              29.1357
+            ],
+            [
+              98.9648,
+              28.8281
+            ],
+            [
+              98.7891,
+              28.8721
+            ],
+            [
+              98.7891,
+              29.0039
+            ],
+            [
+              98.7012,
+              28.916
+            ],
+            [
+              98.6133,
+              28.5205
+            ],
+            [
+              98.7891,
+              28.3447
+            ],
+            [
+              98.7012,
+              28.2129
+            ],
+            [
+              98.3496,
+              28.125
+            ],
+            [
+              98.2617,
+              28.3887
+            ],
+            [
+              98.1738,
+              28.125
+            ],
+            [
+              97.5586,
+              28.5205
+            ],
+            [
+              97.2949,
+              28.0811
+            ],
+            [
+              97.3828,
+              27.9053
+            ],
+            [
+              97.0313,
+              27.7295
+            ],
+            [
+              96.5039,
+              28.125
+            ],
+            [
+              95.7129,
+              28.2568
+            ],
+            [
+              95.3613,
+              28.125
+            ],
+            [
+              95.2734,
+              27.9492
+            ],
+            [
+              94.2188,
+              27.5537
+            ],
+            [
+              93.8672,
+              27.0264
+            ],
+            [
+              93.6035,
+              26.9385
+            ],
+            [
+              92.1094,
+              26.8506
+            ],
+            [
+              92.0215,
+              27.4658
+            ],
+            [
+              91.582,
+              27.5537
+            ],
+            [
+              91.582,
+              27.9053
+            ],
+            [
+              91.4063,
+              28.0371
+            ],
+            [
+              91.0547,
+              27.8613
+            ],
+            [
+              90.7031,
+              28.0811
+            ],
+            [
+              89.8242,
+              28.2129
+            ],
+            [
+              89.6484,
+              28.1689
+            ],
+            [
+              89.1211,
+              27.5977
+            ],
+            [
+              89.1211,
+              27.334
+            ],
+            [
+              89.0332,
+              27.2021
+            ],
+            [
+              88.7695,
+              27.4219
+            ],
+            [
+              88.8574,
+              27.9932
+            ],
+            [
+              88.6816,
+              28.125
+            ],
+            [
+              88.1543,
+              27.9053
+            ],
+            [
+              87.8906,
+              27.9492
+            ],
+            [
+              87.7148,
+              27.8174
+            ],
+            [
+              87.0996,
+              27.8174
+            ],
+            [
+              86.748,
+              28.125
+            ],
+            [
+              86.5723,
+              28.125
+            ],
+            [
+              86.4844,
+              27.9053
+            ],
+            [
+              86.1328,
+              28.125
+            ],
+            [
+              86.0449,
+              27.9053
+            ],
+            [
+              85.6934,
+              28.3447
+            ],
+            [
+              85.6055,
+              28.2568
+            ],
+            [
+              85.166,
+              28.3447
+            ],
+            [
+              85.166,
+              28.6523
+            ],
+            [
+              84.9023,
+              28.5645
+            ],
+            [
+              84.4629,
+              28.7402
+            ],
+            [
+              84.2871,
+              28.8721
+            ],
+            [
+              84.1992,
+              29.2236
+            ],
+            [
+              84.1113,
+              29.2676
+            ],
+            [
+              83.584,
+              29.1797
+            ],
+            [
+              83.2324,
+              29.5752
+            ],
+            [
+              82.1777,
+              30.0586
+            ],
+            [
+              82.0898,
+              30.3223
+            ],
+            [
+              81.3867,
+              30.3662
+            ],
+            [
+              81.2109,
+              30.0146
+            ],
+            [
+              81.0352,
+              30.2344
+            ],
+            [
+              80.0684,
+              30.5859
+            ],
+            [
+              79.7168,
+              30.9375
+            ],
+            [
+              79.0137,
+              31.0693
+            ],
+            [
+              78.75,
+              31.333
+            ],
+            [
+              78.8379,
+              31.5967
+            ],
+            [
+              78.6621,
+              31.8164
+            ],
+            [
+              78.75,
+              31.9043
+            ],
+            [
+              78.4863,
+              32.124
+            ],
+            [
+              78.3984,
+              32.5195
+            ],
+            [
+              78.75,
+              32.6953
+            ],
+            [
+              78.9258,
+              32.3438
+            ],
+            [
+              79.2773,
+              32.5635
+            ],
+            [
+              79.1016,
+              33.1787
+            ],
+            [
+              78.6621,
+              33.6621
+            ],
+            [
+              78.6621,
+              34.1016
+            ],
+            [
+              78.9258,
+              34.1455
+            ],
+            [
+              79.0137,
+              34.3213
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "nei_meng_gu",
+      "properties": {
+        "name": "内蒙古",
+        "cp": [
+          117.5977,
+          44.3408
+        ],
+        "childNum": 12
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              97.207,
+              42.8027
+            ],
+            [
+              99.4922,
+              42.583
+            ],
+            [
+              100.8105,
+              42.6709
+            ],
+            [
+              101.7773,
+              42.4951
+            ],
+            [
+              102.041,
+              42.2314
+            ],
+            [
+              102.7441,
+              42.1436
+            ],
+            [
+              103.3594,
+              41.8799
+            ],
+            [
+              103.8867,
+              41.792
+            ],
+            [
+              104.502,
+              41.8799
+            ],
+            [
+              104.502,
+              41.6602
+            ],
+            [
+              105.0293,
+              41.5723
+            ],
+            [
+              105.7324,
+              41.9238
+            ],
+            [
+              107.4023,
+              42.4512
+            ],
+            [
+              109.4238,
+              42.4512
+            ],
+            [
+              110.3906,
+              42.7588
+            ],
+            [
+              111.0059,
+              43.3301
+            ],
+            [
+              111.9727,
+              43.6816
+            ],
+            [
+              111.9727,
+              43.8135
+            ],
+            [
+              111.4453,
+              44.3848
+            ],
+            [
+              111.7969,
+              45
+            ],
+            [
+              111.9727,
+              45.0879
+            ],
+            [
+              113.6426,
+              44.7363
+            ],
+            [
+              114.1699,
+              44.9561
+            ],
+            [
+              114.5215,
+              45.3955
+            ],
+            [
+              115.6641,
+              45.4395
+            ],
+            [
+              116.1914,
+              45.7031
+            ],
+            [
+              116.2793,
+              45.9668
+            ],
+            [
+              116.543,
+              46.2744
+            ],
+            [
+              117.334,
+              46.3623
+            ],
+            [
+              117.4219,
+              46.582
+            ],
+            [
+              117.7734,
+              46.5381
+            ],
+            [
+              118.3008,
+              46.7578
+            ],
+            [
+              118.7402,
+              46.7139
+            ],
+            [
+              118.916,
+              46.7578
+            ],
+            [
+              119.0918,
+              46.6699
+            ],
+            [
+              119.707,
+              46.626
+            ],
+            [
+              119.9707,
+              46.7139
+            ],
+            [
+              119.707,
+              47.1973
+            ],
+            [
+              118.4766,
+              47.9883
+            ],
+            [
+              117.8613,
+              48.0322
+            ],
+            [
+              117.334,
+              47.6807
+            ],
+            [
+              116.8066,
+              47.9004
+            ],
+            [
+              116.1914,
+              47.8564
+            ],
+            [
+              115.9277,
+              47.6807
+            ],
+            [
+              115.5762,
+              47.9004
+            ],
+            [
+              115.4883,
+              48.1641
+            ],
+            [
+              115.8398,
+              48.252
+            ],
+            [
+              115.8398,
+              48.5596
+            ],
+            [
+              116.7188,
+              49.834
+            ],
+            [
+              117.7734,
+              49.5264
+            ],
+            [
+              118.5645,
+              49.9219
+            ],
+            [
+              119.2676,
+              50.0977
+            ],
+            [
+              119.3555,
+              50.3174
+            ],
+            [
+              119.1797,
+              50.3613
+            ],
+            [
+              119.5313,
+              50.7568
+            ],
+            [
+              119.5313,
+              50.8887
+            ],
+            [
+              119.707,
+              51.0645
+            ],
+            [
+              120.1465,
+              51.6797
+            ],
+            [
+              120.6738,
+              51.9434
+            ],
+            [
+              120.7617,
+              52.1191
+            ],
+            [
+              120.7617,
+              52.251
+            ],
+            [
+              120.5859,
+              52.3389
+            ],
+            [
+              120.6738,
+              52.5146
+            ],
+            [
+              120.4102,
+              52.6465
+            ],
+            [
+              120.0586,
+              52.6025
+            ],
+            [
+              120.0586,
+              52.7344
+            ],
+            [
+              120.8496,
+              53.2617
+            ],
+            [
+              121.4648,
+              53.3496
+            ],
+            [
+              121.8164,
+              53.042
+            ],
+            [
+              121.2012,
+              52.5586
+            ],
+            [
+              121.6406,
+              52.4268
+            ],
+            [
+              121.7285,
+              52.2949
+            ],
+            [
+              121.9922,
+              52.2949
+            ],
+            [
+              122.168,
+              52.5146
+            ],
+            [
+              122.6953,
+              52.251
+            ],
+            [
+              122.6074,
+              52.0752
+            ],
+            [
+              122.959,
+              51.3281
+            ],
+            [
+              123.3105,
+              51.2402
+            ],
+            [
+              123.6621,
+              51.3721
+            ],
+            [
+              124.3652,
+              51.2842
+            ],
+            [
+              124.541,
+              51.3721
+            ],
+            [
+              124.8926,
+              51.3721
+            ],
+            [
+              125.0684,
+              51.6357
+            ],
+            [
+              125.332,
+              51.6357
+            ],
+            [
+              126.0352,
+              51.0205
+            ],
+            [
+              125.7715,
+              50.7568
+            ],
+            [
+              125.7715,
+              50.5371
+            ],
+            [
+              125.332,
+              50.1416
+            ],
+            [
+              125.1563,
+              49.834
+            ],
+            [
+              125.2441,
+              49.1748
+            ],
+            [
+              124.8047,
+              49.1309
+            ],
+            [
+              124.4531,
+              48.1201
+            ],
+            [
+              124.2773,
+              48.5156
+            ],
+            [
+              122.4316,
+              47.373
+            ],
+            [
+              123.0469,
+              46.7139
+            ],
+            [
+              123.3984,
+              46.8896
+            ],
+            [
+              123.3984,
+              46.9775
+            ],
+            [
+              123.4863,
+              46.9775
+            ],
+            [
+              123.5742,
+              46.8457
+            ],
+            [
+              123.5742,
+              46.8896
+            ],
+            [
+              123.5742,
+              46.6699
+            ],
+            [
+              123.0469,
+              46.582
+            ],
+            [
+              123.2227,
+              46.2305
+            ],
+            [
+              122.7832,
+              46.0107
+            ],
+            [
+              122.6953,
+              45.7031
+            ],
+            [
+              122.4316,
+              45.8789
+            ],
+            [
+              122.2559,
+              45.791
+            ],
+            [
+              121.8164,
+              46.0107
+            ],
+            [
+              121.7285,
+              45.7471
+            ],
+            [
+              121.9043,
+              45.7031
+            ],
+            [
+              122.2559,
+              45.2637
+            ],
+            [
+              122.0801,
+              44.8682
+            ],
+            [
+              122.3438,
+              44.2529
+            ],
+            [
+              123.1348,
+              44.4727
+            ],
+            [
+              123.4863,
+              43.7256
+            ],
+            [
+              123.3105,
+              43.5059
+            ],
+            [
+              123.6621,
+              43.374
+            ],
+            [
+              123.5742,
+              43.0225
+            ],
+            [
+              123.3105,
+              42.9785
+            ],
+            [
+              123.1348,
+              42.8027
+            ],
+            [
+              122.7832,
+              42.7148
+            ],
+            [
+              122.3438,
+              42.8467
+            ],
+            [
+              122.3438,
+              42.6709
+            ],
+            [
+              121.9922,
+              42.7148
+            ],
+            [
+              121.7285,
+              42.4512
+            ],
+            [
+              121.4648,
+              42.4951
+            ],
+            [
+              120.498,
+              42.0996
+            ],
+            [
+              120.1465,
+              41.7041
+            ],
+            [
+              119.8828,
+              42.1875
+            ],
+            [
+              119.5313,
+              42.3633
+            ],
+            [
+              119.3555,
+              42.2754
+            ],
+            [
+              119.2676,
+              41.7041
+            ],
+            [
+              119.4434,
+              41.6162
+            ],
+            [
+              119.2676,
+              41.3086
+            ],
+            [
+              118.3887,
+              41.3086
+            ],
+            [
+              118.125,
+              41.748
+            ],
+            [
+              118.3008,
+              41.792
+            ],
+            [
+              118.3008,
+              42.0996
+            ],
+            [
+              118.125,
+              42.0557
+            ],
+            [
+              117.9492,
+              42.2314
+            ],
+            [
+              118.0371,
+              42.4072
+            ],
+            [
+              117.7734,
+              42.627
+            ],
+            [
+              117.5098,
+              42.583
+            ],
+            [
+              117.334,
+              42.4512
+            ],
+            [
+              116.8945,
+              42.4072
+            ],
+            [
+              116.8066,
+              42.0117
+            ],
+            [
+              116.2793,
+              42.0117
+            ],
+            [
+              116.0156,
+              41.792
+            ],
+            [
+              115.9277,
+              41.9238
+            ],
+            [
+              115.2246,
+              41.5723
+            ],
+            [
+              114.9609,
+              41.6162
+            ],
+            [
+              114.873,
+              42.0996
+            ],
+            [
+              114.5215,
+              42.1436
+            ],
+            [
+              114.1699,
+              41.792
+            ],
+            [
+              114.2578,
+              41.5723
+            ],
+            [
+              113.9063,
+              41.4404
+            ],
+            [
+              113.9941,
+              41.2207
+            ],
+            [
+              113.9063,
+              41.1328
+            ],
+            [
+              114.082,
+              40.7373
+            ],
+            [
+              114.082,
+              40.5176
+            ],
+            [
+              113.8184,
+              40.5176
+            ],
+            [
+              113.5547,
+              40.3418
+            ],
+            [
+              113.2031,
+              40.3857
+            ],
+            [
+              112.7637,
+              40.166
+            ],
+            [
+              112.3242,
+              40.2539
+            ],
+            [
+              111.9727,
+              39.5947
+            ],
+            [
+              111.4453,
+              39.6387
+            ],
+            [
+              111.3574,
+              39.4189
+            ],
+            [
+              111.0938,
+              39.375
+            ],
+            [
+              111.0938,
+              39.5947
+            ],
+            [
+              110.6543,
+              39.2871
+            ],
+            [
+              110.127,
+              39.4629
+            ],
+            [
+              110.2148,
+              39.2871
+            ],
+            [
+              109.8633,
+              39.2432
+            ],
+            [
+              109.9512,
+              39.1553
+            ],
+            [
+              108.9844,
+              38.3203
+            ],
+            [
+              109.0723,
+              38.0127
+            ],
+            [
+              108.8965,
+              37.9688
+            ],
+            [
+              108.8086,
+              38.0127
+            ],
+            [
+              108.7207,
+              37.7051
+            ],
+            [
+              108.1934,
+              37.6172
+            ],
+            [
+              107.666,
+              37.8809
+            ],
+            [
+              107.3145,
+              38.1006
+            ],
+            [
+              106.7871,
+              38.1885
+            ],
+            [
+              106.5234,
+              38.3203
+            ],
+            [
+              106.9629,
+              38.9795
+            ],
+            [
+              106.7871,
+              39.375
+            ],
+            [
+              106.3477,
+              39.2871
+            ],
+            [
+              105.9082,
+              38.7158
+            ],
+            [
+              105.8203,
+              37.793
+            ],
+            [
+              104.3262,
+              37.4414
+            ],
+            [
+              103.4473,
+              37.8369
+            ],
+            [
+              103.3594,
+              38.0127
+            ],
+            [
+              103.5352,
+              38.1445
+            ],
+            [
+              103.4473,
+              38.3643
+            ],
+            [
+              104.2383,
+              38.9795
+            ],
+            [
+              104.0625,
+              39.4189
+            ],
+            [
+              103.3594,
+              39.3311
+            ],
+            [
+              103.0078,
+              39.1113
+            ],
+            [
+              102.4805,
+              39.2432
+            ],
+            [
+              101.8652,
+              39.1113
+            ],
+            [
+              102.041,
+              38.8916
+            ],
+            [
+              101.7773,
+              38.6719
+            ],
+            [
+              101.3379,
+              38.7598
+            ],
+            [
+              101.25,
+              39.0234
+            ],
+            [
+              100.9863,
+              38.9355
+            ],
+            [
+              100.8105,
+              39.4189
+            ],
+            [
+              100.5469,
+              39.4189
+            ],
+            [
+              100.0195,
+              39.7705
+            ],
+            [
+              99.4922,
+              39.8584
+            ],
+            [
+              100.1074,
+              40.2539
+            ],
+            [
+              100.1953,
+              40.6494
+            ],
+            [
+              99.9316,
+              41.001
+            ],
+            [
+              99.2285,
+              40.8691
+            ],
+            [
+              99.0527,
+              40.6934
+            ],
+            [
+              98.9648,
+              40.7813
+            ],
+            [
+              98.7891,
+              40.6055
+            ],
+            [
+              98.5254,
+              40.7373
+            ],
+            [
+              98.6133,
+              40.6494
+            ],
+            [
+              98.3496,
+              40.5615
+            ],
+            [
+              98.3496,
+              40.9131
+            ],
+            [
+              97.4707,
+              41.4844
+            ],
+            [
+              97.8223,
+              41.6162
+            ],
+            [
+              97.8223,
+              41.748
+            ],
+            [
+              97.207,
+              42.8027
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "qing_hai",
+      "properties": {
+        "name": "青海",
+        "cp": [
+          96.2402,
+          35.4199
+        ],
+        "childNum": 8
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              89.7363,
+              36.0791
+            ],
+            [
+              89.9121,
+              36.0791
+            ],
+            [
+              90,
+              36.2549
+            ],
+            [
+              90.8789,
+              36.0352
+            ],
+            [
+              91.0547,
+              36.0791
+            ],
+            [
+              91.0547,
+              36.5186
+            ],
+            [
+              90.791,
+              36.6064
+            ],
+            [
+              90.7031,
+              36.7822
+            ],
+            [
+              91.3184,
+              37.0898
+            ],
+            [
+              91.0547,
+              37.4414
+            ],
+            [
+              90.5273,
+              37.8369
+            ],
+            [
+              90.6152,
+              38.3203
+            ],
+            [
+              90.3516,
+              38.2324
+            ],
+            [
+              90.1758,
+              38.4961
+            ],
+            [
+              92.373,
+              39.0234
+            ],
+            [
+              92.373,
+              39.1113
+            ],
+            [
+              93.1641,
+              39.1992
+            ],
+            [
+              93.1641,
+              38.9795
+            ],
+            [
+              93.6914,
+              38.9355
+            ],
+            [
+              93.8672,
+              38.7158
+            ],
+            [
+              94.3066,
+              38.7598
+            ],
+            [
+              94.5703,
+              38.3643
+            ],
+            [
+              95.0098,
+              38.4082
+            ],
+            [
+              95.4492,
+              38.2764
+            ],
+            [
+              95.7129,
+              38.3643
+            ],
+            [
+              96.2402,
+              38.1006
+            ],
+            [
+              96.416,
+              38.2324
+            ],
+            [
+              96.6797,
+              38.1885
+            ],
+            [
+              96.6797,
+              38.4521
+            ],
+            [
+              97.1191,
+              38.584
+            ],
+            [
+              97.0313,
+              39.1992
+            ],
+            [
+              98.1738,
+              38.8037
+            ],
+            [
+              98.3496,
+              39.0234
+            ],
+            [
+              98.6133,
+              38.9355
+            ],
+            [
+              98.7891,
+              39.0674
+            ],
+            [
+              99.1406,
+              38.9355
+            ],
+            [
+              99.8438,
+              38.3643
+            ],
+            [
+              100.1953,
+              38.2764
+            ],
+            [
+              100.0195,
+              38.4521
+            ],
+            [
+              100.1074,
+              38.4961
+            ],
+            [
+              100.459,
+              38.2764
+            ],
+            [
+              100.7227,
+              38.2324
+            ],
+            [
+              101.1621,
+              37.8369
+            ],
+            [
+              101.5137,
+              37.8809
+            ],
+            [
+              101.7773,
+              37.6172
+            ],
+            [
+              101.9531,
+              37.7051
+            ],
+            [
+              102.1289,
+              37.4414
+            ],
+            [
+              102.5684,
+              37.1777
+            ],
+            [
+              102.4805,
+              36.958
+            ],
+            [
+              102.6563,
+              36.8262
+            ],
+            [
+              102.5684,
+              36.7383
+            ],
+            [
+              102.832,
+              36.3428
+            ],
+            [
+              103.0078,
+              36.2549
+            ],
+            [
+              102.9199,
+              36.0791
+            ],
+            [
+              102.9199,
+              35.9033
+            ],
+            [
+              102.6563,
+              35.7715
+            ],
+            [
+              102.832,
+              35.5957
+            ],
+            [
+              102.4805,
+              35.5957
+            ],
+            [
+              102.3047,
+              35.4199
+            ],
+            [
+              102.3926,
+              35.2002
+            ],
+            [
+              101.9531,
+              34.8486
+            ],
+            [
+              101.9531,
+              34.6289
+            ],
+            [
+              102.2168,
+              34.4092
+            ],
+            [
+              102.1289,
+              34.2773
+            ],
+            [
+              101.6895,
+              34.1016
+            ],
+            [
+              100.9863,
+              34.3652
+            ],
+            [
+              100.8105,
+              34.2773
+            ],
+            [
+              101.25,
+              33.6621
+            ],
+            [
+              101.5137,
+              33.7061
+            ],
+            [
+              101.6016,
+              33.5303
+            ],
+            [
+              101.7773,
+              33.5303
+            ],
+            [
+              101.6895,
+              33.3105
+            ],
+            [
+              101.7773,
+              33.2227
+            ],
+            [
+              101.6016,
+              33.1348
+            ],
+            [
+              101.1621,
+              33.2227
+            ],
+            [
+              101.25,
+              32.6953
+            ],
+            [
+              100.7227,
+              32.6514
+            ],
+            [
+              100.7227,
+              32.5195
+            ],
+            [
+              100.3711,
+              32.7393
+            ],
+            [
+              100.1074,
+              32.6514
+            ],
+            [
+              100.1074,
+              32.8711
+            ],
+            [
+              99.8438,
+              33.0029
+            ],
+            [
+              99.7559,
+              32.7393
+            ],
+            [
+              99.2285,
+              32.915
+            ],
+            [
+              99.2285,
+              33.0469
+            ],
+            [
+              98.877,
+              33.1787
+            ],
+            [
+              98.4375,
+              34.0576
+            ],
+            [
+              97.8223,
+              34.1895
+            ],
+            [
+              97.6465,
+              34.1016
+            ],
+            [
+              97.7344,
+              33.9258
+            ],
+            [
+              97.3828,
+              33.8818
+            ],
+            [
+              97.4707,
+              33.5742
+            ],
+            [
+              97.7344,
+              33.3984
+            ],
+            [
+              97.3828,
+              32.8711
+            ],
+            [
+              97.4707,
+              32.6953
+            ],
+            [
+              97.7344,
+              32.5195
+            ],
+            [
+              97.3828,
+              32.5635
+            ],
+            [
+              97.2949,
+              32.0801
+            ],
+            [
+              96.7676,
+              31.9922
+            ],
+            [
+              96.8555,
+              31.6846
+            ],
+            [
+              96.5039,
+              31.7285
+            ],
+            [
+              96.2402,
+              31.9482
+            ],
+            [
+              96.1523,
+              31.5967
+            ],
+            [
+              95.9766,
+              31.8164
+            ],
+            [
+              95.8008,
+              31.6846
+            ],
+            [
+              95.4492,
+              31.8164
+            ],
+            [
+              95.3613,
+              31.9922
+            ],
+            [
+              95.3613,
+              32.168
+            ],
+            [
+              95.2734,
+              32.2119
+            ],
+            [
+              95.1855,
+              32.3438
+            ],
+            [
+              95.0098,
+              32.2998
+            ],
+            [
+              95.1855,
+              32.4316
+            ],
+            [
+              94.6582,
+              32.6074
+            ],
+            [
+              94.1309,
+              32.4316
+            ],
+            [
+              93.7793,
+              32.5635
+            ],
+            [
+              93.5156,
+              32.4756
+            ],
+            [
+              92.9883,
+              32.7393
+            ],
+            [
+              92.2852,
+              32.7393
+            ],
+            [
+              92.1973,
+              32.8271
+            ],
+            [
+              91.9336,
+              32.8271
+            ],
+            [
+              91.4063,
+              33.1348
+            ],
+            [
+              90.7031,
+              33.1348
+            ],
+            [
+              90.0879,
+              33.4863
+            ],
+            [
+              89.6484,
+              34.0137
+            ],
+            [
+              89.8242,
+              34.3652
+            ],
+            [
+              89.7363,
+              34.6729
+            ],
+            [
+              89.8242,
+              34.8486
+            ],
+            [
+              89.5605,
+              34.8926
+            ],
+            [
+              89.4727,
+              35.2441
+            ],
+            [
+              89.4727,
+              35.376
+            ],
+            [
+              89.7363,
+              35.4199
+            ],
+            [
+              89.7363,
+              35.7715
+            ],
+            [
+              89.4727,
+              35.9033
+            ],
+            [
+              89.3848,
+              36.0352
+            ],
+            [
+              89.7363,
+              36.0791
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "si_chuan",
+      "properties": {
+        "name": "四川",
+        "cp": [
+          102.9199,
+          30.1904
+        ],
+        "childNum": 21
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              101.7773,
+              33.5303
+            ],
+            [
+              101.8652,
+              33.5742
+            ],
+            [
+              101.9531,
+              33.4424
+            ],
+            [
+              101.8652,
+              33.0908
+            ],
+            [
+              102.4805,
+              33.4424
+            ],
+            [
+              102.2168,
+              33.9258
+            ],
+            [
+              102.9199,
+              34.3213
+            ],
+            [
+              103.0957,
+              34.1895
+            ],
+            [
+              103.1836,
+              33.7939
+            ],
+            [
+              104.1504,
+              33.6182
+            ],
+            [
+              104.2383,
+              33.3984
+            ],
+            [
+              104.4141,
+              33.3105
+            ],
+            [
+              104.3262,
+              33.2227
+            ],
+            [
+              104.4141,
+              33.0469
+            ],
+            [
+              104.3262,
+              32.8711
+            ],
+            [
+              104.4141,
+              32.7393
+            ],
+            [
+              105.2051,
+              32.6074
+            ],
+            [
+              105.3809,
+              32.7393
+            ],
+            [
+              105.3809,
+              32.8711
+            ],
+            [
+              105.4688,
+              32.915
+            ],
+            [
+              105.5566,
+              32.7393
+            ],
+            [
+              106.084,
+              32.8711
+            ],
+            [
+              106.084,
+              32.7393
+            ],
+            [
+              106.3477,
+              32.6514
+            ],
+            [
+              107.0508,
+              32.6953
+            ],
+            [
+              107.1387,
+              32.4756
+            ],
+            [
+              107.2266,
+              32.4316
+            ],
+            [
+              107.4023,
+              32.5195
+            ],
+            [
+              108.0176,
+              32.168
+            ],
+            [
+              108.2813,
+              32.2559
+            ],
+            [
+              108.5449,
+              32.2119
+            ],
+            [
+              108.3691,
+              32.168
+            ],
+            [
+              108.2813,
+              31.9043
+            ],
+            [
+              108.5449,
+              31.6846
+            ],
+            [
+              108.1934,
+              31.5088
+            ],
+            [
+              107.9297,
+              30.8496
+            ],
+            [
+              107.4902,
+              30.8496
+            ],
+            [
+              107.4023,
+              30.7617
+            ],
+            [
+              107.4902,
+              30.6299
+            ],
+            [
+              107.0508,
+              30.0146
+            ],
+            [
+              106.7871,
+              30.0146
+            ],
+            [
+              106.6113,
+              30.3223
+            ],
+            [
+              106.2598,
+              30.1904
+            ],
+            [
+              105.8203,
+              30.4541
+            ],
+            [
+              105.6445,
+              30.2783
+            ],
+            [
+              105.5566,
+              30.1025
+            ],
+            [
+              105.7324,
+              29.8828
+            ],
+            [
+              105.293,
+              29.5313
+            ],
+            [
+              105.4688,
+              29.3115
+            ],
+            [
+              105.7324,
+              29.2676
+            ],
+            [
+              105.8203,
+              28.96
+            ],
+            [
+              106.2598,
+              28.8721
+            ],
+            [
+              106.3477,
+              28.5205
+            ],
+            [
+              105.9961,
+              28.7402
+            ],
+            [
+              105.6445,
+              28.4326
+            ],
+            [
+              105.9082,
+              28.125
+            ],
+            [
+              106.1719,
+              28.125
+            ],
+            [
+              106.3477,
+              27.8174
+            ],
+            [
+              105.6445,
+              27.6416
+            ],
+            [
+              105.5566,
+              27.7734
+            ],
+            [
+              105.293,
+              27.7295
+            ],
+            [
+              105.2051,
+              27.9932
+            ],
+            [
+              105.0293,
+              28.0811
+            ],
+            [
+              104.8535,
+              27.9053
+            ],
+            [
+              104.4141,
+              27.9492
+            ],
+            [
+              104.3262,
+              28.0371
+            ],
+            [
+              104.4141,
+              28.125
+            ],
+            [
+              104.4141,
+              28.2568
+            ],
+            [
+              104.2383,
+              28.4326
+            ],
+            [
+              104.4141,
+              28.6084
+            ],
+            [
+              103.8867,
+              28.6523
+            ],
+            [
+              103.7988,
+              28.3008
+            ],
+            [
+              103.4473,
+              28.125
+            ],
+            [
+              103.4473,
+              27.7734
+            ],
+            [
+              102.9199,
+              27.29
+            ],
+            [
+              103.0078,
+              26.3672
+            ],
+            [
+              102.6563,
+              26.1914
+            ],
+            [
+              102.5684,
+              26.3672
+            ],
+            [
+              102.1289,
+              26.1035
+            ],
+            [
+              101.8652,
+              26.0596
+            ],
+            [
+              101.6016,
+              26.2354
+            ],
+            [
+              101.6895,
+              26.3672
+            ],
+            [
+              101.4258,
+              26.5869
+            ],
+            [
+              101.4258,
+              26.8066
+            ],
+            [
+              101.4258,
+              26.7188
+            ],
+            [
+              101.1621,
+              27.0264
+            ],
+            [
+              101.1621,
+              27.1582
+            ],
+            [
+              100.7227,
+              27.8613
+            ],
+            [
+              100.3711,
+              27.8174
+            ],
+            [
+              100.2832,
+              27.7295
+            ],
+            [
+              100.0195,
+              28.125
+            ],
+            [
+              100.1953,
+              28.3447
+            ],
+            [
+              99.668,
+              28.8281
+            ],
+            [
+              99.4043,
+              28.5205
+            ],
+            [
+              99.4043,
+              28.1689
+            ],
+            [
+              99.2285,
+              28.3008
+            ],
+            [
+              99.1406,
+              29.2676
+            ],
+            [
+              98.9648,
+              30.7617
+            ],
+            [
+              98.6133,
+              31.2012
+            ],
+            [
+              98.877,
+              31.4209
+            ],
+            [
+              98.4375,
+              31.8604
+            ],
+            [
+              98.1738,
+              32.3438
+            ],
+            [
+              97.7344,
+              32.5195
+            ],
+            [
+              97.4707,
+              32.6953
+            ],
+            [
+              97.3828,
+              32.8711
+            ],
+            [
+              97.7344,
+              33.3984
+            ],
+            [
+              97.4707,
+              33.5742
+            ],
+            [
+              97.3828,
+              33.8818
+            ],
+            [
+              97.7344,
+              33.9258
+            ],
+            [
+              97.6465,
+              34.1016
+            ],
+            [
+              97.8223,
+              34.1895
+            ],
+            [
+              98.4375,
+              34.0576
+            ],
+            [
+              98.877,
+              33.1787
+            ],
+            [
+              99.2285,
+              33.0469
+            ],
+            [
+              99.2285,
+              32.915
+            ],
+            [
+              99.7559,
+              32.7393
+            ],
+            [
+              99.8438,
+              33.0029
+            ],
+            [
+              100.1074,
+              32.8711
+            ],
+            [
+              100.1074,
+              32.6514
+            ],
+            [
+              100.3711,
+              32.7393
+            ],
+            [
+              100.7227,
+              32.5195
+            ],
+            [
+              100.7227,
+              32.6514
+            ],
+            [
+              101.25,
+              32.6953
+            ],
+            [
+              101.1621,
+              33.2227
+            ],
+            [
+              101.6016,
+              33.1348
+            ],
+            [
+              101.7773,
+              33.2227
+            ],
+            [
+              101.6895,
+              33.3105
+            ],
+            [
+              101.7773,
+              33.5303
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "hei_long_jiang",
+      "properties": {
+        "name": "黑龙江",
+        "cp": [
+          128.1445,
+          48.5156
+        ],
+        "childNum": 13
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              121.4648,
+              53.3496
+            ],
+            [
+              123.6621,
+              53.5693
+            ],
+            [
+              124.8926,
+              53.0859
+            ],
+            [
+              125.0684,
+              53.2178
+            ],
+            [
+              125.5957,
+              53.0859
+            ],
+            [
+              125.6836,
+              52.9102
+            ],
+            [
+              126.123,
+              52.7783
+            ],
+            [
+              126.0352,
+              52.6025
+            ],
+            [
+              126.2109,
+              52.5146
+            ],
+            [
+              126.3867,
+              52.2949
+            ],
+            [
+              126.3867,
+              52.207
+            ],
+            [
+              126.5625,
+              52.1631
+            ],
+            [
+              126.4746,
+              51.9434
+            ],
+            [
+              126.9141,
+              51.3721
+            ],
+            [
+              126.8262,
+              51.2842
+            ],
+            [
+              127.002,
+              51.3281
+            ],
+            [
+              126.9141,
+              51.1084
+            ],
+            [
+              127.2656,
+              50.7568
+            ],
+            [
+              127.3535,
+              50.2734
+            ],
+            [
+              127.6172,
+              50.2295
+            ],
+            [
+              127.5293,
+              49.8779
+            ],
+            [
+              127.793,
+              49.6143
+            ],
+            [
+              128.7598,
+              49.5703
+            ],
+            [
+              129.1113,
+              49.3506
+            ],
+            [
+              129.4629,
+              49.4385
+            ],
+            [
+              130.2539,
+              48.8672
+            ],
+            [
+              130.6934,
+              48.8672
+            ],
+            [
+              130.5176,
+              48.6475
+            ],
+            [
+              130.8691,
+              48.2959
+            ],
+            [
+              130.6934,
+              48.1201
+            ],
+            [
+              131.0449,
+              47.6807
+            ],
+            [
+              132.5391,
+              47.7246
+            ],
+            [
+              132.627,
+              47.9443
+            ],
+            [
+              133.0664,
+              48.1201
+            ],
+            [
+              133.5059,
+              48.1201
+            ],
+            [
+              134.209,
+              48.3838
+            ],
+            [
+              135.0879,
+              48.4277
+            ],
+            [
+              134.7363,
+              48.252
+            ],
+            [
+              134.5605,
+              47.9883
+            ],
+            [
+              134.7363,
+              47.6807
+            ],
+            [
+              134.5605,
+              47.4609
+            ],
+            [
+              134.3848,
+              47.4609
+            ],
+            [
+              134.209,
+              47.2852
+            ],
+            [
+              134.209,
+              47.1533
+            ],
+            [
+              133.8574,
+              46.5381
+            ],
+            [
+              133.9453,
+              46.2744
+            ],
+            [
+              133.5059,
+              45.835
+            ],
+            [
+              133.418,
+              45.5713
+            ],
+            [
+              133.2422,
+              45.5273
+            ],
+            [
+              133.0664,
+              45.1318
+            ],
+            [
+              132.8906,
+              45.0439
+            ],
+            [
+              131.9238,
+              45.3516
+            ],
+            [
+              131.5723,
+              45.0439
+            ],
+            [
+              131.0449,
+              44.8682
+            ],
+            [
+              131.3086,
+              44.0771
+            ],
+            [
+              131.2207,
+              43.7256
+            ],
+            [
+              131.3086,
+              43.4619
+            ],
+            [
+              130.8691,
+              43.418
+            ],
+            [
+              130.5176,
+              43.6377
+            ],
+            [
+              130.3418,
+              43.9893
+            ],
+            [
+              129.9902,
+              43.8574
+            ],
+            [
+              129.9023,
+              44.0332
+            ],
+            [
+              129.8145,
+              43.9014
+            ],
+            [
+              129.2871,
+              43.8135
+            ],
+            [
+              129.1992,
+              43.5938
+            ],
+            [
+              128.8477,
+              43.5498
+            ],
+            [
+              128.4961,
+              44.165
+            ],
+            [
+              128.4082,
+              44.4727
+            ],
+            [
+              128.0566,
+              44.3408
+            ],
+            [
+              128.0566,
+              44.1211
+            ],
+            [
+              127.7051,
+              44.1211
+            ],
+            [
+              127.5293,
+              44.6045
+            ],
+            [
+              127.0898,
+              44.6045
+            ],
+            [
+              127.002,
+              44.7803
+            ],
+            [
+              127.0898,
+              45
+            ],
+            [
+              126.9141,
+              45.1318
+            ],
+            [
+              126.5625,
+              45.2637
+            ],
+            [
+              126.0352,
+              45.1758
+            ],
+            [
+              125.7715,
+              45.3076
+            ],
+            [
+              125.6836,
+              45.5273
+            ],
+            [
+              125.0684,
+              45.3955
+            ],
+            [
+              124.8926,
+              45.5273
+            ],
+            [
+              124.3652,
+              45.4395
+            ],
+            [
+              124.0137,
+              45.7471
+            ],
+            [
+              123.9258,
+              46.2305
+            ],
+            [
+              123.2227,
+              46.2305
+            ],
+            [
+              123.0469,
+              46.582
+            ],
+            [
+              123.5742,
+              46.6699
+            ],
+            [
+              123.5742,
+              46.8896
+            ],
+            [
+              123.5742,
+              46.8457
+            ],
+            [
+              123.4863,
+              46.9775
+            ],
+            [
+              123.3984,
+              46.9775
+            ],
+            [
+              123.3984,
+              46.8896
+            ],
+            [
+              123.0469,
+              46.7139
+            ],
+            [
+              122.4316,
+              47.373
+            ],
+            [
+              124.2773,
+              48.5156
+            ],
+            [
+              124.4531,
+              48.1201
+            ],
+            [
+              124.8047,
+              49.1309
+            ],
+            [
+              125.2441,
+              49.1748
+            ],
+            [
+              125.1563,
+              49.834
+            ],
+            [
+              125.332,
+              50.1416
+            ],
+            [
+              125.7715,
+              50.5371
+            ],
+            [
+              125.7715,
+              50.7568
+            ],
+            [
+              126.0352,
+              51.0205
+            ],
+            [
+              125.332,
+              51.6357
+            ],
+            [
+              125.0684,
+              51.6357
+            ],
+            [
+              124.8926,
+              51.3721
+            ],
+            [
+              124.541,
+              51.3721
+            ],
+            [
+              124.3652,
+              51.2842
+            ],
+            [
+              123.6621,
+              51.3721
+            ],
+            [
+              123.3105,
+              51.2402
+            ],
+            [
+              122.959,
+              51.3281
+            ],
+            [
+              122.6074,
+              52.0752
+            ],
+            [
+              122.6953,
+              52.251
+            ],
+            [
+              122.168,
+              52.5146
+            ],
+            [
+              121.9922,
+              52.2949
+            ],
+            [
+              121.7285,
+              52.2949
+            ],
+            [
+              121.6406,
+              52.4268
+            ],
+            [
+              121.2012,
+              52.5586
+            ],
+            [
+              121.8164,
+              53.042
+            ],
+            [
+              121.4648,
+              53.3496
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "gan_su",
+      "properties": {
+        "name": "甘肃",
+        "cp": [
+          95.7129,
+          40.166
+        ],
+        "childNum": 14
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              96.416,
+              42.7148
+            ],
+            [
+              97.207,
+              42.8027
+            ],
+            [
+              97.8223,
+              41.748
+            ],
+            [
+              97.8223,
+              41.6162
+            ],
+            [
+              97.4707,
+              41.4844
+            ],
+            [
+              98.3496,
+              40.9131
+            ],
+            [
+              98.3496,
+              40.5615
+            ],
+            [
+              98.6133,
+              40.6494
+            ],
+            [
+              98.5254,
+              40.7373
+            ],
+            [
+              98.7891,
+              40.6055
+            ],
+            [
+              98.9648,
+              40.7813
+            ],
+            [
+              99.0527,
+              40.6934
+            ],
+            [
+              99.2285,
+              40.8691
+            ],
+            [
+              99.9316,
+              41.001
+            ],
+            [
+              100.1953,
+              40.6494
+            ],
+            [
+              100.1074,
+              40.2539
+            ],
+            [
+              99.4922,
+              39.8584
+            ],
+            [
+              100.0195,
+              39.7705
+            ],
+            [
+              100.5469,
+              39.4189
+            ],
+            [
+              100.8105,
+              39.4189
+            ],
+            [
+              100.9863,
+              38.9355
+            ],
+            [
+              101.25,
+              39.0234
+            ],
+            [
+              101.3379,
+              38.7598
+            ],
+            [
+              101.7773,
+              38.6719
+            ],
+            [
+              102.041,
+              38.8916
+            ],
+            [
+              101.8652,
+              39.1113
+            ],
+            [
+              102.4805,
+              39.2432
+            ],
+            [
+              103.0078,
+              39.1113
+            ],
+            [
+              103.3594,
+              39.3311
+            ],
+            [
+              104.0625,
+              39.4189
+            ],
+            [
+              104.2383,
+              38.9795
+            ],
+            [
+              103.4473,
+              38.3643
+            ],
+            [
+              103.5352,
+              38.1445
+            ],
+            [
+              103.3594,
+              38.0127
+            ],
+            [
+              103.4473,
+              37.8369
+            ],
+            [
+              104.3262,
+              37.4414
+            ],
+            [
+              104.5898,
+              37.4414
+            ],
+            [
+              104.5898,
+              37.2217
+            ],
+            [
+              104.8535,
+              37.2217
+            ],
+            [
+              105.293,
+              36.8262
+            ],
+            [
+              105.2051,
+              36.6943
+            ],
+            [
+              105.4688,
+              36.123
+            ],
+            [
+              105.293,
+              35.9912
+            ],
+            [
+              105.3809,
+              35.7715
+            ],
+            [
+              105.7324,
+              35.7275
+            ],
+            [
+              105.8203,
+              35.5518
+            ],
+            [
+              105.9961,
+              35.4639
+            ],
+            [
+              105.9082,
+              35.4199
+            ],
+            [
+              105.9961,
+              35.4199
+            ],
+            [
+              106.084,
+              35.376
+            ],
+            [
+              106.2598,
+              35.4199
+            ],
+            [
+              106.3477,
+              35.2441
+            ],
+            [
+              106.5234,
+              35.332
+            ],
+            [
+              106.4355,
+              35.6836
+            ],
+            [
+              106.6992,
+              35.6836
+            ],
+            [
+              106.9629,
+              35.8154
+            ],
+            [
+              106.875,
+              36.123
+            ],
+            [
+              106.5234,
+              36.2549
+            ],
+            [
+              106.5234,
+              36.4746
+            ],
+            [
+              106.4355,
+              36.5625
+            ],
+            [
+              106.6113,
+              36.7822
+            ],
+            [
+              106.6113,
+              37.0898
+            ],
+            [
+              107.3145,
+              37.0898
+            ],
+            [
+              107.3145,
+              36.9141
+            ],
+            [
+              108.7207,
+              36.3428
+            ],
+            [
+              108.6328,
+              35.9912
+            ],
+            [
+              108.5449,
+              35.8594
+            ],
+            [
+              108.6328,
+              35.5518
+            ],
+            [
+              108.5449,
+              35.2881
+            ],
+            [
+              107.7539,
+              35.2881
+            ],
+            [
+              107.7539,
+              35.1123
+            ],
+            [
+              107.8418,
+              35.0244
+            ],
+            [
+              107.666,
+              34.9365
+            ],
+            [
+              107.2266,
+              34.8926
+            ],
+            [
+              106.9629,
+              35.0684
+            ],
+            [
+              106.6113,
+              35.0684
+            ],
+            [
+              106.5234,
+              34.7607
+            ],
+            [
+              106.3477,
+              34.585
+            ],
+            [
+              106.6992,
+              34.3213
+            ],
+            [
+              106.5234,
+              34.2773
+            ],
+            [
+              106.6113,
+              34.1455
+            ],
+            [
+              106.4355,
+              33.9258
+            ],
+            [
+              106.5234,
+              33.5303
+            ],
+            [
+              105.9961,
+              33.6182
+            ],
+            [
+              105.7324,
+              33.3984
+            ],
+            [
+              105.9961,
+              33.1787
+            ],
+            [
+              105.9082,
+              33.0029
+            ],
+            [
+              105.4688,
+              32.915
+            ],
+            [
+              105.3809,
+              32.8711
+            ],
+            [
+              105.3809,
+              32.7393
+            ],
+            [
+              105.2051,
+              32.6074
+            ],
+            [
+              104.4141,
+              32.7393
+            ],
+            [
+              104.3262,
+              32.8711
+            ],
+            [
+              104.4141,
+              33.0469
+            ],
+            [
+              104.3262,
+              33.2227
+            ],
+            [
+              104.4141,
+              33.3105
+            ],
+            [
+              104.2383,
+              33.3984
+            ],
+            [
+              104.1504,
+              33.6182
+            ],
+            [
+              103.1836,
+              33.7939
+            ],
+            [
+              103.0957,
+              34.1895
+            ],
+            [
+              102.9199,
+              34.3213
+            ],
+            [
+              102.2168,
+              33.9258
+            ],
+            [
+              102.4805,
+              33.4424
+            ],
+            [
+              101.8652,
+              33.0908
+            ],
+            [
+              101.9531,
+              33.4424
+            ],
+            [
+              101.8652,
+              33.5742
+            ],
+            [
+              101.7773,
+              33.5303
+            ],
+            [
+              101.6016,
+              33.5303
+            ],
+            [
+              101.5137,
+              33.7061
+            ],
+            [
+              101.25,
+              33.6621
+            ],
+            [
+              100.8105,
+              34.2773
+            ],
+            [
+              100.9863,
+              34.3652
+            ],
+            [
+              101.6895,
+              34.1016
+            ],
+            [
+              102.1289,
+              34.2773
+            ],
+            [
+              102.2168,
+              34.4092
+            ],
+            [
+              101.9531,
+              34.6289
+            ],
+            [
+              101.9531,
+              34.8486
+            ],
+            [
+              102.3926,
+              35.2002
+            ],
+            [
+              102.3047,
+              35.4199
+            ],
+            [
+              102.4805,
+              35.5957
+            ],
+            [
+              102.832,
+              35.5957
+            ],
+            [
+              102.6563,
+              35.7715
+            ],
+            [
+              102.9199,
+              35.9033
+            ],
+            [
+              102.9199,
+              36.0791
+            ],
+            [
+              103.0078,
+              36.2549
+            ],
+            [
+              102.832,
+              36.3428
+            ],
+            [
+              102.5684,
+              36.7383
+            ],
+            [
+              102.6563,
+              36.8262
+            ],
+            [
+              102.4805,
+              36.958
+            ],
+            [
+              102.5684,
+              37.1777
+            ],
+            [
+              102.1289,
+              37.4414
+            ],
+            [
+              101.9531,
+              37.7051
+            ],
+            [
+              101.7773,
+              37.6172
+            ],
+            [
+              101.5137,
+              37.8809
+            ],
+            [
+              101.1621,
+              37.8369
+            ],
+            [
+              100.7227,
+              38.2324
+            ],
+            [
+              100.459,
+              38.2764
+            ],
+            [
+              100.1074,
+              38.4961
+            ],
+            [
+              100.0195,
+              38.4521
+            ],
+            [
+              100.1953,
+              38.2764
+            ],
+            [
+              99.8438,
+              38.3643
+            ],
+            [
+              99.1406,
+              38.9355
+            ],
+            [
+              98.7891,
+              39.0674
+            ],
+            [
+              98.6133,
+              38.9355
+            ],
+            [
+              98.3496,
+              39.0234
+            ],
+            [
+              98.1738,
+              38.8037
+            ],
+            [
+              97.0313,
+              39.1992
+            ],
+            [
+              97.1191,
+              38.584
+            ],
+            [
+              96.6797,
+              38.4521
+            ],
+            [
+              96.6797,
+              38.1885
+            ],
+            [
+              96.416,
+              38.2324
+            ],
+            [
+              96.2402,
+              38.1006
+            ],
+            [
+              95.7129,
+              38.3643
+            ],
+            [
+              95.4492,
+              38.2764
+            ],
+            [
+              95.0098,
+              38.4082
+            ],
+            [
+              94.5703,
+              38.3643
+            ],
+            [
+              94.3066,
+              38.7598
+            ],
+            [
+              93.8672,
+              38.7158
+            ],
+            [
+              93.6914,
+              38.9355
+            ],
+            [
+              93.1641,
+              38.9795
+            ],
+            [
+              93.1641,
+              39.1992
+            ],
+            [
+              92.373,
+              39.1113
+            ],
+            [
+              92.373,
+              39.3311
+            ],
+            [
+              92.6367,
+              39.6387
+            ],
+            [
+              93.0762,
+              40.6494
+            ],
+            [
+              93.8672,
+              40.6934
+            ],
+            [
+              94.043,
+              41.0889
+            ],
+            [
+              94.5703,
+              41.4844
+            ],
+            [
+              95.1855,
+              41.792
+            ],
+            [
+              95.2734,
+              41.6162
+            ],
+            [
+              95.9766,
+              41.9238
+            ],
+            [
+              96.2402,
+              42.2314
+            ],
+            [
+              96.0645,
+              42.3193
+            ],
+            [
+              95.9766,
+              42.4951
+            ],
+            [
+              96.416,
+              42.7148
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "yun_nan",
+      "properties": {
+        "name": "云南",
+        "cp": [
+          101.8652,
+          25.1807
+        ],
+        "childNum": 16
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              98.1738,
+              28.125
+            ],
+            [
+              98.2617,
+              28.3887
+            ],
+            [
+              98.3496,
+              28.125
+            ],
+            [
+              98.7012,
+              28.2129
+            ],
+            [
+              98.7891,
+              28.3447
+            ],
+            [
+              98.6133,
+              28.5205
+            ],
+            [
+              98.7012,
+              28.916
+            ],
+            [
+              98.7891,
+              29.0039
+            ],
+            [
+              98.7891,
+              28.8721
+            ],
+            [
+              98.9648,
+              28.8281
+            ],
+            [
+              98.9648,
+              29.1357
+            ],
+            [
+              99.1406,
+              29.2676
+            ],
+            [
+              99.2285,
+              28.3008
+            ],
+            [
+              99.4043,
+              28.1689
+            ],
+            [
+              99.4043,
+              28.5205
+            ],
+            [
+              99.668,
+              28.8281
+            ],
+            [
+              100.1953,
+              28.3447
+            ],
+            [
+              100.0195,
+              28.125
+            ],
+            [
+              100.2832,
+              27.7295
+            ],
+            [
+              100.3711,
+              27.8174
+            ],
+            [
+              100.7227,
+              27.8613
+            ],
+            [
+              101.1621,
+              27.1582
+            ],
+            [
+              101.1621,
+              27.0264
+            ],
+            [
+              101.4258,
+              26.7188
+            ],
+            [
+              101.4258,
+              26.8066
+            ],
+            [
+              101.4258,
+              26.5869
+            ],
+            [
+              101.6895,
+              26.3672
+            ],
+            [
+              101.6016,
+              26.2354
+            ],
+            [
+              101.8652,
+              26.0596
+            ],
+            [
+              102.1289,
+              26.1035
+            ],
+            [
+              102.5684,
+              26.3672
+            ],
+            [
+              102.6563,
+              26.1914
+            ],
+            [
+              103.0078,
+              26.3672
+            ],
+            [
+              102.9199,
+              27.29
+            ],
+            [
+              103.4473,
+              27.7734
+            ],
+            [
+              103.4473,
+              28.125
+            ],
+            [
+              103.7988,
+              28.3008
+            ],
+            [
+              103.8867,
+              28.6523
+            ],
+            [
+              104.4141,
+              28.6084
+            ],
+            [
+              104.2383,
+              28.4326
+            ],
+            [
+              104.4141,
+              28.2568
+            ],
+            [
+              104.4141,
+              28.125
+            ],
+            [
+              104.3262,
+              28.0371
+            ],
+            [
+              104.4141,
+              27.9492
+            ],
+            [
+              104.8535,
+              27.9053
+            ],
+            [
+              105.0293,
+              28.0811
+            ],
+            [
+              105.2051,
+              27.9932
+            ],
+            [
+              105.293,
+              27.7295
+            ],
+            [
+              105.2051,
+              27.3779
+            ],
+            [
+              104.5898,
+              27.334
+            ],
+            [
+              104.4141,
+              27.4658
+            ],
+            [
+              104.1504,
+              27.2461
+            ],
+            [
+              103.8867,
+              27.4219
+            ],
+            [
+              103.623,
+              27.0264
+            ],
+            [
+              103.7109,
+              26.9824
+            ],
+            [
+              103.7109,
+              26.7627
+            ],
+            [
+              103.8867,
+              26.543
+            ],
+            [
+              104.4141,
+              26.6748
+            ],
+            [
+              104.6777,
+              26.4111
+            ],
+            [
+              104.3262,
+              25.708
+            ],
+            [
+              104.8535,
+              25.2246
+            ],
+            [
+              104.5898,
+              25.0488
+            ],
+            [
+              104.6777,
+              24.9609
+            ],
+            [
+              104.502,
+              24.7412
+            ],
+            [
+              104.6777,
+              24.3457
+            ],
+            [
+              104.7656,
+              24.4775
+            ],
+            [
+              105.0293,
+              24.4336
+            ],
+            [
+              105.2051,
+              24.082
+            ],
+            [
+              105.4688,
+              24.0381
+            ],
+            [
+              105.5566,
+              24.126
+            ],
+            [
+              105.9961,
+              24.126
+            ],
+            [
+              106.1719,
+              23.8184
+            ],
+            [
+              106.1719,
+              23.5547
+            ],
+            [
+              105.6445,
+              23.4229
+            ],
+            [
+              105.5566,
+              23.2031
+            ],
+            [
+              105.293,
+              23.3789
+            ],
+            [
+              104.8535,
+              23.1592
+            ],
+            [
+              104.7656,
+              22.8516
+            ],
+            [
+              104.3262,
+              22.6758
+            ],
+            [
+              104.1504,
+              22.8076
+            ],
+            [
+              103.9746,
+              22.5439
+            ],
+            [
+              103.623,
+              22.7637
+            ],
+            [
+              103.5352,
+              22.5879
+            ],
+            [
+              103.3594,
+              22.8076
+            ],
+            [
+              103.0957,
+              22.4561
+            ],
+            [
+              102.4805,
+              22.7637
+            ],
+            [
+              102.3047,
+              22.4121
+            ],
+            [
+              101.8652,
+              22.3682
+            ],
+            [
+              101.7773,
+              22.5
+            ],
+            [
+              101.6016,
+              22.1924
+            ],
+            [
+              101.8652,
+              21.6211
+            ],
+            [
+              101.7773,
+              21.1377
+            ],
+            [
+              101.6016,
+              21.2256
+            ],
+            [
+              101.25,
+              21.1816
+            ],
+            [
+              101.1621,
+              21.7529
+            ],
+            [
+              100.6348,
+              21.4453
+            ],
+            [
+              100.1074,
+              21.4893
+            ],
+            [
+              99.9316,
+              22.0605
+            ],
+            [
+              99.2285,
+              22.1484
+            ],
+            [
+              99.4043,
+              22.5879
+            ],
+            [
+              99.3164,
+              22.7197
+            ],
+            [
+              99.4922,
+              23.0713
+            ],
+            [
+              98.877,
+              23.2031
+            ],
+            [
+              98.7012,
+              23.9502
+            ],
+            [
+              98.877,
+              24.126
+            ],
+            [
+              98.1738,
+              24.082
+            ],
+            [
+              97.7344,
+              23.8623
+            ],
+            [
+              97.5586,
+              23.9063
+            ],
+            [
+              97.7344,
+              24.126
+            ],
+            [
+              97.6465,
+              24.4336
+            ],
+            [
+              97.5586,
+              24.4336
+            ],
+            [
+              97.5586,
+              24.7412
+            ],
+            [
+              97.7344,
+              24.8291
+            ],
+            [
+              97.8223,
+              25.2686
+            ],
+            [
+              98.1738,
+              25.4004
+            ],
+            [
+              98.1738,
+              25.6201
+            ],
+            [
+              98.3496,
+              25.5762
+            ],
+            [
+              98.5254,
+              25.8398
+            ],
+            [
+              98.7012,
+              25.8838
+            ],
+            [
+              98.6133,
+              26.0596
+            ],
+            [
+              98.7012,
+              26.1475
+            ],
+            [
+              98.7891,
+              26.5869
+            ],
+            [
+              98.7012,
+              27.5098
+            ],
+            [
+              98.5254,
+              27.6416
+            ],
+            [
+              98.3496,
+              27.5098
+            ],
+            [
+              98.1738,
+              28.125
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "guang_xi",
+      "properties": {
+        "name": "广西",
+        "cp": [
+          108.2813,
+          23.6426
+        ],
+        "childNum": 14
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              104.502,
+              24.7412
+            ],
+            [
+              104.6777,
+              24.6094
+            ],
+            [
+              105.2051,
+              24.9609
+            ],
+            [
+              105.9961,
+              24.6533
+            ],
+            [
+              106.1719,
+              24.7852
+            ],
+            [
+              106.1719,
+              24.9609
+            ],
+            [
+              106.875,
+              25.1807
+            ],
+            [
+              107.0508,
+              25.2686
+            ],
+            [
+              106.9629,
+              25.4883
+            ],
+            [
+              107.2266,
+              25.6201
+            ],
+            [
+              107.4902,
+              25.2246
+            ],
+            [
+              107.7539,
+              25.2246
+            ],
+            [
+              107.8418,
+              25.1367
+            ],
+            [
+              108.1055,
+              25.2246
+            ],
+            [
+              108.1934,
+              25.4443
+            ],
+            [
+              108.3691,
+              25.5322
+            ],
+            [
+              108.6328,
+              25.3125
+            ],
+            [
+              108.6328,
+              25.5762
+            ],
+            [
+              109.0723,
+              25.5322
+            ],
+            [
+              108.9844,
+              25.752
+            ],
+            [
+              109.3359,
+              25.708
+            ],
+            [
+              109.5117,
+              26.0156
+            ],
+            [
+              109.7754,
+              25.8838
+            ],
+            [
+              109.9512,
+              26.1914
+            ],
+            [
+              110.2148,
+              25.9717
+            ],
+            [
+              110.5664,
+              26.3232
+            ],
+            [
+              111.1816,
+              26.3232
+            ],
+            [
+              111.2695,
+              26.2354
+            ],
+            [
+              111.2695,
+              25.8838
+            ],
+            [
+              111.4453,
+              25.8398
+            ],
+            [
+              111.0059,
+              25.0049
+            ],
+            [
+              111.0938,
+              24.9609
+            ],
+            [
+              111.3574,
+              25.1367
+            ],
+            [
+              111.5332,
+              24.6533
+            ],
+            [
+              111.709,
+              24.7852
+            ],
+            [
+              112.0605,
+              24.7412
+            ],
+            [
+              111.8848,
+              24.6533
+            ],
+            [
+              112.0605,
+              24.3457
+            ],
+            [
+              111.8848,
+              24.2139
+            ],
+            [
+              111.8848,
+              23.9941
+            ],
+            [
+              111.7969,
+              23.8184
+            ],
+            [
+              111.6211,
+              23.8184
+            ],
+            [
+              111.6211,
+              23.6865
+            ],
+            [
+              111.3574,
+              23.4668
+            ],
+            [
+              111.4453,
+              23.0273
+            ],
+            [
+              111.2695,
+              22.8076
+            ],
+            [
+              110.7422,
+              22.5439
+            ],
+            [
+              110.7422,
+              22.2803
+            ],
+            [
+              110.6543,
+              22.1484
+            ],
+            [
+              110.3027,
+              22.1484
+            ],
+            [
+              110.3027,
+              21.8848
+            ],
+            [
+              109.9512,
+              21.8408
+            ],
+            [
+              109.8633,
+              21.665
+            ],
+            [
+              109.7754,
+              21.6211
+            ],
+            [
+              109.7754,
+              21.4014
+            ],
+            [
+              109.5996,
+              21.4453
+            ],
+            [
+              109.1602,
+              21.3574
+            ],
+            [
+              109.248,
+              20.874
+            ],
+            [
+              109.0723,
+              20.9619
+            ],
+            [
+              109.0723,
+              21.5332
+            ],
+            [
+              108.7207,
+              21.5332
+            ],
+            [
+              108.6328,
+              21.665
+            ],
+            [
+              108.2813,
+              21.4893
+            ],
+            [
+              107.8418,
+              21.6211
+            ],
+            [
+              107.4023,
+              21.6211
+            ],
+            [
+              107.0508,
+              21.7969
+            ],
+            [
+              107.0508,
+              21.9287
+            ],
+            [
+              106.6992,
+              22.0166
+            ],
+            [
+              106.6113,
+              22.4121
+            ],
+            [
+              106.7871,
+              22.7637
+            ],
+            [
+              106.6992,
+              22.8955
+            ],
+            [
+              105.9082,
+              22.9395
+            ],
+            [
+              105.5566,
+              23.0713
+            ],
+            [
+              105.5566,
+              23.2031
+            ],
+            [
+              105.6445,
+              23.4229
+            ],
+            [
+              106.1719,
+              23.5547
+            ],
+            [
+              106.1719,
+              23.8184
+            ],
+            [
+              105.9961,
+              24.126
+            ],
+            [
+              105.5566,
+              24.126
+            ],
+            [
+              105.4688,
+              24.0381
+            ],
+            [
+              105.2051,
+              24.082
+            ],
+            [
+              105.0293,
+              24.4336
+            ],
+            [
+              104.7656,
+              24.4775
+            ],
+            [
+              104.6777,
+              24.3457
+            ],
+            [
+              104.502,
+              24.7412
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "hu_nan",
+      "properties": {
+        "name": "湖南",
+        "cp": [
+          111.5332,
+          27.3779
+        ],
+        "childNum": 14
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              109.248,
+              28.4766
+            ],
+            [
+              109.248,
+              29.1357
+            ],
+            [
+              109.5117,
+              29.6191
+            ],
+            [
+              109.6875,
+              29.6191
+            ],
+            [
+              109.7754,
+              29.751
+            ],
+            [
+              110.4785,
+              29.6631
+            ],
+            [
+              110.6543,
+              29.751
+            ],
+            [
+              110.4785,
+              30.0146
+            ],
+            [
+              110.8301,
+              30.1465
+            ],
+            [
+              111.7969,
+              29.9268
+            ],
+            [
+              112.2363,
+              29.5313
+            ],
+            [
+              112.5,
+              29.6191
+            ],
+            [
+              112.6758,
+              29.5752
+            ],
+            [
+              112.9395,
+              29.7949
+            ],
+            [
+              113.0273,
+              29.751
+            ],
+            [
+              112.9395,
+              29.4873
+            ],
+            [
+              113.0273,
+              29.4434
+            ],
+            [
+              113.5547,
+              29.8389
+            ],
+            [
+              113.5547,
+              29.707
+            ],
+            [
+              113.7305,
+              29.5752
+            ],
+            [
+              113.6426,
+              29.3115
+            ],
+            [
+              113.7305,
+              29.0918
+            ],
+            [
+              113.9063,
+              29.0479
+            ],
+            [
+              114.1699,
+              28.8281
+            ],
+            [
+              114.082,
+              28.5645
+            ],
+            [
+              114.2578,
+              28.3447
+            ],
+            [
+              113.7305,
+              27.9492
+            ],
+            [
+              113.6426,
+              27.5977
+            ],
+            [
+              113.6426,
+              27.3779
+            ],
+            [
+              113.8184,
+              27.29
+            ],
+            [
+              113.7305,
+              27.1143
+            ],
+            [
+              113.9063,
+              26.9385
+            ],
+            [
+              113.9063,
+              26.6309
+            ],
+            [
+              114.082,
+              26.5869
+            ],
+            [
+              113.9941,
+              26.1914
+            ],
+            [
+              114.2578,
+              26.1475
+            ],
+            [
+              113.9941,
+              26.0596
+            ],
+            [
+              113.9063,
+              25.4443
+            ],
+            [
+              113.6426,
+              25.3125
+            ],
+            [
+              113.2031,
+              25.5322
+            ],
+            [
+              112.8516,
+              25.3564
+            ],
+            [
+              113.0273,
+              25.2246
+            ],
+            [
+              113.0273,
+              24.9609
+            ],
+            [
+              112.8516,
+              24.917
+            ],
+            [
+              112.5879,
+              25.1367
+            ],
+            [
+              112.2363,
+              25.1807
+            ],
+            [
+              112.1484,
+              24.873
+            ],
+            [
+              112.0605,
+              24.7412
+            ],
+            [
+              111.709,
+              24.7852
+            ],
+            [
+              111.5332,
+              24.6533
+            ],
+            [
+              111.3574,
+              25.1367
+            ],
+            [
+              111.0938,
+              24.9609
+            ],
+            [
+              111.0059,
+              25.0049
+            ],
+            [
+              111.4453,
+              25.8398
+            ],
+            [
+              111.2695,
+              25.8838
+            ],
+            [
+              111.2695,
+              26.2354
+            ],
+            [
+              111.1816,
+              26.3232
+            ],
+            [
+              110.5664,
+              26.3232
+            ],
+            [
+              110.2148,
+              25.9717
+            ],
+            [
+              109.9512,
+              26.1914
+            ],
+            [
+              109.7754,
+              25.8838
+            ],
+            [
+              109.5117,
+              26.0156
+            ],
+            [
+              109.4238,
+              26.2793
+            ],
+            [
+              109.248,
+              26.3232
+            ],
+            [
+              109.4238,
+              26.5869
+            ],
+            [
+              109.3359,
+              26.7188
+            ],
+            [
+              109.5117,
+              26.8066
+            ],
+            [
+              109.5117,
+              27.0264
+            ],
+            [
+              109.3359,
+              27.1582
+            ],
+            [
+              108.8965,
+              27.0264
+            ],
+            [
+              108.8086,
+              27.1143
+            ],
+            [
+              109.4238,
+              27.5977
+            ],
+            [
+              109.3359,
+              27.9053
+            ],
+            [
+              109.3359,
+              28.2568
+            ],
+            [
+              109.248,
+              28.4766
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "shan_xi_1",
+      "properties": {
+        "name": "陕西",
+        "cp": [
+          109.5996,
+          35.6396
+        ],
+        "childNum": 10
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              105.4688,
+              32.915
+            ],
+            [
+              105.9082,
+              33.0029
+            ],
+            [
+              105.9961,
+              33.1787
+            ],
+            [
+              105.7324,
+              33.3984
+            ],
+            [
+              105.9961,
+              33.6182
+            ],
+            [
+              106.5234,
+              33.5303
+            ],
+            [
+              106.4355,
+              33.9258
+            ],
+            [
+              106.6113,
+              34.1455
+            ],
+            [
+              106.5234,
+              34.2773
+            ],
+            [
+              106.6992,
+              34.3213
+            ],
+            [
+              106.3477,
+              34.585
+            ],
+            [
+              106.5234,
+              34.7607
+            ],
+            [
+              106.6113,
+              35.0684
+            ],
+            [
+              106.9629,
+              35.0684
+            ],
+            [
+              107.2266,
+              34.8926
+            ],
+            [
+              107.666,
+              34.9365
+            ],
+            [
+              107.8418,
+              35.0244
+            ],
+            [
+              107.7539,
+              35.1123
+            ],
+            [
+              107.7539,
+              35.2881
+            ],
+            [
+              108.5449,
+              35.2881
+            ],
+            [
+              108.6328,
+              35.5518
+            ],
+            [
+              108.5449,
+              35.8594
+            ],
+            [
+              108.6328,
+              35.9912
+            ],
+            [
+              108.7207,
+              36.3428
+            ],
+            [
+              107.3145,
+              36.9141
+            ],
+            [
+              107.3145,
+              37.0898
+            ],
+            [
+              107.3145,
+              37.6172
+            ],
+            [
+              107.666,
+              37.8809
+            ],
+            [
+              108.1934,
+              37.6172
+            ],
+            [
+              108.7207,
+              37.7051
+            ],
+            [
+              108.8086,
+              38.0127
+            ],
+            [
+              108.8965,
+              37.9688
+            ],
+            [
+              109.0723,
+              38.0127
+            ],
+            [
+              108.9844,
+              38.3203
+            ],
+            [
+              109.9512,
+              39.1553
+            ],
+            [
+              109.8633,
+              39.2432
+            ],
+            [
+              110.2148,
+              39.2871
+            ],
+            [
+              110.127,
+              39.4629
+            ],
+            [
+              110.6543,
+              39.2871
+            ],
+            [
+              111.0938,
+              39.5947
+            ],
+            [
+              111.0938,
+              39.375
+            ],
+            [
+              111.1816,
+              39.2432
+            ],
+            [
+              110.918,
+              38.7158
+            ],
+            [
+              110.8301,
+              38.4961
+            ],
+            [
+              110.4785,
+              38.1885
+            ],
+            [
+              110.4785,
+              37.9688
+            ],
+            [
+              110.8301,
+              37.6611
+            ],
+            [
+              110.3906,
+              37.002
+            ],
+            [
+              110.4785,
+              36.123
+            ],
+            [
+              110.5664,
+              35.6396
+            ],
+            [
+              110.2148,
+              34.8926
+            ],
+            [
+              110.2148,
+              34.6729
+            ],
+            [
+              110.3906,
+              34.585
+            ],
+            [
+              110.4785,
+              34.2334
+            ],
+            [
+              110.6543,
+              34.1455
+            ],
+            [
+              110.6543,
+              33.8379
+            ],
+            [
+              111.0059,
+              33.5303
+            ],
+            [
+              111.0059,
+              33.2666
+            ],
+            [
+              110.7422,
+              33.1348
+            ],
+            [
+              110.5664,
+              33.2666
+            ],
+            [
+              110.3027,
+              33.1787
+            ],
+            [
+              109.5996,
+              33.2666
+            ],
+            [
+              109.4238,
+              33.1348
+            ],
+            [
+              109.7754,
+              33.0469
+            ],
+            [
+              109.7754,
+              32.915
+            ],
+            [
+              110.127,
+              32.7393
+            ],
+            [
+              110.127,
+              32.6074
+            ],
+            [
+              109.6875,
+              32.6074
+            ],
+            [
+              109.5117,
+              32.4316
+            ],
+            [
+              109.5996,
+              31.7285
+            ],
+            [
+              109.248,
+              31.7285
+            ],
+            [
+              109.0723,
+              31.9482
+            ],
+            [
+              108.5449,
+              32.2119
+            ],
+            [
+              108.2813,
+              32.2559
+            ],
+            [
+              108.0176,
+              32.168
+            ],
+            [
+              107.4023,
+              32.5195
+            ],
+            [
+              107.2266,
+              32.4316
+            ],
+            [
+              107.1387,
+              32.4756
+            ],
+            [
+              107.0508,
+              32.6953
+            ],
+            [
+              106.3477,
+              32.6514
+            ],
+            [
+              106.084,
+              32.7393
+            ],
+            [
+              106.084,
+              32.8711
+            ],
+            [
+              105.5566,
+              32.7393
+            ],
+            [
+              105.4688,
+              32.915
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "guang_dong",
+      "properties": {
+        "name": "广东",
+        "cp": [
+          113.4668,
+          22.8076
+        ],
+        "childNum": 21
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              109.7754,
+              21.4014
+            ],
+            [
+              109.7754,
+              21.6211
+            ],
+            [
+              109.8633,
+              21.665
+            ],
+            [
+              109.9512,
+              21.8408
+            ],
+            [
+              110.3027,
+              21.8848
+            ],
+            [
+              110.3027,
+              22.1484
+            ],
+            [
+              110.6543,
+              22.1484
+            ],
+            [
+              110.7422,
+              22.2803
+            ],
+            [
+              110.7422,
+              22.5439
+            ],
+            [
+              111.2695,
+              22.8076
+            ],
+            [
+              111.4453,
+              23.0273
+            ],
+            [
+              111.3574,
+              23.4668
+            ],
+            [
+              111.6211,
+              23.6865
+            ],
+            [
+              111.6211,
+              23.8184
+            ],
+            [
+              111.7969,
+              23.8184
+            ],
+            [
+              111.8848,
+              23.9941
+            ],
+            [
+              111.8848,
+              24.2139
+            ],
+            [
+              112.0605,
+              24.3457
+            ],
+            [
+              111.8848,
+              24.6533
+            ],
+            [
+              112.0605,
+              24.7412
+            ],
+            [
+              112.1484,
+              24.873
+            ],
+            [
+              112.2363,
+              25.1807
+            ],
+            [
+              112.5879,
+              25.1367
+            ],
+            [
+              112.8516,
+              24.917
+            ],
+            [
+              113.0273,
+              24.9609
+            ],
+            [
+              113.0273,
+              25.2246
+            ],
+            [
+              112.8516,
+              25.3564
+            ],
+            [
+              113.2031,
+              25.5322
+            ],
+            [
+              113.6426,
+              25.3125
+            ],
+            [
+              113.9063,
+              25.4443
+            ],
+            [
+              113.9941,
+              25.2686
+            ],
+            [
+              114.6094,
+              25.4004
+            ],
+            [
+              114.7852,
+              25.2686
+            ],
+            [
+              114.6973,
+              25.1367
+            ],
+            [
+              114.4336,
+              24.9609
+            ],
+            [
+              114.1699,
+              24.6973
+            ],
+            [
+              114.4336,
+              24.5215
+            ],
+            [
+              115.4004,
+              24.7852
+            ],
+            [
+              115.8398,
+              24.5654
+            ],
+            [
+              115.752,
+              24.7852
+            ],
+            [
+              115.9277,
+              24.917
+            ],
+            [
+              116.2793,
+              24.7852
+            ],
+            [
+              116.3672,
+              24.873
+            ],
+            [
+              116.543,
+              24.6094
+            ],
+            [
+              116.7188,
+              24.6533
+            ],
+            [
+              116.9824,
+              24.1699
+            ],
+            [
+              116.9824,
+              23.9063
+            ],
+            [
+              117.1582,
+              23.5547
+            ],
+            [
+              117.334,
+              23.2471
+            ],
+            [
+              116.8945,
+              23.3789
+            ],
+            [
+              116.6309,
+              23.1152
+            ],
+            [
+              116.543,
+              22.8516
+            ],
+            [
+              115.9277,
+              22.7197
+            ],
+            [
+              115.6641,
+              22.7637
+            ],
+            [
+              115.5762,
+              22.6318
+            ],
+            [
+              115.0488,
+              22.6758
+            ],
+            [
+              114.6094,
+              22.3682
+            ],
+            [
+              114.3457,
+              22.5439
+            ],
+            [
+              113.9941,
+              22.5
+            ],
+            [
+              113.8184,
+              22.1924
+            ],
+            [
+              114.3457,
+              22.1484
+            ],
+            [
+              114.4336,
+              22.0166
+            ],
+            [
+              114.082,
+              21.9287
+            ],
+            [
+              113.9941,
+              21.7969
+            ],
+            [
+              113.5547,
+              22.0166
+            ],
+            [
+              113.1152,
+              21.8408
+            ],
+            [
+              112.9395,
+              21.5771
+            ],
+            [
+              112.4121,
+              21.4453
+            ],
+            [
+              112.2363,
+              21.5332
+            ],
+            [
+              111.5332,
+              21.4893
+            ],
+            [
+              111.2695,
+              21.3574
+            ],
+            [
+              110.7422,
+              21.3574
+            ],
+            [
+              110.6543,
+              21.2256
+            ],
+            [
+              110.7422,
+              20.918
+            ],
+            [
+              110.4785,
+              20.874
+            ],
+            [
+              110.6543,
+              20.2588
+            ],
+            [
+              110.5664,
+              20.2588
+            ],
+            [
+              110.3906,
+              20.127
+            ],
+            [
+              110.0391,
+              20.127
+            ],
+            [
+              109.8633,
+              20.127
+            ],
+            [
+              109.8633,
+              20.3027
+            ],
+            [
+              109.5996,
+              20.918
+            ],
+            [
+              109.7754,
+              21.4014
+            ],
+            [
+              109.7754,
+              21.4014
+            ]
+          ],
+          [
+            [
+              113.5986,
+              22.1649
+            ],
+            [
+              113.6096,
+              22.1265
+            ],
+            [
+              113.5547,
+              22.11
+            ],
+            [
+              113.5437,
+              22.2034
+            ],
+            [
+              113.5767,
+              22.2034
+            ],
+            [
+              113.5986,
+              22.1649
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "ji_lin",
+      "properties": {
+        "name": "吉林",
+        "cp": [
+          126.4746,
+          43.5938
+        ],
+        "childNum": 9
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              123.2227,
+              46.2305
+            ],
+            [
+              123.9258,
+              46.2305
+            ],
+            [
+              124.0137,
+              45.7471
+            ],
+            [
+              124.3652,
+              45.4395
+            ],
+            [
+              124.8926,
+              45.5273
+            ],
+            [
+              125.0684,
+              45.3955
+            ],
+            [
+              125.6836,
+              45.5273
+            ],
+            [
+              125.7715,
+              45.3076
+            ],
+            [
+              126.0352,
+              45.1758
+            ],
+            [
+              126.5625,
+              45.2637
+            ],
+            [
+              126.9141,
+              45.1318
+            ],
+            [
+              127.0898,
+              45
+            ],
+            [
+              127.002,
+              44.7803
+            ],
+            [
+              127.0898,
+              44.6045
+            ],
+            [
+              127.5293,
+              44.6045
+            ],
+            [
+              127.7051,
+              44.1211
+            ],
+            [
+              128.0566,
+              44.1211
+            ],
+            [
+              128.0566,
+              44.3408
+            ],
+            [
+              128.4082,
+              44.4727
+            ],
+            [
+              128.4961,
+              44.165
+            ],
+            [
+              128.8477,
+              43.5498
+            ],
+            [
+              129.1992,
+              43.5938
+            ],
+            [
+              129.2871,
+              43.8135
+            ],
+            [
+              129.8145,
+              43.9014
+            ],
+            [
+              129.9023,
+              44.0332
+            ],
+            [
+              129.9902,
+              43.8574
+            ],
+            [
+              130.3418,
+              43.9893
+            ],
+            [
+              130.5176,
+              43.6377
+            ],
+            [
+              130.8691,
+              43.418
+            ],
+            [
+              131.3086,
+              43.4619
+            ],
+            [
+              131.3086,
+              43.3301
+            ],
+            [
+              131.1328,
+              42.9346
+            ],
+            [
+              130.4297,
+              42.7148
+            ],
+            [
+              130.6055,
+              42.6709
+            ],
+            [
+              130.6055,
+              42.4512
+            ],
+            [
+              130.2539,
+              42.7588
+            ],
+            [
+              130.2539,
+              42.8906
+            ],
+            [
+              130.166,
+              42.9785
+            ],
+            [
+              129.9023,
+              43.0225
+            ],
+            [
+              129.7266,
+              42.4951
+            ],
+            [
+              129.375,
+              42.4512
+            ],
+            [
+              128.9355,
+              42.0117
+            ],
+            [
+              128.0566,
+              42.0117
+            ],
+            [
+              128.3203,
+              41.5723
+            ],
+            [
+              128.1445,
+              41.3525
+            ],
+            [
+              127.0898,
+              41.5283
+            ],
+            [
+              127.1777,
+              41.5723
+            ],
+            [
+              126.9141,
+              41.792
+            ],
+            [
+              126.6504,
+              41.6602
+            ],
+            [
+              126.4746,
+              41.3965
+            ],
+            [
+              126.123,
+              40.957
+            ],
+            [
+              125.6836,
+              40.8691
+            ],
+            [
+              125.5957,
+              40.9131
+            ],
+            [
+              125.7715,
+              41.2207
+            ],
+            [
+              125.332,
+              41.6602
+            ],
+            [
+              125.332,
+              41.9678
+            ],
+            [
+              125.4199,
+              42.0996
+            ],
+            [
+              125.332,
+              42.1436
+            ],
+            [
+              124.8926,
+              42.8027
+            ],
+            [
+              124.8926,
+              43.0664
+            ],
+            [
+              124.7168,
+              43.0664
+            ],
+            [
+              124.4531,
+              42.8467
+            ],
+            [
+              124.2773,
+              43.2422
+            ],
+            [
+              123.8379,
+              43.4619
+            ],
+            [
+              123.6621,
+              43.374
+            ],
+            [
+              123.3105,
+              43.5059
+            ],
+            [
+              123.4863,
+              43.7256
+            ],
+            [
+              123.1348,
+              44.4727
+            ],
+            [
+              122.3438,
+              44.2529
+            ],
+            [
+              122.0801,
+              44.8682
+            ],
+            [
+              122.2559,
+              45.2637
+            ],
+            [
+              121.9043,
+              45.7031
+            ],
+            [
+              121.7285,
+              45.7471
+            ],
+            [
+              121.8164,
+              46.0107
+            ],
+            [
+              122.2559,
+              45.791
+            ],
+            [
+              122.4316,
+              45.8789
+            ],
+            [
+              122.6953,
+              45.7031
+            ],
+            [
+              122.7832,
+              46.0107
+            ],
+            [
+              123.2227,
+              46.2305
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "he_bei",
+      "properties": {
+        "name": "河北",
+        "cp": [
+          115.4004,
+          37.9688
+        ],
+        "childNum": 11
+      },
+      "geometry": {
+        "type": "MultiPolygon",
+        "coordinates": [
+          [
+            [
+              [
+                114.5215,
+                39.5068
+              ],
+              [
+                114.3457,
+                39.8584
+              ],
+              [
+                113.9941,
+                39.9902
+              ],
+              [
+                114.5215,
+                40.3418
+              ],
+              [
+                114.3457,
+                40.3857
+              ],
+              [
+                114.2578,
+                40.6055
+              ],
+              [
+                114.082,
+                40.7373
+              ],
+              [
+                113.9063,
+                41.1328
+              ],
+              [
+                113.9941,
+                41.2207
+              ],
+              [
+                113.9063,
+                41.4404
+              ],
+              [
+                114.2578,
+                41.5723
+              ],
+              [
+                114.1699,
+                41.792
+              ],
+              [
+                114.5215,
+                42.1436
+              ],
+              [
+                114.873,
+                42.0996
+              ],
+              [
+                114.9609,
+                41.6162
+              ],
+              [
+                115.2246,
+                41.5723
+              ],
+              [
+                115.9277,
+                41.9238
+              ],
+              [
+                116.0156,
+                41.792
+              ],
+              [
+                116.2793,
+                42.0117
+              ],
+              [
+                116.8066,
+                42.0117
+              ],
+              [
+                116.8945,
+                42.4072
+              ],
+              [
+                117.334,
+                42.4512
+              ],
+              [
+                117.5098,
+                42.583
+              ],
+              [
+                117.7734,
+                42.627
+              ],
+              [
+                118.0371,
+                42.4072
+              ],
+              [
+                117.9492,
+                42.2314
+              ],
+              [
+                118.125,
+                42.0557
+              ],
+              [
+                118.3008,
+                42.0996
+              ],
+              [
+                118.3008,
+                41.792
+              ],
+              [
+                118.125,
+                41.748
+              ],
+              [
+                118.3887,
+                41.3086
+              ],
+              [
+                119.2676,
+                41.3086
+              ],
+              [
+                118.8281,
+                40.8252
+              ],
+              [
+                119.2676,
+                40.5176
+              ],
+              [
+                119.5313,
+                40.5615
+              ],
+              [
+                119.707,
+                40.1221
+              ],
+              [
+                119.8828,
+                39.9463
+              ],
+              [
+                119.5313,
+                39.6826
+              ],
+              [
+                119.4434,
+                39.4189
+              ],
+              [
+                118.916,
+                39.0674
+              ],
+              [
+                118.4766,
+                38.9355
+              ],
+              [
+                118.125,
+                39.0234
+              ],
+              [
+                118.0371,
+                39.1992
+              ],
+              [
+                118.0371,
+                39.2432
+              ],
+              [
+                117.8613,
+                39.4189
+              ],
+              [
+                117.9492,
+                39.5947
+              ],
+              [
+                117.6855,
+                39.5947
+              ],
+              [
+                117.5098,
+                39.7705
+              ],
+              [
+                117.5098,
+                39.9902
+              ],
+              [
+                117.6855,
+                39.9902
+              ],
+              [
+                117.6855,
+                40.0781
+              ],
+              [
+                117.4219,
+                40.21
+              ],
+              [
+                117.2461,
+                40.5176
+              ],
+              [
+                117.4219,
+                40.6494
+              ],
+              [
+                116.9824,
+                40.6934
+              ],
+              [
+                116.6309,
+                41.0449
+              ],
+              [
+                116.3672,
+                40.9131
+              ],
+              [
+                116.4551,
+                40.7813
+              ],
+              [
+                116.1914,
+                40.7813
+              ],
+              [
+                116.1035,
+                40.6055
+              ],
+              [
+                115.752,
+                40.5615
+              ],
+              [
+                115.9277,
+                40.2539
+              ],
+              [
+                115.4004,
+                39.9463
+              ],
+              [
+                115.4883,
+                39.6387
+              ],
+              [
+                115.752,
+                39.5068
+              ],
+              [
+                116.1914,
+                39.5947
+              ],
+              [
+                116.3672,
+                39.4629
+              ],
+              [
+                116.543,
+                39.5947
+              ],
+              [
+                116.8066,
+                39.5947
+              ],
+              [
+                116.8945,
+                39.1113
+              ],
+              [
+                116.7188,
+                38.9355
+              ],
+              [
+                116.7188,
+                38.8037
+              ],
+              [
+                117.2461,
+                38.54
+              ],
+              [
+                117.5977,
+                38.6279
+              ],
+              [
+                117.9492,
+                38.3203
+              ],
+              [
+                117.4219,
+                37.8369
+              ],
+              [
+                116.8066,
+                37.8369
+              ],
+              [
+                116.4551,
+                37.4854
+              ],
+              [
+                116.2793,
+                37.5732
+              ],
+              [
+                116.2793,
+                37.3535
+              ],
+              [
+                116.0156,
+                37.3535
+              ],
+              [
+                115.752,
+                36.9141
+              ],
+              [
+                115.3125,
+                36.5186
+              ],
+              [
+                115.4883,
+                36.167
+              ],
+              [
+                115.3125,
+                36.0791
+              ],
+              [
+                115.1367,
+                36.2109
+              ],
+              [
+                114.9609,
+                36.0791
+              ],
+              [
+                114.873,
+                36.123
+              ],
+              [
+                113.7305,
+                36.3428
+              ],
+              [
+                113.4668,
+                36.6504
+              ],
+              [
+                113.7305,
+                36.8701
+              ],
+              [
+                113.7305,
+                37.1338
+              ],
+              [
+                114.1699,
+                37.6611
+              ],
+              [
+                113.9941,
+                37.7051
+              ],
+              [
+                113.8184,
+                38.1445
+              ],
+              [
+                113.5547,
+                38.2764
+              ],
+              [
+                113.5547,
+                38.54
+              ],
+              [
+                113.8184,
+                38.8037
+              ],
+              [
+                113.8184,
+                38.9355
+              ],
+              [
+                113.9063,
+                39.0234
+              ],
+              [
+                114.3457,
+                39.0674
+              ],
+              [
+                114.5215,
+                39.5068
+              ]
+            ]
+          ],
+          [
+            [
+              [
+                117.2461,
+                40.0781
+              ],
+              [
+                117.1582,
+                39.8145
+              ],
+              [
+                117.1582,
+                39.6387
+              ],
+              [
+                116.8945,
+                39.6826
+              ],
+              [
+                116.8945,
+                39.8145
+              ],
+              [
+                116.8066,
+                39.9902
+              ],
+              [
+                117.2461,
+                40.0781
+              ]
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "hu_bei",
+      "properties": {
+        "name": "湖北",
+        "cp": [
+          112.2363,
+          31.1572
+        ],
+        "childNum": 17
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              110.2148,
+              31.1572
+            ],
+            [
+              110.127,
+              31.377
+            ],
+            [
+              109.6875,
+              31.5527
+            ],
+            [
+              109.7754,
+              31.6846
+            ],
+            [
+              109.5996,
+              31.7285
+            ],
+            [
+              109.5117,
+              32.4316
+            ],
+            [
+              109.6875,
+              32.6074
+            ],
+            [
+              110.127,
+              32.6074
+            ],
+            [
+              110.127,
+              32.7393
+            ],
+            [
+              109.7754,
+              32.915
+            ],
+            [
+              109.7754,
+              33.0469
+            ],
+            [
+              109.4238,
+              33.1348
+            ],
+            [
+              109.5996,
+              33.2666
+            ],
+            [
+              110.3027,
+              33.1787
+            ],
+            [
+              110.5664,
+              33.2666
+            ],
+            [
+              110.7422,
+              33.1348
+            ],
+            [
+              111.0059,
+              33.2666
+            ],
+            [
+              111.5332,
+              32.6074
+            ],
+            [
+              112.3242,
+              32.3438
+            ],
+            [
+              113.2031,
+              32.4316
+            ],
+            [
+              113.4668,
+              32.2998
+            ],
+            [
+              113.7305,
+              32.4316
+            ],
+            [
+              113.8184,
+              31.8604
+            ],
+            [
+              113.9941,
+              31.7725
+            ],
+            [
+              114.1699,
+              31.8604
+            ],
+            [
+              114.5215,
+              31.7725
+            ],
+            [
+              114.6094,
+              31.5527
+            ],
+            [
+              114.7852,
+              31.4648
+            ],
+            [
+              115.1367,
+              31.5967
+            ],
+            [
+              115.2246,
+              31.4209
+            ],
+            [
+              115.4004,
+              31.4209
+            ],
+            [
+              115.5762,
+              31.2012
+            ],
+            [
+              116.0156,
+              31.0254
+            ],
+            [
+              115.752,
+              30.6738
+            ],
+            [
+              116.1035,
+              30.1904
+            ],
+            [
+              116.1035,
+              29.8389
+            ],
+            [
+              115.9277,
+              29.707
+            ],
+            [
+              115.4883,
+              29.7949
+            ],
+            [
+              114.873,
+              29.3994
+            ],
+            [
+              114.2578,
+              29.3555
+            ],
+            [
+              113.9063,
+              29.0479
+            ],
+            [
+              113.7305,
+              29.0918
+            ],
+            [
+              113.6426,
+              29.3115
+            ],
+            [
+              113.7305,
+              29.5752
+            ],
+            [
+              113.5547,
+              29.707
+            ],
+            [
+              113.5547,
+              29.8389
+            ],
+            [
+              113.0273,
+              29.4434
+            ],
+            [
+              112.9395,
+              29.4873
+            ],
+            [
+              113.0273,
+              29.751
+            ],
+            [
+              112.9395,
+              29.7949
+            ],
+            [
+              112.6758,
+              29.5752
+            ],
+            [
+              112.5,
+              29.6191
+            ],
+            [
+              112.2363,
+              29.5313
+            ],
+            [
+              111.7969,
+              29.9268
+            ],
+            [
+              110.8301,
+              30.1465
+            ],
+            [
+              110.4785,
+              30.0146
+            ],
+            [
+              110.6543,
+              29.751
+            ],
+            [
+              110.4785,
+              29.6631
+            ],
+            [
+              109.7754,
+              29.751
+            ],
+            [
+              109.6875,
+              29.6191
+            ],
+            [
+              109.5117,
+              29.6191
+            ],
+            [
+              109.248,
+              29.1357
+            ],
+            [
+              109.0723,
+              29.3555
+            ],
+            [
+              108.9844,
+              29.3115
+            ],
+            [
+              108.6328,
+              29.8389
+            ],
+            [
+              108.457,
+              29.7949
+            ],
+            [
+              108.5449,
+              30.2344
+            ],
+            [
+              108.457,
+              30.4102
+            ],
+            [
+              108.6328,
+              30.5859
+            ],
+            [
+              108.8086,
+              30.498
+            ],
+            [
+              109.0723,
+              30.6299
+            ],
+            [
+              109.1602,
+              30.542
+            ],
+            [
+              109.248,
+              30.6299
+            ],
+            [
+              109.4238,
+              30.542
+            ],
+            [
+              109.8633,
+              30.8936
+            ],
+            [
+              110.0391,
+              30.8057
+            ],
+            [
+              110.2148,
+              31.1572
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "gui_zhou",
+      "properties": {
+        "name": "贵州",
+        "cp": [
+          106.6113,
+          26.9385
+        ],
+        "childNum": 9
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              104.1504,
+              27.2461
+            ],
+            [
+              104.4141,
+              27.4658
+            ],
+            [
+              104.5898,
+              27.334
+            ],
+            [
+              105.2051,
+              27.3779
+            ],
+            [
+              105.293,
+              27.7295
+            ],
+            [
+              105.5566,
+              27.7734
+            ],
+            [
+              105.6445,
+              27.6416
+            ],
+            [
+              106.3477,
+              27.8174
+            ],
+            [
+              106.1719,
+              28.125
+            ],
+            [
+              105.9082,
+              28.125
+            ],
+            [
+              105.6445,
+              28.4326
+            ],
+            [
+              105.9961,
+              28.7402
+            ],
+            [
+              106.3477,
+              28.5205
+            ],
+            [
+              106.5234,
+              28.5645
+            ],
+            [
+              106.4355,
+              28.7842
+            ],
+            [
+              106.5234,
+              28.7842
+            ],
+            [
+              106.6113,
+              28.6523
+            ],
+            [
+              106.6113,
+              28.5205
+            ],
+            [
+              106.6992,
+              28.4766
+            ],
+            [
+              106.875,
+              28.7842
+            ],
+            [
+              107.4023,
+              28.8721
+            ],
+            [
+              107.4023,
+              29.1797
+            ],
+            [
+              107.5781,
+              29.2236
+            ],
+            [
+              107.8418,
+              29.1357
+            ],
+            [
+              107.8418,
+              29.0039
+            ],
+            [
+              108.2813,
+              29.0918
+            ],
+            [
+              108.3691,
+              28.6523
+            ],
+            [
+              108.5449,
+              28.6523
+            ],
+            [
+              108.5449,
+              28.3887
+            ],
+            [
+              108.7207,
+              28.4766
+            ],
+            [
+              108.7207,
+              28.2129
+            ],
+            [
+              109.0723,
+              28.2129
+            ],
+            [
+              109.248,
+              28.4766
+            ],
+            [
+              109.3359,
+              28.2568
+            ],
+            [
+              109.3359,
+              27.9053
+            ],
+            [
+              109.4238,
+              27.5977
+            ],
+            [
+              108.8086,
+              27.1143
+            ],
+            [
+              108.8965,
+              27.0264
+            ],
+            [
+              109.3359,
+              27.1582
+            ],
+            [
+              109.5117,
+              27.0264
+            ],
+            [
+              109.5117,
+              26.8066
+            ],
+            [
+              109.3359,
+              26.7188
+            ],
+            [
+              109.4238,
+              26.5869
+            ],
+            [
+              109.248,
+              26.3232
+            ],
+            [
+              109.4238,
+              26.2793
+            ],
+            [
+              109.5117,
+              26.0156
+            ],
+            [
+              109.3359,
+              25.708
+            ],
+            [
+              108.9844,
+              25.752
+            ],
+            [
+              109.0723,
+              25.5322
+            ],
+            [
+              108.6328,
+              25.5762
+            ],
+            [
+              108.6328,
+              25.3125
+            ],
+            [
+              108.3691,
+              25.5322
+            ],
+            [
+              108.1934,
+              25.4443
+            ],
+            [
+              108.1055,
+              25.2246
+            ],
+            [
+              107.8418,
+              25.1367
+            ],
+            [
+              107.7539,
+              25.2246
+            ],
+            [
+              107.4902,
+              25.2246
+            ],
+            [
+              107.2266,
+              25.6201
+            ],
+            [
+              106.9629,
+              25.4883
+            ],
+            [
+              107.0508,
+              25.2686
+            ],
+            [
+              106.875,
+              25.1807
+            ],
+            [
+              106.1719,
+              24.9609
+            ],
+            [
+              106.1719,
+              24.7852
+            ],
+            [
+              105.9961,
+              24.6533
+            ],
+            [
+              105.2051,
+              24.9609
+            ],
+            [
+              104.6777,
+              24.6094
+            ],
+            [
+              104.502,
+              24.7412
+            ],
+            [
+              104.6777,
+              24.9609
+            ],
+            [
+              104.5898,
+              25.0488
+            ],
+            [
+              104.8535,
+              25.2246
+            ],
+            [
+              104.3262,
+              25.708
+            ],
+            [
+              104.6777,
+              26.4111
+            ],
+            [
+              104.4141,
+              26.6748
+            ],
+            [
+              103.8867,
+              26.543
+            ],
+            [
+              103.7109,
+              26.7627
+            ],
+            [
+              103.7109,
+              26.9824
+            ],
+            [
+              103.623,
+              27.0264
+            ],
+            [
+              103.8867,
+              27.4219
+            ],
+            [
+              104.1504,
+              27.2461
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "shan_dong",
+      "properties": {
+        "name": "山东",
+        "cp": [
+          118.7402,
+          36.4307
+        ],
+        "childNum": 17
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              115.4883,
+              36.167
+            ],
+            [
+              115.3125,
+              36.5186
+            ],
+            [
+              115.752,
+              36.9141
+            ],
+            [
+              116.0156,
+              37.3535
+            ],
+            [
+              116.2793,
+              37.3535
+            ],
+            [
+              116.2793,
+              37.5732
+            ],
+            [
+              116.4551,
+              37.4854
+            ],
+            [
+              116.8066,
+              37.8369
+            ],
+            [
+              117.4219,
+              37.8369
+            ],
+            [
+              117.9492,
+              38.3203
+            ],
+            [
+              118.125,
+              38.1445
+            ],
+            [
+              118.916,
+              38.1445
+            ],
+            [
+              119.3555,
+              37.6611
+            ],
+            [
+              119.0039,
+              37.5293
+            ],
+            [
+              119.0039,
+              37.3535
+            ],
+            [
+              119.3555,
+              37.1338
+            ],
+            [
+              119.707,
+              37.1338
+            ],
+            [
+              119.8828,
+              37.3975
+            ],
+            [
+              120.498,
+              37.8369
+            ],
+            [
+              120.5859,
+              38.1445
+            ],
+            [
+              120.9375,
+              38.4521
+            ],
+            [
+              121.0254,
+              37.8369
+            ],
+            [
+              121.2012,
+              37.6611
+            ],
+            [
+              121.9043,
+              37.4854
+            ],
+            [
+              122.168,
+              37.6172
+            ],
+            [
+              122.2559,
+              37.4854
+            ],
+            [
+              122.6074,
+              37.4854
+            ],
+            [
+              122.6953,
+              37.3535
+            ],
+            [
+              122.6074,
+              36.9141
+            ],
+            [
+              122.4316,
+              36.7822
+            ],
+            [
+              121.8164,
+              36.8701
+            ],
+            [
+              121.7285,
+              36.6943
+            ],
+            [
+              121.1133,
+              36.6064
+            ],
+            [
+              121.1133,
+              36.4307
+            ],
+            [
+              121.377,
+              36.2549
+            ],
+            [
+              120.7617,
+              36.167
+            ],
+            [
+              120.9375,
+              35.8594
+            ],
+            [
+              120.6738,
+              36.0352
+            ],
+            [
+              119.707,
+              35.4639
+            ],
+            [
+              119.9707,
+              34.9805
+            ],
+            [
+              119.3555,
+              35.0244
+            ],
+            [
+              119.2676,
+              35.1123
+            ],
+            [
+              118.916,
+              35.0244
+            ],
+            [
+              118.7402,
+              34.7168
+            ],
+            [
+              118.4766,
+              34.6729
+            ],
+            [
+              118.3887,
+              34.4092
+            ],
+            [
+              118.2129,
+              34.4092
+            ],
+            [
+              118.125,
+              34.6289
+            ],
+            [
+              117.9492,
+              34.6729
+            ],
+            [
+              117.5977,
+              34.4531
+            ],
+            [
+              117.334,
+              34.585
+            ],
+            [
+              117.2461,
+              34.4531
+            ],
+            [
+              116.8066,
+              34.9365
+            ],
+            [
+              116.4551,
+              34.8926
+            ],
+            [
+              116.3672,
+              34.6289
+            ],
+            [
+              116.1914,
+              34.585
+            ],
+            [
+              115.5762,
+              34.585
+            ],
+            [
+              115.4004,
+              34.8486
+            ],
+            [
+              114.7852,
+              35.0684
+            ],
+            [
+              115.0488,
+              35.376
+            ],
+            [
+              115.2246,
+              35.4199
+            ],
+            [
+              115.4883,
+              35.7275
+            ],
+            [
+              116.1035,
+              36.0791
+            ],
+            [
+              115.3125,
+              35.8154
+            ],
+            [
+              115.4883,
+              36.167
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "jiang_xi",
+      "properties": {
+        "name": "江西",
+        "cp": [
+          116.0156,
+          27.29
+        ],
+        "childNum": 11
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              114.2578,
+              28.3447
+            ],
+            [
+              114.082,
+              28.5645
+            ],
+            [
+              114.1699,
+              28.8281
+            ],
+            [
+              113.9063,
+              29.0479
+            ],
+            [
+              114.2578,
+              29.3555
+            ],
+            [
+              114.873,
+              29.3994
+            ],
+            [
+              115.4883,
+              29.7949
+            ],
+            [
+              115.9277,
+              29.707
+            ],
+            [
+              116.1035,
+              29.8389
+            ],
+            [
+              116.2793,
+              29.7949
+            ],
+            [
+              116.7188,
+              30.0586
+            ],
+            [
+              116.8945,
+              29.9268
+            ],
+            [
+              116.7188,
+              29.751
+            ],
+            [
+              116.7188,
+              29.6191
+            ],
+            [
+              117.1582,
+              29.707
+            ],
+            [
+              117.0703,
+              29.8389
+            ],
+            [
+              117.1582,
+              29.9268
+            ],
+            [
+              117.5098,
+              29.6191
+            ],
+            [
+              118.0371,
+              29.5752
+            ],
+            [
+              118.2129,
+              29.3994
+            ],
+            [
+              118.0371,
+              29.1797
+            ],
+            [
+              118.0371,
+              29.0479
+            ],
+            [
+              118.3887,
+              28.7842
+            ],
+            [
+              118.4766,
+              28.3447
+            ],
+            [
+              118.4766,
+              28.3008
+            ],
+            [
+              118.3008,
+              28.0811
+            ],
+            [
+              117.7734,
+              27.8174
+            ],
+            [
+              117.5098,
+              27.9932
+            ],
+            [
+              116.9824,
+              27.6416
+            ],
+            [
+              117.1582,
+              27.29
+            ],
+            [
+              117.0703,
+              27.1143
+            ],
+            [
+              116.543,
+              26.8066
+            ],
+            [
+              116.6309,
+              26.4551
+            ],
+            [
+              116.3672,
+              26.2354
+            ],
+            [
+              116.4551,
+              26.1035
+            ],
+            [
+              116.1914,
+              25.8838
+            ],
+            [
+              116.0156,
+              25.2686
+            ],
+            [
+              115.8398,
+              25.2246
+            ],
+            [
+              115.9277,
+              24.917
+            ],
+            [
+              115.752,
+              24.7852
+            ],
+            [
+              115.8398,
+              24.5654
+            ],
+            [
+              115.4004,
+              24.7852
+            ],
+            [
+              114.4336,
+              24.5215
+            ],
+            [
+              114.1699,
+              24.6973
+            ],
+            [
+              114.4336,
+              24.9609
+            ],
+            [
+              114.6973,
+              25.1367
+            ],
+            [
+              114.7852,
+              25.2686
+            ],
+            [
+              114.6094,
+              25.4004
+            ],
+            [
+              113.9941,
+              25.2686
+            ],
+            [
+              113.9063,
+              25.4443
+            ],
+            [
+              113.9941,
+              26.0596
+            ],
+            [
+              114.2578,
+              26.1475
+            ],
+            [
+              113.9941,
+              26.1914
+            ],
+            [
+              114.082,
+              26.5869
+            ],
+            [
+              113.9063,
+              26.6309
+            ],
+            [
+              113.9063,
+              26.9385
+            ],
+            [
+              113.7305,
+              27.1143
+            ],
+            [
+              113.8184,
+              27.29
+            ],
+            [
+              113.6426,
+              27.3779
+            ],
+            [
+              113.6426,
+              27.5977
+            ],
+            [
+              113.7305,
+              27.9492
+            ],
+            [
+              114.2578,
+              28.3447
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "he_nan",
+      "properties": {
+        "name": "河南",
+        "cp": [
+          113.4668,
+          33.8818
+        ],
+        "childNum": 17
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              110.3906,
+              34.585
+            ],
+            [
+              110.8301,
+              34.6289
+            ],
+            [
+              111.1816,
+              34.8047
+            ],
+            [
+              111.5332,
+              34.8486
+            ],
+            [
+              111.7969,
+              35.0684
+            ],
+            [
+              112.0605,
+              35.0684
+            ],
+            [
+              112.0605,
+              35.2881
+            ],
+            [
+              112.7637,
+              35.2002
+            ],
+            [
+              113.1152,
+              35.332
+            ],
+            [
+              113.6426,
+              35.6836
+            ],
+            [
+              113.7305,
+              36.3428
+            ],
+            [
+              114.873,
+              36.123
+            ],
+            [
+              114.9609,
+              36.0791
+            ],
+            [
+              115.1367,
+              36.2109
+            ],
+            [
+              115.3125,
+              36.0791
+            ],
+            [
+              115.4883,
+              36.167
+            ],
+            [
+              115.3125,
+              35.8154
+            ],
+            [
+              116.1035,
+              36.0791
+            ],
+            [
+              115.4883,
+              35.7275
+            ],
+            [
+              115.2246,
+              35.4199
+            ],
+            [
+              115.0488,
+              35.376
+            ],
+            [
+              114.7852,
+              35.0684
+            ],
+            [
+              115.4004,
+              34.8486
+            ],
+            [
+              115.5762,
+              34.585
+            ],
+            [
+              116.1914,
+              34.585
+            ],
+            [
+              116.1914,
+              34.4092
+            ],
+            [
+              116.543,
+              34.2773
+            ],
+            [
+              116.6309,
+              33.9258
+            ],
+            [
+              116.1914,
+              33.7061
+            ],
+            [
+              116.0156,
+              33.9697
+            ],
+            [
+              115.6641,
+              34.0576
+            ],
+            [
+              115.5762,
+              33.9258
+            ],
+            [
+              115.5762,
+              33.6621
+            ],
+            [
+              115.4004,
+              33.5303
+            ],
+            [
+              115.3125,
+              33.1787
+            ],
+            [
+              114.873,
+              33.1348
+            ],
+            [
+              114.873,
+              33.0029
+            ],
+            [
+              115.1367,
+              32.8711
+            ],
+            [
+              115.2246,
+              32.6074
+            ],
+            [
+              115.5762,
+              32.4316
+            ],
+            [
+              115.8398,
+              32.5195
+            ],
+            [
+              115.9277,
+              31.7725
+            ],
+            [
+              115.4883,
+              31.6846
+            ],
+            [
+              115.4004,
+              31.4209
+            ],
+            [
+              115.2246,
+              31.4209
+            ],
+            [
+              115.1367,
+              31.5967
+            ],
+            [
+              114.7852,
+              31.4648
+            ],
+            [
+              114.6094,
+              31.5527
+            ],
+            [
+              114.5215,
+              31.7725
+            ],
+            [
+              114.1699,
+              31.8604
+            ],
+            [
+              113.9941,
+              31.7725
+            ],
+            [
+              113.8184,
+              31.8604
+            ],
+            [
+              113.7305,
+              32.4316
+            ],
+            [
+              113.4668,
+              32.2998
+            ],
+            [
+              113.2031,
+              32.4316
+            ],
+            [
+              112.3242,
+              32.3438
+            ],
+            [
+              111.5332,
+              32.6074
+            ],
+            [
+              111.0059,
+              33.2666
+            ],
+            [
+              111.0059,
+              33.5303
+            ],
+            [
+              110.6543,
+              33.8379
+            ],
+            [
+              110.6543,
+              34.1455
+            ],
+            [
+              110.4785,
+              34.2334
+            ],
+            [
+              110.3906,
+              34.585
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "liao_ning",
+      "properties": {
+        "name": "辽宁",
+        "cp": [
+          122.3438,
+          41.0889
+        ],
+        "childNum": 14
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              119.2676,
+              41.3086
+            ],
+            [
+              119.4434,
+              41.6162
+            ],
+            [
+              119.2676,
+              41.7041
+            ],
+            [
+              119.3555,
+              42.2754
+            ],
+            [
+              119.5313,
+              42.3633
+            ],
+            [
+              119.8828,
+              42.1875
+            ],
+            [
+              120.1465,
+              41.7041
+            ],
+            [
+              120.498,
+              42.0996
+            ],
+            [
+              121.4648,
+              42.4951
+            ],
+            [
+              121.7285,
+              42.4512
+            ],
+            [
+              121.9922,
+              42.7148
+            ],
+            [
+              122.3438,
+              42.6709
+            ],
+            [
+              122.3438,
+              42.8467
+            ],
+            [
+              122.7832,
+              42.7148
+            ],
+            [
+              123.1348,
+              42.8027
+            ],
+            [
+              123.3105,
+              42.9785
+            ],
+            [
+              123.5742,
+              43.0225
+            ],
+            [
+              123.6621,
+              43.374
+            ],
+            [
+              123.8379,
+              43.4619
+            ],
+            [
+              124.2773,
+              43.2422
+            ],
+            [
+              124.4531,
+              42.8467
+            ],
+            [
+              124.7168,
+              43.0664
+            ],
+            [
+              124.8926,
+              43.0664
+            ],
+            [
+              124.8926,
+              42.8027
+            ],
+            [
+              125.332,
+              42.1436
+            ],
+            [
+              125.4199,
+              42.0996
+            ],
+            [
+              125.332,
+              41.9678
+            ],
+            [
+              125.332,
+              41.6602
+            ],
+            [
+              125.7715,
+              41.2207
+            ],
+            [
+              125.5957,
+              40.9131
+            ],
+            [
+              125.6836,
+              40.8691
+            ],
+            [
+              124.541,
+              40.21
+            ],
+            [
+              124.1016,
+              39.6826
+            ],
+            [
+              123.3984,
+              39.6826
+            ],
+            [
+              123.1348,
+              39.4189
+            ],
+            [
+              123.1348,
+              39.0234
+            ],
+            [
+              122.0801,
+              39.0234
+            ],
+            [
+              121.5527,
+              38.7158
+            ],
+            [
+              121.1133,
+              38.6719
+            ],
+            [
+              120.9375,
+              38.9795
+            ],
+            [
+              121.377,
+              39.1992
+            ],
+            [
+              121.2012,
+              39.5508
+            ],
+            [
+              122.0801,
+              40.3857
+            ],
+            [
+              121.9922,
+              40.6934
+            ],
+            [
+              121.7285,
+              40.8252
+            ],
+            [
+              121.2012,
+              40.8252
+            ],
+            [
+              120.5859,
+              40.21
+            ],
+            [
+              119.8828,
+              39.9463
+            ],
+            [
+              119.707,
+              40.1221
+            ],
+            [
+              119.5313,
+              40.5615
+            ],
+            [
+              119.2676,
+              40.5176
+            ],
+            [
+              118.8281,
+              40.8252
+            ],
+            [
+              119.2676,
+              41.3086
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "shan_xi_2",
+      "properties": {
+        "name": "山西",
+        "cp": [
+          112.4121,
+          37.6611
+        ],
+        "childNum": 11
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              110.918,
+              38.7158
+            ],
+            [
+              111.1816,
+              39.2432
+            ],
+            [
+              111.0938,
+              39.375
+            ],
+            [
+              111.3574,
+              39.4189
+            ],
+            [
+              111.4453,
+              39.6387
+            ],
+            [
+              111.9727,
+              39.5947
+            ],
+            [
+              112.3242,
+              40.2539
+            ],
+            [
+              112.7637,
+              40.166
+            ],
+            [
+              113.2031,
+              40.3857
+            ],
+            [
+              113.5547,
+              40.3418
+            ],
+            [
+              113.8184,
+              40.5176
+            ],
+            [
+              114.082,
+              40.5176
+            ],
+            [
+              114.082,
+              40.7373
+            ],
+            [
+              114.2578,
+              40.6055
+            ],
+            [
+              114.3457,
+              40.3857
+            ],
+            [
+              114.5215,
+              40.3418
+            ],
+            [
+              113.9941,
+              39.9902
+            ],
+            [
+              114.3457,
+              39.8584
+            ],
+            [
+              114.5215,
+              39.5068
+            ],
+            [
+              114.3457,
+              39.0674
+            ],
+            [
+              113.9063,
+              39.0234
+            ],
+            [
+              113.8184,
+              38.9355
+            ],
+            [
+              113.8184,
+              38.8037
+            ],
+            [
+              113.5547,
+              38.54
+            ],
+            [
+              113.5547,
+              38.2764
+            ],
+            [
+              113.8184,
+              38.1445
+            ],
+            [
+              113.9941,
+              37.7051
+            ],
+            [
+              114.1699,
+              37.6611
+            ],
+            [
+              113.7305,
+              37.1338
+            ],
+            [
+              113.7305,
+              36.8701
+            ],
+            [
+              113.4668,
+              36.6504
+            ],
+            [
+              113.7305,
+              36.3428
+            ],
+            [
+              113.6426,
+              35.6836
+            ],
+            [
+              113.1152,
+              35.332
+            ],
+            [
+              112.7637,
+              35.2002
+            ],
+            [
+              112.0605,
+              35.2881
+            ],
+            [
+              112.0605,
+              35.0684
+            ],
+            [
+              111.7969,
+              35.0684
+            ],
+            [
+              111.5332,
+              34.8486
+            ],
+            [
+              111.1816,
+              34.8047
+            ],
+            [
+              110.8301,
+              34.6289
+            ],
+            [
+              110.3906,
+              34.585
+            ],
+            [
+              110.2148,
+              34.6729
+            ],
+            [
+              110.2148,
+              34.8926
+            ],
+            [
+              110.5664,
+              35.6396
+            ],
+            [
+              110.4785,
+              36.123
+            ],
+            [
+              110.3906,
+              37.002
+            ],
+            [
+              110.8301,
+              37.6611
+            ],
+            [
+              110.4785,
+              37.9688
+            ],
+            [
+              110.4785,
+              38.1885
+            ],
+            [
+              110.8301,
+              38.4961
+            ],
+            [
+              110.918,
+              38.7158
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "an_hui",
+      "properties": {
+        "name": "安徽",
+        "cp": [
+          117.2461,
+          32.0361
+        ],
+        "childNum": 17
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              116.6309,
+              33.9258
+            ],
+            [
+              116.543,
+              34.2773
+            ],
+            [
+              116.1914,
+              34.4092
+            ],
+            [
+              116.1914,
+              34.585
+            ],
+            [
+              116.3672,
+              34.6289
+            ],
+            [
+              116.8945,
+              34.4092
+            ],
+            [
+              117.1582,
+              34.0576
+            ],
+            [
+              117.5977,
+              34.0137
+            ],
+            [
+              117.7734,
+              33.7061
+            ],
+            [
+              118.125,
+              33.75
+            ],
+            [
+              117.9492,
+              33.2227
+            ],
+            [
+              118.0371,
+              33.1348
+            ],
+            [
+              118.2129,
+              33.2227
+            ],
+            [
+              118.3008,
+              32.7832
+            ],
+            [
+              118.7402,
+              32.7393
+            ],
+            [
+              118.916,
+              32.959
+            ],
+            [
+              119.1797,
+              32.8271
+            ],
+            [
+              119.1797,
+              32.4756
+            ],
+            [
+              118.5645,
+              32.5635
+            ],
+            [
+              118.6523,
+              32.2119
+            ],
+            [
+              118.4766,
+              32.168
+            ],
+            [
+              118.3887,
+              31.9482
+            ],
+            [
+              118.916,
+              31.5527
+            ],
+            [
+              118.7402,
+              31.377
+            ],
+            [
+              118.8281,
+              31.2451
+            ],
+            [
+              119.3555,
+              31.2891
+            ],
+            [
+              119.4434,
+              31.1572
+            ],
+            [
+              119.6191,
+              31.1133
+            ],
+            [
+              119.6191,
+              31.0693
+            ],
+            [
+              119.4434,
+              30.6738
+            ],
+            [
+              119.2676,
+              30.6299
+            ],
+            [
+              119.3555,
+              30.4102
+            ],
+            [
+              118.916,
+              30.3223
+            ],
+            [
+              118.916,
+              29.9707
+            ],
+            [
+              118.7402,
+              29.707
+            ],
+            [
+              118.2129,
+              29.3994
+            ],
+            [
+              118.0371,
+              29.5752
+            ],
+            [
+              117.5098,
+              29.6191
+            ],
+            [
+              117.1582,
+              29.9268
+            ],
+            [
+              117.0703,
+              29.8389
+            ],
+            [
+              117.1582,
+              29.707
+            ],
+            [
+              116.7188,
+              29.6191
+            ],
+            [
+              116.7188,
+              29.751
+            ],
+            [
+              116.8945,
+              29.9268
+            ],
+            [
+              116.7188,
+              30.0586
+            ],
+            [
+              116.2793,
+              29.7949
+            ],
+            [
+              116.1035,
+              29.8389
+            ],
+            [
+              116.1035,
+              30.1904
+            ],
+            [
+              115.752,
+              30.6738
+            ],
+            [
+              116.0156,
+              31.0254
+            ],
+            [
+              115.5762,
+              31.2012
+            ],
+            [
+              115.4004,
+              31.4209
+            ],
+            [
+              115.4883,
+              31.6846
+            ],
+            [
+              115.9277,
+              31.7725
+            ],
+            [
+              115.8398,
+              32.5195
+            ],
+            [
+              115.5762,
+              32.4316
+            ],
+            [
+              115.2246,
+              32.6074
+            ],
+            [
+              115.1367,
+              32.8711
+            ],
+            [
+              114.873,
+              33.0029
+            ],
+            [
+              114.873,
+              33.1348
+            ],
+            [
+              115.3125,
+              33.1787
+            ],
+            [
+              115.4004,
+              33.5303
+            ],
+            [
+              115.5762,
+              33.6621
+            ],
+            [
+              115.5762,
+              33.9258
+            ],
+            [
+              115.6641,
+              34.0576
+            ],
+            [
+              116.0156,
+              33.9697
+            ],
+            [
+              116.1914,
+              33.7061
+            ],
+            [
+              116.6309,
+              33.9258
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "fu_jian",
+      "properties": {
+        "name": "福建",
+        "cp": [
+          118.3008,
+          25.9277
+        ],
+        "childNum": 9
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              118.4766,
+              28.3008
+            ],
+            [
+              118.8281,
+              28.2568
+            ],
+            [
+              118.7402,
+              28.0371
+            ],
+            [
+              118.916,
+              27.4658
+            ],
+            [
+              119.2676,
+              27.4219
+            ],
+            [
+              119.6191,
+              27.6855
+            ],
+            [
+              119.7949,
+              27.29
+            ],
+            [
+              120.2344,
+              27.4219
+            ],
+            [
+              120.4102,
+              27.1582
+            ],
+            [
+              120.7617,
+              27.0264
+            ],
+            [
+              120.6738,
+              26.8945
+            ],
+            [
+              120.2344,
+              26.8506
+            ],
+            [
+              120.2344,
+              26.7188
+            ],
+            [
+              120.4102,
+              26.6748
+            ],
+            [
+              120.498,
+              26.3672
+            ],
+            [
+              120.2344,
+              26.2793
+            ],
+            [
+              120.4102,
+              26.1475
+            ],
+            [
+              120.0586,
+              26.1914
+            ],
+            [
+              119.9707,
+              25.9277
+            ],
+            [
+              119.7949,
+              25.9277
+            ],
+            [
+              119.9707,
+              25.4004
+            ],
+            [
+              119.7949,
+              25.2686
+            ],
+            [
+              119.5313,
+              25.1367
+            ],
+            [
+              119.4434,
+              25.0049
+            ],
+            [
+              119.2676,
+              25.0928
+            ],
+            [
+              118.916,
+              24.8291
+            ],
+            [
+              118.6523,
+              24.5215
+            ],
+            [
+              118.4766,
+              24.5215
+            ],
+            [
+              118.4766,
+              24.4336
+            ],
+            [
+              118.2129,
+              24.3457
+            ],
+            [
+              118.2129,
+              24.1699
+            ],
+            [
+              117.8613,
+              23.9941
+            ],
+            [
+              117.7734,
+              23.7744
+            ],
+            [
+              117.5098,
+              23.5986
+            ],
+            [
+              117.1582,
+              23.5547
+            ],
+            [
+              116.9824,
+              23.9063
+            ],
+            [
+              116.9824,
+              24.1699
+            ],
+            [
+              116.7188,
+              24.6533
+            ],
+            [
+              116.543,
+              24.6094
+            ],
+            [
+              116.3672,
+              24.873
+            ],
+            [
+              116.2793,
+              24.7852
+            ],
+            [
+              115.9277,
+              24.917
+            ],
+            [
+              115.8398,
+              25.2246
+            ],
+            [
+              116.0156,
+              25.2686
+            ],
+            [
+              116.1914,
+              25.8838
+            ],
+            [
+              116.4551,
+              26.1035
+            ],
+            [
+              116.3672,
+              26.2354
+            ],
+            [
+              116.6309,
+              26.4551
+            ],
+            [
+              116.543,
+              26.8066
+            ],
+            [
+              117.0703,
+              27.1143
+            ],
+            [
+              117.1582,
+              27.29
+            ],
+            [
+              116.9824,
+              27.6416
+            ],
+            [
+              117.5098,
+              27.9932
+            ],
+            [
+              117.7734,
+              27.8174
+            ],
+            [
+              118.3008,
+              28.0811
+            ],
+            [
+              118.4766,
+              28.3008
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "zhe_jiang",
+      "properties": {
+        "name": "浙江",
+        "cp": [
+          120.498,
+          29.0918
+        ],
+        "childNum": 11
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              118.2129,
+              29.3994
+            ],
+            [
+              118.7402,
+              29.707
+            ],
+            [
+              118.916,
+              29.9707
+            ],
+            [
+              118.916,
+              30.3223
+            ],
+            [
+              119.3555,
+              30.4102
+            ],
+            [
+              119.2676,
+              30.6299
+            ],
+            [
+              119.4434,
+              30.6738
+            ],
+            [
+              119.6191,
+              31.0693
+            ],
+            [
+              119.6191,
+              31.1133
+            ],
+            [
+              119.9707,
+              31.1572
+            ],
+            [
+              120.498,
+              30.8057
+            ],
+            [
+              120.9375,
+              31.0254
+            ],
+            [
+              121.2891,
+              30.6738
+            ],
+            [
+              121.9922,
+              30.8057
+            ],
+            [
+              122.6953,
+              30.8936
+            ],
+            [
+              122.8711,
+              30.7178
+            ],
+            [
+              122.959,
+              30.1465
+            ],
+            [
+              122.6074,
+              30.1025
+            ],
+            [
+              122.6074,
+              29.9268
+            ],
+            [
+              122.168,
+              29.5313
+            ],
+            [
+              122.3438,
+              28.8721
+            ],
+            [
+              121.9922,
+              28.8721
+            ],
+            [
+              121.9922,
+              28.4326
+            ],
+            [
+              121.7285,
+              28.3447
+            ],
+            [
+              121.7285,
+              28.2129
+            ],
+            [
+              121.4648,
+              28.2129
+            ],
+            [
+              121.5527,
+              28.0371
+            ],
+            [
+              121.2891,
+              27.9492
+            ],
+            [
+              121.1133,
+              27.4219
+            ],
+            [
+              120.6738,
+              27.334
+            ],
+            [
+              120.6738,
+              27.1582
+            ],
+            [
+              120.9375,
+              27.0264
+            ],
+            [
+              120.7617,
+              27.0264
+            ],
+            [
+              120.4102,
+              27.1582
+            ],
+            [
+              120.2344,
+              27.4219
+            ],
+            [
+              119.7949,
+              27.29
+            ],
+            [
+              119.6191,
+              27.6855
+            ],
+            [
+              119.2676,
+              27.4219
+            ],
+            [
+              118.916,
+              27.4658
+            ],
+            [
+              118.7402,
+              28.0371
+            ],
+            [
+              118.8281,
+              28.2568
+            ],
+            [
+              118.4766,
+              28.3008
+            ],
+            [
+              118.4766,
+              28.3447
+            ],
+            [
+              118.3887,
+              28.7842
+            ],
+            [
+              118.0371,
+              29.0479
+            ],
+            [
+              118.0371,
+              29.1797
+            ],
+            [
+              118.2129,
+              29.3994
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "jiang_su",
+      "properties": {
+        "name": "江苏",
+        "cp": [
+          120.0586,
+          32.915
+        ],
+        "childNum": 13
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              116.3672,
+              34.6289
+            ],
+            [
+              116.4551,
+              34.8926
+            ],
+            [
+              116.8066,
+              34.9365
+            ],
+            [
+              117.2461,
+              34.4531
+            ],
+            [
+              117.334,
+              34.585
+            ],
+            [
+              117.5977,
+              34.4531
+            ],
+            [
+              117.9492,
+              34.6729
+            ],
+            [
+              118.125,
+              34.6289
+            ],
+            [
+              118.2129,
+              34.4092
+            ],
+            [
+              118.3887,
+              34.4092
+            ],
+            [
+              118.4766,
+              34.6729
+            ],
+            [
+              118.7402,
+              34.7168
+            ],
+            [
+              118.916,
+              35.0244
+            ],
+            [
+              119.2676,
+              35.1123
+            ],
+            [
+              119.3555,
+              35.0244
+            ],
+            [
+              119.3555,
+              34.8486
+            ],
+            [
+              119.707,
+              34.585
+            ],
+            [
+              120.3223,
+              34.3652
+            ],
+            [
+              120.9375,
+              33.0469
+            ],
+            [
+              121.0254,
+              32.6514
+            ],
+            [
+              121.377,
+              32.4756
+            ],
+            [
+              121.4648,
+              32.168
+            ],
+            [
+              121.9043,
+              31.9922
+            ],
+            [
+              121.9922,
+              31.6846
+            ],
+            [
+              121.9922,
+              31.5967
+            ],
+            [
+              121.2012,
+              31.8604
+            ],
+            [
+              121.1133,
+              31.7285
+            ],
+            [
+              121.377,
+              31.5088
+            ],
+            [
+              121.2012,
+              31.4648
+            ],
+            [
+              120.9375,
+              31.0254
+            ],
+            [
+              120.498,
+              30.8057
+            ],
+            [
+              119.9707,
+              31.1572
+            ],
+            [
+              119.6191,
+              31.1133
+            ],
+            [
+              119.4434,
+              31.1572
+            ],
+            [
+              119.3555,
+              31.2891
+            ],
+            [
+              118.8281,
+              31.2451
+            ],
+            [
+              118.7402,
+              31.377
+            ],
+            [
+              118.916,
+              31.5527
+            ],
+            [
+              118.3887,
+              31.9482
+            ],
+            [
+              118.4766,
+              32.168
+            ],
+            [
+              118.6523,
+              32.2119
+            ],
+            [
+              118.5645,
+              32.5635
+            ],
+            [
+              119.1797,
+              32.4756
+            ],
+            [
+              119.1797,
+              32.8271
+            ],
+            [
+              118.916,
+              32.959
+            ],
+            [
+              118.7402,
+              32.7393
+            ],
+            [
+              118.3008,
+              32.7832
+            ],
+            [
+              118.2129,
+              33.2227
+            ],
+            [
+              118.0371,
+              33.1348
+            ],
+            [
+              117.9492,
+              33.2227
+            ],
+            [
+              118.125,
+              33.75
+            ],
+            [
+              117.7734,
+              33.7061
+            ],
+            [
+              117.5977,
+              34.0137
+            ],
+            [
+              117.1582,
+              34.0576
+            ],
+            [
+              116.8945,
+              34.4092
+            ],
+            [
+              116.3672,
+              34.6289
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "chong_qing",
+      "properties": {
+        "name": "重庆",
+        "cp": [
+          107.7539,
+          30.1904
+        ],
+        "childNum": 40
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              108.5449,
+              31.6846
+            ],
+            [
+              108.2813,
+              31.9043
+            ],
+            [
+              108.3691,
+              32.168
+            ],
+            [
+              108.5449,
+              32.2119
+            ],
+            [
+              109.0723,
+              31.9482
+            ],
+            [
+              109.248,
+              31.7285
+            ],
+            [
+              109.5996,
+              31.7285
+            ],
+            [
+              109.7754,
+              31.6846
+            ],
+            [
+              109.6875,
+              31.5527
+            ],
+            [
+              110.127,
+              31.377
+            ],
+            [
+              110.2148,
+              31.1572
+            ],
+            [
+              110.0391,
+              30.8057
+            ],
+            [
+              109.8633,
+              30.8936
+            ],
+            [
+              109.4238,
+              30.542
+            ],
+            [
+              109.248,
+              30.6299
+            ],
+            [
+              109.1602,
+              30.542
+            ],
+            [
+              109.0723,
+              30.6299
+            ],
+            [
+              108.8086,
+              30.498
+            ],
+            [
+              108.6328,
+              30.5859
+            ],
+            [
+              108.457,
+              30.4102
+            ],
+            [
+              108.5449,
+              30.2344
+            ],
+            [
+              108.457,
+              29.7949
+            ],
+            [
+              108.6328,
+              29.8389
+            ],
+            [
+              108.9844,
+              29.3115
+            ],
+            [
+              109.0723,
+              29.3555
+            ],
+            [
+              109.248,
+              29.1357
+            ],
+            [
+              109.248,
+              28.4766
+            ],
+            [
+              109.0723,
+              28.2129
+            ],
+            [
+              108.7207,
+              28.2129
+            ],
+            [
+              108.7207,
+              28.4766
+            ],
+            [
+              108.5449,
+              28.3887
+            ],
+            [
+              108.5449,
+              28.6523
+            ],
+            [
+              108.3691,
+              28.6523
+            ],
+            [
+              108.2813,
+              29.0918
+            ],
+            [
+              107.8418,
+              29.0039
+            ],
+            [
+              107.8418,
+              29.1357
+            ],
+            [
+              107.5781,
+              29.2236
+            ],
+            [
+              107.4023,
+              29.1797
+            ],
+            [
+              107.4023,
+              28.8721
+            ],
+            [
+              106.875,
+              28.7842
+            ],
+            [
+              106.6992,
+              28.4766
+            ],
+            [
+              106.6113,
+              28.5205
+            ],
+            [
+              106.6113,
+              28.6523
+            ],
+            [
+              106.5234,
+              28.7842
+            ],
+            [
+              106.4355,
+              28.7842
+            ],
+            [
+              106.5234,
+              28.5645
+            ],
+            [
+              106.3477,
+              28.5205
+            ],
+            [
+              106.2598,
+              28.8721
+            ],
+            [
+              105.8203,
+              28.96
+            ],
+            [
+              105.7324,
+              29.2676
+            ],
+            [
+              105.4688,
+              29.3115
+            ],
+            [
+              105.293,
+              29.5313
+            ],
+            [
+              105.7324,
+              29.8828
+            ],
+            [
+              105.5566,
+              30.1025
+            ],
+            [
+              105.6445,
+              30.2783
+            ],
+            [
+              105.8203,
+              30.4541
+            ],
+            [
+              106.2598,
+              30.1904
+            ],
+            [
+              106.6113,
+              30.3223
+            ],
+            [
+              106.7871,
+              30.0146
+            ],
+            [
+              107.0508,
+              30.0146
+            ],
+            [
+              107.4902,
+              30.6299
+            ],
+            [
+              107.4023,
+              30.7617
+            ],
+            [
+              107.4902,
+              30.8496
+            ],
+            [
+              107.9297,
+              30.8496
+            ],
+            [
+              108.1934,
+              31.5088
+            ],
+            [
+              108.5449,
+              31.6846
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "ning_xia",
+      "properties": {
+        "name": "宁夏",
+        "cp": [
+          105.9961,
+          37.3096
+        ],
+        "childNum": 5
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              104.3262,
+              37.4414
+            ],
+            [
+              105.8203,
+              37.793
+            ],
+            [
+              105.9082,
+              38.7158
+            ],
+            [
+              106.3477,
+              39.2871
+            ],
+            [
+              106.7871,
+              39.375
+            ],
+            [
+              106.9629,
+              38.9795
+            ],
+            [
+              106.5234,
+              38.3203
+            ],
+            [
+              106.7871,
+              38.1885
+            ],
+            [
+              107.3145,
+              38.1006
+            ],
+            [
+              107.666,
+              37.8809
+            ],
+            [
+              107.3145,
+              37.6172
+            ],
+            [
+              107.3145,
+              37.0898
+            ],
+            [
+              106.6113,
+              37.0898
+            ],
+            [
+              106.6113,
+              36.7822
+            ],
+            [
+              106.4355,
+              36.5625
+            ],
+            [
+              106.5234,
+              36.4746
+            ],
+            [
+              106.5234,
+              36.2549
+            ],
+            [
+              106.875,
+              36.123
+            ],
+            [
+              106.9629,
+              35.8154
+            ],
+            [
+              106.6992,
+              35.6836
+            ],
+            [
+              106.4355,
+              35.6836
+            ],
+            [
+              106.5234,
+              35.332
+            ],
+            [
+              106.3477,
+              35.2441
+            ],
+            [
+              106.2598,
+              35.4199
+            ],
+            [
+              106.084,
+              35.376
+            ],
+            [
+              105.9961,
+              35.4199
+            ],
+            [
+              106.084,
+              35.4639
+            ],
+            [
+              105.9961,
+              35.4639
+            ],
+            [
+              105.8203,
+              35.5518
+            ],
+            [
+              105.7324,
+              35.7275
+            ],
+            [
+              105.3809,
+              35.7715
+            ],
+            [
+              105.293,
+              35.9912
+            ],
+            [
+              105.4688,
+              36.123
+            ],
+            [
+              105.2051,
+              36.6943
+            ],
+            [
+              105.293,
+              36.8262
+            ],
+            [
+              104.8535,
+              37.2217
+            ],
+            [
+              104.5898,
+              37.2217
+            ],
+            [
+              104.5898,
+              37.4414
+            ],
+            [
+              104.3262,
+              37.4414
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "hai_nan",
+      "properties": {
+        "name": "海南",
+        "cp": [
+          109.9512,
+          19.2041
+        ],
+        "childNum": 18
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              108.6328,
+              19.3799
+            ],
+            [
+              109.0723,
+              19.6436
+            ],
+            [
+              109.248,
+              19.9512
+            ],
+            [
+              109.5996,
+              20.0391
+            ],
+            [
+              110.0391,
+              20.127
+            ],
+            [
+              110.3906,
+              20.127
+            ],
+            [
+              110.5664,
+              20.2588
+            ],
+            [
+              110.6543,
+              20.2588
+            ],
+            [
+              111.0938,
+              19.9512
+            ],
+            [
+              111.2695,
+              19.9951
+            ],
+            [
+              110.6543,
+              19.1602
+            ],
+            [
+              110.5664,
+              18.6768
+            ],
+            [
+              110.2148,
+              18.5889
+            ],
+            [
+              110.0391,
+              18.3691
+            ],
+            [
+              109.8633,
+              18.3691
+            ],
+            [
+              109.6875,
+              18.1055
+            ],
+            [
+              108.9844,
+              18.2813
+            ],
+            [
+              108.6328,
+              18.457
+            ],
+            [
+              108.6328,
+              19.3799
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "tai_wan",
+      "properties": {
+        "name": "台湾",
+        "cp": [
+          121.0254,
+          23.5986
+        ],
+        "childNum": 0
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              121.9043,
+              25.0488
+            ],
+            [
+              121.9922,
+              25.0049
+            ],
+            [
+              121.8164,
+              24.7412
+            ],
+            [
+              121.9043,
+              24.5654
+            ],
+            [
+              121.6406,
+              24.0381
+            ],
+            [
+              121.377,
+              23.1152
+            ],
+            [
+              121.0254,
+              22.6758
+            ],
+            [
+              120.8496,
+              22.0605
+            ],
+            [
+              120.7617,
+              21.9287
+            ],
+            [
+              120.6738,
+              22.3242
+            ],
+            [
+              120.2344,
+              22.5879
+            ],
+            [
+              120.0586,
+              23.0713
+            ],
+            [
+              120.1465,
+              23.6865
+            ],
+            [
+              121.0254,
+              25.0488
+            ],
+            [
+              121.5527,
+              25.3125
+            ],
+            [
+              121.9043,
+              25.0488
+            ]
+          ],
+          [
+            [
+              123.4751272201538,
+              25.751159252737235
+            ],
+            [
+              123.47542762756348,
+              25.75123655950761
+            ],
+            [
+              123.47577095031737,
+              25.751313866227658
+            ],
+            [
+              123.47598552703857,
+              25.75142982621338
+            ],
+            [
+              123.476243019104,
+              25.751507132807653
+            ],
+            [
+              123.47632884979247,
+              25.751739052288556
+            ],
+            [
+              123.47671508789062,
+              25.751623092604706
+            ],
+            [
+              123.47710132598876,
+              25.7515844393516
+            ],
+            [
+              123.47757339477538,
+              25.751468479516813
+            ],
+            [
+              123.4779167175293,
+              25.7513911728974
+            ],
+            [
+              123.47826004028319,
+              25.751313866227658
+            ],
+            [
+              123.47847461700441,
+              25.75112059933319
+            ],
+            [
+              123.47868919372559,
+              25.7509659855912
+            ],
+            [
+              123.47890377044676,
+              25.750772718130726
+            ],
+            [
+              123.47924709320068,
+              25.750579450355755
+            ],
+            [
+              123.47950458526611,
+              25.750424835909385
+            ],
+            [
+              123.47976207733153,
+              25.750308874942526
+            ],
+            [
+              123.48006248474121,
+              25.750115606412873
+            ],
+            [
+              123.4804058074951,
+              25.7500769526692
+            ],
+            [
+              123.48079204559326,
+              25.74996099136276
+            ],
+            [
+              123.48109245300294,
+              25.74996099136276
+            ],
+            [
+              123.48134994506836,
+              25.749922337568755
+            ],
+            [
+              123.48160743713377,
+              25.749883683762206
+            ],
+            [
+              123.48190784454346,
+              25.749883683762206
+            ],
+            [
+              123.48225116729735,
+              25.74972906841022
+            ],
+            [
+              123.4825086593628,
+              25.749574452856965
+            ],
+            [
+              123.48285198211669,
+              25.74949714500487
+            ],
+            [
+              123.48323822021484,
+              25.749419837102444
+            ],
+            [
+              123.48349571228026,
+              25.749574452856965
+            ],
+            [
+              123.48375320434572,
+              25.74965176065873
+            ],
+            [
+              123.48405361175537,
+              25.74965176065873
+            ],
+            [
+              123.48418235778807,
+              25.749419837102444
+            ],
+            [
+              123.48456859588623,
+              25.74945849105993
+            ],
+            [
+              123.48495483398436,
+              25.749419837102444
+            ],
+            [
+              123.48551273345946,
+              25.74945849105993
+            ],
+            [
+              123.48589897155762,
+              25.749419837102444
+            ],
+            [
+              123.48628520965575,
+              25.749265221146686
+            ],
+            [
+              123.4866714477539,
+              25.74918791309335
+            ],
+            [
+              123.4868001937866,
+              25.749419837102444
+            ],
+            [
+              123.48701477050783,
+              25.749265221146686
+            ],
+            [
+              123.48727226257324,
+              25.749071950919
+            ],
+            [
+              123.48735809326172,
+              25.74876271790067
+            ],
+            [
+              123.4875726699829,
+              25.748530792608644
+            ],
+            [
+              123.48791599273682,
+              25.74837617549572
+            ],
+            [
+              123.48830223083495,
+              25.74826021252898
+            ],
+            [
+              123.48873138427734,
+              25.74802828625589
+            ],
+            [
+              123.48911762237549,
+              25.747796359530042
+            ],
+            [
+              123.48941802978514,
+              25.747525777777586
+            ],
+            [
+              123.48976135253906,
+              25.747293850070676
+            ],
+            [
+              123.48993301391602,
+              25.747023267173702
+            ],
+            [
+              123.49023342132567,
+              25.74675268366044
+            ],
+            [
+              123.49040508270264,
+              25.74694595766136
+            ],
+            [
+              123.4907054901123,
+              25.74667537397202
+            ],
+            [
+              123.49100589752197,
+              25.746520754444294
+            ],
+            [
+              123.4912633895874,
+              25.746250169786514
+            ],
+            [
+              123.49147796630858,
+              25.745940929423043
+            ],
+            [
+              123.49173545837402,
+              25.745670343444697
+            ],
+            [
+              123.49199295043945,
+              25.745399756850112
+            ],
+            [
+              123.49229335784914,
+              25.745013203503138
+            ],
+            [
+              123.49255084991455,
+              25.744781270891277
+            ],
+            [
+              123.49293708801271,
+              25.7445106822719
+            ],
+            [
+              123.49319458007812,
+              25.74420143738087
+            ],
+            [
+              123.49336624145506,
+              25.743776224341516
+            ],
+            [
+              123.4934091567993,
+              25.74338966571253
+            ],
+            [
+              123.49353790283202,
+              25.743080417903887
+            ],
+            [
+              123.49345207214354,
+              25.74269385701126
+            ],
+            [
+              123.49310874938965,
+              25.742384607391713
+            ],
+            [
+              123.49280834197997,
+              25.742114013314403
+            ],
+            [
+              123.49242210388184,
+              25.741998044235473
+            ],
+            [
+              123.49203586578368,
+              25.74172744927789
+            ],
+            [
+              123.49169254302979,
+              25.741456853704115
+            ],
+            [
+              123.4912633895874,
+              25.741302227385294
+            ],
+            [
+              123.49100589752197,
+              25.741379540569856
+            ],
+            [
+              123.49079132080077,
+              25.741147600865283
+            ],
+            [
+              123.49044799804688,
+              25.74103163084323
+            ],
+            [
+              123.49010467529295,
+              25.74103163084323
+            ],
+            [
+              123.4898042678833,
+              25.740915660708005
+            ],
+            [
+              123.48941802978514,
+              25.74087700397112
+            ],
+            [
+              123.48928928375244,
+              25.740683720098044
+            ],
+            [
+              123.48907470703125,
+              25.740606406460774
+            ],
+            [
+              123.48873138427734,
+              25.740606406460774
+            ],
+            [
+              123.48851680755615,
+              25.740567749623285
+            ],
+            [
+              123.48817348480223,
+              25.740529092773226
+            ],
+            [
+              123.4877872467041,
+              25.740606406460774
+            ],
+            [
+              123.48748683929442,
+              25.740761033684983
+            ],
+            [
+              123.48718643188477,
+              25.7407996904596
+            ],
+            [
+              123.48692893981932,
+              25.740761033684983
+            ],
+            [
+              123.48658561706543,
+              25.740645063285694
+            ],
+            [
+              123.48637104034425,
+              25.740683720098044
+            ],
+            [
+              123.48607063293457,
+              25.740683720098044
+            ],
+            [
+              123.48589897155762,
+              25.740529092773226
+            ],
+            [
+              123.48564147949217,
+              25.740606406460774
+            ],
+            [
+              123.48538398742676,
+              25.740761033684983
+            ],
+            [
+              123.48512649536133,
+              25.7407996904596
+            ],
+            [
+              123.48486900329588,
+              25.74099297414406
+            ],
+            [
+              123.48461151123047,
+              25.741108944203845
+            ],
+            [
+              123.48431110382079,
+              25.740915660708005
+            ],
+            [
+              123.4839677810669,
+              25.740954317432315
+            ],
+            [
+              123.4835386276245,
+              25.7407996904596
+            ],
+            [
+              123.48310947418214,
+              25.740761033684983
+            ],
+            [
+              123.48293781280516,
+              25.740451779035375
+            ],
+            [
+              123.48272323608398,
+              25.740567749623285
+            ],
+            [
+              123.48242282867433,
+              25.740451779035375
+            ],
+            [
+              123.48216533660887,
+              25.740606406460774
+            ],
+            [
+              123.4819507598877,
+              25.740567749623285
+            ],
+            [
+              123.48160743713377,
+              25.740490435910573
+            ],
+            [
+              123.48143577575684,
+              25.740683720098044
+            ],
+            [
+              123.48122119903564,
+              25.74087700397112
+            ],
+            [
+              123.4809637069702,
+              25.74087700397112
+            ],
+            [
+              123.48074913024902,
+              25.740606406460774
+            ],
+            [
+              123.4804916381836,
+              25.740722376897796
+            ],
+            [
+              123.48031997680663,
+              25.740915660708005
+            ],
+            [
+              123.48006248474121,
+              25.740761033684983
+            ],
+            [
+              123.47976207733153,
+              25.740645063285694
+            ],
+            [
+              123.47946166992188,
+              25.740722376897796
+            ],
+            [
+              123.47924709320068,
+              25.74087700397112
+            ],
+            [
+              123.47903251647948,
+              25.741108944203845
+            ],
+            [
+              123.478946685791,
+              25.74134088398386
+            ],
+            [
+              123.47873210906982,
+              25.741379540569856
+            ],
+            [
+              123.47856044769287,
+              25.741224914150454
+            ],
+            [
+              123.47830295562743,
+              25.74099297414406
+            ],
+            [
+              123.47804546356201,
+              25.74087700397112
+            ],
+            [
+              123.47778797149657,
+              25.7407996904596
+            ],
+            [
+              123.47753047943115,
+              25.74099297414406
+            ],
+            [
+              123.47723007202148,
+              25.741186257514155
+            ],
+            [
+              123.4769296646118,
+              25.741224914150454
+            ],
+            [
+              123.47667217254639,
+              25.741070287529837
+            ],
+            [
+              123.47645759582518,
+              25.740645063285694
+            ],
+            [
+              123.47615718841553,
+              25.740451779035375
+            ],
+            [
+              123.47577095031737,
+              25.740258494470662
+            ],
+            [
+              123.47547054290771,
+              25.740065209591585
+            ],
+            [
+              123.4752130508423,
+              25.739949238513258
+            ],
+            [
+              123.47529888153076,
+              25.73921475238901
+            ],
+            [
+              123.47469806671143,
+              25.739678638890336
+            ],
+            [
+              123.47439765930174,
+              25.739755953131198
+            ],
+            [
+              123.47409725189209,
+              25.739446695866025
+            ],
+            [
+              123.47388267517091,
+              25.7391374377961
+            ],
+            [
+              123.47383975982665,
+              25.738712206635928
+            ],
+            [
+              123.47362518310545,
+              25.738441604196357
+            ],
+            [
+              123.47383975982665,
+              25.738093685868723
+            ],
+            [
+              123.47349643707275,
+              25.738093685868723
+            ],
+            [
+              123.47323894500734,
+              25.73840294665469
+            ],
+            [
+              123.47289562225342,
+              25.738634891716057
+            ],
+            [
+              123.47255229949953,
+              25.738518919241947
+            ],
+            [
+              123.47246646881102,
+              25.7387895215055
+            ],
+            [
+              123.47238063812254,
+              25.73898280845934
+            ],
+            [
+              123.47212314605713,
+              25.7387895215055
+            ],
+            [
+              123.47208023071289,
+              25.738286973954256
+            ],
+            [
+              123.4716510772705,
+              25.738325631533655
+            ],
+            [
+              123.4713077545166,
+              25.73817100114067
+            ],
+            [
+              123.47092151641846,
+              25.738132343510994
+            ],
+            [
+              123.47083568572998,
+              25.737436504026586
+            ],
+            [
+              123.47036361694335,
+              25.737320530383105
+            ],
+            [
+              123.4701919555664,
+              25.737088582756662
+            ],
+            [
+              123.46963405609131,
+              25.736895292722185
+            ],
+            [
+              123.46920490264891,
+              25.73677931855063
+            ],
+            [
+              123.46890449523926,
+              25.7366633442659
+            ],
+            [
+              123.46856117248534,
+              25.73647005353987
+            ],
+            [
+              123.46804618835449,
+              25.736431395356927
+            ],
+            [
+              123.46791744232176,
+              25.73619944599535
+            ],
+            [
+              123.46765995025635,
+              25.736238104253708
+            ],
+            [
+              123.46740245819092,
+              25.735967496181118
+            ],
+            [
+              123.4669303894043,
+              25.73585152110425
+            ],
+            [
+              123.46645832061766,
+              25.735774204323498
+            ],
+            [
+              123.4660291671753,
+              25.73569688749244
+            ],
+            [
+              123.46564292907715,
+              25.735774204323498
+            ],
+            [
+              123.4654712677002,
+              25.73546493669748
+            ],
+            [
+              123.46521377563475,
+              25.73531030258274
+            ],
+            [
+              123.46508502960204,
+              25.734962375089026
+            ],
+            [
+              123.4646987915039,
+              25.734962375089026
+            ],
+            [
+              123.46439838409424,
+              25.734653105350763
+            ],
+            [
+              123.46396923065184,
+              25.734730422860753
+            ],
+            [
+              123.46375465393065,
+              25.734769081596905
+            ],
+            [
+              123.46354007720947,
+              25.734885057729898
+            ],
+            [
+              123.46319675445555,
+              25.734691764112032
+            ],
+            [
+              123.46285343170166,
+              25.734614446576902
+            ],
+            [
+              123.46259593963622,
+              25.734614446576902
+            ],
+            [
+              123.46255302429198,
+              25.734885057729898
+            ],
+            [
+              123.46216678619385,
+              25.734575787790472
+            ],
+            [
+              123.46199512481688,
+              25.73484639903148
+            ],
+            [
+              123.46173763275146,
+              25.73484639903148
+            ],
+            [
+              123.46152305603027,
+              25.73484639903148
+            ],
+            [
+              123.46113681793211,
+              25.735001033749736
+            ],
+            [
+              123.46079349517822,
+              25.734923716415746
+            ],
+            [
+              123.46049308776854,
+              25.735001033749736
+            ],
+            [
+              123.46045017242432,
+              25.735232985449937
+            ],
+            [
+              123.46010684967041,
+              25.73527164402261
+            ],
+            [
+              123.45954895019531,
+              25.73527164402261
+            ],
+            [
+              123.4593343734741,
+              25.73527164402261
+            ],
+            [
+              123.45942020416261,
+              25.735503595194736
+            ],
+            [
+              123.45924854278563,
+              25.735735545914256
+            ],
+            [
+              123.45920562744139,
+              25.736006154514918
+            ],
+            [
+              123.45911979675293,
+              25.736354078953365
+            ],
+            [
+              123.45881938934326,
+              25.736431395356927
+            ],
+            [
+              123.45877647399904,
+              25.7366633442659
+            ],
+            [
+              123.45860481262206,
+              25.736972608773677
+            ],
+            [
+              123.45856189727782,
+              25.737204556626473
+            ],
+            [
+              123.4583044052124,
+              25.73759113537519
+            ],
+            [
+              123.4583044052124,
+              25.737939055173968
+            ],
+            [
+              123.45808982849123,
+              25.73820965875778
+            ],
+            [
+              123.45826148986816,
+              25.738518919241947
+            ],
+            [
+              123.45796108245848,
+              25.738712206635928
+            ],
+            [
+              123.45787525177,
+              25.738905493715517
+            ],
+            [
+              123.45791816711424,
+              25.73917609509884
+            ],
+            [
+              123.45791816711424,
+              25.739446695866025
+            ],
+            [
+              123.45791816711424,
+              25.739833267321732
+            ],
+            [
+              123.45804691314696,
+              25.740065209591585
+            ],
+            [
+              123.45804691314696,
+              25.74033580833426
+            ],
+            [
+              123.45821857452393,
+              25.740761033684983
+            ],
+            [
+              123.45839023590088,
+              25.74103163084323
+            ],
+            [
+              123.45851898193358,
+              25.74126357077416
+            ],
+            [
+              123.4586477279663,
+              25.741572823311195
+            ],
+            [
+              123.45877647399904,
+              25.741843418620878
+            ],
+            [
+              123.45937728881837,
+              25.74176610573814
+            ],
+            [
+              123.45899105072021,
+              25.742036700607713
+            ],
+            [
+              123.45907688140869,
+              25.742345951132677
+            ],
+            [
+              123.45916271209715,
+              25.742616544681837
+            ],
+            [
+              123.45942020416261,
+              25.742925793697744
+            ],
+            [
+              123.45967769622803,
+              25.743312353835837
+            ],
+            [
+              123.4598922729492,
+              25.743621601040836
+            ],
+            [
+              123.46023559570312,
+              25.74393084744098
+            ],
+            [
+              123.46040725708008,
+              25.74416278171291
+            ],
+            [
+              123.4606647491455,
+              25.74439471553208
+            ],
+            [
+              123.46092224121094,
+              25.74447202670455
+            ],
+            [
+              123.46122264862059,
+              25.74481992635805
+            ],
+            [
+              123.46152305603027,
+              25.745090514273148
+            ],
+            [
+              123.4619092941284,
+              25.745477067368604
+            ],
+            [
+              123.46225261688232,
+              25.745747653787113
+            ],
+            [
+              123.46255302429198,
+              25.745902274321015
+            ],
+            [
+              123.46302509307861,
+              25.746250169786514
+            ],
+            [
+              123.46336841583253,
+              25.746404789666418
+            ],
+            [
+              123.46379756927489,
+              25.74675268366044
+            ],
+            [
+              123.46401214599611,
+              25.74694595766136
+            ],
+            [
+              123.46431255340576,
+              25.74713923134786
+            ],
+            [
+              123.46474170684814,
+              25.747371159356618
+            ],
+            [
+              123.46504211425781,
+              25.74760308691259
+            ],
+            [
+              123.46551418304443,
+              25.747912322949567
+            ],
+            [
+              123.46598625183107,
+              25.748144249449037
+            ],
+            [
+              123.46632957458496,
+              25.74826021252898
+            ],
+            [
+              123.46645832061766,
+              25.748569446855406
+            ],
+            [
+              123.46680164337158,
+              25.748569446855406
+            ],
+            [
+              123.46718788146971,
+              25.748569446855406
+            ],
+            [
+              123.46744537353516,
+              25.7486854095203
+            ],
+            [
+              123.46778869628905,
+              25.748801372071966
+            ],
+            [
+              123.4681749343872,
+              25.748917334510455
+            ],
+            [
+              123.46843242645262,
+              25.74914925904783
+            ],
+            [
+              123.46877574920654,
+              25.74922656712633
+            ],
+            [
+              123.46920490264891,
+              25.74945849105993
+            ],
+            [
+              123.4695053100586,
+              25.74953579893719
+            ],
+            [
+              123.46976280212401,
+              25.749690414540748
+            ],
+            [
+              123.46980571746825,
+              25.749883683762206
+            ],
+            [
+              123.47010612487793,
+              25.750038298912955
+            ],
+            [
+              123.47036361694335,
+              25.74996099136276
+            ],
+            [
+              123.47044944763182,
+              25.750154260143955
+            ],
+            [
+              123.47062110900879,
+              25.750308874942526
+            ],
+            [
+              123.47083568572998,
+              25.750386182266343
+            ],
+            [
+              123.47122192382814,
+              25.750463489539833
+            ],
+            [
+              123.4715223312378,
+              25.750463489539833
+            ],
+            [
+              123.47190856933595,
+              25.750502143157735
+            ],
+            [
+              123.4722089767456,
+              25.750579450355755
+            ],
+            [
+              123.47250938415526,
+              25.750695411058476
+            ],
+            [
+              123.47280979156494,
+              25.75081137164797
+            ],
+            [
+              123.47302436828612,
+              25.75104329248735
+            ],
+            [
+              123.47323894500734,
+              25.75104329248735
+            ],
+            [
+              123.47341060638428,
+              25.75104329248735
+            ],
+            [
+              123.47366809844969,
+              25.75104329248735
+            ],
+            [
+              123.47405433654785,
+              25.7509659855912
+            ],
+            [
+              123.4743547439575,
+              25.7509659855912
+            ],
+            [
+              123.47461223602295,
+              25.751004639045572
+            ],
+            [
+              123.47486972808838,
+              25.751081945916557
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "bei_jing",
+      "properties": {
+        "name": "北京",
+        "cp": [
+          116.4551,
+          40.2539
+        ],
+        "childNum": 19
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              117.4219,
+              40.21
+            ],
+            [
+              117.334,
+              40.1221
+            ],
+            [
+              117.2461,
+              40.0781
+            ],
+            [
+              116.8066,
+              39.9902
+            ],
+            [
+              116.8945,
+              39.8145
+            ],
+            [
+              116.8945,
+              39.6826
+            ],
+            [
+              116.8066,
+              39.5947
+            ],
+            [
+              116.543,
+              39.5947
+            ],
+            [
+              116.3672,
+              39.4629
+            ],
+            [
+              116.1914,
+              39.5947
+            ],
+            [
+              115.752,
+              39.5068
+            ],
+            [
+              115.4883,
+              39.6387
+            ],
+            [
+              115.4004,
+              39.9463
+            ],
+            [
+              115.9277,
+              40.2539
+            ],
+            [
+              115.752,
+              40.5615
+            ],
+            [
+              116.1035,
+              40.6055
+            ],
+            [
+              116.1914,
+              40.7813
+            ],
+            [
+              116.4551,
+              40.7813
+            ],
+            [
+              116.3672,
+              40.9131
+            ],
+            [
+              116.6309,
+              41.0449
+            ],
+            [
+              116.9824,
+              40.6934
+            ],
+            [
+              117.4219,
+              40.6494
+            ],
+            [
+              117.2461,
+              40.5176
+            ],
+            [
+              117.4219,
+              40.21
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "tian_jin",
+      "properties": {
+        "name": "天津",
+        "cp": [
+          117.4219,
+          39.4189
+        ],
+        "childNum": 18
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              116.8066,
+              39.5947
+            ],
+            [
+              116.8945,
+              39.6826
+            ],
+            [
+              117.1582,
+              39.6387
+            ],
+            [
+              117.1582,
+              39.8145
+            ],
+            [
+              117.2461,
+              40.0781
+            ],
+            [
+              117.334,
+              40.1221
+            ],
+            [
+              117.4219,
+              40.21
+            ],
+            [
+              117.6855,
+              40.0781
+            ],
+            [
+              117.6855,
+              39.9902
+            ],
+            [
+              117.5098,
+              39.9902
+            ],
+            [
+              117.5098,
+              39.7705
+            ],
+            [
+              117.6855,
+              39.5947
+            ],
+            [
+              117.9492,
+              39.5947
+            ],
+            [
+              117.8613,
+              39.4189
+            ],
+            [
+              118.0371,
+              39.2432
+            ],
+            [
+              118.0371,
+              39.1992
+            ],
+            [
+              117.8613,
+              39.1113
+            ],
+            [
+              117.5977,
+              38.6279
+            ],
+            [
+              117.2461,
+              38.54
+            ],
+            [
+              116.7188,
+              38.8037
+            ],
+            [
+              116.7188,
+              38.9355
+            ],
+            [
+              116.8945,
+              39.1113
+            ],
+            [
+              116.8066,
+              39.5947
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "shang_hai",
+      "properties": {
+        "name": "上海",
+        "cp": [
+          121.4648,
+          31.2891
+        ],
+        "childNum": 19
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              120.9375,
+              31.0254
+            ],
+            [
+              121.2012,
+              31.4648
+            ],
+            [
+              121.377,
+              31.5088
+            ],
+            [
+              121.1133,
+              31.7285
+            ],
+            [
+              121.2012,
+              31.8604
+            ],
+            [
+              121.9922,
+              31.5967
+            ],
+            [
+              121.9043,
+              31.1572
+            ],
+            [
+              121.9922,
+              30.8057
+            ],
+            [
+              121.2891,
+              30.6738
+            ],
+            [
+              120.9375,
+              31.0254
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "xiang_gang",
+      "properties": {
+        "name": "香港",
+        "cp": [
+          114.2578,
+          22.3242
+        ],
+        "childNum": 1
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              114.6094,
+              22.4121
+            ],
+            [
+              114.5215,
+              22.1484
+            ],
+            [
+              114.3457,
+              22.1484
+            ],
+            [
+              113.9063,
+              22.1484
+            ],
+            [
+              113.8184,
+              22.1924
+            ],
+            [
+              113.9063,
+              22.4121
+            ],
+            [
+              114.1699,
+              22.5439
+            ],
+            [
+              114.3457,
+              22.5439
+            ],
+            [
+              114.4336,
+              22.5439
+            ],
+            [
+              114.4336,
+              22.4121
+            ],
+            [
+              114.6094,
+              22.4121
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "id": "ao_men",
+      "properties": {
+        "name": "澳门",
+        "cp": [
+          113.5547,
+          22.1484
+        ],
+        "childNum": 1
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [
+              113.5986,
+              22.1649
+            ],
+            [
+              113.6096,
+              22.1265
+            ],
+            [
+              113.5547,
+              22.11
+            ],
+            [
+              113.5437,
+              22.2034
+            ],
+            [
+              113.5767,
+              22.2034
+            ],
+            [
+              113.5986,
+              22.1649
+            ]
+          ]
+        ]
+      }
+    }
+  ],
+  "srcSize": {
+    "left": 243.4766,
+    "top": 36.4307,
+    "width": 61.6113,
+    "height": 35.4638
+  }
+}

+ 32 - 0
public/index.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="stylesheet" type="text/css" href="/reset.css">
+    <link rel="stylesheet" type="text/css" href="/resetui.css">
+    <link rel="stylesheet" href="//at.alicdn.com/t/font_2695666_clv7u1bghnc.css">
+    <!--阿里图标库-->
+    <!-- <script src="//at.alicdn.com/t/font_1053279_iglndf8jcua.js"></script> -->
+    <!--基础图标-->
+    <script src="//at.alicdn.com/t/font_918284_ns6rouh4pr.js"></script>
+    <script src="//at.alicdn.com/t/font_2795104_dh0mfr1s3kk.js"></script>
+    <script src="https://cdn.jsdelivr.net/npm/qrcodejs2/qrcode.min.js"></script>
+    
+    <!-- <script type="text/javascript" src="https://map.qq.com/api/gljs?v=1.exp&key=D65BZ-22PK3-YNY3N-3AJUY-WNLD7-RBF43"></script> -->
+    <!-- <script type="text/javascript" src="https://mapapi.qq.com/web/mapComponents/geoLocation/v/geolocation.min.js"></script> -->
+    <!-- <script src="//at.alicdn.com/t/font_2481549_onxx1b4nn5.js"></script> -->
+    <!-- <script type="text/javascript" src="https://map.qq.com/api/js?v=2.exp&key=QIHBZ-EHLRP-JI4DM-VAU3E-LJHAS-GAFKU"></script> -->
+    <!-- <script src='http://api.map.baidu.com/api?v=2.0&ak=ZyoojLujl5MpGm1lzcyF8GC0ddXuoqlF&callback=init'></script> -->
+    <!-- <script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=ZyoojLujl5MpGm1lzcyF8GC0ddXuoqlF"></script> -->
+    <script type="text/javascript" src="https://map.qq.com/api/js?v=2.exp&key=QIHBZ-EHLRP-JI4DM-VAU3E-LJHAS-GAFKU"></script>
+    <!-- 定位组件 -->
+    <script type="text/javascript" src="https://mapapi.qq.com/web/mapComponents/geoLocation/v/geolocation.min.js"></script>
+    <script src="/domain.js"></script>
+    <title>后台管理系统</title>
+</head>
+<body>
+<div id="app"></div>
+</body>
+</html>

+ 264 - 0
public/reset.css

@@ -0,0 +1,264 @@
+/**
+ * Eric Meyer's Reset CSS v2.0 (http://meyerweb.com/eric/tools/css/reset/)
+ * http://cssreset.com
+ */
+* {
+  margin: 0;
+  padding: 0;
+  border: 0;
+}
+
+/* HTML5 display-role reset for older browsers */
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+menu,
+nav,
+section {
+  display: block;
+}
+
+body {
+  line-height: 1;
+  background: #f5f5f5;
+  overflow-x: hidden;
+  font-family: 'Microsoft YaHei';
+}
+
+blockquote,
+q {
+  quotes: none;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  font-weight: normal;
+}
+
+p {
+  font-size: 16px;
+  line-height: 1.5;
+  color: #666;
+}
+h1 {
+  font-size: 16px;
+  line-height: 1.5;
+  font-weight: normal;
+}
+.tips {
+  margin-top: 5px;
+  font-size: 12px;
+  line-height: 1.5;
+  color: #999;
+}
+.tips-main {
+  margin-top: 5px;
+  font-size: 12px;
+  line-height: 1.5;
+  color: #eb1200;
+}
+input::-webkit-outer-spin-button,
+input::-webkit-inner-spin-button {
+  -webkit-appearance: none;
+}
+input[type='number'] {
+  -moz-appearance: textfield;
+}
+img {
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+button {
+  background: white;
+}
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+  content: none;
+}
+
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+a {
+  text-decoration: none;
+  -webkit-backface-visibility: hidden;
+}
+
+li {
+  list-style: none;
+}
+
+::-webkit-scrollbar {
+  width: 5px;
+  height: 5px;
+}
+
+::-webkit-scrollbar-track-piece {
+  background-color: rgba(0, 0, 0, 0.2);
+  -webkit-border-radius: 6px;
+}
+
+::-webkit-scrollbar-thumb:vertical {
+  height: 5px;
+  background-color: rgba(125, 125, 125, 0.7);
+  -webkit-border-radius: 6px;
+}
+
+::-webkit-scrollbar-thumb:horizontal {
+  width: 5px;
+  background-color: rgba(125, 125, 125, 0.7);
+  -webkit-border-radius: 6px;
+}
+
+html,
+body {
+  width: 100%;
+  height: 100%;
+}
+
+body {
+  -webkit-text-size-adjust: none;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+.icon {
+  vertical-align: -0.15em;
+}
+.header {
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  flex-flow: row nowrap;
+  justify-content: space-between;
+  align-items: center;
+  position: fixed;
+  background: white;
+  border-bottom: 1px solid #dcdfe6;
+  top: 0;
+  height: 60px;
+  width: calc(100vw - 200px);
+  padding-left: 20px;
+  z-index: 9;
+}
+.main-header {
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  flex-flow: row nowrap;
+  justify-content: flex-start;
+  align-items: center;
+}
+.footer {
+  width: calc(100% - 30px);
+  min-width: 600px;
+  padding: 10px 0 0 15px;
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  flex-flow: row nowrap;
+  justify-content: flex-end;
+  align-items: center;
+}
+.tab {
+  width: 140px;
+  background: #f5f5f5;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+}
+.inline {
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  flex-flow: row nowrap;
+  justify-content: flex-start;
+  align-items: center;
+  margin-left: 10px;
+  margin-bottom: 10px;
+}
+.inline-left {
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  flex-flow: row nowrap;
+  justify-content: flex-start;
+  align-items: center;
+  margin-left: 10px;
+  margin-bottom: 10px;
+}
+.inline-left p {
+  flex-shrink: 0;
+}
+
+.inline-right {
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  flex-flow: row nowrap;
+  justify-content: flex-end;
+  align-items: center;
+}
+.inline-space {
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  flex-flow: row nowrap;
+  justify-content: space-between;
+  align-items: center;
+}
+.main-header {
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  flex-flow: row nowrap;
+  justify-content: flex-start;
+  align-items: center;
+}
+.main {
+  width: calc(100% - 20px);
+  min-width: 1300px;
+  /* margin: 15px 15px 15px; */
+  /* background: #fff; */
+  padding: 10px 10px 80px;
+  box-sizing: border-box;
+  min-height: calc(100vh - 90px);
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  flex-flow: column nowrap;
+  justify-content: flex-start;
+  align-items: flex-start;
+}
+.editInfo{
+    width:100%;
+}
+.table-header {
+  background: #f6f6f6;
+  color: #333;
+  font-weight: normal;
+}
+
+.screen {
+  width: calc(100% - 30px);
+  background: #f8f8f8;
+  padding: 10px;
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  flex-flow: row nowrap;
+  justify-content: flex-start;
+  align-items: center;
+  margin-top: 10px;
+  flex-wrap: wrap;
+}
+.nav {
+  position: fixed;
+  top: 25px;
+  left: 280px;
+  z-index: 9999;
+  color: white;
+  font-size: 14px;
+}

+ 170 - 0
public/resetui.css

@@ -0,0 +1,170 @@
+/*用于修改element组件样式*/
+/*tab标签页*/
+.el-tabs__nav-wrap::after {
+  height: 0 !important;
+}
+
+.manager .el-table th {
+  background: #f5f5f5 !important;
+}
+
+.el-table td,
+.el-table th {
+  padding: 6px 0 !important;
+}
+
+#app .el-table .cell {
+  font-size: 14px;
+}
+
+.el-form-item__error {
+  position: relative !important;
+}
+
+.el-upload--picture-card {
+  width: 100px !important;
+  height: 100px !important;
+  line-height: 98px !important;
+}
+
+.el-upload-list--picture-card .el-upload-list__item {
+  width: 100px !important;
+  height: 100px !important;
+}
+
+#app .el-form-item {
+  margin-bottom: 10px;
+}
+
+/* 分类树 */
+.tree-content .el-tree-node__content {
+  height: 45px;
+  border-bottom: 1px solid #f6f6f6;
+}
+
+/*导航底色*/
+#app .el-aside {
+  width: 100%;
+  background: white;
+  z-index: 999;
+}
+
+#app .el-menu {
+  border-right: none;
+}
+
+#app .el-submenu__title {
+  font-size: 16px;
+}
+
+#app .el-submenu .el-menu-item {
+  height: 40px;
+  line-height: 40px;
+}
+
+/*输入框*/
+#app .el-input__inner {
+  margin-right: 10px;
+  /* border-radius: 3px; */
+  color: #999;
+  /*padding: 0 6px;*/
+}
+
+#app .el-textarea__inner {
+  border-radius: 3px;
+}
+
+.footer .el-button {
+  margin-left: 10px;
+}
+
+.screen .el-cascader {
+  margin-right: 10px;
+  width: 150px;
+}
+
+#app .el-range-editor--mini.el-input__inner {
+  width: 320px;
+}
+
+/*按钮直角*/
+/* #app .el-button {
+  border-radius: 3px;
+} */
+#app .el-button--mini,
+.el-button--small {
+  border-radius: 3px;
+  padding: 7px 10px;
+  /*border: none;*/
+  /*color: #3c90fe;*/
+}
+
+#app .el-button--small {
+  border-radius: 3px;
+}
+
+/*选择框直角*/
+
+#app .el-checkbox__inner {
+  /* border-radius: 3px; */
+}
+
+.login-container .el-checkbox__inner {
+  width: 16px;
+  height: 16px;
+}
+
+.login-container .el-checkbox__label {
+  font-size: 16px;
+  color: #333;
+}
+
+.account .el-dialog__body {
+  line-height: 40px;
+}
+
+.account .el-dialog .el-checkbox {
+  width: 150px;
+}
+
+/*tab栏*/
+.header .el-tabs__header {
+  margin: 0;
+}
+
+/*table*/
+#app .el-table::before {
+  height: 0;
+}
+
+#app .el-tabs__item {
+  height: 60px;
+  line-height: 60px;
+}
+
+#app .el-tabs__item.is-active {
+  color: #f17e02;
+}
+
+#app .el-tabs__active-bar {
+  background-color: #f17e02;
+}
+
+#app .el-tabs__item:hover {
+  color: #f17e02;
+}
+
+#app .el-container {
+  height: 100%;
+  overflow: hidden
+}
+
+#app .no-border-table {
+  border: none !important;
+}
+
+/* 重置弹窗body padding */
+#app .el-dialog__body {
+    padding-top: 0;
+    padding-bottom: 0;
+}

+ 37 - 0
src/App.vue

@@ -0,0 +1,37 @@
+<template>
+  <div id="app" v-loading="isLoading">
+    <router-view></router-view>
+  </div>
+</template>
+
+<script>
+import apis from './request/api';
+export default {
+  name: 'app',
+  data() {
+    return {
+      isLoading: false
+    };
+  },
+  components: {},
+  created() {
+    // ★★★挂载全局api
+    for (const key in apis) {
+      this.$root[key] = apis[key];
+    }
+  }
+};
+</script>
+
+<style>
+#app {
+  width: 100%;
+  height: 100%;
+}
+input {
+  outline: none;
+}
+textarea {
+  outline: none;
+}
+</style>

+ 77 - 0
src/assets/js/directives.js

@@ -0,0 +1,77 @@
+import { COMMON_NUMBER } from '@/assets/js/reg';
+import { debounce } from '@/assets/js/utils';
+
+const defaultMsg = '输入错误';
+const defaultDelay = 1500;
+const defaultRequire = false;
+const defaultEventName = 'change';
+
+export default {
+    'check-number': {
+        inserted: (el, binding, vNode) => {
+            // 初始化各种参数
+            const eventName = binding.arg || defaultEventName; // 触发事件
+            const require = binding.modifiers.require || defaultRequire; // 是否必填
+            const msg = binding.value.msg || defaultMsg; // 错误文字
+            const paramReg = binding.value.reg || null; // 参数正则(替代默认的)
+            const delay = binding.value.delay || defaultDelay; // 验证延迟
+            const min = binding.value.min; // 最小值
+            const max = binding.value.max; // 最大值
+
+            el.addEventListener(
+                eventName,
+                debounce((event) => {
+                    const val = el.value.trim(); // 表单值
+                    // 首先去除已有error样式
+                    el.className = el.className.replace('input-error', '').trim();
+                    // 判断是否是否必填
+                    if (require) {
+                        if (!val || val === '') {
+                            el.className += ' input-error';
+                            showError(el, vNode, `不能为空`);
+                            return;
+                        }
+                    }
+                    // 判断正则
+                    if (!val.match(paramReg || COMMON_NUMBER)) {
+                        showError(el, vNode, msg);
+                        return;
+                    }
+                    if (min !== undefined && +val < min) {
+                        showError(el, vNode, `最小值为 ${min}`);
+                        return;
+                    }
+                    if (max !== undefined && +val > max) {
+                        showError(el, vNode, `最大值为 ${max}`);
+                        return;
+                    }
+                }, delay)
+            );
+        }
+    },
+    'prevent-event': {
+        inserted: (el, binding, vNode) => {
+            if (binding.value instanceof Array) {
+                binding.value.forEach((item) => {
+                    el.addEventListener(item, (e) => {
+                        e.preventDefault();
+                    });
+                });
+            } else {
+                binding.value.forEach((item) => {
+                    el.addEventListener(binding.value, (e) => {
+                        e.preventDefault();
+                    });
+                });
+            }
+        }
+    }
+};
+
+// 错误处理
+function showError(el, vNode, msg) {
+    el.value = '';
+    el.className += ' input-error';
+    vNode.context.$toast(msg || defaultMsg);
+    // el.focus()
+}

+ 257 - 0
src/assets/js/filters.js

@@ -0,0 +1,257 @@
+import { oss_baseUrl } from '@/config'; // oss 图片地址
+import dayjs from 'dayjs';
+
+/**
+ * 时间戳转时间-过滤器
+ * 时间格式:2018-01-01 14:16:13
+ */
+function dateFilter(val) {
+    let time = parseInt(val) * 1000;
+    return dayjs(time).format('YYYY-MM-DD HH:mm:ss');
+}
+
+/**
+ * 标准时间转时间时间-过滤器
+ * 时间格式:2018-01-01 14:16:13
+ */
+function timeFilter(val) {
+    return dayjs(val).format('YYYY-MM-DD HH:mm:ss');
+    // let d = new Date(val);
+    // let datetime = d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate();
+    // return datetime;
+}
+
+/**
+ * 标准时间转时间时间-过滤器
+ * 时间格式:2018-01-01
+ */
+function dateOnlyFilter(val) {
+    return dayjs(val).format('YYYY-MM-DD');
+}
+
+/**
+ * 时间戳转标准时间-过滤器
+ * 时间格式:2018-01-01 14:16:13
+ */
+function ConvertTime(timestamp) {
+    let date = new Date(timestamp);
+    let Y = date.getFullYear() + '-';
+    let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
+    let D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + ' ';
+    let h = (date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours()) + ':';
+    let m = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes()) + ':';
+    let s = (date.getSeconds() < 10 ? '0' + (date.getSeconds()) : date.getSeconds());
+    return Y + M + D + h + m + s;
+}
+
+/**
+ * 审核状态过滤器
+ * @return {string}
+ */
+function Examine(val) {
+    let str = '';
+    if (val === '1') {
+        str = '待审核';
+    } else if (val === '2') {
+        str = '审核失败';
+    } else if (val === '3') {
+        str = '审核通过';
+    }
+    return str;
+}
+
+/**
+ * 时间转标准时间-过滤器
+ * 时间格式:2018-01-01 14:16:13 =》标准时间
+ */
+function parserDate(date) {
+    let t = Date.parse(date);
+    if (!isNaN(t)) {
+        return new Date(Date.parse(date.replace(/-/g, '/')));
+    } else {
+        return new Date();
+    }
+}
+
+/**
+ * 货币格式化-过滤器
+ * (1234,2) => ¥1234.00
+ * (1234,2,$) => $1234.00
+ * (1234,2,'') => 1234.00
+ */
+function moneyFmt(value, decimals = 2, symbol = '¥') {
+    const val = parseFloat(value);
+    if (isNaN(val)) {
+        return value;
+    }
+
+    const money = val.toFixed(decimals);
+    return `${symbol}${money}`;
+}
+
+/**
+ * 日期格式化-过滤器
+ * 根据format格式化日期str
+ * 2018-01-01 14:16:13 (yyyy/MM/dd hh-mm-ss) => 2018/01/01 14-16-13
+ * 2018-01-01 14:16:13 (yy/M/d h-m) => 18/01/01 14-16
+ * 2018-01-01 14:16:13 (yyMMdd) => 180101
+ * 2018-01-01 (yyyyMM) => 201801
+ * 14:16:13 (hh:mm) => 14:16
+ */
+function dateFmt(value, format = 'YYYY-MM-dd hh:mm:ss') {
+    if (!value) {
+        return;
+    }
+    const dateObj = parse(value);
+    const year = dateObj.year;
+    const month = dateObj.month;
+    const day = dateObj.day;
+    const hour = dateObj.hour;
+    const minute = dateObj.minute;
+    const second = dateObj.second;
+
+    let str = format;
+    str = str.replace(/yyyy|YYYY/, year);
+
+    str = str.replace(/yy|YY/, year % 100 > 9 ? (year % 100).toString() : '0' + (year % 100));
+
+    str = str.replace(/MM|M/g, month);
+
+    str = str.replace(/dd|DD|d|D/g, day);
+
+    str = str.replace(/hh|HH|h|H/g, hour);
+
+    str = str.replace(/mm|m/g, minute);
+
+    str = str.replace(/ss|SS|s|S/g, second);
+    return str;
+
+    // 解析日期string->{year,month...},参数格式可以是datetime/date/time
+    function parse(dateStr) {
+        const dateObj = {
+            year: '',
+            month: '',
+            day: '',
+            hour: '',
+            minute: '',
+            second: ''
+        };
+        if (typeof dateStr !== 'string') {
+            return dateObj;
+        }
+
+        const arr = dateStr.split(' ');
+        if (arr.length > 1) {
+            // datetime
+            const _date = arr[0].split('-');
+            dateObj.year = _date[0];
+            dateObj.month = _date[1];
+            dateObj.day = _date[2];
+            const _time = arr[1].split(':');
+            dateObj.hour = _time[0];
+            dateObj.minute = _time[1];
+            dateObj.second = _time[2];
+        } else if (arr.length === 1) {
+            // date or time
+            if (arr[0].indexOf('-') > -1) {
+                // date
+                const _date = arr[0].split('-');
+                dateObj.year = _date[0];
+                dateObj.month = _date[1];
+                dateObj.day = _date[2];
+            } else if (arr[0].indexOf(':') > -1) {
+                // time
+                const _time = arr[0].split(':');
+                dateObj.hour = _time[0];
+                dateObj.minute = _time[1];
+                dateObj.second = _time[2];
+            }
+        }
+
+        return dateObj;
+    }
+}
+
+/**
+ * 字符串长度溢出格式化-过滤器
+ */
+function ellipsis(value, len) {
+    if (typeof value !== 'string') {
+        value = value.toString();
+    }
+
+    return value.length > len ? value.substr(0, len) + '...' : value;
+}
+
+/**
+ * 中间变星号
+ * phone 手机号
+ * bank 银行卡
+ * IDcode 身份证
+ */
+function star(value, type) {
+    if (!value) {
+        return;
+    }
+    if (type === 'phone') {
+        return value.substr(0, 3) + '****' + value.substr(7);
+    } else if (type === 'bank') {
+        return '************' + value.substr(12);
+    } else if (type === 'IDcode') {
+        return value.substr(0, 1) + '****************' + value.substr(17);
+    }
+}
+
+/**
+ * 距离值格式化-过滤器
+ * 854 => '<854km'
+ * 1234 => '<1.2km'
+ * 5678 => '<5.7km'
+ */
+function distanceFmt(value) {
+    value = parseFloat(value);
+    let str = '';
+    if (value < 1000) {
+        str = `${value.toFixed(0)}m`;
+    } else {
+        str = `${(value / 1000).toFixed(1)}km`;
+    }
+    return str;
+}
+
+/**
+ * 静态图片组装格式化-过滤器
+ * name 图片名称
+ * path 图片路径 默认static
+ * type 图片格式 (jpg,png)
+ */
+function imageFmt(name, type = 'png', path = 'static') {
+    return `${oss_baseUrl}/${path}/${name}.${type}`;
+}
+
+// 时间截取转换
+ function timeClipFmt(value) {
+        var time = value.replace("T", " ");
+        return time.slice(0, 19);
+    };
+// 时间转换
+ function timeChange(value) {
+        var time = value.replace("T", " ");
+        return time.slice(0, 19);
+    };
+export default {
+    moneyFmt,
+    dateFmt,
+    Examine,
+    timeFilter,
+    dateFilter,
+    dateOnlyFilter,
+    parserDate,
+    ellipsis,
+    ConvertTime,
+    star,
+    distanceFmt,
+    imageFmt,
+    timeClipFmt
+};
+

+ 21 - 0
src/assets/js/loadBMap.js

@@ -0,0 +1,21 @@
+/**
+ * 动态加载百度地图api函数
+ * @param {String} ak  百度地图AK,必传
+ */
+ export default function loadBMap(ak) {
+  return new Promise(function(resolve, reject) {
+    if (typeof window.BMap !== 'undefined') {
+      resolve(window.BMap);
+      return true;
+    }
+    window.onBMapCallback = function() {
+      resolve(window.BMap);
+    };
+    let script = document.createElement('script');
+    script.type = 'text/javascript';
+    script.src =
+      'http://api.map.baidu.com/api?v=3.0&ak=' + ak + '&callback=onBMapCallback';
+    script.onerror = reject;
+    document.head.appendChild(script);
+  });
+}

+ 5 - 0
src/assets/js/map.js

@@ -0,0 +1,5 @@
+export const letterMap = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
+
+export const numMap = [
+  '一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十', '二十一', '二十二', '二十三', '二十四', '二十五', '二十六', '二十七', '二十八', '二十九', '三十', '三十一', '三十二', '三十三', '三十四', '三十五', '三十六', '三十七', '三十八', '三十九', '四十', '四十一', '四十二', '四十三', '四十四', '四十五', '四十六', '四十七', '四十八', '四十九', '五十'
+];

+ 23 - 0
src/assets/js/public.js

@@ -0,0 +1,23 @@
+export default class Public {
+  static defaultImg =
+    'http://chenglianyijia.oss-cn-beijing.aliyuncs.com/manager/addImg.svg'
+  static status = {
+    delete: '5', // 删除
+    draft: '0', // 草稿
+    warehouse: '1', // 仓库中
+    advance: '2', // 预售中
+    sale: '3', // 在售中
+    all: ['1', '2', '3']
+  };// 商品列表状态
+  static role ={
+    area: '3', // 区
+    city: '4', // 市
+    province: '5' // 省
+}; // 代理商身份
+
+static role ={
+    area: '3', // 区
+    city: '4', // 市
+    province: '5' // 省
+}; // 代理商身份
+}

+ 32 - 0
src/assets/js/reg.js

@@ -0,0 +1,32 @@
+
+// 国内电话号码
+export const CHINA_MOBILE = /^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$/;
+// 自然数
+export const COMMON_NUMBER = /^\d+(\.\d+)?$/;
+// 银行卡号
+export const BANK_NUMBER = /^[0-9]{16,19}$/;
+// 正负实数
+export const ALL_NUMBER = /^(\-|\+)?\d+(\.\d+)?$/;
+// 密码格式(至少一个字母 至少一个数字 共6-16位)
+export const PASSWORD = /^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]{6,16}$/;
+// 电话数字 手机号+固话 只限制数字和部分字符
+export const PHONE_NUMBER = /^[0-9\-\+]*$/;
+//正则地址
+export function RegAddress(str){
+    let regu = /^[a-zA-Z0-9_\u4e00-\u9fa5]+[^;=?+$\x22]+$/;
+    let re = new RegExp(regu);
+    return re.test(str)
+} 
+//正则姓名 验证是否含有特殊符号
+export function RegName(str){
+    let regu = /^[a-zA-Z0-9_\u4e00-\u9fa5]+[^;=?+$\x22]+$/;
+    let re = new RegExp(regu);
+    return re.test(str)
+}  
+
+// 验证手机号码
+export function RegPhone(str) {
+    let regu = /^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$/; 
+    let re = new RegExp(regu);
+    return re.test(str);
+} 

+ 196 - 0
src/assets/js/utils.js

@@ -0,0 +1,196 @@
+/**
+ * 判空 Object Array String
+ */
+export function isEmpty(value) {
+    if (value instanceof Object) {
+        return Object.keys(value).length === 0;
+    }
+    if (value instanceof Array) {
+        return value.length === 0;
+    }
+    return value === '' || value === null || value === undefined;
+}
+
+/**
+ * 是否字符串
+ */
+export function isString(str) {
+    if (typeof str === 'string' || str instanceof String) {
+        return true;
+    }
+    return false;
+}
+
+/**
+ * 是否数组
+ */
+export function isArray(arg) {
+    if (typeof Array.isArray === 'undefined') {
+        return Object.prototype.toString.call(arg) === '[object Array]';
+    }
+    return Array.isArray(arg);
+}
+
+/**
+ * 获取随机整数
+ */
+export function randomInt(min, max) {
+    return Math.floor(Math.random() * (max - min + 1) + min);
+}
+
+/**
+ * 打乱数组元素顺序
+ */
+export function shuffle(arr) {
+    const _arr = arr.slice();
+    for (let i = 0; i < _arr.length; i++) {
+        const j = randomInt(0, i);
+        const t = _arr[i];
+        _arr[i] = _arr[j];
+        _arr[j] = t;
+    }
+    return _arr;
+}
+
+/**
+ * 防抖函数
+ */
+export function debounce(func, delay = 200) {
+    let timer;
+
+    return function (...args) {
+        if (timer) {
+            clearTimeout(timer);
+        }
+        timer = setTimeout(() => {
+            func.apply(this, args);
+        }, delay);
+    };
+}
+
+/**
+ * 给元素增加class
+ */
+export function addClass(el, className) {
+    if (hasClass(el, className)) {
+        return;
+    }
+    el.className += ' ' + className;
+}
+
+/**
+ * 判断是否还有class
+ */
+export function hasClass(el, className) {
+    const reg = new RegExp('(^|\\s)' + className + '(\\s|$)');
+    return reg.test(el.className);
+}
+
+/**
+ * get或者set元素的data-属性值
+ */
+export function getData(el, name, value) {
+    const prefix = 'data-';
+    name = prefix + name;
+    if (value) {
+        return el.setAttribute(name, value);
+    } else {
+        return el.getAttribute(name);
+    }
+}
+
+/**
+ * dom对象是否在视口内
+ */
+export function isVisible(el) {
+    return (el.offsetWidth + el.offsetHeight) > 0;
+}
+
+export function IsPC() {
+    var userAgentInfo = navigator.userAgent;
+    var Agents = ['Android', 'iPhone',
+        'SymbianOS', 'Windows Phone',
+        'iPad', 'iPod'
+    ];
+    var flag = true;
+    for (var v = 0; v < Agents.length; v++) {
+        if (userAgentInfo.indexOf(Agents[v]) > 0) {
+            flag = false;
+            break;
+        }
+    }
+    return flag;
+}
+
+export function Arabia_To_SimplifiedChinese(Num) {
+  for (let i = Num.length - 1; i >= 0; i--) {
+      Num = Num.replace(',', '');// 替换Num中的“,”
+      Num = Num.replace(' ', '');// 替换Num中的空格
+  }
+
+  // 验证输入的字符是否为数字
+  if (isNaN(Num)) {
+      alert('请检查小写金额是否正确');
+      return;
+  }
+
+  // 字符处理完毕后开始转换,采用前后两部分分别转换(小数点为界限)
+ var part = String(Num).split('.');
+
+  // 初始化一个字符串
+  var newchar = '';
+
+  // 小数点前进行转化
+  for (let i = part[0].length - 1; i >= 0; i--) {
+      // 若数量超过拾亿单位,提示
+      if (part[0].length > 10) {
+          // alert("位数过大,无法计算");
+          return '';
+      }
+
+     var tmpnewchar = '';
+     var perchar = part[0].charAt(i);
+
+      switch (perchar) {
+          case '0': tmpnewchar = '零' + tmpnewchar; break;
+          case '1': tmpnewchar = '一' + tmpnewchar; break;
+          case '2': tmpnewchar = '二' + tmpnewchar; break;
+          case '3': tmpnewchar = '三' + tmpnewchar; break;
+          case '4': tmpnewchar = '四' + tmpnewchar; break;
+          case '5': tmpnewchar = '五' + tmpnewchar; break;
+          case '6': tmpnewchar = '六' + tmpnewchar; break;
+          case '7': tmpnewchar = '七' + tmpnewchar; break;
+          case '8': tmpnewchar = '八' + tmpnewchar; break;
+          case '9': tmpnewchar = '九' + tmpnewchar; break;
+      }
+      switch (part[0].length - i - 1) {
+          case 0: tmpnewchar = tmpnewchar; break;
+          case 1: if (perchar != 0) tmpnewchar = tmpnewchar + '十'; break;
+          case 2: if (perchar != 0) tmpnewchar = tmpnewchar + '百'; break;
+          case 3: if (perchar != 0) tmpnewchar = tmpnewchar + '千'; break;
+          case 4: tmpnewchar = tmpnewchar + '万'; break;
+          case 5: if (perchar != 0) tmpnewchar = tmpnewchar + '十'; break;
+          case 6: if (perchar != 0) tmpnewchar = tmpnewchar + '百'; break;
+          case 7: if (perchar != 0) tmpnewchar = tmpnewchar + '千'; break;
+          case 8: tmpnewchar = tmpnewchar + '亿'; break;
+          case 9: tmpnewchar = tmpnewchar + '十'; break;
+      }
+      newchar = tmpnewchar + newchar;
+  }
+  // 替换所有无用汉字,直到没有此类无用的数字为止
+  while (newchar.search('零零') != -1 || newchar.search('零亿') != -1 || newchar.search('亿万') != -1 || newchar.search('零万') != -1) {
+      newchar = newchar.replace('零亿', '亿');
+      newchar = newchar.replace('亿万', '亿');
+      newchar = newchar.replace('零万', '万');
+      newchar = newchar.replace('零零', '零');
+  }
+  // 替换以“一十”开头的,为“十”
+  if (newchar.indexOf('一十') == 0) {
+      newchar = newchar.substr(1);
+  }
+  // 替换以“零”结尾的,为“”
+  if (newchar.lastIndexOf('零') == newchar.length - 1) {
+      newchar = newchar.substr(0, newchar.length - 1);
+  }
+  return newchar;
+}

+ 272 - 0
src/assets/main.styl

@@ -0,0 +1,272 @@
+// 颜色
+blue = #247FEA;
+red = #eB1200;
+green = #02b000;
+border-color = #dcdfe6;
+theme-color = #333333;
+btn-color = #E33C64;
+bg-color = #F6F6F6;
+// 字号
+word10 = 10px;
+word12 = 12px;
+word14 = 14px;
+word16 = 16px;
+word18 = 18px;
+word24 = 24px;
+// 灰度级
+gray3 = #333;
+gray4 = #444;
+gray6 = #666;
+gray9 = #999;
+grayE = #efefef;
+black = #000;
+white = #fff;
+bk = #f5f5f5;
+// 间隔
+margin10 = 10px;
+margin20 = 20px;
+margin30 = 30px;
+// 输入框长度
+input300 = 300px;
+input200 = 200px;
+input150 = 150px;
+input100 = 100px;
+input60 = 60px;
+input50 = 50px;
+
+word(size, color = gray3) {
+  font-size: size;
+  color: color;
+}
+
+// 登录按钮
+login-btn() {
+  line-height: 45px;
+  background-color: blue;
+  text-align: center;
+  border-radius: 0;
+  color: white;
+}
+
+// 实心按钮大
+solid-btn() {
+  padding: 15px 30px;
+  line-height: 45px;
+  background-color: blue;
+  text-align: center;
+  border-radius: 0;
+  color: white;
+}
+
+// 空心按钮大
+hollow-btn() {
+  padding: 15px 30px;
+  line-height: 45px;
+  background-color: white;
+  border(blue);
+  text-align: center;
+  border-radius: 0;
+  color: blue;
+}
+
+// 自定义按钮
+custom-btn(w, h, bg, color, borderBg = #fff) {
+  height: h;
+  line-height: h;
+  width: w;
+  background: bg;
+  padding: 0;
+  color: color;
+  border-color: borderBg;
+}
+
+// 操作按钮高亮小
+small-active() {
+  padding: 5px 10px;
+  line-height: 30px;
+  background-color: white;
+  border(blue);
+  text-align: center;
+  border-radius: 0;
+  color: blue;
+}
+
+// 操作按钮灰色小
+small-gray() {
+  padding: 5px 10px;
+  line-height: 30px;
+  background-color: white;
+  border(gray6);
+  text-align: center;
+  border-radius: 0;
+  color: gray6;
+}
+
+// 边框线(颜色|宽度|样式)
+bor-bottom(color = border-color, width = 1px, style = solid) {
+  border-bottom: width style color;
+}
+
+bor-top(color = border-color, width = 1px, style = solid) {
+  border-top: width style color;
+}
+
+bor-left(color = border-color, width = 1px, style = solid) {
+  border-left: width style color;
+}
+
+bor-right(color = border-color, width = 1px, style = solid) {
+  border-right: width style color;
+}
+
+border(color = border-color, width = 1px, style = solid) {
+  border: width style color;
+}
+
+// transition(类型|时长|呈现方式)
+transition(part, time, vol = linear) {
+  transition: part time vol;
+  -webkit-transition: part time vol;
+  -moz-transition: part time vol;
+  -o-transition: part time vol;
+}
+
+border-radius(deg = 10px) {
+  -webkit-border-radius: deg;
+  -moz-border-radius: deg;
+  -o-radius: deg;
+  border-radius: deg;
+}
+
+// flex布局沿y轴
+flex-y(justify = center, align = center) {
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  flex-flow: column nowrap;
+  justify-content: justify;
+  align-items: align;
+}
+
+// flex布局沿x轴
+flex-x(justify = space-between, align = center) {
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  flex-flow: row nowrap;
+  justify-content: justify;
+  align-items: align;
+}
+
+flex-center() {
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  justify-content: center;
+  align-items: center;
+}
+
+// 文字省略号
+ellipsis() {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+// 多行省略号
+multi(row) {
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: row;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: normal;
+  width: auto;
+  white-space: pre-wrap;
+  word-wrap: break-word;
+}
+
+// 渐变色
+gradient(direction, colorStart, colorEnd) {
+  background: -webkit-linear-gradient(direction, colorStart, colorEnd);
+  background: linear-gradient(direction, colorStart, colorEnd);
+  background: -moz-linear-gradient(direction, colorStart, colorEnd);
+  background: -o-linear-gradient(direction, colorStart, colorEnd);
+  background: -ms-linear-gradient(direction, colorStart, colorEnd);
+}
+
+// 图标
+icon-c(widthIcon = 4vw, heightIcon = 4vw, fillColor = #000) {
+  width: widthIcon;
+  height: heightIcon;
+  fill: fillColor;
+}
+
+// 模块样式
+model(edg) {
+  background-color: #fff;
+  border-radius(edg);
+  margin: 10px;
+  padding: 10px;
+}
+
+main() {
+  width: 99%;
+  min-width: 900px;
+//   background: #fff;
+  padding: 10px;
+  box-sizing: border-box;
+  min-height: calc(100vh - 100px);
+  padding-bottom: 80px;
+}
+
+bottom-set() {
+  flex-center();
+  width: calc(100% - 200px);
+  height: 50px;
+  background: white;
+  position: fixed;
+  bottom: 0;
+  box-shadow: 0 2px 18px grayE;
+  z-index: 99;
+}
+
+confirm-btn() {
+  border-radius: 4px;
+  border: 1px solid btn-color;
+  background: btn-color;
+  cursor: pointer;
+  color: white;
+  box-sizing: border-box;
+  text-align: center;
+}
+
+cancel-btn() {
+  border-radius: 4px;
+  border: 1px solid #D9D9D9;
+  color: gray6;
+  background: white;
+  cursor: pointer;
+  box-sizing: border-box;
+  text-align: center;
+}
+
+bottom-sty() {
+  flex-center();
+  width: calc(100% - 200px);
+  height: 50px
+  background white
+  position fixed
+  bottom: 0
+  box-shadow  0 2px 18px grayE
+  z-index: 99
+    .right {
+      width: 65px;
+      height: 32px;
+      confirm-btn();
+    }
+
+    .left {
+      width: 65px;
+      height: 32px;
+      cancel-btn();
+      margin-right: 8px;
+    }
+}

+ 257 - 0
src/assets/mobile.styl

@@ -0,0 +1,257 @@
+main-color = #333333; //主色黄色
+second-color = #C72D47;  //辅助红色
+
+linear-color =#D6392D;
+
+second-lin-color = #DDB77D;
+textColor =#fff;
+
+bk(img){
+    background: url('http://tkimg.datouit.com/static/center-kitchen/'+img) no-repeat
+}
+
+// 主圆角
+main-radius = (5 / 3.75) vw;
+
+// 全圆角
+all-radius = (100 / 3.75) vw
+
+//字号
+word8 = (8 / 3.75) vw;
+word10 = (10 / 3.75) vw;
+word12 = (12 / 3.75) vw;
+word14 = (14 / 3.75) vw;
+word16 = (16 / 3.75) vw;
+word18 = (18 / 3.75) vw
+word20 = (20 / 3.75) vw
+word22 = (22 / 3.75) vw
+word24 = (24 / 3.75) vw
+word36 = (36 / 3.75) vw
+
+// 灰度
+gray3 = #333
+gray6 = #666
+gray9 = #999
+grayF = #fff
+grayE = #eee
+grayEF = #efefef
+grayF5 = #f5f5f5
+grayD8 = #d8d8d8
+grayD = #DDDDDD
+border-color = #f8f8f8
+bk-color = #f8f8f8
+
+//底栏
+tab-bg-color = grayF // 背景色
+tab-color = gray9 // icon默认色
+tab-active-color = main-color // icon高亮色
+
+// 字号加颜色
+word-vw(size, color = gray9,weight=400) {
+  font-size: vw(size);
+  color: color;
+  font-weight weight
+}
+
+//  px转vw(单位转换)
+vw(size) {
+  (size / 3.75) vw;
+}
+
+vh(size) {
+  (size / 6.67) vh;
+}
+
+// 分割线(注意看长度,有的是全部,所以做间隔,不引用这个)
+line() {
+  width calc(100% - 10px)
+  height (1 / 3.75) vw
+  margin 0 auto
+  background-color #f8f8f8
+}
+
+//外边距
+titleMargin = (5 / 3.75) vw;
+smallMargin = (10 / 3.75) vw;
+middleMargin = (20 / 3.75) vw;
+bigMargin = (30 / 3.75) vw;
+
+//内边距
+cellPadding = (15 / 3.75) vw;
+
+//transition(类型|时长|呈现方式)
+transition(part, time = 0.5s, vol = linear) {
+  transition: part time vol;
+  -webkit-transition: part time vol;
+  -moz-transition: part time vol;
+  -o-transition: part time vol;
+}
+
+
+//圆角
+border-radius(deg = 10px) {
+  -webkit-border-radius: deg;
+  -moz-border-radius: deg;
+  -o-radius: deg;
+  border-radius: deg;
+}
+
+//文字省略号
+ellipsis() {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+//多行省略号
+multi(row) {
+  display: -webkit-box
+  -webkit-box-orient vertical
+  -webkit-line-clamp: row
+  overflow: hidden
+  text-overflow: ellipsis
+  word-break: normal
+  width: auto
+  white-space: pre-wrap
+  word-wrap: break-word
+}
+
+//渐变色
+gradient(direction, colorStart, colorEnd) {
+  background: -webkit-linear-gradient(direction, colorStart, colorEnd);
+  background: linear-gradient(direction, colorStart, colorEnd);
+  background: -moz-linear-gradient(direction, colorStart, colorEnd);
+  background: -o-linear-gradient(direction, colorStart, colorEnd);
+  background: -ms-linear-gradient(direction, colorStart, colorEnd);
+}
+//阴影    blur:模糊距离   spread大小
+main-shadow(x = 0, y = 0, blur = 5, spread=2,shadow_color = rgba(153, 153, 153, 0.2)) {
+    -webkit-box-shadow: vw(x) vw(y) vw(blur) vw(spread) shadow_color;
+    -moz-box-shadow: vw(x) vw(y)  vw(blur) vw(spread) shadow_color;
+    -o-box-shadow: vw(x) vw(y)  vw(blur) vw(spread) shadow_color;
+    box-shadow: vw(x)x vw(y)  vw(blur) vw(spread) shadow_color;
+}
+
+// 居中对齐
+flex-center() {
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  justify-content center
+  align-items center
+}
+
+//flex布局沿x轴
+flex-x(justify = space-between, align = center) {
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  flex-flow: row nowrap;
+  justify-content: justify;
+  align-items: align
+}
+
+//flex布局沿y轴居中对齐
+flex-y(justify = center, align = center) {
+  display: flex; /* 新版本语法: Opera 12.1, Firefox 22+ */
+  display: -webkit-flex; /* 新版本语法: Chrome 21+ */
+  flex-flow: column nowrap;
+  justify-content: justify;
+  align-items: align
+}
+
+//单元格样式
+cell() {
+  background-color grayF
+  height vw(45)
+  line-height vw(45)
+  padding 0 cellPadding
+  display flex
+  justify-content space-between
+  align-items center
+  font-size word14
+}
+
+icon(size = 12, color = gray9) {
+  color color
+  font-family:"iconfont" !important;
+  font-size:vw(size);font-style:normal;
+}
+// h5 用图标样式
+web-icon(size = 12, color = gray9) {
+  width vw(size)
+  heigth vw(size)
+  fill color
+}
+
+
+//实心按钮
+solid-btn(wide=200,high=40,radius = 5,bk=main-color) {
+  width (wide / 3.75) vw
+  height (high / 3.75) vw
+  background bk
+  text-align center
+  line-height (high / 3.75) vw
+  border-radius (radius / 3.75) vw
+  color #333
+  font-size: vw(16);
+}
+
+
+// 空心按钮
+hollow-btn(wide=200,high=40,radius = 5,b-color=main-color,bk='#fff'){
+  width (wide / 3.75) vw
+  height (high / 3.75) vw
+  text-align center
+  line-height (high / 3.75) vw
+  border-radius (radius / 3.75) vw
+  color main-color 
+  border vw(1)  solid  main-color 
+  background bk
+  font-size: vw(16);
+  box-sizing border-box
+}
+
+
+// 固定定位在底部
+fixed-bottom(high=60,bk=#fff,shadow=4){
+    z-index 10
+    position fixed
+    bottom 0
+    width 100vw
+    height vw(high)
+    background bk
+    word-vw(18,grayF)
+    flex-x(center)
+    main-shadow(0,-1,4,0,rgba(209, 209, 209, 0.5))
+}
+
+//圆形图标外层背景
+icon-wrap(size,color= main-color ){
+    width vw(size)
+    height vw(size)
+    border-radius all-radius
+    line-height vw(size)
+    text-align center
+    background color
+}
+// 圆形图片
+round-img(wide=45,high=45,radius=100){
+    width vw(wide)
+    height vw(high)
+    border-radius vw(radius)
+    background #f5f5f5
+}
+
+
+input-wrap(wide=200,high=50,radius=5){
+        width vw(wide)
+        height vw(high)
+        background #efefef
+        border-radius radius px
+        word-vw(15,gray3)
+        text-align center 
+        padding 0 vw(10)
+        box-sizing border-box
+        &:focus {
+          outline: none 
+        }
+}

+ 332 - 0
src/assets/public.styl

@@ -0,0 +1,332 @@
+@import '~assets/main.styl';
+
+#app .el-table {
+  border();
+  margin-top: 10px;
+}
+
+// 表格斑马样式
+#app .no-border-table .el-table__row.striped-even {
+  background: #FAFDFF;
+}
+
+#app .no-border-table .el-table__row.striped-odd {
+  background: #FFF;
+}
+
+// 分页样式
+#app .el-pagination .el-pager .number {
+  background: transparent;
+}
+
+// 分页高亮样式
+#app .el-pagination .el-pager .number.active {
+  background: btn-color;
+  border-radius: 100%;
+}
+
+// 表格悬浮样式
+#app .no-border-table .el-table__row.striped:hover td {
+  background: #F4F8FB !important;
+}
+
+// 重置弹窗body padding
+#app .el-dialog__body {
+  padding-top: 0;
+  padding-bottom: 0;
+}
+
+// tree一级图标修改
+#app .tree-content .el-tree-node__expand-icon {
+  font-size: 24px;
+  color: btn-color;
+}
+
+// tree 二级图标修改
+#app .tree-content div[tabindex='0'] .el-tree-node__expand-icon.is-leaf {
+  &::before {
+    content: '';
+    display: block;
+    width: 8px;
+    height: 8px;
+    font-size: 12px;
+    background: btn-color;
+    border-radius: 100%;
+  }
+}
+
+#app .tree-content div[tabindex='-1'] .el-tree-node__expand-icon.is-leaf {
+  &::before {
+    background: transparent;
+    color: transparent;
+  }
+}
+
+// 确认弹窗
+.confirm-box {
+  padding: 32px !important;
+  border-bottom: 24px !important;
+
+  .el-message-box__header {
+    display: none;
+  }
+
+  .title {
+    color: #212121;
+    margin-bottom: 12px;
+    font-size: 16px;
+    flex-x(flex-start);
+
+    .icon {
+      font-size: 24px;
+      margin-right: 16px;
+      color: #FAAD14;
+    }
+  }
+
+  .text {
+    font-size: 14px;
+    color: #595959;
+    margin-bottom: 24px;
+    text-indent: 40px;
+  }
+
+  .cancel-btn {
+    width: 65px !important;
+  }
+
+  .confirm-btn {
+    background: btn-color !important;
+    border-color: btn-color !important;
+    width: 65px !important;
+    color: white;
+  }
+}
+
+.el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  background-color: btn-color;
+  border-color: btn-color;
+}
+
+.el-checkbox__input.is-focus .el-checkbox__inner {
+  border-color: btn-color;
+}
+
+.el-checkbox__input.is-checked+.el-checkbox__label {
+  color: btn-color;
+}
+
+.el-checkbox__inner:hover {
+  border-color: btn-color;
+}
+
+.el-select-dropdown, .el-time-range-picker, .el-message-box__wrapper {
+  z-index: 20000 !important;
+}
+
+.el-loading-mask{
+  z-index: 10001 !important;  
+}
+
+// 弹窗
+.dialog-title {
+  font-size: 16px;
+  color: #262626;
+  padding-bottom: 15px;
+  border-bottom: 1px solid #E6E6E6;
+}
+
+.dialog-footer {
+  padding-top: 10px;
+  border-top: 1px solid #E6E6E6;
+
+  .btn {
+    width: 65px;
+    height: 32px;
+  }
+
+  // 弹窗取消按钮
+  .cancel-btn {
+    cancel-btn();
+    margin-right: 8px;
+    padding: 0;
+  }
+
+  .confirm-btn {
+    confirm-btn();
+    padding: 0;
+  }
+}
+// 过滤
+.filter-box {
+  flex-x();
+
+  .filter {
+    flex-x(flex-start, center);
+    flex-wrap: wrap !important;
+
+    .filter-item {
+      flex-x(flex-start, center);
+      margin: 5px 40px 5px 0;
+
+      .label {
+        white-space: nowrap;
+        color: gray3;
+        font-size: 14px;
+        margin-right: 5px;
+      }
+
+      .input {
+      }
+    }
+  }
+
+  .btn-box {
+    flex-x();
+    margin-right: 40px;
+    flex-wrap: nowrap;
+
+    .search {
+      width: 65px;
+      height: 32px;
+      confirm-btn();
+      margin-right: 8px;
+    }
+
+    .reset {
+      width: 65px;
+      height: 32px;
+      cancel-btn();
+    }
+  }
+}
+
+// 添加图片
+.addImg {
+  position: relative;
+
+  .tips {
+    // margin-bottom: 8px;
+    margin: 0;
+    line-height: 40px;
+    text-indent: 5px;
+  }
+
+  .icon {
+    width: 128px;
+    height: 128px;
+    flex-y();
+    text-align: center;
+    background-color: #F6F6F6;
+    border-radius: 4px;
+    box-sizing: border-box;
+    border: 1px dashed #D9D9D9;
+
+    p {
+      color: red;
+      font-size: 14px;
+      text-align: center;
+      color: gray3;
+
+      &.tip {
+        font-size: 12px;
+        color: gray9;
+        margin-top: 10px;
+      }
+    }
+  }
+
+  .img-box {
+    position: relative;
+    display: inline-block;
+  }
+
+  input {
+    width: 100%;
+    height: 100%;
+    opacity: 0;
+    position: absolute;
+    left: 0;
+    top: 0;
+    cursor: pointer;
+  }
+
+  img {
+    width: auto;
+    height: 128px;
+    background: #f5f5f5;
+    display: block;
+  }
+}
+
+.main-container {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, center);
+  overflow: hidden;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+      .filter-item{
+        margin-right 12px;
+      }
+      .select, .input {
+        width: 125px;
+      }
+      .date-input{
+        width :225px;
+      }
+      .btn-box{
+        margin 0
+      }
+      .table{
+        margin-top 24px !important;
+      }
+    }
+  }
+}
+// 按钮
+.primary {
+      padding: 0 15px;
+      box-sizing:border-box;
+      height: 32px;
+      confirm-btn();
+      margin-right: 8px;
+    }

+ 175 - 0
src/components/common/InputItem.vue

@@ -0,0 +1,175 @@
+<template>
+    <div class="container">
+        <span class="text-left" v-text="textLeft"></span>
+        <!--<div class="expand"></div>-->
+        <!--手机号-->
+        <input
+            class="edit-right"
+            v-model="getInputText"
+            :placeholder="textHolder"
+            type="number"
+            pattern="[0-9]*"
+            onkeypress="return( /[\d]/.test(String.fromCharCode(event.keyCode) ) )"
+            @blur="blur"
+            v-if="isNumber"
+        />
+        <!--所在地区-->
+        <div class="disable-right" @click="click" v-if="isDisabled">
+             <svg class="icon-left" aria-hidden="true">
+                <use xlink:href="#icondingwei"></use>
+            </svg>
+            <input
+                class="edit-right"
+                v-model="getInputText"
+                :placeholder="textHolder"
+                disabled
+            />
+            <svg class="icon-right" aria-hidden="true">
+                <use xlink:href="#iconchevronright"></use>
+            </svg>
+        </div>
+        <!--文字类输入-->
+        <input
+            class="edit-right"
+            v-model="getInputText"
+            :placeholder="textHolder"
+            @blur="blur"
+            v-if="!isDisabled && !isNumber"
+        />
+    </div>
+</template>
+
+<script type="text/ecmascript-6">
+    export default {
+        name: 'InputItem',
+        data() {
+            return {
+                inputText: ''
+            };
+        },
+        props: {
+            textLeft: {
+                type: String,
+                required: true,
+                default: 'text-left-required!!!'
+            },
+            textDefault: {
+                type: String
+            },
+            textHolder: {
+                type: String
+                // default: null
+            },
+            isNumber: {
+                type: Boolean
+            },
+            isDisabled: {
+                type: Boolean
+            }
+        },
+        computed: {
+            getInputText: {
+                get: function() {
+                    // console.log('getInputText', 'text',this.inputText, 'def',this.textDefault)
+                    this.inputText = this.textDefault;
+                    return this.inputText;
+                },
+                set: function(newText) {
+                    this.inputText = newText;
+                    this.$emit('getText', this.inputText);
+                }
+            }
+        },
+        methods: {
+            blur() {
+                this.$emit('blur', this.inputText);
+            },
+            click() {
+                this.$emit('click', this.inputText);
+            }
+        },
+        watch: {
+            textDefault(newValue, oldValue) {
+                // console.log('getTebxtst', newValue,oldValue)
+                this.$emit('getText', this.textDefault);
+            }
+        },
+        mounted() {
+            // console.log('textDefault', this.textDefault)
+        }
+    };
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+    @import '~assets/mobile.styl';
+
+    .container {
+        display: flex;
+        justify-content: flex-end;
+        align-items: center;
+        flex-wrap: nowrap;
+        background: white;
+        height: vw(66);
+        line-height: vw(66);
+        word-vw(14, gray3);
+    }
+
+    .text-left {
+        padding-left: cellPadding;
+        flex: 0.3;
+        /* border salmon 1px solid */
+    }
+
+    .disable-right {
+        /* border 1px slateblue solid */
+        height: vw(66);
+        display: flex;
+        flex: 1;
+        flex-direction: row;
+        flex-wrap: nowrap;
+        align-items: center;
+    }
+
+    /* .expand {
+        flex 1
+    } */
+    .edit-right {
+        background-color: grayF;
+        text-align: left;
+        padding-right: vw(15);
+        flex: 1;
+        height: vw(19);
+        line-height: vw(19);
+        ellipsis();
+        /* border salmon 1px solid */
+    }
+
+    .icon-right {
+        margin-right: cellPadding;
+        width: vw(10);
+        height: vw(15);
+        overflow: hidden;
+        fill: gray9;
+        display: flex;
+        justify-content: center;
+    }
+    .icon-left{
+      web-icon(18,second-color)
+    }
+
+    ::-webkit-input-placeholder {
+        word-vw(12, gray9);
+    }
+
+    :-moz-placeholder {
+        word-vw(12, gray9);
+    }
+
+    ::-moz-placeholder {
+        word-vw(12, gray9);
+    }
+
+    :-ms-input-placeholder {
+        word-vw(12, gray9);
+    }
+</style>

+ 117 - 0
src/components/common/NumberControl.vue

@@ -0,0 +1,117 @@
+<template>
+    <div class="numControl">
+        <svg class="symbol" aria-hidden="true" @click.stop="decrease">
+            <use xlink:href="#iconb-jskc"/>
+        </svg>
+        <input
+                v-model="count"
+                class="count"
+                placeholder=""
+                disabled="disabled"
+                type="number"
+                onkeyup="this.value=this.value.replace(/[^\d]/g,'')"
+        />
+        <!--@blur="changeNum"-->
+        <svg class="symbol" aria-hidden="true" @click.stop="add">
+            <use xlink:href="#iconb-zjkc"/>
+        </svg>
+    </div>
+</template>
+
+<script>
+export default {
+    name: 'NumControl',
+    props: {
+        value: {
+            type: Number | String,
+            default: 1
+        },
+        isCart: {
+            type: Boolean,
+            default: true
+        },
+        goods: {
+            type: Object,
+            default: () => {
+                return {};
+            }
+        }
+    },
+    data() {
+        return {
+            count: this.value,
+            good: this.goods
+        };
+    },
+    watch: {
+        value(val) {
+          console.log("9999,",val);
+            this.count = Number(val);
+        }
+    },
+
+    methods: {
+
+        add() {
+                this.count++;
+                if (this.isCart) {
+                    // 购物车中传入商品信息,非购物车不传
+                    if (this.count <= this.goods.num) {
+                        // this.goods.num = this.count;
+                        this.$emit('input', this.count);
+//                    this.$emit('changeNum', this.goods);
+                    } else {
+                        this.$toast('库存不足,请重新选择');
+                        this.count = this.goods.num;
+                    }
+                } else {
+                    this.$emit('input', this.count);
+                }
+        },
+        decrease() {
+//            this.throttle(()=>{
+                if (this.count <= 1) {
+                    this.count = 1;
+                } else {
+                    this.count--;
+                    if (this.isCart) {
+//                         this.$emit('handleNum','decrease',this.good)
+//                         // 购物车中传入商品信息,非购物车不传
+//                         this.good.num = this.count;
+// //                    this.$emit('changeNum', this.good);
+                        this.$emit('input', this.count);
+                    } else {
+                        this.$emit('input', this.count);
+                    }
+                }
+//            })
+
+        }
+    }
+};
+</script>
+
+<style scoped lang="stylus">
+    @import '~assets/mobile.styl';
+
+    .numControl {
+        display flex
+        background-color grayF
+        align-items center
+        .symbol {
+            width vw(20)
+            height vw(20)
+            fill #999
+
+        }
+        .count {
+            width vw(40)
+            text-align center
+            height vw(22)
+            line-height vw(22)
+            outline none
+            background-color grayF
+            word-vw(16, gray3)
+        }
+    }
+</style>

+ 339 - 0
src/components/common/amap.vue

@@ -0,0 +1,339 @@
+<template>
+    <div class="container">
+        <div id="mapContainer" class="mapContainer" ref="mapContainer"></div>
+        <div class="search-container" v-if="isPoiSearch">
+            <div class="input-wrapper">
+                <span class="search-label">搜索</span>
+                <input id="searchText" type="text" class="search-text" placeholder="请输入搜索词"/>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+	/* eslint-disable */
+	import {lazyAMapApiLoaderInstance} from "vue-amap";
+	// import { setTimeout } from "timers";
+	import {locationMixin} from "@/assets/js/mixin";
+
+	export default {
+		mixins: [locationMixin],
+		data() {
+			return {
+				searchText: ""
+			};
+		},
+		props: {
+			// 经纬度坐标 [118.31, 37.27]
+			position: {
+				type: Array,
+				default: () => []
+			},
+			// 圆形半径 (公里)
+			radius: {
+				type: Number,
+				default: 0
+			},
+			// 缩放级别
+			zoom: {
+				type: Number,
+				default: 16
+			},
+			// 模式:可选'normal'(显示商店定位)、'positionPicker'(商店位置拖拽选择)
+			mode: {
+				type: String,
+				default: "normal"
+			},
+			// 是否根据选点搜索周边
+			isPlaceSearch: {
+				type: Boolean,
+				default: false
+			},
+			// 搜索半径 (公里)
+			searchRadius: {
+				type: Number,
+				default: 2
+			},
+			// 是否加载POI搜索
+			isPoiSearch: {
+				type: Boolean,
+				default: false
+			}
+		},
+		async mounted() {
+			// 初始化加载地图
+			console.time("map");
+			await lazyAMapApiLoaderInstance.load();
+			console.timeEnd("map");
+
+			const option = {};
+			if (this.position.length && this.position[0] && this.position[1]) {
+				option.center = this.position;
+			}
+			if (this.zoom) {
+				option.zoom = this.zoom;
+			}
+			option.scrollWheel = true;
+			this.map = new AMap.Map(this.$refs.mapContainer, option);
+			this.AMap = AMap;
+
+			// 加载poi搜索组件
+			if (this.isPoiSearch) {
+				this._initPoiPicker(AMapUI);
+			}
+
+			if (this.mode === "positionPicker") {
+				this._initPositionPicker(AMapUI);
+			} else {
+				// normal模式 只显示position位置或者设备当前定位位置
+				if (!this.position.length) {
+					// 未传location定位当前设备位置
+					this.getCurrentPositon();
+				} else {
+					this.addMarker(this.position);
+					if (this.radius > 0) {
+						this.addCircle(this.position);
+					}
+				}
+			}
+		},
+		methods: {
+			addMarker(position, message) {
+				const AMap = this.AMap;
+				const map = this.map;
+
+				// 先移除旧的点标记
+				if (this.marker) {
+					map.remove(this.marker);
+				}
+
+				// 创建一个 Marker 实例
+				this.marker = new AMap.Marker({
+					position: new AMap.LngLat(...position), // 经纬度构成的一维数组[116.39, 39.9]
+					title: ""
+				});
+
+				// 将创建的点标记添加到已有的地图实例
+				map.add(this.marker);
+
+				// 处理InfoWindow
+				if (message) {
+					const infoWindow = new AMap.InfoWindow({
+						position: position,
+						offset: new AMap.Pixel(0, -20), // 纵向偏移
+						showShadow: true, // 显示阴影
+						content: message // 文字内容
+					});
+
+					infoWindow.open();
+				}
+
+				this.map.setCenter(this.marker.getPosition());
+			},
+			addCircle(position, radius) {
+				const AMap = this.AMap;
+				const map = this.map;
+
+				this.circle = new AMap.Circle({
+					center: new AMap.LngLat(...position), // 圆心位置
+					radius: 1000 * radius, // 圆半径
+					fillOpacity: 0.4,
+					fillColor: "#1791fc",
+					strokeWeight: 0
+				});
+
+				this.circle.setMap(map);
+				// 缩放地图到合适的视野级别
+				map.setFitView([this.circle]);
+				// map.add(circleMarker);
+			},
+			// 初始化拖拽选择
+			_initPositionPicker(AMapUI) {
+				// 加载拖拽选择插件 positionPicker
+				AMapUI.loadUI(["misc/PositionPicker"], PositionPicker => {
+					var positionPicker = new PositionPicker({
+						mode: "dragMap", // 设定为拖拽地图模式,可选'dragMap'、'dragMarker',默认为'dragMap'
+						map: this.map // 依赖地图对象
+					});
+					positionPicker.on("success", positionResult => {
+						// 抛出选取点信息
+						this.$emit("selectLocation", positionResult);
+
+						//
+						if (this.isPlaceSearch) {
+							this.searchPlace([
+								positionResult.position.lng,
+								positionResult.position.lat
+							]);
+						}
+					});
+					positionPicker.on("fail", positionResult => {
+						console.error(positionResult);
+					});
+					// 开始拖拽选择
+					positionPicker.start();
+				});
+			},
+			// 初始化poi搜索
+			_initPoiPicker(AMapUI) {
+				// 加载拖拽选择插件 PoiPicker
+				AMapUI.loadUI(["misc/PoiPicker"], PoiPicker => {
+					var poiPicker = new PoiPicker({
+						input: "searchText" // 输入框id
+					});
+					// 监听poi选中信息
+					poiPicker.on("poiPicked", poiResult => {
+						// 用户选中的poi点信息
+						const poi = poiResult.item;
+						this.addMarker(
+							[poi.location.lng, poi.location.lat],
+							poi.name
+						);
+					});
+				});
+			},
+			searchPlace([lng, lat]) {
+				const placeSearch = new this.AMap.PlaceSearch({
+					pageSize: 20, // 单页显示结果条数
+					pageIndex: 1, // 页码
+					city: this.city.adcode || "全国", // 兴趣点城市
+					citylimit: true, // 是否强制限制在设置的城市内搜索
+					extensions: "all"
+					// map: this.map, // 展现结果的地图实例
+					// autoFitView: true // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围
+				});
+
+				var cpoint = [lng, lat]; // 中心点坐标
+				placeSearch.searchNearBy(
+					"",
+					cpoint,
+					1000 * this.searchRadius,
+					(status, result) => {
+						if (status === "complete") {
+							this.$emit("searchPlace", result.poiList.pois);
+						}
+					}
+				);
+			},
+			searchByText(text, center) {
+				const placeSearch = new this.AMap.PlaceSearch({
+					// type:
+					//     "商务住宅|政府机构及社会团体|科教文化服务|公共设施|交通设施服务", // 兴趣点类别
+					pageSize: 20, // 单页显示结果条数
+					pageIndex: 1, // 页码
+					city: this.city.adcode || "全国", // 兴趣点城市
+					citylimit: true, // 是否强制限制在设置的城市内搜索
+					extensions: "all"
+					// map: this.map, // 展现结果的地图实例
+					// autoFitView: true // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围
+				});
+
+				let lng, lat;
+				if (center && center.length > 0) {
+					lng = center[0];
+					lat = center[1];
+				} else {
+					lng = this.location[0];
+					lat = this.location[1];
+				}
+
+				placeSearch.search(text, (status, result) => {
+					if (status === "complete") {
+						// console.log(result.poiList.pois);
+						this.$emit("searchByText", result.poiList.pois);
+					}
+				});
+
+				// if (lng && lat) {
+				//     var cpoint = [lng, lat]; // 中心点坐标
+
+				//     placeSearch.searchNearBy(
+				//         text,
+				//         cpoint,
+				//         1000 * 50, // 搜索半价50公里 已经是最大值
+				//         (status, result) => {
+				//             console.log(result);
+				//             if (status === "complete") {
+				//                 this.$emit("searchByText", result.poiList.pois);
+				//             }
+				//         }
+				//     );
+				// } else {
+				//     this.$toast("请授权定位权限后搜索");
+				// }
+			}
+		},
+		watch: {
+			radius(val) {
+				if (this.circle) {
+					this.circle.hide();
+				}
+				if (val > 0) {
+					this.addCircle(this.position, this.radius);
+				}
+			},
+			position(val) {
+				if (val[0] && val[1] && this.map) {
+					this.map.setCenter(val);
+					this.addMarker(this.position);
+				}
+			}
+		}
+	};
+</script>
+<style lang="stylus" scoped>
+    @import '~assets/main.styl';
+
+    .container {
+        position: relative;
+        height: 100%;
+        width: 100%;
+
+        .mapContainer {
+            position: relative;
+            /* height 100vh */
+            /* width 100vw */
+            height: 100%;
+            width: 100%;
+        }
+
+        .search-container {
+            position: fixed;
+            top: vw(20);
+            left: vw(20);
+            width: vw(250);
+            background-color: grayF;
+            padding: smallMargin smallMargin;
+            border-radius: radius;
+            min-width: vw(20);
+            border-width: 0;
+            box-shadow: 0 2px 6px 0 rgba(114, 124, 245, 0.5);
+
+            .input-wrapper {
+                display: flex;
+                justify-content: center;
+
+                .search-label {
+                    line-height: vw(15);
+                    flex: 0 0 vw(40);
+                    padding: titleMargin titleMargin;
+                    display: inline-block;
+                    font-size: word12;
+                    font-weight: bold;
+                    color: grayF;
+                    background-color: main-color;
+                    border: 1px solid main-color;
+                    text-align: center;
+                }
+
+                .search-text {
+                    flex: 0 1 vw(200);
+                    border: 1px solid main-color;
+                    padding: titleMargin titleMargin;
+                    font-size: word12;
+                    line-height: vw(15);
+                }
+            }
+        }
+    }
+</style>

+ 409 - 0
src/components/common/category.vue

@@ -0,0 +1,409 @@
+<template>
+  <div class="category-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="btn" @click="categoryModal('add')">+ 添加{{name}}分类</div>
+        <el-table
+          :data="categoryList"
+          class="table no-border-table"
+          ref="newsTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            prop="name"
+            align="center"
+            label="名称"
+            width="120"
+          ></el-table-column>
+          <el-table-column
+            prop="sort"
+            align="left"
+            label="排序"
+          ></el-table-column>
+          <el-table-column
+            prop="created"
+            align="left"
+            label="编辑日期"
+          ></el-table-column>
+          <el-table-column prop="created" align="left" label="是否显示">
+            <div slot-scope="scope">
+              <i
+                v-if="scope.row.status === 1"
+                class="iconfont icon-checkbox checked-icon"
+              ></i>
+              <i v-else class="iconfont icon-checkbox no-checked-icon"></i>
+            </div>
+          </el-table-column>
+          <el-table-column label="操作" align="left" width="240">
+            <div slot-scope="scope">
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="categoryModal('edit', scope.row)"
+                >
+                  编辑
+                </button>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="deleteCategory(scope.row.id)"
+                >
+                  删除
+                </button>
+              </div>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <!-- 发布分类弹窗 -->
+    <el-dialog width="456px" :visible.sync="categoryShow">
+      <div slot="title">
+        <p class="dialog-title">
+          {{ type === "add" ? "添加" : "编辑" }}{{name}}分类
+        </p>
+      </div>
+      <div class="dialog-content">
+        <el-form
+          :rules="rules"
+          :model="form"
+          ref="categoryForm"
+          class="form"
+          label-width="180px"
+        >
+          <el-form-item label="分类名称:" prop="name">
+            <el-input
+              class="category-input"
+              size="small"
+              style="width: 150px"
+              v-model="form.name"
+              placeholder="请输入分类名称"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="输入排序:">
+            <el-input
+              class="category-input"
+              size="small"
+              style="width: 60px"
+              type="number"
+              onkeypress="return( /[\d]/.test(String.fromCharCode(event.keyCode)))"
+              v-model.number="form.sort"
+              placeholder=""
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="展示:">
+            <el-checkbox v-model="form.status">是否展示该分类</el-checkbox>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <button
+          class="btn cancel-btn"
+          size="small"
+          @click="categoryShow = false"
+        >
+          取 消
+        </button>
+        <button class="btn confirm-btn" size="small" @click="handleCategory">
+          确 定
+        </button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import dayjs from 'dayjs';
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'category',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      type: '', // edit:修改  add:添加
+      categoryInfo: {}, // 分类信息
+      categoryList: [], // 分类列表
+      categoryShow: false, // 分类弹窗
+      form: {
+        // 表单数据
+        name: '',
+        class: null,
+        label: 0,
+        sort: 0,
+        status: false
+      },
+      rules: {
+        // 表单验证规则
+        name: [{ required: true, message: '请输入内容', trigger: 'blur' }]
+      }
+    };
+  },
+  props: {
+    name: {
+      type: String,
+      value: ''
+    },
+    classNum: {
+      type: Number
+    },
+    title: {
+      type: Object,
+      value: {
+        // 页面标题
+        firstTitile: '',
+        secondTitle: ''
+      }
+    }
+  },
+  mounted() {
+    // 获取列表
+    this.getCategoryList();
+  },
+  filters: {
+    // 时间格式化
+    dateFormat(date) {
+      if (!date) return '请选择时间';
+      let day = dayjs(date);
+      return day.format('YYYY-MM-DD HH:mm:ss');
+    }
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getCategoryList();
+    },
+    // 获取分类列表
+    getCategoryList() {
+      this.loading++;
+      this.httpGet(this.$root.getCategoryList, {
+        page: this.currentPage,
+        page_size: this.size,
+        class: this.classNum
+      }).then(
+        (res) => {
+          this.loading--;
+          this.categoryList = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 分类弹窗
+    categoryModal(type, rowData) {
+      this.$refs.categoryForm && this.$refs.categoryForm.clearValidate();
+      this.type = type;
+      if (type === 'edit') {
+        this.categoryInfo = rowData;
+        this.form = {
+          name: rowData.name,
+          class: this.classNum,
+          sort: rowData.sort,
+          status: rowData.status === 1,
+          label: 0
+        };
+      } else if (type === 'add') {
+        this.form = {
+          name: '',
+          class: this.classNum,
+          label: 0,
+          sort: 0,
+          status: false
+        };
+      }
+      this.categoryShow = true;
+    },
+    // 确认添加/修改分类
+    handleCategory() {
+      this.$refs.categoryForm.validate((valid) => {
+        if (valid) {
+          this.loading++;
+          let inputData = {};
+          let url = '';
+          if (this.type === 'add') {
+            url = this.$root.addCategory;
+            inputData = { ...this.form };
+          } else if (this.type === 'edit') {
+            url = this.$root.updateCategory;
+            inputData = {
+              id: this.categoryInfo.id,
+              ...this.form
+            };
+          }
+          this.httpPost(url, {
+            ...inputData,
+            status: inputData.status ? 1 : 2
+          }).then(
+            (res) => {
+              this.$message({
+                message: '操作成功',
+                type: 'success'
+              });
+              this.loading--;
+              this.categoryShow = false;
+              this.getCategoryList();
+            },
+            (res) => {
+              this.loading--;
+              this.$message.error(res);
+            }
+          );
+        } else {
+          return false;
+        }
+      });
+    },
+    // 删除分类
+    deleteCategory(id) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>确认要删除这条${this.name}分类吗?</p><p class='text'>此操作将永久删除该条信息,要继续完成该删除动作吗?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPost(this.$root.deleteCategory, {
+          class: 1,
+          id
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getCategoryList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.category-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 24px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      .checked-icon {
+        color: btn-color;
+        font-size: 16px;
+      }
+
+      .no-checked-icon {
+        color: #aaa;
+      }
+
+      // 按钮
+      .btn {
+        // width: 100px;
+        display: inline-block;
+        padding: 0 10px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin-bottom: 16px;
+      }
+
+      // 表格按钮
+      .table-btn {
+        width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+
+    .form {
+      width: 100%;
+      // flex-y();
+    }
+  }
+}
+</style>

+ 161 - 0
src/components/common/deliveryMode.vue

@@ -0,0 +1,161 @@
+<!--
+ * @Author: lcs
+ * @Date: 2021-04-30 08:48:10
+ * @LastEditTime: 2021-04-30 11:10:29
+ * @LastEditors: lcs
+ * @FilePath: \lananxx-manage\src\components\common\deliveryMode.vue
+ * @Description: 
+-->
+<template>
+    <div
+        v-if="deliveryMode.length > 1"
+        :class="{
+            'delivery-mode': true,
+            padd_left: modeActive == 0,
+            padd_right: modeActive == deliveryMode.length - 1,
+        }"
+    >
+        <div
+            v-for="(item, index) in deliveryMode"
+            :class="['no-choose', { choosed: modeActive == index }]"
+            :key="index"
+            @click.stop="triggerMode(item.value, index)"
+        >
+            {{ item.name }}
+
+            <div class="triangle left-t" v-if="index != 0"></div>
+
+            <div
+                class="triangle right-t"
+                v-if="index != deliveryMode.length - 1"
+            ></div>
+        </div>
+    </div>
+</template>
+
+<script>
+    export default {
+      props:{
+        deliveryMode:{
+          type:Array,
+          default:()=>{
+            return[
+              {
+                  name: '快递发货',
+                  value: 'express',
+                  label: 1
+              },
+              {
+                  name: '进店消费',
+                  value: 'aa',
+                  label: 1
+              }
+            ]
+          }
+        },
+        modeActive:{
+          type:Number,
+          default:0
+        }
+      },
+      data(){
+        return{
+          // modeActive:0,
+          orderLock:false
+        }
+      },
+      methods:{
+                         // 切换配送方式
+        triggerMode(modeValue, index) {
+            if (this.orderLock) {
+                wx.showToast({
+                  icon: 'none',
+                  title: '订单已提交,无法切换配送方式'
+                })
+              return
+            }
+
+            
+              this.modeActive=index;
+              this.$emit('triggerMode',{modeValue,index})
+          
+            // this.orderPrepare()
+          },
+      }
+    };
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+    @import '~assets/mobile.styl';
+
+    .delivery-mode {
+        height: vw(40);
+        width: vw(355);
+        display: flex;
+        position: relative;
+        padding: 0 vw(5);
+        box-sizing: border-box;
+        overflow: hidden;
+        // margin: 0 auto;
+
+        &.padd_left {
+            padding-left: 0;
+        }
+
+        &.padd_right {
+            padding-right: 0;
+        }
+
+        // 未选中
+        .no-choose {
+            align-self: flex-end;
+            flex: 1;
+            height: vw(34);
+            background: #F5F5F5;
+            flex-y();
+
+            &:first-child {
+                border-top-left-radius: main-radius;
+            }
+
+            &:last-child {
+                border-top-right-radius: main-radius;
+            }
+        }
+
+        // 选中的状态
+        .choosed {
+            height: vw(40);
+            background: #fff;
+            position: relative;
+
+            .triangle {
+                width: vw(15);
+                height: vw(46);
+                background: grayF;
+                position: absolute;
+                top: vw(0);
+
+                &.right-t {
+                    right: vw(-8);
+                    border-top-right-radius: main-radius;
+                    transform: rotate(-15deg);
+                    -ms-transform: rotate(-15deg); /* IE 9 */
+                    -webkit-transform: rotate(-15deg); /* Safari and Chrome */
+                    -o-transform: rotate(-15deg); /* Opera */
+                    -moz-transform: rotate(-15deg);
+                }
+
+                &.left-t {
+                    left: vw(-8);
+                    border-top-left-radius: main-radius;
+                    transform: rotate(15deg);
+                    -ms-transform: rotate(15deg); /* IE 9 */
+                    -webkit-transform: rotate(15deg); /* Safari and Chrome */
+                    -o-transform: rotate(15deg); /* Opera */
+                    -moz-transform: rotate(15deg);
+                }
+            }
+        }
+    }
+</style>

+ 51 - 0
src/components/common/dialogItem.vue

@@ -0,0 +1,51 @@
+<template>
+  <div class="dialogItem">
+    <p v-text="model"></p>
+    <p v-text="value"></p>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+  export default {
+    name: 'dialogItem', // 弹窗单挑显示数据组件
+    props: {
+      model: {
+        type: String,
+        required: true,
+        default: '键'
+      },
+      value: {
+        type: String,
+        required: true,
+        default: '值'
+      }
+    },
+    data() {
+      return {};
+    },
+    methods: {}
+  };
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+  @import  '~assets/main.styl';
+  .m-size {
+    font-size: 14px;
+    color: #409EFF;
+    line-height: 44px;
+  }
+
+  .dialogItem:hover {
+    background #f5f5f5
+  }
+
+  .dialogItem {
+    height 42px
+    flex-x(flex-start)
+    bor-top(#ddd)
+    p {
+      word(14px, black)
+      flex: 1
+    }
+  }
+</style>

+ 134 - 0
src/components/common/header.vue

@@ -0,0 +1,134 @@
+<template>
+  <div class="main-header">
+    <div class="first-title title-box">
+      <div class="title">
+        {{ title.firstTitile }}
+      </div>
+      <div class="user-info">
+        <el-popover placement="bottom-end" width="100" trigger="hover">
+          <el-menu>
+            <el-menu-item index="2" @click="logout">
+              <i class="el-icon-document"></i>
+              <span slot="title">退出账号</span>
+            </el-menu-item>
+          </el-menu>
+          <p slot="reference">
+            <span class="username">{{ userInfo.nickname }}</span>
+            <i class="el-icon-arrow-right icon"></i>
+          </p>
+        </el-popover>
+      </div>
+    </div>
+    <div class="second-title title-box" v-if="title.secondTitle">
+      <div class="title">
+        {{ title.secondTitle }}
+      </div>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import { mapGetters, mapMutations } from 'vuex';
+export default {
+  components: {},
+  name: 'main-header',
+  data() {
+    return {};
+  },
+  props: {
+    title: {
+      type: Object,
+      value: {}
+    }
+  },
+  computed: {
+    ...mapGetters(['userInfo'])
+  },
+  methods: {
+    ...mapMutations(['clearToken']),
+    logout() {
+      // 退出账号
+      this.httpPost(this.$root.managerLogout).then(
+        (res) => {
+          this.clearToken();
+          this.$router.push('login');
+        },
+        () => {
+          this.$message({
+            message: '退出失败',
+            type: 'error'
+          });
+        }
+      );
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.main-header {
+  width: 100%;
+  // height: 120px;
+  // min-height: 120px;
+  flex-y();
+
+  .title-box {
+    height: 60px;
+    min-height: 60px;
+    width: 100%;
+    flex-x();
+    background: gray3;
+    padding: 0 24px;
+    box-sizing: border-box;
+    color: white;
+    font-size: 14px;
+  }
+
+  .first-title {
+    .user-info {
+      flex-x();
+      height: 100%;
+
+      .icon {
+        font-size: 14px;
+        height: 24px;
+        line-height: 24px;
+        margin: 0;
+        cursor: pointer;
+        color: white;
+        margin-left: 6px;
+      }
+
+      .setting {
+        margin-left: 40px;
+      }
+
+      .divider {
+        width: 0;
+        border-right: 1px solid white;
+        height: 80%;
+        margin: 0 30px;
+      }
+
+      .username {
+        cursor: pointer;
+        color: white;
+      }
+    }
+  }
+
+  .second-title {
+    background: white;
+    color: btn-color;
+
+    .title {
+      padding: 0 12px;
+      height: 60px;
+      line-height: 60px;
+      box-sizing: border-box;
+      border-bottom: 2px solid btn-color;
+    }
+  }
+}
+</style>

+ 158 - 0
src/components/common/imgUpLoader.vue

@@ -0,0 +1,158 @@
+<template>
+    <div class="img-container" v-loading="loading">
+        <div class="wrapper"
+             v-for="(url,i) in imgList"
+             :key="i"
+             style="position: relative">
+            <img :src="url" class="img"/>
+            <svg class="closeIcon" aria-hidden="true" @click="deletePic(i)">
+                <use xlink:href="#icon-photo-close"></use>
+            </svg>
+        </div>
+        <div class="btn-add">
+            <input type="file"
+                   class="add"
+                   @change="addImg"
+                   ref="inputImg"
+                   accept="image/gif, image/jpeg, image/png, image/jpg">
+            <svg class="icon" aria-hidden="true">
+                <use xlink:href="#icon-add"></use>
+            </svg>
+        </div>
+    </div>
+</template>
+
+<script type="text/ecmascript-6">
+    export default {
+        name: 'img-uploader',
+
+        data() {
+            return {
+                value: [], // 累计上传的轮播图
+                loading: false, // 页面加载
+                picList: [], // 上传oss图片列表
+                imgList: this.imageList // 预览图片列表
+            };
+        },
+        props: {
+            imageList: {
+                type: Array
+            },
+            maxPicNum: {
+                required: true,
+                type: Number,
+                default: -1
+            }
+        },
+        created() {
+        },
+        mounted() {
+        },
+        computed: {},
+        methods: {
+            addImg: function (e) {
+                // 鉴别上传重复图片
+                let value = this.$refs.inputImg.value;
+                // if (this.value.includes(value)) {
+                //     this.$message({
+                //         message: '图片上传重复,请重新选择!',
+                //         type: 'warning'
+                //     });
+                //     return;
+                // }
+                let file = e.target.files[0];
+                let max = this.maxPicNum;
+                if (!file) {
+                    return;
+                }
+                if (max > 0 && this.imgList.length >= max) {
+                    this.$message({
+                        message: '至多添加' + max + '张',
+                        type: 'warning'
+                    });
+                    return;
+                }
+                // 商品相关上传图片
+                this.loading = true;
+                this.httpUploadImg({ prefix: 'other', file: file }).then(res => {
+                    this.imgList.push(res);
+                    this.$emit('getPics', this.imgList);
+                    this.loading = false;
+                    // 将当前的value赋给this.value,将value置空,避免input重复上传图片不触发change事件
+                    this.value.push(value);
+                    this.$refs.inputImg.value = '';
+                }, (res) => {
+                });
+            },
+            deletePic(index) {
+                this.imgList.splice(index, 1);
+                this.$emit('getPics', this.imgList);
+            }
+        },
+        watch: {
+            imageList(val) {
+                this.imgList = val;
+            }
+        }
+    };
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+    @import '~assets/main.styl';
+    .title
+        flex-center()
+        justify-content flex-start
+        word-main()
+        height cell-height
+        padding-left 10px
+
+    .img-container {
+        flex-x()
+        background white
+        justify-content flex-start
+        flex-wrap wrap
+        box-sizing border-box
+        width 92%
+        .wrapper {
+            width 80px
+            height 80px
+            margin: 10px 20px 10px 0;
+            .img {
+                width 100%
+                height 100%
+                border-radius 5px
+            }
+        }
+        .btn-add {
+            flex-y()
+            width 80px
+            height 80px
+            border 1px solid border-color
+            font-size 10px
+            color: gray9
+            position relative
+
+            .add {
+                width: 100%
+                height: 100%
+                opacity: 0;
+                position absolute
+            }
+        }
+    }
+
+    .icon
+        fill: border-color
+        width 20px
+        height 20px
+
+    .closeIcon
+        fill: gray6
+        background-color white
+        border-radius 50%
+        width 20px
+        height 20px
+        position absolute
+        top -10px
+        right -10px
+</style>

+ 142 - 0
src/components/common/navTop.vue

@@ -0,0 +1,142 @@
+<!--
+ * @Author: lcs
+ * @Date: 2021-04-12 16:50:20
+ * @LastEditTime: 2021-05-18 14:51:56
+ * @LastEditors: lcs
+ * @FilePath: \lananxx-manage\src\components\common\navTop.vue
+ * @Description: 
+-->
+
+<template>
+    <div class="nav-wrap">
+        <div class="top-head">
+            <div class="icon-wrap">
+                <svg class="icon" aria-hidden="true" @click.stop="clickMenu">
+                    <use xlink:href="#iconcaidan" v-if="type == 'front'"></use>
+                    <use
+                        xlink:href="#iconchevronleft"
+                        v-if="type == 'back'"
+                    ></use>
+                </svg>
+            </div>
+            <div>{{ title }}</div>
+            <div></div>
+        </div>
+        
+        <!-- 新增条目 -->
+        <van-popup
+            position="top"
+            v-model="menuShow"
+          >    
+            <div class="popup-wrap">
+              <div class="top">
+                <svg class="icon" aria-hidden="true" @click.stop="()=>{menuShow=false}">
+                    <use xlink:href="#iconb-spsz-scgg" />
+                </svg>
+              </div>
+              <div class="single" @click.stop="JumpMenu('customerList')">
+                客户管理
+              </div>
+              <div class="single" @click.stop="JumpMenu('orderList')">
+                订单管理
+              </div>
+              <div class="single" @click.stop="JumpMenu('searchPhone')">
+                帮助租赁下单
+              </div>
+              <!-- @click.stop="JumpMenu('libraryManage')" -->
+              <div class="single" @click.stop="JumpMenu('libraryManage')">
+                出入库表单
+              </div>
+            </div>
+        </van-popup>
+    </div>
+</template>
+
+<script>
+    import { Popup } from 'vant';
+    export default {
+        components: { [Popup.name]: Popup },
+        props: {
+            title: {
+                type: String,
+                default: '蓝桉喜喜'
+            },
+            type: {
+                type: String,
+                default: 'front'
+            }
+        },
+        data(){
+          return{
+            menuShow:false
+          }
+        },
+        methods:{
+          clickMenu(){
+            if(this.type =='front'){
+              this.menuShow = true
+            }else{
+              this.$router.go(-1) 
+            }
+          },
+          JumpMenu(name){
+            this.$router.push({name})
+          },
+        }
+    };
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+    @import '~assets/mobile.styl';
+
+    .nav-wrap {
+        padding-bottom: vw(45);
+    }
+
+    .top-head {
+        height: vw(45);
+        width: 100vw;
+        flex-x(center);
+        box-sizing: border-box;
+        background: grayF;
+        border-bottom: vw(1) solid #efefef;
+        z-index: 11;
+        position: fixed;
+        top: 0;
+    }
+
+    .icon-wrap {
+        position: absolute;
+        left: vw(15);
+
+        .icon {
+            width: vw(20);
+            height: vw(20);
+        }
+    }
+    .popup-wrap{
+      width vw(355)
+      padding  vw(15) vw(27) vw(30) vw(27)
+      box-sizing border-box
+      .top{
+        flex-x()
+        padding-bottom vw(14)
+        margin-bottom vw(20)
+        word-vw(15,#030303)
+        .icon{
+          width vw(20)
+          height vw(20)
+          fill gray3
+        }
+      }
+      .single{
+        text-align center
+        word-vw(18,gray3)
+        font-weight 600
+        line-height vw(50)
+        margin-top vw(12)
+        border-bottom vw(1)  solid #efefef
+        
+      }
+    }
+</style>

+ 173 - 0
src/components/common/singleImg.vue

@@ -0,0 +1,173 @@
+<template>
+    <div class="singleImg">
+        <div class="single">
+            <!--<img :src="defaultImg" v-if="HeadImg===''">-->
+            <div v-if="HeadImg === ''" class="add-wrap">
+                <div class="defaultImg">
+                    <p class="add">+</p>
+                    <p class="text">图片</p>
+                    <p class="tips">支持扩展名:.jpg .png</p>
+                </div>
+                <input
+                    type="file"
+                    class="file"
+                    @change="addChangeImg"
+                    ref="inputImg"
+                    accept="image/gif, image/jpeg, image/png, image/jpg"
+                />
+            </div>
+            <div
+                v-else
+                class="edit-wrap"
+                :style="{ width: setWidth, height: setHeight }"
+            >
+                <img :src="HeadImg" />
+                <input
+                    type="file"
+                    class="file"
+                    @change="addChangeImg"
+                    ref="inputImg"
+                    accept="image/gif, image/jpeg, image/png, image/jpg"
+                />
+            </div>
+        </div>
+        <p class="tips" v-if="size">建议尺寸:{{ size }}</p>
+    </div>
+</template>
+
+<script type="text/ecmascript-6">
+    export default {
+        name: 'singleImg',
+        props: {
+            img: {
+                type: String,
+            },
+            imgType: {
+                type: String,
+                default: 'other',
+            },
+            Width: {
+                type: Number,
+            },
+            Height: {
+                type: Number,
+            },
+            Size: {
+                type: String,
+            },
+        },
+        data() {
+            return {
+                defaultImg: this.$Public.defaultImg,
+                HeadImg: this.img,
+                setWidth: this.Width + 'px',
+                setHeight: this.Height + 'px',
+                size: this.Size,
+            }
+        },
+        created() {},
+        methods: {
+            addChangeImg(e) {
+                // 上传主图
+                this.upPic(e, (res) => {
+                    console.log(111, res)
+                    this.$emit('getPic', res)
+                    this.HeadImg = res;
+                    this.$refs.inputImg.value = ''
+                })
+            },
+            upPic(e, fun) {
+                // 上传图片
+                let file = e.target.files[0]
+                if (!file) {
+                    return
+                }
+                this.request.upPic({ prefix: this.imgType, file: file }).then(
+                    (res) => {
+                        fun(res)
+                    },
+                    (res) => {}
+                )
+            },
+        },
+        watch: {
+            img(val) {
+                this.HeadImg = val
+            },
+            Width(val) {
+                this.setWidth = val + 'px'
+            },
+            Height(val) {
+                this.setHeight = val + 'px'
+            },
+            Size(val) {
+                this.size = val
+            },
+        },
+    }
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+    @import '~assets/main.styl';
+
+    .single {
+        flex-x(flex-start);
+
+        .add-wrap {
+            position: relative;
+            width: 130px;
+            height: 130px;
+            // border: 1px solid border-color;
+
+            .defaultImg {
+                width: 130px;
+                height: 130px;
+                border: 2px dashed border-color;
+                background:#F6F6F6
+
+                .add {
+                    font-size: 40px;
+                    color: gray3;
+                    font-weight:100
+                    line-height: 1;
+                }
+
+                .text {
+                    font-size: 14px;
+                    color: gray3;
+                }
+
+                flex-y(center, center);
+
+                p {
+                    text-align: center;
+                }
+            }
+        }
+
+        .edit-wrap {
+            position: relative;
+            width: 100px;
+            height: 100px;
+
+            img {
+                width: 100%;
+                height: 100%;
+            }
+        }
+
+        input {
+            width: 100%;
+            height: 100%;
+            opacity: 0;
+            position: absolute;
+            top: 0;
+            left: 0;
+        }
+    }
+
+    p {
+        float: left;
+        width: 150px;
+    }
+</style>

+ 69 - 0
src/components/common/upImg.vue

@@ -0,0 +1,69 @@
+<template>
+    <div class="upImg">
+        <el-upload
+                :action=action
+                list-type="picture-card"
+                :on-preview="handlePreview"
+                :on-remove="handleRemove"
+                :file-list="fileList"
+                :limit="limit"
+                :multiple=multiple
+                :on-success="upSuccess"
+                :on-exceed="exceedImg"
+                :on-error="fallUp">
+            <i class="el-icon-plus"></i>
+        </el-upload>
+    </div>
+</template>
+
+<script type="text/ecmascript-6">
+    export default {
+        name: 'upImg',
+        data() {
+            return {
+                limit: 5, // 最多上传5张
+                multiple: true,
+                action: 'https://jsonplaceholder.typicode.com/posts/',
+                fileList: [
+                    {
+                        name: 'food.jpeg',
+                        url: this.$Public.mainImg
+                    },
+                    {
+                        name: 'food.jpeg',
+                        url: this.$Public.mainImg
+                    }]
+            };
+        },
+        computed: {
+            addShow() {
+                return this.fileList.length <= 0;
+            }
+        },
+        methods: {
+            handleRemove(file, fileList) {
+                console.log(file, fileList);
+            },
+            handlePreview(file) {
+                console.log(file);
+            },
+            exceedImg() {
+                // 超出
+                this.$message.error('主图超出预算啦');
+            },
+            upSuccess(response, file, fileList) {
+                // 图片上传成功将图片传入数组
+                this.fileList.concat(fileList);
+            },
+            fallUp(err, file, fileList) {
+            }
+        }
+    };
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+    @import '~assets/main.styl';
+    .upImg {
+        width: 100%
+    }
+</style>

+ 208 - 0
src/components/common/wang-edit.vue

@@ -0,0 +1,208 @@
+<template>
+  <div class="text-edit">
+    <div id="myeditor"></div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import WangEditor from 'wangeditor';
+export default {
+  name: 'wang-edit',
+  // components: { WangEditor },
+  props: {
+    text: {
+      type: String
+    }
+  },
+  data() {
+    return {
+      editor: null,
+      isPaste: false,
+      info_: '', // 当前修改的文本
+      currentImg: '' // 当前粘贴图片
+    };
+  },
+  computed: {},
+  mounted() {
+    this.createEditor();
+    this.editor.txt.html(this.text);
+  },
+  methods: {
+    dataURLtoBlob(dataurl) {
+      var arr = dataurl.split(',');
+      var mime = arr[0].match(/:(.*?);/)[1];
+      var bstr = atob(arr[1]);
+      var n = bstr.length;
+      var u8arr = new Uint8Array(n);
+
+      while (n--) {
+        u8arr[n] = bstr.charCodeAt(n);
+      }
+
+      return new Blob([u8arr], { type: mime });
+    },
+    createEditor() {
+      var that = this;
+      this.editor = new WangEditor('#myeditor');
+      console.log(this.editor.customConfig);
+      this.editor.customConfig.pasteFilterStyle = true; // 带样式粘贴
+      this.editor.customConfig.pasteIgnoreImg = true; // 忽略粘贴内容中的图片
+      this.editor.customConfig.showLinkImg = false;
+      this.editor.customConfig.menus = [
+        'head',
+        'bold',
+        'fontSize',
+        'fontName',
+        'italic',
+        'underline',
+        'strikeThrough',
+        'indent',
+        'lineHeight',
+        'foreColor',
+        'backColor',
+        // 'link',
+        // 'list',
+        'todo',
+        'justify',
+        'quote',
+        // 'emoticon',
+        'image',
+        // 'video',
+        // 'table',
+        // 'code',
+        'splitLine',
+        'undo',
+        'redo'
+      ];
+      // 自定义上传图片
+      this.editor.customConfig.customUploadImg = function (files, insert) {
+        // 粘贴截图会触发customUploadImg方法,不走自定义粘贴
+        that.isPaste = true;
+        that.upPic(files[0], (res) => {
+          insert(res);
+          that.isPaste = false;
+        });
+      };
+
+      // 粘贴网络图片(不包括截图)时,使用pasteTextHandle自定义过滤原始图片
+      this.editor.customConfig.pasteTextHandle = function (content) {
+        return content.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/gi, '');
+      };
+      // 文本实时更新
+      this.editor.customConfig.onchange = (html) => {
+        that.info_ = html;
+        that.$emit('change', that.info_); // 将内容同步到父组件中
+      };
+      // 自定义粘贴截图图片
+      window.addEventListener('paste', function (e) {
+        function dataURLtoBlob(dataurl) {
+          // base64转blob方法
+          var arr = dataurl.split(',');
+          var mime = arr[0].match(/:(.*?);/)[1];
+          var bstr = atob(arr[1]);
+          var n = bstr.length;
+          var u8arr = new Uint8Array(n);
+
+          while (n--) {
+            u8arr[n] = bstr.charCodeAt(n);
+          }
+          return new Blob([u8arr], { type: mime });
+        }
+        var userAgent = navigator.userAgent; // 取得浏览器的userAgent字符串
+        var isIE11 =
+          userAgent.indexOf('Trident') > -1 &&
+          userAgent.indexOf('rv:11.0') > -1;
+        if (isIE11) {
+          // IE11粘贴图片需要注意:
+          //  1.粘贴截图返回base64,使用querySelectorAll获取base64地址转为blob
+          //  2.插入图片方法insertImage
+          //  3.使用base64图片标签正则表达式匹配并删除原base64图片
+          setTimeout(() => {
+            // 获取最新一张粘贴的base64图片地址并转化为blob文件
+            var imgList = document.querySelectorAll('.w-e-text img');
+            var len = imgList.length;
+            var src_str = imgList[len - 1].src;
+            var file = dataURLtoBlob(src_str);
+            // 获取现在编辑器所有的内容,匹配所有的base64图片并删除
+            let currentHtml = that.editor.txt.html();
+            that.editor.txt.html(
+              currentHtml.replace(
+                /<img [^>]*src=['"](data:+)([^'"]+)[^>]*>/gi,
+                ''
+              )
+            );
+            that.upPic(file, (res) => {
+              // 图片转oss插入编辑器
+              that.editor.cmd.do('insertImage', res);
+            });
+          }, 0);
+        } else {
+          // chrome浏览器粘贴图片需要注意:
+          //  1.使用clipboardData获取粘贴图片file文件
+          //  2.插入图片方法insertHtml
+          //  3.使用wangEditor自带的pasteTextHandle方法过滤原始图片
+          if (that.isPaste) {
+            // 粘贴截图时会触发customUploadImg方法
+            return false;
+          }
+          let clipboardData = e.clipboardData;
+          let types;
+          let items;
+          let item;
+          items = clipboardData.items;
+          types = clipboardData.types || [];
+          for (let i = 0; i < types.length; i++) {
+            if (types[i] === 'Files') {
+              item = items[i];
+              break;
+            }
+          }
+          if (item && item.type.match(/^image\//i)) {
+            // 筛选图片文件自定义上传
+            that.upPic(item.getAsFile(), (res) => {
+              that.editor.cmd.do(
+                'insertHtml',
+                '<img src="' + res + '" style="max-width:100%;"/>'
+              );
+            });
+          }
+        }
+      });
+      this.editor.create();
+    },
+    upPic(file, fun) {
+      this.httpUploadImg({ prefix: 'other', file }).then(
+        (res) => {
+          fun(res);
+        },
+        (err) => {
+          console.log(err);
+        }
+      );
+    }
+  },
+  watch: {
+    text(value) {
+      if (value !== this.editor.txt.html()) {
+        this.editor.txt.html(value);
+      }
+    }
+  }
+};
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+* {
+  box-sizing: border-box;
+}
+
+.text-edit {
+  z-index: 1;
+}
+
+>>>.w-e-text-container {
+  height: 720px !important;
+}
+</style>

+ 18 - 0
src/components/common/whatever2excel.js

@@ -0,0 +1,18 @@
+const XLSX = require('xlsx');
+
+export default class myUtils {
+    static json2excel(json, sheetName = 'sheet', dataName = 'excel') {
+        const workBook = XLSX.utils.book_new();
+        const worksheet = XLSX.utils.json_to_sheet(json);
+        // console.log(worksheet);
+        XLSX.utils.book_append_sheet(workBook, worksheet, sheetName);
+        XLSX.writeFile(workBook, dataName + '.xlsx');
+    };
+    static html2excel(ele, sheetName = 'sheet', dataName = 'excel') {
+        const workBook = XLSX.utils.book_new();
+        const worksheet = XLSX.utils.table_to_sheet(ele);
+        // console.log(worksheet);
+        XLSX.utils.book_append_sheet(workBook, worksheet, sheetName);
+        XLSX.writeFile(workBook, dataName + '.xlsx');
+    }
+}

+ 699 - 0
src/components/goods/goodsAttr.vue

@@ -0,0 +1,699 @@
+<template>
+  <el-form size="mini" label-width="100px" :rules="attrRules">
+    <el-form-item label="商品规格" prop="attr">
+      <div class="attr-container">
+        <el-form
+          class="attr-wrap"
+          v-for="(item, index) in Attr"
+          ref="attr"
+          :key="index"
+          :model="item"
+          size="mini"
+          label-width="100px"
+        >
+          <el-form-item label="规格名:" class="attr-name">
+            <el-input
+              v-model="item.name"
+              maxlength="8"
+              placeholder="请输入"
+              :disabled="locking"
+            />
+            <i class="el-icon-circle-close" @click="deleteAttr(index)"></i>
+          </el-form-item>
+          <el-form-item label="规格值:" class="attr-detail">
+            <div
+              v-for="(item1, index1) in item.value"
+              :key="index1"
+              class="detail-wrap"
+            >
+              <el-input
+                v-model="item.value[index1]"
+                maxlength="16"
+                placeholder="请输入"
+                :disabled="locking"
+              />
+              <i
+                class="el-icon-circle-close"
+                @click="deleteAttrValue(index, index1)"
+              ></i>
+            </div>
+            <el-button
+              type="text"
+              :size="inputSize"
+              @click.native="addAttrValue(index)"
+              class="text-btn"
+              >添加规格值</el-button
+            >
+          </el-form-item>
+        </el-form>
+        <div class="addAttr">
+          <el-button
+            :size="inputSize"
+            @click.native="addAttr"
+            :class="{ gray: Attr.length >= 3, 'cancel-btn': true }"
+            >添加规格</el-button
+          >
+          <el-button
+            v-if="!locking"
+            :size="inputSize"
+            type="primary"
+            @click.native="buildDetail"
+            class="confirm-btn"
+            >生成明细</el-button
+          >
+          <el-button
+            v-else-if="locking"
+            :size="inputSize"
+            type="primary"
+            @click.native="resolveAttr"
+            class="confirm-btn"
+            >解锁规格</el-button
+          >
+          <p class="tips" v-if="Attr.length > 0">
+            提示:编辑完成后,请点击“生成规格明细”填写相关明细,修改规格将会清空明细
+          </p>
+        </div>
+      </div>
+    </el-form-item>
+    <el-form-item label="规格明细" v-if="tableData.length > 0">
+      <table border="1">
+        <tr>
+          <th v-for="(item, index) in Attr" :key="index">{{ item.name }}</th>
+          <!-- <th>
+                        <span>*</span> 成本价/元
+                    </th> -->
+          <th><span></span> 规格主图</th>
+          <th><span></span> 价格/元</th>
+          <th><span></span> 库存</th>
+          <th><span></span> 编码</th>
+          <th><span></span> 供应链skuID</th>
+          <th><span></span> 进价</th>
+        </tr>
+        <tr v-for="(item, index) in tableData" :key="index">
+          <td v-for="(item1, index1) in item.attribute" :key="index1">
+            {{ item1 }}
+          </td>
+          <!-- <td>
+                        <el-input v-model="item.cost" type="number" />
+                    </td> -->
+          <td class="upImg">
+            <img v-if="item.pic" :src="item.pic || ''" class="mainImg" />
+            <div class="add-img" v-else>+</div>
+            <input type="file" class="file" :name="index" @change="changeImg" />
+          </td>
+          <td>
+            <el-input v-model="item.price" type="number" @blur="priceFmt" />
+          </td>
+          <td>
+            <el-input v-model="item.stock" type="number" />
+          </td>
+          <td>
+            <el-input v-model="item.code" type="number" />
+          </td>
+          <td>
+            <el-input v-model="item.chainId" type="text" />
+          </td>
+          <td>
+            <el-input v-model="item.cost" type="number" />
+          </td>
+        </tr>
+        <tr>
+          <td :colspan="col">
+            <div class="batch">
+              <p>批量设置</p>
+              <div v-if="batchEdit.type">
+                <el-input
+                  v-model="batchEdit.value"
+                  type="number"
+                  oninput="value=value.length>9?value.slice(0,9):value"
+                />
+                <button class="text-btn" @click="saveBatch">保存</button>
+                <button class="text-btn" @click="cancelBatch">取消</button>
+              </div>
+              <div class="batchBtn" v-else>
+                <button
+                  v-for="(item, i) in batchList"
+                  :key="i"
+                  class="text-btn"
+                  @click="editBatch(i, item.value)"
+                >
+                  {{ item.name }}
+                </button>
+                <!-- <div class="batchImg">
+                                    <input type="file" class="file" @change="batchImg" />
+                                    <button>规格主图</button>
+                                </div> -->
+              </div>
+            </div>
+          </td>
+        </tr>
+      </table>
+    </el-form-item>
+    <el-form-item label="规格明细" v-else>
+      <p style="line-height: 2">无</p>
+    </el-form-item>
+    <!-- <el-form-item label="划线价">
+            <el-input v-model="oldPrice" type="number" />
+        </el-form-item> -->
+    <el-form-item label="商品原价">
+      <el-input v-model="hypocrisy" type="number" />
+    </el-form-item>
+  </el-form>
+</template>
+
+<script type="text/ecmascript-6">
+export default {
+  name: 'goodsAttr',
+  props: {
+    attrSku: {
+      type: Array
+    },
+    skuTable: {
+      type: Array
+    },
+    OldPrice: {
+      type: Number
+    },
+    sales: {
+      type: Number
+    }
+  },
+  data() {
+    return {
+      locking: false, // 锁定规
+      inputSize: 'mini',
+      oldPrice: this.OldPrice, // 划线价
+      hypocrisy: this.sales, // 划线价
+      defaultImg: this.$Public.defaultImg, // 默认规格图
+      ruleForm: {
+        name: ''
+      },
+      attrRules: {
+        attr: [
+          {
+            required: true,
+            message: '请输入商品规格值'
+          }
+        ]
+      }, // 基础校验
+      batchList: [
+        // {
+        //     name: '成本价',
+        //     value: 'cost'
+        // },
+        {
+          name: '价格',
+          value: 'price'
+        },
+        {
+          name: '库存',
+          value: 'stock'
+        }
+      ], // 批量设置列表,静态数据
+      batchEdit: {
+        name: '', // 批量编辑字段
+        type: false,
+        value: '' // 批量编辑数值
+      },
+      col: 0, // 表格列数,批量排版
+      Attr: [
+        {
+          name: '',
+          value: ['']
+        }
+      ], // 规格列表
+      tableData: [], // 规格明细表格
+      attribute: {}, // tableData单list的attribute信息
+      info: {
+        stock: '',
+        code: '',
+        pic: '',
+        price: '',
+        // cost: '',
+        attribute: {}
+      } // tableData单list信息
+    };
+  },
+  created() {},
+  computed: {},
+  methods: {
+    changeImg(e) {
+      // 上传规格图片
+      let index = e.target.name;
+      let file = e.target.files[0];
+      this.request.upPic({ prefix: 'other', file: file }).then(
+        (res) => {
+          this.tableData[index].pic = res;
+          this.tableData = [...this.tableData];
+        },
+        (res) => {}
+      );
+    },
+    batchImg(e) {
+      // 批量上传图片
+      let file = e.target.files[0];
+      this.request.upPic({ type: 3, file: file }).then(
+        (res) => {
+          this.tableData.forEach((item) => {
+            item.pic = res;
+          });
+        },
+        (res) => {}
+      );
+    },
+    editBatch(i, name) {
+      // 批量设置
+      this.batchEdit.name = name;
+      this.batchEdit.type = true;
+    },
+    saveBatch() {
+      this.batchEdit.type = false;
+      // 遍历tableData,批量改数据
+      this.tableData.forEach((item, index) => {
+        // 价格和分润结构不同
+        let name = this.batchEdit.name;
+        // 分公司和能量站最多4.2折,价格不能小于0.03
+        // if (name === 'price') {
+        // if (this.batchEdit.value && +this.batchEdit.value < 0.03) {
+        //   this.$message({
+        //     message: '商品价格请勿小于0.03',
+        //     type: 'warning'
+        //   });
+        //   this.batchEdit.value = '';
+        // }
+        // }
+        item[name] = this.batchEdit.value;
+      });
+      // 清空input
+      this.batchEdit.value = '';
+    },
+    cancelBatch() {
+      this.batchEdit.type = false;
+    },
+    addAttr() {
+      // 添加规格
+      if (this.locking) {
+        return;
+      }
+      if (this.Attr.length >= 3) {
+        this.$message({
+          message: '至多添加三个规格',
+          type: 'warning'
+        });
+        return false;
+      }
+      let obj = {
+        name: '',
+        value: ['']
+      };
+      this.Attr.push(obj);
+    },
+    deleteAttr(index) {
+      // 删除规格
+      if (this.locking) {
+        return;
+      }
+      this.Attr.splice(index, 1);
+    },
+    addAttrValue(index) {
+      // 添加规格值
+      if (this.locking) {
+        return;
+      }
+      let val = '';
+      this.Attr[index].value.push(val);
+    },
+    deleteAttrValue(i, j) {
+      if (this.locking) {
+        return;
+      }
+      // 删除规格值
+      this.Attr[i].value.splice(j, 1);
+    },
+    resolveAttr() {
+      // 解锁规格
+      this.$confirm('此操作将清空规格明细, 是否继续?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          // 清空tableData/info/attribute
+          this.tableData = [];
+          this.attribute = {};
+          this.info = {
+            stock: '',
+            code: '',
+            pic: '',
+            price: '',
+            // cost: '',
+            attribute: {}
+          };
+          this.locking = false;
+        })
+        .catch(() => {
+          return false;
+        });
+    },
+    getTable(i, len) {
+      // 根据选择的attr生成规格明细列表
+      this.Attr[i].value.forEach((item) => {
+        this.$set(this.attribute, this.Attr[i].name, item);
+        if (i === len - 1) {
+          this.$set(this.info, 'attribute', { ...this.attribute });
+          this.tableData.push({ ...this.info });
+          return false;
+        }
+        this.getTable(i + 1, len);
+      });
+    },
+    buildDetail() {
+      let isPass = true;
+      if (this.Attr.length <= 0) {
+        this.$message({
+          message: '请添加规格',
+          type: 'warning'
+        });
+        return false;
+      }
+      this.Attr.forEach((item, i) => {
+        if (item.name === '') {
+          this.$message({
+            message: '请填写规格名',
+            type: 'warning'
+          });
+          isPass = false;
+        }
+        let value = item.value[0];
+        if (value === '' || typeof value === 'undefined') {
+          this.$message({
+            message: '请填写规格值',
+            type: 'warning'
+          });
+          isPass = false;
+        }
+      });
+      if (!isPass) {
+        return false;
+      }
+      // 锁定规格
+      this.locking = true;
+      this.col = this.Attr.length + 7;
+      // 生成规格明细
+      let len = this.Attr.length;
+      this.getTable(0, len);
+    },
+    priceFmt() {
+      // 分公司和能量站最多4.2折,价格不能小于0.03
+      // this.tableData.map((it, index) => {
+      // if (it.price && +it.price < 0.03) {
+      //   this.$message({
+      //     message: '商品价格请勿小于0.03',
+      //     type: 'warning'
+      //   });
+      //   this.tableData[index].price = '';
+      // }
+      // });
+    }
+  },
+  watch: {
+    tableData: {
+      handler(val) {
+        console.log(val, 'aaaaaaaaaaaaaa');
+        // val.map((it, index) => {
+        // if (it.price && +it.price < 0.03) {
+        //     this.$message({
+        //         message: '商品价格请勿小于0.03',
+        //         type: 'warning'
+        //     });
+        //     this.tableData[index].price = '';
+        // }
+        // });
+        // 编辑规格明细时,向父组件传规格明细,库存
+        this.$emit('editAttr', val);
+      },
+      deep: true
+    },
+    OldPrice(val) {
+      this.oldPrice = val;
+    },
+    oldPrice(val) {
+      // 编辑划线价
+      this.$emit('getOldPrice', val);
+    },
+    sales(val) {
+      this.hypocrisy = val;
+    },
+    hypocrisy(val) {
+      // 编辑划线价
+      this.$emit('getSales', val);
+    },
+    skuTable(val) {
+      this.tableData = val;
+    },
+    attrSku: function (val) {
+      this.Attr = [];
+      // 根据根据tableData是否为空判断是上传还是编辑
+      if (this.tableData.length <= 0) {
+        // 新品页面时,根据传递的attrSku,计算Attr的规格名
+        val.forEach((item) => {
+          let list = {
+            name: item,
+            value: ['']
+          };
+          this.Attr.push(list);
+        });
+      } else {
+        // 编辑页面时,计算Attr的规格名,根据tableData,推算Attr的规格值,并锁住
+        val.forEach((item) => {
+          let list = {
+            name: item,
+            value: []
+          };
+          this.Attr.push(list);
+        });
+        this.tableData.forEach((item) => {
+          let attribute = item.attribute;
+          for (let i in attribute) {
+            this.Attr.forEach((item) => {
+              if (item.name === i) {
+                item.value.push(attribute[i]);
+              }
+            });
+          }
+        });
+        this.Attr.forEach((item) => {
+          item.value = [...new Set(item.value)];
+        }); // value去重
+        this.locking = true;
+        this.col = this.Attr.length + 7;
+      }
+    }
+  }
+};
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.el-input {
+  width: 100px;
+}
+
+.batch {
+  flex-x(flex-satrt);
+  padding: 0 16px;
+  word(14px, #333);
+
+  button {
+    color: blue;
+    margin-left: 10px;
+  }
+
+  p {
+    word(14px, #333);
+    margin-right: 15px;
+  }
+
+  .batchBtn {
+    flex-x(flex-satrt);
+
+    .batchImg {
+      position: relative;
+
+      input {
+        opacity: 0;
+        position: absolute;
+        left: 0;
+        top: 0;
+        width: 60px;
+        height: 40px;
+        line-height: 40px;
+        margin-left: 10px;
+      }
+    }
+  }
+}
+
+.upImg {
+  position: relative;
+  vertical-align: middle;
+  height: 100%;
+
+  .add-img{
+    width: 40px;
+    height: 40px;
+    border: 1px solid #e8e8e8;
+    background: #F6F6F6;
+    box-sizing: border-box;
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    margin: auto;
+    font-size: 24px;
+    color: #999;
+  }
+
+  .mainImg {
+    width: 40px;
+    height: 40px;
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    margin: auto;
+  }
+
+  input {
+    width: 40px;
+    height: 40px;
+    opacity: 0;
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    margin: auto;
+  }
+}
+
+.attr-container {
+  padding: 10px;
+  box-sizing: border-box;
+  border();
+
+  .addAttr {
+    flex-x(flex-start);
+    width: 98%;
+    height: 40px;
+    line-height: 40px;
+    background: bk;
+    padding-left: 20px;
+
+    .tips {
+      margin-left: 20px;
+    }
+
+    .gray {
+      color: gray9;
+      background: grayE;
+      border();
+    }
+  }
+
+  .attr-wrap {
+    .el-input {
+      width: 160px;
+      margin-bottom: 5px;
+    }
+
+    .attr-name {
+      position: relative;
+      width: 100%;
+      height: 40px;
+      padding-top: 5px;
+      box-sizing: border-box;
+      background: bk;
+
+      i {
+        position: absolute;
+        right: 20px;
+        line-height: 30px;
+        color: gray9;
+      }
+
+      .el-button--mini {
+        margin-left: 10px;
+      }
+    }
+
+    .attr-detail {
+      .detail-wrap {
+        position: relative;
+        width: 160px;
+        display: inline-block;
+        margin-right: 10px;
+
+        i {
+          position: absolute;
+          right: 10px;
+          line-height: 30px;
+          color: #999;
+          top: 0;
+        }
+      }
+    }
+
+    .el-autocomplete {
+      width: 200px;
+    }
+  }
+}
+
+table {
+  border: 1px solid border-color;
+  width: 100%;
+
+  tr {
+    height: 40px;
+    line-height: 40px;
+    text-align: left;
+  }
+
+  th {
+    span {
+      color: red;
+    }
+
+    text-align: center;
+    font-weight: normal;
+    color: gray3;
+    // padding-left: 20px;
+  }
+
+  td {
+    // padding-left: 20px;
+    height: 54px;
+    text-align: center;
+    bor-top();
+    bor-bottom();
+    color: gray9;
+    width: 80px;
+  }
+}
+
+.confirm-btn {
+  confirm-btn();
+}
+
+.cancel-btn {
+  cancel-btn();
+}
+
+.text-btn {
+  color: btn-color !important;
+}
+</style>

+ 711 - 0
src/components/goods/goodsAttr2.vue

@@ -0,0 +1,711 @@
+<template>
+  <el-form size="mini" label-width="100px" :rules="attrRules">
+    <!-- <el-form-item label="商品规格" prop="attr">
+      <div class="attr-container">
+        <el-form
+          class="attr-wrap"
+          v-for="(item, index) in Attr"
+          ref="attr"
+          :key="index"
+          :model="item"
+          size="mini"
+          label-width="100px"
+        >
+          <el-form-item label="规格名:" class="attr-name">
+            <el-input
+              v-model="item.name"
+              maxlength="8"
+              placeholder="请输入"
+              :disabled="locking"
+            />
+            <i class="el-icon-circle-close" @click="deleteAttr(index)"></i>
+          </el-form-item>
+          <el-form-item label="规格值:" class="attr-detail">
+            <div
+              v-for="(item1, index1) in item.value"
+              :key="index1"
+              class="detail-wrap"
+            >
+              <el-input
+                v-model="item.value[index1]"
+                maxlength="16"
+                placeholder="请输入"
+                :disabled="locking"
+              />
+              <i
+                class="el-icon-circle-close"
+                @click="deleteAttrValue(index, index1)"
+              ></i>
+            </div>
+            <el-button
+              type="text"
+              :size="inputSize"
+              @click.native="addAttrValue(index)"
+              class="text-btn"
+              >添加规格值</el-button
+            >
+          </el-form-item>
+        </el-form>
+        <div class="addAttr">
+          <el-button
+            :size="inputSize"
+            @click.native="addAttr"
+            :class="{ gray: Attr.length >= 3, 'cancel-btn': true }"
+            >添加规格</el-button
+          >
+          <el-button
+            v-if="!locking"
+            :size="inputSize"
+            type="primary"
+            @click.native="buildDetail"
+            class="confirm-btn"
+            >生成明细</el-button
+          >
+          <el-button
+            v-else-if="locking"
+            :size="inputSize"
+            type="primary"
+            @click.native="resolveAttr"
+            class="confirm-btn"
+            >解锁规格</el-button
+          >
+          <p class="tips" v-if="Attr.length > 0">
+            提示:编辑完成后,请点击“生成规格明细”填写相关明细,修改规格将会清空明细
+          </p>
+        </div>
+      </div>
+    </el-form-item> -->
+    <el-form-item label="规格明细" v-if="tableData.length > 0">
+      <table>
+        <tr>
+          <th v-for="(item, index) in Attr" :key="index">{{ item.name }}</th>
+          <!-- <th>
+                        <span>*</span> 成本价/元
+                    </th> -->
+          <th><span></span> 规格主图</th>
+          <th><span></span> 价格/元</th>
+          <th><span></span> 库存</th>
+          <th><span></span> 打赏金额</th>
+          <th><span></span> 绿通支付金额</th>
+          <!-- <th><span></span> 编码</th>
+          <th><span></span> 供应链skuID</th>
+          <th><span></span> 进价</th> -->
+        </tr>
+        <tr v-for="(item, index) in tableData" :key="index">
+          <td v-for="(item1, index1) in item.attribute" :key="index1">
+            {{ item1 }}
+          </td>
+          <!-- <td>
+                        <el-input v-model="item.cost" type="number" />
+                    </td> -->
+          <td class="upImg">
+            <img v-if="item.pic" :src="item.pic || ''" class="mainImg" />
+            <!-- <div class="add-img" v-else>+</div> -->
+            <!-- <input type="file" class="file" :name="index" @change="changeImg" /> -->
+          </td>
+          <td>
+            <!-- <el-input v-model="item.price" type="number" @blur="priceFmt" /> -->
+            {{ item.price }}
+          </td>
+          <td>
+            <!-- <el-input v-model="item.stock" type="number" /> -->
+            {{ item.stock }}
+          </td>
+          <td>
+            {{ item.rewardAmount }}
+          </td>
+          <td>
+            {{ item.goldAmount }}
+          </td>
+          <!-- <td>
+            <el-input v-model="item.code" type="number" />
+          </td>
+          <td>
+            <el-input v-model="item.chainId" type="text" />
+          </td>
+          <td>
+            <el-input v-model="item.cost" type="number" />
+          </td> -->
+        </tr>
+        <!-- <tr>
+          <td :colspan="col">
+            <div class="batch">
+              <p>批量设置</p>
+              <div v-if="batchEdit.type">
+                <el-input
+                  v-model="batchEdit.value"
+                  type="number"
+                  oninput="value=value.length>9?value.slice(0,9):value"
+                />
+                <button class="text-btn" @click="saveBatch">保存</button>
+                <button class="text-btn" @click="cancelBatch">取消</button>
+              </div>
+              <div class="batchBtn" v-else>
+                <button
+                  v-for="(item, i) in batchList"
+                  :key="i"
+                  class="text-btn"
+                  @click="editBatch(i, item.value)"
+                >
+                  {{ item.name }}
+                </button>
+                <div class="batchImg">
+                                    <input type="file" class="file" @change="batchImg" />
+                                    <button>规格主图</button>
+                                </div>
+              </div>
+            </div>
+          </td>
+        </tr> -->
+      </table>
+    </el-form-item>
+    <el-form-item label="规格明细" v-else>
+      <p style="line-height: 2">无</p>
+    </el-form-item>
+    <!-- <el-form-item label="划线价">
+            <el-input v-model="oldPrice" type="number" />
+        </el-form-item> -->
+    <!-- <el-form-item label="商品原价">
+      <el-input v-model="hypocrisy" type="number" />
+    </el-form-item> -->
+  </el-form>
+</template>
+
+<script type="text/ecmascript-6">
+export default {
+  name: 'goodsAttr',
+  props: {
+    attrSku: {
+      type: Array
+    },
+    skuTable: {
+      type: Array
+    },
+    OldPrice: {
+      type: Number
+    },
+    sales: {
+      type: Number
+    }
+  },
+  data() {
+    return {
+      locking: false, // 锁定规
+      inputSize: 'mini',
+      oldPrice: this.OldPrice, // 划线价
+      hypocrisy: this.sales, // 划线价
+      defaultImg: this.$Public.defaultImg, // 默认规格图
+      ruleForm: {
+        name: ''
+      },
+      attrRules: {
+        attr: [
+          {
+            required: true,
+            message: '请输入商品规格值'
+          }
+        ]
+      }, // 基础校验
+      batchList: [
+        // {
+        //     name: '成本价',
+        //     value: 'cost'
+        // },
+        {
+          name: '价格',
+          value: 'price'
+        },
+        {
+          name: '库存',
+          value: 'stock'
+        }
+      ], // 批量设置列表,静态数据
+      batchEdit: {
+        name: '', // 批量编辑字段
+        type: false,
+        value: '' // 批量编辑数值
+      },
+      col: 0, // 表格列数,批量排版
+      Attr: [
+        {
+          name: '',
+          value: ['']
+        }
+      ], // 规格列表
+      tableData: [], // 规格明细表格
+      attribute: {}, // tableData单list的attribute信息
+      info: {
+        stock: '',
+        code: '',
+        pic: '',
+        price: '',
+        // cost: '',
+        attribute: {}
+      } // tableData单list信息
+    };
+  },
+  created() {},
+  computed: {},
+  methods: {
+    changeImg(e) {
+      // 上传规格图片
+      let index = e.target.name;
+      let file = e.target.files[0];
+      this.request.upPic({ prefix: 'other', file: file }).then(
+        (res) => {
+          this.tableData[index].pic = res;
+          this.tableData = [...this.tableData];
+        },
+        (res) => {}
+      );
+    },
+    batchImg(e) {
+      // 批量上传图片
+      let file = e.target.files[0];
+      this.request.upPic({ type: 3, file: file }).then(
+        (res) => {
+          this.tableData.forEach((item) => {
+            item.pic = res;
+          });
+        },
+        (res) => {}
+      );
+    },
+    editBatch(i, name) {
+      // 批量设置
+      this.batchEdit.name = name;
+      this.batchEdit.type = true;
+    },
+    saveBatch() {
+      this.batchEdit.type = false;
+      // 遍历tableData,批量改数据
+      this.tableData.forEach((item, index) => {
+        // 价格和分润结构不同
+        let name = this.batchEdit.name;
+        // 分公司和能量站最多4.2折,价格不能小于0.03
+        // if (name === 'price') {
+        // if (this.batchEdit.value && +this.batchEdit.value < 0.03) {
+        //   this.$message({
+        //     message: '商品价格请勿小于0.03',
+        //     type: 'warning'
+        //   });
+        //   this.batchEdit.value = '';
+        // }
+        // }
+        item[name] = this.batchEdit.value;
+      });
+      // 清空input
+      this.batchEdit.value = '';
+    },
+    cancelBatch() {
+      this.batchEdit.type = false;
+    },
+    addAttr() {
+      // 添加规格
+      if (this.locking) {
+        return;
+      }
+      if (this.Attr.length >= 3) {
+        this.$message({
+          message: '至多添加三个规格',
+          type: 'warning'
+        });
+        return false;
+      }
+      let obj = {
+        name: '',
+        value: ['']
+      };
+      this.Attr.push(obj);
+    },
+    deleteAttr(index) {
+      // 删除规格
+      if (this.locking) {
+        return;
+      }
+      this.Attr.splice(index, 1);
+    },
+    addAttrValue(index) {
+      // 添加规格值
+      if (this.locking) {
+        return;
+      }
+      let val = '';
+      this.Attr[index].value.push(val);
+    },
+    deleteAttrValue(i, j) {
+      if (this.locking) {
+        return;
+      }
+      // 删除规格值
+      this.Attr[i].value.splice(j, 1);
+    },
+    resolveAttr() {
+      // 解锁规格
+      this.$confirm('此操作将清空规格明细, 是否继续?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          // 清空tableData/info/attribute
+          this.tableData = [];
+          this.attribute = {};
+          this.info = {
+            stock: '',
+            code: '',
+            pic: '',
+            price: '',
+            // cost: '',
+            attribute: {}
+          };
+          this.locking = false;
+        })
+        .catch(() => {
+          return false;
+        });
+    },
+    getTable(i, len) {
+      // 根据选择的attr生成规格明细列表
+      this.Attr[i].value.forEach((item) => {
+        this.$set(this.attribute, this.Attr[i].name, item);
+        if (i === len - 1) {
+          this.$set(this.info, 'attribute', { ...this.attribute });
+          this.tableData.push({ ...this.info });
+          return false;
+        }
+        this.getTable(i + 1, len);
+      });
+    },
+    buildDetail() {
+      let isPass = true;
+      if (this.Attr.length <= 0) {
+        this.$message({
+          message: '请添加规格',
+          type: 'warning'
+        });
+        return false;
+      }
+      this.Attr.forEach((item, i) => {
+        if (item.name === '') {
+          this.$message({
+            message: '请填写规格名',
+            type: 'warning'
+          });
+          isPass = false;
+        }
+        let value = item.value[0];
+        if (value === '' || typeof value === 'undefined') {
+          this.$message({
+            message: '请填写规格值',
+            type: 'warning'
+          });
+          isPass = false;
+        }
+      });
+      if (!isPass) {
+        return false;
+      }
+      // 锁定规格
+      this.locking = true;
+      this.col = this.Attr.length + 7;
+      // 生成规格明细
+      let len = this.Attr.length;
+      this.getTable(0, len);
+    },
+    priceFmt() {
+      // 分公司和能量站最多4.2折,价格不能小于0.03
+      // this.tableData.map((it, index) => {
+      // if (it.price && +it.price < 0.03) {
+      //   this.$message({
+      //     message: '商品价格请勿小于0.03',
+      //     type: 'warning'
+      //   });
+      //   this.tableData[index].price = '';
+      // }
+      // });
+    }
+  },
+  watch: {
+    tableData: {
+      handler(val) {
+        console.log(val, 'aaaaaaaaaaaaaa');
+        // val.map((it, index) => {
+        // if (it.price && +it.price < 0.03) {
+        //     this.$message({
+        //         message: '商品价格请勿小于0.03',
+        //         type: 'warning'
+        //     });
+        //     this.tableData[index].price = '';
+        // }
+        // });
+        // 编辑规格明细时,向父组件传规格明细,库存
+        this.$emit('editAttr', val);
+      },
+      deep: true
+    },
+    OldPrice(val) {
+      this.oldPrice = val;
+    },
+    oldPrice(val) {
+      // 编辑划线价
+      this.$emit('getOldPrice', val);
+    },
+    sales(val) {
+      this.hypocrisy = val;
+    },
+    hypocrisy(val) {
+      // 编辑划线价
+      this.$emit('getSales', val);
+    },
+    skuTable(val) {
+      this.tableData = val;
+    },
+    attrSku: function (val) {
+      this.Attr = [];
+      // 根据根据tableData是否为空判断是上传还是编辑
+      if (this.tableData.length <= 0) {
+        // 新品页面时,根据传递的attrSku,计算Attr的规格名
+        val.forEach((item) => {
+          let list = {
+            name: item,
+            value: ['']
+          };
+          this.Attr.push(list);
+        });
+      } else {
+        // 编辑页面时,计算Attr的规格名,根据tableData,推算Attr的规格值,并锁住
+        val.forEach((item) => {
+          let list = {
+            name: item,
+            value: []
+          };
+          this.Attr.push(list);
+        });
+        this.tableData.forEach((item) => {
+          let attribute = item.attribute;
+          for (let i in attribute) {
+            this.Attr.forEach((item) => {
+              if (item.name === i) {
+                item.value.push(attribute[i]);
+              }
+            });
+          }
+        });
+        this.Attr.forEach((item) => {
+          item.value = [...new Set(item.value)];
+        }); // value去重
+        this.locking = true;
+        this.col = this.Attr.length + 7;
+      }
+    }
+  }
+};
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.el-input {
+  width: 100px;
+}
+
+.batch {
+  flex-x(flex-satrt);
+  padding: 0 16px;
+  word(14px, #333);
+
+  button {
+    color: blue;
+    margin-left: 10px;
+  }
+
+  p {
+    word(14px, #333);
+    margin-right: 15px;
+  }
+
+  .batchBtn {
+    flex-x(flex-satrt);
+
+    .batchImg {
+      position: relative;
+
+      input {
+        opacity: 0;
+        position: absolute;
+        left: 0;
+        top: 0;
+        width: 60px;
+        height: 40px;
+        line-height: 40px;
+        margin-left: 10px;
+      }
+    }
+  }
+}
+
+.upImg {
+  position: relative;
+  vertical-align: middle;
+  height: 100%;
+
+  .add-img{
+    width: 40px;
+    height: 40px;
+    border: 1px solid #e8e8e8;
+    background: #F6F6F6;
+    box-sizing: border-box;
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    margin: auto;
+    font-size: 24px;
+    color: #999;
+  }
+
+  .mainImg {
+    width: 40px;
+    height: 40px;
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    margin: auto;
+  }
+
+  input {
+    width: 40px;
+    height: 40px;
+    opacity: 0;
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    margin: auto;
+  }
+}
+
+.attr-container {
+  padding: 10px;
+  box-sizing: border-box;
+  border();
+
+  .addAttr {
+    flex-x(flex-start);
+    width: 98%;
+    height: 40px;
+    line-height: 40px;
+    background: bk;
+    padding-left: 20px;
+
+    .tips {
+      margin-left: 20px;
+    }
+
+    .gray {
+      color: gray9;
+      background: grayE;
+      border();
+    }
+  }
+
+  .attr-wrap {
+    .el-input {
+      width: 160px;
+      margin-bottom: 5px;
+    }
+
+    .attr-name {
+      position: relative;
+      width: 100%;
+      height: 40px;
+      padding-top: 5px;
+      box-sizing: border-box;
+      background: bk;
+
+      i {
+        position: absolute;
+        right: 20px;
+        line-height: 30px;
+        color: gray9;
+      }
+
+      .el-button--mini {
+        margin-left: 10px;
+      }
+    }
+
+    .attr-detail {
+      .detail-wrap {
+        position: relative;
+        width: 160px;
+        display: inline-block;
+        margin-right: 10px;
+
+        i {
+          position: absolute;
+          right: 10px;
+          line-height: 30px;
+          color: #999;
+          top: 0;
+        }
+      }
+    }
+
+    .el-autocomplete {
+      width: 200px;
+    }
+  }
+}
+
+table {
+  border: 1px solid border-color;
+  width: 100%;
+
+  tr {
+    height: 40px;
+    line-height: 40px;
+    text-align: left;
+  }
+
+  th {
+    height: 54px;
+    background: #F6F6F6;
+    span {
+      color: red;
+    }
+
+    text-align: center;
+    font-weight: normal;
+    color: gray3;
+    // padding-left: 20px;
+  }
+
+  td {
+    // padding-left: 20px;
+    height: 54px;
+    text-align: center;
+    bor-top();
+    bor-bottom();
+    color: gray9;
+    width: 80px;
+  }
+}
+
+.confirm-btn {
+  confirm-btn();
+}
+
+.cancel-btn {
+  cancel-btn();
+}
+
+.text-btn {
+  color: btn-color !important;
+}
+</style>

+ 97 - 0
src/components/goods/goodsClass.vue

@@ -0,0 +1,97 @@
+<template>
+    <div class="goodsClass">
+        <el-cascader
+            v-model="group"
+            :options="groupList"
+            size="mini"
+            :props="prop"
+            @change="handleChange"
+        ></el-cascader>
+    </div>
+</template>
+
+<script type="text/ecmascript-6">
+    export default {
+        name: 'goodsClass',
+        props: {
+            groupDefault: {
+                type: Array,
+                default: () => []
+            }
+        },
+        data() {
+            return {
+                group: this.groupDefault,
+                groupList: [],
+                prop: {
+                    value: 'id',
+                    label: 'name'
+                }
+            };
+        },
+        created() {
+            this.getGroupList();
+        },
+        methods: {
+            handleChange(val) {
+                // 选择分类
+                this.$emit('getGroup', val);
+            },
+            clearClass() {
+                this.group = [];
+            },
+            getGroupList() {
+                // 获取分类列表
+                this.httpPost(this.$root.groupList).then(
+                    res => {
+                        // 一级分类
+                        this.groupList = res;
+                        // console.log(5555, this.groupList);
+                        // 过滤分类不到三级
+                        // const array = res.filter(item => item.children);
+                        // array.forEach(item => {
+                        //         item.children = item.children.filter(item1 => item1.children);
+                        //     });
+                        // // 变成级联选择器的格式
+                        // this.groupList = JSON.stringify(array);
+                    },
+                    () => {}
+                );
+            }
+        },
+        watch: {
+            groupDefault(val) {
+                this.group = val;
+                console.log(77777, val);
+            }
+        }
+    };
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+    @import '~assets/main.styl';
+
+    .single {
+        position: relative;
+        flex-x(flex-start);
+        background: #f5f5f5;
+
+        input {
+            width: 100%;
+            height: 100%;
+            opacity: 0;
+            position: absolute;
+            left: 0;
+        }
+
+        img {
+            width: 100%;
+            height: 100%;
+        }
+    }
+
+    p {
+        float: left;
+        width: 200px;
+    }
+</style>

+ 276 - 0
src/components/goods/goodsExt.vue

@@ -0,0 +1,276 @@
+<template>
+    <div class="goodsExt">
+        <div class="inline-left">
+            <p style="width:70px;margin-left:40px">商品类型</p>
+            <el-select
+                size="mini"
+                v-model="extType"
+                :disabled="enterType == 'detail'"
+                placeholder="请选择"
+                @change="changeType"
+            >
+                <el-option
+                    v-for="item in extList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                >
+                </el-option>
+            </el-select>
+        </div>
+        <el-form size="mini" label-width="100px" v-if="extType == 2">
+            <el-form-item label="规格明细" v-if="tableData.length > 0">
+                <table border="1">
+                    <tr>
+                        <th v-for="(item, index) in Attr" :key="index">
+                            {{ item.name }}
+                        </th>
+                        <th><span>*</span> 选择音频</th>
+                    </tr>
+                    <tr v-for="(item, index) in tableData" :key="index">
+                        <td v-for="(item1, index1) in item.attr" :key="index1">
+                            {{ item1 }}
+                        </td>
+                        <td class="upImg">
+                            <el-select
+                                size="mini"
+                                :disabled="enterType == 'detail'"
+                                v-model="typeList[index]"
+                                placeholder="请选择"
+                            >
+                                <el-option
+                                    v-for="item2 in mediaList"
+                                    :key="item2.pack_id"
+                                    :label="item2.name"
+                                    :value="item2.pack_id"
+                                >
+                                </el-option>
+                            </el-select>
+                            <!-- <img :src="item.pic" class="mainImg" />
+                            <input
+                                type="file"
+                                class="file"
+                                :name="index"
+                                @change="changeImg"
+                            /> -->
+                        </td>
+                    </tr>
+                </table>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+
+<script type="text/ecmascript-6">
+    import { mapGetters } from 'vuex';
+    export default {
+        name: 'goodsExt',
+        props: {
+            enterType: {
+                type: String,
+                default: 'edit'
+            },
+            goodsId: {
+                type: String
+            },
+            Info: {
+                type: Object
+            }
+        },
+        data() {
+            return {
+                extList: [
+                    {
+                        name: '其它商品',
+                        id: '0'
+                    },
+                    {
+                        name: '视频课程',
+                        id: '1'
+                    },
+                    {
+                        name: '音频课程',
+                        id: '2'
+                    },
+                    {
+                        name: '课程周边',
+                        id: '3'
+                    }
+                ],
+                tableData: [],
+                typeList: [],
+                mediaInfo: {},
+                inputSize: 'mini',
+                extType: '0',
+                baseRules: {},
+                mediaList: [],
+                Attr: [],
+                roleList: [], // 身份列表
+                isInit: true
+            };
+        },
+        computed: {
+            ...mapGetters(['attrTable', 'tableHead']),
+            attrTable1() {
+                return this.attrTable;
+            },
+            tableHead1() {
+                return this.tableHead;
+            }
+        },
+        async created() {
+            this.tableData = this.attrTable;
+            this.Attr = this.tableHead;
+            this.getMediaList();
+        },
+        mounted() {},
+        methods: {
+            changeType(val) {
+                this.extType = val;
+                this.$emit('changeType', val);
+            },
+            getMediaList() {
+                this.httpPost(this.$root.mediaList).then(
+                    res => {
+                        this.mediaList = res.list;
+                        this.loading = false;
+                    },
+                    () => {
+                        this.loading = false;
+                    }
+                );
+            }
+        },
+        watch: {
+            Info: {
+                handler(val) {
+                    // 编辑
+                    if (!this.isInit) {
+                        return false;
+                    }
+                    console.log(22222, val);
+                    this.mediaInfo = JSON.parse(JSON.stringify(val));
+                    this.extType = this.mediaInfo.goods_type;
+                    this.tableData = this.mediaInfo.media_info;
+                    this.typeList = this.mediaInfo.media_info.map(
+                        item => item.pack_id
+                    );
+                },
+                deep: true
+            },
+            attrTable1: {
+                handler(val) {
+                    this.tableData = val;
+                },
+                deep: true
+            },
+            tableHead1: {
+                handler(val) {
+                    console.log(444444, val);
+                    this.Attr = val;
+                },
+                deep: true
+            },
+            typeList: {
+                handler(val) {
+                    // 选择音频时向父组件传递
+                    let media = [];
+                    let list = this.typeList.slice(0);
+                    this.tableData.forEach((item, i) => {
+                        media.push({
+                            attr: item.attr,
+                            pack_id: list[i]
+                        });
+                    });
+                    this.$emit('editMedia', media);
+                },
+                deep: true
+            }
+        }
+    };
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+    @import '~assets/main.styl';
+
+    .el-input {
+        width: 100px !important;
+    }
+
+    .basic {
+        width: 100%;
+        height: 30px;
+        background: bk;
+        border-radius(3px);
+        padding: 0 15px;
+        overflow: hidden;
+
+        h1 {
+            word(14px);
+            font-weight: bold;
+            line-height: 30px;
+        }
+    }
+
+    .upImg {
+        position: relative;
+
+        .mainImg {
+            width: 60px;
+            height: 60px;
+            margin-top: 10px;
+        }
+
+        input {
+            width: 60px;
+            height: 60px;
+            opacity: 0;
+            position: absolute;
+            left: 20px;
+            top: 10px;
+        }
+    }
+
+    table {
+        border: 1px solid border-color;
+        width: 100%;
+
+        tr {
+            height: 40px;
+            line-height: 40px;
+            text-align: left;
+        }
+
+        th {
+            span {
+                color: red;
+            }
+
+            font-weight: normal;
+            color: gray3;
+            padding-left: 20px;
+        }
+
+        td {
+            padding-left: 20px;
+            bor-top();
+            bor-bottom();
+            color: gray9;
+            width: 80px;
+        }
+    }
+
+    .el-form {
+        margin-top: 10px;
+        padding-left: 20px;
+    }
+
+    .el-input {
+        width: 300px;
+    }
+
+    .el-button {
+        margin-left: 10px;
+        margin-bottom: 10px;
+    }
+</style>

+ 139 - 0
src/components/goods/goodsFreight.vue

@@ -0,0 +1,139 @@
+<template>
+    <div class="province">
+        <el-checkbox
+            :indeterminate="isIndeterminate"
+            v-model="province.checked"
+            :disabled="province.disabled"
+            @change="changeProvince"
+            >{{ province.name }}
+        </el-checkbox>
+        <svg class="changeIcon" aria-hidden="true" @click.stop="openSingle">
+            <use :xlink:href="iconChange"></use>
+        </svg>
+        <transition name="fade">
+            <div
+                class="singleArea"
+                v-show="itemShow && province.cityList.length"
+            >
+                <svg
+                    class="changeIcon"
+                    aria-hidden="true"
+                    @click.stop="closeSingle"
+                >
+                    <use xlink:href="#icon-close"></use>
+                </svg>
+                <el-checkbox-group v-model="province.city"  @change="handleCheckedCitiesChange">
+                    <el-checkbox
+                        v-for="(item, index) in province.cityList"
+                        :key="index"
+                        :label="item.code"
+                        :disabled="item.disabled"
+                        >{{ item.name }}
+                    </el-checkbox>
+                </el-checkbox-group>
+            </div>
+        </transition>
+    </div>
+</template>
+
+<script>
+    export default {
+        name: 'goods-freight',
+        props: {
+            province: {
+                type: Object
+            },
+            show: {
+                type: Boolean
+            },
+            index: {
+                type: Number
+            }
+        },
+        data() {
+            return {
+                isIndeterminate: false,
+                itemShow: false,
+                iconChange: '#icon-arrowdropdown'
+            };
+        },
+        created() {
+        },
+        methods: {
+            openSingle() {
+                this.iconChange = this.itemShow
+                    ? '#icon-arrowdropdown'
+                    : '#icon-arrowdropup';
+                this.$emit('changeShow', this.index, !this.itemShow);
+            },
+            changeProvince(val) {
+                // 根据省份的选择状态更改市级状态
+                this.province.city = val ? this.province.cityList.map(item => item.code) : [];
+                this.isIndeterminate = false;
+                this.$emit('changeCity', this.index, this.province);
+            },
+            handleCheckedCitiesChange(value) {
+                let checkedCount = value.length;
+                this.province.checked = checkedCount === this.province.cityList.length;
+                this.$emit('changeCity', this.index, this.province);
+                this.isIndeterminate =
+                    checkedCount > 0 && checkedCount < this.province.cityList.length;
+            },
+            closeSingle() {
+                this.iconChange = '#icon-arrowdropdown';
+                this.$emit('changeShow', this.index, false);
+            }
+        },
+        watch: {
+            show(val) {
+                this.itemShow = val;
+            }
+        }
+    };
+</script>
+<style scoped lang="stylus" rel="stylesheet/stylus">
+    @import '~assets/main.styl';
+
+    .province {
+        position: relative;
+        width: 106px;
+        margin-bottom: 10px;
+        line-height: 30px;
+    }
+
+    .fade-enter-active, .fade-leave-active {
+        transition: opacity 0.3s;
+    }
+
+    .fade-enter, .fade-leave-to { /* .fade-leave-active below version 2.1.8 */
+        opacity: 0;
+    }
+
+    .el-checkbox {
+    }
+
+    .el-checkbox-group {
+        flex-x();
+        flex-wrap: wrap;
+    }
+
+    .changeIcon {
+        width: 12px;
+        height: 12px;
+        fill: #666;
+        position: absolute;
+        right: 10px;
+        top: 10px;
+        cursor: pointer;
+    }
+
+    .singleArea {
+        background: #efefef;
+        padding: 20px 10px;
+        width: 250px;
+        position: absolute;
+        left: 0;
+        top: 30px;
+        z-index: 99;
+    }
+</style>

+ 163 - 0
src/components/goods/imgUpLoader.vue

@@ -0,0 +1,163 @@
+<template>
+    <div class="img-container" v-loading="loading">
+        <div class="wrapper" style="position: relative" v-if="url">
+            <img :src="url" class="img" />
+            <svg class="closeIcon" aria-hidden="true" @click="deletePic()">
+                <use xlink:href="#icon-photo-close"></use>
+            </svg>
+        </div>
+        <div class="btn-add" v-else>
+            <input
+                type="file"
+                class="add"
+                @change="addImg"
+                ref="inputImg"
+                accept="image/gif, image/jpeg, image/png, image/jpg"
+            />
+            <span v-if="text">{{ text }}</span>
+            <svg class="icon" v-else aria-hidden="true">
+                <use xlink:href="#icon-add"></use>
+            </svg>
+        </div>
+    </div>
+</template>
+
+<script type="text/ecmascript-6">
+export default {
+    name: 'img-uploader',
+
+    data() {
+        return {
+            value: [], // 累计上传的轮播图
+            loading: false, // 页面加载
+            picList: [], // 上传oss图片列表
+            url: this.imgUrl || ''
+        };
+    },
+    props: {
+        imgUrl: {
+            type: String
+        },
+        text: {
+            type: String
+        },
+        index: {
+            type: Number
+        }
+    },
+    created() {},
+    mounted() {},
+    computed: {},
+    methods: {
+        addImg: function (e) {
+            // 鉴别上传重复图片
+            let value = this.$refs.inputImg.value;
+            // if (this.value.includes(value)) {
+            //     this.$message({
+            //         message: '图片上传重复,请重新选择!',
+            //         type: 'warning'
+            //     });
+            //     return;
+            // }
+            let file = e.target.files[0];
+            let max = this.maxPicNum;
+            if (!file) {
+                return;
+            }
+            // 商品相关上传图片
+            this.loading = true;
+            this.httpUploadImg({ prefix: 'goods', file: file }).then(
+                (res) => {
+                    // this.imgList.push(res);
+                    this.$emit('getPics', this.index, res);
+                    this.loading = false;
+                    // 将当前的value赋给this.value,将value置空,避免input重复上传图片不触发change事件
+                    this.value.push(value);
+                    this.$refs.inputImg.value = '';
+                },
+                (res) => {}
+            );
+        },
+        deletePic(index) {
+            this.$emit('getPics', this.index, '');
+        }
+    },
+    watch: {
+        imgUrl(val) {
+            this.url = val;
+        }
+    }
+};
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.title {
+    flex-center();
+    justify-content: flex-start;
+    word-main();
+    height: cell-height;
+    padding-left: 10px;
+}
+
+.img-container {
+    flex-x();
+    background: white;
+    justify-content: flex-start;
+    flex-wrap: wrap;
+    box-sizing: border-box;
+    // width: 92%;
+    margin-right 10px;
+
+    .wrapper {
+        width: 80px;
+        height: 80px;
+        margin: 10px 20px 10px 0;
+        text-align center
+        flex-x(center, center);
+
+        .img {
+            width: 80px;
+            height auto;
+            border-radius: 5px;
+        }
+    }
+
+    .btn-add {
+        flex-y();
+        width: 80px;
+        height: 80px;
+        border: 1px solid border-color;
+        font-size: 10px;
+        color: gray9;
+        position: relative;
+        background: #E8E8E8;
+
+        .add {
+            width: 100%;
+            height: 100%;
+            opacity: 0;
+            position: absolute;
+        }
+    }
+}
+
+.icon {
+    fill: border-color;
+    width: 20px;
+    height: 20px;
+}
+
+.closeIcon {
+    fill: gray6;
+    background-color: white;
+    border-radius: 50%;
+    width: 20px;
+    height: 20px;
+    position: absolute;
+    top: -10px;
+    right: -10px;
+    cursor: pointer;
+}
+</style>

+ 163 - 0
src/components/goods/imgUpLoader1.vue

@@ -0,0 +1,163 @@
+<template>
+    <div class="img-container" v-loading="loading">
+        <div class="wrapper" style="position: relative" v-if="url">
+            <img :src="url" class="img" />
+            <svg class="closeIcon" aria-hidden="true" @click="deletePic()">
+                <use xlink:href="#icon-photo-close"></use>
+            </svg>
+        </div>
+        <div class="btn-add" v-else>
+            <input
+                type="file"
+                class="add"
+                @change="addImg"
+                ref="inputImg"
+                accept="image/gif, image/jpeg, image/png, image/jpg"
+            />
+            <span v-if="text">{{ text }}</span>
+            <svg class="icon" v-else aria-hidden="true">
+                <use xlink:href="#icon-add"></use>
+            </svg>
+        </div>
+    </div>
+</template>
+
+<script type="text/ecmascript-6">
+export default {
+    name: 'img-uploader',
+
+    data() {
+        return {
+            value: [], // 累计上传的轮播图
+            loading: false, // 页面加载
+            picList: [], // 上传oss图片列表
+            url: this.imgUrl || ''
+        };
+    },
+    props: {
+        imgUrl: {
+            type: String
+        },
+        text: {
+            type: String
+        },
+        index: {
+            type: Number
+        }
+    },
+    created() {},
+    mounted() {},
+    computed: {},
+    methods: {
+        addImg: function (e) {
+            // 鉴别上传重复图片
+            let value = this.$refs.inputImg.value;
+            // if (this.value.includes(value)) {
+            //     this.$message({
+            //         message: '图片上传重复,请重新选择!',
+            //         type: 'warning'
+            //     });
+            //     return;
+            // }
+            let file = e.target.files[0];
+            let max = this.maxPicNum;
+            if (!file) {
+                return;
+            }
+            // 商品相关上传图片
+            this.loading = true;
+            this.httpUploadImg({ prefix: 'goods', file: file }).then(
+                (res) => {
+                    // this.imgList.push(res);
+                    this.$emit('getPics', this.index, res);
+                    this.loading = false;
+                    // 将当前的value赋给this.value,将value置空,避免input重复上传图片不触发change事件
+                    this.value.push(value);
+                    this.$refs.inputImg.value = '';
+                },
+                (res) => {}
+            );
+        },
+        deletePic(index) {
+            this.$emit('getPics', this.index, '');
+        }
+    },
+    watch: {
+        imgUrl(val) {
+            this.url = val;
+        }
+    }
+};
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.title {
+    flex-center();
+    justify-content: flex-start;
+    word-main();
+    height: cell-height;
+    padding-left: 10px;
+}
+
+.img-container {
+    flex-x();
+    background: white;
+    justify-content: flex-start;
+    flex-wrap: wrap;
+    box-sizing: border-box;
+    // width: 92%;
+    margin-right 10px;
+
+    .wrapper {
+        width: 80px;
+        height: 80px;
+        margin: 10px 20px 10px 0;
+        text-align center
+        flex-x(center, center);
+
+        .img {
+            width: 80px;
+            height auto;
+            border-radius: 5px;
+        }
+    }
+
+    .btn-add {
+        flex-y();
+        width: 80px;
+        height: 80px;
+        border: 1px solid border-color;
+        font-size: 10px;
+        color: gray9;
+        position: relative;
+        background: #E8E8E8;
+
+        .add {
+            width: 100%;
+            height: 100%;
+            opacity: 0;
+            position: absolute;
+        }
+    }
+}
+
+.icon {
+    fill: border-color;
+    width: 20px;
+    height: 20px;
+}
+
+.closeIcon {
+    fill: gray6;
+    background-color: white;
+    border-radius: 50%;
+    width: 20px;
+    height: 20px;
+    position: absolute;
+    top: -10px;
+    right: -10px;
+    cursor: pointer;
+}
+</style>

+ 102 - 0
src/components/goods/selectIcon.vue

@@ -0,0 +1,102 @@
+<template>
+    <div class="singleImg">
+        <div class="single">
+            <el-popover placement="bottom" width="600" trigger="hover">
+                <el-tabs
+                    v-model="activeName"
+                    type="card"
+                    @tab-click="handleClick"
+                >
+                    <el-tab-pane
+                        :label="item.icon_group"
+                        :name="item.icon_group"
+                        v-for="(item, i) in list"
+                        :key="i"
+                    >
+                        <div class="icon-wrap">
+                            <img
+                                class="icon"
+                                :src="img"
+                                v-for="(img, j) in item.icon_list"
+                                :key="j"
+                                @click="selectIcon(img)"
+                            />
+                        </div>
+                    </el-tab-pane>
+                </el-tabs>
+                <img :src="defaultImg" slot="reference" v-if="HeadImg === ''" />
+                <img :src="HeadImg" slot="reference" v-else />
+            </el-popover>
+        </div>
+    </div>
+</template>
+
+<script type="text/ecmascript-6">
+    export default {
+        name: 'singleImg',
+        props: {
+            iconList: {
+                type: Array
+            },
+            img: {
+                type: String
+            }
+        },
+        data() {
+            return {
+                defaultImg: this.$Public.defaultImg,
+                HeadImg: this.img,
+                activeName: '',
+                list: []
+            };
+        },
+        created() {
+            this.list = this.iconList;
+            this.activeName = this.iconList[0].icon_group;
+        },
+        methods: {
+            handleClick(val) {
+                // console.log(44444val, val);
+            },
+            selectIcon(val) {
+                 this.$emit('getPic', val);
+            }
+        },
+        watch: {
+            img(val) {
+                this.HeadImg = val;
+            }
+        }
+    };
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+    @import '~assets/main.styl';
+    .icon-wrap {
+            flex-x(flex-start);
+            flex-wrap: wrap;
+
+            .icon {
+                width: 50px;
+                height: 50px;
+                margin: 10px 10px 0 0
+            }
+        }
+    .single {
+        position: relative;
+        flex-x(flex-start);
+        // background: #f5f5f5;
+        width: 100px;
+        height: 100px;
+
+        img {
+            width: 100px;
+            height: 100px;
+        }
+    }
+
+    p {
+        float: left;
+        width: 200px;
+    }
+</style>

+ 97 - 0
src/components/goods/singleImg.vue

@@ -0,0 +1,97 @@
+<template>
+  <div class="singleImg">
+    <div class="single" :style="{ width: setWidth, height: setHeight }">
+      <img :src="defaultImg" v-if="HeadImg === ''" />
+      <img :src="HeadImg" v-else />
+      <input
+        type="file"
+        class="file"
+        @change="addChangeImg"
+        ref="inputImg"
+        accept="image/gif, image/jpeg, image/png, image/jpg"
+      />
+    </div>
+    <p class="tips">建议尺寸:{{ imgSize }} * {{ imgSize }}</p>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+export default {
+    name: 'singleImg',
+    props: {
+        img: {
+            type: String
+        },
+        imgType: {
+            type: String
+        },
+        imgSize: {
+            type: String,
+            default: '750'
+        },
+        channel: {
+            type: String
+        }
+    },
+    data() {
+        return {
+            defaultImg: this.$Public.defaultImg,
+            HeadImg: this.img,
+            setWidth: '80px',
+            setHeight: '80px',
+            size: '750*750'
+        };
+    },
+    created() {
+    },
+    methods: {
+        addChangeImg(e) {
+            // 上传主图
+            this.upPic(e, res => {
+                this.$emit('getPic', res);
+                this.$refs.inputImg.value = '';
+            });
+        },
+        upPic(e, fun) {
+            // 上传图片
+            let file = e.target.files[0];
+            if (!file) {
+                return;
+            }
+            this.request.upPic({ type: this.imgType, file: file }).then(res => {
+                fun(res);
+            }, (res) => {
+            });
+        }
+    },
+    watch: {
+        img(val) {
+            this.HeadImg = val;
+        }
+    }
+};
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+.single {
+    position relative
+    flex-x(flex-start)
+    background #f5f5f5
+    input {
+        width: 100%
+        height: 100%
+        opacity 0
+        position absolute
+        left: 0
+    }
+    img {
+        width: 100%
+        height: 100%
+    }
+}
+p{
+    float: left;
+    width: 200px;
+}
+</style>

+ 246 - 0
src/components/goods/upImgDetail.vue

@@ -0,0 +1,246 @@
+<!--商品详情-->
+<template>
+  <div class="img-container" v-loading="loading">
+    <div
+      class="wrapper"
+      v-for="(item, index) in imgList"
+      :key="index"
+      style="position: relative"
+    >
+      <img :src="item" class="img" />
+      <div class="iconWrap">
+        <!-- <svg
+          class="closeIcon"
+          aria-hidden="true"
+          @click="upSort(index)"
+          v-if="index !== 0"
+        >
+          <use xlink:href="#icon-up"></use>
+        </svg> -->
+        <!-- <svg
+          class="closeIcon"
+          aria-hidden="true"
+          @click="downSort(index)"
+          v-if="index !== imgList.length - 1"
+        >
+          <use xlink:href="#icon-down"></use>
+        </svg> -->
+        <svg class="closeIcon" aria-hidden="true" @click="deletePic(index)">
+          <use xlink:href="#icon-photo-close"></use>
+        </svg>
+      </div>
+    </div>
+    <div class="btn-add">
+      <input
+        type="file"
+        class="add"
+        @change="addImg"
+        ref="inputImg"
+        accept="image/gif, image/jpeg, image/png, image/jpg"
+        multiple
+      />
+      <p>
+        <svg class="icon" aria-hidden="true">
+          <use xlink:href="#icon-xinzeng1"></use>
+        </svg>
+      </p>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+export default {
+  name: 'img-uploader',
+
+  data() {
+    return {
+      value: [],
+      loading: false, // 页面加载
+      picList: [], // 上传oss图片列表
+      iconShow: [],
+      imgList: this.imageList // 预览图片列表
+    };
+  },
+  props: {
+    imageList: {
+      type: Array
+    },
+    maxPicNum: {
+      required: true,
+      type: Number,
+      default: -1
+    }
+  },
+  created() {},
+  mounted() {},
+  computed: {},
+  methods: {
+    showIcon(index) {
+      this.$set(this.iconShow, index, true);
+    },
+    hideIcon(index) {
+      this.$set(this.iconShow, index, false);
+    },
+    upSort(index) {
+      // 上调顺序
+      this.loading = true;
+      let img = this.imgList[index - 1];
+      this.imgList[index - 1] = this.imgList[index];
+      this.imgList[index] = img;
+      this.loading = false;
+    },
+    downSort(index) {
+      // 下调顺序
+      this.loading = true;
+      let img = this.imgList[index + 1];
+      this.imgList[index + 1] = this.imgList[index];
+      this.imgList[index] = img;
+      this.loading = false;
+    },
+    getPics() {
+      this.$emit('getDetail', this.imgList);
+    },
+    async addImg(e) {
+      // 鉴别上传重复图片
+      let value = this.$refs.inputImg.value;
+      // if (this.value.includes(value)) {
+      //     this.$message({
+      //         message: '图片上传重复,请重新选择!',
+      //         type: 'warning'
+      //     });
+      //     return;
+      // }
+      let files = e.target.files;
+      let num = 0;
+      this.loading = true;
+      for (let i in files) {
+        if (!files[i].name) {
+          return;
+        }
+        await this.request.upPic({ prefix: 'goods', file: files[i] }).then(
+          (res) => {
+            this.imgList.push(res);
+            num++;
+            if (num >= files.length) {
+              this.$message({
+                message: '图片上传成功',
+                type: 'success'
+              });
+              this.loading = false;
+              // 将当前的value赋给this.value,将value置空,避免input重复上传图片不触发change事件
+              this.value.push(value);
+              this.$refs.inputImg.value = '';
+              // 图片上传完成向父组件传递
+              this.iconShow = new Array(this.imgList.length).fill(false);
+              this.getPics();
+            }
+          },
+          (res) => {
+            this.$message({
+              message: '第' + i + '图片上传失败',
+              type: 'error'
+            });
+            this.loading = false;
+          }
+        );
+      }
+    },
+    deletePic(index) {
+      this.imgList.splice(index, 1);
+      this.getPics();
+    }
+  },
+  watch: {
+    imageList(val) {
+      this.imgList = val;
+    }
+  }
+};
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.title {
+  flex-center();
+  justify-content: flex-start;
+  word-main();
+  height: cell-height;
+  padding-left: 10px;
+}
+
+.img-container {
+  flex-x();
+  background: white;
+  justify-content: flex-start;
+  flex-wrap: wrap;
+  box-sizing: border-box;
+  margin-top: 20px;
+
+  .wrapper {
+    width: auto;
+    height: 120px;
+    margin-right: 12px;
+    margin-bottom: 12px;
+
+    .img {
+      width: auto;
+      height: 100%;
+    }
+
+    .iconWrap {
+      flex-center();
+      position: absolute;
+      top: 0;
+      left: 0;
+      width: 100%;
+      height: 100%;
+
+      // background: black;
+      // opacity: 0.5;
+      .closeIcon {
+        fill: gray6;
+        background-color: white;
+        border-radius: 50%;
+        width: 20px;
+        height: 20px;
+        position: absolute;
+        top: -10px;
+        right: -10px;
+        cursor: pointer;
+      }
+    }
+  }
+
+  .btn-add {
+    margin-right: 12px;
+    margin-bottom: 12px;
+    flex-y();
+    width: 120px;
+    height: 120px;
+    // padding: 10px 0;
+    background: white;
+    box-sizing: border-box;
+    border();
+    font-size: 10px;
+    color: gray6;
+    position: relative;
+    background: #f6f6f6;
+    border-color: #E8E8E8;
+
+    .add {
+      width: 100%;
+      height: 100%;
+      opacity: 0;
+      position: absolute;
+      color: #979797;
+    }
+  }
+}
+
+.icon {
+  fill: #979797;
+  width: 42px;
+  height: 42px;
+}
+</style>

+ 166 - 0
src/components/goods/uploadFile.vue

@@ -0,0 +1,166 @@
+<template>
+    <div class="upAppendix">
+        <el-upload
+            action="string"
+            class="upload-demo"
+            :on-remove="handleRemove"
+            :before-remove="beforeRemove"
+            :http-request="upFile"
+            :multiple="false"
+            :file-list="nFile"
+            :accept="acceptType"
+        >
+            <div class="add-wrap" v-if="!showBtn">
+                <p class="add">
+                    <i class="el-icon-upload2"></i>点击选择
+                </p>
+            </div>
+        </el-upload>
+    </div>
+</template>
+
+<script type="text/ecmascript-6">
+    export default {
+        name: 'singleImg',
+        props: {
+            file: {
+                type: Object,
+                default: () => {
+                    return {};
+                }
+            },
+            fileType: {
+                type: String,
+                default: '3'
+            },
+            acceptType: {
+                type: String,
+                // default: 'audio/*'
+                default: '.m4a,audio/wav,audio/mp3,.aac'
+            }
+        },
+        data() {
+            return {
+                showBtn: false,
+                uploadPercent: '', // 上传进度
+                currentFile: {},
+                defaultImg: this.$Public.defaultImg,
+                nFile: [],
+                progress: 0 // 进度条
+            };
+        },
+        created() {},
+        methods: {
+            beforeRemove(file) {
+                console.log('beforeRemove', file);
+                return this.$confirm(`确定移除 ${file.name}?`);
+            },
+            handleRemove(file) {
+                this.showBtn = false;
+                this.nFile = this.nFile.filter(item => item !== file);
+                this.emit();
+            },
+            emit() {
+                let data = {
+                    file_url: this.nFile[0].url,
+                    url_name: this.nFile[0].name
+                };
+                this.$emit('getFile', data);
+            },
+            upFile(param) {
+                // 上传
+                let file = param.file;
+                if (!file) {
+                    return;
+                }
+                this.showBtn = true;
+                this.httpUploadImg({ type: this.fileType, file: file }).then(
+                    res => {
+                        let item = {
+                            url: res,
+                            name: param.file.name
+                        };
+                        this.nFile.push(item);
+                        console.log('httpUploadImg', this.nFile, res);
+                        this.emit();
+                    },
+                    res => {
+                        console.log(2222);
+                    }
+                );
+            }
+        },
+        watch: {
+            file: {
+                handler(val) {
+                    console.log(22222, val);
+                    // if (val.id) {
+                    if (val.file_url) {
+                        this.nFile = [
+                            {
+                                url: val.file_url,
+                                name: val.url_name
+                            }
+                        ];
+                        this.showBtn = true;
+                    }
+                    // }
+                },
+                deep: true,
+                immediate: true
+            },
+            nFile: {
+                handler(val) {
+                    console.log(333, val);
+                },
+                deep: true,
+                immediate: true
+            }
+        }
+    };
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+    @import '~assets/main.styl';
+
+    .upAppendix {
+        flex-x(flex-start, flex-start);
+        margin-top: 5px;
+
+        .add-wrap {
+            position: relative;
+            width: 100px;
+            height: 30px;
+            background: white;
+            border: 1px solid border-color;
+            border-radius(3px);
+            flex-center();
+
+            .add {
+                color: blue;
+            }
+
+            p {
+                text-align: center;
+                color: gray6;
+            }
+        }
+
+        input {
+            width: 100%;
+            height: 100%;
+            opacity: 0;
+            position: absolute;
+            top: 0;
+            left: 0;
+        }
+    }
+
+    >>>.el-upload {
+        display: inherit !important;
+    }
+
+    >>>.el-upload-list__item:first-child {
+        margin-top: 0 !important;
+    }
+</style>

+ 115 - 0
src/config.js

@@ -0,0 +1,115 @@
+/* eslint-disable camelcase */
+/** 全局配置表 */
+// 协议
+const protocol = window.protocal ? window.protocal : process.env.NODE_ENV === 'production' ? 'https' : 'https';
+// mock环境
+const mock_baseUrl = `${protocol}://101.200.54.239:7777/mock/5cff05ef3b9c0c22d4b7bbe1`;
+
+// 开发(联调)环境
+const dev_baseUrl = `${protocol}://yuezhilian20-api-dev-go.datouit.com`; // 开发环境
+// 测试环境
+const test_baseUrl = `${protocol}://yuezhilian20-api-dev-go.datouit.com`; // 测试环境
+// 生产环境
+
+const pro_baseUrl = `${protocol}://yuezhilian20-api-dev-go.datouit.com`; // 开发环境
+
+// 插件入口
+export const units = {
+    group: true, // 分类
+    goodsExt: false // 商品额外设置
+};
+
+// 静态图片域名 - OSS
+export const oss_baseUrl = `${protocol}://yuezhilian20-img.datouit.com/static/`;
+export const ossBaseUrl = `${protocol}://yuezhilian20-img.datouit.com/static/`;
+// 项目logo
+export const logo = oss_baseUrl + '/static/undefined-shop/logo.jpg';
+export const staticImg = oss_baseUrl + '/static/undefined-shop2/';
+
+export const role = [
+    {
+        name: '代理商',
+        id: 12
+    },
+    {
+        name: '超级代理商',
+        id: 13
+    }
+];
+
+export const roleMap = {
+    0: '普通用户',
+    12: '代理商',
+    13: '超级代理商'
+};
+
+export const level = [
+    {
+        name: '社区代理',
+        id: 1
+    },
+    {
+        name: '区县代理',
+        id: 2
+    },
+    {
+        name: '市级代理',
+        id: 3
+    },
+    {
+        name: '运营中心',
+        id: 4
+    }
+];
+
+export const levelMap = {
+    0: '普通',
+    1: '社区代理',
+    2: '区县代理',
+    3: '市级代理',
+    4: '运营中心'
+};
+
+// api请求地址
+export const baseUrl = getBaseUrl();
+
+// 高德地图api凭据
+export const amapKey = '223462ea0c0e146bf4a405031a9fd2d7';
+
+// qq地图 key
+export const qqMapKey = 'D65BZ-22PK3-YNY3N-3AJUY-WNLD7-RBF43';
+
+// 错误码常量
+export const errCode = {
+    5001001: '未获取到token',
+    5001002: '无效的token',
+    5001003: '注册失败',
+    5001004: '用户异常'
+};
+
+export const themeColor = '#E43939';
+
+// 请求地址处理
+function getBaseUrl() {
+    let currentUrl = '';
+    switch (process.env.NODE_ENV) {
+        case 'mock':
+            currentUrl = mock_baseUrl;
+            break;
+        case 'development':
+            currentUrl = dev_baseUrl;
+            break;
+        case 'test':
+            currentUrl = test_baseUrl;
+            break;
+        case 'production':
+            currentUrl = pro_baseUrl;
+            break;
+    }
+    // 全局域名覆盖(有值就覆盖 一般不使用)
+    if (window.domain) {
+        console.log(999999, window.domain);
+        currentUrl = `${protocol}://${window.domain}`;
+    }
+    return currentUrl;
+}

+ 56 - 0
src/main.js

@@ -0,0 +1,56 @@
+import Vue from 'vue';
+import App from './App.vue';
+import router from './router/router';
+import store from './store/store';
+import ElementUI from 'element-ui';
+import request from './request/request';
+import filters from './assets/js/filters';
+import directives from './assets/js/directives';
+import Public from './assets/js/public.js';
+import 'element-ui/lib/theme-chalk/index.css';
+import VueBus from 'vue-bus';
+import VueQuillEditor from 'vue-quill-editor'; // 富文本编辑器
+
+// 引入echarts
+import echarts from 'echarts';
+
+Vue.config.productionTip = false;
+Vue.prototype.request = request;
+Vue.prototype.httpGet = request.get;
+Vue.prototype.$Public = Public;
+Vue.prototype.httpPost = request.post;
+Vue.prototype.httpPut = request.put;
+Vue.prototype.httpDelete = request.delete;
+Vue.prototype.httpUploadImg = request.upPic;
+Vue.prototype.httpUploadFile = request.upFile;
+Vue.prototype.$echarts = echarts;
+Vue.use(ElementUI);
+Vue.use(VueBus);
+Vue.use(VueQuillEditor);
+
+router.beforeEach((to, from, next) => {
+    const token = store.getters.token;
+    if (token) {
+        next();
+    } else {
+        // 这就是跳出循环的关键(起码执行两遍)
+        if (to.path === '/login') {
+            next();
+        } else {
+            // 没有token跳路由,统统送去login
+            next('/login');
+        }
+    }
+});
+
+// 注册全局过滤器
+Object.keys(filters).forEach(key => Vue.filter(key, filters[key]));
+
+// 注册全局指令
+Object.keys(directives).forEach(key => Vue.directive(key, directives[key]));
+
+new Vue({
+    router,
+    store,
+    render: h => h(App)
+}).$mount('#app');

+ 255 - 0
src/request/action.js

@@ -0,0 +1,255 @@
+import axios from 'axios';
+// import Qs from 'qs'
+import request from './request';
+import router from '../router/router';
+// import { baseUrl } from '../config'
+// import ElementUI from 'element-ui';
+axios.defaults.withCredentials = true;
+export default class Net {
+  static get(url, params) {
+    return new Promise((resolve, reject) => {
+      axios({
+          method: 'get',
+          url,
+          params,
+          headers: {
+            Authorization: localStorage.getItem('token')
+              ? JSON.parse(localStorage.getItem('token'))
+              : 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJYaWFvaGVpIiwiZXhwIjoxNjA3MjQ0NDg0LCJpYXQiOjE2MDQ1NjYwODQsImlzcyI6IkRhVG91TmV0Iiwic3ViIjoiRHRTaG9wIiwidWlkIjo0LCJhZ2VudCI6MX0.zHynm0bQMWLkhlXSYq_pCELWXSuDRZSFN1BbAaFjXBA'
+          }
+          // headers: { Authorization: '' }
+        })
+        .then((res) => {
+          this.successTodo(resolve, reject, res);
+        })
+        .catch((error) => {
+          this.errTodo(error, url);
+        });
+    });
+  }
+
+  static post(url, params, header = {}) {
+    return new Promise((resolve, reject) => {
+      //   console.log(
+      //     localStorage.getItem('token'),
+      //     "localStorage.getItem('token')",
+      //   )
+      const headers =
+        localStorage.getItem('token')
+        ? {
+          Authorization: JSON.parse(localStorage.getItem('token'))
+        }
+        : {
+          Authorization: ''
+        };
+      axios({
+          method: 'post',
+          url,
+          data: JSON.stringify(params),
+          headers: { ...headers, ...header }
+        })
+        .then((res) => {
+          this.successTodo(resolve, reject, res);
+        })
+        .catch((error) => {
+          this.errTodo(error, url);
+        });
+    });
+  }
+
+  static put(url, params) {
+    return new Promise((resolve, reject) => {
+      //   console.log(
+      //     localStorage.getItem('token'),
+      //     "localStorage.getItem('token')",
+      //   )
+      const headers =
+        localStorage.getItem('token')
+        ? {
+          Authorization: JSON.parse(localStorage.getItem('token'))
+        }
+        : {
+          Authorization: ''
+        };
+      axios({
+          method: 'put',
+          url,
+          data: JSON.stringify(params),
+          headers: headers
+        })
+        .then((res) => {
+          this.successTodo(resolve, reject, res);
+        })
+        .catch((error) => {
+          this.errTodo(error, url);
+        });
+    });
+  }
+
+  static delete(url, params) {
+    return new Promise((resolve, reject) => {
+      //   console.log(
+      //     localStorage.getItem('token'),
+      //     "localStorage.getItem('token')",
+      //   )
+      const headers =
+        localStorage.getItem('token')
+        ? {
+          Authorization: JSON.parse(localStorage.getItem('token'))
+        }
+        : {
+          Authorization: ''
+        };
+      axios({
+          method: 'delete',
+          url,
+          data: JSON.stringify(params),
+          headers: headers
+        })
+        .then((res) => {
+          this.successTodo(resolve, reject, res);
+        })
+        .catch((error) => {
+          this.errTodo(error, url);
+        });
+    });
+  }
+
+  static upPic(url, params) {
+    return new Promise((resolve, reject) => {
+      axios({
+          method: 'get',
+          url,
+          params: params,
+          headers: {
+            Authorization: localStorage.getItem('token')
+              ? JSON.parse(localStorage.getItem('token'))
+              : ''
+          }
+          // headers: { Authorization: '' }
+        })
+        .then((res) => {
+          let retcode = parseInt(res.data.status);
+          if (retcode === 2000000) {
+            let data = res.data.res;
+            let param = new FormData(); // 创建form对象
+            param.append('key', data.dir); // 通过append向form对象添加数据
+            param.append('OSSAccessKeyId', data.accessid);
+            param.append('policy', data.policy);
+            param.append('signature', data.signature);
+            param.append('expire', data.expire);
+            param.append('callback', data.callback);
+            param.append('dir', 'admin/');
+            param.append('file', params.file);
+            // console.log(param.get('file')); //FormData私有类对象,访问不到,可以通过get判断值是否传进去
+            let config = {
+              headers: {
+                'Content-Type': 'multipart/form-data'
+              }
+            }; // 添加请求头
+            axios
+              .post(data.host, param, config)
+              .then((res) => {
+                resolve(data.host + '/' + res.data.url);
+              })
+              .catch(function (e) {});
+          } else if (retcode == 5001001) {
+            router.push('/login');
+            localStorage.removeItem('token');
+            reject(res.data.msg);
+          } else if (retcode == 5001002) {
+            router.push('/login');
+            localStorage.removeItem('token');
+            reject(res.data.msg);
+          } else if (retcode == 5012004) {
+            router.push('/login');
+            localStorage.removeItem('token');
+            reject(res.data.msg);
+          } else {
+            reject(alert(res.data.msg));
+          }
+        })
+        .catch(() => {
+          this.errTodo(error, url);
+        });
+    });
+  }
+
+  static upFile(url, params) {
+    let param = new FormData(); // 创建form对象
+    param.append('file', params.file);
+    return new Promise((resolve, reject) => {
+      axios
+        .post(url, param, {
+          headers: {
+            Authorization: localStorage.getItem('token')
+              ? JSON.parse(localStorage.getItem('token'))
+              : '',
+            'Content-Type': 'multipart/form-data'
+          }
+        })
+        .then((res) => {
+          this.successTodo(resolve, reject, res);
+        })
+        .catch((error) => {
+          this.errTodo(error, url);
+        });
+    });
+  }
+
+  // 处理异常方法
+  static successTodo(resolve, reject, val) {
+    let retcode = parseInt(val.data.status);
+    if (retcode === 2000000) {
+      resolve(val.data.res);
+    } else if (retcode === 5001001 || retcode === 2000002 || retcode === 2000001) {
+      router.push('/login');
+      localStorage.removeItem('token');
+      reject(val.data.msg);
+    } else if (retcode == 5012004) {
+      router.push('/login');
+      localStorage.removeItem('token');
+      reject(val.data.msg);
+    } else if (retcode == 5001002) {
+      router.push('/login');
+      localStorage.removeItem('token');
+      reject(val.data.msg);
+    } else if (retcode == 3001106) {
+      reject(val.data.msg);
+    } else if (retcode == 3001100) {
+      reject(val.data.msg);
+    } else if (retcode == 6000000) {
+      // 权限不足抛异常
+      reject(val.data.msg);
+    } else if (retcode >= 3001001 && retcode <= 3002000) {
+      //   window.location.href = '/'
+      reject(val.data.msg);
+    } else if (retcode >= 3002001 && retcode <= 3002999) {
+      window.location.href = '/user';
+      reject(val.data.msg);
+    } else {
+      reject(val.data.msg);
+    }
+  }
+
+  // 处理异常方法
+  static errTodo(error, url) {
+    // 非jsexception接口报错,post后端记录
+    if (url.indexOf('jsexception') === -1) {
+      request.post('/jsexception', error);
+    }
+    let errorCode = error.response.status;
+    let errorCodeFir = (error.response.status + ``).substr(0, 1);
+    let msg = '';
+    if (errorCodeFir === '3') {
+      msg = `${errorCode}:请刷新重试!`;
+      alert(msg);
+    } else if (errorCodeFir === '4') {
+      msg = `${errorCode}:请刷新重试!`;
+      alert(msg);
+    } else if (errorCodeFir === '5') {
+      msg = `${errorCode}:请刷新重试!`;
+      alert(msg);
+    }
+  }
+}

+ 258 - 0
src/request/api.js

@@ -0,0 +1,258 @@
+export default {
+    upload: '/common/upload', // 上传图片
+    typeList: '/common/type/list', // 获取身份类型
+    baseInfo: '/admin/config/get', // 基础配置
+    setConfig: '/admin/config/set', // 基础配置
+    picbase64: '/common/picbase64', // 获取图片base64
+    getArea: '/common/address/area', // 获取省、市、区
+
+    setOption: '/admin/conf/batch/set', // 批量配置参数
+    getOption: '/admin/conf/batch/get', // 批量读取配置参数
+
+    // 登录
+    manageLogin: '/admin/sign/in', // 登录
+    managerLogout: '/admin/sign/out',
+    getCaptchaImg: '/common/captcha', // 获取登录图片验证码
+
+    // 账号管理
+    managerList: '/admin/admin/user/list', // 管理员列表
+    addManager: '/admin/admin/user/add', // 添加管理员
+    editManager: '/admin/admin/user/modify', // 修改管理员信息
+    editPassword: '/admin/admin/user/password', // 修改管理员密码
+    editManagerStatus: '/admin/admin/user/status', // 管理员状态更改
+
+    // 权限管理
+    powerGroupList: '/admin/admin/group/list', // 权限组列表
+    deletePowerGroup: '/admin/admin/group/delete', // 删除权限组
+    powerList: '/admin/admin/acl/list', // 所有权限列表
+    choiceGroupPower: '/admin/admin/group/acls', // 权限组所属权限列表
+    editGroupPower: '/admin/admin/group/acl', // 权限组权限修改
+    powerGroupMember: '/admin/admin/group/users', // 权限组成员列表
+    choiceManagerGroup: '/admin/admin/user/groups', // 管理员所属组列表
+    editManagerGroup: '/admin/admin/user/group', // 管理员所属组修改列表
+
+    // 菜单维护
+    menuList: '/admin/admin/menu/acl', // 菜单列表
+    addMenu: '/admin/admin/menu/add', // 菜单添加
+    editMenu: '/admin/admin/menu/modify', // 菜单编辑
+    deleteMenu: '/admin/admin/menu/delete', // 菜单删除
+    managerMenu: '/admin/admin/menu/acl', // 有权限的菜单列表(根据登录的管理员获取的菜单列表)
+
+    // 用户
+    getUserList: '/admin/user/list', // 用户列表
+    userDetail: '/admin/user/info', // 用户详情
+    getPopularizeList: '/admin/user/generalize/list', // 推广用户列表
+    updateUserStatus: '/admin/user/status/set',
+    getAgentListNew: '/admin/team/list', // 代理商列表
+    openAgentNew: '/admin/team/open', // 开通代理商
+    closeAgentNew: '/admin/team/close', // 关闭代理商
+    agentRecordNew: '/admin/team/log/list', // 代理商开通记录列表
+    // updateHz: '/admin/user/integral/update',
+
+    getAgentList: '/admin/user/role/list', // 代理商管理列表
+    openAgent: '/admin/user/role/open', // 开通代理商
+    agentRecord: '/admin/user/role/log/list', // 代理商开通记录列表
+    closeAgent: '/admin/user/role/close', // 关闭代理商
+
+    getYyzxList: '/admin/user/company/son/list', // 运营中心审核列表
+    yyzxResolve: '/admin/user/company/son/pass', // 运营中心审核通过
+    yyzxReject: '/admin/user/company/son/refuse', // 运营中心审核拒绝
+    yyzxInfo: '/admin/user/company/son/info', // 运营中心详情
+
+    getFgsList: '/admin/user/company/list', // 分公司审核列表
+    fgsResolve: '/admin/user/company/pass', // 分公司审核通过
+    fgsReject: '/admin/user/company/refuse', // 分公司审核拒绝
+    fgsInfo: '/admin/user/company/info', // 分公司详情
+
+    // 商品管理
+    getGoodsList: '/admin/goods/list', // 商品列表
+    getGoodsImportList: '/admin/goods/list/export', // 商品列表
+    goodsDetail: '/admin/goods/info', // 商品详情
+    createGoods: '/admin/goods/add', // 创建商品
+    editGoods: '/admin/goods/edit', // 编辑商品
+    deleteGoods: '/admin/goods/delete', // 编辑商品
+    updateGoodsStatus: '/admin/goods/set/status', // 修改商品状态
+
+    getGoodsCategoryList: '/admin/goods/sort/list', // 获取商品分区列表
+    updateFirstCategory: '/admin/goods/sort/update/first', // 添加商品分区
+    deleteFirstCategory: '/admin/goods/sort/delete/first', // 删除商品分区
+    updateSecondCategory: '/admin/goods/sort/update/second', // 添加二级商品分区
+    deleteSecondCategory: '/admin/goods/sort/delete/second', // 删除二级商品分区
+    changeRecommend: '/admin/goods/sort/update/recommend', // 更新是否推荐
+    updateGoodsTwig: '/admin/goods/set/twig', // 设置商品排
+    changeCategoryOpen: '/admin/goods/sort/update/open', // 更新是否开启
+
+    getPriceInfo: '/admin/range/get/price',
+    setPriceInfo: '/admin/range/set/price',
+    getShowInfo: '/admin/range/get/visibility',
+    setShowInfo: '/admin/range/set/visibility',
+
+    getFreightList: '/admin/freight/list', // 运费模板列表
+    getFreightInfo: '/admin/freight/info', // 运费模板详情
+    addFreight: '/admin/freight/add', // 创建运费模板
+    updateFreight: '/admin/freight/update', // 编辑运费模板
+
+    getNoDeliver: '/admin/deliver/info', // 不发货地区详情
+    setNoDeliver: '/admin/deliver/update', // 编辑不发货地区
+
+    // 店铺装修
+    getBannerList: '/admin/setup/banner/list', // 轮播图列表
+    addBanner: '/admin/setup/banner/add', // 添加轮播图
+    updateBanner: '/admin/setup/banner/update', // 编辑轮播图
+    deleteBanner: '/admin/setup/banner/delete', // 删除轮播图
+
+    getBannerListYlm: '/admin/setup/ylm/banner/list', // 轮播图列表
+    addBannerYlm: '/admin/setup/ylm/banner/add', // 添加轮播图
+    updateBannerYlm: '/admin/setup/ylm/banner/update', // 编辑轮播图
+    deleteBannerYlm: '/admin/setup/ylm/banner/delete', // 删除轮播图
+
+    // 分享设置
+    getShareInfo: '/admin/setup/share/info', // 分享详情
+    updateShare: '/admin/setup/share/update', // 修改分享
+
+    // 图文设置
+    getArticleList: '/admin/setup/teletext/list', // 图文设置列表
+    updateArticle: '/admin/setup/teletext/update', // 图文设置更新
+    articleInfo: '/admin/setup/teletext/info', // 图文设置详情
+
+    // 资金相关===================================
+    getWithdrawList: '/admin/sell/log/list', // 审核列表
+    getWithdrawInfo: '/admin/sell/log/info', // 审核詳情
+    refuteWithdraw: '/admin/sell/log/refute',
+    passWithdraw: '/admin/sell/log/pass',
+    getWithdrawAudit: '/admin/withdraw/audit', // 审核結果
+    getQuotaList: '/admin/fund/quota/log/list', // 配额记录
+    fundQuota: '/admin/fund/recharge/quota', // 配额充值
+    getRebateList: '/admin/fund/rebate/log', // 分润记录
+    getFinancialCounting: '/admin/fund/financial/counting', // 财务对账
+    integralList: '/admin/fund/integral/log/list', // 财务对账
+    batchList: '/admin/global/batch/list', // 全球分红批次列表
+    poolList: '/admin/global/pool/list', // 全球分红奖池列表
+    perList: '/admin/global/per/list', // 全球分红记录
+    confirmRelease: '/admin/global/confirm/release', // 全球分红记录
+
+    getIntegralList: '/admin/fund/integral/list', // 积分变动记录
+    getGoldList: '/admin/fund/gold/list', // 华金变动记录
+    getBalance: '/admin/fund/balance/list', // 余额变动记录
+    getTglist: '/admin/fund/candy/list', // 糖果变动记录
+
+    // 订单
+    orderList: '/admin/order/list', // 订单列表
+    orderDetail: '/admin/order/info', // 订单详情
+    afterList: '/admin/after/sale/list', // 售后列表
+    afterDetail: '/admin/after/sale/info', // 售后详情
+    afterExamine: '/admin/after/sale/examine', // 订单审核
+    importOrder: '/admin/order/delivery', // 订单导入
+
+    getDataSum: '/admin/rebate/data/sum',
+
+    // 商家管理
+    getBusinessTypeList: '/admin/shop/type/list',
+    updateBusinessType: '/admin/shop/type/update',
+    deleteBusinessType: '/admin/shop/type/delete',
+    addBusinessType: '/admin/shop/type/add',
+
+    getBusinessApplyList: '/admin/shop/manage/list', // 商家审核列表
+    businessApplyResolve: '/admin/shop/manage/pass', // 商家审核审核通过
+    businessApplyReject: '/admin/shop/manage/refuse', // 商家审核审核拒绝
+    businessApplyInfo: '/admin/shop/manage/res', // 商家审核详情
+
+    xxRechargeList: '/admin/fund/balance/offline/recharge/list', // 线下充值审核记录
+    xxRechargeAudit: '/admin/fund/balance/offline/recharge/audit', // 线下充值审核
+
+    updatePhone: '/admin/user/phone/update', // 修改用户手机号
+
+    updateBalance: '/admin/fund/balance/update', // 修改余额
+    updateHq: '/admin/fund/gold/update', // 修改绿通
+    updateHz: '/admin/fund/integral/update',
+    updateTg: '/admin/fund/candy/update', // 扣除糖果
+
+    getGroupSum: '/admin/fund/get/group/sum', // 查询团队数据统计
+
+    getDataSum2: '/admin/fund/gold/integral/data/sum', // 资金数据统计
+
+    deleteBusiness: '/admin/goods/merchant/delete',
+    addBusiness: '/admin/goods/merchant/add',
+    updateBusiness: '/admin/goods/merchant/update',
+    getBusinessList: '/admin/goods/merchant/list',
+
+    // 消息管理
+    getMessageList: '/admin/fund/purchase/list',
+    deleteMessage: '/admin/fund/purchase/delete',
+    passMessage: '/admin/fund/purchase/audit/pass',
+    refuseMessage: '/admin/fund/purchase/audit/refuse',
+    getMessageDetail: '/admin/fund/purchase/info',
+
+    getPayList: '/admin/pay/info/list',
+    createPay: '/admin/pay/info/create',
+    uploadPay: '/admin/pay/info/upload',
+
+    bindRemindList: '/admin/order/notify/manager/list',
+    bindRemind: '',
+    unbindRemind: '/admin/order/notify/unbind/manager',
+    getBindCode: '/common/wx/mini/code',
+
+    getUserTree: '/admin/user/tree',
+
+    getUserSettingInfo1: '/admin/setup/control/team/info',
+    getUserSettingInfo2: '/admin/setup/control/people/info',
+    setUserSetting1: '/admin/setup/control/team/update',
+    setUserSetting2: '/admin/setup/control/people/update',
+
+    getKpiList: '/admin/head/turnover/list',
+
+    getFundTypeMap: '/admin/fund/type/map',
+
+    getWxPayList: '/admin/pay/wx/income/info/list',
+
+
+
+
+
+
+    //商家商品
+    getShopGoodsList: '/admin/goods/shop/list',
+    getShopGoodInfo: '/admin/goods/info',
+    rejectShopGood: '/admin/goods/shop/audit/reject',
+    passShopGood: '/admin/goods/shop/audit/pass',
+
+
+
+
+
+
+
+
+
+
+    addUserNew: '/admin/user/add',
+
+
+
+    getShopMerchantInfo: '/admin/shop/merchant/info',
+    rejectShopMerchant: '/admin/shop/merchant/reject',
+    resolveShopMerchant: '/admin/shop/merchant/pass',
+
+
+    setUserRebate: '/admin/user/rebate/set',
+
+    getGoldRecordList: '/admin/fund/info/gold/list',
+    getBalanceRecordList: '/admin/fund/info/balance/list',
+    getIntegraRecordlList: '/admin/fund/info/integral/list',
+
+    getAdvertisingList: '/admin/setup/advertising/list',
+    addAdvertising: '/admin/setup/advertising/add',
+    setAdvertising: '/admin/setup/advertising/set',
+
+    setUserRoleOff: '/admin/user/auto/role/off',
+
+
+    updateShopMerchantMid: '/admin/shop/merchant/change/mid',
+
+    getRewardSumList: '/admin/fund/info/reward/sum',
+    getPayDaySum: '/admin/fund/pay/day/sum',
+
+    setGiveStatus: '/admin/user/set/give/status',
+
+    setRetrenchStatus: '/admin/user/set/retrench/status',
+};

+ 34 - 0
src/request/request.js

@@ -0,0 +1,34 @@
+import action from './action.js';
+import { baseUrl } from '../config';
+
+export default class request {
+    static get(address, params) {
+        let url = baseUrl + address;
+        return action.get(url, params);
+    }
+
+    static post(address, data, header) {
+        let url = baseUrl + address;
+        return action.post(url, data, header);
+    }
+
+    static put(address, data) {
+        let url = baseUrl + address;
+        return action.put(url, data);
+    }
+
+    static delete(address, data) {
+        let url = baseUrl + address;
+        return action.delete(url, data);
+    }
+
+    static upPic(data) {
+        let url = baseUrl + '/common/upload';
+        return action.upPic(url, data);
+    }
+
+    static upFile(address, data) {
+        let url = baseUrl + address;
+        return action.upFile(url, data);
+    }
+}

+ 11 - 0
src/router/modules/Base.js

@@ -0,0 +1,11 @@
+const Index = () => import('@/view/Index');
+const operationLog = () => import('@/view/base/operation-log');
+export default [{
+  path: '/index',
+  name: 'index',
+  component: Index
+}, {
+  path: '/operation-log',
+  name: 'operationLog',
+  component: operationLog
+}];

+ 17 - 0
src/router/modules/Business.js

@@ -0,0 +1,17 @@
+const businessType = () => import('@/view/business/business-type');
+const businessApply = () => import('@/view/business/business-apply');
+const applyDetail = () => import('@/view/business/apply-detail');
+
+export default [{
+  path: '/business-type',
+  name: 'businessType',
+  component: businessType
+}, {
+  path: '/business-apply',
+  name: 'businessApply',
+  component: businessApply
+}, {
+  path: '/apply-detail',
+  name: 'applyDetail',
+  component: applyDetail
+}];

+ 103 - 0
src/router/modules/Fund.js

@@ -0,0 +1,103 @@
+// 资金管理
+const FinancialReconciliation = () => import('@/view/fund/financial-reconciliation.vue'); // 财务对账
+const profitSharingRecord = () => import('@/view/fund/profit-sharing-record.vue'); // 分润记录
+const balanceRecord = () => import('@/view/fund/balance-record.vue'); // 团队奖励
+const hqRecord = () => import('@/view/fund/hq-record.vue'); // 团队奖励
+const hzRecord = () => import('@/view/fund/hz-record.vue'); // 团队奖励
+const balanceExamine = () => import('@/view/fund/balance-examine.vue'); // 团队奖励
+const messagePublish = () => import('@/view/fund/message-publish.vue'); // 团队奖励
+const messageDetail = () => import('@/view/fund/message-detail.vue'); // 团队奖励
+const payRecord = () => import('@/view/fund/pay-record.vue'); // 团队奖励
+const addPay = () => import('@/view/fund/add-pay.vue'); // 团队奖励
+const withdraw = () => import('@/view/fund/withdraw.vue'); // 团队奖励
+const team = () => import('@/view/fund/team.vue'); // 团队奖励
+const wxCharge = () => import('@/view/fund/wx-charge.vue'); // 团队奖励
+const goldList = () => import('@/view/fund/gold-list.vue'); // 团队奖励
+const balanceList = () => import('@/view/fund/balance-list.vue'); // 团队奖励
+const integralList = () => import('@/view/fund/integral-list.vue'); // 团队奖励
+const rewardInquiry = () => import('@/view/fund/reward-inquiry.vue'); // 团队奖励
+// const team = () => import('@/view/fund/team.vue'); // 团队奖励
+export default [{
+    path: '/financial-reconciliation',
+    name: 'FinancialReconciliation',
+    component: FinancialReconciliation
+  },
+  {
+    path: '/profit-sharing-record',
+    name: 'profitSharingRecord',
+    component: profitSharingRecord
+  },
+  {
+    path: '/balance-record',
+    name: 'balanceRecord',
+    component: balanceRecord
+  }, {
+    path: '/hq-record',
+    name: 'hqRecord',
+    component: hqRecord
+  }, {
+    path: '/hz-record',
+    name: 'hzRecord',
+    component: hzRecord
+  },
+  {
+    path: '/balance-examine',
+    name: 'balanceExamine',
+    component: balanceExamine
+  },
+  {
+    path: '/message-publish',
+    name: 'messagePublish',
+    component: messagePublish
+  },
+  {
+    path: '/message-detail',
+    name: 'messageDetail',
+    component: messageDetail
+  },
+  {
+    path: '/pay-record',
+    name: 'payRecord',
+    component: payRecord
+  },
+  {
+    path: '/add-pay',
+    name: 'addPay',
+    component: addPay
+  },
+  {
+    path: '/withdraw',
+    name: 'withdraw',
+    component: withdraw
+  },
+  {
+    path: '/team',
+    name: 'team',
+    component: team
+  },
+  {
+    path: '/wx-charge',
+    name: 'wxCharge',
+    component: wxCharge
+  },
+  {
+    path: '/gold-list',
+    name: 'goldList',
+    component: goldList
+  },
+  {
+    path: '/balance-list',
+    name: 'balanceList',
+    component: balanceList
+  },
+  {
+    path: '/integral-list',
+    name: 'integralList',
+    component: integralList
+  },
+  {
+    path: '/reward-inquiry',
+    name: 'rewardInquiry',
+    component: rewardInquiry
+  }
+];

+ 53 - 0
src/router/modules/Goods.js

@@ -0,0 +1,53 @@
+// 新闻管理
+const goodsManage = () => import('@/view/goods/goods-manage'); // 轮播图
+const good = () => import('@/view/goods/good'); // 轮播图
+const goodsManage2 = () => import('@/view/goods/goods-manage2'); // 轮播图
+const good2 = () => import('@/view/goods/good2'); // 轮播图
+const goodCategory = () => import('@/view/goods/goods-category'); // 轮播图
+// const showSetting = () => import('@/view/goods/show-setting'); // 轮播图
+// const priceSetting = () => import('@/view/goods/price-setting'); // 轮播图
+const freight = () => import('@/view/goods/freight'); // 轮播图
+const business = () => import('@/view/goods/business'); // 轮播图
+
+export default [{
+        path: '/good',
+        name: 'good',
+        component: good
+    },
+    {
+        path: '/goods-manage',
+        name: 'goodsManage',
+        component: goodsManage
+    },{
+        path: '/good2',
+        name: 'good2',
+        component: good2
+    },
+    {
+        path: '/goods-manage2',
+        name: 'goodsManage2',
+        component: goodsManage2
+    }, {
+        path: '/goods-category',
+        name: 'goodsCategory',
+        component: goodCategory
+    },
+    // {
+    //     path: '/show-setting',
+    //     name: 'showSetting',
+    //     component: showSetting
+    // }, {
+    //     path: '/price-setting',
+    //     name: 'priceSetting',
+    //     component: priceSetting
+    // },
+    {
+        path: '/freight',
+        name: 'freight',
+        component: freight
+    }, {
+        path: '/business',
+        name: 'business',
+        component: business
+    }
+];

+ 76 - 0
src/router/modules/Mall.js

@@ -0,0 +1,76 @@
+const shareSetting = () => import('@/view/mall/share-setting');
+const banner = () => import('@/view/mall/banner'); // 轮播图
+const bannerYlm = () => import('@/view/mall/banner-ylm'); // 轮播图
+const article = () => import('@/view/mall/article'); //
+const powerManage = () => import('@/view/mall/power-Manage');
+// const menuMaintain = () => import('@/view/mall/menu-Maintain');
+const powerEdit = () => import('@/view/mall/power-Edit');
+const powerMemberList = () => import('@/view/mall/powerMember-List');
+const accountManage = () => import('@/view/mall/account-manage');
+const menuManage = () => import('@/view/mall/menu-manage');
+const currencySetting = () => import('@/view/mall/currency-setting');
+const userSetting = () => import('@/view/mall/user-setting');
+const noDeliver = () => import('@/view/mall/no-deliver');
+const popupAds = () => import('@/view/mall/popup-ads');
+
+export default [{
+        path: '/share-setting',
+        name: 'shareSetting',
+        component: shareSetting
+    }, {
+        path: '/banner',
+        name: 'banner',
+        component: banner
+    },{
+        path: '/banner-ylm',
+        name: 'bannerYlm',
+        component: bannerYlm
+    }, {
+        path: '/article',
+        name: 'article',
+        component: article
+    },
+    {
+        path: '/powerMemberList',
+        name: 'powerMemberList',
+        component: powerMemberList
+    },
+    {
+        path: '/powerEdit',
+        name: 'powerEdit',
+        component: powerEdit
+    },
+    {
+        path: '/power-manage',
+        name: 'power-manage',
+        component: powerManage
+    },
+    {
+        path: '/account-manage',
+        name: 'account-manage',
+        component: accountManage
+    },
+    {
+        path: '/menu-manage',
+        name: 'menu-manage',
+        component: menuManage
+    },
+    {
+        path: '/currency-setting',
+        name: 'currencySetting',
+        component: currencySetting
+    },
+    {
+        path: '/no-deliver',
+        name: 'noDeliver',
+        component: noDeliver
+    }, {
+        path: '/user-setting',
+        name: 'userSetting',
+        component: userSetting
+    }, {
+        path: '/popup-ads',
+        name: 'popupAds',
+        component: popupAds
+    }
+];

+ 31 - 0
src/router/modules/Order.js

@@ -0,0 +1,31 @@
+const orderManager = () => import('@/view/order/order-manager');
+const orderDetail = () => import('@/view/order/order-detail');
+const orderManager2 = () => import('@/view/order/order-manager2');
+const orderDetail2 = () => import('@/view/order/order-detail2');
+const bind = () => import('@/view/order/bind');
+
+export default [{
+    path: '/order-manager',
+    name: 'orderManager',
+    component: orderManager
+  },
+  {
+    path: '/order-detail',
+    name: 'orderDetail',
+    component: orderDetail
+  },{
+    path: '/order-manager2',
+    name: 'orderManager2',
+    component: orderManager2
+  },
+  {
+    path: '/order-detail2',
+    name: 'orderDetail2',
+    component: orderDetail2
+  },
+  {
+    path: '/bind',
+    name: 'bind',
+    component: bind
+  }
+];

+ 67 - 0
src/router/modules/UserManage.js

@@ -0,0 +1,67 @@
+// 新闻管理
+const userManage = () => import('@/view/user-manage/user-manage'); //
+const userDetail = () => import('@/view/user-manage/user-detail'); //
+const authorization = () => import('@/view/user-manage/authorization'); //
+const popularize = () => import('@/view/user-manage/popularize'); //
+const record = () => import('@/view/user-manage/record'); //
+const examine = () => import('@/view/user-manage/examine'); //
+const examine2 = () => import('@/view/user-manage/examine2'); //
+const examineDetail = () => import('@/view/user-manage/examine-detail'); //
+const examineDetail2 = () => import('@/view/user-manage/examine-detail2'); //
+const agentManage = () => import('@/view/user-manage/agent-manage'); //
+const agentRecord = () => import('@/view/user-manage/agent-record'); //
+const addUser = () => import('@/view/user-manage/add-user'); //
+
+export default [{
+        path: '/user-manage',
+        name: 'userManage',
+        component: userManage
+    },
+    {
+        path: '/user-detail',
+        name: 'userDetail',
+        component: userDetail
+    }, {
+        path: '/authorization',
+        name: 'authorization',
+        component: authorization
+    },
+    {
+        path: '/popularize',
+        name: 'popularize',
+        component: popularize
+    }, {
+        path: '/record',
+        name: 'record',
+        component: record
+    }, {
+        path: '/examine',
+        name: 'examine',
+        component: examine
+    }, {
+        path: '/examine2',
+        name: 'examine2',
+        component: examine2
+    }, {
+        path: '/examine-detail',
+        name: 'examineDetail',
+        component: examineDetail
+    }, {
+        path: '/examine-detail2',
+        name: 'examineDetail2',
+        component: examineDetail2
+    },
+    {
+        path: '/agent-manage',
+        name: 'agentManage',
+        component: agentManage
+    }, {
+        path: '/agent-record',
+        name: 'agentRecord',
+        component: agentRecord
+    }, {
+        path: '/add-user',
+        name: 'addUser',
+        component: addUser
+    }
+];

+ 34 - 0
src/router/router.js

@@ -0,0 +1,34 @@
+import Vue from 'vue';
+import Router from 'vue-router';
+import Main from 'view/Main';
+import Login from 'view/Login';
+// 合并所有router
+let routers = [];
+const requireComponent = require.context('./modules', false, /\.js$/); // modules下任意js文件
+requireComponent.keys().forEach(fileName => {
+    const item = requireComponent(fileName);
+    routers = routers.concat(item.default); // modules中文件的写法是export default
+});
+Vue.use(Router);
+const router = new Router({
+    mode: 'history',
+    routes: [{
+            path: '/',
+            name: 'main',
+            component: Main,
+            redirect: '/index',
+            linkActiveClass: 'active',
+            children: routers
+        },
+        {
+            path: '/login',
+            name: 'login',
+            component: Login
+        },
+        {
+            path: '*',
+            component: Error
+        }
+    ]
+});
+export default router;

+ 41 - 0
src/store/modules/common.js

@@ -0,0 +1,41 @@
+const state = {
+  baseInfo: localStorage.getItem('baseInfo')
+    ? JSON.parse(localStorage.getItem('baseInfo'))
+    : {}, // 当前系统baseInfo信息
+  attrTable: localStorage.getItem('attrTable')
+    ? JSON.parse(localStorage.getItem('attrTable'))
+    : [], // 商品详情生成的attr明细表
+  tableHead: localStorage.getItem('tableHead')
+    ? JSON.parse(localStorage.getItem('tableHead'))
+    : {} // 表头
+};
+const getters = {
+  baseInfo: state => state.baseInfo,
+  attrTable: state => state.attrTable,
+  tableHead: state => state.tableHead
+};
+const mutations = {
+  setTableHead(state, data) {
+    localStorage.setItem('tableHead', JSON.stringify(data));
+    state.tableHead = JSON.parse(localStorage.getItem('tableHead'));
+  },
+  setAttrTable(state, data) {
+    localStorage.setItem('attrTable', JSON.stringify(data));
+    state.attrTable = JSON.parse(localStorage.getItem('attrTable'));
+  },
+  setBaseInfo(state, data) {
+    localStorage.setItem('baseInfo', JSON.stringify(data));
+    state.baseInfo = JSON.parse(localStorage.getItem('baseInfo'));
+  },
+  clearBaseInfo() {
+    localStorage.removeItem('baseInfo');
+  }
+};
+const actions = {};
+
+export default {
+  state,
+  getters,
+  actions,
+  mutations
+};

+ 66 - 0
src/store/modules/login.js

@@ -0,0 +1,66 @@
+import { Store } from "vuex";
+
+const state = {
+  token: localStorage.getItem('token') ? JSON.parse(localStorage.getItem('token')) : '', // 当前登录的token
+  userInfo: localStorage.getItem('userInfo') ? JSON.parse(localStorage.getItem('userInfo')) : '',
+  menuIndex: localStorage.getItem('menuIndex') ? JSON.parse(localStorage.getItem('menuIndex')) : '',
+  keepAliveList: [],
+  idArr:[],
+  sidArr:[],
+  steady_idArr:[],
+};
+const getters = {
+  token: state => state.token,
+  userInfo: state => state.userInfo,
+  menuIndex: state => state.menuIndex,
+  idArr: state => state.idArr,
+  sidArr: state => state.sidArr,
+  steady_idArr: state => state.steady_idArr,
+  keepAliveList: state => state.keepAliveList
+};
+const mutations = {
+  setIdArr(state, data) {
+    state.idArr = data;
+  },
+  setSidArr(state, data) {
+    state.sidArr = data;
+  },
+  setSteady_idArr(state, data) {
+    state.steady_idArr = data;
+  },
+  setToken(state, data) {
+    localStorage.setItem('token', JSON.stringify(data));
+    state.token = JSON.parse(localStorage.getItem('token'));
+  },
+  clearToken() {
+    localStorage.removeItem('token');
+  },
+  setUser(state, data) {
+    localStorage.setItem('userInfo', JSON.stringify(data));
+    state.userInfo = JSON.parse(localStorage.getItem('userInfo'));
+  },
+  setMenu(state, data) {
+    localStorage.setItem('menuIndex', JSON.stringify(data));
+    state.menuIndex = JSON.parse(localStorage.getItem('menuIndex'));
+  },
+  pushKeepAliveList(state, item) {
+    let set = new Set(state.keepAliveList);
+    set.add(item);
+    state.keepAliveList = Array.from(set);
+  },
+  popKeepAliveList(state, item) {
+    let set = new Set(state.keepAliveList);
+    if (set.has(item)) {
+      set.delete(item);
+    }
+    state.keepAliveList = Array.from(set);
+  }
+};
+const actions = {};
+
+export default {
+  state,
+  getters,
+  actions,
+  mutations
+};

+ 19 - 0
src/store/store.js

@@ -0,0 +1,19 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+
+// 合并所有store
+const stores = {};
+const requireComponent = require.context('./modules', false, /\.js$/); // modules下任意js文件
+requireComponent.keys().forEach(fileName => {
+    const item = requireComponent(fileName);
+    const moduleName = fileName
+        .toLowerCase()
+        .substring(0, fileName.length - 3)
+        .replace(/[./]/g, '');
+    stores[moduleName] = item.default; // modules中文件的写法是export default
+});
+
+Vue.use(Vuex);
+export default new Vuex.Store({
+    modules: stores
+});

+ 16 - 0
src/view/Error.vue

@@ -0,0 +1,16 @@
+<template>
+    <div>你好像走丢了</div>
+</template>
+
+<script type="text/ecmascript-6">
+    export default {
+        name: '',
+        data() {
+            return {};
+        }
+    };
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+    @import '~assets/main.styl';
+</style>

+ 390 - 0
src/view/Index.vue

@@ -0,0 +1,390 @@
+<template>
+  <div class="main-container" v-loading="isLoading">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <div class="top">
+          <div class="amount">
+            <div class="item item1">
+              <img :src="staticImg + 'index-01.png'" alt="" />
+              <div class="num">
+                <span>{{
+                  sumData.yesterdayEarnings
+                    ? sumData.yesterdayEarnings.toFixed(2)
+                    : "0.00"
+                }}</span>
+                昨日收入
+              </div>
+            </div>
+            <div class="item">
+              <img :src="staticImg + 'index-02.png'" alt="" />
+              <div class="num">
+                <span>{{ sumData.yesterdayOrdersNum }}</span>
+                昨日新增订单
+              </div>
+            </div>
+            <div class="item">
+              <img :src="staticImg + 'index-03.png'" alt="" />
+              <div class="num">
+                <span>{{ sumData.waitDeliveryOrdersNum }}</span>
+                待发货订单数
+              </div>
+            </div>
+          </div>
+          <div class="amount amount2">
+            <div class="amount-left">
+              <div class="item">
+                <img :src="staticImg + 'index-01.png'" alt="" />
+                <div class="num">
+                  <span>{{ sumData2.totalIntegral }}</span>
+                  全网积分总量池
+                </div>
+              </div>
+              <div class="item">
+                <img :src="staticImg + 'index-02.png'" alt="" />
+                <div class="num">
+                  <span>{{ sumData2.releasedIntegral }}</span>
+                  全网已释放积分数
+                </div>
+              </div>
+              <div class="item">
+                <img :src="staticImg + 'index-03.png'" alt="" />
+                <div class="num">
+                  <span>{{ sumData2.freezeIntegral }}</span>
+                  全网冻结中积分数
+                </div>
+              </div>
+            </div>
+            <!-- <div class="amount-right">
+              <div class="item">
+                <img :src="staticImg + 'index-01.png'" alt="" />
+                <div class="num">
+                  <span>{{ sumData2.totalGold }}</span>
+                  绿通总量池
+                </div>
+              </div>
+              <div class="item">
+                <img :src="staticImg + 'index-02.png'" alt="" />
+                <div class="num">
+                  <span>{{ sumData2.releasedGold }}</span>
+                  绿通释放池
+                </div>
+              </div>
+              <div class="item">
+                <img :src="staticImg + 'index-03.png'" alt="" />
+                <div class="num">
+                  <span>{{ sumData2.remainGold }}</span>
+                  绿通剩余释放池
+                </div>
+              </div>
+            </div> -->
+          </div>
+        </div>
+        <div class="bottom">
+          <div class="echart" id="echart"></div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../components/common/header';
+import { staticImg } from '@/config'; // oss 图片地址
+export default {
+  components: {
+    Header
+  },
+  name: 'Index',
+  data() {
+    return {
+      isLoading: 0,
+      title: {
+        // 页面标题
+        firstTitile: '工作台'
+      },
+      staticImg: staticImg,
+      sumData: {},
+      sumData2: {},
+      option: {
+        // echarts配置
+        title: {
+          text: '近30日每日平台订单收入',
+          textStyle: {
+            fontSize: 18,
+            fontWeight: '600'
+          }
+        },
+        tooltip: {
+          trigger: 'item',
+          backgroundColor: '#FF8703',
+          fontSize: 14,
+          // formatter: (params) => {
+          //   console.log(params.data);
+          //   return `{b0}<span style="padding: 6px 8px;display: flex;align-items:center">当日订单收入 <span style="font-size: 22px;margin-left: 3px">${params.data}</span></span>`;
+          // }
+          formatter: `<span style="padding: 6px 8px;display: flex;align-items:center">{b0}<br/>当日订单收入 {c0}<span style="font-size: 22px;margin-left: 3px"></span></span>`
+        },
+        grid: {
+          left: 80,
+          right: 35,
+          bottom: 30
+        },
+        xAxis: {
+          type: 'category',
+          data: [],
+          // boundaryGap: false, // 坐标轴两边留白
+          axisLine: {
+            lineStyle: {
+              color: '#916096',
+              width: 3
+            }
+          },
+          axisTick: {
+            show: false
+          },
+          splitLine: {
+            show: true,
+            lineStyle: {
+              color: 'rgba(0, 0, 0, 0.06)'
+            },
+            interval: (index, value) => {
+              return index !== 0;
+            }
+          },
+          axisLabel: {
+            // 坐标轴刻度标签的相关设置
+            fontSize: 15,
+            color: '#333333',
+            margin: 15 // 刻度标签与轴线之间的距离
+          }
+        },
+        yAxis: {
+          type: 'value',
+          axisLine: {
+            show: false
+          },
+          axisTick: {
+            show: false
+          },
+          splitLine: {
+            show: true,
+            lineStyle: {
+              color: 'rgba(0, 0, 0, 0.06)'
+            }
+          },
+          axisLabel: {
+            color: '#B494C5',
+            fontWeight: 600,
+            fontSize: 14,
+            // 坐标轴刻度标签的相关设置
+            margin: 15 // 刻度标签与轴线之间的距离
+          }
+        },
+        series: [
+          {
+            data: [],
+            type: 'line',
+            symbolSize: 10,
+            itemStyle: {
+              normal: {
+                color: '#704C99',
+                lineStyle: {
+                  color: '#B494C5'
+                }
+              }
+            }
+          }
+        ]
+      }
+    };
+  },
+  mounted() {
+    this.getDataSum();
+    this.getDataSum2();
+    this.getPayDaySum().then(() => {
+      this.$nextTick(() => {
+        this.initEcharts();
+      });
+    });
+
+  },
+  methods: {
+    initEcharts() {
+      this.myChart = this.$echarts.init(document.getElementById('echart'));
+      this.myChart.setOption(this.option);
+    },
+    getDataSum() {
+      this.loading++;
+      this.httpGet(this.$root.getDataSum, {}).then(
+        (res) => {
+          this.loading--;
+          this.sumData = res;
+        },
+        () => {
+          this.loading--;
+        }
+      );
+    },
+    getDataSum2() {
+      this.loading++;
+      this.httpGet(this.$root.getDataSum2, {}).then(
+        (res) => {
+          this.loading--;
+          this.sumData2 = res;
+        },
+        () => {
+          this.loading--;
+        }
+      );
+    },
+    getPayDaySum() {
+      this.loading++;
+      return this.httpGet(this.$root.getPayDaySum, {
+        page: 1,
+        size: 30
+      }).then(
+        (res) => {
+          this.loading--;
+          this.option.xAxis.data = res.list.map((item) => {
+            return item.day;
+          })
+          this.option.series[0].data = res.list.map((item) => {
+            return item.amount;
+          })
+        },
+        () => {
+          this.loading--;
+        }
+      );
+    }
+  }
+};
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+@import '~assets/public.styl';
+
+.container {
+  padding: 0 !important;
+}
+
+.content {
+  background: #F6F6F6 !important;
+  padding: 24px !important;
+  flex-y();
+}
+
+.top {
+  width: 100%;
+  height: 260px;
+  flex-x(flex-start);
+
+  .amount {
+    width: 530px;
+    height: 100%;
+    background: #fff;
+    border-radius: 10px;
+    flex-x();
+    flex-wrap: wrap;
+    box-sizing: border-box;
+    padding: 36px;
+
+    .item {
+      width: 50%;
+      flex-x(flex-start);
+
+      img {
+        width: 36px;
+        height: auto;
+      }
+
+      .num {
+        flex-y(center, flex-start);
+        word(14px, #999);
+        margin-left: 15px;
+
+        span {
+          word(28px, #333);
+          font-weight: bold;
+          margin-bottom: 8px;
+        }
+      }
+    }
+
+    .item1 {
+      width: 100%;
+
+      .num {
+        span {
+          font-size: 36px;
+        }
+      }
+    }
+  }
+
+  .amount2 {
+    margin-left: 16px;
+    padding: 0;
+    background: transparent;
+    flex: 1;
+    flex-x();
+    .amount-left, .amount-right{
+      flex: 1;
+      height: 100%;
+      background: #fff;
+      border-radius: 10px;
+      flex-y(center, flex-start);
+      .item{
+        padding: 0 50px;
+        flex: 1;
+      }
+    }
+    .amount-left{
+      margin-right: 15px;
+    }
+  }
+}
+
+// }
+.right {
+  width: 600px;
+  background: #fff;
+  height: 100%;
+  border-radius: 10px;
+  box-sizing: border-box;
+  padding: 20px 30px;
+  word(18px, #333);
+  overflow: hidden;
+  font-weight: 550;
+  flex-shrink: 1;
+
+  .user-info {
+    word(14px, #333);
+    flex-x(flex-start);
+
+    img {
+      height: 28px;
+      height: 28px;
+      margin-right: 12px;
+      border-radius: 14px;
+    }
+  }
+}
+
+.bottom {
+  flex: 1;
+  width: 100%;
+  margin-top: 20px;
+  background: #fff;
+  border-radius: 10px;
+  padding: 30px;
+  box-sizing: border-box;
+
+  .echart {
+    width: 100%;
+    height: 100%;
+  }
+}
+</style>

+ 421 - 0
src/view/Login.vue

@@ -0,0 +1,421 @@
+<template>
+    <div class="login-container" v-loading="isLoading">
+        <div class="login" v-if="layoutLogin">
+            <h1>后台管理系统 | 登录</h1>
+            <ul>
+                <li>
+                    <p>账号:</p>
+                    <input
+                        v-model="loginData.username"
+                        placeholder="请输入账号"
+                    />
+                </li>
+                <li>
+                    <p>密码:</p>
+                    <input
+                        v-model="loginData.password"
+                        type="password"
+                        placeholder="请输入密码"
+                    />
+                </li>
+                <!-- <li>
+                    <p>验证码:</p>
+                    <input
+                        v-model="loginData.code"
+                        type="text"
+                        placeholder="请输入图片中的内容"
+                        class="captcha_input"
+                        @keyup.enter="goLogin()"
+                    />
+                    <img
+                        class="captcha_img"
+                        :src="this.captchaImg"
+                        alt=""
+                        @click="getCaptchaImg"
+                    />
+                    <i class="el-icon-refresh-right" @click="getCaptchaImg"></i>
+                </li> -->
+            </ul>
+
+            <button class="login-btn" @click="goLogin">登录</button>
+            <!-- <div style="color: #3c90fe;font-size: 14px;margin-top: 10px" @click="goChangePsw">修改密码</div> -->
+        </div>
+        <div class="login main" v-else>
+            <h1>后台管理系统 | 修改密码</h1>
+            <ul>
+                <li>
+                    <p>账号</p>
+                    <input
+                        v-model="pswData.userName"
+                        placeholder="请输入账号"
+                    />
+                </li>
+                <li>
+                    <p>验证码</p>
+                    <input
+                        v-model="pswData.smsCode"
+                        placeholder="请输入验证码"
+                    />
+                    <el-button
+                        size="small"
+                        type="primary"
+                        style="width: 100px"
+                        :loading="pswData.btnLoading"
+                        v-text="pswData.hintTxt"
+                        @click="getUserPhone"
+                    ></el-button>
+                </li>
+                <li>
+                    <p>密码</p>
+                    <input
+                        v-model="pswData.psw"
+                        placeholder="请设置密码"
+                        type="password"
+                    />
+                </li>
+            </ul>
+            <button class="login-btn" @click="changePsw">提交</button>
+            <div
+                style="color: #3c90fe; font-size: 14px; margin-top: 10px"
+                @click="goToLogin"
+            >
+                登录
+            </div>
+        </div>
+    </div>
+</template>
+
+<script type="text/ecmascript-6">
+import { mapGetters, mapMutations } from 'vuex';
+export default {
+    name: 'login',
+    data() {
+        return {
+            captchaImg: '', // 图片验证码地址
+            captchaId: '', // 图片验证码id
+            inputSize: 'small',
+            isLoading: false,
+            btnTxt: '获取',
+            layoutLogin: true,
+            loginData: {
+                username: '',
+                password: '' // 密码
+                // code: "", //图片验证码
+            },
+            pswData: {
+                intervalId: '',
+                userName: '',
+                smsCode: '',
+                hintTxt: '获取验证码',
+                btnLoading: false,
+                phone: '',
+                psw: ''
+            }
+        };
+    },
+    created() {
+        // this.getCaptchaImg();
+        console.log('token', this.token);
+        // if (this.token) {
+        //     this.setMenu('1');
+        //     this.$router.push({
+        //         name: 'welcome'
+        //     });
+        // }
+    },
+    computed: {
+        ...mapGetters(['token', 'userInfo'])
+    },
+    methods: {
+        ...mapMutations(['setToken', 'setUser', 'setMenu', 'setBaseInfo']),
+
+        // 登录
+        goLogin() {
+            if (this.loginData.username === '') {
+                this.$message.error('请输入用户名');
+                return false;
+            }
+            if (this.loginData.password === '') {
+                this.$message.error('请输入密码');
+                return false;
+            }
+            if (this.loginData.code === '') {
+                this.$message.error('请输入图片验证码');
+                return false;
+            } else {
+                let data = {
+                    ...this.loginData
+                    // captcha_id: this.captchaId
+                };
+                this.httpPost(this.$root.manageLogin, data).then(
+                    (res) => {
+                        // token存本地
+                        console.log('2222222', res);
+                        this.setToken(res.token);
+                        this.setUser(res.info);
+                        this.setMenu('1');
+                        this.getInfo();
+                    },
+                    (err) => {
+                        // this.getCaptchaImg();
+                        this.$message.error(err);
+                        // if (err == '验证码错误' || err == '参数有误' ) {
+                        //     this.$message.error('登录失败,验证码错误!')
+                        // } else {
+                        //     this.$message.error('登录失败,您输入的账号密码不正确!')
+                        // }
+                    }
+                );
+            }
+        },
+        // 获取图片验证码
+        getCaptchaImg() {
+            this.httpGet(this.$root.getCaptchaImg).then((res) => {
+                this.captchaImg = res.data;
+                this.captchaId = res.id;
+            });
+        },
+        getInfo() {
+            // 获取商城基础信息
+            this.$router.push({
+                name: 'index'
+            });
+            // this.httpPost(this.$root.baseInfo).then(res => {
+            //     // 存本地
+            //     this.setBaseInfo(res.base_info);
+            //     this.$router.push({
+            //         name: 'welcome'
+            //     });
+            // }, () => {
+            // });
+        },
+        // 修改密码
+        // goChangePsw() {
+        //     this.layoutLogin = false;
+        // },
+        // 获取手机号
+        getUserPhone() {
+            // 登录
+            this.pswData.btnLoading = true;
+            this.httpPost(this.$root.getUserPhone, {
+                uname: this.pswData.userName
+            }).then(
+                (res) => {
+                    this.pswData.btnLoading = false;
+                    this.pswData.phone = res.phone;
+                    if (res.phone === null) {
+                        this.$message.error('手机号不存在');
+                    } else {
+                        this.getSmsCode();
+                    }
+                },
+                () => {
+                    this.pswData.btnLoading = false;
+                }
+            );
+        },
+        // 获取手机验证码
+        getSmsCode() {
+            this.pswData.btnLoading = true;
+            this.httpPost(this.$root.getSmsCode, {
+                phone: this.pswData.phone,
+                type: 12
+            }).then(
+                (res) => {
+                    this.pswData.btnLoading = false;
+                    this.countDown(60);
+                },
+                () => {
+                    this.pswData.btnLoading = false;
+                }
+            );
+        },
+        // 修改密码
+        changePsw() {
+            if (!this.verifyData()) {
+                return;
+            }
+
+            this.isLoading = true;
+            this.httpPost(this.$root.changePsw, {
+                phone: this.pswData.phone,
+                type: 12,
+                code: this.pswData.smsCode,
+                uname: this.pswData.userName,
+                password: this.pswData.psw
+            }).then(
+                (res) => {
+                    this.isLoading = false;
+                    this.$message({
+                        message: '设置成功',
+                        type: 'success'
+                    });
+                    this.goToLogin();
+                },
+                () => {
+                    this.isLoading = false;
+                }
+            );
+        },
+        // 短信验证码倒计时
+        countDown(sec) {
+            console.log('start');
+            let secNum = sec;
+            this.pswData.intervalId = setInterval(() => {
+                secNum--;
+                if (secNum <= 0) {
+                    clearInterval(this.pswData.intervalId);
+                    this.pswData.btnLoading = false;
+                    this.pswData.hintTxt = '获取验证码';
+                    console.log('finish');
+                } else {
+                    this.pswData.btnLoading = true;
+                    this.pswData.hintTxt = secNum + 's';
+                    console.log('' + secNum);
+                }
+            }, 1000);
+        },
+        goToLogin() {
+            this.layoutLogin = true;
+        },
+        // 修改密码校验表单输入
+        verifyData() {
+            if (this.pswData.userName === '') {
+                this.$message.error('请输入用户名');
+                return false;
+            }
+            if (this.pswData.smsCode === '') {
+                this.$message.error('请输入验证码');
+                return false;
+            }
+            if (this.pswData.psw === '') {
+                this.$message.error('请输入密码');
+                return false;
+            }
+            return true;
+        }
+    }
+};
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+::-webkit-input-placeholder {
+    color: gray9;
+}
+
+.el-icon-refresh-right {
+    font-size: 20px;
+
+    &:hover {
+        cursor: pointer;
+    }
+}
+
+.captcha_input {
+    width: 175px;
+    font-size: word16;
+    line-height: 40px;
+    height: 40px;
+    outline: none;
+}
+
+.captcha_img {
+    width: 102px;
+    height: 41px;
+}
+
+.login-container {
+    flex-y(flex-start);
+    width: 100%;
+    height: 100%;
+    background: white;
+}
+
+.login {
+    width: 400px;
+    margin-top: 200px;
+    flex-y();
+
+    .el-checkbox__label {
+        font-size: 14px;
+    }
+
+    ul {
+        width: 100%;
+    }
+
+    h1 {
+        font-size: 24px;
+        margin-bottom: 20px;
+    }
+
+    li {
+        height: 40px;
+        line-height: 40px;
+        margin-top: 30px;
+        bor-bottom();
+        flex-x(flex-start);
+
+        p {
+            width: 100px;
+            font-size: word18;
+        }
+
+        span {
+            margin-right: 10px;
+        }
+
+        input {
+            font-size: word16;
+            line-height: 40px;
+            height: 40px;
+            outline: none;
+        }
+    }
+
+    .forget {
+        width: 100%;
+        height: 50px;
+        line-height: 50px;
+        flex-x();
+
+        .el-checkbox__inner {
+            width: 16px;
+            height: 16px;
+            border(gray3);
+        }
+    }
+
+    .login-btn {
+        login-btn();
+        font-size: word18;
+        width: 350px;
+        margin-top: 30px;
+    }
+
+    .bot-btn {
+        margin-top: 10px;
+        color: gray3;
+        font-size: 16px;
+
+        a {
+            color: blue;
+        }
+    }
+}
+
+.el-button--primary {
+    width: 100%;
+    margin: 20px 0;
+}
+
+#app .el-input__inner {
+    border: none;
+}
+
+.el-input {
+    border: none;
+}
+</style>

+ 450 - 0
src/view/Main.vue

@@ -0,0 +1,450 @@
+<template>
+  <div id="app-wrap">
+    <el-container>
+      <el-aside width="200px" class="aside" style="background: #333">
+        <div class="top">
+          <span class="logo">悦之链</span>
+        </div>
+        <el-menu
+          class="el-menu-vertical-demo"
+          background-color="#333"
+          text-color="#fff"
+          active-text-color="#E33C64"
+          :unique-opened="unique"
+          :default-active="current"
+        >
+          <!-- <div v-for="(menu, index) in menuList1" :key="index">
+            <el-submenu
+              :index="index + ''"
+              v-if="menu.list && menu.list.length"
+            >
+              <div
+                slot="title"
+                :class="{
+                  'active-nav': current && current.split('-')[0] == index,
+                  'menu-title': true,
+                }"
+              >
+                <i class="el-icon-star-on"></i>
+                <span>{{ menu.name }}</span>
+              </div>
+              <el-menu-item-group>
+                <el-menu-item
+                  v-for="(item, a) in menu.list"
+                  :key="a"
+                  :index="index + '-' + a"
+                  class="menu-title"
+                  @click="goPage(item.router, index + '-' + a)"
+                  >{{ item.name }}
+                </el-menu-item>
+              </el-menu-item-group>
+            </el-submenu>
+            <el-menu-item
+              :index="index + ''"
+              v-if="!menu.list || !menu.list.length"
+              @click="goPage(menu.router, index + '-' + 0)"
+            >
+              <div
+                slot="title"
+                :class="{
+                  'active-nav': current && current.split('-')[0] == index,
+                  'menu-title': true,
+                }"
+              >
+                <i class="el-icon-star-on"></i>
+                <span>{{ menu.name }}</span>
+              </div>
+            </el-menu-item>
+          </div> -->
+          <div v-for="(menu, index) in menuList" :key="index">
+            <el-submenu
+              :index="index + ''"
+              v-if="menu.list && menu.list.length > 1"
+            >
+              <div
+                slot="title"
+                :class="{
+                  'active-nav': current && current.split('-')[0] == index,
+                  'menu-title': true,
+                }"
+              >
+                <i class="el-icon-star-on"></i>
+                <span>{{ menu.name }}</span>
+              </div>
+              <el-menu-item-group>
+                <el-menu-item
+                  v-for="(item, a) in menu.list"
+                  :key="a"
+                  :index="index + '-' + a"
+                  class="menu-title"
+                  @click="goPage(item.router, index + '-' + a)"
+                  >{{ item.name }}
+                </el-menu-item>
+              </el-menu-item-group>
+            </el-submenu>
+            <el-menu-item
+              :index="index + ''"
+              v-if="menu.list && menu.list.length <= 1"
+              @click="goPage(menu.list[0].router, index + '-' + 0)"
+            >
+              <div
+                slot="title"
+                :class="{
+                  'active-nav': current && current.split('-')[0] == index,
+                  'menu-title': true,
+                }"
+              >
+                <i class="el-icon-star-on"></i>
+                <span>{{ menu.name }}</span>
+              </div>
+            </el-menu-item>
+          </div>
+        </el-menu>
+      </el-aside>
+      <el-main>
+        <div class="detail">
+          <keep-alive :include="getKeepAliveList">
+            <router-view />
+          </keep-alive>
+        </div>
+      </el-main>
+    </el-container>
+    <!-- </el-container> -->
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import { mapGetters, mapMutations } from 'vuex';
+import { themeColor } from '../config';
+export default {
+  name: '',
+  data() {
+    return {
+      logo: '',
+      // defaultImg: this.$Public.defaultImg,
+      defaultImg: null,
+      unique: true,
+      menuList: [], // 菜单列表
+      themeColor: themeColor,
+      menuList1: [
+        // 开发菜单列表
+        // {
+        //   mid: '3',
+        //   name: '活动管理',
+        //   list: [
+        //     {
+        //       index: '3-1',
+        //       name: '活动管理',
+        //       nav: 'activity-manage',
+        //       router: '/activity-manage'
+        //     },
+        //     {
+        //       index: '3-2',
+        //       name: '活动分类',
+        //       nav: 'activity-category',
+        //       router: '/activity-category'
+        //     }
+        //   ]
+        // },
+        {
+          mid: '1',
+          name: '首页',
+          list: [
+            {
+              index: '1-1',
+              name: '首页',
+              nav: 'index',
+              router: '/index'
+            }
+          ]
+        },
+        {
+          mid: '2',
+          name: '商城设置',
+          list: [
+            {
+              index: '2-1',
+              name: '基础设置',
+              nav: 'shareSetting',
+              router: '/share-setting'
+            },
+            {
+              index: '2-2',
+              name: '轮播图设置',
+              nav: 'banner',
+              router: '/banner'
+            },
+            {
+              index: '2-3',
+              name: '首页图文设置',
+              nav: 'article',
+              router: '/article'
+            },
+            {
+              index: '2-4',
+              name: '权限管理',
+              nav: 'powerManage',
+              router: '/power-manage'
+            },
+            {
+              index: '2-5',
+              name: '账号管理',
+              nav: 'accountManage',
+              router: '/account-manage'
+            },
+            {
+              index: '2-6',
+              name: '菜单管理',
+              nav: 'menuManage',
+              router: '/menu-manage'
+            }
+          ]
+        },
+        {
+          mid: '3',
+          name: '商品管理',
+          list: [
+            {
+              index: '3-1',
+              name: '商品列表',
+              nav: 'goodsManage',
+              router: '/goods-manage'
+            },
+            {
+              index: '3-2',
+              name: '商品分类管理',
+              nav: 'goodsCategory',
+              router: '/goods-category'
+            }
+            // {
+            //   index: '3-3',
+            //   name: '运费模板',
+            //   nav: 'freight',
+            //   router: '/freight'
+            // }
+          ]
+        },
+        {
+          mid: '4',
+          name: '订单管理',
+          list: [
+            {
+              index: '4-1',
+              name: '订单管理',
+              nav: 'order-manager',
+              router: '/order-manager'
+            }
+          ]
+        },
+        {
+          mid: '5',
+          name: '用户管理',
+          list: [
+            {
+              index: '5-1',
+              name: '用户管理',
+              nav: 'userManage',
+              router: '/user-manage'
+            },
+            {
+              index: '5-2',
+              name: '代理商管理',
+              nav: 'authorization',
+              router: '/authorization'
+            },
+            {
+              index: '5-3',
+              name: '开通记录',
+              nav: 'record',
+              router: '/record'
+            }
+          ]
+        },
+        {
+          mid: '6',
+          name: '资金管理',
+          list: [
+            {
+              index: '6-1',
+              name: '财务对账',
+              nav: 'FinancialReconciliation',
+              router: '/financial-reconciliation'
+            },
+            {
+              index: '6-2',
+              name: '分润记录',
+              nav: 'profitSharingRecord',
+              router: '/profit-sharing-record'
+            },
+            {
+              index: '6-3',
+              name: '团队奖励',
+              nav: 'team',
+              router: '/team'
+            }
+          ]
+        }
+      ]
+    };
+  },
+  mounted() {
+    this.getBaseInfo();
+  },
+  computed: {
+    ...mapGetters(['menuIndex', 'userInfo', 'keepAliveList']),
+
+    current() {
+      let index = this.menuIndex + '';
+      if (index !== 'undefined') {
+        return index;
+      } else {
+        return 0;
+      }
+    },
+
+    getKeepAliveList() {
+      return this.keepAliveList;
+    }
+  },
+  watch: {
+    // 如果路由有变化,会再次执行该方法
+    $route: 'setMenuIndex'
+  },
+  methods: {
+    ...mapMutations(['setMenu', 'clearToken']),
+    // 获取导航
+    getBaseInfo() {
+      this.httpGet(this.$root.menuList)
+        .then(
+          (res) => {
+            this.menuList = res.list;
+            this.loading = false;
+          },
+          (err) => {
+            this.$message.error(err);
+          }
+        )
+        .catch((e) => {
+          this.loading = false;
+          console.log(e);
+        });
+    },
+    setMenuIndex() {
+      // let currentMenu, firstIndex, secondIndex;
+      // for (let i = 0; i < this.menuList.length; i++) {
+      //   currentMenu = this.menuList[i].list.find((item) => {
+      //     return item.router === this.$route.path;
+      //   });
+      //   if (currentMenu) {
+      //     firstIndex = i;
+      //     secondIndex = currentMenu.order_by;
+      //     break;
+      //   }
+      // }
+      // if (currentMenu) {
+      //   this.setMenu(firstIndex + "-" + (secondIndex - 1));
+      // }
+    },
+    goPage(val, index) {
+      this.setMenu(index);
+      this.$router.push(val);
+    },
+    logout() {
+      // 退出账号
+      this.httpPost(this.$root.managerLogout).then(
+        (res) => {
+          this.clearToken();
+          this.$router.push('login');
+        },
+        () => {
+          this.$message({
+            message: '退出失败',
+            type: 'error'
+          });
+        }
+      );
+    }
+  }
+};
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+#app-wrap {
+  height: 100%;
+}
+
+.top {
+  background: theme-color;
+  flex-x(center, center);
+  // padding: 0 65px;
+  color: white;
+  margin: 15px 0;
+
+  .logo {
+    font-size: 24px;
+  }
+}
+
+.menu-title {
+  font-size: 14px;
+
+  span {
+    font-size: 14px;
+  }
+}
+
+.aside {
+  background: #333;
+}
+
+h1 {
+  color: white;
+  font-weight: bold;
+  margin: 20px 50px;
+}
+
+.detail {
+  min-width: 800px;
+  height: 100%;
+  // padding: 0 15px;
+  box-sizing: border-box;
+}
+
+.icon {
+  height: 50px;
+  fill: #fff;
+  margin: 20px 50px 10px;
+}
+
+.el-container {
+  height: 100vh;
+}
+
+a {
+  color: grayE;
+}
+
+.el-submenu .el-menu-item {
+  opacity: 0.9;
+}
+
+.el-menu-item, >>>.el-submenu__title {
+  height: 40px;
+  line-height: 40px;
+}
+
+.el-main {
+  background: bk;
+  padding: 0;
+}
+
+.active-nav {
+  color: btn-color;
+
+  i {
+    color: btn-color;
+  }
+}
+</style>

+ 384 - 0
src/view/base/operation-log.vue

@@ -0,0 +1,384 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">操作类型:</div>
+              <el-select
+                v-model="filter.genre"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in moneyType"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">操作ID:</div>
+              <el-input
+                class="input"
+                v-model="filter.uid"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">创建时间:</div>
+              <el-date-picker
+                v-model="date"
+                type="daterange"
+                align="right"
+                unlink-panels
+                class="date-input"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                :default-time="['00:00:00', '23:59:59']"
+                size="small"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+          </div>
+        </div>
+        <el-table
+          :data="list"
+          class="order-table table no-border-table"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="创建时间"
+          ></el-table-column>
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="操作类型"
+          ></el-table-column>
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="操作详情"
+          ></el-table-column>
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="操作人ID"
+          ></el-table-column>
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="操作人账号"
+          ></el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceRecord',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '变动记录'
+      },
+      filter: {},
+      moneyType: [
+        {
+          name: '全部',
+          value: 0
+        },
+        {
+          name: '积分',
+          value: 1
+        },
+        {
+          name: '绿通',
+          value: 2
+        },
+        {
+          name: '余额',
+          value: 3
+        }
+      ],
+
+      statusType: [
+        {
+          name: '全部',
+          id: 0
+        },
+        {
+          name: '注册赠送积分',
+          value: 1
+        },
+        {
+          name: '本人支付',
+          value: 2
+        },
+        {
+          name: '下级购买奖励积分',
+          value: 3
+        },
+        {
+          name: '商家打赏积分(接收方)',
+          value: 4
+        },
+        {
+          name: '商家打赏本人奖励积分',
+          value: 5
+        },
+        {
+          name: '每日空投扣除积分',
+          value: 6
+        },
+        {
+          name: '后台设置积分',
+          value: 7
+        },
+        {
+          name: '每日空投绿通',
+          value: 8
+        },
+        {
+          name: '下级购买奖励积分',
+          value: 3
+        },
+        {
+          name: '注册赠送积分',
+          value: 1
+        },
+        {
+          name: '本人支付',
+          value: 2
+        },
+        {
+          name: '下级购买奖励积分',
+          value: 3
+        },
+        {
+          name: '注册赠送积分',
+          value: 1
+        },
+        {
+          name: '本人支付',
+          value: 2
+        },
+        {
+          name: '下级购买奖励积分',
+          value: 3
+        },
+        {
+          name: '注册赠送积分',
+          value: 1
+        },
+        {
+          name: '本人支付',
+          value: 2
+        },
+        {
+          name: '下级购买奖励积分',
+          value: 3
+        }
+      ],
+
+      statusMap: {
+        1: '微信收入',
+        2: '推荐奖励金额',
+        3: '级差奖励金额',
+        5: '团队奖励金额'
+      },
+      list: [], // 列表
+      date: []
+    };
+  },
+
+  mounted() {
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取列表
+    getList() {
+      this.filter.begin = this.date[0] || '';
+      this.filter.end = this.date[1] || '';
+      this.loading++;
+      this.httpGet(this.$root.getFinancialCounting, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {};
+      this.date = [];
+      this.getList();
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 125px;
+      }
+
+      .date-input {
+        width: 360px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+}
+</style>

+ 799 - 0
src/view/business/apply-detail.vue

@@ -0,0 +1,799 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <div class="top">
+          <div class="left">商家状态: {{ statusMap[info.status] }}</div>
+          <div class="right">线上售货-{{ statusMap2[info2.status] }}</div>
+        </div>
+        <div class="title">
+          店铺入驻信息
+        </div>
+        <div class="item">
+          <div class="label">店铺名称:</div>
+          <div class="value">{{ info.shopName }}</div>
+        </div>
+        <div class="item">
+          <div class="label">商家主图:</div>
+          <div class="value">
+            <img :src="info.shopIcon" class="zhutu" alt="" />
+          </div>
+        </div>
+        <div class="item">
+          <div class="label">商家ID:</div>
+          <div class="value">{{ info.id }}</div>
+        </div>
+        <div class="item">
+          <div class="label">引荐人:</div>
+          <div class="value">{{ info.bindingUid }}</div>
+        </div>
+        <div class="item">
+          <div class="label">商家联系电话:</div>
+          <div class="value">{{ info.shopPhone }}</div>
+        </div>
+        <div class="item">
+          <div class="label">地址信息:</div>
+          <div class="value">
+            {{ (info.shopAddress || "") + (info.house || "") }}
+          </div>
+        </div>
+        <div class="item">
+          <div class="label">商家描述:</div>
+          <div class="value">{{ info.describe }}</div>
+        </div>
+        <div class="item item2">
+          <div class="label">商家营业执照:</div>
+          <div class="value">
+            <el-image
+              class="img"
+              v-for="(item, index) in info.license"
+              :key="index"
+              :src="item"
+              fit="cover"
+              :preview-src-list="info.license"
+            >
+            </el-image>
+          </div>
+        </div>
+        <div class="item item2">
+          <div class="label">资质照片:</div>
+          <div class="value">
+            <el-image
+              class="img"
+              v-for="(item, index) in info.certification"
+              :key="index"
+              :src="item"
+              fit="cover"
+              :preview-src-list="info.certification"
+            >
+            </el-image>
+          </div>
+        </div>
+        <div class="item item2">
+          <div class="label">商家图片:</div>
+          <div class="value">
+            <!-- <img
+              class="img"
+              v-for="(item, index) in info.shopPics"
+              :src="item"
+              alt=""
+              :key="index"
+            /> -->
+            <el-image
+              class="img"
+              v-for="(item, index) in info.shopPics"
+              :key="index"
+              :src="item"
+              fit="cover"
+              :preview-src-list="info.shopPics"
+            >
+            </el-image>
+          </div>
+        </div>
+        <div class="item item2" v-if="info.shopVideo">
+          <div class="label">商家视频:</div>
+          <div class="value">
+            <video class="video" :src="info.shopVideo" controls></video>
+          </div>
+        </div>
+        <div v-if="info2.status">
+          <div class="title" style="margin-top: 32px;">
+            线上售货信息
+          </div>
+          <div class="item">
+            <div class="label">主体类型:</div>
+            <div class="value">
+              {{ organizationTypeMap[info2.organizationType] }}
+            </div>
+          </div>
+          <div class="item">
+            <div class="label">身份证号:</div>
+            <div class="value">{{ info2.idCardNumber }}</div>
+          </div>
+          <div class="item">
+            <div class="label">个人姓名:</div>
+            <div class="value">{{ info2.legalPerson }}</div>
+          </div>
+          <div class="item">
+            <div class="label">身份证有效期:</div>
+            <div class="value">
+              {{ info2.idCardValidTimeBegin }} 至 {{ info2.idCardValidTime }}
+            </div>
+          </div>
+          <div class="item item2">
+            <div class="label">身份证:</div>
+            <div class="value">
+              <el-image
+                class="img"
+                :src="info2.idCardCopy"
+                fit="cover"
+                style="width: 255px;height: 143px;margin-right: 48px;"
+                :preview-src-list="[info2.idCardCopy, info2.idCardNational]"
+              >
+              </el-image>
+              <el-image
+                class="img"
+                :src="info2.idCardNational"
+                fit="cover"
+                style="width: 255px;height: 143px;"
+                :preview-src-list="[info2.idCardCopy, info2.idCardNational]"
+              >
+              </el-image>
+            </div>
+          </div>
+          <!-- <div class="item">
+          <div class="label">收款账户名:</div>
+          <div class="value">{{ info2.id }}</div>
+        </div> -->
+          <div class="item">
+            <div class="label">收款银行卡号:</div>
+            <div class="value">{{ info2.accountNumber }}</div>
+          </div>
+          <div class="item">
+            <div class="label">收款银行:</div>
+            <div class="value">{{ info2.accountBank }}</div>
+          </div>
+          <!-- <div class="item">
+            <div class="label">所属行业:</div>
+            <div class="value">{{ info2.shopPhone }}</div>
+          </div> -->
+          <div class="item">
+            <div class="label">结算费率:</div>
+            <div class="value">{{ info2.platformRate }}</div>
+          </div>
+          <div class="item">
+            <div class="label">特约商户号:</div>
+            <div class="value">
+              {{ info2.mchid }}
+              <div class="btn" @click="updateMchidModal">修改</div>
+            </div>
+          </div>
+          <div class="item item2" v-if="info2.signUrl">
+            <div class="label">签约二维码:</div>
+            <div class="value">
+              <!-- <el-image
+                class="img"
+                :src="info2.signUrl"
+                fit="cover"
+                style="width: 255px;height: 255px;"
+                :preview-src-list="[info2.signUrl]"
+              >
+              </el-image> -->
+              <div id="sign-pic"></div>
+            </div>
+          </div>
+          <div class="item">
+            <div class="label">引导提示文字:</div>
+            <div class="value">{{ info2.guidingText }}</div>
+          </div>
+          <div class="item">
+            <div class="label">联行号:</div>
+            <div class="value">{{ info2.bankBranchId }}</div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="btn-box" v-if="info.status === 1">
+      <button class="cancel-btn" @click="handleRejectModal">拒绝</button>
+      <button class="confirm-btn" @click="handleResolve">审核通过</button>
+    </div>
+    <div class="btn-box" v-if="info2.status === 1">
+      <button class="cancel-btn" @click="handleRejectModal2">拒绝</button>
+      <button class="confirm-btn" @click="handleResolveModal">审核通过</button>
+    </div>
+    <el-dialog title="驳回申请" width="450px" :visible.sync="rejectVisible">
+      <div class="reject-title"><span>*</span>请填写驳回理由</div>
+      <div style="padding: 0 16px">
+        <div class="remark-box">
+          <textarea
+            rows="8"
+            class="remark"
+            v-model="remark"
+            placeholder="驳回理由"
+          ></textarea>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click.native="rejectVisible = false" class="cancel-btn btn"
+          >取 消</el-button
+        >
+        <el-button
+          type="primary"
+          @click.native="handleReject"
+          class="confirm-btn btn"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+    <el-dialog title="驳回申请" width="450px" :visible.sync="rejectVisible2">
+      <div class="reject-title">驳回理由:</div>
+      <div style="padding: 0 16px">
+        <div class="remark-box">
+          <textarea
+            rows="8"
+            class="remark"
+            v-model="remark"
+            placeholder="驳回理由"
+          ></textarea>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <!-- <el-button @click.native="reject()" class="cancel-btn">驳 回</el-button> -->
+        <el-button @click.native="rejectVisible2 = false" class="cancel-btn btn"
+          >取 消</el-button
+        >
+        <el-button
+          type="primary"
+          @click.native="handleReject2"
+          class="confirm-btn btn"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+    <el-dialog title="审核通过" width="450px" :visible.sync="resolveVisible">
+      <div style="padding: 30px 16px">
+        <div class="remark-box" style="display: flex;">
+          <div class="" style="line-height: 40px;white-space: nowrap;">
+            填写商户费率:
+          </div>
+          <div>
+            <el-input placeholder="请输入内容" v-model="platformRate">
+              <template slot="append"
+                >%</template
+              >
+            </el-input>
+            <div
+              class="tip"
+              style="margin-top: 6px;color: #999;font-size: 12px;"
+            >
+              备注: 最低0.6%最高30%
+            </div>
+          </div>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <!-- <el-button @click.native="reject()" class="cancel-btn">驳 回</el-button> -->
+        <el-button @click.native="resolveVisible = false" class="cancel-btn btn"
+          >取 消</el-button
+        >
+        <el-button
+          type="primary"
+          @click.native="handleResolve2"
+          class="confirm-btn btn"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+    <el-dialog
+      title="修改商户号"
+      :visible.sync="mchidVisible"
+      width="460px"
+      class="dialog"
+    >
+      <el-form
+        ref="form"
+        v-model="mchidForm"
+        class="add-hz-form"
+        label-width="80px"
+      >
+        <el-form-item label="商户号" prop="company">
+          <input
+            class="form-input"
+            placeholder="请输入商户号"
+            v-model="mchidForm.mchid"
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <button
+          class="cancel-btn"
+          style="height: 32px; width: 60px"
+          @click="mchidVisible = false"
+        >
+          取 消
+        </button>
+        <button
+          class="confirm-btn"
+          style="height: 32px; width: 60px"
+          @click="updateMchid"
+        >
+          确 定
+        </button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceExamine',
+  data() {
+    return {
+      title: {
+        // 页面标题
+        firstTitile: '商家管理',
+        secondTitle: '商家申请详情'
+      },
+      roleMap: {
+        0: '普通用户',
+        1: 'VIP',
+        2: '区级代理',
+        3: '市级代理',
+        4: '省级代理',
+        5: '运营中心',
+        6: '分公司'
+      },
+      statusMap: {
+        1: '待审核',
+        2: '审核通过',
+        3: '审核拒绝'
+      },
+      loading: 0,
+      statusMap2: {
+        0: '未开通',
+        1: '待平台审核',
+        2: '待三方审核',
+        3: '待开通分账权限',
+        5: '已开通',
+        6: '平台审核驳回',
+        7: '三方审核驳回'
+      },
+      info: {},
+      info2: {},
+      rejectVisible: false,
+      rejectVisible2: false,
+      resolveVisible: false,
+      remark: '',
+      platformRate: null,
+      organizationTypeMap: {
+        SUBJECT_TYPE_ENTERPRISE: '企业',
+        SUBJECT_TYPE_INDIVIDUAL: '个体工商'
+      },
+      mchidVisible: false,
+      mchidForm: {
+        mchid: ''
+      },
+
+    };
+  },
+
+  mounted() {
+    this.id = +this.$route.query.id;
+    // 获取列表
+    this.getInfo();
+    this.getInfo2();
+  },
+  computed: {},
+  methods: {
+    // 获取列表
+    getInfo() {
+      this.loading++;
+      this.httpGet(this.$root.businessApplyInfo, {
+        id: this.id
+      }).then(
+        (res) => {
+          this.loading--;
+          this.info = res;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    getInfo2() {
+      this.loading++;
+      this.httpGet(this.$root.getShopMerchantInfo, {
+        sid: this.id
+      }).then(
+        (res) => {
+          this.loading--;
+          this.info2 = res.info;
+          this.$nextTick(() => {
+            if(res.info.signUrl){
+            new QRCode(document.getElementById("sign-pic"), {
+              text: res.info.signUrl,
+              width: 128,
+              height: 128,
+              colorDark: "#000000",
+              colorLight: "#ffffff",
+              correctLevel: QRCode.CorrectLevel.H
+            });
+          }
+
+           });
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    handleResolve() {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要通过该审核吗?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPut(this.$root.businessApplyResolve, {
+          id: this.id
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getInfo();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    // handleReject() {
+    //   this.$confirm(
+    //     `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要驳回该审核吗?</p>`,
+    //     {
+    //       confirmButtonText: '确定',
+    //       cancelButtonText: '取消',
+    //       cancelButtonClass: 'cancel-btn',
+    //       confirmButtonClass: 'confirm-btn',
+    //       customClass: 'confirm-box',
+    //       dangerouslyUseHTMLString: true,
+    //       showClose: false,
+    //       type: 'none'
+    //     }
+    //   ).then(() => {
+    //     this.loading++;
+    //     this.httpPut(this.$root.businessApplyReject, {
+    //       id: this.id
+    //     }).then(
+    //       (res) => {
+    //         this.$message({
+    //           message: '操作成功',
+    //           type: 'success'
+    //         });
+    //         this.loading--;
+    //         this.getInfo();
+    //       },
+    //       (res) => {
+    //         this.loading--;
+    //         this.$message.error(res);
+    //       }
+    //     );
+    //   });
+    // },
+    handleRejectModal() {
+      this.remark = '';
+      this.rejectVisible = true;
+    },
+    handleReject() {
+      this.loading++;
+        this.httpPut(this.$root.businessApplyReject, {
+          id: this.id,
+          rollback: this.remark
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.rejectVisible = false;
+            this.getInfo();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+    },
+    handleRejectModal2() {
+      this.remark = '';
+      this.rejectVisible2 = true;
+    },
+    handleReject2() {
+      this.loading++;
+      this.httpPut(this.$root.rejectShopMerchant, {
+        sid: this.info2.sid,
+        guidingText: this.remark
+      }).then(
+        (res) => {
+          this.$message({
+            message: '操作成功',
+            type: 'success'
+          });
+          this.loading--;
+          this.rejectVisible2 = false;
+          this.getInfo2();
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    handleResolveModal(){
+      this.resolveVisible = true;
+      this.platformRate = null;
+    },
+    handleResolve2() {
+      this.loading++;
+      this.httpPost(this.$root.resolveShopMerchant, {
+        sid: this.info2.sid,
+        platformRate: +this.platformRate
+      }).then(
+        (res) => {
+          this.$message({
+            message: '操作成功',
+            type: 'success'
+          });
+          this.loading--;
+          this.resolveVisible = false;
+          this.getInfo2();
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    updateMchidModal(){
+      this.mchidVisible = true;
+      this.mchidForm.mchid = this.info2.mchid;
+    },
+    updateMchid(){
+      // updateShopMerchantMid
+      this.loading++;
+      this.httpPut(this.$root.updateShopMerchantMid, {
+        sid: this.info2.sid,
+        ...this.mchidForm
+      }).then(
+        (res) => {
+          this.$message({
+            message: '操作成功',
+            type: 'success'
+          });
+          this.loading--;
+          this.mchidVisible = false;
+          this.getInfo2();
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    }
+    // rejectModal() {
+    //   this.rejectVisible = true;
+    // },
+    // handleReject() {
+    //   this.loading++;
+    //   this.httpPut(this.$root.yyzxReject, {
+    //     id: this.id,
+    //     remark: this.remark
+    //   }).then(
+    //     (res) => {
+    //       this.$message({
+    //         message: '操作成功',
+    //         type: 'success'
+    //       });
+    //       this.loading--;
+    //       this.rejectVisible = false;
+    //       this.getInfo();
+    //     },
+    //     (res) => {
+    //       this.loading--;
+    //       this.$message.error(res);
+    //     }
+    //   );
+    // }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 20px;
+      border-radius: 2px;
+      padding-top: 0;
+
+      .top{
+        flex-x();
+        height: 80px;
+        .left{
+          word(24px, #333);
+          font-weight: bold;
+        }
+        .right{
+          word(24px, #407AED);
+          font-weight: bold;
+        }
+      }
+
+      .title{
+        height: 40px;
+        padding: 0 30px;
+        word(18px, #333);
+        background: #F6F6F6;
+        border-radius: 5px;
+        flex-x(flex-start);
+        font-weight: bold;
+        margin-bottom: 20px;
+      }
+
+      .item {
+        flex-x(flex-start);
+        word(14px, #666);
+        height: 45px;
+        padding: 0 54px;
+
+        &.item2{
+          height: auto;
+          padding: 10px 54px;
+        }
+
+        .label {
+          width: 150px;
+          line-height: 45px;
+          align-self: flex-start;
+        }
+
+        .btn {
+            width: auto;
+            line-height: 24px;
+            border-radius: 12px;
+            display: inline-block;
+            padding: 0 12px;
+            background: #E33C64;
+            margin-right: 8px;
+            color: #fff;
+            cursor: pointer;
+          }
+
+        .zhutu {
+          width: 32px;
+          height: 32px;
+          border-radius: 4px;
+        }
+
+        .img {
+          width: 112px;
+          height: 112px;
+          border-radius: 4px;
+          margin-right: 15px;
+        }
+        .video{
+          height: 450px;
+        }
+      }
+    }
+  }
+
+  .btn-box {
+    background: white;
+    width: 100%;
+    flex-x(center);
+    // padding-bottom: 48px;
+    padding: 24px 0;
+
+    .cancel-btn {
+      width: 96px;
+      height: 40px;
+      cancel-btn();
+      // border-radius: 23px;
+    }
+
+    .confirm-btn {
+      width: 96px;
+      height: 40px;
+      margin-left: 20px;
+      confirm-btn();
+    }
+  }
+
+  .reject-title {
+    border-top: 1px solid #eee;
+    padding: 12px 13px 0;
+    word(14px, #666);
+
+    span {
+      color: #FD4545;
+      display: inline-block;
+      width: 15px;
+    }
+  }
+
+  .remark-box {
+    width: 100%;
+    padding-left: 15px;
+    box-sizing: border-box;
+  }
+
+  .remark {
+    border: 1px solid #f1f1f1;
+    width: 100%;
+    margin: 12px 0;
+    padding: 12px;
+    box-sizing: border-box;
+  }
+
+  .add-hz-form {
+    padding-top: 15px;
+
+    .form-input {
+      width: 300px;
+      height: 32px;
+      margin-left: 3px;
+      margin-right: 16px;
+      border-radius: 5px;
+      padding: 0 12px;
+      border: 1px solid #ccc;
+      box-sizing: border-box;
+      word(13px, #333);
+    }
+  }
+}
+</style>

+ 697 - 0
src/view/business/business-apply.vue

@@ -0,0 +1,697 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">商家审核状态:</div>
+              <el-select
+                v-model="filter.status"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in statusType"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+            <div class="filter-item">
+              <div class="label">线上售货审核状态:</div>
+              <el-select
+                v-model="filter.merchantStatus"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in statusType2"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+            <div class="filter-item">
+              <div class="label">商家名称:</div>
+              <el-input
+                class="input"
+                v-model="filter.shopName"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+          </div>
+        </div>
+        <el-table
+          :data="list"
+          class="table no-border-table"
+          ref="table"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column prop="shopIcon" align="center" label="商家图片">
+            <div slot-scope="scope">
+              <img class="table-img" :src="scope.row.shopIcon" alt="" />
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="id"
+            align="center"
+            label="商家ID"
+          ></el-table-column>
+          <el-table-column
+            prop="uid"
+            align="center"
+            label="用户ID"
+          ></el-table-column>
+          <el-table-column
+            prop="shopName"
+            align="center"
+            label="店铺名称"
+          ></el-table-column>
+          <el-table-column
+            prop="shopPhone"
+            align="center"
+            label="联系电话"
+          ></el-table-column>
+          <el-table-column prop="created" align="center" label="详细地址">
+            <div slot-scope="scope">
+              {{ scope.row.shopAddress + scope.row.house }}
+            </div>
+          </el-table-column>
+          <el-table-column prop="amount" align="center" label="商家状态">
+            <div slot-scope="scope">
+              {{ statusMap[scope.row.status] }}
+            </div>
+          </el-table-column>
+          <el-table-column prop="amount" align="center" label="线上售货">
+            <div slot-scope="scope">
+              {{ statusMap2[scope.row.merchantStatus] }}
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="created"
+            align="center"
+            label="审核操作时间"
+          ></el-table-column>
+          <el-table-column label="操作" align="center" width="180">
+            <div
+              slot-scope="scope"
+              style="display: flex; justify-content: center"
+            >
+              <button
+                size="mini"
+                class="table-btn"
+                v-if="scope.row.status === 1"
+                @click="handleResolve(scope.row.id)"
+              >
+                通过
+              </button>
+              <button
+                size="mini"
+                class="table-btn"
+                v-if="scope.row.status === 1"
+                @click="rejectModal(scope.row.id)"
+              >
+                驳回
+              </button>
+              <button
+                size="mini"
+                class="table-btn"
+                v-if="scope.row.merchantStatus === 1"
+                @click="resolveModal(scope.row.id)"
+              >
+                通过
+              </button>
+              <button
+                size="mini"
+                class="table-btn"
+                v-if="scope.row.merchantStatus === 1"
+                @click="rejectModal2(scope.row.id)"
+              >
+                驳回
+              </button>
+              <button
+                size="mini"
+                class="table-btn"
+                @click="toDetail(scope.row.id)"
+              >
+                详情
+              </button>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <el-dialog
+      title="驳回申请"
+      width="450px"
+      :visible.sync="rejectVisible"
+    >
+      <div class="reject-title"><span>*</span>请填写驳回理由</div>
+      <div style="padding: 0 16px">
+        <div class="remark-box">
+          <textarea
+            rows="8"
+            class="remark"
+            v-model="remark"
+            placeholder="驳回理由"
+          ></textarea>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click.native="rejectVisible = false" class="cancel-btn btn"
+          >取 消</el-button
+        >
+        <el-button
+          type="primary"
+          @click.native="handleReject"
+          class="confirm-btn btn"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+    <el-dialog title="驳回申请" width="450px" :visible.sync="rejectVisible2">
+      <div class="reject-title">驳回理由:</div>
+      <div style="padding: 0 16px">
+        <div class="remark-box">
+          <textarea
+            rows="8"
+            class="remark"
+            v-model="remark"
+            placeholder="驳回理由"
+          ></textarea>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <!-- <el-button @click.native="reject()" class="cancel-btn">驳 回</el-button> -->
+        <el-button @click.native="rejectVisible2 = false" class="cancel-btn btn"
+          >取 消</el-button
+        >
+        <el-button
+          type="primary"
+          @click.native="handleReject2"
+          class="confirm-btn btn"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+    <el-dialog title="审核通过" width="450px" :visible.sync="resolveVisible">
+      <div style="padding: 30px 16px">
+        <div class="remark-box" style="display: flex;">
+          <div class="" style="line-height: 40px;white-space: nowrap;">
+            填写商户费率:
+          </div>
+          <div>
+            <el-input placeholder="请输入内容" v-model="platformRate">
+              <template slot="append"
+                >%</template
+              >
+            </el-input>
+            <div class="tip" style="margin-top: 6px;color: #999;font-size: 12px;">备注: 最低0.6%最高30%</div>
+          </div>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <!-- <el-button @click.native="reject()" class="cancel-btn">驳 回</el-button> -->
+        <el-button @click.native="resolveVisible = false" class="cancel-btn btn"
+          >取 消</el-button
+        >
+        <el-button
+          type="primary"
+          @click.native="handleResolve2"
+          class="confirm-btn btn"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceExamine',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '用户管理',
+        secondTitle: '商家申请管理'
+      },
+      filter: {
+        status: 0,
+        merchantStatus: null,
+        shopName: ''
+      },
+      statusType: [
+        {
+          name: '全部',
+          value: 0
+        },
+        {
+          name: '待审核',
+          value: 1
+        },
+        {
+          name: '审核通过',
+          value: 2
+        },
+        {
+          name: '审核拒绝',
+          value: 3
+        }
+      ],
+      statusType2: [
+        {
+          name: '全部',
+          value: null
+        },
+        {
+          name: '未开通',
+          value: 0
+        },
+        {
+          name: '待平台审核',
+          value: 1
+        },
+        {
+          name: '待三方审核',
+          value: 2
+        },
+        {
+          name: '待开通分账权限',
+          value: 3
+        },
+        {
+          name: '已开通',
+          value: 5
+        },
+        {
+          name: '平台审核驳回',
+          value: 6
+        },
+        {
+          name: '三方审核驳回',
+          value: 7
+        }
+      ],
+      statusMap: {
+        1: '待审核',
+        2: '审核通过',
+        3: '审核拒绝'
+      },
+      statusMap2: {
+        0: '未开通',
+        1: '待平台审核',
+        2: '待三方审核',
+        3: '待开通分账权限',
+        5: '已开通',
+        6: '平台审核驳回',
+        7: '三方审核驳回'
+      },
+      roleMap: {
+        0: '普通用户',
+        1: 'VIP',
+        2: '区级代理',
+        3: '市级代理',
+        4: '省级代理',
+        5: '运营中心',
+        6: '分公司'
+      },
+      list: [], // 用户列表
+      id: null,
+      rejectVisible: false,
+      rejectVisible2: false,
+      resolveVisible: false,
+      remark: '',
+      platformRate: null
+    };
+  },
+
+  mounted() {
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取列表
+    getList() {
+      this.loading++;
+      this.httpGet(this.$root.getBusinessApplyList, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        status: 0,
+        merchantStatus: null,
+        shopName: ''
+      };
+      this.getList();
+    },
+    handleResolve(id) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要通过该审核吗?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPut(this.$root.businessApplyResolve, {
+          id
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    // handleReject(id) {
+    //   this.$confirm(
+    //     `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要驳回该审核吗?</p>`,
+    //     {
+    //       confirmButtonText: '确定',
+    //       cancelButtonText: '取消',
+    //       cancelButtonClass: 'cancel-btn',
+    //       confirmButtonClass: 'confirm-btn',
+    //       customClass: 'confirm-box',
+    //       dangerouslyUseHTMLString: true,
+    //       showClose: false,
+    //       type: 'none'
+    //     }
+    //   ).then(() => {
+    //     this.loading++;
+    //     this.httpPut(this.$root.businessApplyReject, {
+    //       id
+    //     }).then(
+    //       (res) => {
+    //         this.$message({
+    //           message: '操作成功',
+    //           type: 'success'
+    //         });
+    //         this.loading--;
+    //         this.getList();
+    //       },
+    //       (res) => {
+    //         this.loading--;
+    //         this.$message.error(res);
+    //       }
+    //     );
+    //   });
+    // },
+
+    rejectModal(id) {
+      this.id = id;
+      this.remark = '';
+      this.rejectVisible = true;
+    },
+    handleReject() {
+      this.loading++;
+        this.httpPut(this.$root.businessApplyReject, {
+          id: this.id,
+          rollback: this.remark
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.rejectVisible = false;
+            this.getList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+    },
+    rejectModal2(id) {
+      this.id = id;
+      this.remark = '';
+      this.rejectVisible2 = true;
+    },
+    handleReject2() {
+      this.loading++;
+      this.httpPut(this.$root.rejectShopMerchant, {
+        sid: this.id,
+        guidingText: this.remark
+      }).then(
+        (res) => {
+          this.$message({
+            message: '操作成功',
+            type: 'success'
+          });
+          this.loading--;
+          this.rejectVisible2 = false;
+          this.getList();
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    resolveModal(id){
+      this.resolveVisible = true;
+      this.id = id;
+      this.platformRate = null;
+    },
+    handleResolve2() {
+      this.loading++;
+      this.httpPost(this.$root.resolveShopMerchant, {
+        sid: this.id,
+        platformRate: +this.platformRate
+      }).then(
+        (res) => {
+          this.$message({
+            message: '操作成功',
+            type: 'success'
+          });
+          this.loading--;
+          this.resolveVisible = false;
+          this.getList();
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    toDetail(id) {
+      this.$router.push({
+        name: 'applyDetail',
+        query: {
+          id
+        }
+      });
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 150px;
+      }
+
+      .date-input {
+        width: 360px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+
+      .table-img {
+        height: 32px;
+        width: 32px;
+        border-radius: 4px;
+        object-fit: fill;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+
+  .reject-title {
+    border-top: 1px solid #eee;
+    padding: 12px 13px 0;
+    word(14px, #666);
+
+    span {
+      color: #FD4545;
+      display: inline-block;
+      width: 15px;
+    }
+  }
+
+  .remark-box {
+    width: 100%;
+    padding-left: 15px;
+    box-sizing: border-box;
+  }
+
+  .remark {
+    border: 1px solid #f1f1f1;
+    width: 100%;
+    margin: 12px 0;
+    padding: 12px;
+    box-sizing: border-box;
+  }
+}
+</style>

+ 432 - 0
src/view/business/business-type.vue

@@ -0,0 +1,432 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="btn" @click="handleModal('add')">+添加商家类型</div>
+        <el-table
+          :data="list"
+          class="table no-border-table"
+          ref="table"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            type="index"
+            :index="tableIndex"
+            align="center"
+            label="编号"
+            width="120"
+          ></el-table-column>
+          <el-table-column prop="pic" align="center" label="商家类型图标">
+            <div slot-scope="scope">
+              <img class="table-img" :src="scope.row.pic" alt="" />
+            </div>
+          </el-table-column>
+          <el-table-column prop="name" align="center" label="类型名称">
+          </el-table-column>
+          <el-table-column prop="orderBy" align="center" label="排序">
+            <div slot-scope="scope" @click="changeSortModal(scope.row.id)">
+              {{ scope.row.orderBy }}
+            </div>
+          </el-table-column>
+          <el-table-column label="操作" align="center">
+            <div
+              slot-scope="scope"
+              style="display: flex; justify-content: center"
+            >
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="handleModal('edit', scope.row)"
+                >
+                  编辑
+                </button>
+              </div>
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="handleDelete(scope.row.id)"
+                >
+                  删除
+                </button>
+              </div>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <el-dialog :visible.sync="addShow" class="dialog" width="560px" top="25vh">
+      <div slot="title" class="dialog-title">
+        {{ (type === "add" ? "新增" : "编辑") + "商家类型" }}
+      </div>
+      <el-form
+        ref="form"
+        :rules="rules"
+        :model="addForm"
+        class="form"
+        label-width="auto"
+      >
+        <el-form-item label="商家类型名称:" prop="name" class="form-item">
+          <el-input
+            placeholder="请输入分类名称"
+            class="add-renovation-input"
+            style="width: 160px"
+            v-model="addForm.name"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="排序:" prop="sort" class="form-item">
+          <el-input
+            placeholder="请输入序号"
+            class="add-renovation-input"
+            style="width: 160px"
+            v-model.number="addForm.orderBy"
+            type="number"
+            onkeypress="return( /[\d]/.test(String.fromCharCode(event.keyCode)))"
+          ></el-input>
+          <div class="sort-tip">数值越大,排序越靠前</div>
+        </el-form-item>
+        <el-form-item class="img_item" prop="pic" label="图片:">
+          <div class="addImg">
+            <div class="img-box">
+              <img ref="img" :src="addForm.pic" v-if="addForm.pic" />
+              <div class="icon" v-else>
+                <p><i class="el-icon-plus" style="font-size: 32px"></i></p>
+                <!-- <p>图片</p>
+                <p class="tip">支持扩展名:.jpg .png</p> -->
+              </div>
+              <input
+                type="file"
+                class="file"
+                ref="inputImg"
+                @change="addChangeImg"
+              />
+            </div>
+            <p class="tips">支持jpg、png格式</p>
+          </div>
+        </el-form-item>
+        <el-form-item label="打赏上限比例:" prop="ratio" class="form-item">
+          <el-input
+            placeholder="请输入打赏上限比例"
+            class="add-renovation-input"
+            style="width: 160px"
+            v-model.number="addForm.ratio"
+            type="number"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button class="cancel-btn btn" @click="addShow = false"
+          >取 消</el-button
+        >
+        <el-button class="confirm-btn btn" @click="handleConfirm"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'banner',
+  data() {
+    return {
+      loading: 0, // 加载中
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      title: {
+        // 页面标题
+        firstTitile: '商家管理',
+        secondTitle: '商家类型'
+      },
+      list: [], // 轮播列表
+      rules: {},
+      addForm: {
+        pic: '',
+        name: '',
+        orderBy: null,
+        ratio: null
+      },
+      addShow: false,
+      id: null,
+      type: ''
+    };
+  },
+  mounted() {
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 表格序号
+    tableIndex(index) {
+      return ++index;
+    },
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取轮播列表
+    getList() {
+      this.loading++;
+      this.httpGet(this.$root.getBusinessTypeList, {}).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 编辑轮播弹窗
+    handleModal(type, rowData) {
+      this.type = type;
+      if (type === 'edit') {
+        this.id = rowData.id;
+        this.addForm = {
+          pic: rowData.pic,
+          name: rowData.name,
+          orderBy: rowData.orderBy,
+          ratio: rowData.ratio
+        };
+      } else {
+        this.addForm = {
+          pic: '',
+          name: '',
+          orderBy: null,
+          ratio: null
+        };
+        this.$refs.form && this.$refs.form.clearValidate();
+      }
+      this.addShow = true;
+    },
+    // 删除
+    handleDelete(id) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要删除该类型吗?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpDelete(this.$root.deleteBusinessType, {
+          id
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    //
+    handleConfirm() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          let url =
+            this.type === 'add'
+              ? this.$root.addBusinessType
+              : this.$root.updateBusinessType;
+          let method = this.type === 'add' ? 'httpPost' : 'httpPut';
+          let inputData =
+            this.type === 'add'
+              ? {
+                  ...this.addForm
+                }
+              : {
+                  ...this.addForm,
+                  id: this.id
+                };
+          inputData.ratio = +inputData.ratio;
+          this.loading++;
+          this[method](url, inputData).then(
+            (res) => {
+              this.$message({
+                message: '操作成功',
+                type: 'success'
+              });
+              this.loading--;
+              this.addShow = false;
+              this.getList();
+            },
+            (res) => {
+              this.loading--;
+              this.$message.error(res);
+            }
+          );
+        }
+      });
+    },
+    // 图片改变
+    addChangeImg(e) {
+      this.upPic(e, (res) => {
+        this.$set(this.addForm, 'pic', res);
+        // 清空input value,解决重复图片不触发change
+        this.$refs.inputImg.value = '';
+        this.$refs.form.clearValidate(['pic']);
+      });
+    },
+    // 上传图片
+    upPic(e, fun) {
+      // 上传图片
+      let file = e.target.files[0];
+      if (!file) {
+        return;
+      }
+      this.request.upPic({ prefix: 'other', file: file }).then(
+        (res) => {
+          fun(res);
+        },
+        (res) => {}
+      );
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 24px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        // width: 100px;
+        display: inline-block;
+        padding: 0 16px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin-bottom: 16px;
+        // margin: 16px 0;
+      }
+
+      .tip {
+        margin-left: 32px;
+        color: #999;
+      }
+
+      // 表格按钮
+      .table-btn {
+        width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+      }
+
+      .table-img {
+        height: 36px;
+        width: auto;
+      }
+    }
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .addImg {
+    .icon {
+      width: 80px;
+      height: 80px;
+      background: #E8E8E8;
+      border-width: 0;
+
+      i {
+        color: #979797;
+      }
+    }
+  }
+
+  .form {
+    margin-top: 16px;
+    margin-bottom: 30px;
+    padding-left: 80px;
+
+    .form-item {
+      margin-top: 24px;
+    }
+
+    .sort-tip {
+      word(14px, #c8c8c8);
+      line-height: 20px;
+    }
+  }
+}
+</style>

+ 384 - 0
src/view/fund/add-pay.vue

@@ -0,0 +1,384 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <div class="title">列表信息</div>
+        <div class="item">
+          <div class="label">支付方式</div>
+          <el-select v-model="form.mode" class="input" placeholder="请选择">
+            <el-option
+              :value="item.value"
+              :label="item.name"
+              v-for="item in modeList"
+              :key="item.value"
+            >
+            </el-option>
+          </el-select>
+        </div>
+        <div class="item">
+          <div class="label">商户全称</div>
+          <el-input
+            class="input"
+            v-model="form.name"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">商家ID</div>
+          <el-input
+            class="input"
+            v-model.number="form.sid"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">商户号</div>
+          <el-input
+            class="input"
+            v-model="form.mid"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">商户证书序列号</div>
+          <el-input
+            class="input"
+            v-model="form.certSerialNum"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">商户APIv3密钥</div>
+          <el-input
+            class="input"
+            v-model="form.key"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">商户公钥</div>
+          <div class="input file" v-if="form.keyName">
+            <div class="file-name">
+              {{ form.keyName || "" }}
+            </div>
+            <div class="btn-box">
+              <!-- <div class="btn">查看</div> -->
+              <div class="btn" @click="deleteFile('keyName')">删除</div>
+            </div>
+          </div>
+          <div class="input upload" v-else>
+            添加附件
+            <input
+              type="file"
+              class="upload-input"
+              ref="input"
+              @change="
+                (e) => {
+                  handleUpload(e, 'keyName');
+                }
+              "
+            />
+          </div>
+        </div>
+        <div class="item">
+          <div class="label">商户证书</div>
+          <div class="input file" v-if="form.certName">
+            <div class="file-name">
+              {{ form.certName || "" }}
+            </div>
+            <div class="btn-box">
+              <!-- <div class="btn">查看</div> -->
+              <div class="btn" @click="deleteFile('certName')">删除</div>
+            </div>
+          </div>
+          <div class="input upload" v-else>
+            添加附件
+            <input
+              type="file"
+              class="upload-input"
+              ref="input"
+              @change="
+                (e) => {
+                  handleUpload(e, 'certName');
+                }
+              "
+            />
+          </div>
+        </div>
+        <div class="item">
+          <div class="label">分账比例/%</div>
+          <el-input
+            class="input"
+            v-model="form.spiltRatio"
+            placeholder="点击输入信息"
+          ></el-input>
+          <div class="tip">分账比例设置上限29.4%</div>
+        </div>
+        <div class="item">
+          <div class="label">分账接收商户全称</div>
+          <el-input
+            class="input"
+            v-model="form.spiltName"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">分账接收商户号</div>
+          <el-input
+            class="input"
+            v-model="form.spiltMid"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">APPID</div>
+          <el-input
+            class="input"
+            v-model="form.appid"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+      </div>
+      <div class="btn-box">
+        <button class="confirm-btn" @click="handleConfirm">保存</button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceExamine',
+  data() {
+    return {
+      title: {
+        // 页面标题
+        firstTitile: '收款商户',
+        secondTitle: '收款商户'
+      },
+      loading: 0,
+      form: {
+        sid: null,
+        mode: '',
+        name: '',
+        mid: '',
+        certSerialNum: '',
+        key: '',
+        spiltRatio: null,
+        spiltMid: '',
+        keyName: '',
+        certName: '',
+        spiltName: '',
+        appid: ''
+      },
+      fileName: '',
+      modeList: [
+        {
+          name: '微信APP支付',
+          value: 'wxPayApp'
+        }
+      ]
+    };
+  },
+
+  mounted() {},
+  computed: {},
+  methods: {
+    handleUpload(e, name) {
+      let file = e.target.files[0];
+      this.loading++;
+      this.httpUploadFile(
+        this.$root.uploadPay,
+        {
+          file: file
+        },
+        { 'Content-Type': 'multipart/form-data' }
+      ).then(
+        (res) => {
+          this.loading--;
+          this.$refs.input.value = '';
+          this.$message.success('上传成功');
+          this.form[name] = res.name;
+        },
+        (res) => {
+          this.loading--;
+          this.$refs.input.value = '';
+          this.$message.error(res);
+        }
+      );
+    },
+    handleConfirm() {
+      this.loading++;
+      this.form.spiltRatio = +this.form.spiltRatio;
+      this.httpPost(this.$root.createPay, {
+        ...this.form
+      }).then(
+        (res) => {
+          this.loading--;
+          this.$router.push({
+            name: 'payRecord'
+          });
+          this.$message.success('操作成功');
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    deleteFile(name) {
+      this.form[name] = '';
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 30px 24px;
+      border-radius: 2px;
+
+      .title {
+        word(20px, #333);
+        margin-bottom: 15px;
+      }
+
+      .item {
+        flex-x(flex-start);
+        word(14px, #666);
+        height: 50px;
+
+        &.item2 {
+          height: auto;
+          padding: 10px 0;
+        }
+
+        .label {
+          width: 180px;
+          line-height: 50px;
+          align-self: flex-start;
+          text-align: right;
+        }
+
+        .upload {
+          line-height: 50px;
+          color: btn-color;
+          cursor: pointer;
+          position: relative;
+          cursor: pointer;
+
+          .upload-input {
+            position: absolute;
+            width: 100%;
+            height: 100%;
+            left: 0;
+            top: 0;
+            opacity: 0;
+            cursor: pointer;
+          }
+        }
+
+        .input {
+          margin-left: 36px;
+          width: 270px;
+        }
+
+        .tip {
+          color: btn-color;
+          margin-left: 15px;
+        }
+
+        .file {
+          width: auto;
+          min-width: 270px;
+          flex-x();
+
+          .file-name {
+          }
+
+          .btn-box {
+            flex-x(flex-start);
+            padding-bottom: 0;
+            width: auto;
+
+            .btn {
+              margin: 0 10px;
+              word(14px, btn-color);
+              cursor: pointer;
+            }
+          }
+        }
+
+        .zhutu {
+          width: 32px;
+          height: 32px;
+          border-radius: 4px;
+        }
+
+        .img {
+          width: 112px;
+          height: 112px;
+          border-radius: 4px;
+          margin-right: 15px;
+          object-fit: cover;
+        }
+
+        .video {
+          height: 450px;
+        }
+      }
+    }
+  }
+
+  .btn-box {
+    background: white;
+    width: 100%;
+    flex-x(center);
+    padding-bottom: 48px;
+
+    .cancel-btn {
+      width: 96px;
+      height: 40px;
+      cancel-btn();
+      // border-radius: 23px;
+    }
+
+    .confirm-btn {
+      width: 96px;
+      height: 40px;
+      margin-left: 20px;
+      confirm-btn();
+    }
+  }
+}
+</style>

+ 458 - 0
src/view/fund/balance-examine.vue

@@ -0,0 +1,458 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">用户ID:</div>
+              <el-input
+                class="input"
+                v-model="filter.uid"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">审核状态:</div>
+              <el-select
+                v-model="filter.status"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in statusType"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">申请时间:</div>
+              <el-date-picker
+                v-model="date"
+                type="datetimerange"
+                align="right"
+                unlink-panels
+                class="date-input"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                :default-time="['00:00:00', '23:59:59']"
+                size="small"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+            <button class="search" style="margin-left: 60px" @click="order2excel">导出</button>
+          </div>
+        </div>
+        <el-table
+          :data="list"
+          class="table no-border-table"
+          ref="table"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            prop="created"
+            align="center"
+            label="提审时间"
+          ></el-table-column>
+          <el-table-column
+            prop="uid"
+            align="center"
+            label="用户ID"
+          ></el-table-column>
+          <el-table-column
+            prop="amount"
+            align="center"
+            label="充值金额/元"
+          ></el-table-column>
+          <el-table-column
+            prop="thirdId"
+            align="center"
+            label="充值单号"
+          ></el-table-column>
+          <el-table-column prop="status" align="center" label="审核状态">
+            <div slot-scope="scope">
+              {{ statusMap[scope.row.status] }}
+            </div>
+          </el-table-column>
+          <el-table-column prop="amount" align="center" label="截图凭证">
+            <div slot-scope="scope">
+              <!-- <img class="master-pic" :src="scope.row.pic" alt="" /> -->
+              <el-image
+                class="master-pic"
+                :src="scope.row.pic"
+                :preview-src-list="[scope.row.pic]"
+              >
+              </el-image>
+            </div>
+          </el-table-column>
+          <el-table-column label="操作" align="center" width="180">
+            <div
+              slot-scope="scope"
+              style="display: flex; justify-content: center"
+              v-if="scope.row.status === 0"
+            >
+              <button
+                size="mini"
+                class="table-btn"
+                @click="handleAudit(scope.row.id, 1)"
+              >
+                通过
+              </button>
+              <button
+                size="mini"
+                class="table-btn"
+                @click="handleAudit(scope.row.id, 2)"
+              >
+                拒绝
+              </button>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <el-dialog
+      :show-close="false"
+      :close-on-click-modal="false"
+      title="生成中..."
+      :visible.sync="showProgressDialog"
+      width="30%"
+      center
+    >
+      <el-progress
+        :percentage="progress"
+        :text-inside="true"
+        :stroke-width="18"
+      ></el-progress>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+import myUtils from '../../components/common/whatever2excel';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceExamine',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '余额充值审核'
+      },
+      filter: {
+        uid: null,
+        status: null
+      },
+      statusType: [
+        {
+          name: '全部',
+          value: null
+        },
+        {
+          name: '待审核',
+          value: 0
+        },
+        {
+          name: '审核通过',
+          value: 1
+        },
+        {
+          name: '审核拒绝',
+          value: 2
+        }
+      ],
+      statusMap: {
+        0: '待审核',
+        1: '审核通过',
+        2: '审核拒绝'
+      },
+      list: [], // 用户列表
+      date: [],
+      showProgressDialog: false,
+      progress: 0
+    };
+  },
+
+  mounted() {
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取提现列表
+    getList() {
+      this.filter.begin = this.date[0] || '';
+      this.filter.end = this.date[1] || '';
+      this.loading++;
+      this.httpGet(this.$root.xxRechargeList, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {};
+      this.date = [];
+      this.getList();
+    },
+    handleAudit(id, status) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要${
+          status === 1 ? '通过' : '驳回'
+        }该审核吗?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPut(this.$root.xxRechargeAudit, {
+          id,
+          status
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    async order2excel() {
+      this.loading++;
+      let list = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      };
+      await this.httpGet(this.$root.xxRechargeList, data).then(
+        (res) => {
+          this.loading--;
+          totalPage = Math.ceil(parseInt(res.total) / this.size);
+        },
+        () => {
+          this.loading--;
+        }
+      );
+      this.showProgressDialog = true;
+      this.progress = 0;
+      await this.getAllPages(totalPage, list).then(
+        () => {
+          this.showProgressDialog = false;
+          this.jsonFormatAndToExcel(list);
+        },
+        (err) => {
+          console.error(err);
+          this.showProgressDialog = false;
+        }
+      );
+    },
+    async getAllPages(totalPage, list) {
+      for (let i = 1; i <= totalPage; i++) {
+        let data = {
+          page: i,
+          size: this.size,
+          ...this.filter
+        };
+        await this.httpGet(this.$root.xxRechargeList, data).then((res) => {
+          list.push(...res.list);
+          this.progress = Math.floor((i / totalPage) * 100);
+          console.log('page' + i, list.length);
+        });
+        // console.log(5555, list);
+      }
+    },
+    jsonFormatAndToExcel(list) {
+      let formatList = [];
+      list.forEach((item) => {
+        let obj = {
+          提审时间: item.created,
+          用户ID: item.uid,
+          '充值金额/元': item.amount,
+          充值单号: item.thirdId,
+          审核状态: this.statusMap[item.status]
+        };
+        formatList.push(obj);
+      });
+      myUtils.json2excel(formatList);
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 125px;
+      }
+
+      .date-input {
+        width: 360px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .table {
+        margin-top: 24px !important;
+
+        .master-pic {
+          width: auto;
+          height: 36px;
+        }
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+}
+</style>

+ 461 - 0
src/view/fund/balance-list.vue

@@ -0,0 +1,461 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <!-- tab -->
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">排序方式:</div>
+              <el-select
+                v-model="filter.lockedDesc"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option label="按照余额" :value="false"> </el-option>
+                <el-option label="按照锁仓值" :value="true"> </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">最大值:</div>
+              <el-input
+                class="input"
+                v-model="filter.max"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+            <div class="filter-item">
+              <div class="label">最小值:</div>
+              <el-input
+                class="input"
+                v-model="filter.min"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+            <div class="filter-item">
+              <div class="label">锁仓最大值:</div>
+              <el-input
+                class="input"
+                v-model="filter.maxLocked"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+            <div class="filter-item">
+              <div class="label">锁仓最小值:</div>
+              <el-input
+                class="input"
+                v-model="filter.minLocked"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+            <!-- <button
+              class="search"
+              style="margin-left: 60px"
+              @click="order2excel"
+            >
+              导出
+            </button> -->
+          </div>
+        </div>
+        <el-table
+          :data="list"
+          class="order-table table no-border-table"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            prop="uid"
+            align="center"
+            label="用户ID"
+          ></el-table-column>
+          <el-table-column
+            prop="balance"
+            align="center"
+            label="余额余额"
+          ></el-table-column>
+          <el-table-column
+            prop="locked"
+            align="center"
+            label="锁仓余额余额"
+          ></el-table-column>
+          <el-table-column label="操作" align="center" width="160">
+            <div
+              slot-scope="scope"
+              style="display: flex; justify-content: center"
+            >
+              <div style="display: flex; justify-content: center">
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="toDetail(scope.row.uid)"
+                >
+                  用户详情
+                </button>
+              </div>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <el-dialog
+      :show-close="false"
+      :close-on-click-modal="false"
+      title="生成中..."
+      :visible.sync="showProgressDialog"
+      width="30%"
+      center
+    >
+      <el-progress
+        :percentage="progress"
+        :text-inside="true"
+        :stroke-width="18"
+      ></el-progress>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+import myUtils from '../../components/common/whatever2excel';
+import { role, roleMap } from '@/config.js';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceRecord',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '用户余额列表'
+      },
+      filter: {
+        lockedDesc: false,
+        min: null,
+        max: null,
+        minLocked: null,
+        maxLocked: null
+      },
+      payType: [
+        // {
+        //   name: '全部',
+        //   id: 0
+        // },
+        {
+          name: '订单支付',
+          id: 2
+        },
+        {
+          name: '充值余额',
+          id: 3
+        }
+      ],
+      roleMap: roleMap,
+      tabActive: 1,
+      statusType: [],
+      list: [], // 列表
+      date: [],
+      showProgressDialog: false,
+      progress: 0,
+      payTypeMap: {
+        2: '订单支付',
+        3: '充值余额'
+      }
+    };
+  },
+
+  mounted() {
+    // this.statusType = this.hzType;
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取列表
+    getList() {
+      // this.filter.begin = this.date[0] || '';
+      // this.filter.end = this.date[1] || '';
+      this.filter.min = this.filter.min || null;
+      this.filter.max = this.filter.max || null;
+      this.filter.minLocked = this.filter.minLocked || null;
+      this.filter.maxLocked = this.filter.maxLocked || null;
+      this.loading++;
+      this.httpGet(this.$root.getBalanceRecordList, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        lockedDesc: false,
+        min: null,
+        max: null,
+        minLocked: null,
+        maxLocked: null
+      };
+      this.date = [];
+      this.getList();
+    },
+    // 用户详情
+    toDetail(uid) {
+      window.open('user-detail?uid=' + uid, true);
+      // this.$router.push({
+      //   name: 'userDetail',
+      //   query: {
+      //     uid
+      //   }
+      // });
+    },
+    async order2excel() {
+      this.loading++;
+      let list = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      };
+      await this.httpGet(this.$root.getWxPayList, data).then(
+        (res) => {
+          this.loading--;
+          totalPage = Math.ceil(parseInt(res.total) / this.size);
+        },
+        () => {
+          this.loading--;
+        }
+      );
+      this.showProgressDialog = true;
+      this.progress = 0;
+      await this.getAllPages(totalPage, list).then(
+        () => {
+          this.showProgressDialog = false;
+          this.jsonFormatAndToExcel(list);
+        },
+        (err) => {
+          console.error(err);
+          this.showProgressDialog = false;
+        }
+      );
+    },
+    async getAllPages(totalPage, list) {
+      for (let i = 1; i <= totalPage; i++) {
+        let data = {
+          page: i,
+          size: this.size,
+          ...this.filter
+        };
+        await this.httpGet(this.$root.getWxPayList, data).then((res) => {
+          list.push(...res.list);
+          this.progress = Math.floor((i / totalPage) * 100);
+          console.log('page' + i, list.length);
+        });
+        // console.log(5555, list);
+      }
+    },
+    jsonFormatAndToExcel(list) {
+      let formatList = [];
+      list.forEach((item) => {
+        let obj = {
+          用户ID: item.uid,
+          金额: item.amount,
+          类型: this.payTypeMap[item.payType],
+          关联单号: item.oid,
+          时间: item.created
+        };
+        formatList.push(obj);
+      });
+      myUtils.json2excel(formatList);
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 125px;
+      }
+
+      .date-input {
+        width: 360px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+}
+
+.tabs {
+  width: 100%;
+  background: #fff;
+  height: 60px;
+  flex-x(flex-start);
+  padding: 0 30px;
+  box-sizing: border-box;
+  margin-top: 8px;
+  flex-shrink: 0;
+
+  .tab {
+    background: #fff;
+    cursor: pointer;
+    padding: 0 15px;
+    position: relative;
+    width: auto;
+    margin-right: 100px;
+    height: 100%;
+    flex-x(center);
+    word(16px, #999);
+
+    &.active {
+      word(16px, #333);
+
+      .tab-line {
+        width: 100%;
+        position: absolute;
+        background: #4678E6;
+        height: 4px;
+        border-radius: 2px;
+        left: 0;
+        bottom: 3px;
+      }
+    }
+  }
+}
+</style>

+ 588 - 0
src/view/fund/balance-record.vue

@@ -0,0 +1,588 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="tabs">
+      <div
+        class="tab"
+        :class="{ active: tabActive === item.value }"
+        v-for="item in moneyType"
+        :key="item.value"
+        @click="tabChange(item.value)"
+      >
+        {{ item.name }}
+        <div class="tab-line"></div>
+      </div>
+    </div>
+    <div class="container">
+      <!-- tab -->
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <!-- <div class="filter-item">
+              <div class="label">货币类型:</div>
+              <el-select
+                v-model="filter.genre"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in moneyType"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div> -->
+
+            <div class="filter-item">
+              <div class="label">变动类型:</div>
+              <el-select
+                v-model="filter.fundType"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in statusType"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">用户ID:</div>
+              <el-input
+                class="input"
+                v-model="filter.uid"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">申请时间:</div>
+              <el-date-picker
+                v-model="date"
+                type="datetimerange"
+                align="right"
+                unlink-panels
+                class="date-input"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                :default-time="['00:00:00', '23:59:59']"
+                size="small"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+            <button class="search" style="margin-left: 60px" @click="order2excel">导出</button>
+          </div>
+        </div>
+        <el-table
+          :data="list"
+          class="order-table table no-border-table"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            prop="uid"
+            align="center"
+            label="用户ID"
+          ></el-table-column>
+          <el-table-column prop="genre" align="center" label="货币类型">
+            <div>
+              {{ moneyMap[tabActive] }}
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="describe"
+            align="center"
+            label="描述"
+          ></el-table-column>
+          <el-table-column
+            prop="fid"
+            align="center"
+            label="发起人ID"
+          ></el-table-column>
+          <el-table-column
+            prop="amount"
+            align="center"
+            label="额度"
+          ></el-table-column>
+          <el-table-column
+            prop="BeforeAmount"
+            align="center"
+            label="操作前额度/元"
+          ></el-table-column>
+          <el-table-column
+            prop="created"
+            align="center"
+            label="创建时间"
+          ></el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <el-dialog
+      :show-close="false"
+      :close-on-click-modal="false"
+      title="生成中..."
+      :visible.sync="showProgressDialog"
+      width="30%"
+      center
+    >
+      <el-progress
+        :percentage="progress"
+        :text-inside="true"
+        :stroke-width="18"
+      ></el-progress>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+import myUtils from '../../components/common/whatever2excel';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceRecord',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '变动记录'
+      },
+      filter: {
+        uid: null,
+        fundType: null
+      },
+      tabActive: 1,
+      statusType: [],
+      moneyType: [
+        {
+          name: '绿值',
+          value: 1
+        },
+        {
+          name: '绿通',
+          value: 2
+        },
+        {
+          name: '余额',
+          value: 3
+        }
+      ],
+      moneyMap: {
+        1: '绿值',
+        2: '绿通',
+        3: '余额'
+      },
+      hzType: [],
+      hqType: [],
+      balanceType: [],
+      tgType: [],
+      list: [], // 列表
+      date: [],
+      showProgressDialog: false,
+      progress: 0
+    };
+  },
+
+  mounted() {
+    this.statusType = this.hzType;
+    // 获取列表
+    this.getFundTypeMap();
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    tabChange(val) {
+      this.filter = {
+        fundType: null,
+        uid: null
+      };
+      switch (val) {
+        case 1:
+          this.statusType = this.hzType;
+          break;
+        case 2:
+          this.statusType = this.hqType;
+          break;
+        case 3:
+          this.statusType = this.balanceType;
+          break;
+        default:
+          return;
+      }
+      this.tabActive = val;
+      this.currentPage = 1;
+      this.getList();
+    },
+    getFundTypeMap() {
+      this.loading++;
+      this.httpGet(this.$root.getFundTypeMap, {}).then(
+        (res) => {
+          this.loading--;
+          // this.typeMap = res.balanceLog;
+          let hzType = [
+            {
+              name: '全部',
+              value: ''
+            }
+          ];
+          for (let key in res.balanceLog.integral) {
+            hzType.push({
+              name: res.balanceLog.integral[key],
+              value: key
+            });
+          }
+          this.hzType = hzType;
+          let hqType = [
+            {
+              name: '全部',
+              value: ''
+            }
+          ];
+          for (let key in res.balanceLog.gold) {
+            hqType.push({
+              name: res.balanceLog.gold[key],
+              value: key
+            });
+          }
+          this.hqType = hqType;
+          let balanceType = [
+            {
+              name: '全部',
+              value: ''
+            }
+          ];
+          for (let key in res.balanceLog.balance) {
+            balanceType.push({
+              name: res.balanceLog.balance[key],
+              value: key
+            });
+          }
+          this.balanceType = balanceType;
+          this.statusType = this.hzType;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 获取列表
+    getList() {
+      this.filter.begin = this.date[0] || '';
+      this.filter.end = this.date[1] || '';
+      this.loading++;
+      let url = '';
+      switch (this.tabActive) {
+        case 1:
+          url = 'getIntegralList';
+          break;
+        case 2:
+          url = 'getGoldList';
+          break;
+        case 3:
+          url = 'getBalance';
+          break;
+        default:
+          return;
+      }
+      this.httpGet(this.$root[url], {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        uid: null,
+        fundType: null
+      };
+      this.date = [];
+      this.getList();
+    },
+    async order2excel() {
+      this.loading++;
+      let list = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      };
+      let url = '';
+      switch (this.tabActive) {
+        case 1:
+          url = 'getIntegralList';
+          break;
+        case 2:
+          url = 'getGoldList';
+          break;
+        case 3:
+          url = 'getBalance';
+          break;
+        default:
+          return;
+      }
+      await this.httpGet(this.$root[url], data).then(
+        (res) => {
+          this.loading--;
+          totalPage = Math.ceil(parseInt(res.total) / this.size);
+        },
+        () => {
+          this.loading--;
+        }
+      );
+      this.showProgressDialog = true;
+      this.progress = 0;
+      await this.getAllPages(totalPage, list).then(
+        () => {
+          this.showProgressDialog = false;
+          this.jsonFormatAndToExcel(list);
+        },
+        (err) => {
+          console.error(err);
+          this.showProgressDialog = false;
+        }
+      );
+    },
+    async getAllPages(totalPage, list) {
+      for (let i = 1; i <= totalPage; i++) {
+        let data = {
+          page: i,
+          size: this.size,
+          ...this.filter
+        };
+        let url = '';
+        switch (this.tabActive) {
+          case 1:
+            url = 'getIntegralList';
+            break;
+          case 2:
+            url = 'getGoldList';
+            break;
+          case 3:
+            url = 'getBalance';
+            break;
+          default:
+            return;
+        }
+        await this.httpGet(this.$root[url], data).then((res) => {
+          list.push(...res.list);
+          this.progress = Math.floor((i / totalPage) * 100);
+          console.log('page' + i, list.length);
+        });
+        // console.log(5555, list);
+      }
+    },
+    jsonFormatAndToExcel(list) {
+      let formatList = [];
+      list.forEach((item) => {
+        let obj = {
+          用户ID: item.uid,
+          货币类型: this.moneyMap[this.tabActive],
+          描述: item.describe,
+          关联ID: item.fid,
+          额度: item.amount,
+          '操作前额度/元': item.BeforeAmount,
+          创建时间: item.created
+        };
+        formatList.push(obj);
+      });
+      myUtils.json2excel(formatList);
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 125px;
+      }
+
+      .date-input {
+        width: 360px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+}
+
+.tabs {
+  width: 100%;
+  background: #fff;
+  height: 60px;
+  flex-x(flex-start);
+  padding: 0 30px;
+  box-sizing: border-box;
+  margin-top: 8px;
+  flex-shrink: 0;
+
+  .tab {
+    background: #fff;
+    cursor: pointer;
+    padding: 0 15px;
+    position: relative;
+    width: auto;
+    margin-right: 100px;
+    height: 100%;
+    flex-x(center);
+    word(16px, #999);
+
+    &.active {
+      word(16px, #333);
+
+      .tab-line {
+        width: 100%;
+        position: absolute;
+        background: #4678E6;
+        height: 4px;
+        border-radius: 2px;
+        left: 0;
+        bottom: 3px;
+      }
+    }
+  }
+}
+</style>

+ 310 - 0
src/view/fund/financial-reconciliation.vue

@@ -0,0 +1,310 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">财务类型:</div>
+              <el-select v-model="filter.genre" size="small" class="select" style="width: 160px;" placeholder="请选择">
+                <el-option v-for="item in statusType" :key="item.name" :label="item.name" :value="item.name">
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">申请时间:</div>
+              <el-date-picker v-model="date" type="datetimerange" align="right" unlink-panels class="date-input"
+                range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss"
+                :default-time="['00:00:00', '23:59:59']" size="small">
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+          </div>
+        </div>
+        <el-table :data="list" class="table no-border-table" ref="table" :header-cell-style="{
+          border: 'none',
+          color: '#333',
+          background: '#f6f6f6',
+          borderBottom: '1px solid #E8E8E8',
+          height: '54px',
+        }" :row-style="{
+  height: '54px',
+}">
+          <el-table-column prop="genre" align="center" label="财务类型"></el-table-column>
+          <el-table-column prop="amount" align="center" label="金额/元"></el-table-column>
+          <el-table-column prop="time" align="center" label="查询时间段">
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination @current-change="handleCurrentChange" :current-page.sync="currentPage" background
+          layout="total, prev, pager, next, jumper" :page-size="size" :total="total"></el-pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'financialReconciliation',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '财务对账'
+      },
+      filter: {
+        genre: '微信总收入'
+      },
+      statusType: [
+        // {
+        //   name: '全部',
+        //   id: 0
+        // },
+        {
+          name: '微信总收入'
+        },
+        {
+          name: '微信购买收入'
+        },
+        {
+          name: '微信购买收入-平台'
+        },
+        {
+          name: '微信购买收入-多商户'
+        },
+        {
+          name: '微信充值'
+        },
+        {
+          name: '线下充值'
+        },
+        {
+          name: '积分奖励'
+        },
+        {
+          name: '绿通奖励'
+        }, 
+        {
+          name: '余额总量'
+        }
+        // {
+        //   name: '大健康总收入'
+        // }
+        // {
+        //   name: '大健康微信购买收入'
+        // },
+        // {
+        //   name: '大健康支付宝购买收入'
+        // }
+      ],
+
+      statusMap: {
+        1: '微信收入',
+        2: '推荐奖励金额',
+        3: '级差奖励金额',
+        5: '团队奖励金额'
+      },
+      typeMap: {},
+      typeList: [],
+      list: [], // 用户列表
+      date: []
+    };
+  },
+
+  mounted() {
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    getFundTypeMap() {
+      this.loading++;
+      this.httpGet(this.$root.getFundTypeMap, {}).then(
+        (res) => {
+          this.loading--;
+          // this.typeMap = res.balanceLog;
+          // let list = [
+          //   {
+          //     name: '全部',
+          //     value: ''
+          //   }
+          // ];
+          // for (let key in res.balanceLog) {
+          //   list.push({
+          //     name: res.balanceLog[key],
+          //     value: key
+          //   });
+          // }
+          // this.typeList = list;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 获取提现列表
+    getList() {
+      this.loading++;
+      setTimeout(() => {
+        this.loading--;
+      }, 500);
+
+      this.filter.begin = this.date[0] || '';
+      this.filter.end = this.date[1] || '';
+      // return;
+      this.loading++;
+      this.httpGet(this.$root.getFinancialCounting, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = [
+            {
+              amount: res.amount,
+              genre: this.filter.genre,
+              time: this.filter.begin + ' - ' + this.filter.end
+            }
+          ];
+          // this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        genre: '微信总收入'
+      };
+      this.date = [];
+      this.getList();
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 125px;
+      }
+
+      .date-input {
+        width: 360px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+}
+</style>

+ 461 - 0
src/view/fund/gold-list.vue

@@ -0,0 +1,461 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <!-- tab -->
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">排序方式:</div>
+              <el-select
+                v-model="filter.lockedDesc"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option label="按照余额" :value="false"> </el-option>
+                <el-option label="按照锁仓值" :value="true"> </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">最大值:</div>
+              <el-input
+                class="input"
+                v-model="filter.max"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+            <div class="filter-item">
+              <div class="label">最小值:</div>
+              <el-input
+                class="input"
+                v-model="filter.min"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+            <div class="filter-item">
+              <div class="label">锁仓最大值:</div>
+              <el-input
+                class="input"
+                v-model="filter.maxLocked"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+            <div class="filter-item">
+              <div class="label">锁仓最小值:</div>
+              <el-input
+                class="input"
+                v-model="filter.minLocked"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+            <!-- <button
+              class="search"
+              style="margin-left: 60px"
+              @click="order2excel"
+            >
+              导出
+            </button> -->
+          </div>
+        </div>
+        <el-table
+          :data="list"
+          class="order-table table no-border-table"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            prop="uid"
+            align="center"
+            label="用户ID"
+          ></el-table-column>
+          <el-table-column
+            prop="balance"
+            align="center"
+            label="绿通余额"
+          ></el-table-column>
+          <el-table-column
+            prop="locked"
+            align="center"
+            label="锁仓绿通余额"
+          ></el-table-column>
+          <el-table-column label="操作" align="center" width="160">
+            <div
+              slot-scope="scope"
+              style="display: flex; justify-content: center"
+            >
+              <div style="display: flex; justify-content: center">
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="toDetail(scope.row.uid)"
+                >
+                  用户详情
+                </button>
+              </div>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <el-dialog
+      :show-close="false"
+      :close-on-click-modal="false"
+      title="生成中..."
+      :visible.sync="showProgressDialog"
+      width="30%"
+      center
+    >
+      <el-progress
+        :percentage="progress"
+        :text-inside="true"
+        :stroke-width="18"
+      ></el-progress>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+import myUtils from '../../components/common/whatever2excel';
+import { role, roleMap } from '@/config.js';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceRecord',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '用户绿通列表'
+      },
+      filter: {
+        lockedDesc: false,
+        min: null,
+        max: null,
+        minLocked: null,
+        maxLocked: null
+      },
+      payType: [
+        // {
+        //   name: '全部',
+        //   id: 0
+        // },
+        {
+          name: '订单支付',
+          id: 2
+        },
+        {
+          name: '充值余额',
+          id: 3
+        }
+      ],
+      roleMap: roleMap,
+      tabActive: 1,
+      statusType: [],
+      list: [], // 列表
+      date: [],
+      showProgressDialog: false,
+      progress: 0,
+      payTypeMap: {
+        2: '订单支付',
+        3: '充值余额'
+      }
+    };
+  },
+
+  mounted() {
+    // this.statusType = this.hzType;
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取列表
+    getList() {
+      // this.filter.begin = this.date[0] || '';
+      // this.filter.end = this.date[1] || '';
+      this.filter.min = this.filter.min || null;
+      this.filter.max = this.filter.max || null;
+      this.filter.minLocked = this.filter.minLocked || null;
+      this.filter.maxLocked = this.filter.maxLocked || null;
+      this.loading++;
+      this.httpGet(this.$root.getGoldRecordList, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        lockedDesc: false,
+        min: null,
+        max: null,
+        minLocked: null,
+        maxLocked: null
+      };
+      this.date = [];
+      this.getList();
+    },
+    // 用户详情
+    toDetail(uid) {
+      window.open('user-detail?uid=' + uid, true);
+      // this.$router.push({
+      //   name: 'userDetail',
+      //   query: {
+      //     uid
+      //   }
+      // });
+    },
+    async order2excel() {
+      this.loading++;
+      let list = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      };
+      await this.httpGet(this.$root.getWxPayList, data).then(
+        (res) => {
+          this.loading--;
+          totalPage = Math.ceil(parseInt(res.total) / this.size);
+        },
+        () => {
+          this.loading--;
+        }
+      );
+      this.showProgressDialog = true;
+      this.progress = 0;
+      await this.getAllPages(totalPage, list).then(
+        () => {
+          this.showProgressDialog = false;
+          this.jsonFormatAndToExcel(list);
+        },
+        (err) => {
+          console.error(err);
+          this.showProgressDialog = false;
+        }
+      );
+    },
+    async getAllPages(totalPage, list) {
+      for (let i = 1; i <= totalPage; i++) {
+        let data = {
+          page: i,
+          size: this.size,
+          ...this.filter
+        };
+        await this.httpGet(this.$root.getWxPayList, data).then((res) => {
+          list.push(...res.list);
+          this.progress = Math.floor((i / totalPage) * 100);
+          console.log('page' + i, list.length);
+        });
+        // console.log(5555, list);
+      }
+    },
+    jsonFormatAndToExcel(list) {
+      let formatList = [];
+      list.forEach((item) => {
+        let obj = {
+          用户ID: item.uid,
+          金额: item.amount,
+          类型: this.payTypeMap[item.payType],
+          关联单号: item.oid,
+          时间: item.created
+        };
+        formatList.push(obj);
+      });
+      myUtils.json2excel(formatList);
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 125px;
+      }
+
+      .date-input {
+        width: 360px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+}
+
+.tabs {
+  width: 100%;
+  background: #fff;
+  height: 60px;
+  flex-x(flex-start);
+  padding: 0 30px;
+  box-sizing: border-box;
+  margin-top: 8px;
+  flex-shrink: 0;
+
+  .tab {
+    background: #fff;
+    cursor: pointer;
+    padding: 0 15px;
+    position: relative;
+    width: auto;
+    margin-right: 100px;
+    height: 100%;
+    flex-x(center);
+    word(16px, #999);
+
+    &.active {
+      word(16px, #333);
+
+      .tab-line {
+        width: 100%;
+        position: absolute;
+        background: #4678E6;
+        height: 4px;
+        border-radius: 2px;
+        left: 0;
+        bottom: 3px;
+      }
+    }
+  }
+}
+</style>

+ 435 - 0
src/view/fund/hq-record.vue

@@ -0,0 +1,435 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">货币类型:</div>
+              <el-select
+                v-model="filter.genre"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in moneyType"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">变动类型:</div>
+              <el-select
+                v-model="filter.genre"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in statusType"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">用户ID:</div>
+              <el-input
+                class="input"
+                v-model="filter.uid"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">申请时间:</div>
+              <el-date-picker
+                v-model="date"
+                type="daterange"
+                align="right"
+                unlink-panels
+                class="date-input"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                :default-time="['00:00:00', '23:59:59']"
+                size="small"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+          </div>
+        </div>
+        <el-table
+          :data="list"
+          class="order-table table no-border-table"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="用户ID"
+          ></el-table-column>
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="货币类型"
+          ></el-table-column>
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="变动类型"
+          ></el-table-column>
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="额度"
+          ></el-table-column>
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="操作后额度/元"
+          ></el-table-column>
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="创建时间"
+          ></el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceRecord',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '变动记录'
+      },
+      filter: {},
+      moneyType: [
+        {
+          name: '全部',
+          value: 0
+        },
+        {
+          name: '积分',
+          value: 1
+        },
+        {
+          name: '绿通',
+          value: 2
+        },
+        {
+          name: '余额',
+          value: 3
+        }
+      ],
+
+      hzType: [
+        {
+          name: '打赏客户获得积分',
+          value: 6
+        },
+        {
+          name: '打赏商家获得积分',
+          value: 7
+        },
+        {
+          name: '新用户注册奖励冻结积分',
+          value: 21
+        },
+        {
+          name: '自购奖励',
+          value: 22
+        },
+        {
+          name: '购买直推分润',
+          value: 23
+        },
+        {
+          name: '购买级差分润',
+          value: 25
+        },
+        {
+          name: '购买平级分润',
+          value: 26
+        }
+      ],
+      hqType: [
+        {
+          name: '华金互转(转出)',
+          value: 13
+        },
+        {
+          name: '华金互转(接收)',
+          value: 15
+        },
+        {
+          name: '华金互转系统手续费',
+          value: 16
+        },
+        {
+          name: '华金互转直属分公司手续费',
+          value: 17
+        },
+        {
+          name: '华金互转销毁金额',
+          value: 18
+        },
+        {
+          name: '每日空投华金',
+          value: 19
+        },
+        {
+          name: '打赏级差奖励',
+          value: 30
+        },
+        {
+          name: '打赏平级奖励',
+          value: 31
+        },
+        {
+          name: '打赏客户上级级差奖励',
+          value: 32
+        },
+        {
+          name: '打赏客户上级平级奖励',
+          value: 33
+        }
+      ],
+      balanceType: [
+        {
+          name: '余额支付',
+          value: 1
+        },
+        {
+          name: '线下充值余额',
+          value: 2
+        },
+        {
+          name: '充值余额',
+          value: 3
+        },
+        {
+          name: '余额互转(转出)',
+          value: 8
+        },
+        {
+          name: '余额互转(接收)',
+          value: 9
+        },
+        {
+          name: '余额互转系统手续费',
+          value: 10
+        },
+        {
+          name: '余额互转直属分公司手续费',
+          value: 11
+        },
+        {
+          name: '余额互转销毁金额',
+          value: 12
+        }
+      ],
+
+      statusMap: {
+        1: '微信收入',
+        2: '推荐奖励金额',
+        3: '级差奖励金额',
+        5: '团队奖励金额'
+      },
+      list: [], // 列表
+      date: []
+    };
+  },
+
+  mounted() {
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取列表
+    getList() {
+      this.filter.begin = this.date[0] || '';
+      this.filter.end = this.date[1] || '';
+      this.loading++;
+      this.httpGet(this.$root.getFinancialCounting, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {};
+      this.date = [];
+      this.getList();
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 125px;
+      }
+
+      .date-input {
+        width: 360px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+}
+</style>

+ 407 - 0
src/view/fund/hz-record.vue

@@ -0,0 +1,407 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">货币类型:</div>
+              <el-select
+                v-model="filter.genre"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in moneyType"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">变动类型:</div>
+              <el-select
+                v-model="filter.genre"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in statusType"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">用户ID:</div>
+              <el-input
+                class="input"
+                v-model="filter.uid"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">申请时间:</div>
+              <el-date-picker
+                v-model="date"
+                type="daterange"
+                align="right"
+                unlink-panels
+                class="date-input"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                :default-time="['00:00:00', '23:59:59']"
+                size="small"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+          </div>
+        </div>
+        <el-table
+          :data="list"
+          class="order-table table no-border-table"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="用户ID"
+          ></el-table-column>
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="货币类型"
+          ></el-table-column>
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="变动类型"
+          ></el-table-column>
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="额度"
+          ></el-table-column>
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="操作后额度/元"
+          ></el-table-column>
+          <el-table-column
+            prop="genre"
+            align="center"
+            label="创建时间"
+          ></el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceRecord',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '变动记录'
+      },
+      filter: {},
+      moneyType: [
+        {
+          name: '全部',
+          value: 0
+        },
+        {
+          name: '积分',
+          value: 1
+        },
+        {
+          name: '绿通',
+          value: 2
+        },
+        {
+          name: '余额',
+          value: 3
+        }
+      ],
+
+      statusType: [
+        {
+          name: '全部',
+          id: 0
+        },
+        {
+          name: '注册赠送积分',
+          value: 1
+        },
+        {
+          name: '本人支付',
+          value: 2
+        },
+        {
+          name: '下级购买奖励积分',
+          value: 3
+        },
+        {
+          name: '商家打赏积分(接收方)',
+          value: 4
+        },
+        {
+          name: '商家打赏本人奖励积分',
+          value: 5
+        },
+        {
+          name: '每日空投扣除积分',
+          value: 6
+        },
+        {
+          name: '后台设置积分',
+          value: 7
+        },
+        {
+          name: '每日空投绿通',
+          value: 8
+        },
+        {
+          name: '下级购买奖励积分',
+          value: 3
+        },
+        {
+          name: '注册赠送积分',
+          value: 1
+        },
+        {
+          name: '本人支付',
+          value: 2
+        },
+        {
+          name: '下级购买奖励积分',
+          value: 3
+        },
+        {
+          name: '注册赠送积分',
+          value: 1
+        },
+        {
+          name: '本人支付',
+          value: 2
+        },
+        {
+          name: '下级购买奖励积分',
+          value: 3
+        },
+        {
+          name: '注册赠送积分',
+          value: 1
+        },
+        {
+          name: '本人支付',
+          value: 2
+        },
+        {
+          name: '下级购买奖励积分',
+          value: 3
+        }
+      ],
+
+      statusMap: {
+        1: '微信收入',
+        2: '推荐奖励金额',
+        3: '级差奖励金额',
+        5: '团队奖励金额'
+      },
+      list: [], // 列表
+      date: []
+    };
+  },
+
+  mounted() {
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取列表
+    getList() {
+      this.filter.begin = this.date[0] || '';
+      this.filter.end = this.date[1] || '';
+      this.loading++;
+      this.httpGet(this.$root.getFinancialCounting, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {};
+      this.date = [];
+      this.getList();
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 125px;
+      }
+
+      .date-input {
+        width: 360px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+}
+</style>

+ 461 - 0
src/view/fund/integral-list.vue

@@ -0,0 +1,461 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <!-- tab -->
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">排序方式:</div>
+              <el-select
+                v-model="filter.lockedDesc"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option label="按照余额" :value="false"> </el-option>
+                <el-option label="按照锁仓值" :value="true"> </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">最大值:</div>
+              <el-input
+                class="input"
+                v-model="filter.max"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+            <div class="filter-item">
+              <div class="label">最小值:</div>
+              <el-input
+                class="input"
+                v-model="filter.min"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+            <div class="filter-item">
+              <div class="label">锁仓最大值:</div>
+              <el-input
+                class="input"
+                v-model="filter.maxLocked"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+            <div class="filter-item">
+              <div class="label">锁仓最小值:</div>
+              <el-input
+                class="input"
+                v-model="filter.minLocked"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+            <!-- <button
+              class="search"
+              style="margin-left: 60px"
+              @click="order2excel"
+            >
+              导出
+            </button> -->
+          </div>
+        </div>
+        <el-table
+          :data="list"
+          class="order-table table no-border-table"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            prop="uid"
+            align="center"
+            label="用户ID"
+          ></el-table-column>
+          <el-table-column
+            prop="balance"
+            align="center"
+            label="积分余额"
+          ></el-table-column>
+          <el-table-column
+            prop="locked"
+            align="center"
+            label="锁仓积分余额"
+          ></el-table-column>
+          <el-table-column label="操作" align="center" width="160">
+            <div
+              slot-scope="scope"
+              style="display: flex; justify-content: center"
+            >
+              <div style="display: flex; justify-content: center">
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="toDetail(scope.row.uid)"
+                >
+                  用户详情
+                </button>
+              </div>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <el-dialog
+      :show-close="false"
+      :close-on-click-modal="false"
+      title="生成中..."
+      :visible.sync="showProgressDialog"
+      width="30%"
+      center
+    >
+      <el-progress
+        :percentage="progress"
+        :text-inside="true"
+        :stroke-width="18"
+      ></el-progress>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+import myUtils from '../../components/common/whatever2excel';
+import { role, roleMap } from '@/config.js';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceRecord',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '用户积分列表'
+      },
+      filter: {
+        lockedDesc: false,
+        min: null,
+        max: null,
+        minLocked: null,
+        maxLocked: null
+      },
+      payType: [
+        // {
+        //   name: '全部',
+        //   id: 0
+        // },
+        {
+          name: '订单支付',
+          id: 2
+        },
+        {
+          name: '充值余额',
+          id: 3
+        }
+      ],
+      roleMap: roleMap,
+      tabActive: 1,
+      statusType: [],
+      list: [], // 列表
+      date: [],
+      showProgressDialog: false,
+      progress: 0,
+      payTypeMap: {
+        2: '订单支付',
+        3: '充值余额'
+      }
+    };
+  },
+
+  mounted() {
+    // this.statusType = this.hzType;
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取列表
+    getList() {
+      // this.filter.begin = this.date[0] || '';
+      // this.filter.end = this.date[1] || '';
+      this.filter.min = this.filter.min || null;
+      this.filter.max = this.filter.max || null;
+      this.filter.minLocked = this.filter.minLocked || null;
+      this.filter.maxLocked = this.filter.maxLocked || null;
+      this.loading++;
+      this.httpGet(this.$root.getIntegraRecordlList, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        lockedDesc: false,
+        min: null,
+        max: null,
+        minLocked: null,
+        maxLocked: null
+      };
+      this.date = [];
+      this.getList();
+    },
+    // 用户详情
+    toDetail(uid) {
+      window.open('user-detail?uid=' + uid, true);
+      // this.$router.push({
+      //   name: 'userDetail',
+      //   query: {
+      //     uid
+      //   }
+      // });
+    },
+    async order2excel() {
+      this.loading++;
+      let list = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      };
+      await this.httpGet(this.$root.getWxPayList, data).then(
+        (res) => {
+          this.loading--;
+          totalPage = Math.ceil(parseInt(res.total) / this.size);
+        },
+        () => {
+          this.loading--;
+        }
+      );
+      this.showProgressDialog = true;
+      this.progress = 0;
+      await this.getAllPages(totalPage, list).then(
+        () => {
+          this.showProgressDialog = false;
+          this.jsonFormatAndToExcel(list);
+        },
+        (err) => {
+          console.error(err);
+          this.showProgressDialog = false;
+        }
+      );
+    },
+    async getAllPages(totalPage, list) {
+      for (let i = 1; i <= totalPage; i++) {
+        let data = {
+          page: i,
+          size: this.size,
+          ...this.filter
+        };
+        await this.httpGet(this.$root.getWxPayList, data).then((res) => {
+          list.push(...res.list);
+          this.progress = Math.floor((i / totalPage) * 100);
+          console.log('page' + i, list.length);
+        });
+        // console.log(5555, list);
+      }
+    },
+    jsonFormatAndToExcel(list) {
+      let formatList = [];
+      list.forEach((item) => {
+        let obj = {
+          用户ID: item.uid,
+          金额: item.amount,
+          类型: this.payTypeMap[item.payType],
+          关联单号: item.oid,
+          时间: item.created
+        };
+        formatList.push(obj);
+      });
+      myUtils.json2excel(formatList);
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 125px;
+      }
+
+      .date-input {
+        width: 360px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+}
+
+.tabs {
+  width: 100%;
+  background: #fff;
+  height: 60px;
+  flex-x(flex-start);
+  padding: 0 30px;
+  box-sizing: border-box;
+  margin-top: 8px;
+  flex-shrink: 0;
+
+  .tab {
+    background: #fff;
+    cursor: pointer;
+    padding: 0 15px;
+    position: relative;
+    width: auto;
+    margin-right: 100px;
+    height: 100%;
+    flex-x(center);
+    word(16px, #999);
+
+    &.active {
+      word(16px, #333);
+
+      .tab-line {
+        width: 100%;
+        position: absolute;
+        background: #4678E6;
+        height: 4px;
+        border-radius: 2px;
+        left: 0;
+        bottom: 3px;
+      }
+    }
+  }
+}
+</style>

+ 161 - 0
src/view/fund/message-detail.vue

@@ -0,0 +1,161 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <div class="item">
+          <div class="label">发布人ID:</div>
+          <div class="value">{{ info.uid }}</div>
+        </div>
+        <div class="item">
+          <div class="label">联系方式:</div>
+          <div class="value">{{ info.phone }}</div>
+        </div>
+        <div class="item">
+          <div class="label">主题:</div>
+          <div class="value">{{ info.subject }}</div>
+        </div>
+        <div class="item">
+          <div class="label">详情:</div>
+          <div class="value">{{ info.describe }}</div>
+        </div>
+        <div class="item item2">
+          <div class="label">配图:</div>
+          <div class="value">
+            <!-- <img
+              class="img"
+              v-for="(item, index) in info.pics"
+              :src="item"
+              alt=""
+              :key="index"
+            /> -->
+            <el-image
+              class="img"
+              v-for="(item, index) in info.pics"
+              :key="index"
+              :src="item"
+              fit="cover"
+              :preview-src-list="info.pics"
+            >
+            </el-image>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceExamine',
+  data() {
+    return {
+      title: {
+        // 页面标题
+        firstTitile: '消息管理',
+        secondTitle: '消息管理'
+      },
+      loading: 0,
+      info: {}
+    };
+  },
+
+  mounted() {
+    this.id = +this.$route.query.id;
+    // 获取列表
+    this.getInfo();
+  },
+  computed: {},
+  methods: {
+    // 获取列表
+    getInfo() {
+      this.loading++;
+      this.httpGet(this.$root.getMessageDetail, {
+        id: this.id
+      }).then(
+        (res) => {
+          this.loading--;
+          this.info = res;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 60px;
+      border-radius: 2px;
+
+      .item {
+        flex-x(flex-start);
+        word(14px, #666);
+        height: 45px;
+
+        &.item2 {
+          height: auto;
+          padding: 10px 0;
+        }
+
+        .label {
+          width: 150px;
+          line-height: 45px;
+          align-self: flex-start;
+        }
+
+        .zhutu {
+          width: 32px;
+          height: 32px;
+          border-radius: 4px;
+        }
+
+        .img {
+          width: 112px;
+          height: 112px;
+          border-radius: 4px;
+          margin-right: 15px;
+          object-fit: cover;
+        }
+
+        .video {
+          height: 450px;
+        }
+      }
+    }
+  }
+}
+</style>

+ 395 - 0
src/view/fund/message-publish.vue

@@ -0,0 +1,395 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">审核状态:</div>
+              <el-select v-model="filter.way" size="small" class="select" placeholder="请选择">
+                <el-option v-for="item in statusList" :key="item.value" :label="item.name" :value="item.value">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+          </div>
+        </div>
+        <el-table :data="list" class="table no-border-table" ref="table" :header-cell-style="{
+          border: 'none',
+          color: '#333',
+          background: '#f6f6f6',
+          borderBottom: '1px solid #E8E8E8',
+          height: '54px',
+        }" :row-style="{
+  height: '54px',
+}">
+          <el-table-column prop="uid" align="center" label="发布人ID"></el-table-column>
+          <el-table-column prop="subject" align="center" label="主题"></el-table-column>
+          <el-table-column prop="phone" align="center" label="联系电话"></el-table-column>
+          <el-table-column prop="status" align="center" label="状态">
+            <div slot-scope="scope">
+              {{ statusMap[scope.row.way]}}
+            </div>
+          </el-table-column>
+          <el-table-column label="操作" align="center" width="180">
+            <div slot-scope="scope" style="display: flex; justify-content: center">
+              <button size="mini" class="table-btn" @click="handleDelete(scope.row.id)" v-if="scope.row.way !== 1">
+                删除
+              </button>
+              <button size="mini" class="table-btn" @click="handlePass(scope.row.id)" v-if="scope.row.way === 1">
+                通过
+              </button>
+              <button size="mini" class="table-btn" @click="rejectModal(scope.row.id)" v-if="scope.row.way === 1">
+                驳回
+              </button>
+              <button size="mini" class="table-btn" @click="toDetail(scope.row.id)">
+                详情
+              </button>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination @current-change="handleCurrentChange" :current-page.sync="currentPage" background
+          layout="total, prev, pager, next, jumper" :page-size="size" :total="total"></el-pagination>
+      </div>
+      <el-dialog title="确认驳回该订单吗?" width="450px" :visible.sync="rejectVisible">
+        <div class="reject-title"><span>*</span>请填写驳回理由</div>
+        <div style="padding: 0 16px">
+          <div class="remark-box">
+            <textarea rows="8" class="remark" v-model="remark" placeholder="驳回理由"></textarea>
+          </div>
+        </div>
+        <div slot="footer" class="dialog-footer">
+          <!-- <el-button @click.native="reject()" class="cancel-btn">驳 回</el-button> -->
+          <el-button @click.native="rejectVisible = false" class="cancel-btn btn">取 消</el-button>
+          <el-button type="primary" @click.native="handleReject" class="confirm-btn btn">确 定</el-button>
+        </div>
+      </el-dialog>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceExamine',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '消息管理',
+        secondTitle: '消息管理'
+      },
+      filter: {
+        way: -1
+      },
+      statusList: [
+        {
+          name: '全部',
+          value: -1
+        },
+        {
+          name: '审核中',
+          value: 1
+        },
+        {
+          name: '已通过',
+          value: 2
+        }
+      ],
+      statusMap: {
+        1: '审核中',
+        2: '已通过'
+      },
+      list: [], // 用户列表
+      rejectVisible: false,
+      id: null,
+      remark: ''
+    };
+  },
+
+  mounted() {
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取列表
+    getList() {
+      this.loading++;
+      this.httpGet(this.$root.getMessageList, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        way: -1
+      };
+      this.getList();
+    },
+    handleDelete(id) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要删除吗?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpDelete(this.$root.deleteMessage, {
+          id
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    handlePass(id) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要通过吗?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPut(this.$root.passMessage, {
+          id
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    rejectModal(id) {
+      this.rejectVisible = true;
+      this.id = id;
+    },
+    handleReject() {
+      this.loading++;
+      this.httpPut(this.$root.refuseMessage, {
+        id: this.id,
+        remark: this.remark
+      }).then(
+        (res) => {
+          this.rejectVisible = false;
+          this.$message({
+            message: '操作成功',
+            type: 'success'
+          });
+          this.loading--;
+          this.getList();
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    toDetail(id) {
+      this.$router.push({
+        name: 'messageDetail',
+        query: {
+          id
+        }
+      });
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 125px;
+      }
+
+      .date-input {
+        width: 360px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+
+      .table-img {
+        height: 32px;
+        width: 32px;
+        border-radius: 4px;
+        object-fit: fill;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+
+  .reject-title {
+    border-top: 1px solid #eee;
+    padding: 12px 13px 0;
+    word(14px, #666);
+
+    span {
+      color: #FD4545;
+      display: inline-block;
+      width: 15px;
+    }
+  }
+
+  .remark-box {
+    width: 100%;
+    padding-left: 15px;
+    box-sizing: border-box;
+  }
+
+  .remark {
+    border: 1px solid #f1f1f1;
+    width: 100%;
+    margin: 12px 0;
+    padding: 12px;
+    box-sizing: border-box;
+  }
+}
+</style>

+ 273 - 0
src/view/fund/pay-record.vue

@@ -0,0 +1,273 @@
+<template>
+  <div class="record-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">商家ID:</div>
+              <el-input
+                class="input"
+                v-model="filter.sid"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+            <div class="filter-item">
+              <div class="label">商户全称:</div>
+              <el-input
+                class="input"
+                v-model="filter.name"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+            <div class="btn-box">
+              <button class="search" @click="search">筛选</button>
+              <button class="reset" @click="reset">重置</button>
+            </div>
+          </div>
+          <div class="btn" style="padding: 0 15px; width: auto" @click="addPay">
+            +添加收款商户
+          </div>
+        </div>
+        <!-- 表格 -->
+        <el-table
+          :data="list"
+          class="order-table table no-border-table"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            prop="name"
+            align="center"
+            label="商户全称"
+          ></el-table-column>
+          <el-table-column
+            prop="sid"
+            align="center"
+            label="商家ID"
+          ></el-table-column>
+          <el-table-column
+            prop="mid"
+            align="center"
+            label="商户号"
+          ></el-table-column>
+          <el-table-column
+            prop="certSerialNum"
+            align="center"
+            label="证书序列号"
+          ></el-table-column>
+          <el-table-column
+            prop="key"
+            align="center"
+            label="商户APIv3密钥"
+          ></el-table-column>
+          <el-table-column
+            prop="spiltRatio"
+            align="center"
+            label="分账比例/%"
+          ></el-table-column>
+          <el-table-column
+            prop="spiltName"
+            align="center"
+            label="分账接受商户全称"
+          ></el-table-column>
+          <el-table-column
+            prop="spiltMid"
+            align="center"
+            label="分账接受商户号"
+          ></el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import dayjs from 'dayjs';
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'record',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '收款商户',
+        secondTitle: '收款商户'
+      },
+      filter: {
+        sid: null,
+        name: ''
+      },
+      list: []
+    };
+  },
+  mounted() {
+    // 获取列表
+    this.getList();
+  },
+  filters: {
+    // 时间格式化
+    dateFormat(date) {
+      if (!date) return '请选择时间';
+      let day = dayjs(date);
+      return day.format('YYYY-MM-DD HH:mm:ss');
+    }
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取留言板列表
+    getList() {
+      // return;
+      this.loading++;
+      this.httpGet(this.$root.getPayList, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      console.log(this.filter);
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        sid: null,
+        name: ''
+      };
+      this.getList();
+    },
+    addPay() {
+      this.$router.push({
+        name: 'addPay'
+      });
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.record-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 24px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin-bottom: 16px;
+      }
+
+      .import-btn {
+        confirm-btn();
+        height: 32px;
+        padding: 0 15px;
+        white-space: nowrap;
+      }
+
+      // 表格按钮
+      .table-btn {
+        width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+
+    .notice-input {
+      width: 300px;
+      height: 100px;
+    }
+  }
+}
+</style>

+ 613 - 0
src/view/fund/profit-sharing-record.vue

@@ -0,0 +1,613 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">奖励类型</div>
+              <el-select
+                v-model="filter.mode"
+                size="small"
+                class="select"
+                placeholder="请选择"
+                @change="changeMode"
+              >
+                <el-option
+                  v-for="item in rewardType"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">变动类型</div>
+              <el-select
+                v-model="filter.rebateType"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in statusType"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">变动者ID:</div>
+              <el-input
+                class="input"
+                v-model="filter.uid"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">发起者ID:</div>
+              <el-input
+                class="input"
+                v-model="filter.fid"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+            <div class="filter-item">
+              <div class="label">关联订单号:</div>
+              <el-input
+                class="input"
+                v-model="filter.oid"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">创建时间:</div>
+              <el-date-picker
+                v-model="date"
+                type="datetimerange"
+                align="right"
+                unlink-panels
+                class="date-input"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                :default-time="['00:00:00', '23:59:59']"
+                size="small"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+          </div>
+        </div>
+        <div class="filter-box">
+          <div class="btn-box btn-box2">
+            <button
+              class="search"
+              style="margin-left: 60px"
+              @click="order2excel"
+            >
+              导出
+            </button>
+          </div>
+        </div>
+        <el-table
+          :data="list"
+          class="table no-border-table"
+          ref="table"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column prop="created" align="center" label="创建时间">
+            <div slot-scope="scope">
+              {{ scope.row.created | dateFormat }}
+            </div>
+          </el-table-column>
+
+          <el-table-column prop="rebate_type" align="center" label="奖励类型">
+            <div slot-scope="scope">
+              {{ rewardMap[scope.row.mode] }}
+            </div>
+          </el-table-column>
+          <el-table-column prop="describe" align="center" label="变动类型">
+            <!-- <div slot-scope="scope">
+              {{ statusMap[scope.row.rebateType] }}
+            </div> -->
+          </el-table-column>
+          <el-table-column
+            prop="amount"
+            align="center"
+            label="奖励额度"
+          ></el-table-column>
+          <el-table-column
+            prop="uid"
+            align="center"
+            label="变动者ID"
+          ></el-table-column>
+          <el-table-column
+            prop="fid"
+            align="center"
+            label="发起者ID"
+          ></el-table-column>
+          <el-table-column
+            prop="oid"
+            align="center"
+            label="关联单号"
+          ></el-table-column>
+          <el-table-column prop="status" align="center" label="状态">
+            <div slot-scope="scope">
+              {{ scope.row.status === 5 ? "已到账" : "" }}
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <el-dialog
+      :show-close="false"
+      :close-on-click-modal="false"
+      title="生成中..."
+      :visible.sync="showProgressDialog"
+      width="30%"
+      center
+    >
+      <el-progress
+        :percentage="progress"
+        :text-inside="true"
+        :stroke-width="18"
+      ></el-progress>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+import myUtils from '../../components/common/whatever2excel';
+import dayjs from 'dayjs';
+export default {
+  components: {
+    Header
+  },
+  name: 'user-manage',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '分润记录'
+      },
+      filter: {
+        uid: null,
+        fid: null,
+        oid: null,
+        rebateType: null,
+        mode: null
+      },
+      rewardType: [
+        {
+          name: '全部',
+          value: null
+        },
+        {
+          name: '绿值',
+          value: 'integral'
+        },
+        {
+          name: '绿通',
+          value: 'gold'
+        },
+        {
+          name: '余额',
+          value: 'balance'
+        }
+        // {
+        //   name: '糖果',
+        //   value: 'candy'
+        // }
+      ],
+      rewardMap: {
+        integral: '积分',
+        gold: '绿通',
+        balance: '余额'
+        // candy: '糖果'
+      },
+      statusType: [],
+      statusType1: [],
+      statusType2: [],
+      statusType3: [],
+      statusMap: {},
+      list: [], // 用户列表
+      date: [],
+      showProgressDialog: false,
+      progress: 0
+    };
+  },
+  filters: {
+    // 时间格式化
+    dateFormat(date) {
+      if (!date) return '请选择时间';
+      let day = dayjs(date);
+      return day.format('YYYY-MM-DD HH:mm:ss');
+    }
+  },
+  async mounted() {
+    // await this.getType();
+    // 获取列表
+    this.getFundTypeMap();
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // async getType() {
+    //   await this.httpGet(this.$root.typeList, {
+    //     type: 2
+    //   }).then((res) => {
+    //     this.statusType = [
+    //       {
+    //         name: '全部',
+    //         id: null
+    //       }
+    //     ];
+    //     for (let key in res.list) {
+    //       if (key === '8' || key === '51' || key === '52') {
+    //         continue;
+    //       }
+    //       this.statusType.push({
+    //         name: res.list[key],
+    //         id: key
+    //       });
+    //     }
+    //     this.statusMap = res.list;
+    //   });
+    // },
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    getFundTypeMap() {
+      this.loading++;
+      this.httpGet(this.$root.getFundTypeMap, {}).then(
+        (res) => {
+          this.loading--;
+          // this.typeMap = res.balanceLog;
+          let statusType1 = [];
+          for (let key in res.rebateLog.integral) {
+            statusType1.push({
+              name: res.rebateLog.integral[key],
+              value: key
+            });
+          }
+          this.statusType1 = [
+            {
+              name: '全部',
+              value: ''
+            },
+            ...statusType1
+          ];
+          let statusType2 = [];
+          for (let key in res.rebateLog.gold) {
+            statusType2.push({
+              name: res.rebateLog.gold[key],
+              value: key
+            });
+          }
+          this.statusType2 = [
+            {
+              name: '全部',
+              value: ''
+            },
+            ...statusType2
+          ];
+          let statusType3 = [];
+          for (let key in res.rebateLog.balance) {
+            statusType3.push({
+              name: res.rebateLog.balance[key],
+              value: key
+            });
+          }
+          this.statusType3 = [
+            {
+              name: '全部',
+              value: ''
+            },
+            ...statusType3
+          ];
+          this.statusType = [
+            {
+              name: '全部',
+              value: ''
+            },
+            ...statusType1,
+            ...statusType2,
+            ...statusType3
+          ];
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    changeMode(val) {
+      this.filter.rebateType = null;
+      if (val === 'integral') {
+        this.statusType = [
+          ...this.statusType1
+        ];
+      } else if (val === 'gold') {
+        this.statusType = [
+          ...this.statusType2
+        ];
+      } else if (val === 'balance') {
+        this.statusType = [
+          ...this.statusType3
+        ];
+      } else {
+        this.statusType = [
+          ...this.statusType1,
+          ...this.statusType2,
+          ...this.statusType3
+        ];
+      }
+    },
+    // 获取提现列表
+    getList() {
+      this.filter.begin = this.date[0] || '';
+      this.filter.end = this.date[1] || '';
+      this.loading++;
+      this.httpGet(this.$root.getRebateList, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        uid: null,
+        fid: null,
+        oid: null,
+        rebateType: null,
+        mode: ''
+      };
+      this.date = [];
+      this.getList();
+    },
+    async order2excel() {
+      this.loading++;
+      let list = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      };
+      await this.httpGet(this.$root.getRebateList, data).then(
+        (res) => {
+          this.loading--;
+          totalPage = Math.ceil(parseInt(res.total) / this.size);
+        },
+        () => {
+          this.loading--;
+        }
+      );
+      this.showProgressDialog = true;
+      this.progress = 0;
+      await this.getAllPages(totalPage, list).then(
+        () => {
+          this.showProgressDialog = false;
+          this.jsonFormatAndToExcel(list);
+        },
+        (err) => {
+          console.error(err);
+          this.showProgressDialog = false;
+        }
+      );
+    },
+    async getAllPages(totalPage, list) {
+      for (let i = 1; i <= totalPage; i++) {
+        let data = {
+          page: i,
+          size: this.size,
+          ...this.filter
+        };
+        await this.httpGet(this.$root.getRebateList, data).then((res) => {
+          list.push(...res.list);
+          this.progress = Math.floor((i / totalPage) * 100);
+          console.log('page' + i, list.length);
+        });
+        // console.log(5555, list);
+      }
+    },
+    jsonFormatAndToExcel(list) {
+      let formatList = [];
+      list.forEach((item) => {
+        let obj = {
+          创建时间: item.created,
+          奖励类型: this.rewardMap[item.mode],
+          变动类型: item.describe,
+          奖励额度: item.amount,
+          变动者ID: item.uid,
+          发起者ID: item.fid,
+          关联单号: item.oid,
+          状态: item.status === 5 ? '已到账' : ''
+        };
+        formatList.push(obj);
+      });
+      myUtils.json2excel(formatList);
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      .import {
+        flex-x(flex-end);
+        margin-top: 16px;
+
+        .import-btn {
+          confirm-btn();
+          height: 32px;
+          padding: 0 15px;
+          white-space: nowrap;
+        }
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 120px;
+      }
+
+      .date-input {
+        width: 350px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .btn-box2 {
+        width: 100%;
+        flex-x(flex-end);
+        margin-top: 8px;
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+    word(14px, #999);
+
+    span {
+      word(20px, #333);
+      font-weight: 600;
+      margin-left: 3px;
+    }
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+}
+</style>

+ 427 - 0
src/view/fund/reward-inquiry.vue

@@ -0,0 +1,427 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <!-- tab -->
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <!-- <div class="filter-item">
+              <div class="label">类型:</div>
+              <el-select
+                v-model="filter.payType"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in payType"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                >
+                </el-option>
+              </el-select>
+            </div> -->
+
+            <div class="filter-item">
+              <div class="label">商家用户ID:</div>
+              <el-input
+                class="input"
+                v-model="filter.uid"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">查询时间段:</div>
+              <el-date-picker
+                v-model="date"
+                type="datetimerange"
+                align="right"
+                unlink-panels
+                class="date-input"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                :default-time="['00:00:00', '23:59:59']"
+                size="small"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">查询</button>
+            <!-- <button class="reset" @click="reset">重置</button> -->
+            <!-- <button
+              class="search"
+              style="margin-left: 60px"
+              @click="order2excel"
+            >
+              导出
+            </button> -->
+          </div>
+        </div>
+        <el-table
+          :data="list"
+          class="order-table table no-border-table"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            prop="shopName"
+            align="center"
+            label="店铺名称"
+          ></el-table-column>
+          <el-table-column
+            prop="onlineOrder"
+            align="center"
+            label="线上订单营业额"
+          ></el-table-column>
+          <el-table-column
+            prop="onlinePay"
+            align="center"
+            label="线上收款码营业额"
+          ></el-table-column>
+          <el-table-column
+            prop="offline"
+            align="center"
+            label="线下打赏营业额"
+          ></el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <!-- <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div> -->
+    </div>
+    <el-dialog
+      :show-close="false"
+      :close-on-click-modal="false"
+      title="生成中..."
+      :visible.sync="showProgressDialog"
+      width="30%"
+      center
+    >
+      <el-progress
+        :percentage="progress"
+        :text-inside="true"
+        :stroke-width="18"
+      ></el-progress>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+import myUtils from '../../components/common/whatever2excel';
+import { role, roleMap } from '@/config.js';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceRecord',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '打赏查询'
+      },
+      filter: {
+        uid: null,
+        // payType: 2
+      },
+      payType: [
+        // {
+        //   name: '全部',
+        //   id: 0
+        // },
+        {
+          name: '订单支付',
+          id: 2
+        },
+        {
+          name: '充值余额',
+          id: 3
+        }
+      ],
+      roleMap: roleMap,
+      tabActive: 1,
+      statusType: [],
+      list: [], // 列表
+      date: [],
+      showProgressDialog: false,
+      progress: 0,
+      payTypeMap: {
+        2: '订单支付',
+        3: '充值余额'
+      }
+    };
+  },
+
+  mounted() {
+    // this.statusType = this.hzType;
+    // 获取列表
+    // this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取列表
+    getList() {
+      this.filter.start = this.date[0] || '';
+      this.filter.end = this.date[1] || '';
+      this.loading++;
+      this.httpGet(this.$root.getRewardSumList, {
+        // page: this.currentPage,
+        // size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = [res]
+          // this.list = res.list;
+          // this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        uid: null,
+        payType: this.filter.payType
+      };
+      this.date = [];
+      this.getList();
+    },
+    async order2excel() {
+      this.loading++;
+      let list = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      };
+      await this.httpGet(this.$root.getWxPayList, data).then(
+        (res) => {
+          this.loading--;
+          totalPage = Math.ceil(parseInt(res.total) / this.size);
+        },
+        () => {
+          this.loading--;
+        }
+      );
+      this.showProgressDialog = true;
+      this.progress = 0;
+      await this.getAllPages(totalPage, list).then(
+        () => {
+          this.showProgressDialog = false;
+          this.jsonFormatAndToExcel(list);
+        },
+        (err) => {
+          console.error(err);
+          this.showProgressDialog = false;
+        }
+      );
+    },
+    async getAllPages(totalPage, list) {
+      for (let i = 1; i <= totalPage; i++) {
+        let data = {
+          page: i,
+          size: this.size,
+          ...this.filter
+        };
+        await this.httpGet(this.$root.getWxPayList, data).then((res) => {
+          list.push(...res.list);
+          this.progress = Math.floor((i / totalPage) * 100);
+          console.log('page' + i, list.length);
+        });
+        // console.log(5555, list);
+      }
+    },
+    jsonFormatAndToExcel(list) {
+      let formatList = [];
+      list.forEach((item) => {
+        let obj = {
+          用户ID: item.uid,
+          金额: item.amount,
+          类型: this.payTypeMap[item.payType],
+          关联单号: item.oid,
+          时间: item.created
+        };
+        formatList.push(obj);
+      });
+      myUtils.json2excel(formatList);
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 125px;
+      }
+
+      .date-input {
+        width: 360px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+}
+
+.tabs {
+  width: 100%;
+  background: #fff;
+  height: 60px;
+  flex-x(flex-start);
+  padding: 0 30px;
+  box-sizing: border-box;
+  margin-top: 8px;
+  flex-shrink: 0;
+
+  .tab {
+    background: #fff;
+    cursor: pointer;
+    padding: 0 15px;
+    position: relative;
+    width: auto;
+    margin-right: 100px;
+    height: 100%;
+    flex-x(center);
+    word(16px, #999);
+
+    &.active {
+      word(16px, #333);
+
+      .tab-line {
+        width: 100%;
+        position: absolute;
+        background: #4678E6;
+        height: 4px;
+        border-radius: 2px;
+        left: 0;
+        bottom: 3px;
+      }
+    }
+  }
+}
+</style>

+ 423 - 0
src/view/fund/team.vue

@@ -0,0 +1,423 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <!-- tab -->
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">用户身份:</div>
+              <el-select
+                v-model="filter.bonusRole"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in role"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                >
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">用户ID:</div>
+              <el-input
+                class="input"
+                v-model="filter.uid"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">查询时间:</div>
+              <el-date-picker
+                v-model="date"
+                type="datetimerange"
+                align="right"
+                unlink-panels
+                class="date-input"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                :default-time="['00:00:00', '23:59:59']"
+                size="small"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+            <button
+              class="search"
+              style="margin-left: 60px"
+              @click="order2excel"
+            >
+              导出
+            </button>
+          </div>
+        </div>
+        <el-table
+          :data="list"
+          class="order-table table no-border-table"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            prop="uid"
+            align="center"
+            label="用户ID"
+          ></el-table-column>
+          <el-table-column
+            prop="nickname"
+            align="center"
+            label="用户昵称"
+          ></el-table-column>
+          <el-table-column
+            prop="role"
+            align="center"
+            label="用户身份"
+          >
+            <div slot-scope="scope">
+              {{roleMap[scope.row.bonusRole]}}
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="baoTurnover"
+            align="center"
+            label="报单区业绩"
+          ></el-table-column>
+          <el-table-column
+            prop="headTurnover"
+            align="center"
+            label="非报单区业绩"
+          ></el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <el-dialog
+      :show-close="false"
+      :close-on-click-modal="false"
+      title="生成中..."
+      :visible.sync="showProgressDialog"
+      width="30%"
+      center
+    >
+      <el-progress
+        :percentage="progress"
+        :text-inside="true"
+        :stroke-width="18"
+      ></el-progress>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+import myUtils from '../../components/common/whatever2excel';
+import { role, roleMap } from '@/config.js';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceRecord',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '社群业绩'
+      },
+      filter: {
+        uid: null,
+        bonusRole: -1
+      },
+      role: [
+        {
+          name: '全部',
+          id: -1
+        },
+        ...role
+      ],
+      roleMap: roleMap,
+      tabActive: 1,
+      statusType: [],
+      list: [], // 列表
+      date: [],
+      showProgressDialog: false,
+      progress: 0
+    };
+  },
+
+  mounted() {
+    // this.statusType = this.hzType;
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取列表
+    getList() {
+      this.filter.start = this.date[0] || '';
+      this.filter.end = this.date[1] || '';
+      this.loading++;
+      this.httpGet(this.$root.getKpiList, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        uid: null,
+        bonusRole: -1
+      };
+      this.date = [];
+      this.getList();
+    },
+    async order2excel() {
+      this.loading++;
+      let list = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      };
+      await this.httpGet(this.$root.getKpiList, data).then(
+        (res) => {
+          this.loading--;
+          totalPage = Math.ceil(parseInt(res.total) / this.size);
+        },
+        () => {
+          this.loading--;
+        }
+      );
+      this.showProgressDialog = true;
+      this.progress = 0;
+      await this.getAllPages(totalPage, list).then(
+        () => {
+          this.showProgressDialog = false;
+          this.jsonFormatAndToExcel(list);
+        },
+        (err) => {
+          console.error(err);
+          this.showProgressDialog = false;
+        }
+      );
+    },
+    async getAllPages(totalPage, list) {
+      for (let i = 1; i <= totalPage; i++) {
+        let data = {
+          page: i,
+          size: this.size,
+          ...this.filter
+        };
+        await this.httpGet(this.$root.getKpiList, data).then((res) => {
+          list.push(...res.list);
+          this.progress = Math.floor((i / totalPage) * 100);
+          console.log('page' + i, list.length);
+        });
+        // console.log(5555, list);
+      }
+    },
+    jsonFormatAndToExcel(list) {
+      let formatList = [];
+      list.forEach((item) => {
+        let obj = {
+          用户ID: item.uid,
+          用户昵称: item.nickname,
+          用户身份: this.roleMap[item.bonusRole],
+          社群总销售额: item.recentKpi
+        };
+        formatList.push(obj);
+      });
+      myUtils.json2excel(formatList);
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 125px;
+      }
+
+      .date-input {
+        width: 360px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+}
+
+.tabs {
+  width: 100%;
+  background: #fff;
+  height: 60px;
+  flex-x(flex-start);
+  padding: 0 30px;
+  box-sizing: border-box;
+  margin-top: 8px;
+  flex-shrink: 0;
+
+  .tab {
+    background: #fff;
+    cursor: pointer;
+    padding: 0 15px;
+    position: relative;
+    width: auto;
+    margin-right: 100px;
+    height: 100%;
+    flex-x(center);
+    word(16px, #999);
+
+    &.active {
+      word(16px, #333);
+
+      .tab-line {
+        width: 100%;
+        position: absolute;
+        background: #4678E6;
+        height: 4px;
+        border-radius: 2px;
+        left: 0;
+        bottom: 3px;
+      }
+    }
+  }
+}
+</style>

+ 814 - 0
src/view/fund/withdraw.vue

@@ -0,0 +1,814 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">审核状态</div>
+              <el-select
+                v-model="filter.status"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in statusType"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+            <!-- <div class="filter-item">
+              <div class="label">审核状态</div>
+              <el-select
+                v-model="filter.way"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in wayType"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div> -->
+            <div class="filter-item">
+              <div class="label">用户ID:</div>
+              <el-input
+                class="input"
+                v-model="filter.uid"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+            <div class="filter-item">
+              <div class="label">用户姓名:</div>
+              <el-input
+                class="input"
+                style="width: 200px"
+                v-model="filter.name"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+            <div class="filter-item">
+              <div class="label">创建时间:</div>
+              <el-date-picker
+                v-model="date"
+                type="datetimerange"
+                align="right"
+                unlink-panels
+                class="date-input"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                :default-time="['00:00:00', '23:59:59']"
+                size="small"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+          </div>
+        </div>
+        <!-- <div class="filter-box filter-box2">
+          <div class="btn-box btn-box2">
+            <button class="search" @click="batchAuditWithdraw(1)">通过</button>
+            <button class="reset" @click="batchAuditWithdraw(2)">驳回</button>
+          </div>
+          <div class="btn-box btn-box2">
+            <button class="search" @click="order2excel">一键到账</button>
+            <button class="reset" @click="order2excel">导出</button>
+          </div>
+        </div> -->
+        <el-table
+          :data="list"
+          class="table no-border-table"
+          ref="table"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+          @selection-change="handleSelectionChange"
+        >
+          <!-- <el-table-column type="selection" width="55" :selectable="selectable">
+          </el-table-column> -->
+          <el-table-column prop="created" align="center" label="提审时间">
+            <div slot-scope="scope">
+              {{ scope.row.created | dateFormat }}
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="uid"
+            align="center"
+            label="用户ID"
+          ></el-table-column>
+          <el-table-column
+            prop="balance"
+            align="center"
+            label="提现金额/元"
+          ></el-table-column>
+          <el-table-column prop="actual" align="center" label="到账金额/元">
+            <!-- <div slot-scope="scope">
+              {{ statusMap[scope.row.status] }}
+            </div> -->
+          </el-table-column>
+          <el-table-column
+            prop="name"
+            align="center"
+            label="姓名"
+          ></el-table-column>
+          <el-table-column prop="oid" align="center" label="审核状态">
+            <div slot-scope="scope">
+              {{ statusMap[scope.row.status] }}
+            </div></el-table-column
+          >
+          <el-table-column label="操作" align="center" width="300">
+            <div
+              slot-scope="scope"
+              style="display: flex; justify-content: center"
+            >
+              <div
+                style="display: flex; justify-content: center"
+                v-if="scope.row.status === 1"
+              >
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="passWithdraw(scope.row.id)"
+                >
+                  通过
+                </button>
+              </div>
+              <div
+                style="display: flex; justify-content: center"
+                v-if="scope.row.status === 1"
+              >
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="refuteWithdraw(scope.row.id)"
+                >
+                  驳回
+                </button>
+              </div>
+              <div style="display: flex; justify-content: center">
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="toDetail(scope.row.id)"
+                >
+                  查看
+                </button>
+              </div>
+              <div
+                style="display: flex; justify-content: center"
+                v-if="scope.row.status === 4"
+              >
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="refuteWithdraw(scope.row.id)"
+                >
+                  待驳回
+                </button>
+              </div>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <el-dialog
+      title="提现详情"
+      :visible.sync="detailShow"
+      class="dialog"
+      width="640px"
+      top="25vh"
+    >
+      <div class="detail-box">
+        <div class="detail-right">
+          <div class="row row1">提现金额/元:{{ detail.balance }}</div>
+          <div class="row row1">到账金额/元:{{ detail.actual }}</div>
+          <div class="row">
+            <div class="label">ID:</div>
+            {{ detail.uid }}
+          </div>
+          <div class="row">
+            <div class="label">提现方式:</div>
+            {{ wayMap[detail.way] }}
+          </div>
+          <div v-if="detail.way === 1">
+            <div class="row">
+              <div class="label">姓名:</div>
+              {{ detail.name }}
+            </div>
+            <div class="row">
+              <div class="label">收款码:</div>
+              <el-image
+                class="img"
+                style="width: 100px;height: 100px"
+                :src="detail.wx_pic"
+                fit="cover"
+                :preview-src-list="[detail.wx_pic]"
+              >
+              </el-image>
+            </div>
+          </div>
+          <div v-if="detail.way === 2">
+            <div class="row">
+              <div class="label">姓名:</div>
+              {{ detail.name }}
+            </div>
+            <div class="row">
+              <div class="label">收款码:</div>
+              <el-image
+                class="img"
+                style="width: 100px;height: 100px"
+                :src="detail.zfb_pic"
+                fit="cover"
+                :preview-src-list="[detail.zfb_pic]"
+              >
+              </el-image>
+            </div>
+          </div>
+          <div v-if="detail.way === 3">
+            <div class="row">
+              <div class="label">银行卡号:</div>
+              {{ detail.bank_card }}
+            </div>
+            <div class="row">
+              <div class="label">开户银行:</div>
+              {{ detail.bank }}
+            </div>
+            <div class="row">
+              <div class="label">姓名:</div>
+              {{ detail.name }}
+            </div>
+          </div>
+        </div>
+        <div class="detail-left">
+          <div class="row">
+            <div class="label">审核状态:</div>
+            {{ statusMap[detail.status] || "" }}
+          </div>
+          <!-- <div class="row">
+            <div class="label">提现状态:</div>
+            {{ wayMap[detail.way] || "" }}
+          </div> -->
+          <div class="row">
+            <div class="label">创建时间:</div>
+            {{ detail.created }}
+          </div>
+          <div class="row">
+            <div class="label">审核时间:</div>
+            {{ detail.updated }}
+          </div>
+          <!-- <div class="row">
+            <div class="label">到账时间:</div>
+            {{ detail.arrivalTime }}
+          </div> -->
+        </div>
+      </div>
+    </el-dialog>
+    <el-dialog
+      :show-close="false"
+      :close-on-click-modal="false"
+      title="生成中..."
+      :visible.sync="showProgressDialog"
+      width="30%"
+      center
+    >
+      <el-progress
+        :percentage="progress"
+        :text-inside="true"
+        :stroke-width="18"
+      ></el-progress>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+import myUtils from '../../components/common/whatever2excel';
+import dayjs from 'dayjs';
+export default {
+  components: {
+    Header
+  },
+  name: 'user-manage',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '提现记录'
+      },
+      filter: {
+        uid: null,
+        status: 0,
+        name: ''
+      },
+      statusType: [
+        {
+          name: '全部',
+          value: 0
+        },
+        {
+          name: '提现待审核',
+          value: 1
+        },
+        {
+          name: '提现审核通过',
+          value: 2
+        },
+        {
+          name: '提现已驳回',
+          value: 3
+        }
+        // {
+        //   name: '打款失败,等待驳回',
+        //   value: 4
+        // }
+      ],
+      wayType: [
+        {
+          name: '全部',
+          value: -1
+        },
+        {
+          name: '提现未到账',
+          value: 0
+        },
+        {
+          name: '提现已到账',
+          value: 1
+        },
+        {
+          name: '提现审核通过,打款失败',
+          value: 2
+        }
+      ],
+      statusMap: {
+        1: '提现待审核',
+        2: '提现审核通过',
+        3: '提现已驳回'
+        // 4: '打款失败,等待驳回'
+      },
+      wayMap: {
+        1: '微信',
+        2: '支付宝',
+        3: '银行卡'
+      },
+      list: [], // 用户列表
+      date: [],
+      showProgressDialog: false,
+      progress: 0,
+      multipleSelection: [],
+      detailShow: false,
+      detail: {}
+    };
+  },
+  filters: {
+    // 时间格式化
+    dateFormat(date) {
+      if (!date) return '请选择时间';
+      let day = dayjs(date);
+      return day.format('YYYY-MM-DD HH:mm:ss');
+    }
+  },
+  async mounted() {
+    // await this.getType();
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.multipleSelection = [];
+      this.currentPage = page;
+      this.getList();
+    },
+    selectable(row, index) {
+      if (row.status === 1) return true;
+      return false;
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+    },
+    // 获取提现列表
+    getList() {
+      this.multipleSelection = [];
+      this.filter.start = this.date[0] || '';
+      this.filter.end = this.date[1] || '';
+      this.loading++;
+      this.httpGet(this.$root.getWithdrawList, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.multipleSelection = [];
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = { uid: null, status: 0, name: '' };
+      this.date = [];
+      this.multipleSelection = [];
+      this.getList();
+    },
+    toDetail(id) {
+      // this.detail = detail;
+      this.loading++;
+      this.httpGet(this.$root.getWithdrawInfo, {
+        id
+      }).then(
+        (res) => {
+          this.loading--;
+          this.detail = res.info;
+          this.detailShow = true;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    passWithdraw(id) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要通过该审核吗?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPut(this.$root.passWithdraw, {
+          id
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    refuteWithdraw(id) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要驳回该审核吗?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPut(this.$root.refuteWithdraw, {
+          id
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    batchAuditWithdraw(status) {
+      console.log(this.multipleSelection);
+      if (!this.multipleSelection.length) {
+        this.$message.error('请选择记录');
+        return;
+      }
+      let str = '通过';
+      if (status === 2) str = '驳回';
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要${str}该审核吗?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPut(this.$root.batchAuditWithdraw, {
+          way: status,
+          id: this.multipleSelection.map((item) => {
+            return item.id;
+          })
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.multipleSelection = [];
+            this.getList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    async order2excel() {
+      this.loading++;
+      let list = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      };
+      await this.httpGet(this.$root.getWithdrawList, data).then(
+        (res) => {
+          this.loading--;
+          totalPage = Math.ceil(parseInt(res.total) / this.size);
+        },
+        () => {
+          this.loading--;
+        }
+      );
+      this.showProgressDialog = true;
+      this.progress = 0;
+      await this.getAllPages(totalPage, list).then(
+        () => {
+          this.showProgressDialog = false;
+          this.jsonFormatAndToExcel(list);
+        },
+        (err) => {
+          console.error(err);
+          this.showProgressDialog = false;
+        }
+      );
+    },
+    async getAllPages(totalPage, list) {
+      for (let i = 1; i <= totalPage; i++) {
+        let data = {
+          page: i,
+          size: this.size,
+          ...this.filter
+        };
+        await this.httpGet(this.$root.getWithdrawList, data).then((res) => {
+          list.push(...res.list);
+          this.progress = Math.floor((i / totalPage) * 100);
+          console.log('page' + i, list.length);
+        });
+        // console.log(5555, list);
+      }
+    },
+    jsonFormatAndToExcel(list) {
+      let formatList = [];
+      list.forEach((item) => {
+        let obj = {
+          用户ID: item.uid,
+          提现金额: item.balance,
+          身份证号: item.identityCard,
+          审核状态: this.statusMap[item.status],
+          提现状态: this.wayMap[item.way],
+          创建时间: item.created,
+          审核时间: item.auditTime,
+          到账时间: item.arrivalTime
+        };
+        formatList.push(obj);
+      });
+      myUtils.json2excel(formatList);
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      .filter-box2 {
+        flex-x();
+
+        .btn-box {
+          width: auto;
+        }
+      }
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      .import {
+        flex-x(flex-end);
+        margin-top: 16px;
+
+        .import-btn {
+          confirm-btn();
+          height: 32px;
+          padding: 0 15px;
+          white-space: nowrap;
+        }
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 120px;
+      }
+
+      .date-input {
+        width: 350px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .btn-box2 {
+        width: 100%;
+        flex-x(flex-start);
+        margin-top: 8px;
+
+        .search {
+          width: 108px;
+        }
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+    word(14px, #999);
+
+    span {
+      word(20px, #333);
+      font-weight: 600;
+      margin-left: 3px;
+    }
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+
+  .detail-box {
+    padding: 0 16px 16px;
+    flex-x(flex-start, flex-start);
+
+    .detail-right, .detail-left {
+      flex: 1;
+
+      .row {
+        width: 100%;
+        line-height: 32px;
+        word(14px, #333);
+        flex-x(flex-start);
+
+        .label {
+          width: 72px;
+          word(14px, #666);
+        }
+      }
+
+      .row1 {
+        word(16px, #333);
+      }
+    }
+  }
+}
+</style>

+ 435 - 0
src/view/fund/wx-charge.vue

@@ -0,0 +1,435 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <!-- tab -->
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="filter">
+            <div class="filter-item">
+              <div class="label">类型:</div>
+              <el-select
+                v-model="filter.payType"
+                size="small"
+                class="select"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in payType"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                >
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">用户ID:</div>
+              <el-input
+                class="input"
+                v-model="filter.uid"
+                placeholder="请输入内容"
+                size="small"
+              ></el-input>
+            </div>
+
+            <div class="filter-item">
+              <div class="label">时间:</div>
+              <el-date-picker
+                v-model="date"
+                type="datetimerange"
+                align="right"
+                unlink-panels
+                class="date-input"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                :default-time="['00:00:00', '23:59:59']"
+                size="small"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="btn-box">
+            <button class="search" @click="search">筛选</button>
+            <button class="reset" @click="reset">重置</button>
+            <button
+              class="search"
+              style="margin-left: 60px"
+              @click="order2excel"
+            >
+              导出
+            </button>
+          </div>
+        </div>
+        <el-table
+          :data="list"
+          class="order-table table no-border-table"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            prop="uid"
+            align="center"
+            label="用户ID"
+          ></el-table-column>
+          <el-table-column
+            prop="amount"
+            align="center"
+            label="金额"
+          ></el-table-column>
+          <el-table-column
+            prop="payType"
+            align="center"
+            label="类型"
+          >
+          <div slot-scope="scope">
+              {{payTypeMap[scope.row.payType]}}
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="oid"
+            align="center"
+            label="关联单号"
+          ></el-table-column>
+          <el-table-column
+            prop="created"
+            align="center"
+            label="时间"
+          ></el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <el-dialog
+      :show-close="false"
+      :close-on-click-modal="false"
+      title="生成中..."
+      :visible.sync="showProgressDialog"
+      width="30%"
+      center
+    >
+      <el-progress
+        :percentage="progress"
+        :text-inside="true"
+        :stroke-width="18"
+      ></el-progress>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+import myUtils from '../../components/common/whatever2excel';
+import { role, roleMap } from '@/config.js';
+export default {
+  components: {
+    Header
+  },
+  name: 'balanceRecord',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '微信收入'
+      },
+      filter: {
+        uid: null,
+        payType: 2
+      },
+      payType: [
+        // {
+        //   name: '全部',
+        //   id: 0
+        // },
+        {
+          name: '订单支付',
+          id: 2
+        },
+        {
+          name: '充值余额',
+          id: 3
+        }
+      ],
+      roleMap: roleMap,
+      tabActive: 1,
+      statusType: [],
+      list: [], // 列表
+      date: [],
+      showProgressDialog: false,
+      progress: 0,
+      payTypeMap: {
+        2: '订单支付',
+        3: '充值余额'
+      }
+    };
+  },
+
+  mounted() {
+    // this.statusType = this.hzType;
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取列表
+    getList() {
+      this.filter.begin = this.date[0] || '';
+      this.filter.end = this.date[1] || '';
+      this.loading++;
+      this.httpGet(this.$root.getWxPayList, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        uid: null,
+        payType: this.filter.payType
+      };
+      this.date = [];
+      this.getList();
+    },
+    async order2excel() {
+      this.loading++;
+      let list = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      };
+      await this.httpGet(this.$root.getWxPayList, data).then(
+        (res) => {
+          this.loading--;
+          totalPage = Math.ceil(parseInt(res.total) / this.size);
+        },
+        () => {
+          this.loading--;
+        }
+      );
+      this.showProgressDialog = true;
+      this.progress = 0;
+      await this.getAllPages(totalPage, list).then(
+        () => {
+          this.showProgressDialog = false;
+          this.jsonFormatAndToExcel(list);
+        },
+        (err) => {
+          console.error(err);
+          this.showProgressDialog = false;
+        }
+      );
+    },
+    async getAllPages(totalPage, list) {
+      for (let i = 1; i <= totalPage; i++) {
+        let data = {
+          page: i,
+          size: this.size,
+          ...this.filter
+        };
+        await this.httpGet(this.$root.getWxPayList, data).then((res) => {
+          list.push(...res.list);
+          this.progress = Math.floor((i / totalPage) * 100);
+          console.log('page' + i, list.length);
+        });
+        // console.log(5555, list);
+      }
+    },
+    jsonFormatAndToExcel(list) {
+      let formatList = [];
+      list.forEach((item) => {
+        let obj = {
+          用户ID: item.uid,
+          金额: item.amount,
+          类型: this.payTypeMap[item.payType],
+          关联单号: item.oid,
+          时间: item.created
+        };
+        formatList.push(obj);
+      });
+      myUtils.json2excel(formatList);
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 10px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+      }
+
+      // 表格按钮
+      .table-btn {
+        // width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 8px;
+      }
+
+      .filter-item {
+        margin-right: 12px;
+      }
+
+      .select, .input {
+        width: 125px;
+      }
+
+      .date-input {
+        width: 360px;
+      }
+
+      .btn-box {
+        margin: 0;
+      }
+
+      .table {
+        margin-top: 24px !important;
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .form {
+    width: 100%;
+    flex-center();
+    margin: 8px 0;
+  }
+}
+
+.tabs {
+  width: 100%;
+  background: #fff;
+  height: 60px;
+  flex-x(flex-start);
+  padding: 0 30px;
+  box-sizing: border-box;
+  margin-top: 8px;
+  flex-shrink: 0;
+
+  .tab {
+    background: #fff;
+    cursor: pointer;
+    padding: 0 15px;
+    position: relative;
+    width: auto;
+    margin-right: 100px;
+    height: 100%;
+    flex-x(center);
+    word(16px, #999);
+
+    &.active {
+      word(16px, #333);
+
+      .tab-line {
+        width: 100%;
+        position: absolute;
+        background: #4678E6;
+        height: 4px;
+        border-radius: 2px;
+        left: 0;
+        bottom: 3px;
+      }
+    }
+  }
+}
+</style>

+ 405 - 0
src/view/goods/business.vue

@@ -0,0 +1,405 @@
+<template>
+  <div class="page-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="btn" @click="handleBusinessModal('add')">+ 添加商家</div>
+        <el-table
+          :data="businessList"
+          class="table no-border-table"
+          ref="table"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            type="index"
+            :index="tableIndex"
+            align="center"
+            label="序号"
+            width="120"
+          ></el-table-column>
+          <el-table-column
+            prop="name"
+            align="center"
+            label="商品商家名称"
+          ></el-table-column>
+          <el-table-column
+            prop="phone"
+            align="center"
+            label="联系电话"
+          ></el-table-column>
+          <el-table-column label="操作" align="center" width="240">
+            <div slot-scope="scope" style="width: 100%;display: flex;justify-content: center;">
+              <!-- <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="updateNoDeliver(scope.row.id)"
+                >
+                  不发货地区
+                </button>
+              </div> -->
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="handleBusinessModal('edit', scope.row)"
+                >
+                  编辑
+                </button>
+              </div>
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="deleteBusiness(scope.row.id)"
+                >
+                  删除
+                </button>
+              </div>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <el-dialog :visible.sync="addShow" class="dialog" width="560px" top="25vh">
+      <div slot="title" class="dialog-title">
+        {{ (type === "add" ? "添加" : "编辑") + "商家" }}
+      </div>
+      <el-form
+        ref="form"
+        :rules="rules"
+        :model="addForm"
+        class="form"
+        label-width="auto"
+      >
+        <el-form-item label="商家名称:" prop="sort" class="form-item">
+          <el-input
+            placeholder="请输入商家名称"
+            class="add-renovation-input"
+            style="width: 160px"
+            v-model="addForm.name"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="联系电话:" prop="sort" class="form-item">
+          <el-input
+            placeholder="请输入联系电话"
+            class="add-renovation-input"
+            style="width: 160px"
+            v-model="addForm.phone"
+            type="number"
+            onkeypress="return( /[\d]/.test(String.fromCharCode(event.keyCode)))"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button class="cancel-btn btn" @click="addShow = false"
+          >取 消</el-button
+        >
+        <el-button class="confirm-btn btn" @click="handleConfirm"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+    <!-- 修改排序弹窗 -->
+    <!-- <el-dialog title="更改排序" width="400px" :visible.sync="sortShow">
+      <el-form label-width="60px" size="mini" ref="editSort" inline-message>
+        <el-form-item label="排序:" prop="tableData" style="margin-top: 15px">
+          <el-input v-model="currentSort" type="number" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button class="btn cancel-btn" @click="sortShow = false"
+          >取 消</el-button
+        >
+        <el-button class="btn confirm-btn" @click="saveSort">确 定</el-button>
+      </div>
+    </el-dialog> -->
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'banner',
+  data() {
+    return {
+      loading: 0, // 加载中
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      title: {
+        // 页面标题
+        firstTitile: '商城设置',
+        secondTitle: '商品商家列表'
+      },
+      businessList: [], // 轮播列表
+      rules: {},
+      sortShow: false,
+      currentSort: 0,
+      addForm: {
+        name: '',
+        phone: null
+      },
+      addShow: false,
+      businessId: null,
+      type: ''
+    };
+  },
+  mounted() {
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 表格序号
+    tableIndex(index) {
+      return ++index;
+    },
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取列表
+    getList() {
+      this.loading++;
+      this.httpGet(this.$root.getBusinessList, {
+        page: this.currentPage,
+        size: this.size
+      }).then(
+        (res) => {
+          this.loading--;
+          this.businessList = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    updateNoDeliver(id) {
+      this.$router.push({
+        name: 'noDeliver',
+        query: {
+          id
+        }
+      });
+    },
+    // 编辑轮播弹窗
+    handleBusinessModal(type, rowData) {
+      this.type = type;
+      if (type === 'edit') {
+        this.businessId = rowData.id;
+        this.addForm = {
+          phone: rowData.phone,
+          name: rowData.name
+        };
+      } else {
+        this.addForm = {
+          phone: null,
+          name: ''
+        };
+        this.$refs.form && this.$refs.form.clearValidate();
+      }
+      this.addShow = true;
+    },
+    // 删除
+    deleteBusiness(id) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要删除该商家吗?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpDelete(this.$root.deleteBusiness, {
+          id
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    //
+    handleConfirm() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          let url =
+            this.type === 'add'
+              ? this.$root.addBusiness
+              : this.$root.updateBusiness;
+          let method = this.type === 'add' ? 'httpPost' : 'httpPut';
+          let inputData =
+            this.type === 'add'
+              ? {
+                  ...this.addForm
+                }
+              : {
+                  ...this.addForm,
+                  id: this.businessId
+                };
+          this.loading++;
+          this[method](url, inputData).then(
+            (res) => {
+              this.$message({
+                message: '操作成功',
+                type: 'success'
+              });
+              this.loading--;
+              this.addShow = false;
+              this.getList();
+            },
+            (res) => {
+              this.loading--;
+              this.$message.error(res);
+            }
+          );
+        }
+      });
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.page-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 24px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      // 按钮
+      .btn {
+        // width: 100px;
+        display: inline-block;
+        padding: 0 10px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin-bottom: 16px;
+        // margin: 16px 0;
+      }
+
+      .tip {
+        margin-left: 32px;
+        color: #999;
+      }
+
+      // 表格按钮
+      .table-btn {
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+        padding: 0 6px;
+        min-width: 80px;
+        width: auto;
+        box-sizing: border-box;
+      }
+
+      .table-img {
+        height: 36px;
+        width: auto;
+      }
+    }
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .addImg {
+    .icon {
+      width: 80px;
+      height: 80px;
+    }
+  }
+
+  .form {
+    margin-top: 16px;
+    margin-bottom: 20px;
+    // padding-left: 60px;
+    flex-y(flex-start, center);
+
+    .sort-tip {
+      word(14px, #c8c8c8);
+      line-height: 20px;
+    }
+  }
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+}
+</style>

+ 624 - 0
src/view/goods/freight.vue

@@ -0,0 +1,624 @@
+<template>
+  <div class="freight-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="btn" @click="handleFreightModal('add')">+ 添加运费模版</div>
+        <el-table
+          :data="freightList"
+          class="order-table table no-border-table"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column
+            type="index"
+            :index="tableIndex"
+            align="center"
+            label="编号"
+            width="120"
+          ></el-table-column>
+          <el-table-column
+            prop="name"
+            align="center"
+            label="运费模版名称"
+          ></el-table-column>
+          <el-table-column prop="type" align="center" label="类型">
+            <div slot-scope="scope">
+              {{ typeMap[scope.row.type] }}
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="created"
+            align="center"
+            label="创建时间"
+          ></el-table-column>
+          <el-table-column label="操作" align="center" width="180">
+            <div
+              slot-scope="scope"
+              style="display: flex; justify-content: center"
+            >
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="handleFreightModal('edit', scope.row)"
+                >
+                  编辑
+                </button>
+              </div>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <el-dialog
+      :visible.sync="addFreightShow"
+      class="dialog"
+      width="1040px"
+      top="25vh"
+    >
+      <div slot="title" class="dialog-title">
+        {{ (type === "add" ? "发布" : "编辑") + "运费" }}
+      </div>
+      <el-form
+        ref="form"
+        :rules="rules"
+        :model="addFreightForm"
+        class="freight-form"
+        label-width="auto"
+      >
+        <el-form-item label="模版名称" prop="name" class="form-item">
+          <el-input
+            placeholder="请输入模版名称"
+            class="add-renovation-input"
+            v-model="addFreightForm.name"
+            style="width: 620px"
+          ></el-input>
+          <span style="margin-left: 12px">名称不要超过十六个字</span>
+        </el-form-item>
+        <el-form-item label="计价方式" prop="type" class="form-item">
+          <el-radio-group v-model="addFreightForm.type">
+            <el-radio :label="1">按件数</el-radio>
+            <el-radio :label="2">按重量</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="计价设置" prop="gid" class="form-item">
+          <div class="table">
+            <table>
+              <tr>
+                <th>
+                  <span>配送范围</span>
+                </th>
+                <th>首件数/件</th>
+                <th>首费用/元</th>
+                <th>续件数/件</th>
+                <th>续费/元</th>
+                <th></th>
+              </tr>
+              <tr>
+                <td>
+                  <span>默认地区</span>
+                </td>
+                <td>
+                  <el-input
+                    style="width: 100px"
+                    placeholder=""
+                    size="small"
+                    v-model.number="addFreightForm.firstAmount"
+                  ></el-input>
+                </td>
+                <td>
+                  <el-input
+                    style="width: 100px"
+                    placeholder=""
+                    size="small"
+                    v-model.number="addFreightForm.firstFee"
+                  ></el-input>
+                </td>
+                <td>
+                  <el-input
+                    style="width: 100px"
+                    placeholder=""
+                    size="small"
+                    v-model.number="addFreightForm.continueAmount"
+                  ></el-input>
+                </td>
+                <td>
+                  <el-input
+                    style="width: 100px"
+                    placeholder=""
+                    size="small"
+                    v-model.number="addFreightForm.continueFee"
+                  ></el-input>
+                </td>
+                <td></td>
+              </tr>
+              <tr v-for="(item, index) in list" :key="index">
+                <td>
+                  <span
+                    v-for="(area, areaIndex) in item.freightArea"
+                    :key="area"
+                    >{{ provinceMap[area]
+                    }}<span v-if="areaIndex !== item.freightArea.length - 1"
+                      >,</span
+                    ></span
+                  >
+                </td>
+                <td>
+                  <el-input
+                    style="width: 100px"
+                    placeholder=""
+                    size="small"
+                    v-model.number="item.firstAmount"
+                  ></el-input>
+                </td>
+                <td>
+                  <el-input
+                    style="width: 100px"
+                    placeholder=""
+                    size="small"
+                    v-model.number="item.firstFee"
+                  ></el-input>
+                </td>
+                <td>
+                  <el-input
+                    style="width: 100px"
+                    placeholder=""
+                    size="small"
+                    v-model.number="item.continueAmount"
+                  ></el-input>
+                </td>
+                <td>
+                  <el-input
+                    style="width: 100px"
+                    placeholder=""
+                    size="small"
+                    v-model.number="item.continueFee"
+                  ></el-input>
+                </td>
+                <td @click="deleteTemplate(index)">X</td>
+              </tr>
+            </table>
+            <div class="btn" @click="changeAreaModal" style="margin-left: 20px">
+              + 添加运费模版
+            </div>
+          </div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button class="cancel-btn btn" @click="addFreightShow = false"
+          >取 消</el-button
+        >
+        <el-button class="confirm-btn btn" @click="handleFreight"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+    <!-- 修改排序弹窗 -->
+    <el-dialog title="选择地区" width="800px" :visible.sync="areaShow">
+      <div class="area-box">
+        <div class="area-item" v-for="item in provinceList" :key="item.code">
+          <el-checkbox :disabled="areaObj[item.code]" v-model="provinceObj[item.code]">{{
+            item.name
+          }}</el-checkbox>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button class="btn cancel-btn" @click="areaShow = false"
+          >取 消</el-button
+        >
+        <el-button class="btn confirm-btn" @click="saveArea">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'freight',
+  data() {
+    return {
+      loading: 0, // 加载中
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      title: {
+        // 页面标题
+        firstTitile: '商品管理',
+        secondTitle: '运费设置'
+      },
+      typeMap: {
+        1: '按件数',
+        2: '按重量'
+      },
+      freightList: [], // 轮播列表
+      rules: {},
+      areaShow: false,
+      currentSort: 0,
+      addFreightForm: {
+        type: 1,
+        name: '',
+        firstAmount: null,
+        firstFee: null,
+        continueAmount: null,
+        continueFee: null,
+        freeShipping: 0,
+        noShipment: []
+      },
+      list: [],
+      provinceList: [],
+      provinceObj: {},
+      provinceMap: {},
+      areaObj: {},
+      addFreightShow: false,
+      freightId: null,
+      type: 'add'
+    };
+  },
+  mounted() {
+    // 获取列表
+    this.getFreightList();
+    this.getAreaList();
+  },
+  computed: {},
+  methods: {
+    // 表格序号
+    tableIndex(index) {
+      return ++index;
+    },
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getGoodsList();
+    },
+    // 获取轮播列表
+    getFreightList() {
+      this.loading++;
+      this.httpGet(this.$root.getFreightList, {
+        page: this.currentPage,
+        size: this.size
+      }).then(
+        (res) => {
+          this.loading--;
+          this.freightList = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    getAreaList() {
+      this.loading++;
+      this.httpGet(this.$root.getArea, {}).then(
+        (res) => {
+          this.loading--;
+          let list = [];
+          let obj = {};
+          for (let key in res.province_list) {
+            list.push({
+              code: key,
+              name: res.province_list[key]
+            });
+            obj[key] = false;
+          }
+          this.provinceList = list;
+          this.provinceObj = obj;
+          this.provinceMap = res.province_list;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    getInfo(id) {
+      this.loading++;
+      this.httpGet(this.$root.getFreightInfo, {
+        id
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = [...res.info.newArea];
+          let addFreightForm = {};
+          for (let key in this.addFreightForm) {
+            addFreightForm[key] = res.info.defaultArea[key];
+          }
+          this.addFreightForm = addFreightForm;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 编辑轮播弹窗
+    handleFreightModal(type, rowData) {
+      this.type = type;
+      this.areaObj = {};
+      if (type === 'edit') {
+        this.freightId = rowData.id;
+        this.getInfo(rowData.id);
+      } else {
+        this.list = [];
+        this.addFreightForm = {
+          type: 1,
+          name: '',
+          firstAmount: null,
+          firstFee: null,
+          continueAmount: null,
+          continueFee: null,
+          freeShipping: 0,
+          noShipment: []
+        };
+        this.$refs.form && this.$refs.form.clearValidate();
+      }
+      this.addFreightShow = true;
+    },
+    addTemplate() {},
+    deleteTemplate(index) {
+      this.list.splice(index, 1);
+    },
+    // 轮播
+    handleFreight() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          let url =
+            this.type === 'add'
+              ? this.$root.addFreight
+              : this.$root.updateFreight;
+          let inputData =
+            this.type === 'add'
+              ? {
+                  ...this.addFreightForm
+                }
+              : {
+                  ...this.addFreightForm,
+                  id: this.freightId
+                };
+          let method = this.type === 'add' ? 'httpPost' : 'httpPut';
+          this.loading++;
+          this[method](url, {
+            defaultArea: {
+              ...inputData,
+              noShipment: [],
+              freeShipping: 0
+            },
+            newArea: this.list
+          }).then(
+            (res) => {
+              this.$message({
+                message: '操作成功',
+                type: 'success'
+              });
+              this.loading--;
+              this.addFreightShow = false;
+              this.getFreightList();
+            },
+            (res) => {
+              this.loading--;
+              this.$message.error(res);
+            }
+          );
+        }
+      });
+    },
+    changeAreaModal() {
+      let obj = { ...this.provinceObj };
+      for (let key in obj) {
+        obj[key] = false;
+      }
+      this.provinceObj = obj;
+      let areaObj = {};
+      this.list.forEach((item) => {
+        item.freightArea.forEach((area) => {
+          areaObj[area] = true;
+        });
+      });
+      this.areaObj = areaObj;
+      this.areaShow = true;
+    },
+    saveArea() {
+      console.log(this.provinceObj);
+      let list = [];
+      for (let key in this.provinceObj) {
+        if (this.provinceObj[key]) {
+          list.push(+key);
+        }
+      }
+      if (!list.length) {
+        return;
+      }
+      this.list.push({
+        freightArea: list,
+        firstAmount: null,
+        firstFee: null,
+        continueAmount: null,
+        continueFee: null
+      });
+      this.areaShow = false;
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.freight-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .btn {
+    // width: 100px;
+    display: inline-block;
+    padding: 0 10px;
+    height: 32px;
+    line-height: 32px;
+    confirm-btn();
+    font-size: 14px;
+    margin-bottom: 16px;
+    // margin: 16px 0;
+  }
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 24px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      .tip {
+        margin-left: 32px;
+        color: #999;
+      }
+
+      // 表格按钮
+      .table-btn {
+        width: 65px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+      }
+
+      .table-img {
+        height: 70px;
+        width: auto;
+      }
+    }
+  }
+
+  .dialog-content {
+    flex-y();
+  }
+
+  .addImg {
+    .icon {
+      width: 270px;
+      height: 108px;
+    }
+  }
+
+  .freight-form {
+    margin-top: 16px;
+    margin-bottom: 80px;
+    // padding-left: 60px;
+    padding: 0 15px;
+
+    .form-item {
+      .table {
+        border: 1px solid #E8E8E8;
+        padding: 0 8px;
+        width: 874px;
+      }
+
+      table {
+        width: 100%;
+        border-spacing: 0 8px;
+        border-collapse: separate;
+
+        th {
+          height: 45px;
+          text-align: center;
+        }
+
+        td {
+          height: 45px;
+          text-align: center;
+          background: #F7F8FA;
+        }
+
+        tr {
+          th:nth-of-type(1), td:nth-of-type(1) {
+            width: 300px;
+            text-align: center;
+          }
+
+          th:nth-last-of-type(1), td:nth-last-of-type(1) {
+            width: 60px;
+            text-align: center;
+          }
+
+          &:nth-of-type(n+2) {
+            // background: #F7F8FA;
+            // margin-bottom: 8px;
+            // border-bottom: 8px solid #fff;
+            // height: 54px;
+            // padding-bottom: 8px;
+          }
+        }
+      }
+    }
+
+    .sort-tip {
+      word(14px, #c8c8c8);
+      line-height: 20px;
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .area-box {
+    flex-x(flex-start);
+    flex-wrap: wrap;
+    padding: 16px;
+
+    .area-item {
+      // margin-right: 32px;
+      line-height: 40px;
+      min-width: 145px;
+    }
+  }
+}
+</style>

+ 822 - 0
src/view/goods/good.vue

@@ -0,0 +1,822 @@
+<template>
+  <div class="good-info-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <div class="base-info group">
+          <div class="basic">
+            <!-- <span>*</span> -->
+            基本信息
+          </div>
+          <el-form
+            ref="form"
+            :rules="rules"
+            :model="baseInfo"
+            class="good-form base-info-form"
+            label-width="auto"
+          >
+            <el-form-item label="商品名称" prop="name" class="form-item">
+              <el-input
+                placeholder="请输入商品名称"
+                v-model="baseInfo.name"
+                class="good-input"
+              ></el-input>
+              <span class="tip">商品名称不要超过五十个字</span>
+            </el-form-item>
+            <el-form-item label="宣传语" prop="tagline" class="form-item">
+              <el-input
+                placeholder="商品备注/副标题"
+                v-model="baseInfo.tagline"
+                class="good-input"
+              ></el-input>
+              <span class="tip">商品描述不要超过四十个字</span>
+            </el-form-item>
+            <el-form-item
+              label="关联分类"
+              prop="secondSortId"
+              class="form-item"
+            >
+              <!-- <el-select
+                placeholder="请选择"
+                v-model="baseInfo.secondSortId"
+                class="good-input"
+                style="width: 185px"
+              >
+                <el-option
+                  v-for="item in categoryList"
+                  :key="item.id"
+                  :value="item.id"
+                  :label="item.name"
+                ></el-option>
+              </el-select> -->
+              <el-cascader
+                v-model="baseInfo.secondSortId"
+                :options="categoryList"
+                placeholder="请选择"
+                :props="{
+                  children: 'second',
+                  value: 'id',
+                  label: 'name',
+                }"
+                class="good-input"
+                style="width: 185px"
+              ></el-cascader>
+            </el-form-item>
+            <!-- <el-form-item label="关联分区" prop="secondSortId" class="form-item">
+              <el-select
+                placeholder="请选择"
+                v-model="baseInfo.secondSortId"
+                class="good-input"
+                style="width: 185px"
+              >
+                <el-option
+                  v-for="item in categoryList"
+                  :key="item.id"
+                  :value="item.id"
+                  :label="item.name"
+                ></el-option>
+              </el-select>
+            </el-form-item> -->
+            <el-form-item label="商品图片" class="form-item" prop="masterPic">
+              <p class="tips" style="margin-bottom: 8px">
+                建议尺寸:600*600,图片类型jpg、png
+              </p>
+              <div class="img-box">
+                <imgUpLoader
+                  :max-pic-num="1"
+                  @getPics="getMasterImgList"
+                  :index="0"
+                  text="主图"
+                  :imgUrl="baseInfo.masterPic"
+                />
+                <imgUpLoader
+                  v-for="(item, index) in bannerNum"
+                  :key="index"
+                  :max-pic-num="1"
+                  @getPics="getImgList"
+                  :index="index"
+                  text="细节图"
+                  :imgUrl="baseInfo.slideshow[index]"
+                />
+              </div>
+            </el-form-item>
+            <el-form-item label="商品状态" prop="status" class="form-item">
+              <el-radio-group v-model="baseInfo.status">
+                <el-radio :label="3">出售中</el-radio>
+                <el-radio :label="1">仓库中</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <!-- <el-form-item label="商品类型" prop="genre" class="form-item">
+              <el-select
+                placeholder="请选择"
+                v-model="baseInfo.genre"
+                class="good-input"
+                style="width: 185px"
+              >
+                <el-option :value="1" label="自营"></el-option>
+                <el-option :value="2" label="供应链"></el-option>
+              </el-select>
+            </el-form-item> -->
+            <!-- <el-form-item label="购买限制" prop="newBuy" class="form-item">
+              <el-checkbox v-model="baseInfo.newBuy">仅新用户可购买</el-checkbox>
+            </el-form-item> -->
+            <!-- <el-form-item
+              label="限购数量"
+              prop="limitNum"
+              class="form-item"
+            >
+              <el-input
+                placeholder="请输入限购数量"
+                v-model="baseInfo.limitNum"
+                class="good-input"
+                style="width: 150px"
+              ></el-input>
+            </el-form-item> -->
+            <el-form-item
+              label="商品销量"
+              prop="baseMonthlySales"
+              class="form-item"
+            >
+              <el-input
+                placeholder="请输入商品销量"
+                v-model="baseInfo.baseMonthlySales"
+                class="good-input"
+                style="width: 185px"
+              >
+                <template slot="append">件</template>
+              </el-input>
+            </el-form-item>
+            <el-form-item label="商品成本" prop="cost" class="form-item">
+              <el-input
+                placeholder="请输入商品成本"
+                v-model="baseInfo.cost"
+                class="good-input"
+                style="width: 185px"
+              >
+              <template slot="append">元</template>
+            </el-input>
+            </el-form-item>
+            <el-form-item label="打赏成本" prop="rewardAmount" class="form-item">
+              <el-input
+                placeholder="请输入打赏成本"
+                v-model="baseInfo.rewardAmount"
+                class="good-input"
+                style="width: 185px"
+              >
+              <template slot="append">元</template>
+            </el-input>
+            </el-form-item>
+            <el-form-item label="商品商家" prop="sid" class="form-item">
+              <el-select
+                placeholder="请选择"
+                v-model="baseInfo.sid"
+                class="good-input"
+                style="width: 185px"
+              >
+                <el-option
+                  v-for="item in businessList"
+                  :key="item.id"
+                  :value="item.id"
+                  :label="item.name"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="供应链商品ID" prop="chainId" class="form-item">
+              <el-input
+                placeholder="请输入供应链商品ID"
+                v-model="baseInfo.chainId"
+                class="good-input"
+                style="width: 180px"
+              ></el-input>
+            </el-form-item>
+            <!-- <el-form-item label="商品参数" prop="option" class="form-item">
+              <div class="option-box">
+                <div class="option-item option-head">
+                  <div class="cell1">参数名称</div>
+                  <div class="cell2">参数值</div>
+                </div>
+                <div class="option-item" v-for="(item, index) in optionList" :key="index">
+                  <div class="cell1">
+                    <input type="text" v-model="item.name" placeholder="请输入"/>
+                  </div>
+                  <div class="cell2">
+                    <input type="text" v-model="item.value" placeholder="请输入"/>
+                  </div>
+                </div>
+                <div class="option-btn" @click="addOption">+添加参数</div>
+              </div>
+            </el-form-item> -->
+          </el-form>
+        </div>
+        <div class="good-specs-box group">
+          <div class="basic">
+            <!-- <span>*</span> -->
+            售卖信息
+          </div>
+          <div class="specs good-specs">
+            <goods-attr
+              :attrSku="key"
+              :skuTable="attribute"
+              :sales="baseInfo.linePrice"
+              @editAttr="editAttr"
+              @getSales="getSales"
+            />
+          </div>
+          <div class="specs good-specs-des"></div>
+        </div>
+        <div class="base-info group">
+          <div class="basic">
+            商品说明
+            <span style="font-size: 13px"
+              >该部分内容展示在商品详情页后部分</span
+            >
+          </div>
+          <div class="remarks">
+            <el-form class="good-form" label-width="auto">
+              <el-form-item label="商品描述:" class="form-item">
+                <el-input
+                  type="textarea"
+                  :rows="4"
+                  placeholder="请输入商品描述"
+                  v-model="baseInfo.detailDes"
+                  class="remarks-input"
+                >
+                </el-input>
+              </el-form-item>
+            </el-form>
+            <div class="good-detail">
+              <UpImgDetail :max-pic-num="10" :imageList="baseInfo.detailPic" />
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="btn-box">
+        <button class="cancel-btn" @click="handleCancel">取消</button>
+        <button class="confirm-btn" @click="handleConfirm">保存</button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import GoodsAttr from '../../components/goods/goodsAttr';
+import imgUpLoader from '../../components/goods/imgUpLoader';
+import UpImgDetail from '../../components/goods/upImgDetail';
+import Header from '../../components/common/header';
+export default {
+  components: { GoodsAttr, imgUpLoader, UpImgDetail, Header },
+  name: 'goods-lock',
+  data() {
+    return {
+      loading: 0,
+      title: {
+        // 页面标题
+        firstTitile: '商品管理',
+        secondTitle: '商品详情'
+      },
+      categoryList: [],
+      goodsInfo: {},
+      bannerNum: 5,
+      rules: {
+        name: [
+          {
+            required: true,
+            message: '请输入商品名称',
+            trigger: 'blur'
+          },
+          {
+            max: 50,
+            message: '商品名称不能超过五十个字',
+            trigger: 'blur'
+          }
+        ],
+        tagline: [
+          {
+            max: 40,
+            message: '商品名称不能超过四十个字',
+            trigger: 'blur'
+          }
+        ],
+        secondSortId: [
+          {
+            required: true,
+            message: '请输入商品分类',
+            trigger: 'change'
+          }
+        ],
+        masterPic: [
+          {
+            required: true,
+            message: '请上传主图图片',
+            trigger: 'change'
+          }
+        ],
+        goods_type: [
+          {
+            required: true,
+            message: '请选择类型',
+            trigger: 'change'
+          }
+        ],
+        status: [
+          {
+            required: true,
+            message: '请选择状态',
+            trigger: 'change'
+          }
+        ],
+        genre: [
+          {
+            required: true,
+            message: '请选择商品类型',
+            trigger: 'change'
+          }
+        ],
+        limitNum: [
+          {
+            required: true,
+            message: '请输入限购数量',
+            trigger: 'blur'
+          }
+        ],
+        sid: [
+          {
+            required: true,
+            message: '请选择商品商家',
+            trigger: 'change'
+          }
+        ],
+        freight: [
+          {
+            required: true,
+            message: '请选择运费模板',
+            trigger: 'change'
+          }
+        ]
+      },
+      attribute: [],
+      key: [],
+      // weight: false,
+      remarks: '',
+      skuList: [],
+      gid: null,
+      id: null,
+      freightList: [],
+      optionList: [{ name: '', value: '' }],
+      baseInfo: {
+        status: null,
+        name: '',
+        detailDes: '',
+        detailPic: [],
+        tagline: '',
+        slideshow: [],
+        secondSortId: null,
+        linePrice: null,
+        masterPic: '',
+        genre: 1,
+        baseMonthlySales: null,
+        sid: null,
+        cost: null,
+        rewardAmount: null,
+        twig: null,
+        newBuy: 0,
+        limitNum: 0,
+        chainId: null,
+        detailContent: '',
+        shopId: null
+      },
+      businessList: []
+    };
+  },
+  computed: {},
+  async mounted() {
+    this.getBusinessList();
+    await this.getCategoryList();
+    // this.getFreightList();
+    let query = this.$route.query;
+    if (query && query.gid) {
+      this.gid = query.gid;
+      this.getGoodDetail(query.gid);
+    }
+  },
+  methods: {
+    // 获取商品信息
+    getGoodDetail(gid) {
+      this.loading++;
+      this.httpGet(this.$root.goodsDetail, { gid }).then(
+        (res) => {
+          this.loading--;
+          let baseInfo = { ...this.baseInfo };
+          for (let key in baseInfo) {
+            baseInfo[key] = res[key];
+          }
+          baseInfo.secondSortId = [res.firstSortId, res.secondSortId];
+          baseInfo.newBuy = Boolean(baseInfo.newBuy);
+          this.baseInfo = { ...baseInfo };
+          this.skuList = res.skuList;
+          this.key = this.getAttrName(res.skuList);
+          this.attribute = this.getAttrs(res.skuList);
+          this.gid = res.gid;
+          this.id = res.id;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    getBusinessList() {
+      this.loading++;
+      this.httpGet(this.$root.getBusinessList, {
+        size: 9999
+      }).then(
+        (res) => {
+          this.loading--;
+          // this.businessList = [{ name: '未选择', id: 0 }, ...res.list];
+          this.businessList = res.list;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 根据组件转换格式为接口需要格式
+    getAttrs(skus) {
+      let newSkus = [...skus];
+      let skusFormat = newSkus.map((item) => {
+        let obj = {};
+        item.attrs.forEach((attr) => {
+          obj[attr.keyName] = attr.value;
+        });
+        return {
+          ...item,
+          attribute: obj
+        };
+      });
+      return skusFormat;
+    },
+    // 获取所有规格
+    getAttrName(skus) {
+      let newAttrs = [];
+      skus.forEach((item) => {
+        item.attrs.forEach((attr) => {
+          if (newAttrs.indexOf(attr.keyName) < 0) {
+            newAttrs.push(attr.keyName);
+          }
+        });
+      });
+      return newAttrs;
+    },
+    // 获取分类列表
+    getCategoryList() {
+      this.loading++;
+      this.httpGet(this.$root.getGoodsCategoryList, {}).then(
+        (res) => {
+          this.loading--;
+          this.categoryList = res.list.filter((item) => item.second.length);
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 获取模板列表
+    getFreightList() {
+      this.loading++;
+      this.httpGet(this.$root.getFreightList, {}).then(
+        (res) => {
+          this.loading--;
+          this.freightList = res.list;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 取消
+    handleCancel() {
+      this.$router.push({ name: 'goodsManage' });
+    },
+    getMasterImgList(index, val) {
+      if (val === '') {
+        // slideshow.splice(index, 1);
+        this.baseInfo.masterPic = null;
+      } else {
+        this.baseInfo.masterPic = val;
+      }
+      this.$refs.form.clearValidate(['masterPic']);
+    },
+    // 设置
+    getImgList(index, val) {
+      // 获取主图
+      let slideshow = [...this.baseInfo.slideshow];
+      if (val === '') {
+        // slideshow.splice(index, 1);
+        slideshow[index] = null;
+      } else {
+        slideshow[index] = val;
+      }
+      // this.bannerNum = slideshow.length <= 5 ? slideshow.length : 5;
+      this.baseInfo.slideshow = slideshow;
+      this.$refs.form.clearValidate(['slideshow']);
+    },
+    // 获取规格值
+    editAttr(val) {
+      console.log(val);
+      let newSkus = val.map((item) => {
+        let arr = [];
+        for (let key in item.attribute) {
+          arr.push({
+            keyName: key,
+            value: item.attribute[key]
+          });
+        }
+        return {
+          sku: {
+            price: +item.price,
+            stock: +item.stock,
+            pic: item.pic,
+            kid: item.kid,
+            code: item.code,
+            chainId: item.chainId,
+            cost: +item.cost || 0
+          },
+          attrs: arr
+        };
+      });
+      this.skuList = newSkus;
+    },
+    getSales(val) {
+      this.baseInfo.linePrice = +val;
+    },
+    // getDetail(val) {
+    //   this.baseInfoForm.details = [...val];
+    // },
+    // 下一步
+    handleConfirm() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          if (!this.skuList.length) {
+            this.$message({
+              message: '请选择商品规格',
+              type: 'warning'
+            });
+            return;
+          }
+          // for (let spuKey in this.spu) {
+          //   this.spu[spuKey] = this.baseInfo[spuKey];
+          // }
+          this.addGood();
+        } else {
+          this.$message({
+            message: '请填写商品信息',
+            type: 'warning'
+          });
+        }
+      });
+    },
+    // 添加商品
+    addGood() {
+      // 请求数据
+      let inputData = {
+        spu: this.baseInfo,
+        skuList: this.skuList,
+        secondSortId: this.baseInfo.secondSortId[1]
+      };
+      console.log(inputData.spu);
+      inputData.spu.slideshow = this.baseInfo.slideshow.filter((item) => item);
+      inputData.spu.baseMonthlySales = +inputData.spu.baseMonthlySales || 0;
+      inputData.spu.cost = +inputData.spu.cost || 0;
+      inputData.spu.rewardAmount = +inputData.spu.rewardAmount || 0;
+      inputData.spu.limitNum = +inputData.spu.limitNum || 0;
+      inputData.spu.newBuy = +inputData.spu.newBuy || 0;
+      // inputData.spu.freight = 1;
+      // 是否为编辑商品
+      let method = 'httpPost';
+      if (this.gid) {
+        method = 'httpPut';
+        inputData.spu.id = this.id;
+        inputData.spu.gid = this.gid;
+      }
+      this.loading++;
+      this[method](
+        this.gid ? this.$root.editGoods : this.$root.createGoods, // 添加商品 or 创建商品
+        inputData
+      ).then(
+        (res) => {
+          this.$message({
+            message: this.gid ? '商品修改成功' : '商品创建成功',
+            type: 'success'
+          });
+          this.loading--;
+          this.$router.push({
+            name: 'goodsManage'
+          });
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    addOption() {
+      this.optionList.push({
+        name: '',
+        value: ''
+      });
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.good-info-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 24px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 20px;
+      border-radius: 2px;
+
+      .group {
+        .basic {
+          height: 48px;
+          line-height: 48px;
+          font-size: 20px;
+          text-indent: 20px;
+          margin-top: 20px;
+          color: gray3;
+          flex-x(flex-start);
+
+          span {
+            // color: red;
+            color: gray6;
+            margin-right: 3px;
+          }
+        }
+      }
+
+      .base-info {
+        .good-form {
+          padding: 20px 0 30px;
+
+          .img-box {
+            flex-x(flex-start);
+          }
+        }
+
+        .base-info-form {
+          margin-left: 90px;
+        }
+
+        .good-input {
+          width: 620px;
+        }
+
+        .tip {
+          font-size: 14px;
+          color: gray6;
+          margin-left: 16px;
+        }
+
+        .red {
+          color: red;
+        }
+
+        .option-box {
+          background: #F7F8FA;
+          padding: 0 24px;
+          border-radius: 2px;
+          border: 1px solid #E8E8E8;
+          // height: 32px;
+          overflow: hidden;
+
+          .option-item {
+            flex-x(flex-start);
+            height: 40px;
+
+            &.option-head {
+              height: 32px;
+            }
+
+            input {
+              height: 32px;
+              background: #fff;
+              border: 1px solid #E8E8E8;
+              box-sizing: border-box;
+            }
+
+            .cell1 {
+              width: 330px;
+
+              input {
+                width: 310px;
+                padding: 0 10px;
+                box-sizing: border-box;
+              }
+            }
+
+            .cell2 {
+              input {
+                width: 500px;
+                padding: 0 10px;
+                box-sizing: border-box;
+              }
+            }
+          }
+
+          .option-btn {
+            width: 94px;
+            height: 32px;
+            border: 1px solid #E8E8E8;
+            box-sizing: border-box;
+            background: #fff;
+            flex-x(center);
+            font-size: 14px;
+            border-radius: 2px;
+            cursor: pointer;
+            margin-top: 12px;
+            margin-bottom: 16px;
+          }
+        }
+      }
+
+      .good-specs-box {
+        .good-specs {
+          // padding: 20px;
+          // border: 1px solid gray9;
+          margin: 30px 70px 0 60px;
+        }
+      }
+
+      .remarks {
+        width: 100%;
+        padding-left: 95px;
+        box-sizing: border-box;
+
+        .remarks-input {
+          max-width: 600px;
+
+          textarea {
+            font-size: 14px;
+            max-width: 600px;
+          }
+        }
+
+        .good-detail {
+          padding-left: 82px;
+        }
+      }
+
+      .good-detail {
+        padding-bottom: 50px;
+      }
+    }
+  }
+
+  .btn-box {
+    background: white;
+    width: 100%;
+    flex-x(center);
+    padding-bottom: 48px;
+
+    .cancel-btn {
+      width: 96px;
+      height: 40px;
+      cancel-btn();
+      // border-radius: 23px;
+    }
+
+    .confirm-btn {
+      width: 96px;
+      height: 40px;
+      margin-left: 20px;
+      confirm-btn();
+    }
+  }
+}
+</style>

+ 926 - 0
src/view/goods/good2.vue

@@ -0,0 +1,926 @@
+<template>
+  <div class="good-info-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <div class="base-info group">
+          <div class="basic">
+            <!-- <span>*</span> -->
+            基本信息
+          </div>
+          <el-form
+            ref="form"
+            :rules="rules"
+            :model="baseInfo"
+            class="good-form base-info-form"
+            label-width="auto"
+          >
+            <el-form-item label="商品名称" prop="name" class="form-item">
+              <!-- <el-input
+                placeholder="请输入商品名称"
+                v-model="baseInfo.name"
+                class="good-input"
+              ></el-input> -->
+              <div class="value">{{ info.name }}</div>
+              <!-- <span class="tip">商品名称不要超过五十个字</span> -->
+            </el-form-item>
+            <el-form-item label="宣传语" prop="tagline" class="form-item">
+              <!-- <el-input
+                placeholder="商品备注/副标题"
+                v-model="baseInfo.tagline"
+                class="good-input"
+              ></el-input>
+              <span class="tip">商品描述不要超过四十个字</span> -->
+              <div class="value">{{ info.tagline }}</div>
+            </el-form-item>
+            <el-form-item
+              label="关联分类"
+              prop="secondSortId"
+              class="form-item"
+            >
+              <!-- <el-select
+                placeholder="请选择"
+                v-model="baseInfo.secondSortId"
+                class="good-input"
+                style="width: 185px"
+              >
+                <el-option
+                  v-for="item in categoryList"
+                  :key="item.id"
+                  :value="item.id"
+                  :label="item.name"
+                ></el-option>
+              </el-select> -->
+              <!-- <el-cascader
+                v-model="baseInfo.secondSortId"
+                :options="categoryList"
+                placeholder="请选择"
+                :props="{
+                  children: 'second',
+                  value: 'id',
+                  label: 'name',
+                }"
+                class="good-input"
+                style="width: 185px"
+              ></el-cascader> -->
+              <div class="value">
+                {{ info.firstSortName }} / {{ info.secondSortName }}
+              </div>
+            </el-form-item>
+            <el-form-item label="所属商家" prop="shopName" class="form-item">
+              <div class="value">{{ info.shopName }}</div>
+            </el-form-item>
+            <el-form-item label="商品图片" prop="tagline" class="form-item">
+              <el-image
+                class="img"
+                :src="info.masterPic"
+                fit="cover"
+                style="width: 112px;height: 112px;margin-right: 10px;"
+                :preview-src-list="[info.masterPic, ...info.slideshow]"
+              >
+              </el-image>
+              <el-image
+                class="img"
+                v-for="(item, index) in info.slideshow"
+                :key="index"
+                :src="item"
+                fit="cover"
+                style="width: 112px;height: 112px;margin-right: 10px;"
+                :preview-src-list="[info.masterPic, ...info.slideshow]"
+              >
+              </el-image>
+            </el-form-item>
+            <!-- <el-form-item label="打赏金额" prop="shopName" class="form-item">
+              <div class="value">{{ info.rewardAmount || 0 }}元</div>
+            </el-form-item> -->
+            <!-- <el-form-item label="关联分区" prop="secondSortId" class="form-item">
+              <el-select
+                placeholder="请选择"
+                v-model="baseInfo.secondSortId"
+                class="good-input"
+                style="width: 185px"
+              >
+                <el-option
+                  v-for="item in categoryList"
+                  :key="item.id"
+                  :value="item.id"
+                  :label="item.name"
+                ></el-option>
+              </el-select>
+            </el-form-item> -->
+            <!-- <el-form-item label="商品图片" class="form-item" prop="masterPic">
+              <p class="tips" style="margin-bottom: 8px">
+                建议尺寸:600*600,图片类型jpg、png
+              </p>
+              <div class="img-box">
+                <imgUpLoader
+                  :max-pic-num="1"
+                  @getPics="getMasterImgList"
+                  :index="0"
+                  text="主图"
+                  :imgUrl="baseInfo.masterPic"
+                />
+                <imgUpLoader
+                  v-for="(item, index) in bannerNum"
+                  :key="index"
+                  :max-pic-num="1"
+                  @getPics="getImgList"
+                  :index="index"
+                  text="细节图"
+                  :imgUrl="baseInfo.slideshow[index]"
+                />
+              </div>
+            </el-form-item> -->
+            <!-- <el-form-item label="商品状态" prop="status" class="form-item">
+              <el-radio-group v-model="baseInfo.status">
+                <el-radio :label="3">出售中</el-radio>
+                <el-radio :label="1">仓库中</el-radio>
+              </el-radio-group>
+            </el-form-item> -->
+            <!-- <el-form-item label="商品类型" prop="genre" class="form-item">
+              <el-select
+                placeholder="请选择"
+                v-model="baseInfo.genre"
+                class="good-input"
+                style="width: 185px"
+              >
+                <el-option :value="1" label="自营"></el-option>
+                <el-option :value="2" label="供应链"></el-option>
+              </el-select>
+            </el-form-item> -->
+            <!-- <el-form-item label="购买限制" prop="newBuy" class="form-item">
+              <el-checkbox v-model="baseInfo.newBuy">仅新用户可购买</el-checkbox>
+            </el-form-item> -->
+            <!-- <el-form-item
+              label="限购数量"
+              prop="limitNum"
+              class="form-item"
+            >
+              <el-input
+                placeholder="请输入限购数量"
+                v-model="baseInfo.limitNum"
+                class="good-input"
+                style="width: 150px"
+              ></el-input>
+            </el-form-item> -->
+            <!-- <el-form-item
+              label="商品销量"
+              prop="baseMonthlySales"
+              class="form-item"
+            >
+              <el-input
+                placeholder="请输入商品销量"
+                v-model="baseInfo.baseMonthlySales"
+                class="good-input"
+                style="width: 185px"
+              >
+                <template slot="append">件</template>
+              </el-input>
+            </el-form-item>
+            <el-form-item label="商品成本" prop="cost" class="form-item">
+              <el-input
+                placeholder="请输入商品成本"
+                v-model="baseInfo.cost"
+                class="good-input"
+                style="width: 185px"
+              >
+              <template slot="append">元</template>
+            </el-input>
+            </el-form-item>
+            <el-form-item label="商品商家" prop="sid" class="form-item">
+              <el-select
+                placeholder="请选择"
+                v-model="baseInfo.sid"
+                class="good-input"
+                style="width: 185px"
+              >
+                <el-option
+                  v-for="item in businessList"
+                  :key="item.id"
+                  :value="item.id"
+                  :label="item.name"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="供应链商品ID" prop="chainId" class="form-item">
+              <el-input
+                placeholder="请输入供应链商品ID"
+                v-model="baseInfo.chainId"
+                class="good-input"
+                style="width: 180px"
+              ></el-input>
+            </el-form-item> -->
+            <!-- <el-form-item label="商品参数" prop="option" class="form-item">
+              <div class="option-box">
+                <div class="option-item option-head">
+                  <div class="cell1">参数名称</div>
+                  <div class="cell2">参数值</div>
+                </div>
+                <div class="option-item" v-for="(item, index) in optionList" :key="index">
+                  <div class="cell1">
+                    <input type="text" v-model="item.name" placeholder="请输入"/>
+                  </div>
+                  <div class="cell2">
+                    <input type="text" v-model="item.value" placeholder="请输入"/>
+                  </div>
+                </div>
+                <div class="option-btn" @click="addOption">+添加参数</div>
+              </div>
+            </el-form-item> -->
+          </el-form>
+        </div>
+        <div class="good-specs-box group">
+          <div class="basic">
+            <!-- <span>*</span> -->
+            售卖信息
+          </div>
+          <div class="specs good-specs">
+            <goods-attr2
+              :attrSku="key"
+              :skuTable="attribute"
+              :sales="baseInfo.linePrice"
+              @editAttr="editAttr"
+              @getSales="getSales"
+            />
+          </div>
+          <div class="specs good-specs-des"></div>
+        </div>
+        <div class="base-info group">
+          <div class="basic">
+            商品说明
+            <!-- <span style="font-size: 13px"
+              >该部分内容展示在商品详情页后部分</span
+            > -->
+          </div>
+          <div class="remarks">
+            <el-form class="good-form" label-width="auto">
+              <el-form-item label="商品描述:" class="form-item">
+                <!-- <el-input
+                  type="textarea"
+                  :rows="4"
+                  placeholder="请输入商品描述"
+                  v-model="baseInfo.detailDes"
+                  class="remarks-input"
+                >
+                </el-input> -->
+                {{ info.detailDes }}
+              </el-form-item>
+            </el-form>
+            <div class="good-detail">
+              <!-- <UpImgDetail :max-pic-num="10" :imageList="baseInfo.detailPic" /> -->
+              <el-image
+                class="img"
+                v-for="(item, index) in info.detailPic"
+                :key="index"
+                :src="item"
+                fit="cover"
+                style="width: 112px;height: auto;"
+                :preview-src-list="info.detailPic"
+              >
+              </el-image>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="btn-box" v-if="info.auditStatus === 1">
+        <button class="cancel-btn" @click="handleRejectModal">拒绝</button>
+        <button class="confirm-btn" @click="handleResolve">
+          审核通过
+        </button>
+      </div>
+    </div>
+    <el-dialog title="审核通过" width="400px" :visible.sync="resolveVisible">
+      <el-form
+        ref="form"
+        :model="form"
+        class="authorization-form"
+        label-width="auto"
+      >
+        <el-form-item label="商品关联分类:" prop="uid" class="form-item">
+          <el-cascader
+            v-model="form.category"
+            :options="categoryList"
+            placeholder="请选择"
+            size="small"
+            :props="{
+              children: 'second',
+              value: 'id',
+              label: 'name',
+              checkStrictly: true,
+            }"
+            class="good-input"
+            style="width: 230px"
+          ></el-cascader> </el-form-item
+      ></el-form>
+      <div slot="footer" class="dialog-footer">
+        <!-- <el-button @click.native="reject()" class="cancel-btn">驳 回</el-button> -->
+        <el-button @click.native="resolveVisible = false" class="cancel-btn btn"
+          >取 消</el-button
+        >
+        <el-button
+          type="primary"
+          @click.native="handleResolve"
+          class="confirm-btn btn"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+    <el-dialog title="驳回申请" width="400px" :visible.sync="rejectVisible">
+      <div class="reject-title"><span>*</span>驳回申请</div>
+      <div style="padding: 0 16px">
+        <div class="remark-box">
+          <textarea
+            rows="8"
+            class="remark"
+            v-model="remark"
+            placeholder="驳回理由"
+          ></textarea>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <!-- <el-button @click.native="reject()" class="cancel-btn">驳 回</el-button> -->
+        <el-button @click.native="rejectVisible = false" class="cancel-btn btn"
+          >取 消</el-button
+        >
+        <el-button
+          type="primary"
+          @click.native="handleReject"
+          class="confirm-btn btn"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import GoodsAttr2 from '../../components/goods/goodsAttr2';
+import imgUpLoader from '../../components/goods/imgUpLoader';
+import UpImgDetail from '../../components/goods/upImgDetail';
+import Header from '../../components/common/header';
+export default {
+  components: { GoodsAttr2, imgUpLoader, UpImgDetail, Header },
+  name: 'goods-lock',
+  data() {
+    return {
+      loading: 0,
+      title: {
+        // 页面标题
+        firstTitile: '商品管理',
+        secondTitle: '商品详情'
+      },
+      categoryList: [],
+      goodsInfo: {},
+      bannerNum: 5,
+      rules: {
+      },
+      attribute: [],
+      key: [],
+      // weight: false,
+      remark: '',
+      skuList: [],
+      gid: null,
+      id: null,
+      freightList: [],
+      optionList: [{ name: '', value: '' }],
+      form: {category: null},
+      categoryList: [],
+      info: {},
+      baseInfo: {
+        status: null,
+        name: '',
+        detailDes: '',
+        detailPic: [],
+        tagline: '',
+        slideshow: [],
+        secondSortId: null,
+        linePrice: null,
+        masterPic: '',
+        genre: 1,
+        baseMonthlySales: null,
+        sid: null,
+        cost: null,
+        twig: null,
+        newBuy: 0,
+        limitNum: 0,
+        chainId: null,
+        detailContent: ''
+      },
+      businessList: [],
+      rejectVisible: false,
+      resolveVisible: false
+    };
+  },
+  computed: {},
+  async mounted() {
+    // this.getBusinessList();
+    // await this.getCategoryList();
+    // this.getFreightList();
+    let query = this.$route.query;
+    if (query && query.gid) {
+      this.gid = query.gid;
+      this.getGoodDetail();
+    }
+  },
+  methods: {
+    // 获取商品信息
+    getGoodDetail() {
+      this.loading++;
+      this.httpGet(this.$root.getShopGoodInfo, { gid: this.gid }).then(
+        (res) => {
+          this.loading--;
+          let baseInfo = { ...this.baseInfo };
+          for (let key in baseInfo) {
+            baseInfo[key] = res[key];
+          }
+          baseInfo.secondSortId = [res.firstSortId, res.secondSortId];
+          this.baseInfo = { ...baseInfo };
+          this.skuList = res.skuList;
+          this.key = this.getAttrName(res.skuList);
+          this.attribute = this.getAttrs(res.skuList);
+          this.info = res;
+          // this.gid = res.gid;
+          // this.id = res.id;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    handleResolveModal(){
+      this.resolveVisible = true;
+    },
+    handleResolve(){
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确认是否通过审核?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPut(this.$root.passShopGood, {
+          id: this.info.id,
+        }).then(
+          (res) => {
+            this.loading--;
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.getGoodDetail();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    handleRejectModal(){
+      this.remark = '';
+      this.rejectVisible = true;
+    },
+    handleReject(){
+      this.loading++;
+        this.httpPost(this.$root.rejectShopGood, {
+          id: this.info.id,
+          auditRejectReason: this.remark
+        }).then(
+          (res) => {
+            this.loading--;
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.rejectVisible = false;
+            this.getGoodDetail();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+    },
+    getBusinessList() {
+      this.loading++;
+      this.httpGet(this.$root.getBusinessList, {
+        size: 9999
+      }).then(
+        (res) => {
+          this.loading--;
+          // this.businessList = [{ name: '未选择', id: 0 }, ...res.list];
+          this.businessList = res.list;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 根据组件转换格式为接口需要格式
+    getAttrs(skus) {
+      let newSkus = [...skus];
+      let skusFormat = newSkus.map((item) => {
+        let obj = {};
+        item.attrs.forEach((attr) => {
+          obj[attr.keyName] = attr.value;
+        });
+        return {
+          ...item,
+          attribute: obj
+        };
+      });
+      return skusFormat;
+    },
+    // 获取所有规格
+    getAttrName(skus) {
+      let newAttrs = [];
+      skus.forEach((item) => {
+        item.attrs.forEach((attr) => {
+          if (newAttrs.indexOf(attr.keyName) < 0) {
+            newAttrs.push(attr.keyName);
+          }
+        });
+      });
+      return newAttrs;
+    },
+    // 获取分类列表
+    getCategoryList() {
+      this.loading++;
+      this.httpGet(this.$root.getGoodsCategoryList, {}).then(
+        (res) => {
+          this.loading--;
+          this.categoryList = res.list.filter((item) => item.second.length);
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 获取模板列表
+    getFreightList() {
+      this.loading++;
+      this.httpGet(this.$root.getFreightList, {}).then(
+        (res) => {
+          this.loading--;
+          this.freightList = res.list;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 取消
+    handleCancel() {
+      this.$router.push({ name: 'goodsManage' });
+    },
+    getMasterImgList(index, val) {
+      if (val === '') {
+        // slideshow.splice(index, 1);
+        this.baseInfo.masterPic = null;
+      } else {
+        this.baseInfo.masterPic = val;
+      }
+      this.$refs.form.clearValidate(['masterPic']);
+    },
+    // 设置
+    getImgList(index, val) {
+      // 获取主图
+      let slideshow = [...this.baseInfo.slideshow];
+      if (val === '') {
+        // slideshow.splice(index, 1);
+        slideshow[index] = null;
+      } else {
+        slideshow[index] = val;
+      }
+      // this.bannerNum = slideshow.length <= 5 ? slideshow.length : 5;
+      this.baseInfo.slideshow = slideshow;
+      this.$refs.form.clearValidate(['slideshow']);
+    },
+    // 获取规格值
+    editAttr(val) {
+      console.log(val);
+      let newSkus = val.map((item) => {
+        let arr = [];
+        for (let key in item.attribute) {
+          arr.push({
+            keyName: key,
+            value: item.attribute[key]
+          });
+        }
+        return {
+          sku: {
+            price: +item.price,
+            stock: +item.stock,
+            pic: item.pic,
+            kid: item.kid,
+            code: item.code,
+            chainId: item.chainId,
+            cost: +item.cost || 0
+          },
+          attrs: arr
+        };
+      });
+      this.skuList = newSkus;
+    },
+    getSales(val) {
+      this.baseInfo.linePrice = +val;
+    },
+    // getDetail(val) {
+    //   this.baseInfoForm.details = [...val];
+    // },
+    // 下一步
+    handleConfirm() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          if (!this.skuList.length) {
+            this.$message({
+              message: '请选择商品规格',
+              type: 'warning'
+            });
+            return;
+          }
+          // for (let spuKey in this.spu) {
+          //   this.spu[spuKey] = this.baseInfo[spuKey];
+          // }
+          this.addGood();
+        } else {
+          this.$message({
+            message: '请填写商品信息',
+            type: 'warning'
+          });
+        }
+      });
+    },
+    // 添加商品
+    addGood() {
+      // 请求数据
+      let inputData = {
+        spu: this.baseInfo,
+        skuList: this.skuList,
+        secondSortId: this.baseInfo.secondSortId[1]
+      };
+      console.log(inputData.spu);
+      inputData.spu.slideshow = this.baseInfo.slideshow.filter((item) => item);
+      inputData.spu.baseMonthlySales = +inputData.spu.baseMonthlySales || 0;
+      inputData.spu.cost = +inputData.spu.cost || 0;
+      inputData.spu.limitNum = +inputData.spu.limitNum || 0;
+      inputData.spu.newBuy = +inputData.spu.newBuy || 0;
+      // inputData.spu.freight = 1;
+      // 是否为编辑商品
+      let method = 'httpPost';
+      if (this.gid) {
+        method = 'httpPut';
+        inputData.spu.id = this.id;
+        inputData.spu.gid = this.gid;
+      }
+      this.loading++;
+      this[method](
+        this.gid ? this.$root.editGoods : this.$root.createGoods, // 添加商品 or 创建商品
+        inputData
+      ).then(
+        (res) => {
+          this.$message({
+            message: this.gid ? '商品修改成功' : '商品创建成功',
+            type: 'success'
+          });
+          this.loading--;
+          this.$router.push({
+            name: 'goodsManage'
+          });
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    addOption() {
+      this.optionList.push({
+        name: '',
+        value: ''
+      });
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.good-info-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 24px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 20px;
+      border-radius: 2px;
+
+      .form-item{
+        min-height: 60px;
+        .value{
+          margin-left: 40px;
+          word(14px, #333);
+        }
+      }
+
+      .group {
+        .basic {
+          height: 48px;
+          line-height: 48px;
+          font-size: 20px;
+          text-indent: 20px;
+          // margin-top: 20px;
+          color: gray3;
+          flex-x(flex-start);
+
+          span {
+            // color: red;
+            color: gray6;
+            margin-right: 3px;
+          }
+        }
+      }
+
+      .base-info {
+        .good-form {
+          padding: 20px 0 0;
+
+          .img-box {
+            flex-x(flex-start);
+          }
+        }
+
+        .base-info-form {
+          margin-left: 90px;
+        }
+
+        .good-input {
+          width: 620px;
+        }
+
+        .tip {
+          font-size: 14px;
+          color: gray6;
+          margin-left: 16px;
+        }
+
+        .red {
+          color: red;
+        }
+
+        .option-box {
+          background: #F7F8FA;
+          padding: 0 24px;
+          border-radius: 2px;
+          border: 1px solid #E8E8E8;
+          // height: 32px;
+          overflow: hidden;
+
+          .option-item {
+            flex-x(flex-start);
+            height: 40px;
+
+            &.option-head {
+              height: 32px;
+            }
+
+            input {
+              height: 32px;
+              background: #fff;
+              border: 1px solid #E8E8E8;
+              box-sizing: border-box;
+            }
+
+            .cell1 {
+              width: 330px;
+
+              input {
+                width: 310px;
+                padding: 0 10px;
+                box-sizing: border-box;
+              }
+            }
+
+            .cell2 {
+              input {
+                width: 500px;
+                padding: 0 10px;
+                box-sizing: border-box;
+              }
+            }
+          }
+
+          .option-btn {
+            width: 94px;
+            height: 32px;
+            border: 1px solid #E8E8E8;
+            box-sizing: border-box;
+            background: #fff;
+            flex-x(center);
+            font-size: 14px;
+            border-radius: 2px;
+            cursor: pointer;
+            margin-top: 12px;
+            margin-bottom: 16px;
+          }
+        }
+      }
+
+      .good-specs-box {
+        .good-specs {
+          // padding: 20px;
+          // border: 1px solid gray9;
+          margin: 30px 70px 0 60px;
+        }
+      }
+
+      .remarks {
+        width: 100%;
+        padding-left: 95px;
+        box-sizing: border-box;
+
+        .remarks-input {
+          max-width: 600px;
+
+          textarea {
+            font-size: 14px;
+            max-width: 600px;
+          }
+        }
+
+        .good-detail {
+          padding-left: 82px;
+          flex-y(flex-start, flex-start);
+        }
+      }
+
+      .good-detail {
+        padding-bottom: 50px;
+      }
+    }
+  }
+
+  .btn-box {
+    background: white;
+    width: 100%;
+    flex-x(center);
+    padding-bottom: 48px;
+
+    .cancel-btn {
+      width: 96px;
+      height: 40px;
+      cancel-btn();
+      // border-radius: 23px;
+    }
+
+    .confirm-btn {
+      width: 96px;
+      height: 40px;
+      margin-left: 20px;
+      confirm-btn();
+    }
+  }
+  .remark-box {
+    width: 100%;
+    padding-left: 15px;
+    box-sizing: border-box;
+    .remark {
+      border: 1px solid #f1f1f1;
+      width: 100%;
+      margin: 12px 0;
+      padding: 12px;
+      box-sizing: border-box;
+    }
+  }
+}
+</style>

+ 915 - 0
src/view/goods/goods-category.vue

@@ -0,0 +1,915 @@
+<template>
+  <div class="goods-category-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="btn" @click="categoryModal('add', { isFirst: true })">
+          + 添加分类
+        </div>
+        <el-table
+          :data="categoryList"
+          class="goods-category-table table no-border-table"
+          :tree-props="{ children: 'second', hasChildren: 'hasChildren' }"
+          row-key="tid"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <!-- <el-table-column
+            type="index"
+            :index="tableIndex"
+            align="center"
+            label="编号"
+            width="120"
+          ></el-table-column> -->
+          <el-table-column
+            prop="index"
+            align="center"
+            label="序号"
+            width="120"
+          ></el-table-column>
+          <el-table-column
+            prop="name"
+            align="center"
+            label="一级分类名称"
+            width="360"
+          >
+            <div
+              slot-scope="scope"
+              :class="{ 'table-children': scope.row.isChildren }"
+            >
+              {{ scope.row.name }}
+            </div>
+          </el-table-column>
+          <el-table-column prop="pic" align="center" label="分类配图">
+            <div slot-scope="scope">
+              <img class="img" :src="scope.row.pic" alt="" />
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="twig"
+            align="center"
+            label="排序"
+          ></el-table-column>
+          <el-table-column prop="sys" align="center" label="系统号">
+            <div slot-scope="scope" v-if="scope.row.isFirst">
+              {{ scope.row.sys ? "贝通天下" : "悦之链" }}
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="isDeclaration"
+            align="center"
+            label="是否为报单区"
+          >
+            <div slot-scope="scope" v-if="scope.row.isFirst">
+              {{ scope.row.isDeclaration ? "是" : "否" }}
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="isReward"
+            align="center"
+            label="是否为打赏区"
+          >
+            <div slot-scope="scope" v-if="scope.row.isFirst">
+              {{ scope.row.isReward ? "是" : "否" }}
+            </div>
+          </el-table-column>
+          <el-table-column prop="status" align="center" label="设为推荐分类">
+            <div
+              slot-scope="scope"
+              v-if="scope.row.isFirst"
+              @click="handleRecommend(scope.row.id, scope.row.recommend)"
+            >
+              <i
+                v-if="scope.row.recommend === 1"
+                class="iconfont icon-checkbox checked-icon"
+              ></i>
+              <i v-else class="iconfont no-checked-icon"></i>
+            </div>
+          </el-table-column>
+          <el-table-column prop="status" align="center" label="是否在C端展示">
+            <div
+              slot-scope="scope"
+              v-if="scope.row.isFirst"
+              @click="handleOpen(scope.row.id, scope.row.open)"
+            >
+              <i
+                v-if="scope.row.open === 0"
+                class="iconfont icon-checkbox checked-icon"
+              ></i>
+              <i v-else class="iconfont no-checked-icon"></i>
+            </div>
+          </el-table-column>
+          <!-- <el-table-column prop="status" align="center" label="商户专用分类">
+            <div slot-scope="scope" v-if="!scope.row.isFirst" @click="handleOpen1(scope.row.id, scope.row.shopUse)">
+              <i v-if="scope.row.shopUse === 1" class="iconfont icon-checkbox checked-icon"></i>
+              <i v-else class="iconfont no-checked-icon"></i>
+            </div>
+          </el-table-column> -->
+          <el-table-column prop="isDiy" align="center" label="自定义分区">
+            <div slot-scope="scope" v-if="!scope.row.isFirst">
+              <i v-if="scope.row.isDiy === 2" class="iconfont icon-checkbox checked-icon"></i>
+              <i v-else class="iconfont no-checked-icon"></i>
+            </div>
+          </el-table-column>
+          <el-table-column label="操作" align="center" width="300">
+            <div slot-scope="scope">
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="deleteCategory(scope.row.id, scope.row.isFirst)"
+                >
+                  删除
+                </button>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="categoryModal('edit', scope.row)"
+                >
+                  编辑
+                </button>
+                <button
+                  size="mini"
+                  v-if="scope.row.isFirst"
+                  class="table-btn"
+                  @click="categoryModal('addChildren', scope.row)"
+                >
+                  添加子分类
+                </button>
+              </div>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <!-- <div class="footer">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div> -->
+    </div>
+    <!-- 发布公告弹窗 -->
+    <el-dialog width="750px" :visible.sync="categoryShow">
+      <div slot="title">
+        <p class="dialog-title">
+          {{ type === "add" ? "新增" : "编辑"
+          }}{{ firstInfo.id ? "二级" : "一级" }}分类
+        </p>
+      </div>
+      <div class="dialog-content">
+        <el-form
+          ref="form"
+          :rules="rules"
+          :model="form"
+          class="category-form"
+          label-width="auto"
+        >
+          <el-form-item
+            v-if="firstInfo.id"
+            label="所属一级分类:"
+            prop="name"
+            class="form-item"
+          >
+            {{ firstInfo.name }}
+          </el-form-item>
+          <el-form-item
+            :label="firstInfo.id ? '二级分类名称:' : '一级分类名称:'"
+            prop="name"
+            class="form-item"
+          >
+            <el-input
+              placeholder="请输入分类名称"
+              class="input"
+              v-model="form.name"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="排序:" prop="twig" class="form-item">
+            <el-input
+              placeholder="请输入序号"
+              class="input"
+              v-model.number="form.twig"
+              type="number"
+              onkeypress="return( /[\d]/.test(String.fromCharCode(event.keyCode)))"
+            ></el-input>
+            <div class="tip" style="margin-left: 12px">
+              数值越大,排序越靠前
+            </div>
+          </el-form-item>
+          <el-form-item class="img_item" prop="pic" label="分区配图:">
+            <div class="addImg">
+              <div class="img-box">
+                <img ref="img" :src="form.pic" v-if="form.pic" />
+                <div class="icon" v-else>
+                  <p><i class="el-icon-plus" style="font-size: 32px"></i></p>
+                  <!-- <p>图片</p> -->
+                  <!-- <p class="tip">支持扩展名:.jpg .png</p> -->
+                </div>
+                <input
+                  type="file"
+                  class="file"
+                  ref="inputImg"
+                  @change="addChangeImg"
+                />
+              </div>
+              <p class="tips">仅支持png格式</p>
+            </div>
+          </el-form-item>
+          <!-- <el-form-item v-if="!firstInfo.id" label="团队长ID:" prop="groupUid" class="form-item">
+            <el-input placeholder="请输入ID" class="input" v-model.number="form.groupUid" type="number"
+              onkeypress="return( /[\d]/.test(String.fromCharCode(event.keyCode)))"></el-input>
+          </el-form-item> -->
+          <el-form-item
+            v-if="!firstInfo.id"
+            label="报单区:"
+            prop="isDeclaration"
+            class="form-item"
+          >
+            <el-checkbox
+              v-model="form.isDeclaration"
+              :true-label="1"
+              :false-label="0"
+              >是否为报单区</el-checkbox
+            >
+          </el-form-item>
+          <el-form-item
+            v-if="!firstInfo.id"
+            label="打赏区:"
+            prop="isReward"
+            class="form-item"
+          >
+            <el-checkbox
+              v-model="form.isReward"
+              :true-label="1"
+              :false-label="0"
+              >是否为打赏区</el-checkbox
+            >
+          </el-form-item>
+          <el-form-item
+            v-if="!firstInfo.id"
+            label="绿通兑换专区:"
+            prop="isGold"
+            class="form-item"
+          >
+            <el-checkbox
+              v-model="form.isGold"
+              :true-label="1"
+              :false-label="0"
+              >是否为绿通兑换专区</el-checkbox
+            >
+          </el-form-item>
+          <el-form-item
+            v-if="!firstInfo.id"
+            label="系统号:"
+            prop="sys"
+            class="form-item"
+          >
+            <el-radio-group v-model="form.sys">
+              <el-radio :label="0">悦之链</el-radio>
+              <el-radio :label="1">贝通天下</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item
+            v-if="firstInfo.id"
+            label="激活绿通累计消费金额:"
+            prop="unfreezeAmount"
+            class="form-item"
+          >
+            <el-input
+              placeholder="请输入"
+              class="input"
+              v-model.number="form.unfreezeAmount"
+              type="number"
+            ></el-input>
+          </el-form-item>
+          <el-form-item
+            label="购买商品赠送额外积分:"
+            prop="name"
+            class="form-item"
+            v-if="
+              firstInfo.id &&
+                (firstInfo.name === '超值礼包' ||
+                  firstInfo.fName === '超值礼包' ||
+                  firstInfo.isDeclaration)
+            "
+          >
+            <el-radio-group v-model="form.genre">
+              <el-radio :label="1">固定积分</el-radio>
+              <el-radio :label="2">倍数积分</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item
+            label=""
+            prop="name"
+            class="form-item"
+            v-if="
+              firstInfo.id &&
+                (firstInfo.name === '超值礼包' ||
+                  firstInfo.fName === '超值礼包' ||
+                  firstInfo.isDeclaration)
+            "
+          >
+            <el-input
+              placeholder="输入固定积分金额"
+              class="input"
+              v-model="form.genreValue"
+            ></el-input>
+          </el-form-item>
+          <el-form-item
+            label="激活身份:"
+            prop="name"
+            class="form-item"
+            v-if="
+              firstInfo.id &&
+                (firstInfo.name === '超值礼包' ||
+                  firstInfo.fName === '超值礼包' ||
+                  firstInfo.isDeclaration)
+            "
+          >
+            <el-select v-model="form.role" class="input" placeholder="请选择">
+              <el-option
+                v-for="item in role"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <!-- <el-form-item label="复购专区:" prop="name" class="form-item" v-if="
+            firstInfo.id &&
+            (firstInfo.name === '超值礼包' || firstInfo.fName === '超值礼包')
+          ">
+            <el-checkbox v-model="form.isRepurchase" :true-label="1" :false-label="2">是否设置为复购专区</el-checkbox>
+          </el-form-item> -->
+          <el-form-item label="商户专用分类:" v-if="firstInfo.id">
+            <el-checkbox v-model="form.shopUse" :true-label="1" :false-label="0"
+              >是否为商户专用分类</el-checkbox
+            >
+          </el-form-item>
+          <el-form-item label="自定义分区:" v-if="firstInfo.id">
+            <el-checkbox v-model="form.isDiy" :true-label="2" :false-label="1"
+              >是否为自定义分区</el-checkbox
+            >
+          </el-form-item>
+          <el-form-item
+            label="礼包专区:"
+            prop="name"
+            class="form-item"
+            v-if="
+              firstInfo.id &&
+                (firstInfo.name === '超值礼包' ||
+                  firstInfo.fName === '超值礼包')
+            "
+          >
+            <el-radio-group v-model="form.newType">
+              <el-radio :label="1">百元专区</el-radio>
+              <el-radio :label="2">万元专区</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <button
+          class="btn cancel-btn"
+          size="small"
+          @click="categoryShow = false"
+        >
+          取 消
+        </button>
+        <button class="btn confirm-btn" size="small" @click="handleConfirm">
+          确 定
+        </button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import dayjs from 'dayjs';
+import Header from '../../components/common/header';
+import { role } from '@/config.js';
+export default {
+  components: {
+    Header
+  },
+  name: 'goods-category',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 9999, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '商品管理',
+        secondTitle: '商品分类管理'
+      },
+      type: '', // edit:修改  add:添加
+      categoryInfo: {}, // 公告信息
+      categoryList: [], // 公告列表
+      categoryShow: false, // 公告弹窗
+      firstInfo: {},
+      form: {
+        // 表单数据
+        name: '',
+        pic: '',
+        twig: null,
+        open: 1,
+        genreValue: 0,
+        genre: 0,
+        groupUid: null,
+        role: null,
+        // isRepurchase: 0,
+        unfreezeAmount: null,
+        shopUse: 0,
+        isDiy: 1,
+        isDeclaration: 0,
+        isReward: 0,
+        isGold: 0,
+        sys: 0,
+        newType: null
+      },
+      role: [
+        {
+          name: '无',
+          id: 0
+        },
+        {
+          name: 'VIP',
+          id: 1
+        },
+        {
+          name: '经销商',
+          id: 10
+        },
+        {
+          name: '代理商',
+          id: 12
+        }
+      ],
+      rules: {
+        // 表单验证规则
+        name: [{ required: true, message: '请输入内容', trigger: 'blur' }],
+        twig: [{ required: true, message: '请输入内容', trigger: 'blur' }],
+        pic: [{ required: true, message: '请输入内容', trigger: 'change' }]
+      }
+    };
+  },
+  mounted() {
+    // 获取列表
+    this.getCategoryList();
+  },
+  filters: {
+    // 时间格式化
+    dateFormat(date) {
+      if (!date) return '请选择时间';
+      let day = dayjs(date);
+      return day.format('YYYY-MM-DD HH:mm:ss');
+    }
+  },
+  computed: {},
+  methods: {
+    // 表格序号
+    tableIndex(index) {
+      return ++index;
+    },
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getCategoryList();
+    },
+    // 获取分区列表
+    getCategoryList() {
+      this.loading++;
+      this.httpGet(this.$root.getGoodsCategoryList, {
+        page: this.currentPage,
+        size: this.size
+      }).then(
+        (res) => {
+          this.loading--;
+          this.categoryList = res.list.map((item, index) => {
+            return {
+              ...item,
+              index: ++index,
+              isFirst: true,
+              tid: item.id,
+              second: item.second.map((sec) => {
+                return {
+                  ...sec,
+                  fName: item.name,
+                  tid: item.id + '-' + sec.id,
+                  isDeclaration: item.isDeclaration
+                };
+              })
+            };
+          });
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 公告弹窗
+    categoryModal(type, rowData = {}) {
+      this.$refs.form && this.$refs.form.clearValidate();
+      this.type = true;
+      if ((rowData && type !== 'addChildren') || !rowData.isFirst) {
+        this.form.name = rowData.name;
+        this.form.pic = rowData.pic;
+        this.form.twig = rowData.twig;
+        this.form.id = rowData.id;
+      } else {
+        this.form = {
+          name: '',
+          pic: '',
+          twig: null,
+          groupUid: null,
+          unfreezeAmount: null,
+          shopUse: 0,
+          isDiy: 1,
+          genreValue: 0,
+          genre: 0,
+          role: null,
+          isDeclaration: 0,
+          isReward: 0,
+          isGold: 0,
+          sys: 0
+        };
+      }
+      if (type === 'addChildren' || !rowData.isFirst) {
+        this.firstInfo = rowData;
+        this.form.fid = rowData.fid || rowData.id;
+        this.type = false;
+      } else {
+        this.firstInfo = {};
+      }
+      if (rowData.fName === '超值礼包' || rowData.isDeclaration) {
+        this.form.genre = rowData.genre;
+        this.form.genreValue = rowData.genreValue;
+        // this.form.isRepurchase = rowData.isRepurchase || 0;
+        this.form.role = rowData.role || null;
+      }
+      if (rowData.fName === '超值礼包'){
+        this.form.newType = rowData.newType || 0;
+      }
+      this.form.groupUid = rowData.groupUid || null;
+      this.form.unfreezeAmount = rowData.unfreezeAmount || null;
+      this.form.shopUse = rowData.shopUse || 0;
+      this.form.isDiy = rowData.isDiy || 1;
+      this.form.isDeclaration = rowData.isDeclaration || 0;
+      this.form.isReward = rowData.isReward || 0;
+      this.form.isGold = rowData.isGold || 0;
+      this.form.sys = rowData.sys || 0;
+      this.categoryShow = true;
+    },
+    // 确认发布/修改公告
+    handleConfirm() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.loading++;
+          let inputData = {};
+          let url = '';
+          if (this.type) {
+            url = this.$root.updateFirstCategory;
+            inputData = this.form;
+          } else {
+            url = this.$root.updateSecondCategory;
+            inputData = this.form;
+          }
+          this.categoryShow = false;
+          inputData.unfreezeAmount = +inputData.unfreezeAmount || null;
+          inputData.groupUid = +inputData.groupUid || null;
+          this.httpPost(url, inputData).then(
+            (res) => {
+              this.$message({
+                message: '操作成功',
+                type: 'success'
+              });
+              this.loading--;
+              this.getCategoryList();
+            },
+            (res) => {
+              this.loading--;
+              this.$message.error(res);
+            }
+          );
+        } else {
+          return false;
+        }
+      });
+    },
+    // 删除分区
+    deleteCategory(id, isFirst) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要删除该分类吗?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        let url = isFirst
+          ? this.$root.deleteFirstCategory
+          : this.$root.deleteSecondCategory;
+        this.httpDelete(url, {
+          id
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getCategoryList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    handleRecommend(id, recommend) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>是否设置该分类为推荐分类?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPost(this.$root.changeRecommend, {
+          id,
+          recommend: +!recommend
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getCategoryList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    handleOpen(id, open) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>是否开启在C端展示?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPost(this.$root.changeCategoryOpen, {
+          id,
+          open: +!open
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getCategoryList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    handleOpen1(id, shopUse) {
+      let str = '';
+      if(shopUse === 1) str = '关闭';
+      if(shopUse === 0) str = '开启';
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>是否${str}商户专用分类?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPost(this.$root.changeCategoryOpen, {
+          id,
+          open: +!open
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getCategoryList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    // 图片改变
+    addChangeImg(e) {
+      this.upPic(e, (res) => {
+        this.$set(this.form, 'pic', res);
+        // 清空input value,解决重复图片不触发change
+        this.$refs.inputImg.value = '';
+        this.$refs.form.clearValidate(['pic']);
+      });
+    },
+    // 上传图片
+    upPic(e, fun) {
+      // 上传图片
+      let file = e.target.files[0];
+      if (!file) {
+        return;
+      }
+      this.request.upPic({ prefix: 'other', file: file }).then(
+        (res) => {
+          fun(res);
+        },
+        (res) => { }
+      );
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.goods-category-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 24px;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      .checked-icon {
+        color: btn-color;
+        font-size: 16px;
+      }
+
+      .no-checked-icon {
+        display: inline-block;
+        color: #aaa;
+        border: 1px solid #aaa;
+        background: #eee;
+        width: 15px;
+        height: 15px;
+        border-radius: 3px;
+        box-sizing: border-box;
+      }
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin-bottom: 16px;
+      }
+
+      .table {
+        .img {
+          height: 48px;
+          width: auto;
+        }
+
+        .table-children {
+          transform: translateX(40%);
+          white-space: nowrap;
+        }
+      }
+
+      // 表格按钮
+      .table-btn {
+        width: 80px;
+        height: 24px;
+        line-height: 24px;
+        color: gray3;
+        font-size: 12px;
+        margin-right: 8px;
+        cancel-btn();
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+
+  .dialog-content {
+    flex-y();
+
+    .addImg {
+      flex-x(flex-start);
+
+      .icon {
+        width: 81px;
+        height: 81px;
+        background: #E8E8E8;
+        border-width: 0;
+
+        i {
+          color: #999;
+        }
+      }
+
+      .tips {
+        align-self: flex-end;
+        margin-left: 8px;
+      }
+    }
+
+    .tip {
+      margin-top: 0;
+    }
+
+    .tip {
+      word(14px, gray9);
+    }
+
+    .input {
+      width: 160px;
+    }
+  }
+
+  .category-form {
+    padding: 32px 0 10px;
+  }
+}
+</style>

+ 731 - 0
src/view/goods/goods-manage.vue

@@ -0,0 +1,731 @@
+<template>
+  <div class="goods-manage-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <div class="btn" @click="toGood('add')">+ 新建商品</div>
+          <div class="btn-box">
+            <div class="label">商品商家:</div>
+            <el-select
+              v-model="filter.sid"
+              size="small"
+              class="select"
+              style="width: 153px"
+              placeholder="请选择"
+            >
+              <el-option :value="null" label="全部"> </el-option>
+              <el-option
+                :value="item.id"
+                :label="item.name"
+                v-for="item in businessList"
+                :key="item.id"
+              >
+              </el-option>
+            </el-select>
+            <div class="label">商品分类:</div>
+            <el-cascader
+              v-model="category"
+              :options="categoryList"
+              placeholder="请选择"
+              size="small"
+              :props="{
+                children: 'second',
+                value: 'id',
+                label: 'name',
+                checkStrictly: true,
+              }"
+              class="good-input"
+              style="width: 153px"
+            ></el-cascader>
+            <div class="label">商品状态:</div>
+            <el-select
+              v-model="filter.status"
+              size="small"
+              class="select"
+              style="width: 153px"
+              placeholder="请选择"
+            >
+              <el-option :value="null" label="全部"> </el-option>
+              <el-option :value="3" label="出售中"> </el-option>
+              <el-option :value="1" label="仓库中"> </el-option>
+            </el-select>
+            <div class="label">系统号:</div>
+            <el-select
+              v-model="filter.sys"
+              size="small"
+              class="select"
+              style="width: 153px"
+              placeholder="请选择"
+            >
+              <el-option :value="null" label="全部"> </el-option>
+              <el-option :value="0" label="悦之链"> </el-option>
+              <el-option :value="1" label="贝通天下"> </el-option>
+            </el-select>
+            <el-input
+              class="input"
+              v-model="filter.name"
+              style="width: 188px; margin-left: 40px"
+              placeholder="此框输入商品名搜索"
+              size="small"
+            ></el-input>
+            <button class="search" @click="search">搜索</button>
+            <div class="import-box">
+              <div class="btn" @click="order2excel">导出</div>
+            </div>
+          </div>
+        </div>
+        <el-table
+          :data="goodsList"
+          class="table table no-border-table"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+        >
+          <el-table-column prop="master_pic" align="center" label="商品主图">
+            <div slot-scope="scope">
+              <img class="master-pic" :src="scope.row.masterPic" alt="" />
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="gid"
+            align="center"
+            label="商品ID"
+          ></el-table-column>
+          <el-table-column
+            prop="name"
+            align="center"
+            label="商品名称"
+          ></el-table-column>
+          <el-table-column
+            prop="minPrice"
+            align="center"
+            label="价格/元"
+          ></el-table-column>
+          <el-table-column prop="groupingName" align="center" label="商品分类">
+            <div slot-scope="scope">
+              {{ scope.row.firstSortName + "/" + scope.row.secondSortName }}
+            </div>
+          </el-table-column>
+          <el-table-column prop="status" align="center" label="状态">
+            <div slot-scope="scope">
+              {{ scope.row.status === 3 ? "出售中" : "仓库中" }}
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="totalStock"
+            align="center"
+            label="库存"
+          ></el-table-column>
+          <el-table-column prop="twig" align="center" label="排序">
+            <template slot-scope="scope">
+              <u class="blue" @click="editSort(scope.row)">{{
+                scope.row.twig
+              }}</u>
+            </template>
+          </el-table-column>
+          <!-- <el-table-column
+            prop="twig"
+            align="center"
+            width="200"
+            label="会员设置"
+          >
+            <div slot-scope="scope" style="display: flex">
+              <div class="vip-btn" @click="showSetting(scope.row.gid)">
+                商品可见用户
+              </div>
+              <div class="vip-btn" @click="priceSetting(scope.row.gid)">
+                会员价格设置
+              </div>
+            </div>
+          </el-table-column> -->
+          <el-table-column label="操作" align="center" width="300">
+            <div slot-scope="scope">
+              <div class="table-btn-box">
+                <button
+                  size="mini"
+                  class="table-btn"
+                  v-if="scope.row.status === 3"
+                  @click="updateStatus(1, scope.row.id)"
+                >
+                  下架
+                </button>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  v-else
+                  @click="updateStatus(3, scope.row.id)"
+                >
+                  开售
+                </button>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  v-if="scope.row.status === 1"
+                  @click="toGood('edit', scope.row.gid)"
+                >
+                  编辑商品
+                </button>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="deleteGood(scope.row.gid)"
+                >
+                  删除商品
+                </button>
+              </div>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer" :key="paginationKey">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <!-- 修改排序弹窗 -->
+    <el-dialog title="更改排序" width="400px" :visible.sync="sortShow">
+      <el-form label-width="60px" size="mini" ref="editSort" inline-message>
+        <el-form-item label="排序:" prop="tableData" style="margin-top: 15px">
+          <el-input v-model="currentSort" type="number" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button class="btn cancel-btn" @click="sortShow = false"
+          >取 消</el-button
+        >
+        <el-button class="btn confirm-btn" @click="saveSort">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog
+      :show-close="false"
+      :close-on-click-modal="false"
+      title="生成中..."
+      :visible.sync="showProgressDialog"
+      width="30%"
+      center
+    >
+      <el-progress
+        :percentage="progress"
+        :text-inside="true"
+        :stroke-width="18"
+      ></el-progress>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import dayjs from 'dayjs';
+import Header from '../../components/common/header';
+import myUtils from '../../components/common/whatever2excel';
+export default {
+  components: {
+    Header
+  },
+  name: 'goods-manage',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '商品管理',
+        secondTitle: '商品管理'
+      },
+      filter: {
+        name: '',
+        status: null,
+        sid: null,
+        sys: null
+      },
+      goodsList: [], // 列表
+      categoryList: [],
+      currentId: null,
+      currentSort: null,
+      sortShow: false,
+      paginationKey: +new Date(),
+      category: [],
+      businessList: [],
+      showProgressDialog: false,
+      progress: 0,
+      statusMap: {
+        1: '仓库中',
+        3: '在售'
+      },
+      genreMap: {
+        1: '自营商品',
+        2: '供应链'
+      },
+      businessObj: {}
+    };
+  },
+  beforeRouteEnter(to, from, next) {
+    if (from.name !== 'good') {
+      sessionStorage.setItem('goodManage', '');
+    }
+    next();
+  },
+  mounted() {
+    let data = sessionStorage.getItem('goodManage')
+      ? JSON.parse(sessionStorage.getItem('goodManage'))
+      : '';
+    if (data) {
+      this.filter = {
+        ...this.filter,
+        ...data.filter
+      };
+      this.currentPage = data.currentPage;
+      this.paginationKey = +new Date();
+      this.setSearchData();
+    }
+    // 获取列表
+    this.getCategoryList();
+    this.getBusinessList();
+    this.getGoodsList();
+  },
+  filters: {
+    // 时间格式化
+    dateFormat(date) {
+      if (!date) return '请选择时间';
+      let day = dayjs(date);
+      return day.format('YYYY-MM-DD HH:mm:ss');
+    }
+  },
+  computed: {},
+  methods: {
+    setSearchData() {
+      let goodManage = {
+        currentPage: this.currentPage,
+        filter: this.filter
+      };
+      sessionStorage.setItem('goodManage', JSON.stringify(goodManage));
+    },
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getGoodsList();
+    },
+    // 获取商品列表
+    getGoodsList() {
+      this.setSearchData();
+      this.loading++;
+      this.httpGet(this.$root.getGoodsList, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter,
+        firstSortId: this.category[0] || 0,
+        secondSortId: this.category[1] || 0
+      }).then(
+        (res) => {
+          this.loading--;
+          this.goodsList = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    getBusinessList() {
+      this.loading++;
+      this.httpGet(this.$root.getBusinessList, {
+        size: 9999
+      }).then(
+        (res) => {
+          this.loading--;
+          this.businessList = res.list;
+          let businessObj = {};
+          res.list.forEach(item => {
+            businessObj[item.id] = item.name;
+          });
+          this.businessObj = businessObj;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 获取分类列表
+    getCategoryList() {
+      this.loading++;
+      this.httpGet(this.$root.getGoodsCategoryList, {}).then(
+        (res) => {
+          this.loading--;
+          this.categoryList = res.list.filter((item) => item.second.length);
+          this.categoryList.unshift({
+            name: '全部',
+            id: 0
+            // second: [
+            //   {
+            //     name: '全部',
+            //     id: 0,
+            //     fid: 0
+            //   }
+            // ]
+          });
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      console.log(this.filter);
+      this.currentPage = 1;
+      this.getGoodsList();
+    },
+    editSort(rowData) {
+      // 更改排序
+      this.currentId = rowData.id;
+      this.sortShow = true;
+      this.currentSort = rowData.twig;
+    },
+    saveSort() {
+      // 保存排序
+      this.loading++;
+      this.httpPut(this.$root.updateGoodsTwig, {
+        id: +this.currentId,
+        twig: +this.currentSort
+      }).then(
+        (res) => {
+          this.$message({
+            message: '修改成功!',
+            type: 'success'
+          });
+          this.getGoodsList();
+          this.loading--;
+          this.sortShow = false;
+        },
+        (err) => {
+          this.loading--;
+          this.$message.error(err);
+        }
+      );
+    },
+    updateStatus(status, id) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要将商品${
+          status === 1 ? '放入仓库' : '开售'
+        }吗</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPut(this.$root.updateGoodsStatus, {
+          id,
+          status
+        }).then(
+          (res) => {
+            this.loading--;
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.getGoodsList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    // 删除商品
+    deleteGood(gid) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要删除商品吗</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpDelete(this.$root.deleteGoods, {
+          gid
+        }).then(
+          (res) => {
+            this.loading--;
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.getGoodsList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    // 添加/编辑商品
+    toGood(type, gid) {
+      this.$router.push({
+        name: 'good',
+        query: {
+          type,
+          gid
+        }
+      });
+    },
+    priceSetting(gid) {
+      this.$router.push({
+        name: 'priceSetting',
+        query: {
+          gid
+        }
+      });
+    },
+    showSetting(gid) {
+      this.$router.push({
+        name: 'showSetting',
+        query: {
+          gid
+        }
+      });
+    },
+    async order2excel() {
+      this.loading++;
+      let goodsList = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter,
+        firstSortId: this.category[0] || 0,
+        secondSortId: this.category[1] || 0
+      };
+      await this.httpGet(this.$root.getGoodsImportList, data).then(
+        (res) => {
+          this.loading--;
+          totalPage = Math.ceil(parseInt(res.total) / this.size);
+        },
+        () => {
+          this.loading--;
+        }
+      );
+      this.showProgressDialog = true;
+      this.progress = 0;
+      await this.getAllPages(totalPage, goodsList).then(
+        () => {
+          this.showProgressDialog = false;
+          this.jsonFormatAndToExcel(goodsList);
+        },
+        (err) => {
+          console.error(err);
+          this.showProgressDialog = false;
+        }
+      );
+    },
+    async getAllPages(totalPage, list) {
+      for (let i = 1; i <= totalPage; i++) {
+        let data = {
+          page: i,
+          size: this.size,
+          ...this.filter,
+          firstSortId: this.category[0] || 0,
+          secondSortId: this.category[1] || 0
+        };
+        await this.httpGet(this.$root.getGoodsImportList, data).then((res) => {
+          list.push(...res.list);
+          this.progress = Math.floor((i / totalPage) * 100);
+          console.log('page' + i, list.length);
+        });
+        // console.log(5555, list);
+      }
+    },
+    getAttrs(attrs) {
+      return attrs
+        .map((item) => {
+          return item.keyName + ':' + item.value;
+        })
+        .join('; ');
+    },
+    jsonFormatAndToExcel(list) {
+      let formatList = [];
+      list.forEach((item) => {
+        let obj = {
+          商品ID: item.gid,
+          商品名称: item.name,
+          商品分类: item.firstSortName + '-' + item.secondSortName,
+          状态: this.statusMap[item.status],
+          商品类型: this.genreMap[item.genre],
+          '当前月销量(含基础销量)': item.monthlySales,
+          商品商家: this.businessObj[item.sid],
+          成本: item.cost,
+          卖价: item.linePrice,
+          总库存: item.skuList.reduce((pre, cur) => {
+            return pre + cur.stock;
+          }, 0)
+        };
+        item.skuList.forEach((sku, index) => {
+          obj[`规格${index + 1}`] = this.getAttrs(sku.attrs);
+          obj[`规格${index + 1} 价格`] = sku.price;
+          obj[`规格${index + 1} 库存`] = sku.stock;
+          obj[`规格${index + 1} 编码`] = sku.code;
+        });
+        formatList.push(obj);
+      });
+      // console.log(formatList);
+      myUtils.json2excel(formatList);
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.goods-manage-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 24px;
+
+    .blue {
+      color: btn-color;
+      cursor: pointer;
+    }
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      .filter-box {
+        flex-wrap: wrap;
+
+        .btn-box {
+          margin: 5px 0;
+          flex-x(flex-start);
+          flex-wrap: wrap;
+
+          .label {
+            margin-right: 6px;
+            margin-left: 12px;
+            word(14px, gray3);
+          }
+
+          .input {
+            margin-right: 8px;
+          }
+
+          .search {
+            min-width: 65px;
+          }
+        }
+      }
+
+      .import-box {
+        flex-x(flex-end);
+      }
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+        flex-shrink: 0;
+      }
+
+      .table {
+        .master-pic {
+          width: auto;
+          height: 36px;
+        }
+      }
+
+      .vip-btn {
+        width: 96px;
+        height: 24px;
+        border-radius: 4px;
+        border: 1px solid #E8E8E8;
+        background: #F7F7F7;
+        word(12px, btn-color);
+        flex-x(center);
+        white-space: nowrap;
+        margin: 0 5px;
+        cursor: pointer;
+      }
+
+      .table-btn-box {
+        flex-x(flex-end);
+
+        .table-btn {
+          width: 80px;
+          min-width: 80px;
+          height: 24px;
+          line-height: 24px;
+          color: gray3;
+          font-size: 12px;
+          margin-right: 8px;
+          cancel-btn();
+        }
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+}
+</style>

+ 908 - 0
src/view/goods/goods-manage2.vue

@@ -0,0 +1,908 @@
+<template>
+  <div class="goods-manage-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="filter-box">
+          <!-- <div class="btn" @click="toGood('add')">+ 新建商品</div> -->
+          <div class="btn-box">
+            <div class="label">商品商家:</div>
+            <!-- <el-select
+              v-model="filter.sid"
+              size="small"
+              class="select"
+              style="width: 153px"
+              placeholder="请选择"
+            >
+              <el-option :value="null" label="全部"> </el-option>
+              <el-option
+                :value="item.id"
+                :label="item.name"
+                v-for="item in businessList"
+                :key="item.id"
+              >
+              </el-option>
+            </el-select> -->
+            <el-input
+              class="input"
+              v-model="filter.shopName"
+              style="width: 153px;"
+              placeholder="此框输入商品商家"
+              size="small"
+            ></el-input>
+            <div class="label">商品分类:</div>
+            <el-cascader
+              v-model="category"
+              :options="categoryList"
+              placeholder="请选择"
+              size="small"
+              :props="{
+                children: 'second',
+                value: 'id',
+                label: 'name',
+                checkStrictly: true,
+              }"
+              class="good-input"
+              style="width: 153px"
+            ></el-cascader>
+            <div class="label">商品状态:</div>
+            <el-select
+              v-model="filter.auditStatus"
+              size="small"
+              class="select"
+              style="width: 153px"
+              placeholder="请选择"
+            >
+              <el-option :value="null" label="全部"> </el-option>
+              <el-option :value="0" label="审核通过"> </el-option>
+              <el-option :value="1" label="待审核"> </el-option>
+              <el-option :value="2" label="驳回"> </el-option>
+            </el-select>
+            <el-input
+              class="input"
+              v-model="filter.name"
+              style="width: 188px; margin-left: 40px"
+              placeholder="此框输入商品名搜索"
+              size="small"
+            ></el-input>
+            <button class="search" @click="search">搜索</button>
+            <div class="import-box" style="margin-left: 60px;">
+              <!-- <div class="btn" @click="batchRejectShopGoodModal">驳回</div> -->
+              <div
+                class="btn"
+                @click="batchPassShopGood"
+                style="margin-left: 20px;"
+              >
+                通过
+              </div>
+            </div>
+          </div>
+        </div>
+        <el-table
+          :data="goodsList"
+          class="table table no-border-table"
+          ref="orderTable"
+          :header-cell-style="{
+            border: 'none',
+            color: '#333',
+            background: '#f6f6f6',
+            borderBottom: '1px solid #E8E8E8',
+            height: '54px',
+          }"
+          :row-style="{
+            height: '54px',
+          }"
+          @selection-change="handleSelectionChange"
+        >
+          <el-table-column type="selection" width="55" :selectable="selectable">
+          </el-table-column>
+          <el-table-column prop="master_pic" align="center" label="商品主图">
+            <div slot-scope="scope">
+              <img class="master-pic" :src="scope.row.masterPic" alt="" />
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="gid"
+            align="center"
+            label="商品ID"
+          ></el-table-column>
+          <el-table-column
+            prop="name"
+            align="center"
+            label="商品名称"
+          ></el-table-column>
+          <el-table-column
+            prop="minPrice"
+            align="center"
+            label="价格/元"
+          ></el-table-column>
+          <el-table-column
+            prop="minGoldAmount"
+            align="center"
+            label="绿通支付金额/元"
+          ></el-table-column>
+          <el-table-column prop="groupingName" align="center" label="商品分类">
+            <div slot-scope="scope">
+              {{ scope.row.firstSortName + "/" + scope.row.secondSortName }}
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="shopName"
+            align="center"
+            label="所属商家"
+          ></el-table-column>
+          <el-table-column prop="status" align="center" label="审核状态">
+            <div slot-scope="scope">
+              {{ auditStatusMap[scope.row.auditStatus] }}
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="totalStock"
+            align="center"
+            label="库存"
+          ></el-table-column>
+          <!-- <el-table-column prop="twig" align="center" label="排序">
+            <template slot-scope="scope">
+              <u class="blue" @click="editSort(scope.row)">{{
+                scope.row.twig
+              }}</u>
+            </template>
+          </el-table-column> -->
+          <!-- <el-table-column
+            prop="twig"
+            align="center"
+            width="200"
+            label="会员设置"
+          >
+            <div slot-scope="scope" style="display: flex">
+              <div class="vip-btn" @click="showSetting(scope.row.gid)">
+                商品可见用户
+              </div>
+              <div class="vip-btn" @click="priceSetting(scope.row.gid)">
+                会员价格设置
+              </div>
+            </div>
+          </el-table-column> -->
+          <el-table-column label="操作" align="center" width="320">
+            <div slot-scope="scope">
+              <div
+                class="table-btn-box"
+                style="display: flex;justify-content: center;"
+              >
+                <button
+                  size="mini"
+                  class="table-btn"
+                  v-if="scope.row.auditStatus !== 1 && scope.row.status === 3"
+                  @click="updateStatus(1, scope.row.id)"
+                >
+                  下架
+                </button>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  v-if="scope.row.auditStatus !== 1 && scope.row.status === 1"
+                  @click="updateStatus(3, scope.row.id)"
+                >
+                  开售
+                </button>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  v-if="scope.row.auditStatus === 1"
+                  @click="rejectShopGoodModal(scope.row.id)"
+                >
+                  驳回
+                </button>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  v-if="scope.row.auditStatus === 1"
+                  @click="passShopGood([scope.row.id])"
+                >
+                  通过
+                </button>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="toGood(scope.row.gid)"
+                >
+                  查看详情
+                </button>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="deleteGood(scope.row.gid)"
+                >
+                  删除商品
+                </button>
+              </div>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- 分页按钮 -->
+      <div class="footer" :key="paginationKey">
+        <el-pagination
+          @current-change="handleCurrentChange"
+          :current-page.sync="currentPage"
+          background
+          layout="total, prev, pager, next, jumper"
+          :page-size="size"
+          :total="total"
+        ></el-pagination>
+      </div>
+    </div>
+    <!-- 修改排序弹窗 -->
+    <el-dialog title="更改排序" width="400px" :visible.sync="sortShow">
+      <el-form label-width="60px" size="mini" ref="editSort" inline-message>
+        <el-form-item label="排序:" prop="tableData" style="margin-top: 15px">
+          <el-input v-model="currentSort" type="number" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button class="btn cancel-btn" @click="sortShow = false"
+          >取 消</el-button
+        >
+        <el-button class="btn confirm-btn" @click="saveSort">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog title="驳回申请" width="480px" :visible.sync="rejectVisible">
+      <!-- <div class="reject-title"><span>*</span>驳回申请</div> -->
+      <div style="padding: 0 16px;">
+        <div class="remark-box">
+          驳回申请
+          <textarea
+            rows="8"
+            class="remark"
+            v-model="remark"
+            placeholder="驳回理由"
+          ></textarea>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <!-- <el-button @click.native="reject()" class="cancel-btn">驳 回</el-button> -->
+        <el-button @click.native="rejectVisible = false" class="cancel-btn btn"
+          >取 消</el-button
+        >
+        <el-button
+          type="primary"
+          @click.native="rejectShopGood"
+          class="confirm-btn btn"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+    <el-dialog
+      :show-close="false"
+      :close-on-click-modal="false"
+      title="生成中..."
+      :visible.sync="showProgressDialog"
+      width="30%"
+      center
+    >
+      <el-progress
+        :percentage="progress"
+        :text-inside="true"
+        :stroke-width="18"
+      ></el-progress>
+    </el-dialog>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import dayjs from 'dayjs';
+import Header from '../../components/common/header';
+import myUtils from '../../components/common/whatever2excel';
+export default {
+  components: {
+    Header
+  },
+  name: 'goods-manage',
+  data() {
+    return {
+      currentPage: 1, // 当前页码
+      size: 20, // 每页条数
+      total: 0, // 总页数
+      loading: 0, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '商品管理',
+        secondTitle: '商家商品管理'
+      },
+      filter: {
+        name: '',
+        // firstSortId: null,
+        // secondSortId: null,
+        shopName: '',
+        auditStatus: null,
+      },
+      goodsList: [], // 列表
+      categoryList: [],
+      currentId: null,
+      currentSort: null,
+      sortShow: false,
+      paginationKey: +new Date(),
+      category: [],
+      businessList: [],
+      showProgressDialog: false,
+      progress: 0,
+      statusMap: {
+        1: '仓库中',
+        3: '在售'
+      },
+      genreMap: {
+        1: '自营商品',
+        2: '供应链'
+      },
+      businessObj: {},
+      auditStatusMap: {
+        0: '审核通过',
+        1: '待审核',
+        2: '驳回'
+      },
+      rejectVisible: false,
+      remark: '',
+      id: null,
+      ids: [],
+      multipleSelection: []
+    };
+  },
+  beforeRouteEnter(to, from, next) {
+    if (from.name !== 'good2') {
+      sessionStorage.setItem('goodManage2', '');
+    }
+    next();
+  },
+  mounted() {
+    let data = sessionStorage.getItem('goodManage2')
+      ? JSON.parse(sessionStorage.getItem('goodManage2'))
+      : '';
+    if (data) {
+      this.filter = {
+        ...this.filter,
+        ...data.filter
+      };
+      this.currentPage = data.currentPage;
+      this.paginationKey = +new Date();
+      this.setSearchData();
+    }
+    // 获取列表
+    this.getCategoryList();
+    this.getBusinessList();
+    this.getGoodsList();
+  },
+  filters: {
+    // 时间格式化
+    dateFormat(date) {
+      if (!date) return '请选择时间';
+      let day = dayjs(date);
+      return day.format('YYYY-MM-DD HH:mm:ss');
+    }
+  },
+  computed: {},
+  methods: {
+    setSearchData() {
+      let goodManage = {
+        currentPage: this.currentPage,
+        filter: this.filter
+      };
+      sessionStorage.setItem('goodManage2', JSON.stringify(goodManage));
+    },
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getGoodsList();
+    },
+    // 获取商品列表
+    getGoodsList() {
+      this.setSearchData();
+      this.loading++;
+      this.httpGet(this.$root.getShopGoodsList, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter,
+        firstSortId: this.category[0] || 0,
+        secondSortId: this.category[1] || 0
+      }).then(
+        (res) => {
+          this.loading--;
+          this.goodsList = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    getBusinessList() {
+      this.loading++;
+      this.httpGet(this.$root.getBusinessList, {
+        size: 9999
+      }).then(
+        (res) => {
+          this.loading--;
+          this.businessList = res.list;
+          let businessObj = {};
+          res.list.forEach(item => {
+            businessObj[item.id] = item.name;
+          });
+          this.businessObj = businessObj;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 获取分类列表
+    getCategoryList() {
+      this.loading++;
+      this.httpGet(this.$root.getGoodsCategoryList, {}).then(
+        (res) => {
+          this.loading--;
+          this.categoryList = res.list.filter((item) => item.second.length);
+          this.categoryList.unshift({
+            name: '全部',
+            id: 0
+            // second: [
+            //   {
+            //     name: '全部',
+            //     id: 0,
+            //     fid: 0
+            //   }
+            // ]
+          });
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      console.log(this.filter);
+      this.currentPage = 1;
+      this.getGoodsList();
+    },
+    editSort(rowData) {
+      // 更改排序
+      this.currentId = rowData.id;
+      this.sortShow = true;
+      this.currentSort = rowData.twig;
+    },
+    saveSort() {
+      // 保存排序
+      this.loading++;
+      this.httpPut(this.$root.updateGoodsTwig, {
+        id: +this.currentId,
+        twig: +this.currentSort
+      }).then(
+        (res) => {
+          this.$message({
+            message: '修改成功!',
+            type: 'success'
+          });
+          this.getGoodsList();
+          this.loading--;
+          this.sortShow = false;
+        },
+        (err) => {
+          this.loading--;
+          this.$message.error(err);
+        }
+      );
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+    },
+    selectable(row, index){
+      if(row.auditStatus === 1) {
+        return true
+      } else {
+        return false
+      };
+    },
+    updateStatus(status, id) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要将商品${
+          status === 1 ? '放入仓库' : '开售'
+        }吗</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPut(this.$root.updateGoodsStatus, {
+          id,
+          status
+        }).then(
+          (res) => {
+            this.loading--;
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.getGoodsList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    batchPassShopGood(){
+      // console.log(this.multipleSelection);
+      if(!this.multipleSelection.length){
+        this.$message({
+          message: '请选择商品',
+          type: 'warning'
+        });
+        return;
+      }
+      this.passShopGood(this.multipleSelection.map(item => item.id))
+    },
+    passShopGood(ids) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确认是否通过审核?</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpPut(this.$root.passShopGood, {
+          list: ids
+        }).then(
+          (res) => {
+            this.loading--;
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.getGoodsList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    rejectShopGoodModal(id){
+      this.remark = '';
+      this.rejectVisible = true;
+      this.id = id;
+    },
+    batchRejectShopGoodModal(){
+      if(!this.multipleSelection.length){
+        this.$message({
+          message: '请选择商品',
+          type: 'warning'
+        });
+        return;
+      }
+      this.rejectShopGoodModal(this.multipleSelection.map(item => item.id))
+    },
+    rejectShopGood(){
+      this.loading++;
+        this.httpPost(this.$root.rejectShopGood, {
+          id: this.id,
+          auditRejectReason: this.remark
+        }).then(
+          (res) => {
+            this.loading--;
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.rejectVisible = false;
+            this.getGoodsList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+    },
+    // 删除商品
+    deleteGood(gid) {
+      this.$confirm(
+        `<p class='title'><i class='icon el-icon-question'></i>提醒</p><p class='text'>确定要删除商品吗</p>`,
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          cancelButtonClass: 'cancel-btn',
+          confirmButtonClass: 'confirm-btn',
+          customClass: 'confirm-box',
+          dangerouslyUseHTMLString: true,
+          showClose: false,
+          type: 'none'
+        }
+      ).then(() => {
+        this.loading++;
+        this.httpDelete(this.$root.deleteGoods, {
+          gid
+        }).then(
+          (res) => {
+            this.loading--;
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.getGoodsList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    // 添加/编辑商品
+    toGood(gid) {
+      this.$router.push({
+        name: 'good2',
+        query: {
+          gid
+        }
+      });
+    },
+    priceSetting(gid) {
+      this.$router.push({
+        name: 'priceSetting',
+        query: {
+          gid
+        }
+      });
+    },
+    showSetting(gid) {
+      this.$router.push({
+        name: 'showSetting',
+        query: {
+          gid
+        }
+      });
+    },
+    async order2excel() {
+      this.loading++;
+      let goodsList = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter,
+        firstSortId: this.category[0] || 0,
+        secondSortId: this.category[1] || 0
+      };
+      await this.httpGet(this.$root.getGoodsImportList, data).then(
+        (res) => {
+          this.loading--;
+          totalPage = Math.ceil(parseInt(res.total) / this.size);
+        },
+        () => {
+          this.loading--;
+        }
+      );
+      this.showProgressDialog = true;
+      this.progress = 0;
+      await this.getAllPages(totalPage, goodsList).then(
+        () => {
+          this.showProgressDialog = false;
+          this.jsonFormatAndToExcel(goodsList);
+        },
+        (err) => {
+          console.error(err);
+          this.showProgressDialog = false;
+        }
+      );
+    },
+    async getAllPages(totalPage, list) {
+      for (let i = 1; i <= totalPage; i++) {
+        let data = {
+          page: i,
+          size: this.size,
+          ...this.filter,
+          firstSortId: this.category[0] || 0,
+          secondSortId: this.category[1] || 0
+        };
+        await this.httpGet(this.$root.getGoodsImportList, data).then((res) => {
+          list.push(...res.list);
+          this.progress = Math.floor((i / totalPage) * 100);
+          console.log('page' + i, list.length);
+        });
+        // console.log(5555, list);
+      }
+    },
+    getAttrs(attrs) {
+      return attrs
+        .map((item) => {
+          return item.keyName + ':' + item.value;
+        })
+        .join('; ');
+    },
+    jsonFormatAndToExcel(list) {
+      let formatList = [];
+      list.forEach((item) => {
+        let obj = {
+          商品ID: item.gid,
+          商品名称: item.name,
+          商品分类: item.firstSortName + '-' + item.secondSortName,
+          状态: this.statusMap[item.status],
+          商品类型: this.genreMap[item.genre],
+          '当前月销量(含基础销量)': item.monthlySales,
+          商品商家: this.businessObj[item.sid],
+          成本: item.cost,
+          卖价: item.linePrice,
+          总库存: item.skuList.reduce((pre, cur) => {
+            return pre + cur.stock;
+          }, 0)
+        };
+        item.skuList.forEach((sku, index) => {
+          obj[`规格${index + 1}`] = this.getAttrs(sku.attrs);
+          obj[`规格${index + 1} 价格`] = sku.price;
+          obj[`规格${index + 1} 库存`] = sku.stock;
+          obj[`规格${index + 1} 编码`] = sku.code;
+        });
+        formatList.push(obj);
+      });
+      // console.log(formatList);
+      myUtils.json2excel(formatList);
+    }
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.goods-manage-box {
+  height: 100%;
+  width: 100%;
+  flex-y(flex-start, flex-start);
+  overflow-y: hidden;
+  background: bg-color;
+
+  .container {
+    box-sizing: border-box;
+    height: 100%;
+    width: 100%;
+    overflow-y: auto;
+    flex-y(flex-start, flex-start);
+    padding: 24px;
+
+    .blue {
+      color: btn-color;
+      cursor: pointer;
+    }
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 24px 32px;
+      border-radius: 2px;
+
+      .filter-box {
+        flex-wrap: wrap;
+
+        .btn-box {
+          margin: 5px 0;
+          flex-x(flex-start);
+          flex-wrap: wrap;
+
+          .label {
+            margin-right: 6px;
+            margin-left: 12px;
+            word(14px, gray3);
+          }
+
+          .input {
+            margin-right: 8px;
+          }
+
+          .search {
+            min-width: 65px;
+          }
+        }
+      }
+
+      .import-box {
+        flex-x(flex-end);
+      }
+
+      // 按钮
+      .btn {
+        width: 100px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin: 16px 0;
+        flex-shrink: 0;
+      }
+
+      .table {
+        .master-pic {
+          width: auto;
+          height: 36px;
+        }
+      }
+
+      .vip-btn {
+        width: 96px;
+        height: 24px;
+        border-radius: 4px;
+        border: 1px solid #E8E8E8;
+        background: #F7F7F7;
+        word(12px, btn-color);
+        flex-x(center);
+        white-space: nowrap;
+        margin: 0 5px;
+        cursor: pointer;
+      }
+
+      .table-btn-box {
+        flex-x(flex-end);
+
+        .table-btn {
+          // width: 80px;
+          // min-width: 80px;
+          padding: 0 12px;
+          height: 24px;
+          line-height: 24px;
+          color: gray3;
+          font-size: 12px;
+          margin-right: 8px;
+          cancel-btn();
+        }
+      }
+    }
+  }
+
+  .footer {
+    width: 100%;
+    padding: 24px;
+    box-sizing: border-box;
+    flex-x(flex-end);
+    background: white;
+  }
+  .remark-box {
+    width: 100%;
+    padding: 12px 0;
+    padding-left: 15px;
+    box-sizing: border-box;
+    flex-x(flex-start, flex-start);
+    white-space: nowrap;
+    .remark {
+      border: 1px solid #f1f1f1;
+      width: 100%;
+      // margin: 0 12px 0;
+      margin-left: 12px;
+      padding: 12px;
+      box-sizing: border-box;
+    }
+  }
+}
+</style>

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