Your Name 1 month ago
commit
a4019b7390
100 changed files with 50423 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. 12227 0
      package-lock.json
  10. 71 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. 35 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. 5379 0
      src/assets/js/jsencrypt.js
  22. 21 0
      src/assets/js/loadBMap.js
  23. 5 0
      src/assets/js/map.js
  24. 6 0
      src/assets/js/pubKey.js
  25. 23 0
      src/assets/js/public.js
  26. 32 0
      src/assets/js/reg.js
  27. 196 0
      src/assets/js/utils.js
  28. 276 0
      src/assets/main.styl
  29. 257 0
      src/assets/mobile.styl
  30. 395 0
      src/assets/public.styl
  31. 175 0
      src/components/common/InputItem.vue
  32. 117 0
      src/components/common/NumberControl.vue
  33. 339 0
      src/components/common/amap.vue
  34. 409 0
      src/components/common/category.vue
  35. 161 0
      src/components/common/deliveryMode.vue
  36. 51 0
      src/components/common/dialogItem.vue
  37. 139 0
      src/components/common/header.vue
  38. 158 0
      src/components/common/imgUpLoader.vue
  39. 142 0
      src/components/common/navTop.vue
  40. 173 0
      src/components/common/singleImg.vue
  41. 69 0
      src/components/common/upImg.vue
  42. 292 0
      src/components/common/wang-edit.vue
  43. 18 0
      src/components/common/whatever2excel.js
  44. 807 0
      src/components/goods/goodsAttr.vue
  45. 703 0
      src/components/goods/goodsAttr2.vue
  46. 97 0
      src/components/goods/goodsClass.vue
  47. 276 0
      src/components/goods/goodsExt.vue
  48. 139 0
      src/components/goods/goodsFreight.vue
  49. 165 0
      src/components/goods/imgUpLoader.vue
  50. 163 0
      src/components/goods/imgUpLoader1.vue
  51. 102 0
      src/components/goods/selectIcon.vue
  52. 97 0
      src/components/goods/singleImg.vue
  53. 257 0
      src/components/goods/upImgDetail.vue
  54. 171 0
      src/components/goods/upLoader.vue
  55. 264 0
      src/components/goods/upVideoDetail.vue
  56. 166 0
      src/components/goods/uploadFile.vue
  57. 138 0
      src/config.js
  58. 56 0
      src/main.js
  59. 250 0
      src/request/action.js
  60. 552 0
      src/request/api.js
  61. 37 0
      src/request/request.js
  62. 17 0
      src/router/modules/Article.js
  63. 11 0
      src/router/modules/Base.js
  64. 17 0
      src/router/modules/Business.js
  65. 23 0
      src/router/modules/Classroom.js
  66. 174 0
      src/router/modules/Fund.js
  67. 64 0
      src/router/modules/Goods.js
  68. 137 0
      src/router/modules/Mall.js
  69. 96 0
      src/router/modules/Order.js
  70. 22 0
      src/router/modules/OrganizationalStructure.js
  71. 12 0
      src/router/modules/PowerManage.js
  72. 158 0
      src/router/modules/UserManage.js
  73. 34 0
      src/router/router.js
  74. 41 0
      src/store/modules/common.js
  75. 66 0
      src/store/modules/login.js
  76. 19 0
      src/store/store.js
  77. 16 0
      src/view/Error.vue
  78. 332 0
      src/view/Index.vue
  79. 564 0
      src/view/Login.vue
  80. 463 0
      src/view/Main.vue
  81. 458 0
      src/view/article/case-manage.vue
  82. 457 0
      src/view/article/information-release.vue
  83. 426 0
      src/view/article/problem.vue
  84. 384 0
      src/view/base/operation-log.vue
  85. 479 0
      src/view/business/apply-detail.vue
  86. 533 0
      src/view/business/business-apply.vue
  87. 432 0
      src/view/business/business-type.vue
  88. 398 0
      src/view/classroom/article-category.vue
  89. 412 0
      src/view/classroom/article-detail.vue
  90. 492 0
      src/view/classroom/article.vue
  91. 225 0
      src/view/classroom/poster.vue
  92. 488 0
      src/view/fund/add-pay.vue
  93. 436 0
      src/view/fund/area-assessment-detail.vue
  94. 637 0
      src/view/fund/area-assessment-pre.vue
  95. 844 0
      src/view/fund/area-assessment.vue
  96. 458 0
      src/view/fund/balance-examine.vue
  97. 562 0
      src/view/fund/balance-record.vue
  98. 503 0
      src/view/fund/balance-record2.vue
  99. 298 0
      src/view/fund/financial-reconciliation.vue
  100. 435 0
      src/view/fund/hq-record.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']
+  ]
+}

+ 12227 - 0
package-lock.json

@@ -0,0 +1,12227 @@
+{
+  "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
+        }
+      }
+    },
+    "@transloadit/prettier-bytes": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
+      "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA=="
+    },
+    "@types/event-emitter": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/@types/event-emitter/-/event-emitter-0.3.3.tgz",
+      "integrity": "sha512-UfnOK1pIxO7P+EgPRZXD9jMpimd8QEFcEZ5R67R1UhGbv4zghU5+NE7U8M8G9H5Jc8FI51rqDWQs6FtUfq2e/Q=="
+    },
+    "@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
+    },
+    "@uppy/companion-client": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-2.2.2.tgz",
+      "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==",
+      "requires": {
+        "@uppy/utils": "^4.1.2",
+        "namespace-emitter": "^2.0.1"
+      }
+    },
+    "@uppy/core": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmjs.org/@uppy/core/-/core-2.3.4.tgz",
+      "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
+      "requires": {
+        "@transloadit/prettier-bytes": "0.0.7",
+        "@uppy/store-default": "^2.1.1",
+        "@uppy/utils": "^4.1.3",
+        "lodash.throttle": "^4.1.1",
+        "mime-match": "^1.0.2",
+        "namespace-emitter": "^2.0.1",
+        "nanoid": "^3.1.25",
+        "preact": "^10.5.13"
+      }
+    },
+    "@uppy/store-default": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-2.1.1.tgz",
+      "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ=="
+    },
+    "@uppy/utils": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-4.1.3.tgz",
+      "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==",
+      "requires": {
+        "lodash.throttle": "^4.1.1"
+      }
+    },
+    "@uppy/xhr-upload": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
+      "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
+      "requires": {
+        "@uppy/companion-client": "^2.2.2",
+        "@uppy/utils": "^4.1.2",
+        "nanoid": "^3.1.25"
+      }
+    },
+    "@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
+    },
+    "@wangeditor/basic-modules": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
+      "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
+      "requires": {
+        "is-url": "^1.2.4"
+      }
+    },
+    "@wangeditor/code-highlight": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
+      "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
+      "requires": {
+        "prismjs": "^1.23.0"
+      }
+    },
+    "@wangeditor/core": {
+      "version": "1.1.19",
+      "resolved": "https://registry.npmjs.org/@wangeditor/core/-/core-1.1.19.tgz",
+      "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
+      "requires": {
+        "@types/event-emitter": "^0.3.3",
+        "event-emitter": "^0.3.5",
+        "html-void-elements": "^2.0.0",
+        "i18next": "^20.4.0",
+        "scroll-into-view-if-needed": "^2.2.28",
+        "slate-history": "^0.66.0"
+      }
+    },
+    "@wangeditor/editor": {
+      "version": "5.1.23",
+      "resolved": "https://registry.npmjs.org/@wangeditor/editor/-/editor-5.1.23.tgz",
+      "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
+      "requires": {
+        "@uppy/core": "^2.1.1",
+        "@uppy/xhr-upload": "^2.0.3",
+        "@wangeditor/basic-modules": "^1.1.7",
+        "@wangeditor/code-highlight": "^1.0.3",
+        "@wangeditor/core": "^1.1.19",
+        "@wangeditor/list-module": "^1.0.5",
+        "@wangeditor/table-module": "^1.1.4",
+        "@wangeditor/upload-image-module": "^1.0.2",
+        "@wangeditor/video-module": "^1.1.4",
+        "dom7": "^3.0.0",
+        "is-hotkey": "^0.2.0",
+        "lodash.camelcase": "^4.3.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.debounce": "^4.0.8",
+        "lodash.foreach": "^4.5.0",
+        "lodash.isequal": "^4.5.0",
+        "lodash.throttle": "^4.1.1",
+        "lodash.toarray": "^4.4.0",
+        "nanoid": "^3.2.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
+    "@wangeditor/editor-for-vue": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@wangeditor/editor-for-vue/-/editor-for-vue-1.0.2.tgz",
+      "integrity": "sha512-BOENvAXJVtVXlE2X50AAvjV82YlCUeu5cbeR0cvEQHQjYtiVnJtq7HSoj85r2kTgGouI5OrpJG9BBEjSjUSPyA=="
+    },
+    "@wangeditor/list-module": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@wangeditor/list-module/-/list-module-1.0.5.tgz",
+      "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ=="
+    },
+    "@wangeditor/table-module": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/@wangeditor/table-module/-/table-module-1.1.4.tgz",
+      "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w=="
+    },
+    "@wangeditor/upload-image-module": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
+      "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA=="
+    },
+    "@wangeditor/video-module": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/@wangeditor/video-module/-/video-module-1.1.4.tgz",
+      "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg=="
+    },
+    "@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
+        }
+      }
+    },
+    "compute-scroll-into-view": {
+      "version": "1.0.20",
+      "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+      "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
+    },
+    "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
+    },
+    "d": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+      "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+      "requires": {
+        "es5-ext": "^0.10.50",
+        "type": "^1.0.1"
+      }
+    },
+    "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"
+      }
+    },
+    "dom7": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/dom7/-/dom7-3.0.0.tgz",
+      "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
+      "requires": {
+        "ssr-window": "^3.0.0-alpha.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"
+      }
+    },
+    "es5-ext": {
+      "version": "0.10.62",
+      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz",
+      "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
+      "requires": {
+        "es6-iterator": "^2.0.3",
+        "es6-symbol": "^3.1.3",
+        "next-tick": "^1.1.0"
+      }
+    },
+    "es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.35",
+        "es6-symbol": "^3.1.1"
+      }
+    },
+    "es6-symbol": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+      "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+      "requires": {
+        "d": "^1.0.1",
+        "ext": "^1.1.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-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14"
+      }
+    },
+    "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
+        }
+      }
+    },
+    "ext": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
+      "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+      "requires": {
+        "type": "^2.7.2"
+      },
+      "dependencies": {
+        "type": {
+          "version": "2.7.2",
+          "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
+          "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
+        }
+      }
+    },
+    "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-void-elements": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz",
+      "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A=="
+    },
+    "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
+    },
+    "i18next": {
+      "version": "20.6.1",
+      "resolved": "https://registry.npmjs.org/i18next/-/i18next-20.6.1.tgz",
+      "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
+      "requires": {
+        "@babel/runtime": "^7.12.0"
+      },
+      "dependencies": {
+        "@babel/runtime": {
+          "version": "7.22.15",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz",
+          "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==",
+          "requires": {
+            "regenerator-runtime": "^0.14.0"
+          }
+        },
+        "regenerator-runtime": {
+          "version": "0.14.0",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
+          "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
+        }
+      }
+    },
+    "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
+    },
+    "immer": {
+      "version": "9.0.21",
+      "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
+      "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="
+    },
+    "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-hotkey": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz",
+      "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
+    },
+    "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-url": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
+      "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
+    },
+    "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
+    },
+    "jsencrypt": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/jsencrypt/-/jsencrypt-3.3.2.tgz",
+      "integrity": "sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A=="
+    },
+    "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.camelcase": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+      "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+    },
+    "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="
+    },
+    "lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+    },
+    "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.foreach": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
+      "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
+    },
+    "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.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
+    },
+    "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.throttle": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+    },
+    "lodash.toarray": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
+      "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="
+    },
+    "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-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz",
+      "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
+      "requires": {
+        "wildcard": "^1.1.0"
+      }
+    },
+    "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
+    },
+    "namespace-emitter": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
+      "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
+    },
+    "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
+    },
+    "nanoid": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+      "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA=="
+    },
+    "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
+    },
+    "next-tick": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
+      "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
+    },
+    "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
+    },
+    "preact": {
+      "version": "10.17.1",
+      "resolved": "https://registry.npmjs.org/preact/-/preact-10.17.1.tgz",
+      "integrity": "sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA=="
+    },
+    "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="
+    },
+    "prismjs": {
+      "version": "1.29.0",
+      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
+      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="
+    },
+    "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"
+      }
+    },
+    "scroll-into-view-if-needed": {
+      "version": "2.2.31",
+      "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
+      "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
+      "requires": {
+        "compute-scroll-into-view": "^1.0.20"
+      }
+    },
+    "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
+    },
+    "slate": {
+      "version": "0.72.8",
+      "resolved": "https://registry.npmjs.org/slate/-/slate-0.72.8.tgz",
+      "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
+      "requires": {
+        "immer": "^9.0.6",
+        "is-plain-object": "^5.0.0",
+        "tiny-warning": "^1.0.3"
+      },
+      "dependencies": {
+        "is-plain-object": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+          "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+        }
+      }
+    },
+    "slate-history": {
+      "version": "0.66.0",
+      "resolved": "https://registry.npmjs.org/slate-history/-/slate-history-0.66.0.tgz",
+      "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==",
+      "requires": {
+        "is-plain-object": "^5.0.0"
+      },
+      "dependencies": {
+        "is-plain-object": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+          "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+        }
+      }
+    },
+    "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"
+      }
+    },
+    "snabbdom": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-3.5.1.tgz",
+      "integrity": "sha512-wHMNIOjkm/YNE5EM3RCbr/+DVgPg6AqQAX1eOxO46zYNvCXjKP5Y865tqQj3EXnaMBjkxmQA5jFuDpDK/dbfiA=="
+    },
+    "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"
+      }
+    },
+    "ssr-window": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-3.0.0.tgz",
+      "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
+    },
+    "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
+    },
+    "tiny-warning": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
+      "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+    },
+    "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": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+      "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+    },
+    "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
+    },
+    "wildcard": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz",
+      "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng=="
+    },
+    "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
+    }
+  }
+}

+ 71 - 0
package.json

@@ -0,0 +1,71 @@
+{
+  "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": {
+    "@wangeditor/editor": "^5.1.23",
+    "@wangeditor/editor-for-vue": "^1.0.2",
+    "axios": "^0.18.0",
+    "dayjs": "^1.10.4",
+    "element-ui": "^2.13.2",
+    "html2canvas": "^1.0.0-rc.7",
+    "jsencrypt": "^3.3.2",
+    "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
+  }
+}

+ 35 - 0
public/index.html

@@ -0,0 +1,35 @@
+<!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">
+    <link rel="stylesheet" href="//at.alicdn.com/t/c/font_4183037_gcs8bip06v.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 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/gljs?v=1.exp&key=YIMBZ-BDLCB-R5QUZ-JUP7V-F7F6H-ESB33"></script>
+    <script type="text/javascript" src="https://map.qq.com/api/js?v=2.exp&key=YIMBZ-BDLCB-R5QUZ-JUP7V-F7F6H-ESB33"></script> -->
+    <script src="https://map.qq.com/api/gljs?v=1.exp&key=YIMBZ-BDLCB-R5QUZ-JUP7V-F7F6H-ESB33"></script>
+    <script charset="utf-8" src="https://map.qq.com/api/gljs?v=1.exp&libraries=service&key=YIMBZ-BDLCB-R5QUZ-JUP7V-F7F6H-ESB33"></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
+};
+

+ 5379 - 0
src/assets/js/jsencrypt.js

@@ -0,0 +1,5379 @@
+(function(global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+		typeof define === 'function' && define.amd ? define(['exports'], factory) :
+		(factory((global.JSEncrypt = {})));
+}(this, (function(exports) {
+	'use strict';
+	var navigator2 = {
+		appName: 'Netscape',
+		userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
+	};
+	//  用来替换window2
+	var window2 = {
+		ASN1: null,
+		Base64: null,
+		Hex: null,
+		crypto: null,
+		href: null
+	};
+	var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
+
+	function int2char(n) {
+		return BI_RM.charAt(n);
+	}
+	//#region BIT_OPERATIONS
+	// (public) this & a
+	function op_and(x, y) {
+		return x & y;
+	}
+	// (public) this | a
+	function op_or(x, y) {
+		return x | y;
+	}
+	// (public) this ^ a
+	function op_xor(x, y) {
+		return x ^ y;
+	}
+	// (public) this & ~a
+	function op_andnot(x, y) {
+		return x & ~y;
+	}
+	// return index of lowest 1-bit in x, x < 2^31
+	function lbit(x) {
+		if (x == 0) {
+			return -1;
+		}
+		var r = 0;
+		if ((x & 0xffff) == 0) {
+			x >>= 16;
+			r += 16;
+		}
+		if ((x & 0xff) == 0) {
+			x >>= 8;
+			r += 8;
+		}
+		if ((x & 0xf) == 0) {
+			x >>= 4;
+			r += 4;
+		}
+		if ((x & 3) == 0) {
+			x >>= 2;
+			r += 2;
+		}
+		if ((x & 1) == 0) {
+			++r;
+		}
+		return r;
+	}
+	// return number of 1 bits in x
+	function cbit(x) {
+		var r = 0;
+		while (x != 0) {
+			x &= x - 1;
+			++r;
+		}
+		return r;
+	}
+	//#endregion BIT_OPERATIONS
+
+	var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+	var b64pad = "=";
+
+	function hex2b64(h) {
+		var i;
+		var c;
+		var ret = "";
+		for (i = 0; i + 3 <= h.length; i += 3) {
+			c = parseInt(h.substring(i, i + 3), 16);
+			ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63);
+		}
+		if (i + 1 == h.length) {
+			c = parseInt(h.substring(i, i + 1), 16);
+			ret += b64map.charAt(c << 2);
+		} else if (i + 2 == h.length) {
+			c = parseInt(h.substring(i, i + 2), 16);
+			ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);
+		}
+		while ((ret.length & 3) > 0) {
+			ret += b64pad;
+		}
+		return ret;
+	}
+	// convert a base64 string to hex
+	function b64tohex(s) {
+		var ret = "";
+		var i;
+		var k = 0; // b64 state, 0-3
+		var slop = 0;
+		for (i = 0; i < s.length; ++i) {
+			if (s.charAt(i) == b64pad) {
+				break;
+			}
+			var v = b64map.indexOf(s.charAt(i));
+			if (v < 0) {
+				continue;
+			}
+			if (k == 0) {
+				ret += int2char(v >> 2);
+				slop = v & 3;
+				k = 1;
+			} else if (k == 1) {
+				ret += int2char((slop << 2) | (v >> 4));
+				slop = v & 0xf;
+				k = 2;
+			} else if (k == 2) {
+				ret += int2char(slop);
+				ret += int2char(v >> 2);
+				slop = v & 3;
+				k = 3;
+			} else {
+				ret += int2char((slop << 2) | (v >> 4));
+				ret += int2char(v & 0xf);
+				k = 0;
+			}
+		}
+		if (k == 1) {
+			ret += int2char(slop << 2);
+		}
+		return ret;
+	}
+
+	/*! *****************************************************************************
+	Copyright (c) Microsoft Corporation. All rights reserved.
+	Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+	this file except in compliance with the License. You may obtain a copy of the
+	License at http://www.apache.org/licenses/LICENSE-2.0
+
+	THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+	KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+	WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+	MERCHANTABLITY OR NON-INFRINGEMENT.
+
+	See the Apache Version 2.0 License for specific language governing permissions
+	and limitations under the License.
+	***************************************************************************** */
+	/* global Reflect, Promise */
+
+	var extendStatics = function(d, b) {
+		extendStatics = Object.setPrototypeOf ||
+			({
+					__proto__: []
+				}
+				instanceof Array && function(d, b) {
+					d.__proto__ = b;
+				}) ||
+			function(d, b) {
+				for (var p in b)
+					if (b.hasOwnProperty(p)) d[p] = b[p];
+			};
+		return extendStatics(d, b);
+	};
+
+	function __extends(d, b) {
+		extendStatics(d, b);
+
+		function __() {
+			this.constructor = d;
+		}
+		d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+	}
+
+	// Hex JavaScript decoder
+	// Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>
+	// Permission to use, copy, modify, and/or distribute this software for any
+	// purpose with or without fee is hereby granted, provided that the above
+	// copyright notice and this permission notice appear in all copies.
+	//
+	// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+	// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+	// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+	// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+	// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+	// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+	// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+	/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */
+	var decoder;
+	var Hex = {
+		decode: function(a) {
+			var i;
+			if (decoder === undefined) {
+				var hex = "0123456789ABCDEF";
+				var ignore = " \f\n\r\t\u00A0\u2028\u2029";
+				decoder = {};
+				for (i = 0; i < 16; ++i) {
+					decoder[hex.charAt(i)] = i;
+				}
+				hex = hex.toLowerCase();
+				for (i = 10; i < 16; ++i) {
+					decoder[hex.charAt(i)] = i;
+				}
+				for (i = 0; i < ignore.length; ++i) {
+					decoder[ignore.charAt(i)] = -1;
+				}
+			}
+			var out = [];
+			var bits = 0;
+			var char_count = 0;
+			for (i = 0; i < a.length; ++i) {
+				var c = a.charAt(i);
+				if (c == "=") {
+					break;
+				}
+				c = decoder[c];
+				if (c == -1) {
+					continue;
+				}
+				if (c === undefined) {
+					throw new Error("Illegal character at offset " + i);
+				}
+				bits |= c;
+				if (++char_count >= 2) {
+					out[out.length] = bits;
+					bits = 0;
+					char_count = 0;
+				} else {
+					bits <<= 4;
+				}
+			}
+			if (char_count) {
+				throw new Error("Hex encoding incomplete: 4 bits missing");
+			}
+			return out;
+		}
+	};
+
+	// Base64 JavaScript decoder
+	// Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>
+	// Permission to use, copy, modify, and/or distribute this software for any
+	// purpose with or without fee is hereby granted, provided that the above
+	// copyright notice and this permission notice appear in all copies.
+	//
+	// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+	// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+	// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+	// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+	// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+	// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+	// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+	/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */
+	var decoder$1;
+	var Base64 = {
+		decode: function(a) {
+			var i;
+			if (decoder$1 === undefined) {
+				var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+				var ignore = "= \f\n\r\t\u00A0\u2028\u2029";
+				decoder$1 = Object.create(null);
+				for (i = 0; i < 64; ++i) {
+					decoder$1[b64.charAt(i)] = i;
+				}
+				for (i = 0; i < ignore.length; ++i) {
+					decoder$1[ignore.charAt(i)] = -1;
+				}
+			}
+			var out = [];
+			var bits = 0;
+			var char_count = 0;
+			for (i = 0; i < a.length; ++i) {
+				var c = a.charAt(i);
+				if (c == "=") {
+					break;
+				}
+				c = decoder$1[c];
+				if (c == -1) {
+					continue;
+				}
+				if (c === undefined) {
+					throw new Error("Illegal character at offset " + i);
+				}
+				bits |= c;
+				if (++char_count >= 4) {
+					out[out.length] = (bits >> 16);
+					out[out.length] = (bits >> 8) & 0xFF;
+					out[out.length] = bits & 0xFF;
+					bits = 0;
+					char_count = 0;
+				} else {
+					bits <<= 6;
+				}
+			}
+			switch (char_count) {
+				case 1:
+					throw new Error("Base64 encoding incomplete: at least 2 bits missing");
+				case 2:
+					out[out.length] = (bits >> 10);
+					break;
+				case 3:
+					out[out.length] = (bits >> 16);
+					out[out.length] = (bits >> 8) & 0xFF;
+					break;
+			}
+			return out;
+		},
+		re: /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/,
+		unarmor: function(a) {
+			var m = Base64.re.exec(a);
+			if (m) {
+				if (m[1]) {
+					a = m[1];
+				} else if (m[2]) {
+					a = m[2];
+				} else {
+					throw new Error("RegExp out of sync");
+				}
+			}
+			return Base64.decode(a);
+		}
+	};
+
+	// Big integer base-10 printing library
+	// Copyright (c) 2014 Lapo Luchini <lapo@lapo.it>
+	// Permission to use, copy, modify, and/or distribute this software for any
+	// purpose with or without fee is hereby granted, provided that the above
+	// copyright notice and this permission notice appear in all copies.
+	//
+	// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+	// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+	// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+	// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+	// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+	// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+	// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+	/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */
+	var max = 10000000000000; // biggest integer that can still fit 2^53 when multiplied by 256
+	var Int10 = /** @class */ (function() {
+		function Int10(value) {
+			this.buf = [+value || 0];
+		}
+		Int10.prototype.mulAdd = function(m, c) {
+			// assert(m <= 256)
+			var b = this.buf;
+			var l = b.length;
+			var i;
+			var t;
+			for (i = 0; i < l; ++i) {
+				t = b[i] * m + c;
+				if (t < max) {
+					c = 0;
+				} else {
+					c = 0 | (t / max);
+					t -= c * max;
+				}
+				b[i] = t;
+			}
+			if (c > 0) {
+				b[i] = c;
+			}
+		};
+		Int10.prototype.sub = function(c) {
+			// assert(m <= 256)
+			var b = this.buf;
+			var l = b.length;
+			var i;
+			var t;
+			for (i = 0; i < l; ++i) {
+				t = b[i] - c;
+				if (t < 0) {
+					t += max;
+					c = 1;
+				} else {
+					c = 0;
+				}
+				b[i] = t;
+			}
+			while (b[b.length - 1] === 0) {
+				b.pop();
+			}
+		};
+		Int10.prototype.toString = function(base) {
+			if ((base || 10) != 10) {
+				throw new Error("only base 10 is supported");
+			}
+			var b = this.buf;
+			var s = b[b.length - 1].toString();
+			for (var i = b.length - 2; i >= 0; --i) {
+				s += (max + b[i]).toString().substring(1);
+			}
+			return s;
+		};
+		Int10.prototype.valueOf = function() {
+			var b = this.buf;
+			var v = 0;
+			for (var i = b.length - 1; i >= 0; --i) {
+				v = v * max + b[i];
+			}
+			return v;
+		};
+		Int10.prototype.simplify = function() {
+			var b = this.buf;
+			return (b.length == 1) ? b[0] : this;
+		};
+		return Int10;
+	}());
+
+	// ASN.1 JavaScript decoder
+	var ellipsis = "\u2026";
+	var reTimeS =
+		/^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
+	var reTimeL =
+		/^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
+
+	function stringCut(str, len) {
+		if (str.length > len) {
+			str = str.substring(0, len) + ellipsis;
+		}
+		return str;
+	}
+	var Stream = /** @class */ (function() {
+		function Stream(enc, pos) {
+			this.hexDigits = "0123456789ABCDEF";
+			if (enc instanceof Stream) {
+				this.enc = enc.enc;
+				this.pos = enc.pos;
+			} else {
+				// enc should be an array or a binary string
+				this.enc = enc;
+				this.pos = pos;
+			}
+		}
+		Stream.prototype.get = function(pos) {
+			if (pos === undefined) {
+				pos = this.pos++;
+			}
+			if (pos >= this.enc.length) {
+				throw new Error("Requesting byte offset " + pos + " on a stream of length " +
+					this.enc.length);
+			}
+			return ("string" === typeof this.enc) ? this.enc.charCodeAt(pos) : this.enc[pos];
+		};
+		Stream.prototype.hexByte = function(b) {
+			return this.hexDigits.charAt((b >> 4) & 0xF) + this.hexDigits.charAt(b & 0xF);
+		};
+		Stream.prototype.hexDump = function(start, end, raw) {
+			var s = "";
+			for (var i = start; i < end; ++i) {
+				s += this.hexByte(this.get(i));
+				if (raw !== true) {
+					switch (i & 0xF) {
+						case 0x7:
+							s += "  ";
+							break;
+						case 0xF:
+							s += "\n";
+							break;
+						default:
+							s += " ";
+					}
+				}
+			}
+			return s;
+		};
+		Stream.prototype.isASCII = function(start, end) {
+			for (var i = start; i < end; ++i) {
+				var c = this.get(i);
+				if (c < 32 || c > 176) {
+					return false;
+				}
+			}
+			return true;
+		};
+		Stream.prototype.parseStringISO = function(start, end) {
+			var s = "";
+			for (var i = start; i < end; ++i) {
+				s += String.fromCharCode(this.get(i));
+			}
+			return s;
+		};
+		Stream.prototype.parseStringUTF = function(start, end) {
+			var s = "";
+			for (var i = start; i < end;) {
+				var c = this.get(i++);
+				if (c < 128) {
+					s += String.fromCharCode(c);
+				} else if ((c > 191) && (c < 224)) {
+					s += String.fromCharCode(((c & 0x1F) << 6) | (this.get(i++) & 0x3F));
+				} else {
+					s += String.fromCharCode(((c & 0x0F) << 12) | ((this.get(i++) & 0x3F) <<
+						6) | (this.get(i++) & 0x3F));
+				}
+			}
+			return s;
+		};
+		Stream.prototype.parseStringBMP = function(start, end) {
+			var str = "";
+			var hi;
+			var lo;
+			for (var i = start; i < end;) {
+				hi = this.get(i++);
+				lo = this.get(i++);
+				str += String.fromCharCode((hi << 8) | lo);
+			}
+			return str;
+		};
+		Stream.prototype.parseTime = function(start, end, shortYear) {
+			var s = this.parseStringISO(start, end);
+			var m = (shortYear ? reTimeS : reTimeL).exec(s);
+			if (!m) {
+				return "Unrecognized time: " + s;
+			}
+			if (shortYear) {
+				// to avoid querying the timer, use the fixed range [1970, 2069]
+				// it will conform with ITU X.400 [-10, +40] sliding window2 until 2030
+				m[1] = +m[1];
+				m[1] += (+m[1] < 70) ? 2000 : 1900;
+			}
+			s = m[1] + "-" + m[2] + "-" + m[3] + " " + m[4];
+			if (m[5]) {
+				s += ":" + m[5];
+				if (m[6]) {
+					s += ":" + m[6];
+					if (m[7]) {
+						s += "." + m[7];
+					}
+				}
+			}
+			if (m[8]) {
+				s += " UTC";
+				if (m[8] != "Z") {
+					s += m[8];
+					if (m[9]) {
+						s += ":" + m[9];
+					}
+				}
+			}
+			return s;
+		};
+		Stream.prototype.parseInteger = function(start, end) {
+			var v = this.get(start);
+			var neg = (v > 127);
+			var pad = neg ? 255 : 0;
+			var len;
+			var s = "";
+			// skip unuseful bits (not allowed in DER)
+			while (v == pad && ++start < end) {
+				v = this.get(start);
+			}
+			len = end - start;
+			if (len === 0) {
+				return neg ? -1 : 0;
+			}
+			// show bit length of huge integers
+			if (len > 4) {
+				s = v;
+				len <<= 3;
+				while (((+s ^ pad) & 0x80) == 0) {
+					s = +s << 1;
+					--len;
+				}
+				s = "(" + len + " bit)\n";
+			}
+			// decode the integer
+			if (neg) {
+				v = v - 256;
+			}
+			var n = new Int10(v);
+			for (var i = start + 1; i < end; ++i) {
+				n.mulAdd(256, this.get(i));
+			}
+			return s + n.toString();
+		};
+		Stream.prototype.parseBitString = function(start, end, maxLength) {
+			var unusedBit = this.get(start);
+			var lenBit = ((end - start - 1) << 3) - unusedBit;
+			var intro = "(" + lenBit + " bit)\n";
+			var s = "";
+			for (var i = start + 1; i < end; ++i) {
+				var b = this.get(i);
+				var skip = (i == end - 1) ? unusedBit : 0;
+				for (var j = 7; j >= skip; --j) {
+					s += (b >> j) & 1 ? "1" : "0";
+				}
+				if (s.length > maxLength) {
+					return intro + stringCut(s, maxLength);
+				}
+			}
+			return intro + s;
+		};
+		Stream.prototype.parseOctetString = function(start, end, maxLength) {
+			if (this.isASCII(start, end)) {
+				return stringCut(this.parseStringISO(start, end), maxLength);
+			}
+			var len = end - start;
+			var s = "(" + len + " byte)\n";
+			maxLength /= 2; // we work in bytes
+			if (len > maxLength) {
+				end = start + maxLength;
+			}
+			for (var i = start; i < end; ++i) {
+				s += this.hexByte(this.get(i));
+			}
+			if (len > maxLength) {
+				s += ellipsis;
+			}
+			return s;
+		};
+		Stream.prototype.parseOID = function(start, end, maxLength) {
+			var s = "";
+			var n = new Int10();
+			var bits = 0;
+			for (var i = start; i < end; ++i) {
+				var v = this.get(i);
+				n.mulAdd(128, v & 0x7F);
+				bits += 7;
+				if (!(v & 0x80)) { // finished
+					if (s === "") {
+						n = n.simplify();
+						if (n instanceof Int10) {
+							n.sub(80);
+							s = "2." + n.toString();
+						} else {
+							var m = n < 80 ? n < 40 ? 0 : 1 : 2;
+							s = m + "." + (n - m * 40);
+						}
+					} else {
+						s += "." + n.toString();
+					}
+					if (s.length > maxLength) {
+						return stringCut(s, maxLength);
+					}
+					n = new Int10();
+					bits = 0;
+				}
+			}
+			if (bits > 0) {
+				s += ".incomplete";
+			}
+			return s;
+		};
+		return Stream;
+	}());
+	var ASN1 = /** @class */ (function() {
+		function ASN1(stream, header, length, tag, sub) {
+			if (!(tag instanceof ASN1Tag)) {
+				throw new Error("Invalid tag value.");
+			}
+			this.stream = stream;
+			this.header = header;
+			this.length = length;
+			this.tag = tag;
+			this.sub = sub;
+		}
+		ASN1.prototype.typeName = function() {
+			switch (this.tag.tagClass) {
+				case 0: // universal
+					switch (this.tag.tagNumber) {
+						case 0x00:
+							return "EOC";
+						case 0x01:
+							return "BOOLEAN";
+						case 0x02:
+							return "INTEGER";
+						case 0x03:
+							return "BIT_STRING";
+						case 0x04:
+							return "OCTET_STRING";
+						case 0x05:
+							return "NULL";
+						case 0x06:
+							return "OBJECT_IDENTIFIER";
+						case 0x07:
+							return "ObjectDescriptor";
+						case 0x08:
+							return "EXTERNAL";
+						case 0x09:
+							return "REAL";
+						case 0x0A:
+							return "ENUMERATED";
+						case 0x0B:
+							return "EMBEDDED_PDV";
+						case 0x0C:
+							return "UTF8String";
+						case 0x10:
+							return "SEQUENCE";
+						case 0x11:
+							return "SET";
+						case 0x12:
+							return "NumericString";
+						case 0x13:
+							return "PrintableString"; // ASCII subset
+						case 0x14:
+							return "TeletexString"; // aka T61String
+						case 0x15:
+							return "VideotexString";
+						case 0x16:
+							return "IA5String"; // ASCII
+						case 0x17:
+							return "UTCTime";
+						case 0x18:
+							return "GeneralizedTime";
+						case 0x19:
+							return "GraphicString";
+						case 0x1A:
+							return "VisibleString"; // ASCII subset
+						case 0x1B:
+							return "GeneralString";
+						case 0x1C:
+							return "UniversalString";
+						case 0x1E:
+							return "BMPString";
+					}
+					return "Universal_" + this.tag.tagNumber.toString();
+				case 1:
+					return "Application_" + this.tag.tagNumber.toString();
+				case 2:
+					return "[" + this.tag.tagNumber.toString() + "]"; // Context
+				case 3:
+					return "Private_" + this.tag.tagNumber.toString();
+			}
+		};
+		ASN1.prototype.content = function(maxLength) {
+			if (this.tag === undefined) {
+				return null;
+			}
+			if (maxLength === undefined) {
+				maxLength = Infinity;
+			}
+			var content = this.posContent();
+			var len = Math.abs(this.length);
+			if (!this.tag.isUniversal()) {
+				if (this.sub !== null) {
+					return "(" + this.sub.length + " elem)";
+				}
+				return this.stream.parseOctetString(content, content + len, maxLength);
+			}
+			switch (this.tag.tagNumber) {
+				case 0x01: // BOOLEAN
+					return (this.stream.get(content) === 0) ? "false" : "true";
+				case 0x02: // INTEGER
+					return this.stream.parseInteger(content, content + len);
+				case 0x03: // BIT_STRING
+					return this.sub ? "(" + this.sub.length + " elem)" :
+						this.stream.parseBitString(content, content + len, maxLength);
+				case 0x04: // OCTET_STRING
+					return this.sub ? "(" + this.sub.length + " elem)" :
+						this.stream.parseOctetString(content, content + len, maxLength);
+					// case 0x05: // NULL
+				case 0x06: // OBJECT_IDENTIFIER
+					return this.stream.parseOID(content, content + len, maxLength);
+					// case 0x07: // ObjectDescriptor
+					// case 0x08: // EXTERNAL
+					// case 0x09: // REAL
+					// case 0x0A: // ENUMERATED
+					// case 0x0B: // EMBEDDED_PDV
+				case 0x10: // SEQUENCE
+				case 0x11: // SET
+					if (this.sub !== null) {
+						return "(" + this.sub.length + " elem)";
+					} else {
+						return "(no elem)";
+					}
+					case 0x0C: // UTF8String
+						return stringCut(this.stream.parseStringUTF(content, content + len),
+							maxLength);
+					case 0x12: // NumericString
+					case 0x13: // PrintableString
+					case 0x14: // TeletexString
+					case 0x15: // VideotexString
+					case 0x16: // IA5String
+						// case 0x19: // GraphicString
+					case 0x1A: // VisibleString
+						// case 0x1B: // GeneralString
+						// case 0x1C: // UniversalString
+						return stringCut(this.stream.parseStringISO(content, content + len),
+							maxLength);
+					case 0x1E: // BMPString
+						return stringCut(this.stream.parseStringBMP(content, content + len),
+							maxLength);
+					case 0x17: // UTCTime
+					case 0x18: // GeneralizedTime
+						return this.stream.parseTime(content, content + len, (this.tag
+							.tagNumber == 0x17));
+			}
+			return null;
+		};
+		ASN1.prototype.toString = function() {
+			return this.typeName() + "@" + this.stream.pos + "[header:" + this.header +
+				",length:" + this.length + ",sub:" + ((this.sub === null) ? "null" : this.sub
+					.length) + "]";
+		};
+		ASN1.prototype.toPrettyString = function(indent) {
+			if (indent === undefined) {
+				indent = "";
+			}
+			var s = indent + this.typeName() + " @" + this.stream.pos;
+			if (this.length >= 0) {
+				s += "+";
+			}
+			s += this.length;
+			if (this.tag.tagConstructed) {
+				s += " (constructed)";
+			} else if ((this.tag.isUniversal() && ((this.tag.tagNumber == 0x03) || (this.tag
+					.tagNumber == 0x04))) && (this.sub !== null)) {
+				s += " (encapsulates)";
+			}
+			s += "\n";
+			if (this.sub !== null) {
+				indent += "  ";
+				for (var i = 0, max = this.sub.length; i < max; ++i) {
+					s += this.sub[i].toPrettyString(indent);
+				}
+			}
+			return s;
+		};
+		ASN1.prototype.posStart = function() {
+			return this.stream.pos;
+		};
+		ASN1.prototype.posContent = function() {
+			return this.stream.pos + this.header;
+		};
+		ASN1.prototype.posEnd = function() {
+			return this.stream.pos + this.header + Math.abs(this.length);
+		};
+		ASN1.prototype.toHexString = function() {
+			return this.stream.hexDump(this.posStart(), this.posEnd(), true);
+		};
+		ASN1.decodeLength = function(stream) {
+			var buf = stream.get();
+			var len = buf & 0x7F;
+			if (len == buf) {
+				return len;
+			}
+			// no reason to use Int10, as it would be a huge buffer anyways
+			if (len > 6) {
+				throw new Error("Length over 48 bits not supported at position " + (stream.pos -
+					1));
+			}
+			if (len === 0) {
+				return null;
+			} // undefined
+			buf = 0;
+			for (var i = 0; i < len; ++i) {
+				buf = (buf * 256) + stream.get();
+			}
+			return buf;
+		};
+		/**
+		 * Retrieve the hexadecimal value (as a string) of the current ASN.1 element
+		 * @returns {string}
+		 * @public
+		 */
+		ASN1.prototype.getHexStringValue = function() {
+			var hexString = this.toHexString();
+			var offset = this.header * 2;
+			var length = this.length * 2;
+			return hexString.substr(offset, length);
+		};
+		ASN1.decode = function(str) {
+			var stream;
+			if (!(str instanceof Stream)) {
+				stream = new Stream(str, 0);
+			} else {
+				stream = str;
+			}
+			var streamStart = new Stream(stream);
+			var tag = new ASN1Tag(stream);
+			var len = ASN1.decodeLength(stream);
+			var start = stream.pos;
+			var header = start - streamStart.pos;
+			var sub = null;
+			var getSub = function() {
+				var ret = [];
+				if (len !== null) {
+					// definite length
+					var end = start + len;
+					while (stream.pos < end) {
+						ret[ret.length] = ASN1.decode(stream);
+					}
+					if (stream.pos != end) {
+						throw new Error(
+							"Content size is not correct for container starting at offset " +
+							start);
+					}
+				} else {
+					// undefined length
+					try {
+						for (;;) {
+							var s = ASN1.decode(stream);
+							if (s.tag.isEOC()) {
+								break;
+							}
+							ret[ret.length] = s;
+						}
+						len = start - stream
+						.pos; // undefined lengths are represented as negative values
+					} catch (e) {
+						throw new Error(
+							"Exception while decoding undefined length content: " + e);
+					}
+				}
+				return ret;
+			};
+			if (tag.tagConstructed) {
+				// must have valid content
+				sub = getSub();
+			} else if (tag.isUniversal() && ((tag.tagNumber == 0x03) || (tag.tagNumber ==
+				0x04))) {
+				// sometimes BitString and OctetString are used to encapsulate ASN.1
+				try {
+					if (tag.tagNumber == 0x03) {
+						if (stream.get() != 0) {
+							throw new Error("BIT STRINGs with unused bits cannot encapsulate.");
+						}
+					}
+					sub = getSub();
+					for (var i = 0; i < sub.length; ++i) {
+						if (sub[i].tag.isEOC()) {
+							throw new Error("EOC is not supposed to be actual content.");
+						}
+					}
+				} catch (e) {
+					// but silently ignore when they don't
+					sub = null;
+				}
+			}
+			if (sub === null) {
+				if (len === null) {
+					throw new Error(
+						"We can't skip over an invalid tag with undefined length at offset " +
+						start);
+				}
+				stream.pos = start + Math.abs(len);
+			}
+			return new ASN1(streamStart, header, len, tag, sub);
+		};
+		return ASN1;
+	}());
+	var ASN1Tag = /** @class */ (function() {
+		function ASN1Tag(stream) {
+			var buf = stream.get();
+			this.tagClass = buf >> 6;
+			this.tagConstructed = ((buf & 0x20) !== 0);
+			this.tagNumber = buf & 0x1F;
+			if (this.tagNumber == 0x1F) { // long tag
+				var n = new Int10();
+				do {
+					buf = stream.get();
+					n.mulAdd(128, buf & 0x7F);
+				} while (buf & 0x80);
+				this.tagNumber = n.simplify();
+			}
+		}
+		ASN1Tag.prototype.isUniversal = function() {
+			return this.tagClass === 0x00;
+		};
+		ASN1Tag.prototype.isEOC = function() {
+			return this.tagClass === 0x00 && this.tagNumber === 0x00;
+		};
+		return ASN1Tag;
+	}());
+
+	// Copyright (c) 2005  Tom Wu
+	// Bits per digit
+	var dbits;
+	// JavaScript engine analysis
+	var canary = 0xdeadbeefcafe;
+	var j_lm = ((canary & 0xffffff) == 0xefcafe);
+	//#region
+	var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83,
+		89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181,
+		191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283,
+		293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409,
+		419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523,
+		541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647,
+		653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773,
+		787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911,
+		919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997
+	];
+	var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];
+	//#endregion
+	// (public) Constructor
+	var BigInteger = /** @class */ (function() {
+		function BigInteger(a, b, c) {
+			if (a != null) {
+				if ("number" == typeof a) {
+					this.fromNumber(a, b, c);
+				} else if (b == null && "string" != typeof a) {
+					this.fromString(a, 256);
+				} else {
+					this.fromString(a, b);
+				}
+			}
+		}
+		//#region PUBLIC
+		// BigInteger.prototype.toString = bnToString;
+		// (public) return string representation in given radix
+		BigInteger.prototype.toString = function(b) {
+			if (this.s < 0) {
+				return "-" + this.negate().toString(b);
+			}
+			var k;
+			if (b == 16) {
+				k = 4;
+			} else if (b == 8) {
+				k = 3;
+			} else if (b == 2) {
+				k = 1;
+			} else if (b == 32) {
+				k = 5;
+			} else if (b == 4) {
+				k = 2;
+			} else {
+				return this.toRadix(b);
+			}
+			var km = (1 << k) - 1;
+			var d;
+			var m = false;
+			var r = "";
+			var i = this.t;
+			var p = this.DB - (i * this.DB) % k;
+			if (i-- > 0) {
+				if (p < this.DB && (d = this[i] >> p) > 0) {
+					m = true;
+					r = int2char(d);
+				}
+				while (i >= 0) {
+					if (p < k) {
+						d = (this[i] & ((1 << p) - 1)) << (k - p);
+						d |= this[--i] >> (p += this.DB - k);
+					} else {
+						d = (this[i] >> (p -= k)) & km;
+						if (p <= 0) {
+							p += this.DB;
+							--i;
+						}
+					}
+					if (d > 0) {
+						m = true;
+					}
+					if (m) {
+						r += int2char(d);
+					}
+				}
+			}
+			return m ? r : "0";
+		};
+		// BigInteger.prototype.negate = bnNegate;
+		// (public) -this
+		BigInteger.prototype.negate = function() {
+			var r = nbi();
+			BigInteger.ZERO.subTo(this, r);
+			return r;
+		};
+		// BigInteger.prototype.abs = bnAbs;
+		// (public) |this|
+		BigInteger.prototype.abs = function() {
+			return (this.s < 0) ? this.negate() : this;
+		};
+		// BigInteger.prototype.compareTo = bnCompareTo;
+		// (public) return + if this > a, - if this < a, 0 if equal
+		BigInteger.prototype.compareTo = function(a) {
+			var r = this.s - a.s;
+			if (r != 0) {
+				return r;
+			}
+			var i = this.t;
+			r = i - a.t;
+			if (r != 0) {
+				return (this.s < 0) ? -r : r;
+			}
+			while (--i >= 0) {
+				if ((r = this[i] - a[i]) != 0) {
+					return r;
+				}
+			}
+			return 0;
+		};
+		// BigInteger.prototype.bitLength = bnBitLength;
+		// (public) return the number of bits in "this"
+		BigInteger.prototype.bitLength = function() {
+			if (this.t <= 0) {
+				return 0;
+			}
+			return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM));
+		};
+		// BigInteger.prototype.mod = bnMod;
+		// (public) this mod a
+		BigInteger.prototype.mod = function(a) {
+			var r = nbi();
+			this.abs().divRemTo(a, null, r);
+			if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) {
+				a.subTo(r, r);
+			}
+			return r;
+		};
+		// BigInteger.prototype.modPowInt = bnModPowInt;
+		// (public) this^e % m, 0 <= e < 2^32
+		BigInteger.prototype.modPowInt = function(e, m) {
+			var z;
+			if (e < 256 || m.isEven()) {
+				z = new Classic(m);
+			} else {
+				z = new Montgomery(m);
+			}
+			return this.exp(e, z);
+		};
+		// BigInteger.prototype.clone = bnClone;
+		// (public)
+		BigInteger.prototype.clone = function() {
+			var r = nbi();
+			this.copyTo(r);
+			return r;
+		};
+		// BigInteger.prototype.intValue = bnIntValue;
+		// (public) return value as integer
+		BigInteger.prototype.intValue = function() {
+			if (this.s < 0) {
+				if (this.t == 1) {
+					return this[0] - this.DV;
+				} else if (this.t == 0) {
+					return -1;
+				}
+			} else if (this.t == 1) {
+				return this[0];
+			} else if (this.t == 0) {
+				return 0;
+			}
+			// assumes 16 < DB < 32
+			return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0];
+		};
+		// BigInteger.prototype.byteValue = bnByteValue;
+		// (public) return value as byte
+		BigInteger.prototype.byteValue = function() {
+			return (this.t == 0) ? this.s : (this[0] << 24) >> 24;
+		};
+		// BigInteger.prototype.shortValue = bnShortValue;
+		// (public) return value as short (assumes DB>=16)
+		BigInteger.prototype.shortValue = function() {
+			return (this.t == 0) ? this.s : (this[0] << 16) >> 16;
+		};
+		// BigInteger.prototype.signum = bnSigNum;
+		// (public) 0 if this == 0, 1 if this > 0
+		BigInteger.prototype.signum = function() {
+			if (this.s < 0) {
+				return -1;
+			} else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) {
+				return 0;
+			} else {
+				return 1;
+			}
+		};
+		// BigInteger.prototype.toByteArray = bnToByteArray;
+		// (public) convert to bigendian byte array
+		BigInteger.prototype.toByteArray = function() {
+			var i = this.t;
+			var r = [];
+			r[0] = this.s;
+			var p = this.DB - (i * this.DB) % 8;
+			var d;
+			var k = 0;
+			if (i-- > 0) {
+				if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) {
+					r[k++] = d | (this.s << (this.DB - p));
+				}
+				while (i >= 0) {
+					if (p < 8) {
+						d = (this[i] & ((1 << p) - 1)) << (8 - p);
+						d |= this[--i] >> (p += this.DB - 8);
+					} else {
+						d = (this[i] >> (p -= 8)) & 0xff;
+						if (p <= 0) {
+							p += this.DB;
+							--i;
+						}
+					}
+					if ((d & 0x80) != 0) {
+						d |= -256;
+					}
+					if (k == 0 && (this.s & 0x80) != (d & 0x80)) {
+						++k;
+					}
+					if (k > 0 || d != this.s) {
+						r[k++] = d;
+					}
+				}
+			}
+			return r;
+		};
+		// BigInteger.prototype.equals = bnEquals;
+		BigInteger.prototype.equals = function(a) {
+			return (this.compareTo(a) == 0);
+		};
+		// BigInteger.prototype.min = bnMin;
+		BigInteger.prototype.min = function(a) {
+			return (this.compareTo(a) < 0) ? this : a;
+		};
+		// BigInteger.prototype.max = bnMax;
+		BigInteger.prototype.max = function(a) {
+			return (this.compareTo(a) > 0) ? this : a;
+		};
+		// BigInteger.prototype.and = bnAnd;
+		BigInteger.prototype.and = function(a) {
+			var r = nbi();
+			this.bitwiseTo(a, op_and, r);
+			return r;
+		};
+		// BigInteger.prototype.or = bnOr;
+		BigInteger.prototype.or = function(a) {
+			var r = nbi();
+			this.bitwiseTo(a, op_or, r);
+			return r;
+		};
+		// BigInteger.prototype.xor = bnXor;
+		BigInteger.prototype.xor = function(a) {
+			var r = nbi();
+			this.bitwiseTo(a, op_xor, r);
+			return r;
+		};
+		// BigInteger.prototype.andNot = bnAndNot;
+		BigInteger.prototype.andNot = function(a) {
+			var r = nbi();
+			this.bitwiseTo(a, op_andnot, r);
+			return r;
+		};
+		// BigInteger.prototype.not = bnNot;
+		// (public) ~this
+		BigInteger.prototype.not = function() {
+			var r = nbi();
+			for (var i = 0; i < this.t; ++i) {
+				r[i] = this.DM & ~this[i];
+			}
+			r.t = this.t;
+			r.s = ~this.s;
+			return r;
+		};
+		// BigInteger.prototype.shiftLeft = bnShiftLeft;
+		// (public) this << n
+		BigInteger.prototype.shiftLeft = function(n) {
+			var r = nbi();
+			if (n < 0) {
+				this.rShiftTo(-n, r);
+			} else {
+				this.lShiftTo(n, r);
+			}
+			return r;
+		};
+		// BigInteger.prototype.shiftRight = bnShiftRight;
+		// (public) this >> n
+		BigInteger.prototype.shiftRight = function(n) {
+			var r = nbi();
+			if (n < 0) {
+				this.lShiftTo(-n, r);
+			} else {
+				this.rShiftTo(n, r);
+			}
+			return r;
+		};
+		// BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
+		// (public) returns index of lowest 1-bit (or -1 if none)
+		BigInteger.prototype.getLowestSetBit = function() {
+			for (var i = 0; i < this.t; ++i) {
+				if (this[i] != 0) {
+					return i * this.DB + lbit(this[i]);
+				}
+			}
+			if (this.s < 0) {
+				return this.t * this.DB;
+			}
+			return -1;
+		};
+		// BigInteger.prototype.bitCount = bnBitCount;
+		// (public) return number of set bits
+		BigInteger.prototype.bitCount = function() {
+			var r = 0;
+			var x = this.s & this.DM;
+			for (var i = 0; i < this.t; ++i) {
+				r += cbit(this[i] ^ x);
+			}
+			return r;
+		};
+		// BigInteger.prototype.testBit = bnTestBit;
+		// (public) true iff nth bit is set
+		BigInteger.prototype.testBit = function(n) {
+			var j = Math.floor(n / this.DB);
+			if (j >= this.t) {
+				return (this.s != 0);
+			}
+			return ((this[j] & (1 << (n % this.DB))) != 0);
+		};
+		// BigInteger.prototype.setBit = bnSetBit;
+		// (public) this | (1<<n)
+		BigInteger.prototype.setBit = function(n) {
+			return this.changeBit(n, op_or);
+		};
+		// BigInteger.prototype.clearBit = bnClearBit;
+		// (public) this & ~(1<<n)
+		BigInteger.prototype.clearBit = function(n) {
+			return this.changeBit(n, op_andnot);
+		};
+		// BigInteger.prototype.flipBit = bnFlipBit;
+		// (public) this ^ (1<<n)
+		BigInteger.prototype.flipBit = function(n) {
+			return this.changeBit(n, op_xor);
+		};
+		// BigInteger.prototype.add = bnAdd;
+		// (public) this + a
+		BigInteger.prototype.add = function(a) {
+			var r = nbi();
+			this.addTo(a, r);
+			return r;
+		};
+		// BigInteger.prototype.subtract = bnSubtract;
+		// (public) this - a
+		BigInteger.prototype.subtract = function(a) {
+			var r = nbi();
+			this.subTo(a, r);
+			return r;
+		};
+		// BigInteger.prototype.multiply = bnMultiply;
+		// (public) this * a
+		BigInteger.prototype.multiply = function(a) {
+			var r = nbi();
+			this.multiplyTo(a, r);
+			return r;
+		};
+		// BigInteger.prototype.divide = bnDivide;
+		// (public) this / a
+		BigInteger.prototype.divide = function(a) {
+			var r = nbi();
+			this.divRemTo(a, r, null);
+			return r;
+		};
+		// BigInteger.prototype.remainder = bnRemainder;
+		// (public) this % a
+		BigInteger.prototype.remainder = function(a) {
+			var r = nbi();
+			this.divRemTo(a, null, r);
+			return r;
+		};
+		// BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
+		// (public) [this/a,this%a]
+		BigInteger.prototype.divideAndRemainder = function(a) {
+			var q = nbi();
+			var r = nbi();
+			this.divRemTo(a, q, r);
+			return [q, r];
+		};
+		// BigInteger.prototype.modPow = bnModPow;
+		// (public) this^e % m (HAC 14.85)
+		BigInteger.prototype.modPow = function(e, m) {
+			console.log(arguments)
+			var i = e.bitLength();
+			var k;
+			var r = nbv(1);
+			var z;
+			if (i <= 0) {
+				return r;
+			} else if (i < 18) {
+				k = 1;
+			} else if (i < 48) {
+				k = 3;
+			} else if (i < 144) {
+				k = 4;
+			} else if (i < 768) {
+				k = 5;
+			} else {
+				k = 6;
+			}
+			if (i < 8) {
+				z = new Classic(m);
+			} else if (m.isEven()) {
+				z = new Barrett(m);
+			} else {
+				z = new Montgomery(m);
+			}
+			// precomputation
+			var g = [];
+			var n = 3;
+			var k1 = k - 1;
+			var km = (1 << k) - 1;
+			g[1] = z.convert(this);
+			if (k > 1) {
+				var g2 = nbi();
+				z.sqrTo(g[1], g2);
+				while (n <= km) {
+					g[n] = nbi();
+					z.mulTo(g2, g[n - 2], g[n]);
+					n += 2;
+				}
+			}
+			var j = e.t - 1;
+			var w;
+			var is1 = true;
+			var r2 = nbi();
+			var t;
+			i = nbits(e[j]) - 1;
+			while (j >= 0) {
+				if (i >= k1) {
+					w = (e[j] >> (i - k1)) & km;
+				} else {
+					w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i);
+					if (j > 0) {
+						w |= e[j - 1] >> (this.DB + i - k1);
+					}
+				}
+				n = k;
+				while ((w & 1) == 0) {
+					w >>= 1;
+					--n;
+				}
+				if ((i -= n) < 0) {
+					i += this.DB;
+					--j;
+				}
+				if (is1) { // ret == 1, don't bother squaring or multiplying it
+					g[w].copyTo(r);
+					is1 = false;
+				} else {
+					while (n > 1) {
+						z.sqrTo(r, r2);
+						z.sqrTo(r2, r);
+						n -= 2;
+					}
+					if (n > 0) {
+						z.sqrTo(r, r2);
+					} else {
+						t = r;
+						r = r2;
+						r2 = t;
+					}
+					z.mulTo(r2, g[w], r);
+				}
+				while (j >= 0 && (e[j] & (1 << i)) == 0) {
+					z.sqrTo(r, r2);
+					t = r;
+					r = r2;
+					r2 = t;
+					if (--i < 0) {
+						i = this.DB - 1;
+						--j;
+					}
+				}
+			}
+			return z.revert(r);
+		};
+		// BigInteger.prototype.modInverse = bnModInverse;
+		// (public) 1/this % m (HAC 14.61)
+		BigInteger.prototype.modInverse = function(m) {
+			var ac = m.isEven();
+			if ((this.isEven() && ac) || m.signum() == 0) {
+				return BigInteger.ZERO;
+			}
+			var u = m.clone();
+			var v = this.clone();
+			var a = nbv(1);
+			var b = nbv(0);
+			var c = nbv(0);
+			var d = nbv(1);
+			while (u.signum() != 0) {
+				while (u.isEven()) {
+					u.rShiftTo(1, u);
+					if (ac) {
+						if (!a.isEven() || !b.isEven()) {
+							a.addTo(this, a);
+							b.subTo(m, b);
+						}
+						a.rShiftTo(1, a);
+					} else if (!b.isEven()) {
+						b.subTo(m, b);
+					}
+					b.rShiftTo(1, b);
+				}
+				while (v.isEven()) {
+					v.rShiftTo(1, v);
+					if (ac) {
+						if (!c.isEven() || !d.isEven()) {
+							c.addTo(this, c);
+							d.subTo(m, d);
+						}
+						c.rShiftTo(1, c);
+					} else if (!d.isEven()) {
+						d.subTo(m, d);
+					}
+					d.rShiftTo(1, d);
+				}
+				if (u.compareTo(v) >= 0) {
+					u.subTo(v, u);
+					if (ac) {
+						a.subTo(c, a);
+					}
+					b.subTo(d, b);
+				} else {
+					v.subTo(u, v);
+					if (ac) {
+						c.subTo(a, c);
+					}
+					d.subTo(b, d);
+				}
+			}
+			if (v.compareTo(BigInteger.ONE) != 0) {
+				return BigInteger.ZERO;
+			}
+			if (d.compareTo(m) >= 0) {
+				return d.subtract(m);
+			}
+			if (d.signum() < 0) {
+				d.addTo(m, d);
+			} else {
+				return d;
+			}
+			if (d.signum() < 0) {
+				return d.add(m);
+			} else {
+				return d;
+			}
+		};
+		// BigInteger.prototype.pow = bnPow;
+		// (public) this^e
+		BigInteger.prototype.pow = function(e) {
+			return this.exp(e, new NullExp());
+		};
+		// BigInteger.prototype.gcd = bnGCD;
+		// (public) gcd(this,a) (HAC 14.54)
+		BigInteger.prototype.gcd = function(a) {
+			var x = (this.s < 0) ? this.negate() : this.clone();
+			var y = (a.s < 0) ? a.negate() : a.clone();
+			if (x.compareTo(y) < 0) {
+				var t = x;
+				x = y;
+				y = t;
+			}
+			var i = x.getLowestSetBit();
+			var g = y.getLowestSetBit();
+			if (g < 0) {
+				return x;
+			}
+			if (i < g) {
+				g = i;
+			}
+			if (g > 0) {
+				x.rShiftTo(g, x);
+				y.rShiftTo(g, y);
+			}
+			while (x.signum() > 0) {
+				if ((i = x.getLowestSetBit()) > 0) {
+					x.rShiftTo(i, x);
+				}
+				if ((i = y.getLowestSetBit()) > 0) {
+					y.rShiftTo(i, y);
+				}
+				if (x.compareTo(y) >= 0) {
+					x.subTo(y, x);
+					x.rShiftTo(1, x);
+				} else {
+					y.subTo(x, y);
+					y.rShiftTo(1, y);
+				}
+			}
+			if (g > 0) {
+				y.lShiftTo(g, y);
+			}
+			return y;
+		};
+		// BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
+		// (public) test primality with certainty >= 1-.5^t
+		BigInteger.prototype.isProbablePrime = function(t) {
+			var i;
+			var x = this.abs();
+			if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) {
+				for (i = 0; i < lowprimes.length; ++i) {
+					if (x[0] == lowprimes[i]) {
+						return true;
+					}
+				}
+				return false;
+			}
+			if (x.isEven()) {
+				return false;
+			}
+			i = 1;
+			while (i < lowprimes.length) {
+				var m = lowprimes[i];
+				var j = i + 1;
+				while (j < lowprimes.length && m < lplim) {
+					m *= lowprimes[j++];
+				}
+				m = x.modInt(m);
+				while (i < j) {
+					if (m % lowprimes[i++] == 0) {
+						return false;
+					}
+				}
+			}
+			return x.millerRabin(t);
+		};
+		//#endregion PUBLIC
+		//#region PROTECTED
+		// BigInteger.prototype.copyTo = bnpCopyTo;
+		// (protected) copy this to r
+		BigInteger.prototype.copyTo = function(r) {
+			for (var i = this.t - 1; i >= 0; --i) {
+				r[i] = this[i];
+			}
+			r.t = this.t;
+			r.s = this.s;
+		};
+		// BigInteger.prototype.fromInt = bnpFromInt;
+		// (protected) set from integer value x, -DV <= x < DV
+		BigInteger.prototype.fromInt = function(x) {
+			this.t = 1;
+			this.s = (x < 0) ? -1 : 0;
+			if (x > 0) {
+				this[0] = x;
+			} else if (x < -1) {
+				this[0] = x + this.DV;
+			} else {
+				this.t = 0;
+			}
+		};
+		// BigInteger.prototype.fromString = bnpFromString;
+		// (protected) set from string and radix
+		BigInteger.prototype.fromString = function(s, b) {
+			var k;
+			if (b == 16) {
+				k = 4;
+			} else if (b == 8) {
+				k = 3;
+			} else if (b == 256) {
+				k = 8;
+				/* byte array */
+			} else if (b == 2) {
+				k = 1;
+			} else if (b == 32) {
+				k = 5;
+			} else if (b == 4) {
+				k = 2;
+			} else {
+				this.fromRadix(s, b);
+				return;
+			}
+			this.t = 0;
+			this.s = 0;
+			var i = s.length;
+			var mi = false;
+			var sh = 0;
+			while (--i >= 0) {
+				var x = (k == 8) ? (+s[i]) & 0xff : intAt(s, i);
+				if (x < 0) {
+					if (s.charAt(i) == "-") {
+						mi = true;
+					}
+					continue;
+				}
+				mi = false;
+				if (sh == 0) {
+					this[this.t++] = x;
+				} else if (sh + k > this.DB) {
+					this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh;
+					this[this.t++] = (x >> (this.DB - sh));
+				} else {
+					this[this.t - 1] |= x << sh;
+				}
+				sh += k;
+				if (sh >= this.DB) {
+					sh -= this.DB;
+				}
+			}
+			if (k == 8 && ((+s[0]) & 0x80) != 0) {
+				this.s = -1;
+				if (sh > 0) {
+					this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh;
+				}
+			}
+			this.clamp();
+			if (mi) {
+				BigInteger.ZERO.subTo(this, this);
+			}
+		};
+		// BigInteger.prototype.clamp = bnpClamp;
+		// (protected) clamp off excess high words
+		BigInteger.prototype.clamp = function() {
+			var c = this.s & this.DM;
+			while (this.t > 0 && this[this.t - 1] == c) {
+				--this.t;
+			}
+		};
+		// BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
+		// (protected) r = this << n*DB
+		BigInteger.prototype.dlShiftTo = function(n, r) {
+			var i;
+			for (i = this.t - 1; i >= 0; --i) {
+				r[i + n] = this[i];
+			}
+			for (i = n - 1; i >= 0; --i) {
+				r[i] = 0;
+			}
+			r.t = this.t + n;
+			r.s = this.s;
+		};
+		// BigInteger.prototype.drShiftTo = bnpDRShiftTo;
+		// (protected) r = this >> n*DB
+		BigInteger.prototype.drShiftTo = function(n, r) {
+			for (var i = n; i < this.t; ++i) {
+				r[i - n] = this[i];
+			}
+			r.t = Math.max(this.t - n, 0);
+			r.s = this.s;
+		};
+		// BigInteger.prototype.lShiftTo = bnpLShiftTo;
+		// (protected) r = this << n
+		BigInteger.prototype.lShiftTo = function(n, r) {
+			var bs = n % this.DB;
+			var cbs = this.DB - bs;
+			var bm = (1 << cbs) - 1;
+			var ds = Math.floor(n / this.DB);
+			var c = (this.s << bs) & this.DM;
+			for (var i = this.t - 1; i >= 0; --i) {
+				r[i + ds + 1] = (this[i] >> cbs) | c;
+				c = (this[i] & bm) << bs;
+			}
+			for (var i = ds - 1; i >= 0; --i) {
+				r[i] = 0;
+			}
+			r[ds] = c;
+			r.t = this.t + ds + 1;
+			r.s = this.s;
+			r.clamp();
+		};
+		// BigInteger.prototype.rShiftTo = bnpRShiftTo;
+		// (protected) r = this >> n
+		BigInteger.prototype.rShiftTo = function(n, r) {
+			r.s = this.s;
+			var ds = Math.floor(n / this.DB);
+			if (ds >= this.t) {
+				r.t = 0;
+				return;
+			}
+			var bs = n % this.DB;
+			var cbs = this.DB - bs;
+			var bm = (1 << bs) - 1;
+			r[0] = this[ds] >> bs;
+			for (var i = ds + 1; i < this.t; ++i) {
+				r[i - ds - 1] |= (this[i] & bm) << cbs;
+				r[i - ds] = this[i] >> bs;
+			}
+			if (bs > 0) {
+				r[this.t - ds - 1] |= (this.s & bm) << cbs;
+			}
+			r.t = this.t - ds;
+			r.clamp();
+		};
+		// BigInteger.prototype.subTo = bnpSubTo;
+		// (protected) r = this - a
+		BigInteger.prototype.subTo = function(a, r) {
+			var i = 0;
+			var c = 0;
+			var m = Math.min(a.t, this.t);
+			while (i < m) {
+				c += this[i] - a[i];
+				r[i++] = c & this.DM;
+				c >>= this.DB;
+			}
+			if (a.t < this.t) {
+				c -= a.s;
+				while (i < this.t) {
+					c += this[i];
+					r[i++] = c & this.DM;
+					c >>= this.DB;
+				}
+				c += this.s;
+			} else {
+				c += this.s;
+				while (i < a.t) {
+					c -= a[i];
+					r[i++] = c & this.DM;
+					c >>= this.DB;
+				}
+				c -= a.s;
+			}
+			r.s = (c < 0) ? -1 : 0;
+			if (c < -1) {
+				r[i++] = this.DV + c;
+			} else if (c > 0) {
+				r[i++] = c;
+			}
+			r.t = i;
+			r.clamp();
+		};
+		// BigInteger.prototype.multiplyTo = bnpMultiplyTo;
+		// (protected) r = this * a, r != this,a (HAC 14.12)
+		// "this" should be the larger one if appropriate.
+		BigInteger.prototype.multiplyTo = function(a, r) {
+			var x = this.abs();
+			var y = a.abs();
+			var i = x.t;
+			r.t = i + y.t;
+			while (--i >= 0) {
+				r[i] = 0;
+			}
+			for (i = 0; i < y.t; ++i) {
+				r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);
+			}
+			r.s = 0;
+			r.clamp();
+			if (this.s != a.s) {
+				BigInteger.ZERO.subTo(r, r);
+			}
+		};
+		// BigInteger.prototype.squareTo = bnpSquareTo;
+		// (protected) r = this^2, r != this (HAC 14.16)
+		BigInteger.prototype.squareTo = function(r) {
+			var x = this.abs();
+			var i = r.t = 2 * x.t;
+			while (--i >= 0) {
+				r[i] = 0;
+			}
+			for (i = 0; i < x.t - 1; ++i) {
+				var c = x.am(i, x[i], r, 2 * i, 0, 1);
+				if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x
+					.DV) {
+					r[i + x.t] -= x.DV;
+					r[i + x.t + 1] = 1;
+				}
+			}
+			if (r.t > 0) {
+				r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);
+			}
+			r.s = 0;
+			r.clamp();
+		};
+		// BigInteger.prototype.divRemTo = bnpDivRemTo;
+		// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
+		// r != q, this != m.  q or r may be null.
+		BigInteger.prototype.divRemTo = function(m, q, r) {
+			var pm = m.abs();
+			if (pm.t <= 0) {
+				return;
+			}
+			var pt = this.abs();
+			if (pt.t < pm.t) {
+				if (q != null) {
+					q.fromInt(0);
+				}
+				if (r != null) {
+					this.copyTo(r);
+				}
+				return;
+			}
+			if (r == null) {
+				r = nbi();
+			}
+			var y = nbi();
+			var ts = this.s;
+			var ms = m.s;
+			var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus
+			if (nsh > 0) {
+				pm.lShiftTo(nsh, y);
+				pt.lShiftTo(nsh, r);
+			} else {
+				pm.copyTo(y);
+				pt.copyTo(r);
+			}
+			var ys = y.t;
+			var y0 = y[ys - 1];
+			if (y0 == 0) {
+				return;
+			}
+			var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0);
+			var d1 = this.FV / yt;
+			var d2 = (1 << this.F1) / yt;
+			var e = 1 << this.F2;
+			var i = r.t;
+			var j = i - ys;
+			var t = (q == null) ? nbi() : q;
+			y.dlShiftTo(j, t);
+			if (r.compareTo(t) >= 0) {
+				r[r.t++] = 1;
+				r.subTo(t, r);
+			}
+			BigInteger.ONE.dlShiftTo(ys, t);
+			t.subTo(y, y); // "negative" y so we can replace sub with am later
+			while (y.t < ys) {
+				y[y.t++] = 0;
+			}
+			while (--j >= 0) {
+				// Estimate quotient digit
+				var qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);
+				if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out
+					y.dlShiftTo(j, t);
+					r.subTo(t, r);
+					while (r[i] < --qd) {
+						r.subTo(t, r);
+					}
+				}
+			}
+			if (q != null) {
+				r.drShiftTo(ys, q);
+				if (ts != ms) {
+					BigInteger.ZERO.subTo(q, q);
+				}
+			}
+			r.t = ys;
+			r.clamp();
+			if (nsh > 0) {
+				r.rShiftTo(nsh, r);
+			} // Denormalize remainder
+			if (ts < 0) {
+				BigInteger.ZERO.subTo(r, r);
+			}
+		};
+		// BigInteger.prototype.invDigit = bnpInvDigit;
+		// (protected) return "-1/this % 2^DB"; useful for Mont. reduction
+		// justification:
+		//         xy == 1 (mod m)
+		//         xy =  1+km
+		//   xy(2-xy) = (1+km)(1-km)
+		// x[y(2-xy)] = 1-k^2m^2
+		// x[y(2-xy)] == 1 (mod m^2)
+		// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
+		// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
+		// JS multiply "overflows" differently from C/C++, so care is needed here.
+		BigInteger.prototype.invDigit = function() {
+			if (this.t < 1) {
+				return 0;
+			}
+			var x = this[0];
+			if ((x & 1) == 0) {
+				return 0;
+			}
+			var y = x & 3; // y == 1/x mod 2^2
+			y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4
+			y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8
+			y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16
+			// last step - calculate inverse mod DV directly;
+			// assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
+			y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits
+			// we really want the negative inverse, and -DV < y < DV
+			return (y > 0) ? this.DV - y : -y;
+		};
+		// BigInteger.prototype.isEven = bnpIsEven;
+		// (protected) true iff this is even
+		BigInteger.prototype.isEven = function() {
+			return ((this.t > 0) ? (this[0] & 1) : this.s) == 0;
+		};
+		// BigInteger.prototype.exp = bnpExp;
+		// (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
+		BigInteger.prototype.exp = function(e, z) {
+			if (e > 0xffffffff || e < 1) {
+				return BigInteger.ONE;
+			}
+			var r = nbi();
+			var r2 = nbi();
+			var g = z.convert(this);
+			var i = nbits(e) - 1;
+			g.copyTo(r);
+			while (--i >= 0) {
+				z.sqrTo(r, r2);
+				if ((e & (1 << i)) > 0) {
+					z.mulTo(r2, g, r);
+				} else {
+					var t = r;
+					r = r2;
+					r2 = t;
+				}
+			}
+			return z.revert(r);
+		};
+		// BigInteger.prototype.chunkSize = bnpChunkSize;
+		// (protected) return x s.t. r^x < DV
+		BigInteger.prototype.chunkSize = function(r) {
+			return Math.floor(Math.LN2 * this.DB / Math.log(r));
+		};
+		// BigInteger.prototype.toRadix = bnpToRadix;
+		// (protected) convert to radix string
+		BigInteger.prototype.toRadix = function(b) {
+			if (b == null) {
+				b = 10;
+			}
+			if (this.signum() == 0 || b < 2 || b > 36) {
+				return "0";
+			}
+			var cs = this.chunkSize(b);
+			var a = Math.pow(b, cs);
+			var d = nbv(a);
+			var y = nbi();
+			var z = nbi();
+			var r = "";
+			this.divRemTo(d, y, z);
+			while (y.signum() > 0) {
+				r = (a + z.intValue()).toString(b).substr(1) + r;
+				y.divRemTo(d, y, z);
+			}
+			return z.intValue().toString(b) + r;
+		};
+		// BigInteger.prototype.fromRadix = bnpFromRadix;
+		// (protected) convert from radix string
+		BigInteger.prototype.fromRadix = function(s, b) {
+			this.fromInt(0);
+			if (b == null) {
+				b = 10;
+			}
+			var cs = this.chunkSize(b);
+			var d = Math.pow(b, cs);
+			var mi = false;
+			var j = 0;
+			var w = 0;
+			for (var i = 0; i < s.length; ++i) {
+				var x = intAt(s, i);
+				if (x < 0) {
+					if (s.charAt(i) == "-" && this.signum() == 0) {
+						mi = true;
+					}
+					continue;
+				}
+				w = b * w + x;
+				if (++j >= cs) {
+					this.dMultiply(d);
+					this.dAddOffset(w, 0);
+					j = 0;
+					w = 0;
+				}
+			}
+			if (j > 0) {
+				this.dMultiply(Math.pow(b, j));
+				this.dAddOffset(w, 0);
+			}
+			if (mi) {
+				BigInteger.ZERO.subTo(this, this);
+			}
+		};
+		// BigInteger.prototype.fromNumber = bnpFromNumber;
+		// (protected) alternate constructor
+		BigInteger.prototype.fromNumber = function(a, b, c) {
+			if ("number" == typeof b) {
+				// new BigInteger(int,int,RNG)
+				if (a < 2) {
+					this.fromInt(1);
+				} else {
+					this.fromNumber(a, c);
+					if (!this.testBit(a - 1)) {
+						// force MSB set
+						this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);
+					}
+					if (this.isEven()) {
+						this.dAddOffset(1, 0);
+					} // force odd
+					while (!this.isProbablePrime(b)) {
+						this.dAddOffset(2, 0);
+						if (this.bitLength() > a) {
+							this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);
+						}
+					}
+				}
+			} else {
+				// new BigInteger(int,RNG)
+				var x = [];
+				var t = a & 7;
+				x.length = (a >> 3) + 1;
+				b.nextBytes(x);
+				if (t > 0) {
+					x[0] &= ((1 << t) - 1);
+				} else {
+					x[0] = 0;
+				}
+				this.fromString(x, 256);
+			}
+		};
+		// BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
+		// (protected) r = this op a (bitwise)
+		BigInteger.prototype.bitwiseTo = function(a, op, r) {
+			var i;
+			var f;
+			var m = Math.min(a.t, this.t);
+			for (i = 0; i < m; ++i) {
+				r[i] = op(this[i], a[i]);
+			}
+			if (a.t < this.t) {
+				f = a.s & this.DM;
+				for (i = m; i < this.t; ++i) {
+					r[i] = op(this[i], f);
+				}
+				r.t = this.t;
+			} else {
+				f = this.s & this.DM;
+				for (i = m; i < a.t; ++i) {
+					r[i] = op(f, a[i]);
+				}
+				r.t = a.t;
+			}
+			r.s = op(this.s, a.s);
+			r.clamp();
+		};
+		// BigInteger.prototype.changeBit = bnpChangeBit;
+		// (protected) this op (1<<n)
+		BigInteger.prototype.changeBit = function(n, op) {
+			var r = BigInteger.ONE.shiftLeft(n);
+			this.bitwiseTo(r, op, r);
+			return r;
+		};
+		// BigInteger.prototype.addTo = bnpAddTo;
+		// (protected) r = this + a
+		BigInteger.prototype.addTo = function(a, r) {
+			var i = 0;
+			var c = 0;
+			var m = Math.min(a.t, this.t);
+			while (i < m) {
+				c += this[i] + a[i];
+				r[i++] = c & this.DM;
+				c >>= this.DB;
+			}
+			if (a.t < this.t) {
+				c += a.s;
+				while (i < this.t) {
+					c += this[i];
+					r[i++] = c & this.DM;
+					c >>= this.DB;
+				}
+				c += this.s;
+			} else {
+				c += this.s;
+				while (i < a.t) {
+					c += a[i];
+					r[i++] = c & this.DM;
+					c >>= this.DB;
+				}
+				c += a.s;
+			}
+			r.s = (c < 0) ? -1 : 0;
+			if (c > 0) {
+				r[i++] = c;
+			} else if (c < -1) {
+				r[i++] = this.DV + c;
+			}
+			r.t = i;
+			r.clamp();
+		};
+		// BigInteger.prototype.dMultiply = bnpDMultiply;
+		// (protected) this *= n, this >= 0, 1 < n < DV
+		BigInteger.prototype.dMultiply = function(n) {
+			this[this.t] = this.am(0, n - 1, this, 0, 0, this.t);
+			++this.t;
+			this.clamp();
+		};
+		// BigInteger.prototype.dAddOffset = bnpDAddOffset;
+		// (protected) this += n << w words, this >= 0
+		BigInteger.prototype.dAddOffset = function(n, w) {
+			if (n == 0) {
+				return;
+			}
+			while (this.t <= w) {
+				this[this.t++] = 0;
+			}
+			this[w] += n;
+			while (this[w] >= this.DV) {
+				this[w] -= this.DV;
+				if (++w >= this.t) {
+					this[this.t++] = 0;
+				}
+				++this[w];
+			}
+		};
+		// BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
+		// (protected) r = lower n words of "this * a", a.t <= n
+		// "this" should be the larger one if appropriate.
+		BigInteger.prototype.multiplyLowerTo = function(a, n, r) {
+			var i = Math.min(this.t + a.t, n);
+			r.s = 0; // assumes a,this >= 0
+			r.t = i;
+			while (i > 0) {
+				r[--i] = 0;
+			}
+			for (var j = r.t - this.t; i < j; ++i) {
+				r[i + this.t] = this.am(0, a[i], r, i, 0, this.t);
+			}
+			for (var j = Math.min(a.t, n); i < j; ++i) {
+				this.am(0, a[i], r, i, 0, n - i);
+			}
+			r.clamp();
+		};
+		// BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
+		// (protected) r = "this * a" without lower n words, n > 0
+		// "this" should be the larger one if appropriate.
+		BigInteger.prototype.multiplyUpperTo = function(a, n, r) {
+			--n;
+			var i = r.t = this.t + a.t - n;
+			r.s = 0; // assumes a,this >= 0
+			while (--i >= 0) {
+				r[i] = 0;
+			}
+			for (i = Math.max(n - this.t, 0); i < a.t; ++i) {
+				r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n);
+			}
+			r.clamp();
+			r.drShiftTo(1, r);
+		};
+		// BigInteger.prototype.modInt = bnpModInt;
+		// (protected) this % n, n < 2^26
+		BigInteger.prototype.modInt = function(n) {
+			if (n <= 0) {
+				return 0;
+			}
+			var d = this.DV % n;
+			var r = (this.s < 0) ? n - 1 : 0;
+			if (this.t > 0) {
+				if (d == 0) {
+					r = this[0] % n;
+				} else {
+					for (var i = this.t - 1; i >= 0; --i) {
+						r = (d * r + this[i]) % n;
+					}
+				}
+			}
+			return r;
+		};
+		// BigInteger.prototype.millerRabin = bnpMillerRabin;
+		// (protected) true if probably prime (HAC 4.24, Miller-Rabin)
+		BigInteger.prototype.millerRabin = function(t) {
+			var n1 = this.subtract(BigInteger.ONE);
+			var k = n1.getLowestSetBit();
+			if (k <= 0) {
+				return false;
+			}
+			var r = n1.shiftRight(k);
+			t = (t + 1) >> 1;
+			if (t > lowprimes.length) {
+				t = lowprimes.length;
+			}
+			var a = nbi();
+			for (var i = 0; i < t; ++i) {
+				// Pick bases at random, instead of starting at 2
+				a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
+				var y = a.modPow(r, this);
+				if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
+					var j = 1;
+					while (j++ < k && y.compareTo(n1) != 0) {
+						y = y.modPowInt(2, this);
+						if (y.compareTo(BigInteger.ONE) == 0) {
+							return false;
+						}
+					}
+					if (y.compareTo(n1) != 0) {
+						return false;
+					}
+				}
+			}
+			return true;
+		};
+		// BigInteger.prototype.square = bnSquare;
+		// (public) this^2
+		BigInteger.prototype.square = function() {
+			var r = nbi();
+			this.squareTo(r);
+			return r;
+		};
+		//#region ASYNC
+		// Public API method
+		BigInteger.prototype.gcda = function(a, callback) {
+			var x = (this.s < 0) ? this.negate() : this.clone();
+			var y = (a.s < 0) ? a.negate() : a.clone();
+			if (x.compareTo(y) < 0) {
+				var t = x;
+				x = y;
+				y = t;
+			}
+			var i = x.getLowestSetBit();
+			var g = y.getLowestSetBit();
+			if (g < 0) {
+				callback(x);
+				return;
+			}
+			if (i < g) {
+				g = i;
+			}
+			if (g > 0) {
+				x.rShiftTo(g, x);
+				y.rShiftTo(g, y);
+			}
+			// Workhorse of the algorithm, gets called 200 - 800 times per 512 bit keygen.
+			var gcda1 = function() {
+				if ((i = x.getLowestSetBit()) > 0) {
+					x.rShiftTo(i, x);
+				}
+				if ((i = y.getLowestSetBit()) > 0) {
+					y.rShiftTo(i, y);
+				}
+				if (x.compareTo(y) >= 0) {
+					x.subTo(y, x);
+					x.rShiftTo(1, x);
+				} else {
+					y.subTo(x, y);
+					y.rShiftTo(1, y);
+				}
+				if (!(x.signum() > 0)) {
+					if (g > 0) {
+						y.lShiftTo(g, y);
+					}
+					setTimeout(function() {
+						callback(y);
+					}, 0); // escape
+				} else {
+					setTimeout(gcda1, 0);
+				}
+			};
+			setTimeout(gcda1, 10);
+		};
+		// (protected) alternate constructor
+		BigInteger.prototype.fromNumberAsync = function(a, b, c, callback) {
+			if ("number" == typeof b) {
+				if (a < 2) {
+					this.fromInt(1);
+				} else {
+					this.fromNumber(a, c);
+					if (!this.testBit(a - 1)) {
+						this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);
+					}
+					if (this.isEven()) {
+						this.dAddOffset(1, 0);
+					}
+					var bnp_1 = this;
+					var bnpfn1_1 = function() {
+						bnp_1.dAddOffset(2, 0);
+						if (bnp_1.bitLength() > a) {
+							bnp_1.subTo(BigInteger.ONE.shiftLeft(a - 1), bnp_1);
+						}
+						if (bnp_1.isProbablePrime(b)) {
+							setTimeout(function() {
+								callback();
+							}, 0); // escape
+						} else {
+							setTimeout(bnpfn1_1, 0);
+						}
+					};
+					setTimeout(bnpfn1_1, 0);
+				}
+			} else {
+				var x = [];
+				var t = a & 7;
+				x.length = (a >> 3) + 1;
+				b.nextBytes(x);
+				if (t > 0) {
+					x[0] &= ((1 << t) - 1);
+				} else {
+					x[0] = 0;
+				}
+				this.fromString(x, 256);
+			}
+		};
+		return BigInteger;
+	}());
+	//#region REDUCERS
+	//#region NullExp
+	var NullExp = /** @class */ (function() {
+		function NullExp() {}
+		// NullExp.prototype.convert = nNop;
+		NullExp.prototype.convert = function(x) {
+			return x;
+		};
+		// NullExp.prototype.revert = nNop;
+		NullExp.prototype.revert = function(x) {
+			return x;
+		};
+		// NullExp.prototype.mulTo = nMulTo;
+		NullExp.prototype.mulTo = function(x, y, r) {
+			x.multiplyTo(y, r);
+		};
+		// NullExp.prototype.sqrTo = nSqrTo;
+		NullExp.prototype.sqrTo = function(x, r) {
+			x.squareTo(r);
+		};
+		return NullExp;
+	}());
+	// Modular reduction using "classic" algorithm
+	var Classic = /** @class */ (function() {
+		function Classic(m) {
+			this.m = m;
+		}
+		// Classic.prototype.convert = cConvert;
+		Classic.prototype.convert = function(x) {
+			if (x.s < 0 || x.compareTo(this.m) >= 0) {
+				return x.mod(this.m);
+			} else {
+				return x;
+			}
+		};
+		// Classic.prototype.revert = cRevert;
+		Classic.prototype.revert = function(x) {
+			return x;
+		};
+		// Classic.prototype.reduce = cReduce;
+		Classic.prototype.reduce = function(x) {
+			x.divRemTo(this.m, null, x);
+		};
+		// Classic.prototype.mulTo = cMulTo;
+		Classic.prototype.mulTo = function(x, y, r) {
+			x.multiplyTo(y, r);
+			this.reduce(r);
+		};
+		// Classic.prototype.sqrTo = cSqrTo;
+		Classic.prototype.sqrTo = function(x, r) {
+			x.squareTo(r);
+			this.reduce(r);
+		};
+		return Classic;
+	}());
+	//#endregion
+	//#region Montgomery
+	// Montgomery reduction
+	var Montgomery = /** @class */ (function() {
+		function Montgomery(m) {
+			this.m = m;
+			this.mp = m.invDigit();
+			this.mpl = this.mp & 0x7fff;
+			this.mph = this.mp >> 15;
+			this.um = (1 << (m.DB - 15)) - 1;
+			this.mt2 = 2 * m.t;
+		}
+		// Montgomery.prototype.convert = montConvert;
+		// xR mod m
+		Montgomery.prototype.convert = function(x) {
+			var r = nbi();
+			x.abs().dlShiftTo(this.m.t, r);
+			r.divRemTo(this.m, null, r);
+			if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) {
+				this.m.subTo(r, r);
+			}
+			return r;
+		};
+		// Montgomery.prototype.revert = montRevert;
+		// x/R mod m
+		Montgomery.prototype.revert = function(x) {
+			var r = nbi();
+			x.copyTo(r);
+			this.reduce(r);
+			return r;
+		};
+		// Montgomery.prototype.reduce = montReduce;
+		// x = x/R mod m (HAC 14.32)
+		Montgomery.prototype.reduce = function(x) {
+			while (x.t <= this.mt2) {
+				// pad x so am has enough room later
+				x[x.t++] = 0;
+			}
+			for (var i = 0; i < this.m.t; ++i) {
+				// faster way of calculating u0 = x[i]*mp mod DV
+				var j = x[i] & 0x7fff;
+				var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this
+					.um) << 15)) & x.DM;
+				// use am to combine the multiply-shift-add into one call
+				j = i + this.m.t;
+				x[j] += this.m.am(0, u0, x, i, 0, this.m.t);
+				// propagate carry
+				while (x[j] >= x.DV) {
+					x[j] -= x.DV;
+					x[++j]++;
+				}
+			}
+			x.clamp();
+			x.drShiftTo(this.m.t, x);
+			if (x.compareTo(this.m) >= 0) {
+				x.subTo(this.m, x);
+			}
+		};
+		// Montgomery.prototype.mulTo = montMulTo;
+		// r = "xy/R mod m"; x,y != r
+		Montgomery.prototype.mulTo = function(x, y, r) {
+			x.multiplyTo(y, r);
+			this.reduce(r);
+		};
+		// Montgomery.prototype.sqrTo = montSqrTo;
+		// r = "x^2/R mod m"; x != r
+		Montgomery.prototype.sqrTo = function(x, r) {
+			x.squareTo(r);
+			this.reduce(r);
+		};
+		return Montgomery;
+	}());
+	//#endregion Montgomery
+	//#region Barrett
+	// Barrett modular reduction
+	var Barrett = /** @class */ (function() {
+		function Barrett(m) {
+			this.m = m;
+			// setup Barrett
+			this.r2 = nbi();
+			this.q3 = nbi();
+			BigInteger.ONE.dlShiftTo(2 * m.t, this.r2);
+			this.mu = this.r2.divide(m);
+		}
+		// Barrett.prototype.convert = barrettConvert;
+		Barrett.prototype.convert = function(x) {
+			if (x.s < 0 || x.t > 2 * this.m.t) {
+				return x.mod(this.m);
+			} else if (x.compareTo(this.m) < 0) {
+				return x;
+			} else {
+				var r = nbi();
+				x.copyTo(r);
+				this.reduce(r);
+				return r;
+			}
+		};
+		// Barrett.prototype.revert = barrettRevert;
+		Barrett.prototype.revert = function(x) {
+			return x;
+		};
+		// Barrett.prototype.reduce = barrettReduce;
+		// x = x mod m (HAC 14.42)
+		Barrett.prototype.reduce = function(x) {
+			x.drShiftTo(this.m.t - 1, this.r2);
+			if (x.t > this.m.t + 1) {
+				x.t = this.m.t + 1;
+				x.clamp();
+			}
+			this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
+			this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);
+			while (x.compareTo(this.r2) < 0) {
+				x.dAddOffset(1, this.m.t + 1);
+			}
+			x.subTo(this.r2, x);
+			while (x.compareTo(this.m) >= 0) {
+				x.subTo(this.m, x);
+			}
+		};
+		// Barrett.prototype.mulTo = barrettMulTo;
+		// r = x*y mod m; x,y != r
+		Barrett.prototype.mulTo = function(x, y, r) {
+			x.multiplyTo(y, r);
+			this.reduce(r);
+		};
+		// Barrett.prototype.sqrTo = barrettSqrTo;
+		// r = x^2 mod m; x != r
+		Barrett.prototype.sqrTo = function(x, r) {
+			x.squareTo(r);
+			this.reduce(r);
+		};
+		return Barrett;
+	}());
+	//#endregion
+	//#endregion REDUCERS
+	// return new, unset BigInteger
+	function nbi() {
+		return new BigInteger(null);
+	}
+
+	function parseBigInt(str, r) {
+		return new BigInteger(str, r);
+	}
+	// am: Compute w_j += (x*this_i), propagate carries,
+	// c is initial carry, returns final carry.
+	// c < 3*dvalue, x < 2*dvalue, this_i < dvalue
+	// We need to select the fastest one that works in this environment.
+	// am1: use a single mult and divide to get the high bits,
+	// max digit bits should be 26 because
+	// max internal value = 2*dvalue^2-2*dvalue (< 2^53)
+	function am1(i, x, w, j, c, n) {
+		while (--n >= 0) {
+			var v = x * this[i++] + w[j] + c;
+			c = Math.floor(v / 0x4000000);
+			w[j++] = v & 0x3ffffff;
+		}
+		return c;
+	}
+	// am2 avoids a big mult-and-extract completely.
+	// Max digit bits should be <= 30 because we do bitwise ops
+	// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
+	function am2(i, x, w, j, c, n) {
+		var xl = x & 0x7fff;
+		var xh = x >> 15;
+		while (--n >= 0) {
+			var l = this[i] & 0x7fff;
+			var h = this[i++] >> 15;
+			var m = xh * l + h * xl;
+			l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff);
+			c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);
+			w[j++] = l & 0x3fffffff;
+		}
+		return c;
+	}
+	// Alternately, set max digit bits to 28 since some
+	// browsers slow down when dealing with 32-bit numbers.
+	function am3(i, x, w, j, c, n) {
+		var xl = x & 0x3fff;
+		var xh = x >> 14;
+		while (--n >= 0) {
+			var l = this[i] & 0x3fff;
+			var h = this[i++] >> 14;
+			var m = xh * l + h * xl;
+			l = xl * l + ((m & 0x3fff) << 14) + w[j] + c;
+			c = (l >> 28) + (m >> 14) + xh * h;
+			w[j++] = l & 0xfffffff;
+		}
+		return c;
+	}
+	var inBrowser = typeof navigator2 !== "undefined";
+	if (inBrowser && j_lm && (navigator2.appName == "Microsoft Internet Explorer")) {
+		BigInteger.prototype.am = am2;
+		dbits = 30;
+	} else if (inBrowser && j_lm && (navigator2.appName != "Netscape")) {
+		BigInteger.prototype.am = am1;
+		dbits = 26;
+	} else { // Mozilla/Netscape seems to prefer am3
+		BigInteger.prototype.am = am3;
+		dbits = 28;
+	}
+	BigInteger.prototype.DB = dbits;
+	BigInteger.prototype.DM = ((1 << dbits) - 1);
+	BigInteger.prototype.DV = (1 << dbits);
+	var BI_FP = 52;
+	BigInteger.prototype.FV = Math.pow(2, BI_FP);
+	BigInteger.prototype.F1 = BI_FP - dbits;
+	BigInteger.prototype.F2 = 2 * dbits - BI_FP;
+	// Digit conversions
+	var BI_RC = [];
+	var rr;
+	var vv;
+	rr = "0".charCodeAt(0);
+	for (vv = 0; vv <= 9; ++vv) {
+		BI_RC[rr++] = vv;
+	}
+	rr = "a".charCodeAt(0);
+	for (vv = 10; vv < 36; ++vv) {
+		BI_RC[rr++] = vv;
+	}
+	rr = "A".charCodeAt(0);
+	for (vv = 10; vv < 36; ++vv) {
+		BI_RC[rr++] = vv;
+	}
+
+	function intAt(s, i) {
+		var c = BI_RC[s.charCodeAt(i)];
+		return (c == null) ? -1 : c;
+	}
+	// return bigint initialized to value
+	function nbv(i) {
+		var r = nbi();
+		r.fromInt(i);
+		return r;
+	}
+	// returns bit length of the integer x
+	function nbits(x) {
+		var r = 1;
+		var t;
+		if ((t = x >>> 16) != 0) {
+			x = t;
+			r += 16;
+		}
+		if ((t = x >> 8) != 0) {
+			x = t;
+			r += 8;
+		}
+		if ((t = x >> 4) != 0) {
+			x = t;
+			r += 4;
+		}
+		if ((t = x >> 2) != 0) {
+			x = t;
+			r += 2;
+		}
+		if ((t = x >> 1) != 0) {
+			x = t;
+			r += 1;
+		}
+		return r;
+	}
+	// "constants"
+	BigInteger.ZERO = nbv(0);
+	BigInteger.ONE = nbv(1);
+
+	// prng4.js - uses Arcfour as a PRNG
+	var Arcfour = /** @class */ (function() {
+		function Arcfour() {
+			this.i = 0;
+			this.j = 0;
+			this.S = [];
+		}
+		// Arcfour.prototype.init = ARC4init;
+		// Initialize arcfour context from key, an array of ints, each from [0..255]
+		Arcfour.prototype.init = function(key) {
+			var i;
+			var j;
+			var t;
+			for (i = 0; i < 256; ++i) {
+				this.S[i] = i;
+			}
+			j = 0;
+			for (i = 0; i < 256; ++i) {
+				j = (j + this.S[i] + key[i % key.length]) & 255;
+				t = this.S[i];
+				this.S[i] = this.S[j];
+				this.S[j] = t;
+			}
+			this.i = 0;
+			this.j = 0;
+		};
+		// Arcfour.prototype.next = ARC4next;
+		Arcfour.prototype.next = function() {
+			var t;
+			this.i = (this.i + 1) & 255;
+			this.j = (this.j + this.S[this.i]) & 255;
+			t = this.S[this.i];
+			this.S[this.i] = this.S[this.j];
+			this.S[this.j] = t;
+			return this.S[(t + this.S[this.i]) & 255];
+		};
+		return Arcfour;
+	}());
+	// Plug in your RNG constructor here
+	function prng_newstate() {
+		return new Arcfour();
+	}
+	// Pool size must be a multiple of 4 and greater than 32.
+	// An array of bytes the size of the pool will be passed to init()
+	var rng_psize = 256;
+
+	// Random number generator - requires a PRNG backend, e.g. prng4.js
+	var rng_state;
+	var rng_pool = null;
+	var rng_pptr;
+	// Initialize the pool with junk if needed.
+	if (rng_pool == null) {
+		rng_pool = [];
+		rng_pptr = 0;
+		var t = void 0;
+		if (window2.crypto && window2.crypto.getRandomValues) {
+			// Extract entropy (2048 bits) from RNG if available
+			var z = new Uint32Array(256);
+			window2.crypto.getRandomValues(z);
+			for (t = 0; t < z.length; ++t) {
+				rng_pool[rng_pptr++] = z[t] & 255;
+			}
+		}
+		// Use mouse events for entropy, if we do not have enough entropy by the time
+		// we need it, entropy will be generated by Math.random.
+		var onMouseMoveListener_1 = function(ev) {
+			this.count = this.count || 0;
+			if (this.count >= 256 || rng_pptr >= rng_psize) {
+				if (window2.removeEventListener) {
+					window2.removeEventListener("mousemove", onMouseMoveListener_1, false);
+				} else if (window2.detachEvent) {
+					window2.detachEvent("onmousemove", onMouseMoveListener_1);
+				}
+				return;
+			}
+			try {
+				var mouseCoordinates = ev.x + ev.y;
+				rng_pool[rng_pptr++] = mouseCoordinates & 255;
+				this.count += 1;
+			} catch (e) {
+				// Sometimes Firefox will deny permission to access event properties for some reason. Ignore.
+			}
+		};
+		if (window2.addEventListener) {
+			window2.addEventListener("mousemove", onMouseMoveListener_1, false);
+		} else if (window2.attachEvent) {
+			window2.attachEvent("onmousemove", onMouseMoveListener_1);
+		}
+	}
+
+	function rng_get_byte() {
+		if (rng_state == null) {
+			rng_state = prng_newstate();
+			// At this point, we may not have collected enough entropy.  If not, fall back to Math.random
+			while (rng_pptr < rng_psize) {
+				var random = Math.floor(65536 * Math.random());
+				rng_pool[rng_pptr++] = random & 255;
+			}
+			rng_state.init(rng_pool);
+			for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {
+				rng_pool[rng_pptr] = 0;
+			}
+			rng_pptr = 0;
+		}
+		// TODO: allow reseeding after first request
+		return rng_state.next();
+	}
+	var SecureRandom = /** @class */ (function() {
+		function SecureRandom() {}
+		SecureRandom.prototype.nextBytes = function(ba) {
+			for (var i = 0; i < ba.length; ++i) {
+				ba[i] = rng_get_byte();
+			}
+		};
+		return SecureRandom;
+	}());
+
+	// Depends on jsbn.js and rng.js
+	// function linebrk(s,n) {
+	//   var ret = "";
+	//   var i = 0;
+	//   while(i + n < s.length) {
+	//     ret += s.substring(i,i+n) + "\n";
+	//     i += n;
+	//   }
+	//   return ret + s.substring(i,s.length);
+	// }
+	// function byte2Hex(b) {
+	//   if(b < 0x10)
+	//     return "0" + b.toString(16);
+	//   else
+	//     return b.toString(16);
+	// }
+	function pkcs1pad1(s, n) {
+		if (n < s.length + 22) {
+			console.error("Message too long for RSA");
+			return null;
+		}
+		var len = n - s.length - 6;
+		var filler = "";
+		for (var f = 0; f < len; f += 2) {
+			filler += "ff";
+		}
+		var m = "0001" + filler + "00" + s;
+		return parseBigInt(m, 16);
+	}
+	// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint
+	function pkcs1pad2(s, n) {
+		if (n < s.length + 11) { // TODO: fix for utf-8
+			console.error("Message too long for RSA");
+			return null;
+		}
+		var ba = [];
+		var i = s.length - 1;
+		while (i >= 0 && n > 0) {
+			var c = s.charCodeAt(i--);
+			if (c < 128) { // encode using utf-8
+				ba[--n] = c;
+			} else if ((c > 127) && (c < 2048)) {
+				ba[--n] = (c & 63) | 128;
+				ba[--n] = (c >> 6) | 192;
+			} else {
+				ba[--n] = (c & 63) | 128;
+				ba[--n] = ((c >> 6) & 63) | 128;
+				ba[--n] = (c >> 12) | 224;
+			}
+		}
+		ba[--n] = 0;
+		var rng = new SecureRandom();
+		var x = [];
+		while (n > 2) { // random non-zero pad
+			x[0] = 0;
+			while (x[0] == 0) {
+				rng.nextBytes(x);
+			}
+			ba[--n] = x[0];
+		}
+		ba[--n] = 2;
+		ba[--n] = 0;
+		return new BigInteger(ba);
+	}
+	// "empty" RSA key constructor
+	var RSAKey = /** @class */ (function() {
+		function RSAKey() {
+			this.n = null;
+			this.e = 0;
+			this.d = null;
+			this.p = null;
+			this.q = null;
+			this.dmp1 = null;
+			this.dmq1 = null;
+			this.coeff = null;
+		}
+		//#region PROTECTED
+		// protected
+		// RSAKey.prototype.doPublic = RSADoPublic;
+		// Perform raw public operation on "x": return x^e (mod n)
+		RSAKey.prototype.doPublic = function(x) {
+			return x.modPowInt(this.e, this.n);
+		};
+		// RSAKey.prototype.doPrivate = RSADoPrivate;
+		// Perform raw private operation on "x": return x^d (mod n)
+		RSAKey.prototype.doPrivate = function(x) {
+			console.log('p',this.p,'q',this.q)
+			console.log('d',this.d,'n',this.n)
+			if (this.p == null || this.q == null) {
+				
+				return x.modPow(this.d, this.n);
+				
+			}
+			// TODO: re-calculate any missing CRT params
+			var xp = x.mod(this.p).modPow(this.dmp1, this.p);
+			var xq = x.mod(this.q).modPow(this.dmq1, this.q);
+			while (xp.compareTo(xq) < 0) {
+				xp = xp.add(this.p);
+			}
+			return xp.subtract(xq).multiply(this.coeff).mod(this.p).multiply(this.q).add(xq);
+		};
+		//#endregion PROTECTED
+		//#region PUBLIC
+		// RSAKey.prototype.setPublic = RSASetPublic;
+		// Set the public key fields N and e from hex strings
+		RSAKey.prototype.setPublic = function(N, E) {
+			if (N != null && E != null && N.length > 0 && E.length > 0) {
+				this.n = parseBigInt(N, 16);
+				this.e = parseInt(E, 16);
+			} else {
+				console.error("Invalid RSA public key");
+			}
+		};
+		// RSAKey.prototype.encrypt = RSAEncrypt;
+		// Return the PKCS#1 RSA encryption of "text" as an even-length hex string
+		RSAKey.prototype.encrypt = function(text) {
+			var m = pkcs1pad2(text, (this.n.bitLength() + 7) >> 3);
+			if (m == null) {
+				return null;
+			}
+			var c = this.doPublic(m);
+			if (c == null) {
+				return null;
+			}
+			var h = c.toString(16);
+			if ((h.length & 1) == 0) {
+				return h;
+			} else {
+				return "0" + h;
+			}
+		};
+		// RSAKey.prototype.setPrivate = RSASetPrivate;
+		// Set the private key fields N, e, and d from hex strings
+		RSAKey.prototype.setPrivate = function(N, E, D) {
+			if (N != null && E != null && N.length > 0 && E.length > 0) {
+				this.n = parseBigInt(N, 16);
+				this.e = parseInt(E, 16);
+				this.d = parseBigInt(D, 16);
+			} else {
+				console.error("Invalid RSA private key");
+			}
+		};
+		// RSAKey.prototype.setPrivateEx = RSASetPrivateEx;
+		// Set the private key fields N, e, d and CRT params from hex strings
+		RSAKey.prototype.setPrivateEx = function(N, E, D, P, Q, DP, DQ, C) {
+			if (N != null && E != null && N.length > 0 && E.length > 0) {
+				this.n = parseBigInt(N, 16);
+				this.e = parseInt(E, 16);
+				this.d = parseBigInt(D, 16);
+				this.p = parseBigInt(P, 16);
+				this.q = parseBigInt(Q, 16);
+				this.dmp1 = parseBigInt(DP, 16);
+				this.dmq1 = parseBigInt(DQ, 16);
+				this.coeff = parseBigInt(C, 16);
+			} else {
+				console.error("Invalid RSA private key");
+			}
+		};
+		// RSAKey.prototype.generate = RSAGenerate;
+		// Generate a new random private key B bits long, using public expt E
+		RSAKey.prototype.generate = function(B, E) {
+			var rng = new SecureRandom();
+			var qs = B >> 1;
+			this.e = parseInt(E, 16);
+			var ee = new BigInteger(E, 16);
+			for (;;) {
+				for (;;) {
+					this.p = new BigInteger(B - qs, 1, rng);
+					if (this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) ==
+						0 && this.p.isProbablePrime(10)) {
+						break;
+					}
+				}
+				for (;;) {
+					this.q = new BigInteger(qs, 1, rng);
+					if (this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) ==
+						0 && this.q.isProbablePrime(10)) {
+						break;
+					}
+				}
+				if (this.p.compareTo(this.q) <= 0) {
+					var t = this.p;
+					this.p = this.q;
+					this.q = t;
+				}
+				var p1 = this.p.subtract(BigInteger.ONE);
+				var q1 = this.q.subtract(BigInteger.ONE);
+				var phi = p1.multiply(q1);
+				if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {
+					this.n = this.p.multiply(this.q);
+					this.d = ee.modInverse(phi);
+					this.dmp1 = this.d.mod(p1);
+					this.dmq1 = this.d.mod(q1);
+					this.coeff = this.q.modInverse(this.p);
+					break;
+				}
+			}
+		};
+		// RSAKey.prototype.decrypt = RSADecrypt;
+		// Return the PKCS#1 RSA decryption of "ctext".
+		// "ctext" is an even-length hex string and the output is a plain string.
+		RSAKey.prototype.decrypt = function(ctext) {
+			var c = parseBigInt(ctext, 16);
+			var m = this.doPrivate(c);
+			if (m == null) {
+				return null;
+			}
+			return pkcs1unpad2(m, (this.n.bitLength() + 7) >> 3);
+		};
+		// Generate a new random private key B bits long, using public expt E
+		RSAKey.prototype.generateAsync = function(B, E, callback) {
+			var rng = new SecureRandom();
+			var qs = B >> 1;
+			this.e = parseInt(E, 16);
+			var ee = new BigInteger(E, 16);
+			var rsa = this;
+			// These functions have non-descript names because they were originally for(;;) loops.
+			// I don't know about cryptography to give them better names than loop1-4.
+			var loop1 = function() {
+				var loop4 = function() {
+					if (rsa.p.compareTo(rsa.q) <= 0) {
+						var t = rsa.p;
+						rsa.p = rsa.q;
+						rsa.q = t;
+					}
+					var p1 = rsa.p.subtract(BigInteger.ONE);
+					var q1 = rsa.q.subtract(BigInteger.ONE);
+					var phi = p1.multiply(q1);
+					if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {
+						rsa.n = rsa.p.multiply(rsa.q);
+						rsa.d = ee.modInverse(phi);
+						rsa.dmp1 = rsa.d.mod(p1);
+						rsa.dmq1 = rsa.d.mod(q1);
+						rsa.coeff = rsa.q.modInverse(rsa.p);
+						setTimeout(function() {
+							callback();
+						}, 0); // escape
+					} else {
+						setTimeout(loop1, 0);
+					}
+				};
+				var loop3 = function() {
+					rsa.q = nbi();
+					rsa.q.fromNumberAsync(qs, 1, rng, function() {
+						rsa.q.subtract(BigInteger.ONE).gcda(ee, function(r) {
+							if (r.compareTo(BigInteger.ONE) == 0 && rsa
+								.q.isProbablePrime(10)) {
+								setTimeout(loop4, 0);
+							} else {
+								setTimeout(loop3, 0);
+							}
+						});
+					});
+				};
+				var loop2 = function() {
+					rsa.p = nbi();
+					rsa.p.fromNumberAsync(B - qs, 1, rng, function() {
+						rsa.p.subtract(BigInteger.ONE).gcda(ee, function(r) {
+							if (r.compareTo(BigInteger.ONE) == 0 && rsa
+								.p.isProbablePrime(10)) {
+								setTimeout(loop3, 0);
+							} else {
+								setTimeout(loop2, 0);
+							}
+						});
+					});
+				};
+				setTimeout(loop2, 0);
+			};
+			setTimeout(loop1, 0);
+		};
+		RSAKey.prototype.sign = function(text, digestMethod, digestName) {
+			console.log(digestMethod)
+			var header = getDigestHeader(digestName);
+			var digest = header + digestMethod(text).toString();
+			var m = pkcs1pad1(digest, this.n.bitLength() / 4);
+			if (m == null) {
+				return null;
+			}
+			console.log("m",m.toString())
+			var c = this.doPrivate(m);
+			if (c == null) {
+				return null;
+			}
+			var h = c.toString(16);
+			if ((h.length & 1) == 0) {
+				return h;
+			} else {
+				return "0" + h;
+			}
+		};
+		RSAKey.prototype.verify = function(text, signature, digestMethod) {
+			var c = parseBigInt(signature, 16);
+			var m = this.doPublic(c);
+			if (m == null) {
+				return null;
+			}
+			var unpadded = m.toString(16).replace(/^1f+00/, "");
+			var digest = removeDigestHeader(unpadded);
+			return digest == digestMethod(text).toString();
+		};
+		return RSAKey;
+	}());
+	// Undo PKCS#1 (type 2, random) padding and, if valid, return the plaintext
+	function pkcs1unpad2(d, n) {
+		var b = d.toByteArray();
+		var i = 0;
+		while (i < b.length && b[i] == 0) {
+			++i;
+		}
+		if (b.length - i != n - 1 || b[i] != 2) {
+			return null;
+		}
+		++i;
+		while (b[i] != 0) {
+			if (++i >= b.length) {
+				return null;
+			}
+		}
+		var ret = "";
+		while (++i < b.length) {
+			var c = b[i] & 255;
+			if (c < 128) { // utf-8 decode
+				ret += String.fromCharCode(c);
+			} else if ((c > 191) && (c < 224)) {
+				ret += String.fromCharCode(((c & 31) << 6) | (b[i + 1] & 63));
+				++i;
+			} else {
+				ret += String.fromCharCode(((c & 15) << 12) | ((b[i + 1] & 63) << 6) | (b[i + 2] & 63));
+				i += 2;
+			}
+		}
+		return ret;
+	}
+	// https://tools.ietf.org/html/rfc3447#page-43
+	var DIGEST_HEADERS = {
+		md2: "3020300c06082a864886f70d020205000410",
+		md5: "3020300c06082a864886f70d020505000410",
+		sha1: "3021300906052b0e03021a05000414",
+		sha224: "302d300d06096086480165030402040500041c",
+		sha256: "3031300d060960864801650304020105000420",
+		sha384: "3041300d060960864801650304020205000430",
+		sha512: "3051300d060960864801650304020305000440",
+		ripemd160: "3021300906052b2403020105000414",
+	};
+
+	function getDigestHeader(name) {
+		return DIGEST_HEADERS[name] || "";
+	}
+
+	function removeDigestHeader(str) {
+		for (var name_1 in DIGEST_HEADERS) {
+			if (DIGEST_HEADERS.hasOwnProperty(name_1)) {
+				var header = DIGEST_HEADERS[name_1];
+				var len = header.length;
+				if (str.substr(0, len) == header) {
+					return str.substr(len);
+				}
+			}
+		}
+		return str;
+	}
+	// Return the PKCS#1 RSA encryption of "text" as a Base64-encoded string
+	// function RSAEncryptB64(text) {
+	//  var h = this.encrypt(text);
+	//  if(h) return hex2b64(h); else return null;
+	// }
+	// public
+	// RSAKey.prototype.encrypt_b64 = RSAEncryptB64;
+
+	/*!
+	Copyright (c) 2011, Yahoo! Inc. All rights reserved.
+	Code licensed under the BSD License:
+	http://developer.yahoo.com/yui/license.html
+	version: 2.9.0
+	*/
+	var YAHOO = {};
+	YAHOO.lang = {
+		/**
+		 * Utility to set up the prototype, constructor and superclass properties to
+		 * support an inheritance strategy that can chain constructors and methods.
+		 * Static members will not be inherited.
+		 *
+		 * @method extend
+		 * @static
+		 * @param {Function} subc   the object to modify
+		 * @param {Function} superc the object to inherit
+		 * @param {Object} overrides  additional properties/methods to add to the
+		 *                              subclass prototype.  These will override the
+		 *                              matching items obtained from the superclass
+		 *                              if present.
+		 */
+		extend: function(subc, superc, overrides) {
+			if (!superc || !subc) {
+				throw new Error("YAHOO.lang.extend failed, please check that " +
+					"all dependencies are included.");
+			}
+
+			var F = function() {};
+			F.prototype = superc.prototype;
+			subc.prototype = new F();
+			subc.prototype.constructor = subc;
+			subc.superclass = superc.prototype;
+
+			if (superc.prototype.constructor == Object.prototype.constructor) {
+				superc.prototype.constructor = superc;
+			}
+
+			if (overrides) {
+				var i;
+				for (i in overrides) {
+					subc.prototype[i] = overrides[i];
+				}
+
+				/*
+				 * IE will not enumerate native functions in a derived object even if the
+				 * function was overridden.  This is a workaround for specific functions
+				 * we care about on the Object prototype.
+				 * @property _IEEnumFix
+				 * @param {Function} r  the object to receive the augmentation
+				 * @param {Function} s  the object that supplies the properties to augment
+				 * @static
+				 * @private
+				 */
+				var _IEEnumFix = function() {},
+					ADD = ["toString", "valueOf"];
+				try {
+					if (/MSIE/.test(navigator2.userAgent)) {
+						_IEEnumFix = function(r, s) {
+							for (i = 0; i < ADD.length; i = i + 1) {
+								var fname = ADD[i],
+									f = s[fname];
+								if (typeof f === 'function' && f != Object.prototype[fname]) {
+									r[fname] = f;
+								}
+							}
+						};
+					}
+				} catch (ex) {}
+				_IEEnumFix(subc.prototype, overrides);
+			}
+		}
+	};
+
+	/* asn1-1.0.13.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
+	 */
+
+	/**
+	 * @fileOverview
+	 * @name asn1-1.0.js
+	 * @author Kenji Urushima kenji.urushima@gmail.com
+	 * @version asn1 1.0.13 (2017-Jun-02)
+	 * @since jsrsasign 2.1
+	 * @license <a href="https://kjur.github.io/jsrsasign/license/">MIT License</a>
+	 */
+
+	/**
+	 * kjur's class library name space
+	 * <p>
+	 * This name space provides following name spaces:
+	 * <ul>
+	 * <li>{@link KJUR.asn1} - ASN.1 primitive hexadecimal encoder</li>
+	 * <li>{@link KJUR.asn1.x509} - ASN.1 structure for X.509 certificate and CRL</li>
+	 * <li>{@link KJUR.crypto} - Java Cryptographic Extension(JCE) style MessageDigest/Signature
+	 * class and utilities</li>
+	 * </ul>
+	 * </p>
+	 * NOTE: Please ignore method summary and document of this namespace. This caused by a bug of jsdoc2.
+	 * @name KJUR
+	 * @namespace kjur's class library name space
+	 */
+	var KJUR = {};
+
+	/**
+	 * kjur's ASN.1 class library name space
+	 * <p>
+	 * This is ITU-T X.690 ASN.1 DER encoder class library and
+	 * class structure and methods is very similar to
+	 * org.bouncycastle.asn1 package of
+	 * well known BouncyCaslte Cryptography Library.
+	 * <h4>PROVIDING ASN.1 PRIMITIVES</h4>
+	 * Here are ASN.1 DER primitive classes.
+	 * <ul>
+	 * <li>0x01 {@link KJUR.asn1.DERBoolean}</li>
+	 * <li>0x02 {@link KJUR.asn1.DERInteger}</li>
+	 * <li>0x03 {@link KJUR.asn1.DERBitString}</li>
+	 * <li>0x04 {@link KJUR.asn1.DEROctetString}</li>
+	 * <li>0x05 {@link KJUR.asn1.DERNull}</li>
+	 * <li>0x06 {@link KJUR.asn1.DERObjectIdentifier}</li>
+	 * <li>0x0a {@link KJUR.asn1.DEREnumerated}</li>
+	 * <li>0x0c {@link KJUR.asn1.DERUTF8String}</li>
+	 * <li>0x12 {@link KJUR.asn1.DERNumericString}</li>
+	 * <li>0x13 {@link KJUR.asn1.DERPrintableString}</li>
+	 * <li>0x14 {@link KJUR.asn1.DERTeletexString}</li>
+	 * <li>0x16 {@link KJUR.asn1.DERIA5String}</li>
+	 * <li>0x17 {@link KJUR.asn1.DERUTCTime}</li>
+	 * <li>0x18 {@link KJUR.asn1.DERGeneralizedTime}</li>
+	 * <li>0x30 {@link KJUR.asn1.DERSequence}</li>
+	 * <li>0x31 {@link KJUR.asn1.DERSet}</li>
+	 * </ul>
+	 * <h4>OTHER ASN.1 CLASSES</h4>
+	 * <ul>
+	 * <li>{@link KJUR.asn1.ASN1Object}</li>
+	 * <li>{@link KJUR.asn1.DERAbstractString}</li>
+	 * <li>{@link KJUR.asn1.DERAbstractTime}</li>
+	 * <li>{@link KJUR.asn1.DERAbstractStructured}</li>
+	 * <li>{@link KJUR.asn1.DERTaggedObject}</li>
+	 * </ul>
+	 * <h4>SUB NAME SPACES</h4>
+	 * <ul>
+	 * <li>{@link KJUR.asn1.cades} - CAdES long term signature format</li>
+	 * <li>{@link KJUR.asn1.cms} - Cryptographic Message Syntax</li>
+	 * <li>{@link KJUR.asn1.csr} - Certificate Signing Request (CSR/PKCS#10)</li>
+	 * <li>{@link KJUR.asn1.tsp} - RFC 3161 Timestamping Protocol Format</li>
+	 * <li>{@link KJUR.asn1.x509} - RFC 5280 X.509 certificate and CRL</li>
+	 * </ul>
+	 * </p>
+	 * NOTE: Please ignore method summary and document of this namespace.
+	 * This caused by a bug of jsdoc2.
+	 * @name KJUR.asn1
+	 * @namespace
+	 */
+	if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) KJUR.asn1 = {};
+
+	/**
+	 * ASN1 utilities class
+	 * @name KJUR.asn1.ASN1Util
+	 * @class ASN1 utilities class
+	 * @since asn1 1.0.2
+	 */
+	KJUR.asn1.ASN1Util = new function() {
+		this.integerToByteHex = function(i) {
+			var h = i.toString(16);
+			if ((h.length % 2) == 1) h = '0' + h;
+			return h;
+		};
+		this.bigIntToMinTwosComplementsHex = function(bigIntegerValue) {
+			var h = bigIntegerValue.toString(16);
+			if (h.substr(0, 1) != '-') {
+				if (h.length % 2 == 1) {
+					h = '0' + h;
+				} else {
+					if (!h.match(/^[0-7]/)) {
+						h = '00' + h;
+					}
+				}
+			} else {
+				var hPos = h.substr(1);
+				var xorLen = hPos.length;
+				if (xorLen % 2 == 1) {
+					xorLen += 1;
+				} else {
+					if (!h.match(/^[0-7]/)) {
+						xorLen += 2;
+					}
+				}
+				var hMask = '';
+				for (var i = 0; i < xorLen; i++) {
+					hMask += 'f';
+				}
+				var biMask = new BigInteger(hMask, 16);
+				var biNeg = biMask.xor(bigIntegerValue).add(BigInteger.ONE);
+				h = biNeg.toString(16).replace(/^-/, '');
+			}
+			return h;
+		};
+		/**
+		 * get PEM string from hexadecimal data and header string
+		 * @name getPEMStringFromHex
+		 * @memberOf KJUR.asn1.ASN1Util
+		 * @function
+		 * @param {String} dataHex hexadecimal string of PEM body
+		 * @param {String} pemHeader PEM header string (ex. 'RSA PRIVATE KEY')
+		 * @return {String} PEM formatted string of input data
+		 * @description
+		 * This method converts a hexadecimal string to a PEM string with
+		 * a specified header. Its line break will be CRLF("\r\n").
+		 * @example
+		 * var pem  = KJUR.asn1.ASN1Util.getPEMStringFromHex('616161', 'RSA PRIVATE KEY');
+		 * // value of pem will be:
+		 * -----BEGIN PRIVATE KEY-----
+		 * YWFh
+		 * -----END PRIVATE KEY-----
+		 */
+		this.getPEMStringFromHex = function(dataHex, pemHeader) {
+			return hextopem(dataHex, pemHeader);
+		};
+
+		/**
+		 * generate ASN1Object specifed by JSON parameters
+		 * @name newObject
+		 * @memberOf KJUR.asn1.ASN1Util
+		 * @function
+		 * @param {Array} param JSON parameter to generate ASN1Object
+		 * @return {KJUR.asn1.ASN1Object} generated object
+		 * @since asn1 1.0.3
+		 * @description
+		 * generate any ASN1Object specified by JSON param
+		 * including ASN.1 primitive or structured.
+		 * Generally 'param' can be described as follows:
+		 * <blockquote>
+		 * {TYPE-OF-ASNOBJ: ASN1OBJ-PARAMETER}
+		 * </blockquote>
+		 * 'TYPE-OF-ASN1OBJ' can be one of following symbols:
+		 * <ul>
+		 * <li>'bool' - DERBoolean</li>
+		 * <li>'int' - DERInteger</li>
+		 * <li>'bitstr' - DERBitString</li>
+		 * <li>'octstr' - DEROctetString</li>
+		 * <li>'null' - DERNull</li>
+		 * <li>'oid' - DERObjectIdentifier</li>
+		 * <li>'enum' - DEREnumerated</li>
+		 * <li>'utf8str' - DERUTF8String</li>
+		 * <li>'numstr' - DERNumericString</li>
+		 * <li>'prnstr' - DERPrintableString</li>
+		 * <li>'telstr' - DERTeletexString</li>
+		 * <li>'ia5str' - DERIA5String</li>
+		 * <li>'utctime' - DERUTCTime</li>
+		 * <li>'gentime' - DERGeneralizedTime</li>
+		 * <li>'seq' - DERSequence</li>
+		 * <li>'set' - DERSet</li>
+		 * <li>'tag' - DERTaggedObject</li>
+		 * </ul>
+		 * @example
+		 * newObject({'prnstr': 'aaa'});
+		 * newObject({'seq': [{'int': 3}, {'prnstr': 'aaa'}]})
+		 * // ASN.1 Tagged Object
+		 * newObject({'tag': {'tag': 'a1',
+		 *                    'explicit': true,
+		 *                    'obj': {'seq': [{'int': 3}, {'prnstr': 'aaa'}]}}});
+		 * // more simple representation of ASN.1 Tagged Object
+		 * newObject({'tag': ['a1',
+		 *                    true,
+		 *                    {'seq': [
+		 *                      {'int': 3},
+		 *                      {'prnstr': 'aaa'}]}
+		 *                   ]});
+		 */
+		this.newObject = function(param) {
+			var _KJUR = KJUR,
+				_KJUR_asn1 = _KJUR.asn1,
+				_DERBoolean = _KJUR_asn1.DERBoolean,
+				_DERInteger = _KJUR_asn1.DERInteger,
+				_DERBitString = _KJUR_asn1.DERBitString,
+				_DEROctetString = _KJUR_asn1.DEROctetString,
+				_DERNull = _KJUR_asn1.DERNull,
+				_DERObjectIdentifier = _KJUR_asn1.DERObjectIdentifier,
+				_DEREnumerated = _KJUR_asn1.DEREnumerated,
+				_DERUTF8String = _KJUR_asn1.DERUTF8String,
+				_DERNumericString = _KJUR_asn1.DERNumericString,
+				_DERPrintableString = _KJUR_asn1.DERPrintableString,
+				_DERTeletexString = _KJUR_asn1.DERTeletexString,
+				_DERIA5String = _KJUR_asn1.DERIA5String,
+				_DERUTCTime = _KJUR_asn1.DERUTCTime,
+				_DERGeneralizedTime = _KJUR_asn1.DERGeneralizedTime,
+				_DERSequence = _KJUR_asn1.DERSequence,
+				_DERSet = _KJUR_asn1.DERSet,
+				_DERTaggedObject = _KJUR_asn1.DERTaggedObject,
+				_newObject = _KJUR_asn1.ASN1Util.newObject;
+
+			var keys = Object.keys(param);
+			if (keys.length != 1)
+				throw "key of param shall be only one.";
+			var key = keys[0];
+
+			if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:"
+				.indexOf(":" + key + ":") == -1)
+				throw "undefined key: " + key;
+
+			if (key == "bool") return new _DERBoolean(param[key]);
+			if (key == "int") return new _DERInteger(param[key]);
+			if (key == "bitstr") return new _DERBitString(param[key]);
+			if (key == "octstr") return new _DEROctetString(param[key]);
+			if (key == "null") return new _DERNull(param[key]);
+			if (key == "oid") return new _DERObjectIdentifier(param[key]);
+			if (key == "enum") return new _DEREnumerated(param[key]);
+			if (key == "utf8str") return new _DERUTF8String(param[key]);
+			if (key == "numstr") return new _DERNumericString(param[key]);
+			if (key == "prnstr") return new _DERPrintableString(param[key]);
+			if (key == "telstr") return new _DERTeletexString(param[key]);
+			if (key == "ia5str") return new _DERIA5String(param[key]);
+			if (key == "utctime") return new _DERUTCTime(param[key]);
+			if (key == "gentime") return new _DERGeneralizedTime(param[key]);
+
+			if (key == "seq") {
+				var paramList = param[key];
+				var a = [];
+				for (var i = 0; i < paramList.length; i++) {
+					var asn1Obj = _newObject(paramList[i]);
+					a.push(asn1Obj);
+				}
+				return new _DERSequence({
+					'array': a
+				});
+			}
+
+			if (key == "set") {
+				var paramList = param[key];
+				var a = [];
+				for (var i = 0; i < paramList.length; i++) {
+					var asn1Obj = _newObject(paramList[i]);
+					a.push(asn1Obj);
+				}
+				return new _DERSet({
+					'array': a
+				});
+			}
+
+			if (key == "tag") {
+				var tagParam = param[key];
+				if (Object.prototype.toString.call(tagParam) === '[object Array]' &&
+					tagParam.length == 3) {
+					var obj = _newObject(tagParam[2]);
+					return new _DERTaggedObject({
+						tag: tagParam[0],
+						explicit: tagParam[1],
+						obj: obj
+					});
+				} else {
+					var newParam = {};
+					if (tagParam.explicit !== undefined)
+						newParam.explicit = tagParam.explicit;
+					if (tagParam.tag !== undefined)
+						newParam.tag = tagParam.tag;
+					if (tagParam.obj === undefined)
+						throw "obj shall be specified for 'tag'.";
+					newParam.obj = _newObject(tagParam.obj);
+					return new _DERTaggedObject(newParam);
+				}
+			}
+		};
+
+		/**
+		 * get encoded hexadecimal string of ASN1Object specifed by JSON parameters
+		 * @name jsonToASN1HEX
+		 * @memberOf KJUR.asn1.ASN1Util
+		 * @function
+		 * @param {Array} param JSON parameter to generate ASN1Object
+		 * @return hexadecimal string of ASN1Object
+		 * @since asn1 1.0.4
+		 * @description
+		 * As for ASN.1 object representation of JSON object,
+		 * please see {@link newObject}.
+		 * @example
+		 * jsonToASN1HEX({'prnstr': 'aaa'});
+		 */
+		this.jsonToASN1HEX = function(param) {
+			var asn1Obj = this.newObject(param);
+			return asn1Obj.getEncodedHex();
+		};
+	};
+
+	/**
+	 * get dot noted oid number string from hexadecimal value of OID
+	 * @name oidHexToInt
+	 * @memberOf KJUR.asn1.ASN1Util
+	 * @function
+	 * @param {String} hex hexadecimal value of object identifier
+	 * @return {String} dot noted string of object identifier
+	 * @since jsrsasign 4.8.3 asn1 1.0.7
+	 * @description
+	 * This static method converts from hexadecimal string representation of
+	 * ASN.1 value of object identifier to oid number string.
+	 * @example
+	 * KJUR.asn1.ASN1Util.oidHexToInt('550406') &rarr; "2.5.4.6"
+	 */
+	KJUR.asn1.ASN1Util.oidHexToInt = function(hex) {
+		var s = "";
+		var i01 = parseInt(hex.substr(0, 2), 16);
+		var i0 = Math.floor(i01 / 40);
+		var i1 = i01 % 40;
+		var s = i0 + "." + i1;
+
+		var binbuf = "";
+		for (var i = 2; i < hex.length; i += 2) {
+			var value = parseInt(hex.substr(i, 2), 16);
+			var bin = ("00000000" + value.toString(2)).slice(-8);
+			binbuf = binbuf + bin.substr(1, 7);
+			if (bin.substr(0, 1) == "0") {
+				var bi = new BigInteger(binbuf, 2);
+				s = s + "." + bi.toString(10);
+				binbuf = "";
+			}
+		}
+		return s;
+	};
+
+	/**
+	 * get hexadecimal value of object identifier from dot noted oid value
+	 * @name oidIntToHex
+	 * @memberOf KJUR.asn1.ASN1Util
+	 * @function
+	 * @param {String} oidString dot noted string of object identifier
+	 * @return {String} hexadecimal value of object identifier
+	 * @since jsrsasign 4.8.3 asn1 1.0.7
+	 * @description
+	 * This static method converts from object identifier value string.
+	 * to hexadecimal string representation of it.
+	 * @example
+	 * KJUR.asn1.ASN1Util.oidIntToHex("2.5.4.6") &rarr; "550406"
+	 */
+	KJUR.asn1.ASN1Util.oidIntToHex = function(oidString) {
+		var itox = function(i) {
+			var h = i.toString(16);
+			if (h.length == 1) h = '0' + h;
+			return h;
+		};
+
+		var roidtox = function(roid) {
+			var h = '';
+			var bi = new BigInteger(roid, 10);
+			var b = bi.toString(2);
+			var padLen = 7 - b.length % 7;
+			if (padLen == 7) padLen = 0;
+			var bPad = '';
+			for (var i = 0; i < padLen; i++) bPad += '0';
+			b = bPad + b;
+			for (var i = 0; i < b.length - 1; i += 7) {
+				var b8 = b.substr(i, 7);
+				if (i != b.length - 7) b8 = '1' + b8;
+				h += itox(parseInt(b8, 2));
+			}
+			return h;
+		};
+
+		if (!oidString.match(/^[0-9.]+$/)) {
+			throw "malformed oid string: " + oidString;
+		}
+		var h = '';
+		var a = oidString.split('.');
+		var i0 = parseInt(a[0]) * 40 + parseInt(a[1]);
+		h += itox(i0);
+		a.splice(0, 2);
+		for (var i = 0; i < a.length; i++) {
+			h += roidtox(a[i]);
+		}
+		return h;
+	};
+
+
+	// ********************************************************************
+	//  Abstract ASN.1 Classes
+	// ********************************************************************
+
+	// ********************************************************************
+
+	/**
+	 * base class for ASN.1 DER encoder object
+	 * @name KJUR.asn1.ASN1Object
+	 * @class base class for ASN.1 DER encoder object
+	 * @property {Boolean} isModified flag whether internal data was changed
+	 * @property {String} hTLV hexadecimal string of ASN.1 TLV
+	 * @property {String} hT hexadecimal string of ASN.1 TLV tag(T)
+	 * @property {String} hL hexadecimal string of ASN.1 TLV length(L)
+	 * @property {String} hV hexadecimal string of ASN.1 TLV value(V)
+	 * @description
+	 */
+	KJUR.asn1.ASN1Object = function() {
+		var hV = '';
+
+		/**
+		 * get hexadecimal ASN.1 TLV length(L) bytes from TLV value(V)
+		 * @name getLengthHexFromValue
+		 * @memberOf KJUR.asn1.ASN1Object#
+		 * @function
+		 * @return {String} hexadecimal string of ASN.1 TLV length(L)
+		 */
+		this.getLengthHexFromValue = function() {
+			if (typeof this.hV == "undefined" || this.hV == null) {
+				throw "this.hV is null or undefined.";
+			}
+			if (this.hV.length % 2 == 1) {
+				throw "value hex must be even length: n=" + hV.length + ",v=" + this.hV;
+			}
+			var n = this.hV.length / 2;
+			var hN = n.toString(16);
+			if (hN.length % 2 == 1) {
+				hN = "0" + hN;
+			}
+			if (n < 128) {
+				return hN;
+			} else {
+				var hNlen = hN.length / 2;
+				if (hNlen > 15) {
+					throw "ASN.1 length too long to represent by 8x: n = " + n.toString(16);
+				}
+				var head = 128 + hNlen;
+				return head.toString(16) + hN;
+			}
+		};
+
+		/**
+		 * get hexadecimal string of ASN.1 TLV bytes
+		 * @name getEncodedHex
+		 * @memberOf KJUR.asn1.ASN1Object#
+		 * @function
+		 * @return {String} hexadecimal string of ASN.1 TLV
+		 */
+		this.getEncodedHex = function() {
+			if (this.hTLV == null || this.isModified) {
+				this.hV = this.getFreshValueHex();
+				this.hL = this.getLengthHexFromValue();
+				this.hTLV = this.hT + this.hL + this.hV;
+				this.isModified = false;
+				//alert("first time: " + this.hTLV);
+			}
+			return this.hTLV;
+		};
+
+		/**
+		 * get hexadecimal string of ASN.1 TLV value(V) bytes
+		 * @name getValueHex
+		 * @memberOf KJUR.asn1.ASN1Object#
+		 * @function
+		 * @return {String} hexadecimal string of ASN.1 TLV value(V) bytes
+		 */
+		this.getValueHex = function() {
+			this.getEncodedHex();
+			return this.hV;
+		};
+
+		this.getFreshValueHex = function() {
+			return '';
+		};
+	};
+
+	// == BEGIN DERAbstractString ================================================
+	/**
+	 * base class for ASN.1 DER string classes
+	 * @name KJUR.asn1.DERAbstractString
+	 * @class base class for ASN.1 DER string classes
+	 * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+	 * @property {String} s internal string of value
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>str - specify initial ASN.1 value(V) by a string</li>
+	 * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+	 * </ul>
+	 * NOTE: 'params' can be omitted.
+	 */
+	KJUR.asn1.DERAbstractString = function(params) {
+		KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
+
+		/**
+		 * get string value of this string object
+		 * @name getString
+		 * @memberOf KJUR.asn1.DERAbstractString#
+		 * @function
+		 * @return {String} string value of this string object
+		 */
+		this.getString = function() {
+			return this.s;
+		};
+
+		/**
+		 * set value by a string
+		 * @name setString
+		 * @memberOf KJUR.asn1.DERAbstractString#
+		 * @function
+		 * @param {String} newS value by a string to set
+		 */
+		this.setString = function(newS) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.s = newS;
+			this.hV = stohex(this.s);
+		};
+
+		/**
+		 * set value by a hexadecimal string
+		 * @name setStringHex
+		 * @memberOf KJUR.asn1.DERAbstractString#
+		 * @function
+		 * @param {String} newHexString value by a hexadecimal string to set
+		 */
+		this.setStringHex = function(newHexString) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.s = null;
+			this.hV = newHexString;
+		};
+
+		this.getFreshValueHex = function() {
+			return this.hV;
+		};
+
+		if (typeof params != "undefined") {
+			if (typeof params == "string") {
+				this.setString(params);
+			} else if (typeof params['str'] != "undefined") {
+				this.setString(params['str']);
+			} else if (typeof params['hex'] != "undefined") {
+				this.setStringHex(params['hex']);
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object);
+	// == END   DERAbstractString ================================================
+
+	// == BEGIN DERAbstractTime ==================================================
+	/**
+	 * base class for ASN.1 DER Generalized/UTCTime class
+	 * @name KJUR.asn1.DERAbstractTime
+	 * @class base class for ASN.1 DER Generalized/UTCTime class
+	 * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'})
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * @see KJUR.asn1.ASN1Object - superclass
+	 */
+	KJUR.asn1.DERAbstractTime = function(params) {
+		KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);
+
+		// --- PRIVATE METHODS --------------------
+		this.localDateToUTC = function(d) {
+			utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+			var utcDate = new Date(utc);
+			return utcDate;
+		};
+
+		/*
+		 * format date string by Data object
+		 * @name formatDate
+		 * @memberOf KJUR.asn1.AbstractTime;
+		 * @param {Date} dateObject
+		 * @param {string} type 'utc' or 'gen'
+		 * @param {boolean} withMillis flag for with millisections or not
+		 * @description
+		 * 'withMillis' flag is supported from asn1 1.0.6.
+		 */
+		this.formatDate = function(dateObject, type, withMillis) {
+			var pad = this.zeroPadding;
+			var d = this.localDateToUTC(dateObject);
+			var year = String(d.getFullYear());
+			if (type == 'utc') year = year.substr(2, 2);
+			var month = pad(String(d.getMonth() + 1), 2);
+			var day = pad(String(d.getDate()), 2);
+			var hour = pad(String(d.getHours()), 2);
+			var min = pad(String(d.getMinutes()), 2);
+			var sec = pad(String(d.getSeconds()), 2);
+			var s = year + month + day + hour + min + sec;
+			if (withMillis === true) {
+				var millis = d.getMilliseconds();
+				if (millis != 0) {
+					var sMillis = pad(String(millis), 3);
+					sMillis = sMillis.replace(/[0]+$/, "");
+					s = s + "." + sMillis;
+				}
+			}
+			return s + "Z";
+		};
+
+		this.zeroPadding = function(s, len) {
+			if (s.length >= len) return s;
+			return new Array(len - s.length + 1).join('0') + s;
+		};
+
+		// --- PUBLIC METHODS --------------------
+		/**
+		 * get string value of this string object
+		 * @name getString
+		 * @memberOf KJUR.asn1.DERAbstractTime#
+		 * @function
+		 * @return {String} string value of this time object
+		 */
+		this.getString = function() {
+			return this.s;
+		};
+
+		/**
+		 * set value by a string
+		 * @name setString
+		 * @memberOf KJUR.asn1.DERAbstractTime#
+		 * @function
+		 * @param {String} newS value by a string to set such like "130430235959Z"
+		 */
+		this.setString = function(newS) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.s = newS;
+			this.hV = stohex(newS);
+		};
+
+		/**
+		 * set value by a Date object
+		 * @name setByDateValue
+		 * @memberOf KJUR.asn1.DERAbstractTime#
+		 * @function
+		 * @param {Integer} year year of date (ex. 2013)
+		 * @param {Integer} month month of date between 1 and 12 (ex. 12)
+		 * @param {Integer} day day of month
+		 * @param {Integer} hour hours of date
+		 * @param {Integer} min minutes of date
+		 * @param {Integer} sec seconds of date
+		 */
+		this.setByDateValue = function(year, month, day, hour, min, sec) {
+			var dateObject = new Date(Date.UTC(year, month - 1, day, hour, min, sec, 0));
+			this.setByDate(dateObject);
+		};
+
+		this.getFreshValueHex = function() {
+			return this.hV;
+		};
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object);
+	// == END   DERAbstractTime ==================================================
+
+	// == BEGIN DERAbstractStructured ============================================
+	/**
+	 * base class for ASN.1 DER structured class
+	 * @name KJUR.asn1.DERAbstractStructured
+	 * @class base class for ASN.1 DER structured class
+	 * @property {Array} asn1Array internal array of ASN1Object
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * @see KJUR.asn1.ASN1Object - superclass
+	 */
+	KJUR.asn1.DERAbstractStructured = function(params) {
+		KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
+
+		/**
+		 * set value by array of ASN1Object
+		 * @name setByASN1ObjectArray
+		 * @memberOf KJUR.asn1.DERAbstractStructured#
+		 * @function
+		 * @param {array} asn1ObjectArray array of ASN1Object to set
+		 */
+		this.setByASN1ObjectArray = function(asn1ObjectArray) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.asn1Array = asn1ObjectArray;
+		};
+
+		/**
+		 * append an ASN1Object to internal array
+		 * @name appendASN1Object
+		 * @memberOf KJUR.asn1.DERAbstractStructured#
+		 * @function
+		 * @param {ASN1Object} asn1Object to add
+		 */
+		this.appendASN1Object = function(asn1Object) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.asn1Array.push(asn1Object);
+		};
+
+		this.asn1Array = new Array();
+		if (typeof params != "undefined") {
+			if (typeof params['array'] != "undefined") {
+				this.asn1Array = params['array'];
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object);
+
+
+	// ********************************************************************
+	//  ASN.1 Object Classes
+	// ********************************************************************
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER Boolean
+	 * @name KJUR.asn1.DERBoolean
+	 * @class class for ASN.1 DER Boolean
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * @see KJUR.asn1.ASN1Object - superclass
+	 */
+	KJUR.asn1.DERBoolean = function() {
+		KJUR.asn1.DERBoolean.superclass.constructor.call(this);
+		this.hT = "01";
+		this.hTLV = "0101ff";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER Integer
+	 * @name KJUR.asn1.DERInteger
+	 * @class class for ASN.1 DER Integer
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>int - specify initial ASN.1 value(V) by integer value</li>
+	 * <li>bigint - specify initial ASN.1 value(V) by BigInteger object</li>
+	 * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+	 * </ul>
+	 * NOTE: 'params' can be omitted.
+	 */
+	KJUR.asn1.DERInteger = function(params) {
+		KJUR.asn1.DERInteger.superclass.constructor.call(this);
+		this.hT = "02";
+
+		/**
+		 * set value by Tom Wu's BigInteger object
+		 * @name setByBigInteger
+		 * @memberOf KJUR.asn1.DERInteger#
+		 * @function
+		 * @param {BigInteger} bigIntegerValue to set
+		 */
+		this.setByBigInteger = function(bigIntegerValue) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue);
+		};
+
+		/**
+		 * set value by integer value
+		 * @name setByInteger
+		 * @memberOf KJUR.asn1.DERInteger
+		 * @function
+		 * @param {Integer} integer value to set
+		 */
+		this.setByInteger = function(intValue) {
+			var bi = new BigInteger(String(intValue), 10);
+			this.setByBigInteger(bi);
+		};
+
+		/**
+		 * set value by integer value
+		 * @name setValueHex
+		 * @memberOf KJUR.asn1.DERInteger#
+		 * @function
+		 * @param {String} hexadecimal string of integer value
+		 * @description
+		 * <br/>
+		 * NOTE: Value shall be represented by minimum octet length of
+		 * two's complement representation.
+		 * @example
+		 * new KJUR.asn1.DERInteger(123);
+		 * new KJUR.asn1.DERInteger({'int': 123});
+		 * new KJUR.asn1.DERInteger({'hex': '1fad'});
+		 */
+		this.setValueHex = function(newHexString) {
+			this.hV = newHexString;
+		};
+
+		this.getFreshValueHex = function() {
+			return this.hV;
+		};
+
+		if (typeof params != "undefined") {
+			if (typeof params['bigint'] != "undefined") {
+				this.setByBigInteger(params['bigint']);
+			} else if (typeof params['int'] != "undefined") {
+				this.setByInteger(params['int']);
+			} else if (typeof params == "number") {
+				this.setByInteger(params);
+			} else if (typeof params['hex'] != "undefined") {
+				this.setValueHex(params['hex']);
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER encoded BitString primitive
+	 * @name KJUR.asn1.DERBitString
+	 * @class class for ASN.1 DER encoded BitString primitive
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>bin - specify binary string (ex. '10111')</li>
+	 * <li>array - specify array of boolean (ex. [true,false,true,true])</li>
+	 * <li>hex - specify hexadecimal string of ASN.1 value(V) including unused bits</li>
+	 * <li>obj - specify {@link KJUR.asn1.ASN1Util.newObject}
+	 * argument for "BitString encapsulates" structure.</li>
+	 * </ul>
+	 * NOTE1: 'params' can be omitted.<br/>
+	 * NOTE2: 'obj' parameter have been supported since
+	 * asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).<br/>
+	 * @example
+	 * // default constructor
+	 * o = new KJUR.asn1.DERBitString();
+	 * // initialize with binary string
+	 * o = new KJUR.asn1.DERBitString({bin: "1011"});
+	 * // initialize with boolean array
+	 * o = new KJUR.asn1.DERBitString({array: [true,false,true,true]});
+	 * // initialize with hexadecimal string (04 is unused bits)
+	 * o = new KJUR.asn1.DEROctetString({hex: "04bac0"});
+	 * // initialize with ASN1Util.newObject argument for encapsulated
+	 * o = new KJUR.asn1.DERBitString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}});
+	 * // above generates a ASN.1 data like this:
+	 * // BIT STRING, encapsulates {
+	 * //   SEQUENCE {
+	 * //     INTEGER 3
+	 * //     PrintableString 'aaa'
+	 * //     }
+	 * //   }
+	 */
+	KJUR.asn1.DERBitString = function(params) {
+		if (params !== undefined && typeof params.obj !== "undefined") {
+			var o = KJUR.asn1.ASN1Util.newObject(params.obj);
+			params.hex = "00" + o.getEncodedHex();
+		}
+		KJUR.asn1.DERBitString.superclass.constructor.call(this);
+		this.hT = "03";
+
+		/**
+		 * set ASN.1 value(V) by a hexadecimal string including unused bits
+		 * @name setHexValueIncludingUnusedBits
+		 * @memberOf KJUR.asn1.DERBitString#
+		 * @function
+		 * @param {String} newHexStringIncludingUnusedBits
+		 */
+		this.setHexValueIncludingUnusedBits = function(newHexStringIncludingUnusedBits) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.hV = newHexStringIncludingUnusedBits;
+		};
+
+		/**
+		 * set ASN.1 value(V) by unused bit and hexadecimal string of value
+		 * @name setUnusedBitsAndHexValue
+		 * @memberOf KJUR.asn1.DERBitString#
+		 * @function
+		 * @param {Integer} unusedBits
+		 * @param {String} hValue
+		 */
+		this.setUnusedBitsAndHexValue = function(unusedBits, hValue) {
+			if (unusedBits < 0 || 7 < unusedBits) {
+				throw "unused bits shall be from 0 to 7: u = " + unusedBits;
+			}
+			var hUnusedBits = "0" + unusedBits;
+			this.hTLV = null;
+			this.isModified = true;
+			this.hV = hUnusedBits + hValue;
+		};
+
+		/**
+		 * set ASN.1 DER BitString by binary string<br/>
+		 * @name setByBinaryString
+		 * @memberOf KJUR.asn1.DERBitString#
+		 * @function
+		 * @param {String} binaryString binary value string (i.e. '10111')
+		 * @description
+		 * Its unused bits will be calculated automatically by length of
+		 * 'binaryValue'. <br/>
+		 * NOTE: Trailing zeros '0' will be ignored.
+		 * @example
+		 * o = new KJUR.asn1.DERBitString();
+		 * o.setByBooleanArray("01011");
+		 */
+		this.setByBinaryString = function(binaryString) {
+			binaryString = binaryString.replace(/0+$/, '');
+			var unusedBits = 8 - binaryString.length % 8;
+			if (unusedBits == 8) unusedBits = 0;
+			for (var i = 0; i <= unusedBits; i++) {
+				binaryString += '0';
+			}
+			var h = '';
+			for (var i = 0; i < binaryString.length - 1; i += 8) {
+				var b = binaryString.substr(i, 8);
+				var x = parseInt(b, 2).toString(16);
+				if (x.length == 1) x = '0' + x;
+				h += x;
+			}
+			this.hTLV = null;
+			this.isModified = true;
+			this.hV = '0' + unusedBits + h;
+		};
+
+		/**
+		 * set ASN.1 TLV value(V) by an array of boolean<br/>
+		 * @name setByBooleanArray
+		 * @memberOf KJUR.asn1.DERBitString#
+		 * @function
+		 * @param {array} booleanArray array of boolean (ex. [true, false, true])
+		 * @description
+		 * NOTE: Trailing falses will be ignored in the ASN.1 DER Object.
+		 * @example
+		 * o = new KJUR.asn1.DERBitString();
+		 * o.setByBooleanArray([false, true, false, true, true]);
+		 */
+		this.setByBooleanArray = function(booleanArray) {
+			var s = '';
+			for (var i = 0; i < booleanArray.length; i++) {
+				if (booleanArray[i] == true) {
+					s += '1';
+				} else {
+					s += '0';
+				}
+			}
+			this.setByBinaryString(s);
+		};
+
+		/**
+		 * generate an array of falses with specified length<br/>
+		 * @name newFalseArray
+		 * @memberOf KJUR.asn1.DERBitString
+		 * @function
+		 * @param {Integer} nLength length of array to generate
+		 * @return {array} array of boolean falses
+		 * @description
+		 * This static method may be useful to initialize boolean array.
+		 * @example
+		 * o = new KJUR.asn1.DERBitString();
+		 * o.newFalseArray(3) &rarr; [false, false, false]
+		 */
+		this.newFalseArray = function(nLength) {
+			var a = new Array(nLength);
+			for (var i = 0; i < nLength; i++) {
+				a[i] = false;
+			}
+			return a;
+		};
+
+		this.getFreshValueHex = function() {
+			return this.hV;
+		};
+
+		if (typeof params != "undefined") {
+			if (typeof params == "string" && params.toLowerCase().match(/^[0-9a-f]+$/)) {
+				this.setHexValueIncludingUnusedBits(params);
+			} else if (typeof params['hex'] != "undefined") {
+				this.setHexValueIncludingUnusedBits(params['hex']);
+			} else if (typeof params['bin'] != "undefined") {
+				this.setByBinaryString(params['bin']);
+			} else if (typeof params['array'] != "undefined") {
+				this.setByBooleanArray(params['array']);
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER OctetString<br/>
+	 * @name KJUR.asn1.DEROctetString
+	 * @class class for ASN.1 DER OctetString
+	 * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+	 * @extends KJUR.asn1.DERAbstractString
+	 * @description
+	 * This class provides ASN.1 OctetString simple type.<br/>
+	 * Supported "params" attributes are:
+	 * <ul>
+	 * <li>str - to set a string as a value</li>
+	 * <li>hex - to set a hexadecimal string as a value</li>
+	 * <li>obj - to set a encapsulated ASN.1 value by JSON object
+	 * which is defined in {@link KJUR.asn1.ASN1Util.newObject}</li>
+	 * </ul>
+	 * NOTE: A parameter 'obj' have been supported
+	 * for "OCTET STRING, encapsulates" structure.
+	 * since asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).
+	 * @see KJUR.asn1.DERAbstractString - superclass
+	 * @example
+	 * // default constructor
+	 * o = new KJUR.asn1.DEROctetString();
+	 * // initialize with string
+	 * o = new KJUR.asn1.DEROctetString({str: "aaa"});
+	 * // initialize with hexadecimal string
+	 * o = new KJUR.asn1.DEROctetString({hex: "616161"});
+	 * // initialize with ASN1Util.newObject argument
+	 * o = new KJUR.asn1.DEROctetString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}});
+	 * // above generates a ASN.1 data like this:
+	 * // OCTET STRING, encapsulates {
+	 * //   SEQUENCE {
+	 * //     INTEGER 3
+	 * //     PrintableString 'aaa'
+	 * //     }
+	 * //   }
+	 */
+	KJUR.asn1.DEROctetString = function(params) {
+		if (params !== undefined && typeof params.obj !== "undefined") {
+			var o = KJUR.asn1.ASN1Util.newObject(params.obj);
+			params.hex = o.getEncodedHex();
+		}
+		KJUR.asn1.DEROctetString.superclass.constructor.call(this, params);
+		this.hT = "04";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER Null
+	 * @name KJUR.asn1.DERNull
+	 * @class class for ASN.1 DER Null
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * @see KJUR.asn1.ASN1Object - superclass
+	 */
+	KJUR.asn1.DERNull = function() {
+		KJUR.asn1.DERNull.superclass.constructor.call(this);
+		this.hT = "05";
+		this.hTLV = "0500";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER ObjectIdentifier
+	 * @name KJUR.asn1.DERObjectIdentifier
+	 * @class class for ASN.1 DER ObjectIdentifier
+	 * @param {Array} params associative array of parameters (ex. {'oid': '2.5.4.5'})
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>oid - specify initial ASN.1 value(V) by a oid string (ex. 2.5.4.13)</li>
+	 * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+	 * </ul>
+	 * NOTE: 'params' can be omitted.
+	 */
+	KJUR.asn1.DERObjectIdentifier = function(params) {
+		var itox = function(i) {
+			var h = i.toString(16);
+			if (h.length == 1) h = '0' + h;
+			return h;
+		};
+		var roidtox = function(roid) {
+			var h = '';
+			var bi = new BigInteger(roid, 10);
+			var b = bi.toString(2);
+			var padLen = 7 - b.length % 7;
+			if (padLen == 7) padLen = 0;
+			var bPad = '';
+			for (var i = 0; i < padLen; i++) bPad += '0';
+			b = bPad + b;
+			for (var i = 0; i < b.length - 1; i += 7) {
+				var b8 = b.substr(i, 7);
+				if (i != b.length - 7) b8 = '1' + b8;
+				h += itox(parseInt(b8, 2));
+			}
+			return h;
+		};
+
+		KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);
+		this.hT = "06";
+
+		/**
+		 * set value by a hexadecimal string
+		 * @name setValueHex
+		 * @memberOf KJUR.asn1.DERObjectIdentifier#
+		 * @function
+		 * @param {String} newHexString hexadecimal value of OID bytes
+		 */
+		this.setValueHex = function(newHexString) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.s = null;
+			this.hV = newHexString;
+		};
+
+		/**
+		 * set value by a OID string<br/>
+		 * @name setValueOidString
+		 * @memberOf KJUR.asn1.DERObjectIdentifier#
+		 * @function
+		 * @param {String} oidString OID string (ex. 2.5.4.13)
+		 * @example
+		 * o = new KJUR.asn1.DERObjectIdentifier();
+		 * o.setValueOidString("2.5.4.13");
+		 */
+		this.setValueOidString = function(oidString) {
+			if (!oidString.match(/^[0-9.]+$/)) {
+				throw "malformed oid string: " + oidString;
+			}
+			var h = '';
+			var a = oidString.split('.');
+			var i0 = parseInt(a[0]) * 40 + parseInt(a[1]);
+			h += itox(i0);
+			a.splice(0, 2);
+			for (var i = 0; i < a.length; i++) {
+				h += roidtox(a[i]);
+			}
+			this.hTLV = null;
+			this.isModified = true;
+			this.s = null;
+			this.hV = h;
+		};
+
+		/**
+		 * set value by a OID name
+		 * @name setValueName
+		 * @memberOf KJUR.asn1.DERObjectIdentifier#
+		 * @function
+		 * @param {String} oidName OID name (ex. 'serverAuth')
+		 * @since 1.0.1
+		 * @description
+		 * OID name shall be defined in 'KJUR.asn1.x509.OID.name2oidList'.
+		 * Otherwise raise error.
+		 * @example
+		 * o = new KJUR.asn1.DERObjectIdentifier();
+		 * o.setValueName("serverAuth");
+		 */
+		this.setValueName = function(oidName) {
+			var oid = KJUR.asn1.x509.OID.name2oid(oidName);
+			if (oid !== '') {
+				this.setValueOidString(oid);
+			} else {
+				throw "DERObjectIdentifier oidName undefined: " + oidName;
+			}
+		};
+
+		this.getFreshValueHex = function() {
+			return this.hV;
+		};
+
+		if (params !== undefined) {
+			if (typeof params === "string") {
+				if (params.match(/^[0-2].[0-9.]+$/)) {
+					this.setValueOidString(params);
+				} else {
+					this.setValueName(params);
+				}
+			} else if (params.oid !== undefined) {
+				this.setValueOidString(params.oid);
+			} else if (params.hex !== undefined) {
+				this.setValueHex(params.hex);
+			} else if (params.name !== undefined) {
+				this.setValueName(params.name);
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER Enumerated
+	 * @name KJUR.asn1.DEREnumerated
+	 * @class class for ASN.1 DER Enumerated
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>int - specify initial ASN.1 value(V) by integer value</li>
+	 * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+	 * </ul>
+	 * NOTE: 'params' can be omitted.
+	 * @example
+	 * new KJUR.asn1.DEREnumerated(123);
+	 * new KJUR.asn1.DEREnumerated({int: 123});
+	 * new KJUR.asn1.DEREnumerated({hex: '1fad'});
+	 */
+	KJUR.asn1.DEREnumerated = function(params) {
+		KJUR.asn1.DEREnumerated.superclass.constructor.call(this);
+		this.hT = "0a";
+
+		/**
+		 * set value by Tom Wu's BigInteger object
+		 * @name setByBigInteger
+		 * @memberOf KJUR.asn1.DEREnumerated#
+		 * @function
+		 * @param {BigInteger} bigIntegerValue to set
+		 */
+		this.setByBigInteger = function(bigIntegerValue) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue);
+		};
+
+		/**
+		 * set value by integer value
+		 * @name setByInteger
+		 * @memberOf KJUR.asn1.DEREnumerated#
+		 * @function
+		 * @param {Integer} integer value to set
+		 */
+		this.setByInteger = function(intValue) {
+			var bi = new BigInteger(String(intValue), 10);
+			this.setByBigInteger(bi);
+		};
+
+		/**
+		 * set value by integer value
+		 * @name setValueHex
+		 * @memberOf KJUR.asn1.DEREnumerated#
+		 * @function
+		 * @param {String} hexadecimal string of integer value
+		 * @description
+		 * <br/>
+		 * NOTE: Value shall be represented by minimum octet length of
+		 * two's complement representation.
+		 */
+		this.setValueHex = function(newHexString) {
+			this.hV = newHexString;
+		};
+
+		this.getFreshValueHex = function() {
+			return this.hV;
+		};
+
+		if (typeof params != "undefined") {
+			if (typeof params['int'] != "undefined") {
+				this.setByInteger(params['int']);
+			} else if (typeof params == "number") {
+				this.setByInteger(params);
+			} else if (typeof params['hex'] != "undefined") {
+				this.setValueHex(params['hex']);
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER UTF8String
+	 * @name KJUR.asn1.DERUTF8String
+	 * @class class for ASN.1 DER UTF8String
+	 * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+	 * @extends KJUR.asn1.DERAbstractString
+	 * @description
+	 * @see KJUR.asn1.DERAbstractString - superclass
+	 */
+	KJUR.asn1.DERUTF8String = function(params) {
+		KJUR.asn1.DERUTF8String.superclass.constructor.call(this, params);
+		this.hT = "0c";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER NumericString
+	 * @name KJUR.asn1.DERNumericString
+	 * @class class for ASN.1 DER NumericString
+	 * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+	 * @extends KJUR.asn1.DERAbstractString
+	 * @description
+	 * @see KJUR.asn1.DERAbstractString - superclass
+	 */
+	KJUR.asn1.DERNumericString = function(params) {
+		KJUR.asn1.DERNumericString.superclass.constructor.call(this, params);
+		this.hT = "12";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER PrintableString
+	 * @name KJUR.asn1.DERPrintableString
+	 * @class class for ASN.1 DER PrintableString
+	 * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+	 * @extends KJUR.asn1.DERAbstractString
+	 * @description
+	 * @see KJUR.asn1.DERAbstractString - superclass
+	 */
+	KJUR.asn1.DERPrintableString = function(params) {
+		KJUR.asn1.DERPrintableString.superclass.constructor.call(this, params);
+		this.hT = "13";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER TeletexString
+	 * @name KJUR.asn1.DERTeletexString
+	 * @class class for ASN.1 DER TeletexString
+	 * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+	 * @extends KJUR.asn1.DERAbstractString
+	 * @description
+	 * @see KJUR.asn1.DERAbstractString - superclass
+	 */
+	KJUR.asn1.DERTeletexString = function(params) {
+		KJUR.asn1.DERTeletexString.superclass.constructor.call(this, params);
+		this.hT = "14";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER IA5String
+	 * @name KJUR.asn1.DERIA5String
+	 * @class class for ASN.1 DER IA5String
+	 * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+	 * @extends KJUR.asn1.DERAbstractString
+	 * @description
+	 * @see KJUR.asn1.DERAbstractString - superclass
+	 */
+	KJUR.asn1.DERIA5String = function(params) {
+		KJUR.asn1.DERIA5String.superclass.constructor.call(this, params);
+		this.hT = "16";
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER UTCTime
+	 * @name KJUR.asn1.DERUTCTime
+	 * @class class for ASN.1 DER UTCTime
+	 * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'})
+	 * @extends KJUR.asn1.DERAbstractTime
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>str - specify initial ASN.1 value(V) by a string (ex.'130430235959Z')</li>
+	 * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+	 * <li>date - specify Date object.</li>
+	 * </ul>
+	 * NOTE: 'params' can be omitted.
+	 * <h4>EXAMPLES</h4>
+	 * @example
+	 * d1 = new KJUR.asn1.DERUTCTime();
+	 * d1.setString('130430125959Z');
+	 *
+	 * d2 = new KJUR.asn1.DERUTCTime({'str': '130430125959Z'});
+	 * d3 = new KJUR.asn1.DERUTCTime({'date': new Date(Date.UTC(2015, 0, 31, 0, 0, 0, 0))});
+	 * d4 = new KJUR.asn1.DERUTCTime('130430125959Z');
+	 */
+	KJUR.asn1.DERUTCTime = function(params) {
+		KJUR.asn1.DERUTCTime.superclass.constructor.call(this, params);
+		this.hT = "17";
+
+		/**
+		 * set value by a Date object<br/>
+		 * @name setByDate
+		 * @memberOf KJUR.asn1.DERUTCTime#
+		 * @function
+		 * @param {Date} dateObject Date object to set ASN.1 value(V)
+		 * @example
+		 * o = new KJUR.asn1.DERUTCTime();
+		 * o.setByDate(new Date("2016/12/31"));
+		 */
+		this.setByDate = function(dateObject) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.date = dateObject;
+			this.s = this.formatDate(this.date, 'utc');
+			this.hV = stohex(this.s);
+		};
+
+		this.getFreshValueHex = function() {
+			if (typeof this.date == "undefined" && typeof this.s == "undefined") {
+				this.date = new Date();
+				this.s = this.formatDate(this.date, 'utc');
+				this.hV = stohex(this.s);
+			}
+			return this.hV;
+		};
+
+		if (params !== undefined) {
+			if (params.str !== undefined) {
+				this.setString(params.str);
+			} else if (typeof params == "string" && params.match(/^[0-9]{12}Z$/)) {
+				this.setString(params);
+			} else if (params.hex !== undefined) {
+				this.setStringHex(params.hex);
+			} else if (params.date !== undefined) {
+				this.setByDate(params.date);
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER GeneralizedTime
+	 * @name KJUR.asn1.DERGeneralizedTime
+	 * @class class for ASN.1 DER GeneralizedTime
+	 * @param {Array} params associative array of parameters (ex. {'str': '20130430235959Z'})
+	 * @property {Boolean} withMillis flag to show milliseconds or not
+	 * @extends KJUR.asn1.DERAbstractTime
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>str - specify initial ASN.1 value(V) by a string (ex.'20130430235959Z')</li>
+	 * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+	 * <li>date - specify Date object.</li>
+	 * <li>millis - specify flag to show milliseconds (from 1.0.6)</li>
+	 * </ul>
+	 * NOTE1: 'params' can be omitted.
+	 * NOTE2: 'withMillis' property is supported from asn1 1.0.6.
+	 */
+	KJUR.asn1.DERGeneralizedTime = function(params) {
+		KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, params);
+		this.hT = "18";
+		this.withMillis = false;
+
+		/**
+		 * set value by a Date object
+		 * @name setByDate
+		 * @memberOf KJUR.asn1.DERGeneralizedTime#
+		 * @function
+		 * @param {Date} dateObject Date object to set ASN.1 value(V)
+		 * @example
+		 * When you specify UTC time, use 'Date.UTC' method like this:<br/>
+		 * o1 = new DERUTCTime();
+		 * o1.setByDate(date);
+		 *
+		 * date = new Date(Date.UTC(2015, 0, 31, 23, 59, 59, 0)); #2015JAN31 23:59:59
+		 */
+		this.setByDate = function(dateObject) {
+			this.hTLV = null;
+			this.isModified = true;
+			this.date = dateObject;
+			this.s = this.formatDate(this.date, 'gen', this.withMillis);
+			this.hV = stohex(this.s);
+		};
+
+		this.getFreshValueHex = function() {
+			if (this.date === undefined && this.s === undefined) {
+				this.date = new Date();
+				this.s = this.formatDate(this.date, 'gen', this.withMillis);
+				this.hV = stohex(this.s);
+			}
+			return this.hV;
+		};
+
+		if (params !== undefined) {
+			if (params.str !== undefined) {
+				this.setString(params.str);
+			} else if (typeof params == "string" && params.match(/^[0-9]{14}Z$/)) {
+				this.setString(params);
+			} else if (params.hex !== undefined) {
+				this.setStringHex(params.hex);
+			} else if (params.date !== undefined) {
+				this.setByDate(params.date);
+			}
+			if (params.millis === true) {
+				this.withMillis = true;
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER Sequence
+	 * @name KJUR.asn1.DERSequence
+	 * @class class for ASN.1 DER Sequence
+	 * @extends KJUR.asn1.DERAbstractStructured
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>array - specify array of ASN1Object to set elements of content</li>
+	 * </ul>
+	 * NOTE: 'params' can be omitted.
+	 */
+	KJUR.asn1.DERSequence = function(params) {
+		KJUR.asn1.DERSequence.superclass.constructor.call(this, params);
+		this.hT = "30";
+		this.getFreshValueHex = function() {
+			var h = '';
+			for (var i = 0; i < this.asn1Array.length; i++) {
+				var asn1Obj = this.asn1Array[i];
+				h += asn1Obj.getEncodedHex();
+			}
+			this.hV = h;
+			return this.hV;
+		};
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER Set
+	 * @name KJUR.asn1.DERSet
+	 * @class class for ASN.1 DER Set
+	 * @extends KJUR.asn1.DERAbstractStructured
+	 * @description
+	 * <br/>
+	 * As for argument 'params' for constructor, you can specify one of
+	 * following properties:
+	 * <ul>
+	 * <li>array - specify array of ASN1Object to set elements of content</li>
+	 * <li>sortflag - flag for sort (default: true). ASN.1 BER is not sorted in 'SET OF'.</li>
+	 * </ul>
+	 * NOTE1: 'params' can be omitted.<br/>
+	 * NOTE2: sortflag is supported since 1.0.5.
+	 */
+	KJUR.asn1.DERSet = function(params) {
+		KJUR.asn1.DERSet.superclass.constructor.call(this, params);
+		this.hT = "31";
+		this.sortFlag = true; // item shall be sorted only in ASN.1 DER
+		this.getFreshValueHex = function() {
+			var a = new Array();
+			for (var i = 0; i < this.asn1Array.length; i++) {
+				var asn1Obj = this.asn1Array[i];
+				a.push(asn1Obj.getEncodedHex());
+			}
+			if (this.sortFlag == true) a.sort();
+			this.hV = a.join('');
+			return this.hV;
+		};
+
+		if (typeof params != "undefined") {
+			if (typeof params.sortflag != "undefined" &&
+				params.sortflag == false)
+				this.sortFlag = false;
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured);
+
+	// ********************************************************************
+	/**
+	 * class for ASN.1 DER TaggedObject
+	 * @name KJUR.asn1.DERTaggedObject
+	 * @class class for ASN.1 DER TaggedObject
+	 * @extends KJUR.asn1.ASN1Object
+	 * @description
+	 * <br/>
+	 * Parameter 'tagNoNex' is ASN.1 tag(T) value for this object.
+	 * For example, if you find '[1]' tag in a ASN.1 dump,
+	 * 'tagNoHex' will be 'a1'.
+	 * <br/>
+	 * As for optional argument 'params' for constructor, you can specify *ANY* of
+	 * following properties:
+	 * <ul>
+	 * <li>explicit - specify true if this is explicit tag otherwise false
+	 *     (default is 'true').</li>
+	 * <li>tag - specify tag (default is 'a0' which means [0])</li>
+	 * <li>obj - specify ASN1Object which is tagged</li>
+	 * </ul>
+	 * @example
+	 * d1 = new KJUR.asn1.DERUTF8String({'str':'a'});
+	 * d2 = new KJUR.asn1.DERTaggedObject({'obj': d1});
+	 * hex = d2.getEncodedHex();
+	 */
+	KJUR.asn1.DERTaggedObject = function(params) {
+		KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);
+		this.hT = "a0";
+		this.hV = '';
+		this.isExplicit = true;
+		this.asn1Object = null;
+
+		/**
+		 * set value by an ASN1Object
+		 * @name setString
+		 * @memberOf KJUR.asn1.DERTaggedObject#
+		 * @function
+		 * @param {Boolean} isExplicitFlag flag for explicit/implicit tag
+		 * @param {Integer} tagNoHex hexadecimal string of ASN.1 tag
+		 * @param {ASN1Object} asn1Object ASN.1 to encapsulate
+		 */
+		this.setASN1Object = function(isExplicitFlag, tagNoHex, asn1Object) {
+			this.hT = tagNoHex;
+			this.isExplicit = isExplicitFlag;
+			this.asn1Object = asn1Object;
+			if (this.isExplicit) {
+				this.hV = this.asn1Object.getEncodedHex();
+				this.hTLV = null;
+				this.isModified = true;
+			} else {
+				this.hV = null;
+				this.hTLV = asn1Object.getEncodedHex();
+				this.hTLV = this.hTLV.replace(/^../, tagNoHex);
+				this.isModified = false;
+			}
+		};
+
+		this.getFreshValueHex = function() {
+			return this.hV;
+		};
+
+		if (typeof params != "undefined") {
+			if (typeof params['tag'] != "undefined") {
+				this.hT = params['tag'];
+			}
+			if (typeof params['explicit'] != "undefined") {
+				this.isExplicit = params['explicit'];
+			}
+			if (typeof params['obj'] != "undefined") {
+				this.asn1Object = params['obj'];
+				this.setASN1Object(this.isExplicit, this.hT, this.asn1Object);
+			}
+		}
+	};
+	YAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object);
+
+	/**
+	 * Create a new JSEncryptRSAKey that extends Tom Wu's RSA key object.
+	 * This object is just a decorator for parsing the key parameter
+	 * @param {string|Object} key - The key in string format, or an object containing
+	 * the parameters needed to build a RSAKey object.
+	 * @constructor
+	 */
+	var JSEncryptRSAKey = /** @class */ (function(_super) {
+		__extends(JSEncryptRSAKey, _super);
+
+		function JSEncryptRSAKey(key) {
+			var _this = _super.call(this) || this;
+			// Call the super constructor.
+			//  RSAKey.call(this);
+			// If a key key was provided.
+			if (key) {
+				// If this is a string...
+				if (typeof key === "string") {
+					_this.parseKey(key);
+				} else if (JSEncryptRSAKey.hasPrivateKeyProperty(key) ||
+					JSEncryptRSAKey.hasPublicKeyProperty(key)) {
+					// Set the values for the key.
+					_this.parsePropertiesFrom(key);
+				}
+			}
+			return _this;
+		}
+		/**
+		 * Method to parse a pem encoded string containing both a public or private key.
+		 * The method will translate the pem encoded string in a der encoded string and
+		 * will parse private key and public key parameters. This method accepts public key
+		 * in the rsaencryption pkcs #1 format (oid: 1.2.840.113549.1.1.1).
+		 *
+		 * @todo Check how many rsa formats use the same format of pkcs #1.
+		 *
+		 * The format is defined as:
+		 * PublicKeyInfo ::= SEQUENCE {
+		 *   algorithm       AlgorithmIdentifier,
+		 *   PublicKey       BIT STRING
+		 * }
+		 * Where AlgorithmIdentifier is:
+		 * AlgorithmIdentifier ::= SEQUENCE {
+		 *   algorithm       OBJECT IDENTIFIER,     the OID of the enc algorithm
+		 *   parameters      ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1)
+		 * }
+		 * and PublicKey is a SEQUENCE encapsulated in a BIT STRING
+		 * RSAPublicKey ::= SEQUENCE {
+		 *   modulus           INTEGER,  -- n
+		 *   publicExponent    INTEGER   -- e
+		 * }
+		 * it's possible to examine the structure of the keys obtained from openssl using
+		 * an asn.1 dumper as the one used here to parse the components: http://lapo.it/asn1js/
+		 * @argument {string} pem the pem encoded string, can include the BEGIN/END header/footer
+		 * @private
+		 */
+		JSEncryptRSAKey.prototype.parseKey = function(pem) {
+			try {
+				var modulus = 0;
+				var public_exponent = 0;
+				var reHex = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/;
+				var der = reHex.test(pem) ? Hex.decode(pem) : Base64.unarmor(pem);
+				var asn1 = ASN1.decode(der);
+				// Fixes a bug with OpenSSL 1.0+ private keys
+				if (asn1.sub.length === 3) {
+					asn1 = asn1.sub[2].sub[0];
+				}
+				if (asn1.sub.length === 9) {
+					// Parse the private key.
+					modulus = asn1.sub[1].getHexStringValue(); // bigint
+					this.n = parseBigInt(modulus, 16);
+					public_exponent = asn1.sub[2].getHexStringValue(); // int
+					this.e = parseInt(public_exponent, 16);
+					var private_exponent = asn1.sub[3].getHexStringValue(); // bigint
+					this.d = parseBigInt(private_exponent, 16);
+					var prime1 = asn1.sub[4].getHexStringValue(); // bigint
+					this.p = parseBigInt(prime1, 16);
+					var prime2 = asn1.sub[5].getHexStringValue(); // bigint
+					this.q = parseBigInt(prime2, 16);
+					var exponent1 = asn1.sub[6].getHexStringValue(); // bigint
+					this.dmp1 = parseBigInt(exponent1, 16);
+					var exponent2 = asn1.sub[7].getHexStringValue(); // bigint
+					this.dmq1 = parseBigInt(exponent2, 16);
+					var coefficient = asn1.sub[8].getHexStringValue(); // bigint
+					this.coeff = parseBigInt(coefficient, 16);
+				} else if (asn1.sub.length === 2) {
+					// Parse the public key.
+					var bit_string = asn1.sub[1];
+					var sequence = bit_string.sub[0];
+					modulus = sequence.sub[0].getHexStringValue();
+					this.n = parseBigInt(modulus, 16);
+					public_exponent = sequence.sub[1].getHexStringValue();
+					this.e = parseInt(public_exponent, 16);
+				} else {
+					return false;
+				}
+				return true;
+			} catch (ex) {
+				return false;
+			}
+		};
+		/**
+		 * Translate rsa parameters in a hex encoded string representing the rsa key.
+		 *
+		 * The translation follow the ASN.1 notation :
+		 * RSAPrivateKey ::= SEQUENCE {
+		 *   version           Version,
+		 *   modulus           INTEGER,  -- n
+		 *   publicExponent    INTEGER,  -- e
+		 *   privateExponent   INTEGER,  -- d
+		 *   prime1            INTEGER,  -- p
+		 *   prime2            INTEGER,  -- q
+		 *   exponent1         INTEGER,  -- d mod (p1)
+		 *   exponent2         INTEGER,  -- d mod (q-1)
+		 *   coefficient       INTEGER,  -- (inverse of q) mod p
+		 * }
+		 * @returns {string}  DER Encoded String representing the rsa private key
+		 * @private
+		 */
+		JSEncryptRSAKey.prototype.getPrivateBaseKey = function() {
+			var options = {
+				array: [
+					new KJUR.asn1.DERInteger({
+						int: 0
+					}),
+					new KJUR.asn1.DERInteger({
+						bigint: this.n
+					}),
+					new KJUR.asn1.DERInteger({
+						int: this.e
+					}),
+					new KJUR.asn1.DERInteger({
+						bigint: this.d
+					}),
+					new KJUR.asn1.DERInteger({
+						bigint: this.p
+					}),
+					new KJUR.asn1.DERInteger({
+						bigint: this.q
+					}),
+					new KJUR.asn1.DERInteger({
+						bigint: this.dmp1
+					}),
+					new KJUR.asn1.DERInteger({
+						bigint: this.dmq1
+					}),
+					new KJUR.asn1.DERInteger({
+						bigint: this.coeff
+					})
+				]
+			};
+			var seq = new KJUR.asn1.DERSequence(options);
+			return seq.getEncodedHex();
+		};
+		/**
+		 * base64 (pem) encoded version of the DER encoded representation
+		 * @returns {string} pem encoded representation without header and footer
+		 * @public
+		 */
+		JSEncryptRSAKey.prototype.getPrivateBaseKeyB64 = function() {
+			return hex2b64(this.getPrivateBaseKey());
+		};
+		/**
+		 * Translate rsa parameters in a hex encoded string representing the rsa public key.
+		 * The representation follow the ASN.1 notation :
+		 * PublicKeyInfo ::= SEQUENCE {
+		 *   algorithm       AlgorithmIdentifier,
+		 *   PublicKey       BIT STRING
+		 * }
+		 * Where AlgorithmIdentifier is:
+		 * AlgorithmIdentifier ::= SEQUENCE {
+		 *   algorithm       OBJECT IDENTIFIER,     the OID of the enc algorithm
+		 *   parameters      ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1)
+		 * }
+		 * and PublicKey is a SEQUENCE encapsulated in a BIT STRING
+		 * RSAPublicKey ::= SEQUENCE {
+		 *   modulus           INTEGER,  -- n
+		 *   publicExponent    INTEGER   -- e
+		 * }
+		 * @returns {string} DER Encoded String representing the rsa public key
+		 * @private
+		 */
+		JSEncryptRSAKey.prototype.getPublicBaseKey = function() {
+			var first_sequence = new KJUR.asn1.DERSequence({
+				array: [
+					new KJUR.asn1.DERObjectIdentifier({
+						oid: "1.2.840.113549.1.1.1"
+					}),
+					new KJUR.asn1.DERNull()
+				]
+			});
+			var second_sequence = new KJUR.asn1.DERSequence({
+				array: [
+					new KJUR.asn1.DERInteger({
+						bigint: this.n
+					}),
+					new KJUR.asn1.DERInteger({
+						int: this.e
+					})
+				]
+			});
+			var bit_string = new KJUR.asn1.DERBitString({
+				hex: "00" + second_sequence.getEncodedHex()
+			});
+			var seq = new KJUR.asn1.DERSequence({
+				array: [
+					first_sequence,
+					bit_string
+				]
+			});
+			return seq.getEncodedHex();
+		};
+		/**
+		 * base64 (pem) encoded version of the DER encoded representation
+		 * @returns {string} pem encoded representation without header and footer
+		 * @public
+		 */
+		JSEncryptRSAKey.prototype.getPublicBaseKeyB64 = function() {
+			return hex2b64(this.getPublicBaseKey());
+		};
+		/**
+		 * wrap the string in block of width chars. The default value for rsa keys is 64
+		 * characters.
+		 * @param {string} str the pem encoded string without header and footer
+		 * @param {Number} [width=64] - the length the string has to be wrapped at
+		 * @returns {string}
+		 * @private
+		 */
+		JSEncryptRSAKey.wordwrap = function(str, width) {
+			width = width || 64;
+			if (!str) {
+				return str;
+			}
+			var regex = "(.{1," + width + "})( +|$\n?)|(.{1," + width + "})";
+			return str.match(RegExp(regex, "g")).join("\n");
+		};
+		/**
+		 * Retrieve the pem encoded private key
+		 * @returns {string} the pem encoded private key with header/footer
+		 * @public
+		 */
+		JSEncryptRSAKey.prototype.getPrivateKey = function() {
+			var key = "-----BEGIN RSA PRIVATE KEY-----\n";
+			key += JSEncryptRSAKey.wordwrap(this.getPrivateBaseKeyB64()) + "\n";
+			key += "-----END RSA PRIVATE KEY-----";
+			return key;
+		};
+		/**
+		 * Retrieve the pem encoded public key
+		 * @returns {string} the pem encoded public key with header/footer
+		 * @public
+		 */
+		JSEncryptRSAKey.prototype.getPublicKey = function() {
+			var key = "-----BEGIN PUBLIC KEY-----\n";
+			key += JSEncryptRSAKey.wordwrap(this.getPublicBaseKeyB64()) + "\n";
+			key += "-----END PUBLIC KEY-----";
+			return key;
+		};
+		/**
+		 * Check if the object contains the necessary parameters to populate the rsa modulus
+		 * and public exponent parameters.
+		 * @param {Object} [obj={}] - An object that may contain the two public key
+		 * parameters
+		 * @returns {boolean} true if the object contains both the modulus and the public exponent
+		 * properties (n and e)
+		 * @todo check for types of n and e. N should be a parseable bigInt object, E should
+		 * be a parseable integer number
+		 * @private
+		 */
+		JSEncryptRSAKey.hasPublicKeyProperty = function(obj) {
+			obj = obj || {};
+			return (obj.hasOwnProperty("n") &&
+				obj.hasOwnProperty("e"));
+		};
+		/**
+		 * Check if the object contains ALL the parameters of an RSA key.
+		 * @param {Object} [obj={}] - An object that may contain nine rsa key
+		 * parameters
+		 * @returns {boolean} true if the object contains all the parameters needed
+		 * @todo check for types of the parameters all the parameters but the public exponent
+		 * should be parseable bigint objects, the public exponent should be a parseable integer number
+		 * @private
+		 */
+		JSEncryptRSAKey.hasPrivateKeyProperty = function(obj) {
+			obj = obj || {};
+			return (obj.hasOwnProperty("n") &&
+				obj.hasOwnProperty("e") &&
+				obj.hasOwnProperty("d") &&
+				obj.hasOwnProperty("p") &&
+				obj.hasOwnProperty("q") &&
+				obj.hasOwnProperty("dmp1") &&
+				obj.hasOwnProperty("dmq1") &&
+				obj.hasOwnProperty("coeff"));
+		};
+		/**
+		 * Parse the properties of obj in the current rsa object. Obj should AT LEAST
+		 * include the modulus and public exponent (n, e) parameters.
+		 * @param {Object} obj - the object containing rsa parameters
+		 * @private
+		 */
+		JSEncryptRSAKey.prototype.parsePropertiesFrom = function(obj) {
+			this.n = obj.n;
+			this.e = obj.e;
+			if (obj.hasOwnProperty("d")) {
+				this.d = obj.d;
+				this.p = obj.p;
+				this.q = obj.q;
+				this.dmp1 = obj.dmp1;
+				this.dmq1 = obj.dmq1;
+				this.coeff = obj.coeff;
+			}
+		};
+		return JSEncryptRSAKey;
+	}(RSAKey));
+
+	/**
+	 *
+	 * @param {Object} [options = {}] - An object to customize JSEncrypt behaviour
+	 * possible parameters are:
+	 * - default_key_size        {number}  default: 1024 the key size in bit
+	 * - default_public_exponent {string}  default: '010001' the hexadecimal representation of the public exponent
+	 * - log                     {boolean} default: false whether log warn/error or not
+	 * @constructor
+	 */
+	var JSEncrypt = /** @class */ (function() {
+		function JSEncrypt(options) {
+			options = options || {};
+			this.default_key_size = parseInt(options.default_key_size, 10) || 1024;
+			this.default_public_exponent = options.default_public_exponent ||
+			"010001"; // 65537 default openssl public exponent for rsa key type
+			this.log = options.log || false;
+			// The private and public key.
+			this.key = null;
+		}
+		/**
+		 * Method to set the rsa key parameter (one method is enough to set both the public
+		 * and the private key, since the private key contains the public key paramenters)
+		 * Log a warning if logs are enabled
+		 * @param {Object|string} key the pem encoded string or an object (with or without header/footer)
+		 * @public
+		 */
+		JSEncrypt.prototype.setKey = function(key) {
+			if (this.log && this.key) {
+				console.warn("A key was already set, overriding existing.");
+			}
+			this.key = new JSEncryptRSAKey(key);
+		};
+		/**
+		 * Proxy method for setKey, for api compatibility
+		 * @see setKey
+		 * @public
+		 */
+		JSEncrypt.prototype.setPrivateKey = function(privkey) {
+			// Create the key.
+			this.setKey(privkey);
+		};
+		/**
+		 * Proxy method for setKey, for api compatibility
+		 * @see setKey
+		 * @public
+		 */
+		JSEncrypt.prototype.setPublicKey = function(pubkey) {
+			// Sets the public key.
+			this.setKey(pubkey);
+		};
+		/**
+		 * Proxy method for RSAKey object's decrypt, decrypt the string using the private
+		 * components of the rsa key object. Note that if the object was not set will be created
+		 * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor
+		 * @param {string} str base64 encoded crypted string to decrypt
+		 * @return {string} the decrypted string
+		 * @public
+		 */
+		JSEncrypt.prototype.decrypt = function(str) {
+			// Return the decrypted string.
+			try {
+				return this.getKey().decrypt(b64tohex(str));
+			} catch (ex) {
+				return false;
+			}
+		};
+		/**
+		 * Proxy method for RSAKey object's encrypt, encrypt the string using the public
+		 * components of the rsa key object. Note that if the object was not set will be created
+		 * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor
+		 * @param {string} str the string to encrypt
+		 * @return {string} the encrypted string encoded in base64
+		 * @public
+		 */
+		JSEncrypt.prototype.encrypt = function(str) {
+			// Return the encrypted string.
+			try {
+				return hex2b64(this.getKey().encrypt(str));
+			} catch (ex) {
+				return false;
+			}
+		};
+		/**
+		 * Proxy method for RSAKey object's sign.
+		 * @param {string} str the string to sign
+		 * @param {function} digestMethod hash method
+		 * @param {string} digestName the name of the hash algorithm
+		 * @return {string} the signature encoded in base64
+		 * @public
+		 */
+		JSEncrypt.prototype.sign = function(str, digestMethod, digestName) {
+			// return the RSA signature of 'str' in 'hex' format.
+			try {
+				console.log(arguments)
+				return hex2b64(this.getKey().sign(str, digestMethod, digestName));
+			} catch (ex) {
+				console.log(ex)
+				return false;
+			}
+		};
+		/**
+		 * Proxy method for RSAKey object's verify.
+		 * @param {string} str the string to verify
+		 * @param {string} signature the signature encoded in base64 to compare the string to
+		 * @param {function} digestMethod hash method
+		 * @return {boolean} whether the data and signature match
+		 * @public
+		 */
+		JSEncrypt.prototype.verify = function(str, signature, digestMethod) {
+			// Return the decrypted 'digest' of the signature.
+			try {
+				return this.getKey().verify(str, b64tohex(signature), digestMethod);
+			} catch (ex) {
+				return false;
+			}
+		};
+		/**
+		 * Getter for the current JSEncryptRSAKey object. If it doesn't exists a new object
+		 * will be created and returned
+		 * @param {callback} [cb] the callback to be called if we want the key to be generated
+		 * in an async fashion
+		 * @returns {JSEncryptRSAKey} the JSEncryptRSAKey object
+		 * @public
+		 */
+		JSEncrypt.prototype.getKey = function(cb) {
+			// Only create new if it does not exist.
+			if (!this.key) {
+				// Get a new private key.
+				this.key = new JSEncryptRSAKey();
+				if (cb && {}.toString.call(cb) === "[object Function]") {
+					this.key.generateAsync(this.default_key_size, this.default_public_exponent,
+						cb);
+					return;
+				}
+				// Generate the key.
+				this.key.generate(this.default_key_size, this.default_public_exponent);
+			}
+			return this.key;
+		};
+		/**
+		 * Returns the pem encoded representation of the private key
+		 * If the key doesn't exists a new key will be created
+		 * @returns {string} pem encoded representation of the private key WITH header and footer
+		 * @public
+		 */
+		JSEncrypt.prototype.getPrivateKey = function() {
+			// Return the private representation of this key.
+			return this.getKey().getPrivateKey();
+		};
+		/**
+		 * Returns the pem encoded representation of the private key
+		 * If the key doesn't exists a new key will be created
+		 * @returns {string} pem encoded representation of the private key WITHOUT header and footer
+		 * @public
+		 */
+		JSEncrypt.prototype.getPrivateKeyB64 = function() {
+			// Return the private representation of this key.
+			return this.getKey().getPrivateBaseKeyB64();
+		};
+		/**
+		 * Returns the pem encoded representation of the public key
+		 * If the key doesn't exists a new key will be created
+		 * @returns {string} pem encoded representation of the public key WITH header and footer
+		 * @public
+		 */
+		JSEncrypt.prototype.getPublicKey = function() {
+			// Return the private representation of this key.
+			return this.getKey().getPublicKey();
+		};
+		/**
+		 * Returns the pem encoded representation of the public key
+		 * If the key doesn't exists a new key will be created
+		 * @returns {string} pem encoded representation of the public key WITHOUT header and footer
+		 * @public
+		 */
+		JSEncrypt.prototype.getPublicKeyB64 = function() {
+			// Return the private representation of this key.
+			return this.getKey().getPublicBaseKeyB64();
+		};
+		JSEncrypt.version = "3.0.0-rc.1";
+		return JSEncrypt;
+	}());
+
+	window2.JSEncrypt = JSEncrypt;
+
+	exports.JSEncrypt = JSEncrypt;
+	exports.default = JSEncrypt;
+
+	Object.defineProperty(exports, '__esModule', {
+		value: true
+	});
+
+})));

+ 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 = [
+  '一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十', '二十一', '二十二', '二十三', '二十四', '二十五', '二十六', '二十七', '二十八', '二十九', '三十', '三十一', '三十二', '三十三', '三十四', '三十五', '三十六', '三十七', '三十八', '三十九', '四十', '四十一', '四十二', '四十三', '四十四', '四十五', '四十六', '四十七', '四十八', '四十九', '五十'
+];

+ 6 - 0
src/assets/js/pubKey.js

@@ -0,0 +1,6 @@
+export default `-----BEGIN PUBLIC KEY-----
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaGv6DGhMxw/2s0kpixDaX4na9
++drO3pL+M6gE3s2xcxzQhWorBAthK1IDyRMhFTsoQK1Sd+wFLdvB5C8MFjMSy6Ys
+Pcp8lQ/LvVU7MBEeDQITjY6DVh7TwYTQR84yVyDQLACedpwr+cS5Dn9FLLy4ILWy
+eRRz5Ku0zj8Wkz9EMQIDAQAB
+-----END PUBLIC KEY-----`

+ 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;
+}

+ 276 - 0
src/assets/main.styl

@@ -0,0 +1,276 @@
+// 颜色
+blue = #247FEA;
+red = #eB1200;
+green = #02b000;
+border-color = #dcdfe6;
+theme-color = #333333;
+btn-color = #40B98F;
+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;
+    }
+}
+
+>>>.el-input-group__append, >>>.el-input-group__prepend {
+  padding: 0 6px !important;
+}

+ 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 
+        }
+}

+ 395 - 0
src/assets/public.styl

@@ -0,0 +1,395 @@
+@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;
+      }
+    }
+  }
+}
+
+.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 10px 0;
+    box-sizing: border-box;
+
+    // content 表格
+    .content {
+      flex: 1;
+      width: 100%;
+      font-size: 14px;
+      background: white;
+      box-sizing: border-box;
+      padding: 16px 20px;
+      border-radius: 3px;
+      flex-y(flex-start, flex-start);
+      box-sizing: border-box;
+
+      .table-btn-box {
+        width: 100%;
+        box-sizing: border-box;
+        flex-x(space-around);
+        padding: 0 16px;
+
+        .table-btn {
+          // width: 65px;
+          height: 24px;
+          line-height: 24px;
+          color: gray3;
+          font-size: 12px;
+          // margin-right: 8px;
+          background: transparent;
+          cursor: pointer;
+          color: #2E6BF4;
+          // cancel-btn();
+        }
+      }
+    }
+
+    .footer {
+      flex-shrink: 0;
+    }
+  }
+}
+
+// 按钮
+.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>

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

@@ -0,0 +1,139 @@
+<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">
+        <!-- <span>{{ title.firstTitile }} / </span> -->
+        {{ 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: 40px;
+    min-height: 40px;
+    width: 100%;
+    flex-x();
+    // background: #FAFAFA;
+    padding: 0 20px;
+    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: #FAFAFA;
+    color: #333;
+    font-size: 14px;
+
+    .title {
+      padding: 0 12px;
+      height: 54px;
+      line-height: 54px;
+      box-sizing: border-box;
+      // border-bottom: 2px solid btn-color;
+      span{
+        color: #999;
+      }
+    }
+  }
+}
+</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>

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

@@ -0,0 +1,292 @@
+<template>
+  <div class="text-edit">
+    <!-- <div id="myeditor"></div> -->
+    <Toolbar
+      style="border-bottom: 1px solid #ccc"
+      :editor="editor"
+      :defaultConfig="toolbarConfig"
+      :mode="mode"
+    />
+    <Editor
+      style="overflow-y: hidden;"
+      v-model="html"
+      :defaultConfig="editorConfig"
+      :mode="mode"
+      @onCreated="onCreated"
+      @onChange="onChange"
+    />
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import WangEditor from 'wangeditor';
+import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
+// import { IEditorConfig } from '@wangeditor/editor';
+const editorConfig = {                       // JS 语法
+  MENU_CONF: {}
+}
+export default {
+  name: 'wang-edit',
+  components: { Editor, Toolbar },
+  props: {
+    text: {
+      type: String
+    }
+  },
+  data() {
+    return {
+      editor: null,
+      isPaste: false,
+      info_: '', // 当前修改的文本
+      currentImg: '', // 当前粘贴图片
+      toolbarConfig: { },
+      editorConfig: { placeholder: '请输入内容...', MENU_CONF: {
+        uploadImage: {
+          customUpload: async (file, insertFn) => {
+            this.httpUploadImg({ prefix: 'other', file }).then(
+            (res) => {
+              insertFn(res);
+            });
+          }
+        },
+        uploadVideo: {
+          customUpload: async (file, insertFn) => {
+            this.httpUploadImg({ prefix: 'other', file }).then(
+            (res) => {
+              insertFn(res);
+            });
+          }
+        }
+      } },
+      mode: 'default',
+      html: '',
+    };
+  },
+  computed: {},
+  mounted() {
+    // this.createEditor();
+    // this.editor.txt.html(this.text);
+  },
+  methods: {
+    onCreated(editor) {
+      this.editor = Object.seal(editor) // 一定要用 Object.seal() ,否则会报错
+      this.initEditor();
+    },
+    onChange(editor){
+      // console.log(editor.getHtml());
+      this.$emit('change', editor.getHtml()); // 将内容同步到父组件中
+    },
+    initEditor(){
+      // this.editor.getMenuConfig('uploadImage');
+      // console.log(editorConfig.MENU_CONF);
+      // this.editorConfig.MENU_CONF['uploadImage'] = {
+      //   server: '/api/upload',
+      // }
+      // this.editorConfig.MENU_CONF['uploadImage'] = {
+      //     // 自定义插入图片
+      //     customInsert(res, insertFn) {  // TS 语法
+      //         // insertFn(url, alt, href)
+      //         that.isPaste = true;
+      //         that.upPic(files[0], (res) => {
+      //           insertFn(res);
+      //           that.isPaste = false;
+      //         });
+      //     },
+      //     async customUpload(file, insertFn) {                   // JS 语法
+      //         // file 即选中的文件
+      //         // 自己实现上传,并得到图片 url alt href
+      //         // 最后插入图片
+      //         that.isPaste = true;
+      //         that.upPic(files[0], (res) => {
+      //           insertFn(res);
+      //           that.isPaste = false;
+      //         });
+      //     },
+      //     customBrowseAndUpload(insertFn) {              // JS 语法
+      //         // 自己选择文件
+      //         that.isPaste = true;
+      //         that.upPic(files[0], (res) => {
+      //           insertFn(res);
+      //           that.isPaste = false;
+      //         });
+      //     }
+      // }
+    },
+    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.getHtml()) {
+        this.html = value;
+      }
+    }
+  }
+};
+</script>
+<style src="@wangeditor/editor/dist/css/style.css"></style>
+<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: 500px !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');
+    }
+}

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

@@ -0,0 +1,807 @@
+<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="80"
+              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="80"
+                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> 代理商库存警戒值</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-if="!item.pic">+</div>
+            <input type="file" class="file" :name="index" @change="changeImg" />
+            <div
+              v-if="item.pic"
+              style="position: relative;width: 40px;height: 40px;margin: auto;"
+            >
+              <el-image
+                class="mainImg"
+                :src="item.pic || ''"
+                :preview-src-list="[item.pic || '']"
+              >
+              </el-image>
+              <svg
+                class="closeIcon"
+                aria-hidden="true"
+                @click="deletePic(index)"
+              >
+                <use xlink:href="#icon-photo-close"></use>
+              </svg>
+            </div>
+          </td>
+          <td>
+            <el-input v-model="item.price" type="number" @blur="priceFmt" />
+          </td>
+          <td>
+            <el-input v-model="item.stock" type="number" />
+          </td>
+          <td>
+            <div v-if="!id">
+              <el-input
+                v-model="item.code"
+                type="text"
+                disabled
+                style="width: 150px;text-align: center;"
+              />
+              <span @click="setGoodsSkuCode(item)" style="margin-left: 10px;"
+                >自动生成</span
+              >
+            </div>
+            <div v-else>
+              <div v-if="edit">
+                <el-select
+                  placeholder="请选择"
+                  v-model="item.code"
+                  class="good-input"
+                  style="width: 185px"
+                  @change="changeCode"
+                >
+                  <el-option
+                    v-for="code in codeList"
+                    :key="code"
+                    :disabled="selectedObj[code]"
+                    :value="code"
+                    :label="code"
+                  ></el-option>
+                </el-select>
+                <span @click="setGoodsSkuCode(item)" style="margin-left: 10px;cursor: pointer;"
+                  >自动生成</span
+                >
+              </div>
+              <div v-else>
+                <el-input
+                  v-model="item.code"
+                  type="text"
+                  disabled
+                  style="width: 150px;text-align: center;"
+                />
+              </div>
+            </div>
+          </td>
+          <td>
+            <el-input v-model="item.stockAlert" type="text" />
+          </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
+    },
+    id: {
+      type: Number
+    },
+    codeList: {
+      type: Array
+    }
+  },
+  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: '',
+        integral: '',
+        // cost: '',
+        attribute: {}
+      }, // tableData单list信息
+      edit: false,
+      selectedObj: {}
+    };
+  },
+  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) => {}
+      );
+    },
+    deletePic(index){
+      this.tableData[index].pic = '';
+      this.tableData = [...this.tableData];
+    },
+    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;
+          this.edit = true;
+        })
+        .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);
+      this.selectedObj = {};
+    },
+    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 = '';
+      // }
+      // });
+    },
+    setGoodsSkuCode(item){
+      this.loading++;
+      this.httpPost(this.$root.setGoodsSkuCode, {}).then(
+        (res) => {
+          this.loading--;
+          item.code = res.code;
+          this.selectedObj = {};
+          this.tableData.forEach(item => {
+            item.code && (this.selectedObj[item.code] = true);
+          });
+          console.log(this.selectedObj);
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    changeCode(val){
+      // console.log(val ,111111);
+      // console.log(this.tableData);
+      this.selectedObj = {};
+      this.tableData.forEach(item => {
+        item.code && (this.selectedObj[item.code] = true);
+      });
+    },
+  },
+  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;
+    // z-index: 2;
+  }
+
+  .closeIcon{
+    fill: gray6;
+    background-color: white;
+    border-radius: 50%;
+    width: 16px;
+    height: 16px;
+    position: absolute;
+    top: -6px;
+    right: -6px;
+    cursor: pointer;
+  }
+
+  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>

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

@@ -0,0 +1,703 @@
+<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> 供应链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>
+            <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>

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

@@ -0,0 +1,165 @@
+<template>
+  <div class="img-container" v-loading="loading">
+    <div class="wrapper" style="position: relative" v-if="url">
+      <!-- <img :src="url" class="img" /> -->
+      <el-image :src="url" class="img" fit="contain" :preview-src-list="[url]">
+      </el-image>
+      <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 80px;
+            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>

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

@@ -0,0 +1,257 @@
+<!--商品详情-->
+<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>
+      <el-image
+        :src="item"
+        class="img"
+        :z-index="10"
+        style="position: relative;"
+        :preview-src-list="[item]"
+      >
+      </el-image>
+    </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%;
+      // z-index : 0;
+
+      // 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;
+        z-index :2;
+      }
+    }
+  }
+
+  .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>

+ 171 - 0
src/components/goods/upLoader.vue

@@ -0,0 +1,171 @@
+<template>
+  <div class="img-container" v-loading="loading">
+    <div class="wrapper" style="position: relative" v-if="url">
+      <!-- <img :src="url.url" class="img" v-if="url.type === 1"/> -->
+      <el-image :src="url.url" class="img" :preview-src-list="[url.url]" v-if="url.type === 1"> </el-image>
+      <video :src="url.url" class="img" v-if="url.type === 2" controls></video>
+      <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, video/*"
+      />
+      <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: Object
+        },
+        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);
+                    let type = null;
+                    if(file.type.indexOf('image') > -1){
+                        type = 1;
+                    } else if(file.type.indexOf('video') > -1){
+                        type = 2;
+                    };
+                    this.$emit('getPics', this.index, {url: res, type});
+                    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>

+ 264 - 0
src/components/goods/upVideoDetail.vue

@@ -0,0 +1,264 @@
+<!--商品详情-->
+<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>
+      <!-- <el-image
+        :src="item + '?x-oss-process=video/snapshot,t_1000,m_fast'"
+        class="img"
+        :z-index="10"
+        style="position: relative;"
+        :preview-src-list="[item + '?x-oss-process=video/snapshot,t_1000,m_fast']"
+      >
+      </el-image> -->
+      <video
+        :src="item"
+        class="img"
+        :z-index="10"
+        controls
+        style="position: relative;"
+      ></video>
+    </div>
+    <div class="btn-add">
+      <input
+        type="file"
+        class="add"
+        @change="addImg"
+        ref="inputImg"
+        accept="video/*"
+        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: 360px;
+    margin-right: 12px;
+    margin-bottom: 12px;
+
+    .img {
+      width: 360px;
+      height: 100%;
+    }
+
+    .iconWrap {
+      flex-center();
+      position: absolute;
+      top: 0;
+      left: 0;
+      width: 100%;
+      height: 100%;
+      // z-index : 0;
+
+      // 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;
+        z-index :2;
+      }
+    }
+  }
+
+  .btn-add {
+    margin-right: 12px;
+    margin-bottom: 12px;
+    flex-y();
+    width: 360px;
+    height: 360px;
+    // 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>

+ 138 - 0
src/config.js

@@ -0,0 +1,138 @@
+/* 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}://qyjj-api-dev-go.datounet.com`; // 开发环境
+// 测试环境
+const test_baseUrl = `${protocol}://qyjj-api-dev-go.datounet.com`; // 测试环境
+// 生产环境
+
+const pro_baseUrl = `${protocol}://qyjj-api-dev-go.datounet.com`; // 开发环境
+
+// 插件入口
+export const units = {
+    group: true, // 分类
+    goodsExt: false // 商品额外设置
+};
+
+
+export const AREA_OSS = 'https://dt-test-dev.oss-cn-beijing.aliyuncs.com/area/allArea30.json';
+
+// 静态图片域名 - OSS
+export const oss_baseUrl = `${protocol}://qyjj-img.datouit.com/`;
+export const ossBaseUrl = `${protocol}://qyjj-img.datouit.com/`;
+// 项目logo
+export const logo = oss_baseUrl + '/static/logo.png';
+export const staticImg = oss_baseUrl + '/static/';
+
+export const role = [
+    {
+        name: 'VIP',
+        id: 1
+    },
+    {
+        name: '三级消费商',
+        id: 2
+    },
+    {
+        name: '二级消费商',
+        id: 3
+    },
+    {
+        name: '一级消费商',
+        id: 4
+    },
+    {
+        name: '合伙人',
+        id: 5
+    },
+    {
+        name: '创始人',
+        id: 6
+    }
+];
+
+export const roleMap = {
+    0: '普通用户',
+    1: 'VIP',
+    2: '三级消费商',
+    3: '二级消费商',
+    4: '一级消费商',
+    5: '合伙人',
+    6: '创始人'
+};
+
+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 = 'YIMBZ-BDLCB-R5QUZ-JUP7V-F7F6H-ESB33';
+
+// 错误码常量
+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');

+ 250 - 0
src/request/action.js

@@ -0,0 +1,250 @@
+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) {
+    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
+        })
+        .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.status);
+          if (retcode === 200) {
+            let data = res.data.data;
+            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',
+                Authorization: localStorage.getItem('token') ?
+                  JSON.parse(localStorage.getItem('token')) : ''
+              }
+            }; // 添加请求头
+            axios
+              .post(data.host, param, config)
+              .then((res) => {
+                resolve(data.host + '/' + res.data.url);
+              })
+              .catch(function (e) {});
+          } else if (retcode === 1001) {
+            router.push('/login');
+            localStorage.removeItem('token');
+            reject(res.data.msg);
+          } else {
+            reject(alert(res.data.msg));
+          }
+        })
+        .catch((error) => {
+          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.code);
+    if (retcode === 200) {
+      resolve(val.data.data);
+    } else if (retcode === 1001) {
+      router.push('/login');
+      localStorage.removeItem('token');
+      reject(val.data.msg);
+    } else {
+      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);
+    // }
+    // console.log(val);
+    // if (retcode === 200) {
+    //   resolve(val.data.data);
+    // } else {
+    //   reject(val.data.msg);
+    // }
+  }
+
+  // 处理异常方法
+  static errTodo(error, url) {
+    // 非jsexception接口报错,post后端记录
+    // if (url.indexOf('jsexception') === -1) {
+    //   request.post('/jsexception', error);
+    // }
+    console.log(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);
+    }
+  }
+}

+ 552 - 0
src/request/api.js

@@ -0,0 +1,552 @@
+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', // 获取省、市、区
+    getCode: '/common/wx/mini/code', // 生成微信小程序码
+    sendSms: '/common/send/sms/code',
+
+    // 登录
+    manageLogin: '/admin/rule/user/login', // 登录
+
+    setOption: '/admin/conf/batch/set', // 批量配置参数
+    getOption: '/admin/conf/batch/get', // 批量读取配置参数
+
+    getCongfigList: '/admin/conf/list',
+    getCongfigGroupList: '/admin/conf/group/list',
+    setConfig: '/admin/conf/batch/set',
+    deleteConfig: '/admin/conf/delete',
+
+    managerLogout: '/admin/rule/user/logout',
+    getCaptchaImg: '/common/captcha', // 获取登录图片验证码
+
+    uploadPay: '/admin/pay/merchant/info/upload',
+
+    // 账号管理
+    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/rule/menu/list', // 菜单列表
+    addMenu: '/admin/rule/menu/add', // 菜单添加
+    editMenu: '/admin/rule/menu/edit', // 菜单编辑
+    deleteMenu: '/admin/rule/menu/delete', // 菜单删除
+    managerMenu: '/admin/rule/permission/menu/available/list', // 有权限的菜单列表(根据登录的管理员获取的菜单列表)
+
+
+
+    //----------------------------------- 组织架构 --------------------------------------------------------
+
+    getOrgStructList: '/admin/org/struct/list',
+    updateOrgStruct: '/admin/org/struct/edit',
+    deleteOrgStruct: '/admin/org/struct/delete',
+    addOrgStruct: '/admin/org/struct/add',
+    bindingSuperior: '/admin/user/binding/superior',
+
+
+
+
+    addMember: '/admin/rule/user/add',
+    updateMember: '/admin/rule/user/edit',
+    getMemberList: '/admin/rule/user/list',
+    getGroupListByUser: '/admin/rule/permission/user/group/list',
+    freezeUser: '/admin/rule/user/freeze',
+    unfreezeUser: '/admin/rule/user/unfreeze',
+
+
+
+    // 合作伙伴
+    getPartnerList: '/admin/partner/list',
+    getPartnerInfo: '/admin/partner/info',
+    addPartner: '/admin/partner/create',
+    updatePartner: '/admin/partner/update',
+
+
+
+    //权限组
+    getGroupList: '/admin/rule/permission/group/list',
+    addGroup: '/admin/rule/permission/add/group',
+    deleteGroup: '/admin/rule/permission/delete/group',
+    bindGroup: '/admin/rule/permission/link/user',
+
+    getPermissionMenuList: '/admin/rule/permission/menu/optional/list',
+    updatePermissionMenu: '/admin/rule/permission/menu/link',
+    getPermissionApiList: '/admin/rule/permission/api/optional/list',
+    updatePermissionApi: '/admin/rule/permission/api/link',
+
+    //api管理
+    getApiList: '/admin/rule/api/list',
+    addApi: '/admin/rule/api/add',
+    deleteApi: '/admin/rule/api/delete',
+    updateApi: '/admin/rule/api/edit',
+    readApi: '/admin/rule/api/read',
+
+
+
+    //字典
+    getDictionaryList: '/admin/dictionary/list',
+    addDictionary: '/admin/dictionary/create',
+    deleteDictionary: '/admin/dictionary/delete',
+    updateDictionary: '/admin/dictionary/update',
+    lockDictionary: '/admin/dictionary/lock',
+
+    //字典项
+    addDictionaryItem: '/admin/dictionary/item/create',
+    getDictionaryItem: '/admin/dictionary/info',
+    deleteDictionaryItem: '/admin/dictionary/item/delete',
+    updateDictionaryItem: '/admin/dictionary/item/update',
+    lockDictionaryItem: '/admin/dictionary/item/lock',
+
+    getDictionaryByName: '/admin/dictionary/item/list/son',
+
+
+
+
+
+
+
+
+
+
+
+
+    // 用户
+    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', // 代理商开通记录列表
+
+    getBankCardList: '/admin/user/draw/list',
+
+    updateBankInfo: '/admin/user/draw/data/update',
+
+    getWalletList: '/admin/user/wallet/list',
+
+    // updateHz: '/admin/user/integral/update',
+    addKpi: '/admin/user/kpi/update',
+
+    getVipList: '/admin/user/vip/list',
+
+    addSetQuota: '/admin/quota/set/add',
+
+    updateQuota: '/admin/quota/update',
+
+    getVicePresidentList: '/admin/user/vice/president/list',
+    getPresidentList: '/admin/user/president/list',
+    
+
+    getAreaAgentList: '/admin/user/agent/area/list',
+    getAreaAgentRecord: '/admin/user/role/agent/log',
+    getShopMap: '/admin/shop/manage/map',
+    closeRole: '/admin/user/role/cancel',
+    stopRole: '/admin/user/role/stop',
+    updateAgentTime: '/admin/user/update/over/time',
+    updateAgentRatio: '/admin/user/update/area/ratio',
+
+    getAgentExamineList: '/admin/user/agent/list',
+
+    getTeamList: '/admin/user/team/list',
+
+    passAgentOne: '/admin/user/agent/pass/one',
+    passAgentTwo: '/admin/user/agent/pass/two',
+    refuseAgentOne: '/admin/user/agent/refuse/one',
+    refuseAgentTwo: '/admin/user/agent/refuse/two',
+
+
+
+    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', // 修改商品状态
+
+    //品牌
+    getGoodsBrandList: '/admin/goods/brand/list',
+    updateGoodsBrand: '/admin/goods/brand/update',
+    deleteGoodsBrand: '/admin/goods/brand/delete',
+
+    setGoodsSkuCode: '/admin/goods/gen/sku/code',
+
+    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', // 编辑运费模板
+    deleteFreight: '/admin/freight/delete',
+
+    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', // 删除轮播图
+
+    // 分享设置
+    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', // 图文设置详情
+
+    //公众号
+    getPublicCodeInfo: '/admin/public/code/info',
+    updatePublicCode: '/admin/public/code/update',
+
+    // 资金相关===================================
+    getWithdrawList: '/admin/draw/log/list', // 审核列表
+    getWithdrawInfo: '/admin/draw/log/info', // 审核詳情
+    refuteWithdraw: '/admin/draw/log/refute',
+    passWithdraw: '/admin/draw/log/pass',
+
+    getWithdrawList2: '/admin/draw/kpi/log/list', // 审核列表
+    getWithdrawInfo2: '/admin/draw/kpi/log/info', // 审核詳情
+    refuteWithdraw2: '/admin/draw/kpi/log/refute',
+    passWithdraw2: '/admin/draw/kpi/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', // 全球分红记录
+    getVoucherList: '/admin/fund/voucher/list',
+
+    getIntegralList: '/admin/fund/integral/list', // 积分变动记录
+    getGoldList: '/admin/fund/gold/list', // 华金变动记录
+    getBalance: '/admin/fund/balance/list', // 余额变动记录
+    getTglist: '/admin/fund/candy/list', // 糖果变动记录
+
+    getRebateKpiList: '/admin/fund/rebate/kpi/list',
+
+    getRebateLogSum: '/admin/fund/rebate/log/sum',
+    getPayBillSum: '/admin/fund/pay/bill/sum',
+
+    // 订单
+    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', // 订单导入
+
+    getEvaluationOrderList: '/admin/order/evaluation/list',
+    passEvaluationOrder: '/admin/order/evaluation/pass',
+    rejectEvaluationOrder: '/admin/order/evaluation/reject',
+
+    getReplenishmentOrderList: '/admin/order/replenishment/list',
+    confirmReplenishmentOrder: '/admin/order/replenishment/confirm',
+    addReplenishmentOrder: '/admin/order/replenishment/create',
+
+    getOrderSumAmount: '/admin/order/sum/amount',
+
+    // 售后
+    getAfterSaleList: '/admin/order/after/sale/list',
+    getAfterSaleList2: '/admin/order/after/sale/service/list',
+    getAfterSaleFinancialList: '/admin/order/after/sale/financial/list',
+    agreeAfterSale: '/admin/order/after/sale/service/agree',
+    rejectAfterSale: '/admin/order/after/sale/service/reject',
+    afterSaleInfo: '/admin/order/after/sale/info',
+    agreeAfterSale2: '/admin/order/after/sale/agree/refund',
+    rejectAfterSale2: '/admin/order/after/sale/financial/reject',
+    changeAfterSaleAmount: '/admin/order/after/sale/change/amount',
+    sendHistory: '/admin/order/after/sale/send/history',
+
+    rejectAfterSale: '/admin/order/after/sales/reject',
+    passAfterSale: '/admin/order/after/sales/pass',
+
+    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', // 修改用户手机号
+
+    updateLoginPwd: '/admin/user/login/password/set',
+    updatePayPwd: '/admin/user/pay/password/set',
+
+    createUser: '/admin/user/created/user',
+
+    updateBalance: '/admin/user/balance/update', // 修改余额
+    updateIntegral: '/admin/user/integral/update', // 修改余额
+    updateQuota: '/admin/user/quota/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',
+
+    getBuyRoleLog: '/admin/buy/role/log/list',
+    getRoleLog: '/admin/user/role/log/list',
+
+    getExploitTree: '/admin/user/exploit/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',
+
+
+
+
+    getArticleCategoryList: '/admin/classroom/sort/list',
+    addArticleCategory: '/admin/classroom/sort/add',
+    deleteArticleCategory: '/admin/classroom/sort/delete',
+    updateArticleCategory: '/admin/classroom/sort/update',
+
+    getArticleList: '/admin/classroom/article/list',
+    addArticle: '/admin/classroom/article/add',
+    deleteArticle: '/admin/classroom/article/delete',
+    updateArticle: '/admin/classroom/article/update',
+    getArticleInfo: '/admin/classroom/article/info',
+
+
+    getPosterInfo: '/admin/classroom/poster/info',
+    updatePoster: '/admin/classroom/poster/update',
+
+
+    //系统
+    addSystem: '/admin/setup/company/add',
+    getSystemList: '/admin/setup/company/list',
+    getAreaName: '/admin/freight/name/list',
+
+
+
+    getPayList: '/admin/pay/merchant/info/list',
+    createPay: '/admin/pay/merchant/info/create',
+
+
+    getOrderSalesList: '/admin/order/sales/list',
+
+    addQuota: '/admin/quota/set/add',
+    getQuota: '/admin/quota/set/info',
+
+    getVicePresidentSet: '/admin/user/vice/president/set',
+
+
+
+    getFinancialCountingType: '/admin/fund/financial/counting/types',
+    getFundDividendList: '/admin/fund/dividend/list',
+
+    getPayBillList: '/admin/fund/pay/bill/list',
+
+    getFundTotalSum: '/admin/fund/total/sum',
+    getFundPayDaySum: '/admin/fund/pay/day/sum',
+    getFundPayMonthSum: '/admin/fund/pay/month/sum',
+
+    // 提现
+    getKpiWithdrawList: '/admin/draw/kpi/log/list',
+    getKpiWithdrawInfo: '/admin/draw/kpi/log/info',
+    refuteKpiWithdraw: '/admin/draw/kpi/log/refute',
+    passKpiWithdraw: '/admin/draw/kpi/log/pass',
+
+    updateSuperior: '/admin/user/set/superior',
+    updateProportion: '/admin/user/update/exploit/earnings',
+
+
+    updateAgreement: '/admin/agreement/update',
+    getAgreementInfo: '/admin/agreement/info',
+    getAgreementList: '/admin/agreement/list',
+    addAgreement: '/admin/agreement/add',
+
+    //动态
+    getDynamicsList: '/admin/setup/news/list',
+    getDynamicsInfo: '/admin/setup/news/info',
+    addDynamics: '/admin/setup/news/add',
+    deleteDynamics: '/admin/setup/news/delete',
+
+    getWxCategoryList: '/admin/goods/wx/channels/category/list',
+    getWxCategoryInfo: '/admin/goods/wx/channels/category/info',
+    syncProduct: '/admin/goods/wx/channels/sync/product',
+    getIntegralLog: '/admin/fund/integral/log',
+
+    // 案例见证
+    getCaseList: '/admin/article/list',
+    deleteCase: '/admin/article/delete',
+    addCase: '/admin/article/add',
+    updateCase: '/admin/article/update',
+
+    // 信息发布
+    getMessageList: '/admin/message/list',
+    deleteMessage: '/admin/message/delete',
+    addMessage: '/admin/message/add',
+    updateMessage: '/admin/message/update',
+
+    // 常见问题
+    getProblemList: '/admin/problem/list',
+    deleteProblem: '/admin/problem/delete',
+    addProblem: '/admin/problem/add',
+    updateProblem: '/admin/problem/update',
+
+    // 服务预约
+    getServiceList: '/admin/service/list',
+    getServiceInfo: '/admin/service/info',
+
+
+    // 意见反馈
+    getFeedbackList: '/admin/feedback/list',
+    getFeedbackInfo: '/admin/feedback/info',
+
+    // 实名信息
+    getRealNameList: '/admin/shop/manage/list',
+    getRealNameInfo: '/admin/shop/manage/res',
+    passRealName: '/admin/shop/manage/pass',
+    refuseRealName: '/admin/shop/manage/refuse',
+    updateRealName: '/admin/shop/manage/update',
+    getReplenishmentShopInfo: '/admin/shop/manage/replenishment/info',
+
+    //身份价格设置
+    getRoleSetInfo: '/admin/role/set/info',
+    setRoleSetParam: '/admin/role/set/param',
+    setRoleCountyArea: '/admin/role/set/county/area',
+    setRoleCityArea: '/admin/role/set/city/area',
+
+    // 代理商库存
+    getShopStockList: '/admin/goods/shop/stock/list',
+    updateShopStock: '/admin/goods/shop/stock/change',
+    deleteShopStock: '/admin/goods/shop/stock/lack/logs/delete',
+    
+    getStockLackLogs: '/admin/goods/shop/stock/lack/logs',
+
+    getReplenishmentNotSubmitSum: '/admin/order/replenishment/not/submit/sum',
+    confirmReplenishmentOrder: '/admin/order/replenishment/confirm',
+    deliveryReplenishmentOrder: '/admin/order/replenishment/delivery',
+
+
+    getOperationLogList: '/admin/operation/log/list',
+
+
+    // 首页
+    getWorkbenchUserInfo: '/admin/workbench/user/info',
+    getWorkbenchAuditInfo: '/admin/workbench/audit/info',
+    getWorkbenchOrderInfo: '/admin/workbench/order/info',
+
+
+    exportLog: '/admin/operation/log/list/export',
+
+    getAreaAssessmentList: '/admin/rebate/info/area/assessment/list',
+    auditAreaAssessment: '/admin/rebate/area/assessment/audit',
+    updateAreaAssessmentAmount: '/admin/rebate/area/assessment/update/amount',
+    getAreaAssessmentSumList: '/admin/rebate/info/area/assessment/sum/list',
+
+    // 团队管理奖
+    getTeamSumList: '/admin/rebate/info/team/sum/list',
+    teamSumRecalculate: '/admin/rebate/team/sum/recalculate',
+    teamSumRelease: '/admin/rebate/team/sum/release',
+    getTeamInfoList: '/admin/rebate/info/team/info/list',
+    updateTeamAmount: '/admin/rebate/team/info/update/amount',
+
+    test1: '/admin/rebate/area/assessment/dev/mock/release',
+    test2: '/admin/kpi/add',
+    test3: '/admin/rebate/team/dev/mock/release',
+};

+ 37 - 0
src/request/request.js

@@ -0,0 +1,37 @@
+import action from './action.js';
+import { baseUrl, OSS_URL, AREA_OSS } from '../config';
+
+export default class request {
+    static get(address, params) {
+        let url = address;
+        if(address && (address.indexOf(AREA_OSS) < 0)) {
+            url = baseUrl + address;
+        }
+        return action.get(url, params);
+    }
+
+    static post(address, data) {
+        let url = baseUrl + address;
+        return action.post(url, data);
+    }
+
+    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);
+    }
+}

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

@@ -0,0 +1,17 @@
+const caseManage = () => import('@/view/article/case-manage');
+const informationRelease = () => import('@/view/article/information-release');
+const problem = () => import('@/view/article/problem');
+
+export default [{
+  path: '/case-manage',
+  name: 'caseManage',
+  component: caseManage
+}, {
+  path: '/information-release',
+  name: 'informationRelease',
+  component: informationRelease
+}, {
+  path: '/problem',
+  name: 'problem',
+  component: problem
+}];

+ 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
+}];

+ 23 - 0
src/router/modules/Classroom.js

@@ -0,0 +1,23 @@
+const article = () => import('@/view/classroom/article');
+const articleDetail = () => import('@/view/classroom/article-detail');
+const articleCategory = () => import('@/view/classroom/article-category');
+const poster = () => import('@/view/classroom/poster');
+
+
+export default [{
+  path: '/article',
+  name: 'article',
+  component: article
+}, {
+  path: '/article-detail',
+  name: 'articleDetail',
+  component: articleDetail
+}, {
+  path: '/article-category',
+  name: 'articleCategory',
+  component: articleCategory
+},{
+  path: '/poster',
+  name: 'poster',
+  component: poster
+}];

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

@@ -0,0 +1,174 @@
+// 资金管理
+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 integralRecord = () => import('@/view/fund/integral-record.vue'); // 团队奖励
+const integralRecord2 = () => import('@/view/fund/integral-record2.vue'); // 团队奖励
+const kpiRecord = () => import('@/view/fund/kpi-record.vue'); // 团队奖励
+const kpi = () => import('@/view/fund/kpi.vue'); // 团队奖励
+const balanceRecord2 = () => import('@/view/fund/balance-record2.vue'); // 团队奖励
+const withdrawKpi = () => import('@/view/fund/withdraw-kpi.vue'); // 团队奖励
+const withdrawDetail = () => import('@/view/fund/withdraw-detail.vue'); // 团队奖励
+const withdrawKpiDetail = () => import('@/view/fund/withdraw-kpi-detail.vue'); // 团队奖励
+const platformRevenue = () => import('@/view/fund/platform-revenue.vue'); // 团队奖励
+const rebateRecord = () => import('@/view/fund/rebate-record.vue'); // 团队奖励
+const voucherRecord = () => import('@/view/fund/voucher-record.vue'); // 团队奖励
+const teamAwardReview = () => import('@/view/fund/team-award-review.vue'); // 团队奖励
+const areaAssessment = () => import('@/view/fund/area-assessment.vue'); // 团队奖励
+const areaAssessmentPre = () => import('@/view/fund/area-assessment-pre.vue'); // 团队奖励
+const areaAssessmentDetail = () => import('@/view/fund/area-assessment-detail.vue'); // 团队奖励
+const test = () => import('@/view/fund/test.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: '/integral-record',
+    name: 'integralRecord',
+    component: integralRecord
+  },
+  {
+    path: '/integral-record2',
+    name: 'integralRecord2',
+    component: integralRecord2
+  },
+  {
+    path: '/kpi',
+    name: 'kpi',
+    component: kpi
+  },
+  {
+    path: '/kpi-record',
+    name: 'kpiRecord',
+    component: kpiRecord
+  },
+  {
+    path: '/balance-record2',
+    name: 'balanceRecord2',
+    component: balanceRecord2
+  },
+  {
+    path: '/withdraw-kpi',
+    name: 'withdrawKpi',
+    component: withdrawKpi
+  },
+  {
+    path: '/withdraw-detail',
+    name: 'withdrawDetail',
+    component: withdrawDetail
+  },
+  {
+    path: '/withdraw-kpi-detail',
+    name: 'withdrawKpiDetail',
+    component: withdrawKpiDetail
+  },
+  {
+    path: '/platform-revenue',
+    name: 'platformRevenue',
+    component: platformRevenue
+  },
+  {
+    path: '/rebate-record',
+    name: 'rebateRecord',
+    component: rebateRecord
+  },
+  {
+    path: '/voucher-record',
+    name: 'voucherRecord',
+    component: voucherRecord
+  },
+  {
+    path: '/team-award-review',
+    name: 'teamAwardReview',
+    component: teamAwardReview
+  },
+  {
+    path: '/area-assessment',
+    name: 'areaAssessment',
+    component: areaAssessment
+  },
+  {
+    path: '/area-assessment-pre',
+    name: 'areaAssessmentPre',
+    component: areaAssessmentPre
+  },
+  {
+    path: '/area-assessment-detail',
+    name: 'areaAssessmentDetail',
+    component: areaAssessmentDetail
+  }, {
+    path: '/test',
+    name: 'test',
+    component: test
+  },
+];

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

@@ -0,0 +1,64 @@
+// 新闻管理
+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'); // 轮播图
+const salesVolume = () => import('@/view/goods/sales-volume'); // 轮播图
+const brandManage = () => import('@/view/goods/brand-manage'); // 轮播图
+
+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
+    }, {
+        path: '/sales-volume',
+        name: 'salesVolume',
+        component: salesVolume
+    }, {
+        path: '/brand-manage',
+        name: 'brandManage',
+        component: brandManage
+    }
+];

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

@@ -0,0 +1,137 @@
+const shareSetting = () => import('@/view/mall/share-setting');
+const banner = () => import('@/view/mall/banner'); // 轮播图
+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 companyDynamics = () => import('@/view/mall/company-dynamics');
+const addDynamics = () => import('@/view/mall/add-dynamics');
+const systemManage = () => import('@/view/mall/system-manage');
+const freight = () => import('@/view/mall/freight');
+const dictionary = () => import('@/view/mall/dictionary');
+const dictionaryItem = () => import('@/view/mall/dictionary-item');
+const agreement = () => import('@/view/mall/agreement');
+const agreementManage = () => import('@/view/mall/agreement-manage');
+// const agreement2 = () => import('@/view/mall/agreement2');
+const identitySetting = () => import('@/view/mall/identity-setting');
+const officialAccount = () => import('@/view/mall/official-account');
+const serviceAppointment = () => import('@/view/mall/service-appointment');
+const floorPlan = () => import('@/view/mall/floor-plan');
+const feedback = () => import('@/view/mall/feedback');
+const feedbackDetail = () => import('@/view/mall/feedback-detail');
+
+export default [{
+        path: '/share-setting',
+        name: 'shareSetting',
+        component: shareSetting
+    }, {
+        path: '/banner',
+        name: 'banner',
+        component: banner
+    }, {
+        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: '/company-dynamics',
+        name: 'companyDynamics',
+        component: companyDynamics
+    },{
+        path: '/add-dynamics',
+        name: 'addDynamics',
+        component: addDynamics
+    }, {
+        path: '/system-manage',
+        name: 'systemManage',
+        component: systemManage
+    }, {
+        path: '/freight',
+        name: 'freight',
+        component: freight
+    }, {
+        path: '/dictionary',
+        name: 'dictionary',
+        component: dictionary
+    }, {
+        path: '/dictionary-item',
+        name: 'dictionaryItem',
+        component: dictionaryItem
+    }, {
+        path: '/agreement',
+        name: 'agreement',
+        component: agreement
+    }, {
+        path: '/agreement-manage',
+        name: 'agreementManage',
+        component: agreementManage
+    }, {
+        path: '/identity-setting',
+        name: 'identitySetting',
+        component: identitySetting
+    }, {
+        path: '/official-account',
+        name: 'officialAccount',
+        component: officialAccount
+    }, {
+        path: '/service-appointment',
+        name: 'serviceAppointment',
+        component: serviceAppointment
+    }, {
+        path: '/floor-plan',
+        name: 'floorPlan',
+        component: floorPlan
+    }, {
+        path: '/feedback',
+        name: 'feedback',
+        component: feedback
+    }, {
+        path: '/feedback-detail',
+        name: 'feedbackDetail',
+        component: feedbackDetail
+    }
+];

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

@@ -0,0 +1,96 @@
+const orderManager = () => import('@/view/order/order-manager');
+const liveOrderManager = () => import('@/view/order/live-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');
+const service = () => import('@/view/order/service');
+const service2 = () => import('@/view/order/service2');
+const service3 = () => import('@/view/order/service3');
+const serviceDetail = () => import('@/view/order/service-detail');
+const serviceDetail2 = () => import('@/view/order/service-detail2');
+const orderEvaluate = () => import('@/view/order/order-evaluate');
+const evaluateDetail = () => import('@/view/order/evaluate-detail');
+const replenishmentOrderManage = () => import('@/view/order/replenishment-order-manage');
+const replenishmentOrderDetail = () => import('@/view/order/replenishment-order-detail');
+const addReplenishmentOrder = () => import('@/view/order/add-replenishment-order');
+
+export default [{
+    path: '/order-manager',
+    name: 'orderManager',
+    component: orderManager
+  }, {
+    path: '/live-order-manager',
+    name: 'liveOrderManager',
+    component: liveOrderManager
+  },
+  {
+    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
+  },
+  {
+    path: '/service',
+    name: 'service',
+    component: service
+  },
+  {
+    path: '/service2',
+    name: 'service2',
+    component: service2
+  },
+  {
+    path: '/service3',
+    name: 'service3',
+    component: service3
+  },
+  {
+    path: '/service-detail',
+    name: 'serviceDetail',
+    component: serviceDetail
+  },
+  {
+    path: '/service-detail2',
+    name: 'serviceDetail2',
+    component: serviceDetail2
+  },
+  {
+    path: '/order-evaluate',
+    name: 'orderEvaluate',
+    component: orderEvaluate
+  },
+  {
+    path: '/evaluate-detail',
+    name: 'evaluateDetail',
+    component: evaluateDetail
+  },
+  {
+    path: '/replenishment-order-manage',
+    name: 'replenishmentOrderManage',
+    component: replenishmentOrderManage
+  },
+  {
+    path: '/replenishment-order-detail',
+    name: 'replenishmentOrderDetail',
+    component: replenishmentOrderDetail
+  },
+  {
+    path: '/add-replenishment-order',
+    name: 'addReplenishmentOrder',
+    component: addReplenishmentOrder
+  }
+];

+ 22 - 0
src/router/modules/OrganizationalStructure.js

@@ -0,0 +1,22 @@
+const organizationalStructureSetting = () => import('@/view/organizationalStructure/organizational-structure-setting'); //
+const staffManage = () => import('@/view/organizationalStructure/staff-manage'); //
+const partners = () => import('@/view/organizationalStructure/partners'); //
+const log = () => import('@/view/organizationalStructure/log'); //
+
+export default [{
+    path: '/organizational-structure-setting',
+    name: 'organizationalStructureSetting',
+    component: organizationalStructureSetting
+},{
+    path: '/staff-manage',
+    name: 'staffManage',
+    component: staffManage
+},{
+    path: '/partners',
+    name: 'partners',
+    component: partners
+},{
+    path: '/log',
+    name: 'log',
+    component: log
+}];

+ 12 - 0
src/router/modules/PowerManage.js

@@ -0,0 +1,12 @@
+const powerManage = () => import('@/view/powerManage/power-manage'); //
+const apiManage = () => import('@/view/powerManage/api-manage'); //
+
+export default [{
+    path: '/power-manage',
+    name: 'powerManage',
+    component: powerManage
+}, {
+    path: '/api-manage',
+    name: 'apiManage',
+    component: apiManage
+}];

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

@@ -0,0 +1,158 @@
+// 新闻管理
+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 regionalAgent = () => import('@/view/user-manage/regional-agent'); //
+const regionalAgentRecord = () => import('@/view/user-manage/regional-agent-record'); //
+const vicePresident = () => import('@/view/user-manage/vice-president'); //
+const president = () => import('@/view/user-manage/president'); //
+const bankCardList = () => import('@/view/user-manage/bank-card-list'); //
+const wallet = () => import('@/view/user-manage/wallet'); //
+const realName = () => import('@/view/user-manage/real-name'); //
+const realNameDetail = () => import('@/view/user-manage/real-name-detail'); //
+const agentDistribution = () => import('@/view/user-manage/agent-distribution'); //
+const areaKpi = () => import('@/view/user-manage/area-kpi'); //
+const teamManage = () => import('@/view/user-manage/team-manage'); //
+const roleBuyRecord = () => import('@/view/user-manage/role-buy-record'); //
+const roleChangeRecord = () => import('@/view/user-manage/role-change-record'); //
+const agentInventory = () => import('@/view/user-manage/agent-inventory'); //
+const inventoryUrgent = () => import('@/view/user-manage/inventory-urgent'); //
+const urgentDetail = () => import('@/view/user-manage/urgent-detail'); //
+const agentReplenishment = () => import('@/view/user-manage/agent-replenishment'); //
+const replenishmentDetail = () => import('@/view/user-manage/replenishment-detail'); //
+const stockWarning = () => import('@/view/user-manage/stock-warning'); //
+
+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: '/area-kpi',
+        name: 'areaKpi',
+        component: areaKpi
+    }, {
+        path: '/agent-record',
+        name: 'agentRecord',
+        component: agentRecord
+    }, {
+        path: '/regional-agent',
+        name: 'regionalAgent',
+        component: regionalAgent
+    }, {
+        path: '/regional-agent-record',
+        name: 'regionalAgentRecord',
+        component: regionalAgentRecord
+    }, {
+        path: '/vice-president',
+        name: 'vicePresident',
+        component: vicePresident
+    }, {
+        path: '/president',
+        name: 'president',
+        component: president
+    }, {
+        path: '/bank-card-list',
+        name: 'bankCardList',
+        component: bankCardList
+    }, {
+        path: '/wallet',
+        name: 'wallet',
+        component: wallet
+    }, {
+        path: '/real-name',
+        name: 'realName',
+        component: realName
+    }, {
+        path: '/real-name-detail',
+        name: 'realNameDetail',
+        component: realNameDetail
+    }, {
+        path: '/agent-distribution',
+        name: 'agentDistribution',
+        component: agentDistribution
+    }, {
+        path: '/team-manage',
+        name: 'teamManage',
+        component: teamManage
+    }, {
+        path: '/role-buy-record',
+        name: 'roleBuyRecord',
+        component: roleBuyRecord
+    }, {
+        path: '/role-change-record',
+        name: 'roleChangeRecord',
+        component: roleChangeRecord
+    }, {
+        path: '/agent-inventory',
+        name: 'agentInventory',
+        component: agentInventory
+    }, {
+        path: '/inventory-urgent',
+        name: 'inventoryUrgent',
+        component: inventoryUrgent
+    }, {
+        path: '/urgent-detail',
+        name: 'urgentDetail',
+        component: urgentDetail
+    }, {
+        path: '/agent-replenishment',
+        name: 'agentReplenishment',
+        component: agentReplenishment
+    }, {
+        path: '/replenishment-detail',
+        name: 'replenishmentDetail',
+        component: replenishmentDetail
+    }, {
+        path: '/stock-warning',
+        name: 'stockWarning',
+        component: stockWarning
+    }
+];

+ 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>

+ 332 - 0
src/view/Index.vue

@@ -0,0 +1,332 @@
+<template>
+  <div class="main-container" v-loading="isLoading">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <div class="order-info">
+          <div class="item" @click="toPage('orderManager', {status: 8})">
+            <img
+              :src="staticImg ? staticImg + 'index-order-01.png' : ''"
+              alt=""
+              class="pic"
+            />
+            <div class="right">
+              <p>{{ orderInfo.waitDeliver }}</p>
+              <div>
+                待发货 >
+              </div>
+            </div>
+          </div>
+          <div class="item" @click="toPage('orderManager', {status: 8})">
+            <img
+              :src="staticImg ? staticImg + 'index-order-02.png' : ''"
+              alt=""
+              class="pic"
+            />
+            <div class="right">
+              <p>{{ orderInfo.waitTakeDeliver }}</p>
+              <div>
+                待收货 >
+              </div>
+            </div>
+          </div>
+          <div class="item" @click="toPage('orderManager2')">
+            <img
+              :src="staticImg ? staticImg + 'index-order-03.png' : ''"
+              alt=""
+              class="pic"
+            />
+            <div class="right">
+              <p>{{ orderInfo.waitClaim }}</p>
+              <div>
+                待取货 >
+              </div>
+            </div>
+          </div>
+          <div class="item" @click="toPage('service')">
+            <img
+              :src="staticImg ? staticImg + 'index-order-04.png' : ''"
+              alt=""
+              class="pic"
+            />
+            <div class="right">
+              <p>{{ orderInfo.afterSale }}</p>
+              <div>
+                快递售后申请 >
+              </div>
+            </div>
+          </div>
+          <div class="item" @click="toPage('service2')">
+            <img
+              :src="staticImg ? staticImg + 'index-order-05.png' : ''"
+              alt=""
+              class="pic"
+            />
+            <div class="right">
+              <p>{{ orderInfo.claimAfterSale }}</p>
+              <div>
+                取货点售后申请 >
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="approve-info">
+          <div class="item" @click="toPage('orderEvaluate')">
+            评价待审批 >
+            <p>
+              {{ auditInfo.evaluate }}
+            </p>
+          </div>
+          <div class="item" @click="toPage('withdraw')">
+            提现申请待审批 >
+            <p>
+              {{ auditInfo.draw }}
+            </p>
+          </div>
+          <div class="item" @click="toPage('teamAwardReview')">
+            团队管理奖待审批 >
+            <p>
+              {{ auditInfo.teamManage }}
+            </p>
+          </div>
+          <div class="item" @click="toPage('realName')">
+            实名认证待审批 >
+            <p>
+              {{ auditInfo.authentication }}
+            </p>
+          </div>
+          <div class="item" @click="toPage('replenishmentOrderManage')">
+            店铺补货待发货 >
+            <p>
+              {{ auditInfo.shopReplenishment }}
+            </p>
+          </div>
+        </div>
+        <div class="role-info">
+          <div class="item">
+            <p>{{ userInfo.sumUser }}</p>
+            平台用户总计
+          </div>
+          <div class="item">
+            <p>{{ userInfo.vip }}</p>
+            vip
+          </div>
+          <div class="item">
+            <p>{{ userInfo.community }}</p>
+            社区体验店
+          </div>
+          <div class="item">
+            <p>{{ userInfo.county }}</p>
+            区县代理
+          </div>
+          <div class="item">
+            <p>{{ userInfo.city }}</p>
+            市级代理
+          </div>
+          <div class="item">
+            <p>{{ userInfo.prepareCity }}</p>
+            市级预备
+          </div>
+          <div class="item">
+            <p>{{ userInfo.assistantProvince }}</p>
+            省级
+          </div>
+          <div class="item">
+            <p>{{ userInfo.province }}</p>
+            副省级
+          </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,
+      orderInfo: {},
+      auditInfo: {},
+      userInfo: {}
+    };
+  },
+  mounted() {
+    // this.getDataSum();
+    // this.getFundPayDaySum();
+    // this.getFundPayMonthSum();
+    // this.getDataSum2();
+    this.getWorkbenchUserInfo();
+    this.getWorkbenchAuditInfo();
+    this.getWorkbenchOrderInfo();
+    this.$nextTick(() => {
+      // this.initEcharts();
+    });
+  },
+  methods: {
+    getWorkbenchUserInfo() {
+      this.loading++;
+      this.httpGet(this.$root.getWorkbenchUserInfo, {}).then(
+        (res) => {
+          this.loading--;
+          this.userInfo = res;
+        },
+        () => {
+          this.loading--;
+        }
+      );
+    },
+    getWorkbenchAuditInfo() {
+      this.loading++;
+      this.httpGet(this.$root.getWorkbenchAuditInfo, {}).then(
+        (res) => {
+          this.loading--;
+          this.auditInfo = res;
+        },
+        () => {
+          this.loading--;
+        }
+      );
+    },
+    getWorkbenchOrderInfo() {
+      this.loading++;
+      this.httpGet(this.$root.getWorkbenchOrderInfo, {}).then(
+        (res) => {
+          this.loading--;
+          this.orderInfo = res;
+        },
+        () => {
+          this.loading--;
+        }
+      );
+    },
+    getFundPayDaySum(){
+      this.loading++;
+      this.httpGet(this.$root.getFundPayDaySum, {
+        page: 1,
+        size: 9999
+      }).then(
+        (res) => {
+          this.loading--;
+          this.option.series[0].data = res.list.map(item => {
+            return item.amount
+          });
+          this.option.xAxis.data = res.list.map(item => {
+            return item.day
+          });
+          this.myChart.setOption(this.option);
+        },
+        () => {
+          this.loading--;
+        }
+      );
+    },
+    getFundPayMonthSum() {
+      this.loading++;
+      this.httpGet(this.$root.getFundPayMonthSum, {
+        page: 1,
+        size: 9999
+      }).then(
+        (res) => {
+          this.loading--;
+          this.monthData = res.list;
+        },
+        () => {
+          this.loading--;
+        }
+      );
+    },
+    toPage(name, data){
+      this.$router.push({
+        name: name,
+        query: data
+      });
+    }
+  }
+};
+</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(flex-start, flex-start);
+  .item{
+    word(18px, #999);
+    flex-y();
+    flex: 1;
+    p{
+      word(32px, #333);
+      // margin-top: 12px;
+    }
+  }
+  .order-info{
+    flex-x();
+    background: #fff;
+    width: 100%;
+    height: 160px;
+    border-radius: 20px;
+    .item{
+      flex-x(center);
+      cursor: pointer;
+      .pic{
+        width: 52px;
+        height: 52px;
+        margin-right: 16px;
+      }
+    }
+  }
+  .approve-info{
+    flex-x();
+    width: 100%;
+    height: 138px;
+    margin-top: 15px;
+    .item{
+      background: #fff;
+      height: 100%;
+      border-radius: 20px;
+      margin: 0 8px;
+      cursor: pointer;
+      &:nth-of-type(1){
+        margin-left: 0;
+      }
+      &:nth-last-of-type(1){
+        margin-right: 0;
+      }
+    }
+  }
+  .role-info{
+    width: 100%;
+    height: 140px;
+    background: #fff;
+    margin-top: 15px;
+    flex-x(flex-start);
+    border-radius: 20px;
+    .item{
+      flex: none;
+      margin: 0 50px;
+    }
+  }
+}
+</style>

+ 564 - 0
src/view/Login.vue

@@ -0,0 +1,564 @@
+<template>
+  <div class="login-container" v-loading="isLoading">
+    <div class="title-box">
+      <img :src="logo" class="logo-img" alt="" />
+      <span class="logo">全养家居</span>
+    </div>
+    <div class="login" v-if="layoutLogin">
+      <!-- <h1>后台管理系统 | 登录</h1> -->
+      <div class="title">
+        <img :src="logo" class="logo-img" alt="" />
+        <span class="logo">全养家居</span>
+      </div>
+      <div class="tip">账号登录</div>
+      <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="number"
+            placeholder="请输入验证码"
+          />
+          <!-- <div class="btn" @click="sendSms">获取短信验证码</div> -->
+          <el-button
+            type="primary"
+            style="width: 100px;margin-left: 10px;"
+            :loading="pswData.btnLoading"
+            v-text="pswData.hintTxt"
+            @click="getSmsCode"
+          ></el-button>
+        </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 class="bah" @click="toBah">
+      <div style="margin:0 auto; padding:20px 0;">
+        <a
+          target="_blank"
+          href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=37010502001997"
+          style="text-align: center;display:inline-block;text-decoration:none;height:20px;line-height:20px;"
+          ><img :src="staticImg + 'beian.png'" style="float:left;" />
+          <p
+            style="float:left;height:20px;line-height:20px;margin: 0px 0px 0px 0px; color:#939393;"
+          >
+            鲁公网安备 37010502001997号
+            <a
+              target="_blank"
+              href="https://beian.miit.gov.cn"
+              style="text-align: center;"
+              ><p style="padding-top: 3px;color:#939393;">
+                备案号:鲁ICP备2023025137号-1
+              </p></a
+            >
+          </p></a
+        >
+      </div>
+    </div> -->
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import { mapGetters, mapMutations } from 'vuex';
+import { logo, staticImg } from '../config';
+import JSEncrypt from 'jsencrypt';
+import pubKey from '@/assets/js/pubKey.js';
+export default {
+  name: 'login',
+  data() {
+    return {
+      captchaImg: '', // 图片验证码地址
+      captchaId: '', // 图片验证码id
+      inputSize: 'small',
+      isLoading: false,
+      btnTxt: '获取',
+      layoutLogin: true,
+      logo: logo,
+      loginData: {
+        username: '',
+        password: '', // 密码
+        code: ''
+        // code: "", //图片验证码
+      },
+      pswData: {
+        intervalId: '',
+        userName: '',
+        smsCode: '',
+        hintTxt: '获取验证码',
+        btnLoading: false,
+        phone: '',
+        psw: ''
+      },
+      staticImg: staticImg,
+      code: null
+    };
+  },
+  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
+        // };
+        let time = (+new Date() + '').substr(0, 10);
+              let pass = this.rsa(`${this.loginData.password}\\n${time}\\n`);
+        this.httpPost(this.$root.manageLogin, {
+          phone: this.loginData.username,
+          password: pass,
+          timestamp: time,
+          smsCode: this.loginData.code
+        }).then(
+          (res) => {
+            // token存本地
+            console.log('2222222', res);
+            this.setToken(res.token);
+            this.setUser(res.info);
+            this.setMenu('0-0');
+            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.sendSms, {
+        phone: this.loginData.username,
+        type: 12
+      }).then(
+        (res) => {
+          this.pswData.btnLoading = false;
+          this.countDown(60);
+          this.$message.success('操作成功');
+        },
+        () => {
+          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;
+    },
+    rsa(pass) {
+        console.log('加密前', pass)
+        var encryptor = new JSEncrypt() // 创建加密对象实例
+        encryptor.setPublicKey(pubKey) //设置公钥
+        return encryptor.encrypt(pass) || '加密失败'
+    },
+    toBah(){
+      window.open("https://beian.miit.gov.cn")
+    },
+    sendSms() {
+      this.httpPost(this.$root.sendSms, {
+        type: 12,
+        phone: this.loginData.username
+      }).then(
+        (res) => {
+          this.loading--;
+          this.$message.success('操作成功');
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+  }
+};
+</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;
+  background: url('https://iry-img.datouit.com/static/bg.png') no-repeat;
+  background-size: cover;
+}
+
+.title-box {
+    flex-x(center, center);
+    word(40px, #333);
+    font-weight: 700;
+    align-self: flex-start;
+    margin-top: 36px;
+    margin-left: 56px;
+
+    .logo-img {
+      height: 50px;
+      width: auto;
+      margin-right: 16px;
+    }
+  }
+
+.login {
+  width: 434px;
+  height: 420px;
+  background: #F6F6F6;
+  border-radius: 20px;
+  flex-y(flex-start);
+  position: absolute;
+  top: 50%;
+  transform: translateY(-50%);
+  right: 10%;
+  padding-top: 35px;
+
+  .el-checkbox__label {
+    font-size: 14px;
+  }
+
+  .title {
+    flex-x(center, center);
+    word(24px, #333);
+    font-weight: 700;
+
+    .logo-img {
+      height: 30px;
+      width: auto;
+      margin-right: 8px;
+    }
+  }
+
+  .tip{
+    width: 360px;
+    margin-top: 50px;
+    word(14px, #333);
+    font-weight: 700;
+  }
+
+  ul {
+    width: 360px;
+  }
+
+  h1 {
+    font-size: 24px;
+    margin-bottom: 20px;
+  }
+
+  li {
+    height: 40px;
+    line-height: 40px;
+    margin-top: 24px;
+    // 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;
+      width: 100%;
+      outline: none;
+      border: 1px solid #C2C6CE;
+      border-radius: 4px;
+      padding: 0 12px;
+      word(14px, #333);
+    }
+    .btn {
+        width: 200px;
+        height: 40px;
+        border-radius: 3px;
+        background: #4876FF;
+        word(14px, #FFF);
+        flex-x(center);
+        margin-left: 15px;
+      }
+  }
+
+  .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: 14px;
+    font-weight: 700;
+    width: 360px;
+    margin-top: 50px;
+    border-radius: 4px;
+  }
+
+  .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;
+}
+.bah{
+  position: absolute;
+  bottom: 16px;
+  word(14px, #333);
+  cursor: pointer;
+}
+</style>

+ 463 - 0
src/view/Main.vue

@@ -0,0 +1,463 @@
+<template>
+  <div id="app-wrap">
+    <el-container>
+      <el-aside
+        width="224px"
+        class="aside"
+        style="background: linear-gradient(180deg, #EEF9F0 0%, #E2F5FA 100%)"
+      >
+        <div class="top">
+          <img :src="logo" class="logo-img" alt="" />
+
+          <span class="logo">全养家居</span>
+        </div>
+        <el-menu
+          class="menu-box"
+          background-color="transparent"
+          text-color="#333"
+          active-text-color="#FF7E90"
+          :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.path, 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.path, 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].path, 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-container>
+        <el-header class="el-head" height="60px">
+          <div>
+            <div class="username">{{ userInfo.username[0] }}</div>
+            <div class="logout" @click="logoutModal">退出</div>
+          </div>
+        </el-header>
+        <el-main>
+          <div class="detail">
+            <keep-alive :include="getKeepAliveList">
+              <router-view />
+            </keep-alive>
+          </div>
+        </el-main>
+      </el-container>
+    </el-container>
+    <!-- </el-container> -->
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import { mapGetters, mapMutations } from 'vuex';
+import { themeColor, logo } from '../config';
+export default {
+  name: '',
+  data() {
+    return {
+      // logo: '',
+      // defaultImg: this.$Public.defaultImg,
+      defaultImg: null,
+      unique: true,
+      menuList: [], // 菜单列表
+      themeColor: themeColor,
+      logo: logo,
+      menuList1: [
+        // 开发菜单列表
+        {
+          mid: '1',
+          name: '报修',
+          list: [
+            {
+              index: '1-1',
+              name: '报修',
+              nav: 'repairManage',
+              router: '/repair-manage'
+            }
+          ]
+        },
+        {
+          mid: '2',
+          name: '用户',
+          list: [
+            {
+              index: '2-1',
+              name: '用户列表',
+              nav: 'userManage',
+              router: '/user-manage'
+            },
+            {
+              index: '2-2',
+              name: '维修员列表',
+              nav: 'maintenance',
+              router: '/maintenance'
+            }
+          ]
+        },
+        {
+          mid: '3',
+          name: '小区',
+          list: [
+            {
+              index: '3-1',
+              name: '小区管理',
+              nav: 'homeManage',
+              router: '/home-manage'
+            }
+          ]
+        },
+        {
+          mid: '4',
+          name: '账号管理',
+          list: [
+            {
+              index: '4-1',
+              name: '权限组',
+              nav: 'powerManage',
+              router: '/power-manage'
+            },
+            {
+              index: '4-2',
+              name: '账号管理',
+              nav: 'accountManage',
+              router: '/account-manage'
+            }
+          ]
+        }
+      ]
+    };
+  },
+  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.managerMenu)
+        .then(
+          (res) => {
+            // this.menuList = res.list;
+            this.menuList = res.list.map(item => {
+              return {
+                ...item.first,
+                isFirst: 1,
+                list: item.sub
+              }
+            });
+            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 <script this.menuList.length; i++) {
+      //   currentMenu = this.menuList[i].list.find((item) => {
+      //     return item.path === 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);
+    },
+    logoutModal(){
+      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.logout();
+      });
+    },
+    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: #EEF9F0;
+  flex-x(center, center);
+  // padding: 0 65px;
+  color: white;
+  // margin: 15px 0;
+  height: 60px;
+
+  .logo {
+    word(24, #333);
+    font-weight: 700;
+  }
+
+  .logo-img {
+    height: 30px;
+    width: auto;
+    margin-right: 5px;
+  }
+}
+
+.menu-title {
+  font-size: 14px;
+  border-radius: 8px;
+  padding-left: 36px;
+  &.active-nav{
+    background: #B5E6D1;
+    box-sizing: border-box;
+    border: 1px solid ;
+    border-image: linear-gradient(173deg, #D4F4E6 12%, #B0DBC8 80%) 1;
+    box-shadow: 0px 1px 8px 0px rgba(36, 118, 90, 0.24);
+  }
+
+  span {
+    font-size: 14px;
+  }
+}
+
+.aside {
+  background: #fff;
+  box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.14);
+  // box-shadow: 2px 0px 4px 0px rgba(210, 210, 210, 0.5);
+}
+
+h1 {
+  color: white;
+  font-weight: bold;
+  margin: 20px 50px;
+}
+
+.el-head {
+  background: #EEF9F0;
+  flex-x(flex-end);
+  box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.05);
+  // box-shadow: inset 0px -1px 0px 0px rgba(239, 239, 239, 0.5);
+  position: relative;
+  z-index: 1;
+
+  >div {
+    flex-x(flex-end);
+
+    .username {
+      width: 28px;
+      height: 28px;
+      background: #4876FF;
+      flex-x(center);
+      border-radius: 14px;
+      word(14px, #fff);
+      font-weight: 700;
+      margin-right: 10px;
+    }
+
+    .logout {
+      width: 80px;
+      height: 24px;
+      box-sizing: border-box;
+      border: 1px solid #E8E8E8;
+      border-radius: 4px;
+      flex-x(center);
+      word(12px, #666);
+      cursor: pointer;
+      background: #f6f6f6;
+
+      &:hover {
+        background: #f6f6f6;
+      }
+    }
+  }
+}
+
+.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;
+  background: unset !important;
+  padding-left: 70px !important;
+}
+
+.el-menu-item, >>>.el-submenu__title {
+  height: 40px;
+  line-height: 40px;
+  background: unset !important;
+  .el-submenu__icon-arrow{
+    right: 35px;
+  }
+}
+
+.el-main {
+  background: bk;
+  padding: 0;
+}
+
+.active-nav {
+  color: #FF7E90;
+
+  // background: #EAEFFF;
+  // border-radius: 8px;
+  // padding-left: 12px;
+  // padding-right: 16px;
+  // box-sizing: border-box;
+  i {
+    color: #FF7E90;
+  }
+}
+</style>

+ 458 - 0
src/view/article/case-manage.vue

@@ -0,0 +1,458 @@
+<template>
+  <div class="banner-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="btn" @click="handleCaseModal('add')">+ 添加</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="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="title"
+            align="center"
+            label="文章标题"
+          ></el-table-column>
+          <el-table-column
+            prop="link"
+            align="center"
+            label="文章链接"
+          ></el-table-column>
+          <el-table-column
+            prop="created"
+            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" width="180">
+            <div slot-scope="scope" style="display: flex">
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="handleCaseModal('edit', scope.row)"
+                >
+                  编辑
+                </button>
+              </div>
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="deleteCase(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="addCaseShow"
+      class="dialog"
+      width="560px"
+      top="25vh"
+    >
+      <div slot="title" class="dialog-title">
+        {{ type === "add" ? "发布" : "编辑" }}
+      </div>
+      <el-form
+        ref="form"
+        :rules="rules"
+        :model="addCaseForm"
+        class="banner-form"
+        label-width="auto"
+      >
+        <el-form-item class="img_item" prop="pic" label="图片:">
+          <div class="addImg">
+            <p class="tips">推荐大小710px*320px</p>
+            <div class="img-box">
+              <img ref="img" :src="addCaseForm.pic" v-if="addCaseForm.pic" />
+              <div class="icon" v-else>
+                <p><i class="el-icon-plus" style="font-size: 24px"></i></p>
+                <p>图片</p>
+                <p class="tip">支持扩展名:.jpg .png</p>
+              </div>
+              <input
+                type="file"
+                class="file"
+                ref="inputImg"
+                @change="addChangeImg"
+              />
+            </div>
+          </div>
+        </el-form-item>
+        <el-form-item label="标题:" prop="link" class="form-item">
+          <el-input
+            size="mini"
+            placeholder="请输入文章标题"
+            class="add-renovation-input"
+            v-model="addCaseForm.title"
+            style="width: 254px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="输入文章链接:" prop="link" class="form-item">
+          <el-input
+            size="mini"
+            placeholder="请输入公众号链接"
+            class="add-renovation-input"
+            v-model="addCaseForm.link"
+            style="width: 254px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="排序:" prop="sort" class="form-item">
+          <el-input
+            size="mini"
+            placeholder="请输入序号"
+            class="add-renovation-input"
+            style="width: 160px"
+            v-model.number="addCaseForm.orderBy"
+            type="number"
+            onkeypress="return( /[\d]/.test(String.fromCharCode(event.keyCode)))"
+          ></el-input>
+          <div class="sort-tip">数值越大,排序越靠前</div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button class="cancel-btn btn" @click="addCaseShow = false"
+          >取 消</el-button
+        >
+        <el-button class="confirm-btn btn" @click="handleBanner"
+          >确 定</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: '案例见证'
+      },
+      list: [], // 轮播列表
+      rules: {},
+      sortShow: false,
+      currentSort: 0,
+      addCaseForm: {
+        pic: '',
+        title: '',
+        link: '',
+        orderBy: null
+      },
+      addCaseShow: false,
+      id: null,
+      type: ''
+    };
+  },
+  mounted() {
+    // 获取列表
+    this.getCaseList();
+  },
+  computed: {},
+  methods: {
+    // 表格序号
+    tableIndex(index) {
+      return ++index;
+    },
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getCaseList();
+    },
+    // 获取轮播列表
+    getCaseList() {
+      this.loading++;
+      this.httpGet(this.$root.getCaseList, {
+        page: this.currentPage,
+        size: this.size
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 编辑轮播弹窗
+    handleCaseModal(type, rowData) {
+      this.type = type;
+      if (type === 'edit') {
+        this.id = rowData.id;
+        this.addCaseForm = {
+          pic: rowData.pic,
+          title: rowData.title,
+          link: rowData.link,
+          orderBy: rowData.orderBy
+        };
+      } else {
+        this.addCaseForm = {
+          pic: '',
+          title: '',
+          link: '',
+          orderBy: null
+        };
+        this.$refs.form && this.$refs.form.clearValidate();
+      }
+      this.addCaseShow = true;
+    },
+    // 删除轮播图
+    deleteCase(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.deleteCase, {
+          id
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getCaseList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    // 轮播
+    handleBanner() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          let url =
+            this.type === 'add'
+              ? this.$root.addCase
+              : this.$root.updateCase;
+          let method =
+            this.type === 'add'
+              ? 'httpPost'
+              : 'httpPut';
+          let inputData =
+            this.type === 'add'
+              ? {
+                  ...this.addCaseForm
+                }
+              : {
+                  ...this.addCaseForm,
+                  id: this.id
+                };
+          if(!inputData.orderBy)  inputData.orderBy = 0;
+          this.loading++;
+          this[method](url, inputData).then(
+            (res) => {
+              this.$message({
+                message: '操作成功',
+                type: 'success'
+              });
+              this.loading--;
+              this.addCaseShow = false;
+              this.getCaseList();
+            },
+            (res) => {
+              this.loading--;
+              this.$message.error(res);
+            }
+          );
+        }
+      });
+    },
+    changeSortModal() {
+      // this.sortShow = true;
+    },
+    // 图片改变
+    addChangeImg(e) {
+      this.upPic(e, (res) => {
+        this.$set(this.addCaseForm, '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) => {}
+      );
+    },
+    saveSort() {}
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.banner-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: 0 20px 20px;
+
+    // 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 30px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin-bottom: 16px;
+        // margin: 16px 0;
+      }
+
+      .tip {
+        margin-left: 32px;
+        color: #40B98F;
+      }
+
+      // 表格按钮
+      .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;
+    }
+  }
+
+  .banner-form {
+    margin-top: 16px;
+    margin-bottom: 80px;
+    padding-left: 60px;
+
+    .sort-tip {
+      word(14px, #c8c8c8);
+      line-height: 20px;
+    }
+  }
+}
+</style>

+ 457 - 0
src/view/article/information-release.vue

@@ -0,0 +1,457 @@
+<template>
+  <div class="banner-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="btn" @click="handleMessageModal('add')">+ 添加</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="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="title"
+            align="center"
+            label="文章标题"
+          ></el-table-column>
+          <el-table-column
+            prop="link"
+            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" width="180">
+            <div slot-scope="scope" style="display: flex">
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="handleMessageModal('edit', scope.row)"
+                >
+                  编辑
+                </button>
+              </div>
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="deleteMessage(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="addMessageShow"
+      class="dialog"
+      width="560px"
+      top="25vh"
+    >
+      <div slot="title" class="dialog-title">
+        {{ type === "add" ? "发布" : "编辑" }}
+      </div>
+      <el-form
+        ref="form"
+        :rules="rules"
+        :model="addMessageForm"
+        class="banner-form"
+        label-width="auto"
+      >
+        <el-form-item class="img_item" prop="pic" label="图片:">
+          <div class="addImg">
+            <p class="tips">推荐大小710px*320px</p>
+            <div class="img-box">
+              <img
+                ref="img"
+                :src="addMessageForm.pic"
+                v-if="addMessageForm.pic"
+              />
+              <div class="icon" v-else>
+                <p><i class="el-icon-plus" style="font-size: 24px"></i></p>
+                <p>图片</p>
+                <p class="tip">支持扩展名:.jpg .png</p>
+              </div>
+              <input
+                type="file"
+                class="file"
+                ref="inputImg"
+                @change="addChangeImg"
+              />
+            </div>
+          </div>
+        </el-form-item>
+        <el-form-item label="标题:" prop="link" class="form-item">
+          <el-input
+            size="mini"
+            placeholder="请输入文章标题"
+            class="add-renovation-input"
+            v-model="addMessageForm.title"
+            style="width: 254px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="输入文章链接:" prop="link" class="form-item">
+          <el-input
+            size="mini"
+            placeholder="请输入公众号链接"
+            class="add-renovation-input"
+            v-model="addMessageForm.link"
+            style="width: 254px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="排序:" prop="sort" class="form-item">
+          <el-input
+            size="mini"
+            placeholder="请输入序号"
+            class="add-renovation-input"
+            style="width: 160px"
+            v-model.number="addMessageForm.orderBy"
+            type="number"
+            onkeypress="return( /[\d]/.test(String.fromCharCode(event.keyCode)))"
+          ></el-input>
+          <div class="sort-tip">数值越大,排序越靠前</div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button class="cancel-btn btn" @click="addMessageShow = false"
+          >取 消</el-button
+        >
+        <el-button class="confirm-btn btn" @click="handleBanner"
+          >确 定</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: '信息发布'
+      },
+      list: [], // 轮播列表
+      rules: {},
+      sortShow: false,
+      currentSort: 0,
+      addMessageForm: {
+        pic: '',
+        title: '',
+        link: '',
+        orderBy: null
+      },
+      addMessageShow: false,
+      id: null,
+      type: ''
+    };
+  },
+  mounted() {
+    // 获取列表
+    this.getMessageList();
+  },
+  computed: {},
+  methods: {
+    // 表格序号
+    tableIndex(index) {
+      return ++index;
+    },
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getMessageList();
+    },
+    // 获取轮播列表
+    getMessageList() {
+      this.loading++;
+      this.httpGet(this.$root.getMessageList, {
+        page: this.currentPage,
+        size: this.size
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 编辑轮播弹窗
+    handleMessageModal(type, rowData) {
+      this.type = type;
+      if (type === 'edit') {
+        this.id = rowData.id;
+        this.addMessageForm = {
+          pic: rowData.pic,
+          title: rowData.title,
+          link: rowData.link,
+          orderBy: rowData.orderBy
+        };
+      } else {
+        this.addMessageForm = {
+          pic: '',
+          title: '',
+          link: '',
+          orderBy: null
+        };
+        this.$refs.form && this.$refs.form.clearValidate();
+      }
+      this.addMessageShow = true;
+    },
+    // 删除轮播图
+    deleteMessage(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.getMessageList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    // 轮播
+    handleBanner() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          let url =
+            this.type === 'add'
+              ? this.$root.addMessage
+              : this.$root.updateMessage;
+          let method =
+            this.type === 'add'
+              ? 'httpPost'
+              : 'httpPut';
+          let inputData =
+            this.type === 'add'
+              ? {
+                  ...this.addMessageForm
+                }
+              : {
+                  ...this.addMessageForm,
+                  id: this.id
+                };
+                if(!inputData.orderBy)  inputData.orderBy = 0;
+          this.loading++;
+          this[method](url, inputData).then(
+            (res) => {
+              this.$message({
+                message: '操作成功',
+                type: 'success'
+              });
+              this.loading--;
+              this.addMessageShow = false;
+              this.getMessageList();
+            },
+            (res) => {
+              this.loading--;
+              this.$message.error(res);
+            }
+          );
+        }
+      });
+    },
+    changeSortModal() {
+      // this.sortShow = true;
+    },
+    // 图片改变
+    addChangeImg(e) {
+      this.upPic(e, (res) => {
+        this.$set(this.addMessageForm, '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) => {}
+      );
+    },
+    saveSort() {}
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.banner-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: 0 20px 20px;
+
+    // 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 30px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin-bottom: 16px;
+        // margin: 16px 0;
+      }
+
+      .tip {
+        margin-left: 32px;
+        color: #40B98F;
+      }
+
+      // 表格按钮
+      .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;
+    }
+  }
+
+  .banner-form {
+    margin-top: 16px;
+    margin-bottom: 80px;
+    padding-left: 60px;
+
+    .sort-tip {
+      word(14px, #c8c8c8);
+      line-height: 20px;
+    }
+  }
+}
+</style>

+ 426 - 0
src/view/article/problem.vue

@@ -0,0 +1,426 @@
+<template>
+  <div class="banner-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="btn" @click="handleMessageModal('add')">+ 添加</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="title"
+            align="center"
+            label="文章标题"
+          ></el-table-column>
+          <el-table-column
+            prop="link"
+            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" width="180">
+            <div slot-scope="scope" style="display: flex">
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="handleMessageModal('edit', scope.row)"
+                >
+                  编辑
+                </button>
+              </div>
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="deleteProblem(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="addProblemShow"
+      class="dialog"
+      width="560px"
+      top="25vh"
+    >
+      <div slot="title" class="dialog-title">
+        {{ type === "add" ? "发布" : "编辑" }}
+      </div>
+      <el-form
+        ref="form"
+        :rules="rules"
+        :model="addProblemForm"
+        class="banner-form"
+        label-width="auto"
+      >
+        <el-form-item label="标题:" prop="link" class="form-item">
+          <el-input
+            size="mini"
+            placeholder="请输入文章标题"
+            class="add-renovation-input"
+            v-model="addProblemForm.title"
+            style="width: 254px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="输入文章链接:" prop="link" class="form-item">
+          <el-input
+            size="mini"
+            placeholder="请输入公众号链接"
+            class="add-renovation-input"
+            v-model="addProblemForm.link"
+            style="width: 254px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="排序:" prop="sort" class="form-item">
+          <el-input
+            size="mini"
+            placeholder="请输入序号"
+            class="add-renovation-input"
+            style="width: 160px"
+            v-model.number="addProblemForm.orderBy"
+            type="number"
+            onkeypress="return( /[\d]/.test(String.fromCharCode(event.keyCode)))"
+          ></el-input>
+          <div class="sort-tip">数值越大,排序越靠前</div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button class="cancel-btn btn" @click="addProblemShow = false"
+          >取 消</el-button
+        >
+        <el-button class="confirm-btn btn" @click="handleProblem"
+          >确 定</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: '常见问题'
+      },
+      list: [], // 轮播列表
+      rules: {},
+      sortShow: false,
+      currentSort: 0,
+      addProblemForm: {
+        title: '',
+        link: '',
+        orderBy: null
+      },
+      addProblemShow: false,
+      id: null,
+      type: ''
+    };
+  },
+  mounted() {
+    // 获取列表
+    this.getProblemList();
+  },
+  computed: {},
+  methods: {
+    // 表格序号
+    tableIndex(index) {
+      return ++index;
+    },
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getProblemList();
+    },
+    // 获取轮播列表
+    getProblemList() {
+      this.loading++;
+      this.httpGet(this.$root.getProblemList, {
+        page: this.currentPage,
+        size: this.size
+      }).then(
+        (res) => {
+          this.loading--;
+          this.list = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 编辑轮播弹窗
+    handleMessageModal(type, rowData) {
+      this.type = type;
+      if (type === 'edit') {
+        this.id = rowData.id;
+        this.addProblemForm = {
+          title: rowData.title,
+          link: rowData.link,
+          orderBy: rowData.orderBy
+        };
+      } else {
+        this.addProblemForm = {
+          title: '',
+          link: '',
+          orderBy: null
+        };
+        this.$refs.form && this.$refs.form.clearValidate();
+      }
+      this.addProblemShow = true;
+    },
+    // 删除轮播图
+    deleteProblem(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.deleteProblem, {
+          id
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getProblemList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    // 轮播
+    handleProblem() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          let url =
+            this.type === 'add'
+              ? this.$root.addProblem
+              : this.$root.updateProblem;
+          let method =
+            this.type === 'add'
+              ? 'httpPost'
+              : 'httpPut';
+          let inputData =
+            this.type === 'add'
+              ? {
+                  ...this.addProblemForm
+                }
+              : {
+                  ...this.addProblemForm,
+                  id: this.id
+                };
+                if(!inputData.orderBy)  inputData.orderBy = 0;
+          this.loading++;
+          this[method](url, inputData).then(
+            (res) => {
+              this.$message({
+                message: '操作成功',
+                type: 'success'
+              });
+              this.loading--;
+              this.addProblemShow = false;
+              this.getProblemList();
+            },
+            (res) => {
+              this.loading--;
+              this.$message.error(res);
+            }
+          );
+        }
+      });
+    },
+    changeSortModal() {
+      // this.sortShow = true;
+    },
+    // 图片改变
+    addChangeImg(e) {
+      this.upPic(e, (res) => {
+        this.$set(this.addProblemForm, '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) => {}
+      );
+    },
+    saveSort() {}
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.banner-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: 0 20px 20px;
+
+    // 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 30px;
+        height: 32px;
+        line-height: 32px;
+        confirm-btn();
+        font-size: 14px;
+        margin-bottom: 16px;
+        // margin: 16px 0;
+      }
+
+      .tip {
+        margin-left: 32px;
+        color: #40B98F;
+      }
+
+      // 表格按钮
+      .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;
+    }
+  }
+
+  .banner-form {
+    margin-top: 16px;
+    margin-bottom: 80px;
+    padding-left: 60px;
+
+    .sort-tip {
+      word(14px, #c8c8c8);
+      line-height: 20px;
+    }
+  }
+}
+</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>

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

@@ -0,0 +1,479 @@
+<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">线上售货-{{ statusMap[info.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">
+            <!-- <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 class="title" style="margin-top: 32px;">
+          线上售货信息
+        </div>
+        <div class="item">
+          <div class="label">主体类型:</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.shopPhone }}</div>
+        </div>
+        <div class="item item2">
+          <div class="label">商家营业执照:</div>
+          <div class="value">
+            <el-image
+              class="img"
+              :src="1"
+              fit="cover"
+              style="width: 255px;height: 143px;margin-right: 48px;"
+              :preview-src-list="[]"
+            >
+            </el-image>
+            <el-image
+              class="img"
+              :src="1"
+              fit="cover"
+              style="width: 255px;height: 143px;"
+              :preview-src-list="[]"
+            >
+            </el-image>
+          </div>
+        </div>
+        <div class="item">
+          <div class="label">收款账户名:</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.shopPhone }}</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">{{ statusMap[info.status] }}</div>
+        </div> -->
+      </div>
+    </div>
+    <div class="btn-box" v-if="info.status === 1">
+      <button class="cancel-btn" @click="handleReject">拒绝</button>
+      <button class="confirm-btn" @click="handleResolve">审核通过</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="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 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,
+      info: {},
+      rejectVisible: false,
+      remark: ''
+    };
+  },
+
+  mounted() {
+    this.id = +this.$route.query.id;
+    // 获取列表
+    this.getInfo();
+  },
+  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);
+        }
+      );
+    },
+    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);
+          }
+        );
+      });
+    }
+    // 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;
+        }
+
+        .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;
+  }
+}
+</style>

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

@@ -0,0 +1,533 @@
+<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.status"
+                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>
+          <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="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.status] }}
+            </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="handleReject(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="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 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
+      },
+      statusType: [
+        {
+          name: '全部',
+          value: 0
+        },
+        {
+          name: '待审核',
+          value: 1
+        },
+        {
+          name: '审核通过',
+          value: 2
+        },
+        {
+          name: '审核拒绝',
+          value: 3
+        }
+      ],
+      statusType2: [
+        {
+          name: '全部',
+          value: 0
+        },
+        {
+          name: '未开通',
+          value: 1
+        },
+        {
+          name: '待审核',
+          value: 2
+        },
+        {
+          name: '已开通',
+          value: 3
+        }
+      ],
+      statusMap: {
+        1: '待审核',
+        2: '审核通过',
+        3: '审核拒绝'
+      },
+      statusMap2: {
+        1: '未开通',
+        2: '待审核',
+        3: '已开通'
+      },
+      roleMap: {
+        0: '普通用户',
+        1: 'VIP',
+        2: '区级代理',
+        3: '市级代理',
+        4: '省级代理',
+        5: '运营中心',
+        6: '分公司'
+      },
+      list: [], // 用户列表
+      id: null,
+      rejectVisible: false,
+      remark: ''
+    };
+  },
+
+  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
+      };
+      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.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.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>

+ 398 - 0
src/view/classroom/article-category.vue

@@ -0,0 +1,398 @@
+<template>
+  <div class="banner-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <!-- 表格 -->
+        <div class="btn" @click="handleBannerModal('add')">+ 创建文章分类</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="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" width="180">
+            <div slot-scope="scope" style="display: flex">
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="handleBannerModal('edit', scope.row)"
+                >
+                  编辑
+                </button>
+              </div>
+              <div>
+                <button
+                  size="mini"
+                  class="table-btn"
+                  @click="deleteBanner(scope.row.id)"
+                >
+                  删除
+                </button>
+              </div>
+            </div>
+          </el-table-column>
+        </el-table>
+      </div>
+    </div>
+    <el-dialog
+      :visible.sync="addBannerShow"
+      class="dialog"
+      width="560px"
+      top="25vh"
+    >
+      <div slot="title" class="dialog-title">
+        {{ (type === "add" ? "发布" : "编辑") + "文章分类" }}
+      </div>
+      <el-form
+        ref="form"
+        :rules="rules"
+        :model="addBannerForm"
+        class="banner-form"
+        label-width="auto"
+      >
+        <el-form-item
+          label="分类名称:"
+          prop="link"
+          class="form-item"
+        >
+          <el-input
+            size="small"
+            placeholder="请输入分类名称"
+            class="add-renovation-input"
+            v-model="addBannerForm.name"
+            style="width: 254px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="排序:" prop="sort" class="form-item">
+          <el-input
+            size="small"
+            placeholder="请输入序号"
+            class="add-renovation-input"
+            style="width: 160px"
+            v-model.number="addBannerForm.orderBy"
+            type="number"
+            onkeypress="return( /[\d]/.test(String.fromCharCode(event.keyCode)))"
+          ></el-input>
+          <div class="sort-tip">数值越大,排序越靠前</div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button class="cancel-btn btn" @click="addBannerShow = false"
+          >取 消</el-button
+        >
+        <el-button class="confirm-btn btn" @click="handleBanner"
+          >确 定</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, // 加载中
+      title: {
+        // 页面标题
+        firstTitile: '商城设置',
+        secondTitle: '文章分类'
+      },
+      list: [], // 轮播列表
+      rules: {},
+      wayMap: {
+        1: '商品',
+        2: '文章',
+        3: '其他'
+      },
+      sortShow: false,
+      currentSort: 0,
+      addBannerForm: {
+        name: '',
+        orderBy: null
+      },
+      addBannerShow: false,
+      bannerId: null,
+      type: ''
+    };
+  },
+  mounted() {
+    // 获取列表
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 表格序号
+    tableIndex(index) {
+      return ++index;
+    },
+    // 获取轮播列表
+    getList() {
+      this.loading++;
+      this.httpGet(this.$root.getArticleCategoryList, {}).then(
+        (res) => {
+          this.loading--;
+          this.list = res;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 编辑轮播弹窗
+    handleBannerModal(type, rowData) {
+      this.type = type;
+      if (type === 'edit') {
+        this.bannerId = rowData.id;
+        this.addBannerForm = {
+          name: rowData.name,
+          orderBy: rowData.orderBy,
+        };
+      } else {
+        this.addBannerForm = {
+          name: '',
+          orderBy: null
+        };
+        this.$refs.form && this.$refs.form.clearValidate();
+      }
+      this.addBannerShow = true;
+    },
+    changeWay() {
+      this.addBannerForm.link = '';
+    },
+    // 删除轮播图
+    deleteBanner(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.deleteArticleCategory, {
+          id
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    // 轮播
+    handleBanner() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          let url =
+            this.type === 'add'
+              ? this.$root.addArticleCategory
+              : this.$root.updateArticleCategory;
+          let method =
+            this.type === 'add'
+              ? 'httpPost'
+              : 'httpPut';
+          let inputData =
+            this.type === 'add'
+              ? {
+                  ...this.addBannerForm
+                }
+              : {
+                  ...this.addBannerForm,
+                  id: this.bannerId
+                };
+          this.loading++;
+          this[method](url, inputData).then(
+            (res) => {
+              this.$message({
+                message: '操作成功',
+                type: 'success'
+              });
+              this.loading--;
+              this.addBannerShow = false;
+              this.getList();
+            },
+            (res) => {
+              this.loading--;
+              this.$message.error(res);
+            }
+          );
+        }
+      });
+    },
+    changeSortModal() {
+      // this.sortShow = true;
+    },
+    // 图片改变
+    addChangeImg(e) {
+      this.upPic(e, (res) => {
+        this.$set(this.addBannerForm, '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) => {}
+      );
+    },
+    saveSort() {}
+  }
+};
+</script>
+<style lang="stylus" rel="stylesheet/stylus">
+@import '~assets/public.styl';
+</style>
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.banner-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 {
+        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;
+    }
+  }
+
+  .banner-form {
+    margin-top: 16px;
+    // margin-bottom: 80px;
+    padding-left: 80px;
+
+    .sort-tip {
+      word(14px, #c8c8c8);
+      line-height: 20px;
+    }
+  }
+}
+</style>

+ 412 - 0
src/view/classroom/article-detail.vue

@@ -0,0 +1,412 @@
+<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="form"
+            class="good-form base-info-form"
+            label-width="auto"
+          >
+            <el-form-item label="文章标题" prop="name" class="form-item">
+              <el-input
+                placeholder="请输入文章名称"
+                v-model="form.title"
+                class="good-input"
+              ></el-input>
+            </el-form-item>
+            <el-form-item
+              label="关联分类"
+              prop="secondSortId"
+              class="form-item"
+            >
+              <el-select
+                v-model.number="form.sortId"
+                placeholder="全部"
+                class="input"
+              >
+                <el-option
+                  v-for="item in categoryList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                >
+                </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="form.pic"
+                />
+              </div>
+            </el-form-item>
+            <!-- <el-form-item label="宣传语" prop="tagline" class="form-item">
+              <el-input
+                placeholder="商品备注/副标题"
+                v-model="form.tagline"
+                class="good-input"
+              ></el-input>
+              <span class="tip">商品描述不要超过四十个字</span>
+            </el-form-item> -->
+            <el-form-item label="排序" prop="orderBy" class="form-item">
+              <el-input
+                placeholder="请输入"
+                v-model.number="form.orderBy"
+                class="good-input"
+                style="width: 185px"
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item label="文章内容" prop="content" class="form-item">
+              <WangEditor
+                :text="form.content"
+                class="text"
+                @change="changeText"
+              />
+            </el-form-item>
+          </el-form>
+        </div>
+        <div class="btn-box">
+          <button class="cancel-btn" @click="handleCancel">取消</button>
+          <button class="confirm-btn" @click="handleConfirm">保存</button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+import imgUpLoader from '../../components/goods/imgUpLoader';
+import WangEditor from '../../components/common/wang-edit';
+export default {
+  components: { Header, imgUpLoader, WangEditor },
+  name: 'goods-lock',
+  data() {
+    return {
+      loading: 0,
+      title: {
+        // 页面标题
+        firstTitile: '商品管理',
+        secondTitle: '云课堂文章管理'
+      },
+      rules: {},
+      id: null,
+      form: {
+        title: '',
+        tagline: '',
+        pic: '',
+        orderBy: null,
+        sortId: null,
+        content: ''
+      },
+      categoryList: []
+    };
+  },
+  computed: {},
+  async mounted() {
+    // this.getBusinessList();
+    await this.getCategoryList();
+    // this.getFreightList();
+    let query = this.$route.query;
+    if (query && query.id) {
+      this.id = +query.id;
+      this.getDetail();
+    }
+  },
+  methods: {
+    // 获取商品信息
+    getDetail() {
+      this.loading++;
+      this.httpGet(this.$root.getArticleInfo, { id: this.id }).then(
+        (res) => {
+          this.loading--;
+          let form = {};
+          for(let key in this.form){
+            form[key] = res[key];
+          };
+          this.form = form;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 获取分类列表
+    getCategoryList() {
+      this.loading++;
+      this.httpGet(this.$root.getArticleCategoryList, {}).then(
+        (res) => {
+          this.loading--;
+          this.categoryList = res;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    changeText(val) {
+        // 文本更改
+        this.form.content = val;
+    },
+    getMasterImgList(index, val) {
+      if (val === '') {
+        // slideshow.splice(index, 1);
+        this.form.pic = '';
+      } else {
+        this.form.pic = val;
+      }
+      this.$refs.form.clearValidate(['masterPic']);
+    },
+    handleCancel(){
+
+    },
+    handleConfirm() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.addGood();
+        } else {
+          this.$message({
+            message: '请填写文章信息',
+            type: 'warning'
+          });
+        }
+      });
+    },
+    // 添加商品
+    addGood() {
+      // 请求数据
+      let inputData = {
+        ...this.form
+      };
+      // inputData.spu.freight = 1;
+      // 是否为编辑商品
+      let method = 'httpPost';
+      if (this.id) {
+        method = 'httpPut';
+        inputData.id = this.id;
+      }
+      this.loading++;
+      this[method](
+        this.id ? this.$root.updateArticle : this.$root.addArticle, // 添加商品 or 创建商品
+        inputData
+      ).then(
+        (res) => {
+          this.$message({
+            message: this.gid ? '文章修改成功' : '文章创建成功',
+            type: 'success'
+          });
+          this.loading--;
+          this.$router.push({
+            name: 'article'
+          });
+        },
+        (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';
+
+.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 {
+        background: white;
+        padding: 10px 0;
+        margin-bottom: 10px;
+        .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 {
+        // margin-bottom: 10px;
+        background: white;
+
+        .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;
+          }
+        }
+
+        .row{
+          flex-x(flex-start);
+          .item{
+            height: 66px;
+            flex-x(flex-start);
+            .label{
+              width: 200px;
+              margin-right: 36px;
+              text-align: right;
+            }
+          }
+        }
+      }
+
+      .good-detail {
+        padding-bottom: 50px;
+      }
+    }
+  }
+
+  .btn-box {
+    background: white;
+    width: 100%;
+    flex-x(center);
+    height: 100px !important;
+    flex-shrink: 0;
+    // 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>

+ 492 - 0
src/view/classroom/article.vue

@@ -0,0 +1,492 @@
+<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">
+              <p class="label">文章分类:</p>
+              <el-select
+                v-model="filter.sortId"
+                placeholder="全部"
+                size="small"
+                class="input"
+                style="margin: 0 10px"
+              >
+                <el-option
+                  v-for="item in categoryList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                >
+                </el-option>
+              </el-select>
+            </div>
+            <div class="btn-box">
+              <button class="search" @click="search">筛选</button>
+              <button class="reset" @click="reset">重置</button>
+            </div>
+          </div>
+          <div class="btn" @click="toDetail('add')" style="margin: 0;">
+            + 创建文章
+          </div>
+        </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="title"
+            align="center"
+            label="文章标题"
+          ></el-table-column>
+          <el-table-column
+            prop="sortName"
+            align="center"
+            label="所属分类"
+          ></el-table-column>
+          <el-table-column
+            prop="orderBy"
+            align="center"
+            label="排序"
+          ></el-table-column>
+          <el-table-column
+            prop="created"
+            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="toDetail('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: {
+        title: '',
+        pic: '',
+        orderBy: null,
+        sortId: null,
+        content: ''
+      },
+      addShow: false,
+      businessId: null,
+      type: '',
+      systemList: [],
+      filter: {},
+      categoryList: []
+    };
+  },
+  mounted() {
+    // 获取列表
+    this.getCategoryList();
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 表格序号
+    tableIndex(index) {
+      return ++index;
+    },
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    // 获取列表
+    getList() {
+      this.loading++;
+      this.httpGet(this.$root.getArticleList, {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      }).then(
+        (res) => {
+          this.loading--;
+          this.businessList = res.list;
+          this.total = res.total;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    getCategoryList() {
+      this.loading++;
+      this.httpGet(this.$root.getArticleCategoryList, {}).then(
+        (res) => {
+          this.loading--;
+          this.categoryList = res;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    updateNoDeliver(id) {
+      this.$router.push({
+        name: 'noDeliver',
+        query: {
+          id
+        }
+      });
+    },
+    // 过滤
+    search() {
+      console.log(this.filter);
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        sortId: null
+      };
+      this.date = [];
+      this.getList();
+    },
+    toDetail(type, row = {}){
+      this.$router.push({
+        name: 'articleDetail',
+        query: { id: row.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.deleteArticle, {
+          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;
+
+      .filter-box{
+        width: 100%;
+        flex-x();
+      }
+
+      // 按钮
+      .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>

+ 225 - 0
src/view/classroom/poster.vue

@@ -0,0 +1,225 @@
+<template>
+  <div class="share-setting-box" v-loading="loading > 0">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <div class="title">云课堂海报设置</div>
+        <el-form
+          :model="configure"
+          label-width="110px"
+          label-position="right"
+          :rules="rules"
+          ref="form"
+          class="configure-form"
+        >
+          <el-form-item class="img_item" prop="pic" label="海报图:">
+            <div class="addImg">
+              <p class="tips">推荐大小750px*280px</p>
+              <div class="img-box">
+                <img ref="img" class="img" :src="configure.pic" v-if="configure.pic" />
+                <div class="icon" v-else>
+                  <p><i class="el-icon-plus" style="font-size: 24px"></i></p>
+                  <p>图片</p>
+                  <p class="tip">支持扩展名:.jpg .png</p>
+                </div>
+                <input
+                  type="file"
+                  class="file"
+                  ref="inputImg"
+                  @change="addChangeImg"
+                />
+              </div>
+            </div>
+          </el-form-item>
+          <!-- <el-form-item label="分享宣传语:" prop="slogan" class="form-item">
+            <el-input
+              size="small"
+              placeholder="请输入分享宣传语"
+              class="input"
+              v-model="configure.slogan"
+              style="width: 270px"
+            ></el-input>
+          </el-form-item> -->
+        </el-form>
+        <div class="btn-box">
+          <button class="btn" @click="handleShare">保存设置</button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+export default {
+  components: {
+    Header
+  },
+  name: 'share-setting',
+  data() {
+    return {
+      title: {
+        // 页面标题
+        firstTitile: '商城设置',
+        secondTitle: '分享设置'
+      },
+      configure: {
+        pic: '',
+      },
+      rules: {},
+      loading: 0
+    };
+  },
+  mounted() {
+    this.getShareInfo();
+  },
+  computed: {},
+  methods: {
+    // 获取分享详情
+    getShareInfo() {
+      this.loading++;
+      this.httpGet(this.$root.getPosterInfo, {}).then(
+        (res) => {
+          this.loading--;
+          this.configure = {
+            pic: res.pic,
+          };
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 保存修改
+    handleShare() {
+      this.loading++;
+      this.httpPut(this.$root.updatePoster, this.configure).then(
+        (res) => {
+          this.loading--;
+          this.$message({
+            message: '操作成功',
+            type: 'success'
+          });
+          this.getShareInfo();
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 图片改变
+    addChangeImg(e) {
+      this.upPic(e, (res) => {
+        this.$set(this.configure, 'pic', res);
+        // 清空input value,解决重复图片不触发change
+        this.$refs.img.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';
+
+.share-setting-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;
+      border-radius: 2px;
+
+      .title {
+        word(20px, #404157);
+        font-weight: 550;
+      }
+
+      .configure-form {
+        margin: 50px 80px 0;
+
+        .input {
+          width: 150px;
+        }
+      }
+
+      .tip {
+        word(15, #EA0000);
+        margin-top: 24px;
+        margin-left: 80px;
+      }
+
+      .btn-box {
+        .btn {
+          confirm-btn();
+          width: 145px;
+          height: 32px;
+          margin-top: 24px;
+          margin-left: 190px;
+        }
+      }
+
+      .addImg {
+        .tips {
+          // margin-bottom: 12px;
+          line-height: 40px;
+        }
+
+        .icon {
+          width: 375px;
+          height: 140px;
+        }
+
+        .img {
+          width: 375px;
+          height: auto;
+        }
+
+        p {
+          margin: 0;
+        }
+
+        .tip {
+          color: gray9;
+        }
+      }
+    }
+  }
+}
+</style>

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

@@ -0,0 +1,488 @@
+<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">商家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.name"
+            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">APPID</div>
+          <el-input
+            class="input"
+            v-model="form.appid"
+            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>
+          <el-input
+            class="input"
+            v-model="form.spName"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">服务商商户号</div>
+          <el-input
+            class="input"
+            v-model="form.spMid"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">商户私钥</div>
+          <div class="input file" v-if="form.keyFileName">
+            <div class="file-name">
+              {{ form.keyFileName || "" }}
+            </div>
+            <div class="btn-box">
+              <!-- <div class="btn">查看</div> -->
+              <div class="btn" @click="deleteFile('keyFileName')">删除</div>
+            </div>
+          </div>
+          <div class="input upload" v-else>
+            添加附件
+            <input
+              type="file"
+              class="upload-input"
+              ref="input"
+              @change="
+                (e) => {
+                  handleUpload(e, 'keyFileName');
+                }
+              "
+            />
+          </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" @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.serviceRate"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">接收服务费商户全称</div>
+          <el-input
+            class="input"
+            v-model="form.ServiceName"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">接收服务费商户号</div>
+          <el-input
+            class="input"
+            v-model="form.ServiceMid"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">结算周期</div>
+          <el-input
+            class="input"
+            v-model="form.interval"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">备注1</div>
+          <el-input
+            class="input"
+            v-model="form.baseRate"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">备注2</div>
+          <el-input
+            class="input"
+            v-model="form.chargeRate"
+            placeholder="点击输入信息"
+          ></el-input>
+        </div>
+        <div class="item">
+          <div class="label">备注3</div>
+          <!-- <el-input
+            class="input"
+            v-model="form.baseTime"
+            placeholder="点击输入信息"
+          ></el-input> -->
+          <el-date-picker
+            class="input"
+            v-model="form.baseTime"
+            type="datetime"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            placeholder="选择日期时间"
+          >
+          </el-date-picker>
+        </div>
+        <div class="item">
+          <div class="label">短信验证码</div>
+          <el-input
+            class="input"
+            v-model="smsCode"
+            placeholder="点击输入短信验证码"
+          ></el-input>
+          <div class="btn" @click="sendSms">获取短信验证码</div>
+        </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: '',
+        keyName: '',
+        certName: '',
+        spiltName: '',
+        appid: '',
+        spName: '',
+        spMid: '',
+        keyFileName: '',
+        serviceRate: null,
+        ServiceName: '',
+        ServiceMid: '',
+        interval: null,
+        baseRate: null,
+        chargeRate: null,
+        baseTime: ''
+      },
+      smsCode: '',
+      fileName: '',
+      modeList: [
+        {
+          name: '微信小程序支付',
+          value: 'wxPayMini'
+        }
+      ]
+    };
+  },
+
+  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.serviceRate = +this.form.serviceRate;
+      this.form.interval = +this.form.interval;
+      this.form.baseRate = +this.form.baseRate;
+      this.form.chargeRate = +this.form.chargeRate;
+      this.httpPost(this.$root.createPay, {
+        merchantInfo: this.form,
+        smsCode: this.smsCode
+      }).then(
+        (res) => {
+          this.loading--;
+          this.$router.push({
+            name: 'payRecord'
+          });
+          this.$message.success('操作成功');
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+
+    sendSms() {
+      this.httpPost(this.$root.sendSms, {
+        type: 11,
+        phone: '15263815818'
+      }).then(
+        (res) => {
+          this.loading--;
+          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;
+        }
+
+        .btn {
+          width: 110px;
+          height: 32px;
+          border-radius: 3px;
+          background: #4876FF;
+          word(14px, #FFF);
+          flex-x(center);
+          margin-left: 15px;
+        }
+
+        .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, #fff);
+              cursor: pointer;
+              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>

+ 436 - 0
src/view/fund/area-assessment-detail.vue

@@ -0,0 +1,436 @@
+<template>
+  <div class="table-manage-box">
+    <Header :title="title"></Header>
+    <div class="container">
+      <div class="content">
+        <div class="sub_txt">
+          <div class="main_txt">基础信息</div>
+          <div class="info">
+            <div class="item">
+              <div class="txt">
+                <p class="label">用户ID:</p>
+                <p v-text="uidFormat(info.uid)"></p>
+              </div>
+              <div class="txt">
+                <p class="label">时段级别:</p>
+                <p v-text="periodLevelMap[info.periodLevel] || ''"></p>
+              </div>
+              <div class="txt">
+                <p class="label">市级代领:</p>
+                <p v-text="info.cityProxy === 1 ? '是' : '不是'"></p>
+              </div>
+            </div>
+            <div class="item">
+              <div class="txt">
+                <p class="label">省市区:</p>
+                <p v-text="getAddress()"></p>
+              </div>
+              <div class="txt">
+                <p class="label">区域级别:</p>
+                <p v-text="areaLevelMap[info.areaLevel] || ''"></p>
+              </div>
+              <div class="txt">
+                <p class="label">年度截至时间:</p>
+                <p v-text="info.yearEnd"></p>
+              </div>
+            </div>
+            <div class="item">
+              <div class="txt">
+                <p class="label">城市档位:</p>
+                <p v-text="cityLevelMap[info.cityLevel] || ''"></p>
+              </div>
+              <div class="txt">
+                <p class="label">记录创建时间:</p>
+                <p v-text="info.created"></p>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="sub_txt">
+          <div class="main_txt">统计信息</div>
+          <div class="info">
+            <div class="item">
+              <div class="txt">
+                <p class="label">奖励金额:</p>
+                <p v-text="info.amount"></p>
+              </div>
+              <div class="txt">
+                <p class="label">超出金额:</p>
+                <p v-text="info.overflowAmount"></p>
+              </div>
+              <div class="txt">
+                <p class="label">超额奖励金额:</p>
+                <p v-text="info.excessBonus"></p>
+              </div>
+            </div>
+            <div class="item">
+              <div class="txt">
+                <p class="label">奖励依据金额:</p>
+                <p v-text="info.rebateBasedAmount"></p>
+              </div>
+              <div class="txt">
+                <p class="label">免考核金额:</p>
+                <p v-text="info.noAssessmentAmount"></p>
+              </div>
+              <div class="txt">
+                <p class="label">收益比例:</p>
+                <p v-text="(+info.ratio || 0) * 100 + '%'"></p>
+              </div>
+            </div>
+            <div class="item">
+              <div class="txt">
+                <p class="label">考核金额:</p>
+                <p v-text="info.assessmentAmount"></p>
+              </div>
+              <div class="txt">
+                <p class="label">统计金额:</p>
+                <p v-text="info.sumAmount"></p>
+              </div>
+              <div class="txt">
+                <p class="label">超额收益比例:</p>
+                <p v-text="(+info.excessRatio || 0) * 100 + '%'"></p>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="sub_txt">
+          <div class="main_txt">发放信息</div>
+          <div class="info">
+            <div class="item">
+              <div class="txt">
+                <p class="label">月份序号:</p>
+                <p v-text="info.monthNum"></p>
+              </div>
+              <div class="txt">
+                <p class="label">是否第一个月:</p>
+                <p v-text="info.firstMonth === 1 ? '是' : '不是'"></p>
+              </div>
+              <div class="txt">
+                <p class="label">起始时间:</p>
+                <p v-text="info.begin"></p>
+              </div>
+              <div class="txt">
+                <p class="label">是否满足发放条件:</p>
+                <p v-text="info.released === 1 ? '是' : '否'"></p>
+              </div>
+            </div>
+            <div class="item">
+              <div class="txt">
+                <p class="label">季度序号:</p>
+                <p v-text="info.quarterNum"></p>
+              </div>
+              <div class="txt">
+                <p class="label">是否为补发:</p>
+                <p v-text="info.isMakeup === 1 ? '是' : '不是'"></p>
+              </div>
+              <div class="txt">
+                <p class="label">截止时间:</p>
+                <p v-text="info.end"></p>
+              </div>
+            </div>
+            <div class="item">
+              <div class="txt">
+                <p class="label">年份序号:</p>
+                <p v-text="info.yearNum"></p>
+              </div>
+              <div class="txt">
+                <p class="label">免考核:</p>
+                <p v-text="info.noAssessment === 1 ? '是' : '不是'"></p>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script type="text/ecmascript-6">
+import Header from '../../components/common/header';
+// let that;
+export default {
+  name: 'orderDetail',
+  components: { Header },
+  data() {
+    return {
+      title: {
+        // 页面标题
+        firstTitile: '资金管理',
+        secondTitle: '区域达标收益详情'
+      },
+      info: {},
+      periodLevelMap: {
+      1: '月度',
+      2: '季度',
+      3: '年度'
+      },
+      areaLevelMap: {
+        3: '市县级',
+        4: '市级'
+      },
+      cityLevelMap: {
+        10: '默认',
+        1: '一档',
+        2: '二挡'
+      },
+    };
+  },
+  filters: {},
+  async created() {
+    // that = this;
+    this.getInfo();
+    // this.getDictionary();
+  },
+  methods: {
+    getInfo() {
+      this.isLoading = true;
+      this.httpGet(this.$root.getAreaAssessmentList, {
+        id: +this.$route.query.id
+      }).then(
+        (res) => {
+          this.info = (res.list && res.list[0]) ? res.list[0] : {};
+          // this.skuList = res.skuList;
+          this.isLoading = false;
+        },
+        () => {
+          this.isLoading = false;
+        }
+      );
+    },
+    getDictionary(){
+      this.getDictionaryByName('role');
+    },
+    getDictionaryByName(dataName){
+      this.loading++;
+      this.httpGet(this.$root.getDictionaryByName, {
+        dataName
+      }).then(
+        (res) => {
+          this.loading--;
+          this[dataName] = res.list;
+          let obj = {};
+          res.list.forEach(item => {
+            obj[item.value] = item.labelName;
+          });
+          this[dataName + 'Map'] = obj;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    getAddress() {
+      return (
+        this.info.provinceStr +
+        this.info.cityStr +
+        this.info.countyStr
+      );
+    },
+    uidFormat(val) {
+      if (!val) return '-';
+      let str = val + '';
+      let length = 6 - str.length;
+      for (let i = 0; i < length; i++) {
+        str = '0' + str;
+      }
+      return 'QY' + str;
+    },
+  }
+};
+</script>
+
+<style lang="stylus" rel="stylesheet/stylus" scoped>
+@import '~assets/main.styl';
+
+.table-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: 0 20px 20px;
+
+  // content 表格
+  .content {
+    width: 100%;
+    font-size: 14px;
+    box-sizing: border-box;
+    border-radius: 2px;
+    flex-y(flex-start, flex-start);
+    background: #f5f5f5;
+  }
+}
+
+.screen {
+  width: calc(100% - 30px);
+  background: white;
+  padding: 30px 15px;
+  flex-x(flex-start);
+  margin-top: 0 !important;
+  margin-bottom: margin10;
+
+  .el-input {
+    width: 300px;
+    margin: 0 margin10;
+  }
+
+  p {
+    word(24px, btn-color);
+  }
+}
+
+.el-table {
+  width: calc(100% - 10px) !important;
+  margin-top: 10px;
+  border();
+  font-size: 12px;
+
+  img {
+    width: 60px;
+    height: 60px;
+  }
+
+  .el-icon-star-on {
+    color: yellow;
+  }
+}
+
+.footer {
+  width: calc(100% - 30px);
+  min-width: 600px;
+  padding: 10px 0 0 15px;
+  flex-x();
+
+  .el-button {
+    margin-left: 10px;
+  }
+}
+
+.divider {
+  background-color: bk;
+  width: 100%;
+  height: 2px;
+  margin: 10px 0;
+}
+
+.vertical {
+  flex-y();
+}
+
+.horizontal {
+  flex-x(flex-start, flex-start);
+}
+
+.price-box{
+  flex-y(flex-start, flex-end);
+  padding-bottom: 30px;
+  div{
+    flex-x();
+    margin-top: 20px;
+    word(16px, #333);
+  }
+}
+
+.order-detail {
+  flex: 1;
+  justify-content: flex-start;
+  align-items: flex-start;
+  min-height: 80px;
+}
+
+.sku {
+  height: 45px;
+  justify-content: space-around;
+  min-width: 900px;
+  border-bottom: solid 1px #dddddd;
+}
+
+.price {
+  align-self: flex-end;
+  // height: 30px;
+  margin-right: 30px;
+  margin-top: 10px;
+}
+
+.sub_txt {
+  color: #666666;
+  font-size: 14px;
+  width: 100%;
+  padding: 25px 15px 10px;
+  background: white;
+  margin-bottom: 10px;
+
+  .info{
+    flex-x(flex-start);
+    .item:nth-of-type(1){
+      margin-right: 100px;
+    }
+    .item:nth-of-type(2){
+      margin-right: 100px;
+    }
+    .item{
+      .label{
+        width: 150px;
+      }
+    }
+  }
+}
+
+.sub_txt1 {
+  color: #666666;
+  font-size: 14px;
+  width: 1000px;
+  padding-left: 60px;
+}
+
+.main_txt {
+  color: #101010;
+  font-size: 16px;
+  font-weight: bold;
+  margin-bottom: 20px;
+}
+
+.color_red {
+  color: btn-color;
+}
+
+.txt {
+  flex-x();
+  justify-content: flex-start;
+  margin: 3px;
+  line-height: 2;
+  padding-left: 60px;
+}
+
+.btn-box {
+    background: white;
+    width: 100%;
+    flex-x(center);
+    height: 100px !important;
+    flex-shrink: 0;
+    // 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>

+ 637 - 0
src/view/fund/area-assessment-pre.vue

@@ -0,0 +1,637 @@
+<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">
+              <p class="label">系统:</p>
+              <el-select
+                v-model="filter.sys"
+                placeholder="全部"
+                size="small"
+                class="input"
+                style="margin: 0 10px"
+              >
+                <el-option
+                  v-for="item in system"
+                  :key="item.value"
+                  :label="item.labelName"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div> -->
+
+            <div class="filter-item">
+              <p class="label">时段级别:</p>
+              <el-select
+                v-model="filter.periodLevel"
+                placeholder="全部"
+                size="small"
+                class="input"
+                style="margin: 0 10px"
+              >
+                <el-option label="全部" :value="0"> </el-option>
+                <el-option label="月度" :value="1"> </el-option>
+                <el-option label="季度" :value="2"> </el-option>
+                <el-option label="年度" :value="3"> </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <p class="label">时间段:</p>
+              <el-date-picker
+                style="margin: 0 10px"
+                size="small"
+                class="date-input"
+                v-model="date"
+                type="datetimerange"
+                align="right"
+                unlink-panels
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd HH:mm:ss"
+              >
+              </el-date-picker>
+            </div>
+
+            <!-- <div class="filter-item">
+              <el-input
+                class="input"
+                type="number"
+                v-model="filter.uid"
+                placeholder="用户id"
+                size="small"
+              >
+                <template slot="prepend"
+                  >QY</template
+                >
+              </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="begin"
+            align="center"
+            label="结算开始时间"
+          ></el-table-column>
+          <el-table-column
+            prop="end"
+            align="center"
+            label="结算结束时间"
+          ></el-table-column>
+          <el-table-column prop="periodLevel" align="center" label="时段级别">
+            <div slot-scope="scope">
+              {{ periodLevelMap[scope.row.periodLevel] }}
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="num"
+            align="center"
+            label="期数"
+          ></el-table-column>
+          <el-table-column prop="status" align="center" label="发放状态">
+            <div slot-scope="scope">
+              <div v-if="scope.row.status === 1" style="color: red;">
+                {{ statusMap[scope.row.status] }}
+              </div>
+              <div v-else>
+                {{ statusMap[scope.row.status] }}
+              </div>
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="sumAmount"
+            align="center"
+            label="本期总业绩"
+          ></el-table-column>
+          <el-table-column
+            prop="rebateBasedAmount"
+            align="center"
+            label="本期总核算"
+          ></el-table-column>
+          <el-table-column
+            prop="total"
+            align="center"
+            label="本次总发放"
+          ></el-table-column>
+          <el-table-column
+            prop="releaseTime"
+            align="center"
+            label="发放时间"
+          ></el-table-column>
+          <el-table-column
+            prop="method"
+            label="操作"
+            align="center"
+            width="160"
+          >
+            <template slot-scope="scope">
+              <el-button size="mini" @click="toRecord(scope.row)"
+                >查看明细
+              </el-button>
+              <el-button size="mini" v-if="scope.row.status === 1" @click="auditAreaAssessmentModal(scope.row.num)"
+                >发放
+              </el-button>
+            </template>
+          </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: {
+        begin: '',
+        end: '',
+        periodLevel: null
+      },
+      role: [
+        {
+          name: '全部',
+          id: -1
+        },
+        ...role
+      ],
+      roleMap: roleMap,
+      tabActive: 1,
+      statusType: [],
+      list: [], // 列表
+      date: [],
+      showProgressDialog: false,
+      progress: 0,
+      system: [],
+      systemMap: {},
+      typeList: [],
+      typeMap: {},
+      statusMap: {
+        0: '冻结中',
+        5: '已解冻'
+      },
+      periodLevelMap: {
+        1: '月度',
+        2: '季度',
+        3: '年度'
+      },
+      statusMap: {
+        1: '待发放',
+        2: '已发放'
+      },
+    };
+  },
+
+  mounted() {
+    // this.statusType = this.hzType;
+    // 获取列表
+    this.getList();
+    // this.getDictionary();
+    this.getFundTypeMap();
+  },
+  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.getAreaAssessmentSumList, {
+        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);
+        }
+      );
+    },
+    getFundTypeMap() {
+      this.loading++;
+      this.httpGet(this.$root.getFundTypeMap, {}).then(
+        (res) => {
+          this.loading--;
+          this.typeMap = res.balanceLog.voucher;
+          let list = [];
+          for(let key in this.typeMap){
+            list.push({
+              name: this.typeMap[key],
+              value: key
+            });
+          };
+          this.typeList = list;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    getDictionary(){
+      this.getDictionaryByName('system');
+    },
+    getDictionaryByName(dataName){
+      this.loading++;
+      this.httpGet(this.$root.getDictionaryByName, {
+        dataName
+      }).then(
+        (res) => {
+          this.loading--;
+          this[dataName] = res.list;
+          let obj = {};
+          res.list.forEach(item => {
+            obj[item.value] = item.labelName;
+          });
+          this[dataName + 'Map'] = obj;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        periodLevel: null,
+        begin: '',
+        end: ''
+      };
+      this.date = [];
+      this.getList();
+    },
+    uidFormat(val) {
+      if (!val) return '-';
+      let str = val + '';
+      let length = 6 - str.length;
+      for (let i = 0; i < length; i++) {
+        str = '0' + str;
+      }
+      return 'QY' + str;
+    },
+    toRecord(row){
+      this.$router.push({
+        name: 'areaAssessment',
+        query: { 
+          begin: row.begin,
+          end: row.end,
+          periodLevel: row.periodLevel,
+          num: row.num
+         }
+      });
+    },
+    auditAreaAssessmentModal(num){
+      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.auditAreaAssessment, {
+          // id
+          num
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    async order2excel() {
+      if(!(await this.exportLog())) return;
+      this.loading++;
+      let list = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      };
+      await this.httpGet(this.$root.getAreaAssessmentSumList, 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.getAreaAssessmentSumList, 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.begin,
+          结算结束时间: item.end,
+          时段级别: this.periodLevelMap[item.periodLevel],
+          期数: item.num,
+          发放状态: this.statusMap[item.status],
+          本期总业绩: +item.sumAmount,
+          本期总核算: +item.rebateBasedAmount,
+          本次总发放: +item.total,
+          发放时间: item.releaseTime
+        };
+        formatList.push(obj);
+      });
+      myUtils.json2excel(formatList);
+    },
+    exportLog(){
+      this.loading++;
+      return this.httpGet(this.$root.getAreaAssessmentSumList + '/export', {}).then(
+        (res) => {
+          this.loading--;
+          return true;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+          return false;
+        }
+      );
+    },
+  }
+};
+</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: 0 20px 20px;
+
+    // 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: 160px;
+      }
+
+      .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>

+ 844 - 0
src/view/fund/area-assessment.vue

@@ -0,0 +1,844 @@
+<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">
+              <p class="label">系统:</p>
+              <el-select
+                v-model="filter.sys"
+                placeholder="全部"
+                size="small"
+                class="input"
+                style="margin: 0 10px"
+              >
+                <el-option
+                  v-for="item in system"
+                  :key="item.value"
+                  :label="item.labelName"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div> -->
+
+            <div class="filter-item">
+              <p class="label">区域级别:</p>
+              <el-select
+                v-model="filter.areaLevel"
+                placeholder="全部"
+                size="small"
+                class="input"
+                style="margin: 0 10px"
+              >
+                <el-option label="全部" :value="0"> </el-option>
+                <el-option label="区县级" :value="3"> </el-option>
+                <el-option label="市级" :value="4"> </el-option>
+              </el-select>
+            </div>
+            <div class="filter-item">
+              <p class="label">城市档位:</p>
+              <el-select
+                v-model="filter.cityLevel"
+                placeholder="全部"
+                size="small"
+                class="input"
+                style="margin: 0 10px"
+              >
+                <el-option label="全部" :value="0"> </el-option>
+                <el-option label="默认" :value="10"> </el-option>
+                <el-option label="一级" :value="1"> </el-option>
+                <el-option label="二级" :value="2"> </el-option>
+              </el-select>
+            </div>
+            <!-- <div class="filter-item">
+              <p class="label">时段级别:</p>
+              <el-select
+                v-model="filter.periodLevel"
+                placeholder="全部"
+                size="small"
+                class="input"
+                style="margin: 0 10px"
+              >
+                <el-option label="全部" :value="0"> </el-option>
+                <el-option label="月度" :value="1"> </el-option>
+                <el-option label="季度" :value="2"> </el-option>
+                <el-option label="年度" :value="3"> </el-option>
+              </el-select>
+            </div> -->
+            <!-- <div class="filter-item">
+              <p class="label">变动时间段:</p>
+              <el-date-picker
+                style="margin: 0 5px"
+                size="small"
+                class="date-input"
+                v-model="date"
+                type="datetimerange"
+                align="right"
+                unlink-panels
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd HH:mm:ss"
+              >
+              </el-date-picker>
+            </div> -->
+
+            <div class="filter-item">
+              <!-- <div class="label">用户ID:</div> -->
+              <el-input
+                class="input"
+                type="number"
+                v-model="filter.uid"
+                placeholder="用户id"
+                size="small"
+              >
+                <template slot="prepend"
+                  >QY</template
+                >
+              </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: 30px"
+              @click="auditAreaAssessmentModal"
+            >
+              一键审核发放
+            </button>
+            <button class="search" @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="id"
+            align="center"
+            label="序号"
+          ></el-table-column>
+          <el-table-column prop="uid" align="center" label="用户ID">
+            <div slot-scope="scope">
+              {{ uidFormat(scope.row.uid) }}
+            </div>
+          </el-table-column>
+          <el-table-column prop="periodLevel" align="center" label="时段级别">
+            <div slot-scope="scope">
+              {{ periodLevelMap[scope.row.periodLevel] }}
+            </div>
+          </el-table-column>
+          <el-table-column prop="areaLevel" align="center" label="区域级别">
+            <div slot-scope="scope">
+              {{ areaLevelMap[scope.row.areaLevel] }}
+            </div>
+          </el-table-column>
+          <el-table-column prop="cityLevel" align="center" label="城市档位">
+            <div slot-scope="scope">
+              {{ cityLevelMap[scope.row.cityLevel] }}
+            </div>
+          </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="sumAmount"
+            align="center"
+            label="业绩统计金额"
+          ></el-table-column>
+          <el-table-column
+            prop="rebateBasedAmount"
+            align="center"
+            label="奖励依据金额"
+          ></el-table-column>
+          <el-table-column
+            prop="assessmentAmount"
+            align="center"
+            label="考核金额"
+          ></el-table-column>
+          <el-table-column
+            prop="amount"
+            align="center"
+            label="奖励金额"
+          ></el-table-column>
+          <el-table-column
+            prop="released"
+            align="center"
+            label="是否满足发放条件"
+          >
+            <div slot-scope="scope">
+              <!-- {{ scope.row.released === 1 ? "是" : "否" }} -->
+              <div v-if="scope.row.released === 1">是</div>
+              <div style="color: red;" v-else>否</div>
+            </div>
+          </el-table-column>
+          <el-table-column prop="noAssessment" align="center" label="免考核">
+            <div slot-scope="scope">
+              {{ scope.row.noAssessment === 1 ? "免考核" : "不免考核" }}
+            </div>
+          </el-table-column>
+          <el-table-column prop="created" align="center" label="省市区">
+            <template slot-scope="scope">
+              <div>
+                {{
+                  scope.row.countyStr
+                    ? `${scope.row.provinceStr}/${scope.row.cityStr}/${
+                        scope.row.countyStr
+                      }`
+                    : `${scope.row.provinceStr}/${scope.row.cityStr}`
+                }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            prop="overflowAmount"
+            align="center"
+            label="超出金额"
+          ></el-table-column>
+          <el-table-column
+            prop="releaseTime"
+            align="center"
+            label="发放时间"
+          ></el-table-column>
+          <el-table-column
+            prop="begin"
+            align="center"
+            label="起始时间"
+          ></el-table-column>
+          <el-table-column
+            prop="end"
+            align="center"
+            label="截止时间"
+          ></el-table-column>
+          <el-table-column
+            prop="method"
+            label="操作"
+            align="center"
+            width="160"
+          >
+            <template slot-scope="scope">
+              <el-button size="mini" @click="updateAmountModal(scope.row)"
+                >修改金额
+              </el-button>
+              <el-button size="mini" @click="toDetail(scope.row)"
+                >查看
+              </el-button>
+            </template>
+          </el-table-column>
+          <el-table-column
+            prop="describe"
+            align="center"
+            width="300"
+            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>
+    <el-dialog
+      title="修改金额"
+      :visible.sync="updateVisible"
+      width="460px"
+      class="dialog"
+    >
+      <el-form
+        ref="form"
+        v-model="updateForm"
+        class="add-balance-form"
+        label-width="120px"
+      >
+        <!-- <el-form-item label="发放金额" prop="company">
+          <div style="width: 188px;">
+            {{ amount }}
+          </div>
+        </el-form-item> -->
+        <el-form-item label="输入修改金额" prop="company">
+          <input
+            class="form-input"
+            placeholder="请输入"
+            onkeypress="/([0-9]|\.)/.test(event.key)"
+            oninput="value = /^\d+(\.{1}\d{0,2})?/g.exec(value) ? /^\d+(\.{1}\d{0,2})?/g.exec(value)[0] : ''"
+            v-model.number="updateForm.amount"
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <button
+          class="cancel-btn"
+          style="height: 32px; width: 60px"
+          @click="updateVisible = false"
+        >
+          取 消
+        </button>
+        <button
+          class="confirm-btn"
+          style="height: 32px; width: 60px"
+          @click="updateAmount"
+        >
+          确 定
+        </button>
+      </div>
+    </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,
+        // begin: '',
+        // end: '',
+        areaLevel: 0,
+        cityLevel: 0,
+        // periodLevel: 0,
+      },
+      role: [
+        {
+          name: '全部',
+          id: -1
+        },
+        ...role
+      ],
+      roleMap: roleMap,
+      tabActive: 1,
+      statusType: [],
+      list: [], // 列表
+      date: [],
+      showProgressDialog: false,
+      progress: 0,
+      system: [],
+      systemMap: {},
+      typeList: [],
+      typeMap: {},
+      statusMap: {
+        0: '冻结中',
+        5: '已解冻'
+      },
+      periodLevelMap: {
+        1: '月度',
+        2: '季度',
+        3: '年度'
+      },
+      areaLevelMap: {
+        3: '区县级',
+        4: '市级'
+      },
+      cityLevelMap: {
+        10: '默认',
+        1: '一档',
+        2: '二挡'
+      },
+      updateForm: {
+        amount: null
+      },
+      updateVisible: false,
+      id: null,
+      num: ''
+    };
+  },
+
+  mounted() {
+    // this.statusType = this.hzType;
+    // 获取列表
+    let query = this.$route.query;
+    this.filter.periodLevel = query.periodLevel;
+    this.filter.begin = query.begin;
+    this.filter.end = query.end;
+    this.num = query.num;
+    this.getList();
+    // this.getDictionary();
+    // this.getFundTypeMap();
+  },
+  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.getAreaAssessmentList, {
+        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);
+        }
+      );
+    },
+    getFundTypeMap() {
+      this.loading++;
+      this.httpGet(this.$root.getFundTypeMap, {}).then(
+        (res) => {
+          this.loading--;
+          this.typeMap = res.balanceLog.balance;
+          let list = [];
+          for(let key in this.typeMap){
+            list.push({
+              name: this.typeMap[key],
+              value: key
+            });
+          };
+          this.typeList = list;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    getDictionary(){
+      this.getDictionaryByName('system');
+    },
+    getDictionaryByName(dataName){
+      this.loading++;
+      this.httpGet(this.$root.getDictionaryByName, {
+        dataName
+      }).then(
+        (res) => {
+          this.loading--;
+          this[dataName] = res.list;
+          let obj = {};
+          res.list.forEach(item => {
+            obj[item.value] = item.labelName;
+          });
+          this[dataName + 'Map'] = obj;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        ...this.filter,
+        uid: null,
+        // begin: '',
+        // end: '',
+        areaLevel: 0,
+        cityLevel: 0,
+        // periodLevel: 0,
+      };
+      this.date = [];
+      this.getList();
+    },
+    uidFormat(val) {
+      if (!val) return '-';
+      let str = val + '';
+      let length = 6 - str.length;
+      for (let i = 0; i < length; i++) {
+        str = '0' + str;
+      }
+      return 'QY' + str;
+    },
+    toDetail(row){
+      this.$router.push({
+        name: 'areaAssessmentDetail',
+        query: { id: row.id }
+      });
+    },
+    updateAmountModal(row){
+      this.id = row.id;
+      this.updateForm = {
+        amount: row.amount || null
+      };
+      this.updateVisible = true;
+    },
+    updateAmount(){
+      this.loading++;
+        this.httpPut(this.$root.updateAreaAssessmentAmount, {
+          // id
+          ...this.updateForm,
+          id: this.id
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.updateVisible = false;
+            this.getList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+    },
+    auditAreaAssessmentModal(){
+      if(!this.num) return;
+      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.auditAreaAssessment, {
+          // id
+          num: this.num
+        }).then(
+          (res) => {
+            this.$message({
+              message: '操作成功',
+              type: 'success'
+            });
+            this.loading--;
+            this.getList();
+          },
+          (res) => {
+            this.loading--;
+            this.$message.error(res);
+          }
+        );
+      });
+    },
+    async order2excel() {
+      if(!(await this.exportLog())) return;
+      this.loading++;
+      let list = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      };
+      await this.httpGet(this.$root.getAreaAssessmentList, 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.getAreaAssessmentList, 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: this.uidFormat(item.uid),
+          时段级别: this.periodLevelMap[item.periodLevel],
+          区域级别: this.areaLevelMap[item.areaLevel],
+          城市档位: this.cityLevelMap[item.cityLevel],
+          业绩统计金额: +item.sumAmount,
+          奖励依据金额: +item.rebateBasedAmount,
+          考核金额: +item.assessmentAmount,
+          奖励金额: +item.amount,
+          是否已发放: item.released === 1 ? "是" : "否",
+          免考核: item.noAssessment === 1 ? "免考核" : "不免考核",
+          超出金额: +item.overflowAmount,
+          发放时间: item.releaseTime,
+          省市区: item.countyStr ? (item.provinceStr + item.cityStr + item.countyStr) : (item.provinceStr + item.cityStr),
+          起始时间: item.begin,
+          截止时间: item.end,
+          回填说明: item.describe
+        };
+        formatList.push(obj);
+      });
+      myUtils.json2excel(formatList);
+    },
+    exportLog(){
+      this.loading++;
+      return this.httpGet(this.$root.getAreaAssessmentList + '/export', {}).then(
+        (res) => {
+          this.loading--;
+          return true;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+          return false;
+        }
+      );
+    },
+  }
+};
+</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: 0 20px 20px;
+
+    // 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: 5px;
+      }
+
+      .select, .input {
+        width: 120px;
+      }
+
+      .date-input {
+        width: 345px;
+      }
+
+      .btn-box {
+        margin: 0;
+        .search{
+          width: auto;
+          padding: 0 10px;
+          min-width: 65px;
+          white-space: nowrap;
+        }
+      }
+
+      .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;
+      }
+    }
+  }
+}
+.add-balance-form{
+  flex-y(flex-start, center);
+  padding: 20px 0;
+  .form-input {
+    width: 185px;
+    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>

+ 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>

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

@@ -0,0 +1,562 @@
+<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">
+              <p class="label">系统:</p>
+              <el-select
+                v-model="filter.sys"
+                placeholder="全部"
+                size="small"
+                class="input"
+                style="margin: 0 10px"
+              >
+                <el-option
+                  v-for="item in system"
+                  :key="item.value"
+                  :label="item.labelName"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div> -->
+
+            <div class="filter-item">
+              <p class="label">变动类型:</p>
+              <el-select
+                v-model="filter.fundType"
+                placeholder="全部"
+                size="small"
+                class="input"
+                style="margin: 0 10px"
+              >
+                <el-option
+                  v-for="item in typeList"
+                  :key="item.value"
+                  :label="item.name"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div>
+
+            <div class="filter-item">
+              <p class="label">变动时间段:</p>
+              <el-date-picker
+                style="margin: 0 10px"
+                size="small"
+                class="date-input"
+                v-model="date"
+                type="datetimerange"
+                align="right"
+                unlink-panels
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd HH:mm:ss"
+              >
+              </el-date-picker>
+            </div>
+
+            <div class="filter-item">
+              <!-- <div class="label">用户ID:</div> -->
+              <el-input
+                class="input"
+                type="number"
+                v-model="filter.uid"
+                placeholder="用户id"
+                size="small"
+              >
+                <template slot="prepend"
+                  >QY</template
+                >
+              </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="nickname"
+            align="center"
+            label="用户昵称"
+          ></el-table-column>
+          <el-table-column prop="uid" align="center" label="用户ID">
+            <div slot-scope="scope">
+              {{ uidFormat(scope.row.uid) }}
+            </div>
+          </el-table-column>
+          <el-table-column
+            prop="describe"
+            align="center"
+            label="变动类型"
+          ></el-table-column>
+          <el-table-column
+            prop="amount"
+            align="center"
+            label="操作金额/元"
+          ></el-table-column>
+          <el-table-column
+            prop="afterAmount"
+            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="created"
+            align="center"
+            label="变更时间"
+          ></el-table-column>
+          <el-table-column prop="adminUid" align="center" label="操作人ID">
+            <div slot-scope="scope">
+              {{ uidFormat(scope.row.adminUid) }}
+            </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: {
+        uid: null,
+        fundType: null,
+        begin: '',
+        end: ''
+      },
+      role: [
+        {
+          name: '全部',
+          id: -1
+        },
+        ...role
+      ],
+      roleMap: roleMap,
+      tabActive: 1,
+      statusType: [],
+      list: [], // 列表
+      date: [],
+      showProgressDialog: false,
+      progress: 0,
+      system: [],
+      systemMap: {},
+      typeList: [],
+      typeMap: {},
+      statusMap: {
+        0: '冻结中',
+        5: '已解冻'
+      }
+    };
+  },
+
+  mounted() {
+    // this.statusType = this.hzType;
+    // 获取列表
+    this.getList();
+    // this.getDictionary();
+    this.getFundTypeMap();
+  },
+  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.getBalance, {
+        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);
+        }
+      );
+    },
+    getFundTypeMap() {
+      this.loading++;
+      this.httpGet(this.$root.getFundTypeMap, {}).then(
+        (res) => {
+          this.loading--;
+          this.typeMap = res.balanceLog.balance;
+          let list = [];
+          for(let key in this.typeMap){
+            list.push({
+              name: this.typeMap[key],
+              value: key
+            });
+          };
+          this.typeList = list;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    getDictionary(){
+      this.getDictionaryByName('system');
+    },
+    getDictionaryByName(dataName){
+      this.loading++;
+      this.httpGet(this.$root.getDictionaryByName, {
+        dataName
+      }).then(
+        (res) => {
+          this.loading--;
+          this[dataName] = res.list;
+          let obj = {};
+          res.list.forEach(item => {
+            obj[item.value] = item.labelName;
+          });
+          this[dataName + 'Map'] = obj;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        uid: null,
+        fundType: null,
+        begin: '',
+        end: ''
+      };
+      this.date = [];
+      this.getList();
+    },
+    uidFormat(val) {
+      if (!val) return '-';
+      let str = val + '';
+      let length = 6 - str.length;
+      for (let i = 0; i < length; i++) {
+        str = '0' + str;
+      }
+      return 'QY' + str;
+    },
+    async order2excel() {
+      if(!(await this.exportLog())) return;
+      this.loading++;
+      let list = [];
+      let totalPage = null;
+      let data = {
+        page: this.currentPage,
+        size: this.size,
+        ...this.filter
+      };
+      await this.httpGet(this.$root.getBalance, 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.getBalance, 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.nickname,
+          用户ID: this.uidFormat(item.uid),
+          变动类型: item.describe,
+          '操作金额/元': +item.amount,
+          操作后金额: +item.afterAmount,
+          变更时间: item.created,
+          操作人ID: this.uidFormat(item.adminUid),
+        };
+        formatList.push(obj);
+      });
+      myUtils.json2excel(formatList);
+    },
+    exportLog(){
+      this.loading++;
+      return this.httpGet(this.$root.getBalance + '/export', {}).then(
+        (res) => {
+          this.loading--;
+          return true;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+          return false;
+        }
+      );
+    },
+  }
+};
+</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: 0 20px 20px;
+
+    // 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: 160px;
+      }
+
+      .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>

+ 503 - 0
src/view/fund/balance-record2.vue

@@ -0,0 +1,503 @@
+<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">
+              <p class="label">系统:</p>
+              <el-select
+                v-model="filter.sys"
+                placeholder="全部"
+                size="small"
+                class="input"
+                style="margin: 0 10px"
+              >
+                <el-option
+                  v-for="item in system"
+                  :key="item.value"
+                  :label="item.labelName"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </div> -->
+
+            <div class="filter-item">
+              <p class="label">类型:</p>
+              <el-select
+                v-model="filter.fundType"
+                placeholder="全部"
+                size="small"
+                class="input"
+                style="margin: 0 10px"
+              >
+                <el-option
+                  v-for="item in typeList"
+                  :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="sys"
+            align="center"
+            label="系统"
+          ></el-table-column> -->
+          <el-table-column
+            prop="uid"
+            align="center"
+            label="用户ID"
+          ></el-table-column>
+          <el-table-column
+            prop="describe"
+            align="center"
+            label="类型"
+          ></el-table-column>
+          <el-table-column
+            prop="amount"
+            align="center"
+            label="操作金额/元"
+          ></el-table-column>
+          <el-table-column
+            prop="afterAmount"
+            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,
+        fundType: '',
+        sys: null,
+        mode: 'balance'
+      },
+      role: [
+        {
+          name: '全部',
+          id: -1
+        },
+        ...role
+      ],
+      roleMap: roleMap,
+      tabActive: 1,
+      statusType: [],
+      list: [], // 列表
+      date: [],
+      showProgressDialog: false,
+      progress: 0,
+      system: [],
+      systemMap: {},
+      typeList: [],
+      typeMap: {},
+      statusMap: {
+        0: '冻结中',
+        5: '已解冻'
+      }
+    };
+  },
+
+  mounted() {
+    // this.statusType = this.hzType;
+    // 获取列表
+    this.getList();
+    this.getDictionary();
+    this.getFundTypeMap();
+  },
+  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.getBalance, {
+        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);
+        }
+      );
+    },
+    getFundTypeMap() {
+      this.loading++;
+      this.httpGet(this.$root.getFundTypeMap, {}).then(
+        (res) => {
+          this.loading--;
+          this.typeMap = res.balanceLog.balance;
+          let list = [];
+          for(let key in this.typeMap){
+            list.push({
+              name: this.typeMap[key],
+              value: key
+            });
+          };
+          this.typeList = list;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    getDictionary(){
+      this.getDictionaryByName('system');
+    },
+    getDictionaryByName(dataName){
+      this.loading++;
+      this.httpGet(this.$root.getDictionaryByName, {
+        dataName
+      }).then(
+        (res) => {
+          this.loading--;
+          this[dataName] = res.list;
+          let obj = {};
+          res.list.forEach(item => {
+            obj[item.value] = item.labelName;
+          });
+          this[dataName + 'Map'] = obj;
+        },
+        (res) => {
+          this.loading--;
+          this.$message.error(res);
+        }
+      );
+    },
+    // 过滤
+    search() {
+      this.currentPage = 1;
+      this.getList();
+    },
+    // 重置过滤
+    reset() {
+      this.filter = {
+        fundType: '',
+        mode: 'balance',
+        uid: null,
+        sys: null,
+      };
+      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.role],
+          社群总销售额: 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: 160px;
+      }
+
+      .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>

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

@@ -0,0 +1,298 @@
+<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 typeList"
+                  :key="item"
+                  :label="item"
+                  :value="item"
+                >
+                </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: [],
+
+      statusMap: {
+        1: '微信收入',
+        2: '推荐奖励金额',
+        3: '级差奖励金额',
+        5: '团队奖励金额'
+      },
+      typeMap: {},
+      typeList: [],
+      list: [], // 用户列表
+      date: []
+    };
+  },
+
+  async mounted() {
+    // 获取列表
+    await this.getFundTypeMap();
+    this.getList();
+  },
+  computed: {},
+  methods: {
+    // 切换页码
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.getList();
+    },
+    getFundTypeMap() {
+      this.loading++;
+      return this.httpGet(this.$root.getFinancialCountingType, {}).then(
+        (res) => {
+          this.loading--;
+          this.typeList = res;
+          this.filter.genre = res[0];
+        },
+        (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.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.filter.genre = this.typeList[0];
+      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: 0 20px 20px;
+
+    // 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>

+ 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>

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