Browse Source

恢复代码

xiaodai2022 2 years ago
parent
commit
d755a6e4de
91 changed files with 678 additions and 124 deletions
  1. 14 0
      .editorconfig
  2. 7 0
      .env.development
  3. 7 0
      .env.production
  4. 7 0
      .env.staging
  5. 4 0
      .eslintignore
  6. 198 0
      .eslintrc.js
  7. 2 9
      .gitignore
  8. 5 0
      .travis.yml
  9. 21 0
      LICENSE
  10. 35 0
      build/index.js
  11. 0 24
      dist/index.html
  12. 0 1
      dist/static/axios@0.21.0.min.js
  13. BIN
      dist/static/axios@0.21.0.min.js.gz
  14. 0 0
      dist/static/css/app.ae0f555e.css
  15. BIN
      dist/static/css/app.ae0f555e.css.gz
  16. 0 0
      dist/static/css/chunk-02bc9a03.ce188cd1.css
  17. 0 1
      dist/static/css/chunk-09413a44.68d53367.css
  18. 0 0
      dist/static/css/chunk-1a9d78b9.703ceb31.css
  19. 0 1
      dist/static/css/chunk-1abecf4c.41b5526a.css
  20. 0 1
      dist/static/css/chunk-2a52459a.149d0cab.css
  21. 0 1
      dist/static/css/chunk-3bc89c67.15c23872.css
  22. 0 0
      dist/static/css/chunk-3e94c4a0.4007c634.css
  23. 0 0
      dist/static/css/chunk-409cadb4.385edc24.css
  24. BIN
      dist/static/css/chunk-409cadb4.385edc24.css.gz
  25. 0 0
      dist/static/css/chunk-44a70938.1c4ea3cf.css
  26. 0 0
      dist/static/css/chunk-64cf4b20.c5143a2a.css
  27. 0 0
      dist/static/css/chunk-95806aaa.90844b8e.css
  28. 0 1
      dist/static/css/chunk-bbbb90b4.11a605cd.css
  29. 0 1
      dist/static/css/chunk-elementUI.6e808e7d.css
  30. 0 0
      dist/static/css/chunk-libs.a21a27cb.css
  31. BIN
      dist/static/css/chunk-libs.a21a27cb.css.gz
  32. 0 0
      dist/static/dingtalk.open.2.10.3.js
  33. BIN
      dist/static/dingtalk.open.2.10.3.js.gz
  34. BIN
      dist/static/fonts/element-icons.535877f5.woff
  35. BIN
      dist/static/fonts/element-icons.732389de.ttf
  36. BIN
      dist/static/img/401.089007e7.gif
  37. BIN
      dist/static/img/404.a57b6f31.png
  38. BIN
      dist/static/img/404_cloud.0f4bc32b.png
  39. BIN
      dist/static/img/avatar.ecba1844.gif
  40. BIN
      dist/static/img/developing.750f7ed1.jpg
  41. BIN
      dist/static/img/loading.190c78aa.gif
  42. BIN
      dist/static/img/loginbg.51c61d67.png
  43. BIN
      dist/static/img/loginlan.1ecbd4ab.png
  44. BIN
      dist/static/img/logo.66bee2dc.gif
  45. BIN
      dist/static/img/search-not.29ce7ea9.png
  46. BIN
      dist/static/img/welcome.6cf0f25b.gif
  47. 0 0
      dist/static/js/app.3a3a8716.js
  48. BIN
      dist/static/js/app.3a3a8716.js.gz
  49. 0 0
      dist/static/js/chunk-02bc9a03.c4327f97.js
  50. BIN
      dist/static/js/chunk-02bc9a03.c4327f97.js.gz
  51. 0 0
      dist/static/js/chunk-09413a44.290ad16e.js
  52. 0 0
      dist/static/js/chunk-1a9d78b9.d56446d0.js
  53. 0 1
      dist/static/js/chunk-1abecf4c.d1614ea4.js
  54. 0 0
      dist/static/js/chunk-2a52459a.8ae43758.js
  55. 0 0
      dist/static/js/chunk-3bc89c67.037c7c02.js
  56. 0 0
      dist/static/js/chunk-3e94c4a0.55158107.js
  57. 0 0
      dist/static/js/chunk-409cadb4.548c17df.js
  58. BIN
      dist/static/js/chunk-409cadb4.548c17df.js.gz
  59. 0 0
      dist/static/js/chunk-44a70938.8a31e690.js
  60. 0 0
      dist/static/js/chunk-64cf4b20.18d10293.js
  61. BIN
      dist/static/js/chunk-64cf4b20.18d10293.js.gz
  62. 0 1
      dist/static/js/chunk-95806aaa.754ea454.js
  63. 0 1
      dist/static/js/chunk-bbbb90b4.f6c0635c.js
  64. 0 0
      dist/static/js/chunk-elementUI.d1cb771f.js
  65. BIN
      dist/static/js/chunk-elementUI.d1cb771f.js.gz
  66. 0 0
      dist/static/js/chunk-libs.79d3f182.js
  67. BIN
      dist/static/js/chunk-libs.79d3f182.js.gz
  68. BIN
      dist/static/loading.gif
  69. 0 0
      dist/static/reset.min.css
  70. 0 10
      dist/static/vue-router.min.js
  71. BIN
      dist/static/vue-router.min.js.gz
  72. 0 5
      dist/static/vue.min.js
  73. BIN
      dist/static/vue.min.js.gz
  74. BIN
      dist/static/收货地址模板.xlsx
  75. 9 0
      jsconfig.json
  76. 0 1
      package.json
  77. 0 9
      plopfile.js
  78. 5 2
      postcss.config.js
  79. BIN
      public/favicon.ico
  80. 78 0
      src/components/Breadcrumb/index.vue
  81. 44 0
      src/components/Hamburger/index.vue
  82. 62 0
      src/components/SvgIcon/index.vue
  83. 0 1
      src/main.js
  84. 64 0
      src/permission.js
  85. 0 6
      test.http
  86. 98 0
      tests/unit/components/Breadcrumb.spec.js
  87. 8 8
      tests/unit/components/Hamburger.spec.js
  88. 1 0
      tests/unit/utils/formatTime.spec.js
  89. 0 2
      tests/unit/utils/parseTime.spec.js
  90. 9 20
      tests/unit/utils/validate.spec.js
  91. 0 17
      text.text

+ 14 - 0
.editorconfig

@@ -0,0 +1,14 @@
+# http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false

+ 7 - 0
.env.development

@@ -0,0 +1,7 @@
+NODE_ENV = development
+
+# just a flag
+ENV = 'development'
+
+# base api
+VUE_APP_BASE_API = '/dev-api'

+ 7 - 0
.env.production

@@ -0,0 +1,7 @@
+NODE_ENV = production
+
+# just a flag
+ENV = 'production'
+
+# base api
+VUE_APP_BASE_API = '/prod-api'

+ 7 - 0
.env.staging

@@ -0,0 +1,7 @@
+NODE_ENV = staging
+
+# just a flag
+ENV = 'staging'
+
+# base api
+VUE_APP_BASE_API = '/stage-api'

+ 4 - 0
.eslintignore

@@ -0,0 +1,4 @@
+build/*.js
+src/assets
+public
+dist

+ 198 - 0
.eslintrc.js

@@ -0,0 +1,198 @@
+module.exports = {
+  root: true,
+  parserOptions: {
+    parser: 'babel-eslint',
+    sourceType: 'module'
+  },
+  env: {
+    browser: true,
+    node: true,
+    es6: true,
+  },
+  extends: ['plugin:vue/recommended', 'eslint:recommended'],
+
+  // add your custom rules here
+  //it is base on https://github.com/vuejs/eslint-config-vue
+  rules: {
+    "vue/max-attributes-per-line": [2, {
+      "singleline": 10,
+      "multiline": {
+        "max": 1,
+        "allowFirstLine": false
+      }
+    }],
+    "vue/singleline-html-element-content-newline": "off",
+    "vue/multiline-html-element-content-newline":"off",
+    "vue/name-property-casing": ["error", "PascalCase"],
+    "vue/no-v-html": "off",
+    'accessor-pairs': 2,
+    'arrow-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'block-spacing': [2, 'always'],
+    'brace-style': [2, '1tbs', {
+      'allowSingleLine': true
+    }],
+    'camelcase': [0, {
+      'properties': 'always'
+    }],
+    'comma-dangle': [2, 'never'],
+    'comma-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'comma-style': [2, 'last'],
+    'constructor-super': 2,
+    'curly': [2, 'multi-line'],
+    'dot-location': [2, 'property'],
+    'eol-last': 2,
+    'eqeqeq': ["error", "always", {"null": "ignore"}],
+    'generator-star-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'handle-callback-err': [2, '^(err|error)$'],
+    'indent': [2, 2, {
+      'SwitchCase': 1
+    }],
+    'jsx-quotes': [2, 'prefer-single'],
+    'key-spacing': [2, {
+      'beforeColon': false,
+      'afterColon': true
+    }],
+    'keyword-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'new-cap': [2, {
+      'newIsCap': true,
+      'capIsNew': false
+    }],
+    'new-parens': 2,
+    'no-array-constructor': 2,
+    'no-caller': 2,
+    'no-console': 'off',
+    'no-class-assign': 2,
+    'no-cond-assign': 2,
+    'no-const-assign': 2,
+    'no-control-regex': 0,
+    'no-delete-var': 2,
+    'no-dupe-args': 2,
+    'no-dupe-class-members': 2,
+    'no-dupe-keys': 2,
+    'no-duplicate-case': 2,
+    'no-empty-character-class': 2,
+    'no-empty-pattern': 2,
+    'no-eval': 2,
+    'no-ex-assign': 2,
+    'no-extend-native': 2,
+    'no-extra-bind': 2,
+    'no-extra-boolean-cast': 2,
+    'no-extra-parens': [2, 'functions'],
+    'no-fallthrough': 2,
+    'no-floating-decimal': 2,
+    'no-func-assign': 2,
+    'no-implied-eval': 2,
+    'no-inner-declarations': [2, 'functions'],
+    'no-invalid-regexp': 2,
+    'no-irregular-whitespace': 2,
+    'no-iterator': 2,
+    'no-label-var': 2,
+    'no-labels': [2, {
+      'allowLoop': false,
+      'allowSwitch': false
+    }],
+    'no-lone-blocks': 2,
+    'no-mixed-spaces-and-tabs': 2,
+    'no-multi-spaces': 2,
+    'no-multi-str': 2,
+    'no-multiple-empty-lines': [2, {
+      'max': 1
+    }],
+    'no-native-reassign': 2,
+    'no-negated-in-lhs': 2,
+    'no-new-object': 2,
+    'no-new-require': 2,
+    'no-new-symbol': 2,
+    'no-new-wrappers': 2,
+    'no-obj-calls': 2,
+    'no-octal': 2,
+    'no-octal-escape': 2,
+    'no-path-concat': 2,
+    'no-proto': 2,
+    'no-redeclare': 2,
+    'no-regex-spaces': 2,
+    'no-return-assign': [2, 'except-parens'],
+    'no-self-assign': 2,
+    'no-self-compare': 2,
+    'no-sequences': 2,
+    'no-shadow-restricted-names': 2,
+    'no-spaced-func': 2,
+    'no-sparse-arrays': 2,
+    'no-this-before-super': 2,
+    'no-throw-literal': 2,
+    'no-trailing-spaces': 2,
+    'no-undef': 2,
+    'no-undef-init': 2,
+    'no-unexpected-multiline': 2,
+    'no-unmodified-loop-condition': 2,
+    'no-unneeded-ternary': [2, {
+      'defaultAssignment': false
+    }],
+    'no-unreachable': 2,
+    'no-unsafe-finally': 2,
+    'no-unused-vars': [2, {
+      'vars': 'all',
+      'args': 'none'
+    }],
+    'no-useless-call': 2,
+    'no-useless-computed-key': 2,
+    'no-useless-constructor': 2,
+    'no-useless-escape': 0,
+    'no-whitespace-before-property': 2,
+    'no-with': 2,
+    'one-var': [2, {
+      'initialized': 'never'
+    }],
+    'operator-linebreak': [2, 'after', {
+      'overrides': {
+        '?': 'before',
+        ':': 'before'
+      }
+    }],
+    'padded-blocks': [2, 'never'],
+    'quotes': [2, 'single', {
+      'avoidEscape': true,
+      'allowTemplateLiterals': true
+    }],
+    'semi': [2, 'never'],
+    'semi-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'space-before-blocks': [2, 'always'],
+    'space-before-function-paren': [2, 'never'],
+    'space-in-parens': [2, 'never'],
+    'space-infix-ops': 2,
+    'space-unary-ops': [2, {
+      'words': true,
+      'nonwords': false
+    }],
+    'spaced-comment': [2, 'always', {
+      'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
+    }],
+    'template-curly-spacing': [2, 'never'],
+    'use-isnan': 2,
+    'valid-typeof': 2,
+    'wrap-iife': [2, 'any'],
+    'yield-star-spacing': [2, 'both'],
+    'yoda': [2, 'never'],
+    'prefer-const': 2,
+    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
+    'object-curly-spacing': [2, 'always', {
+      objectsInObjects: false
+    }],
+    'array-bracket-spacing': [2, 'never']
+  }
+}

+ 2 - 9
.gitignore

@@ -1,14 +1,11 @@
 .DS_Store
 node_modules/
-# dist/
+dist/
 npm-debug.log*
 yarn-debug.log*
 yarn-error.log*
-**/*.log
-
+package-lock.json
 tests/**/coverage/
-tests/e2e/reports
-selenium-debug.log
 
 # Editor directories and files
 .idea
@@ -17,7 +14,3 @@ selenium-debug.log
 *.ntvs*
 *.njsproj
 *.sln
-*.local
-
-package-lock.json
-yarn.lock

+ 5 - 0
.travis.yml

@@ -0,0 +1,5 @@
+language: node_js
+node_js: 10
+script: npm run test
+notifications:
+  email: false

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017-present PanJiaChen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 35 - 0
build/index.js

@@ -0,0 +1,35 @@
+const { run } = require('runjs')
+const chalk = require('chalk')
+const config = require('../vue.config.js')
+const rawArgv = process.argv.slice(2)
+const args = rawArgv.join(' ')
+
+if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
+  const report = rawArgv.includes('--report')
+
+  run(`vue-cli-service build ${args}`)
+
+  const port = 9526
+  const publicPath = config.publicPath
+
+  var connect = require('connect')
+  var serveStatic = require('serve-static')
+  const app = connect()
+
+  app.use(
+    publicPath,
+    serveStatic('./dist', {
+      index: ['index.html', '/']
+    })
+  )
+
+  app.listen(port, function () {
+    console.log(chalk.green(`> Preview at  http://localhost:${port}${publicPath}`))
+    if (report) {
+      console.log(chalk.green(`> Report at  http://localhost:${port}${publicPath}report.html`))
+    }
+
+  })
+} else {
+  run(`vue-cli-service build ${args}`)
+}

File diff suppressed because it is too large
+ 0 - 24
dist/index.html


File diff suppressed because it is too large
+ 0 - 1
dist/static/axios@0.21.0.min.js


BIN
dist/static/axios@0.21.0.min.js.gz


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/app.ae0f555e.css


BIN
dist/static/css/app.ae0f555e.css.gz


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-02bc9a03.ce188cd1.css


+ 0 - 1
dist/static/css/chunk-09413a44.68d53367.css

@@ -1 +0,0 @@
-.change-password{background:#f2f2f2;min-height:100%;width:100%;height:100%;overflow:hidden;position:absolute;z-index:2;-webkit-box-sizing:border-box;box-sizing:border-box}.change-password .change{padding:0 18% 0 0}.change-password .change .title{border-width:0;height:140px;display:-webkit-box;display:-ms-flexbox;display:flex;font-weight:400;font-style:normal;font-size:22px;text-align:left;padding:0;padding:60px 0 0 100px;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.change-password[data-v-47333433]{min-height:100%;width:100%;height:100%;overflow:hidden;position:absolute;z-index:2}.change-password .login-form[data-v-47333433]{position:relative;width:415px;max-width:100%;height:100%;padding:50px 35px 150px 35px;margin:0 auto;overflow:hidden}.change-password .login-form .el-form-item__label[data-v-47333433]{height:49px;line-height:49px}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-1a9d78b9.703ceb31.css


+ 0 - 1
dist/static/css/chunk-1abecf4c.41b5526a.css

@@ -1 +0,0 @@
-.dashboard-container[data-v-6bdd809c]{padding:0 0 0 0;position:relative;width:100%;min-height:calc(100vh - 50px);display:inline-block;background-color:#e3e3e3}.emptyGif[data-v-6bdd809c]{display:block;width:100%;margin:0 auto}.dashboard-editor-container[data-v-6bdd809c]{position:relative;min-height:100%;width:100%;padding:0 6% 0 0;text-align:center}.dashboard-editor-container .info-container[data-v-6bdd809c]{display:block;width:60%;text-align:center;margin:0 auto;padding:10vh 0 0 0}.dashboard-editor-container .info-container .welcome-title[data-v-6bdd809c]{vertical-align:top;padding:0;margin:0 0 0 18px;color:#97a8be;display:inline-block;height:130px;line-height:130px;font-size:45px}.dashboard-editor-container img[data-v-6bdd809c]{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1}

+ 0 - 1
dist/static/css/chunk-2a52459a.149d0cab.css

@@ -1 +0,0 @@
-.change{padding:0 18% 0 0;background:#f2f2f2;min-height:100%;height:100%;overflow:hidden;position:absolute;z-index:2}.change,.change .title{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.change .title{border-width:0;height:140px;display:-webkit-box;display:-ms-flexbox;display:flex;font-weight:400;font-style:normal;font-size:22px;text-align:left;padding:0;padding:60px 0 0 100px}.change-mobile{background:#f2f2f2}@supports (-webkit-mask:none) and (not (cater-color:#fff)){.change-mobile .el-input input{color:#fff}}.change-mobile .el-input input{color:#000}.change-mobile .el-form-item{border:1px solid hsla(0,0%,100%,.1);color:#454545}.change-mobile[data-v-64208de8]{min-height:100%;width:100%;height:100%;background-color:#f2f2f2;overflow:hidden;position:absolute;z-index:2;background:#fff}.change-mobile .login-form[data-v-64208de8]{position:relative;width:415px;max-width:100%;height:100%;padding:50px 35px 150px 35px;margin:0 auto;overflow:hidden}.change-mobile .login-form .el-form-item__label[data-v-64208de8]{height:49px;line-height:49px}.change-mobile .login-form .el-form-item__content[data-v-64208de8]:after,.change-mobile .login-form .el-form-item__content[data-v-64208de8]:before{content:"";display:block;clear:both}.change-mobile .tips[data-v-64208de8]{font-size:14px;color:#fff;margin-bottom:10px}.change-mobile .tips span[data-v-64208de8]:first-of-type{margin-right:16px}.change-mobile .svg-container[data-v-64208de8]{padding:6px 5px 6px 15px;color:#889aa4;vertical-align:middle;width:30px;display:inline-block}.change-mobile .show-pwd[data-v-64208de8]{position:absolute;right:10px;top:7px;font-size:16px;color:#889aa4;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.change-mobile .thirdparty-button[data-v-64208de8]{position:absolute;right:0;bottom:6px}@media only screen and (max-width:470px){.change-mobile .thirdparty-button[data-v-64208de8]{display:none}}

+ 0 - 1
dist/static/css/chunk-3bc89c67.15c23872.css

@@ -1 +0,0 @@
-.my-messagge-page{text-align:center;background:#f2f2f2;min-height:100%;width:100%;height:100%;overflow:hidden;position:absolute;z-index:2;-webkit-box-sizing:border-box;box-sizing:border-box}.my-messagge-page .change{padding:0 8% 0 0}.my-messagge-page .change .title{border-width:0;height:170px;display:-webkit-box;display:-ms-flexbox;display:flex;font-weight:400;font-style:normal;font-size:22px;text-align:left;padding:0;padding:60px 0 0 100px;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.my-messagge-page .change-main{width:370px;margin:0 auto;text-align:left}.my-messagge-page .infor{padding:0 0 40px 0}.my-messagge-page .infor .tr{text-align:right;padding:0 15px 0 0}@supports (-webkit-mask:none) and (not (cater-color:#fff)){.my-messagge .el-input input{color:#fff}}.my-messagge[data-v-27685a3c]{min-height:100%;width:100%;height:100%;background-color:#f2f2f2;overflow:hidden;position:absolute;z-index:2;background:#fff}.my-messagge .login-form[data-v-27685a3c]{position:relative;width:415px;max-width:100%;height:100%;padding:50px 35px 150px 35px;margin:0 auto;overflow:hidden}.my-messagge .login-form .el-form-item__label[data-v-27685a3c]{height:49px;line-height:49px}.my-messagge .tips[data-v-27685a3c]{font-size:14px;color:#fff;margin-bottom:10px}.my-messagge .tips span[data-v-27685a3c]:first-of-type{margin-right:16px}.my-messagge .svg-container[data-v-27685a3c]{padding:6px 5px 6px 15px;color:#889aa4;vertical-align:middle;width:30px;display:inline-block}.my-messagge .show-pwd[data-v-27685a3c]{position:absolute;right:10px;top:7px;font-size:16px;color:#889aa4;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.my-messagge .thirdparty-button[data-v-27685a3c]{position:absolute;right:0;bottom:6px}@media only screen and (max-width:470px){.my-messagge .thirdparty-button[data-v-27685a3c]{display:none}}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-3e94c4a0.4007c634.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-409cadb4.385edc24.css


BIN
dist/static/css/chunk-409cadb4.385edc24.css.gz


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-44a70938.1c4ea3cf.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-64cf4b20.c5143a2a.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-95806aaa.90844b8e.css


+ 0 - 1
dist/static/css/chunk-bbbb90b4.11a605cd.css

@@ -1 +0,0 @@
-.dingLoading[data-v-17af7bec]{text-align:center;width:100%}.dingLoading img[data-v-17af7bec]{display:inline-block;width:152px;margin:0 auto;padding-top:100px}

+ 0 - 1
dist/static/css/chunk-elementUI.6e808e7d.css

@@ -1 +0,0 @@
-@media only screen and (max-width:767px){.hidden-xs-only{display:none!important}}@media only screen and (min-width:768px){.hidden-sm-and-up{display:none!important}}@media only screen and (min-width:768px) and (max-width:991px){.hidden-sm-only{display:none!important}}@media only screen and (max-width:991px){.hidden-sm-and-down{display:none!important}}@media only screen and (min-width:992px){.hidden-md-and-up{display:none!important}}@media only screen and (min-width:992px) and (max-width:1199px){.hidden-md-only{display:none!important}}@media only screen and (max-width:1199px){.hidden-md-and-down{display:none!important}}@media only screen and (min-width:1200px){.hidden-lg-and-up{display:none!important}}@media only screen and (min-width:1200px) and (max-width:1919px){.hidden-lg-only{display:none!important}}@media only screen and (max-width:1919px){.hidden-lg-and-down{display:none!important}}@media only screen and (min-width:1920px){.hidden-xl-only{display:none!important}}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-libs.a21a27cb.css


BIN
dist/static/css/chunk-libs.a21a27cb.css.gz


File diff suppressed because it is too large
+ 0 - 0
dist/static/dingtalk.open.2.10.3.js


BIN
dist/static/dingtalk.open.2.10.3.js.gz


BIN
dist/static/fonts/element-icons.535877f5.woff


BIN
dist/static/fonts/element-icons.732389de.ttf


BIN
dist/static/img/401.089007e7.gif


BIN
dist/static/img/404.a57b6f31.png


BIN
dist/static/img/404_cloud.0f4bc32b.png


BIN
dist/static/img/avatar.ecba1844.gif


BIN
dist/static/img/developing.750f7ed1.jpg


BIN
dist/static/img/loading.190c78aa.gif


BIN
dist/static/img/loginbg.51c61d67.png


BIN
dist/static/img/loginlan.1ecbd4ab.png


BIN
dist/static/img/logo.66bee2dc.gif


BIN
dist/static/img/search-not.29ce7ea9.png


BIN
dist/static/img/welcome.6cf0f25b.gif


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.3a3a8716.js


BIN
dist/static/js/app.3a3a8716.js.gz


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-02bc9a03.c4327f97.js


BIN
dist/static/js/chunk-02bc9a03.c4327f97.js.gz


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-09413a44.290ad16e.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-1a9d78b9.d56446d0.js


+ 0 - 1
dist/static/js/chunk-1abecf4c.d1614ea4.js

@@ -1 +0,0 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-1abecf4c"],{9406:function(t,a,i){"use strict";i.r(a);var e=i("5530"),n=i("2f62");e={name:"dashboard",data:function(){return{emptyGif:i("ff1f")}},computed:Object(e.a)({},Object(n.b)(["avatar"])),mounted:function(){}},i("9d69"),n=i("2877"),e=Object(n.a)(e,(function(){var t=this,a=t.$createElement;a=t._self._c||a;return a("div",{staticClass:"dashboard-container"},[a("div",{staticClass:"dashboard-editor-container"},[a("div",{staticClass:"info-container clearfix"},[a("pan-thumb",{attrs:{image:t.avatar,width:"130px",height:"130px"}}),a("span",{staticClass:"welcome-title"},[t._v("欢迎登录采销平台")])],1),a("img",{staticStyle:{width:"60%",margin:"-30px auto 0 auto"},attrs:{src:t.emptyGif}})])])}),[],!1,null,"6bdd809c",null);a.default=e.exports},"9d69":function(t,a,i){"use strict";i("a7f4")},a7f4:function(t,a,i){},ff1f:function(t,a,i){t.exports=i.p+"static/img/welcome.6cf0f25b.gif"}}]);

File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-2a52459a.8ae43758.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3bc89c67.037c7c02.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3e94c4a0.55158107.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-409cadb4.548c17df.js


BIN
dist/static/js/chunk-409cadb4.548c17df.js.gz


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-44a70938.8a31e690.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-64cf4b20.18d10293.js


BIN
dist/static/js/chunk-64cf4b20.18d10293.js.gz


+ 0 - 1
dist/static/js/chunk-95806aaa.754ea454.js

@@ -1 +0,0 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-95806aaa"],{"1db4":function(t,s,i){"use strict";i.r(s);var c=[function(){var t=this.$createElement;t=this._self._c||t;return t("div",{staticClass:"pic-404"},[t("img",{staticClass:"pic-404__parent",attrs:{src:i("a36b"),alt:"404"}}),t("img",{staticClass:"pic-404__child left",attrs:{src:i("26fc"),alt:"404"}}),t("img",{staticClass:"pic-404__child mid",attrs:{src:i("26fc"),alt:"404"}}),t("img",{staticClass:"pic-404__child right",attrs:{src:i("26fc"),alt:"404"}})])}],a={name:"Page404",computed:{message:function(){return"访问的页面不存在..."}},methods:{goto:function(){window.vm.$router.push({path:"/welcome/dashboard"})}}},n=(i("e894"),i("2877"));c=Object(n.a)(a,(function(){var t=this,s=t.$createElement;s=t._self._c||s;return s("div",{staticClass:"wscn-http404-container"},[s("div",{staticClass:"wscn-http404"},[t._m(0),s("div",{staticClass:"bullshit"},[s("div",{staticClass:"bullshit__oops"},[t._v("哎呀!")]),s("div",{staticClass:"bullshit__headline"},[t._v(t._s(t.message))]),s("div",{staticClass:"bullshit__info"},[t._v(" 请检查您输入的网址是否正确,或单击下面的按钮返回主页. ")]),s("el-button",{attrs:{type:"primary",round:""},on:{click:function(s){return t.goto()}}},[t._v("回到首页")])],1)])])}),c,!1,null,"82eac96e",null);s.default=c.exports},"26fc":function(t,s,i){t.exports=i.p+"static/img/404_cloud.0f4bc32b.png"},a36b:function(t,s,i){t.exports=i.p+"static/img/404.a57b6f31.png"},c980:function(t,s,i){},e894:function(t,s,i){"use strict";i("c980")}}]);

+ 0 - 1
dist/static/js/chunk-bbbb90b4.f6c0635c.js

@@ -1 +0,0 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-bbbb90b4"],{"04c0":function(t,n,c){"use strict";c("56c0")},"56c0":function(t,n,c){},"7e10":function(t,n,c){"use strict";c.r(n);var e=[function(){var t=this.$createElement;t=this._self._c||t;return t("div",{staticClass:"dingLoading"},[t("img",{attrs:{src:c("f8b2"),alt:""}})])}],i={name:"loadingPage",data:function(){return{}},mounted:function(){}},a=(c("04c0"),c("2877"));e=Object(a.a)(i,(function(){var t=this;t.$createElement;return t._self._c,t._m(0)}),e,!1,null,"17af7bec",null);n.default=e.exports},f8b2:function(t,n,c){t.exports=c.p+"static/img/loading.190c78aa.gif"}}]);

File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-elementUI.d1cb771f.js


BIN
dist/static/js/chunk-elementUI.d1cb771f.js.gz


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-libs.79d3f182.js


BIN
dist/static/js/chunk-libs.79d3f182.js.gz


BIN
dist/static/loading.gif


File diff suppressed because it is too large
+ 0 - 0
dist/static/reset.min.css


File diff suppressed because it is too large
+ 0 - 10
dist/static/vue-router.min.js


BIN
dist/static/vue-router.min.js.gz


File diff suppressed because it is too large
+ 0 - 5
dist/static/vue.min.js


BIN
dist/static/vue.min.js.gz


BIN
dist/static/收货地址模板.xlsx


+ 9 - 0
jsconfig.json

@@ -0,0 +1,9 @@
+{
+  "compilerOptions": {
+    "baseUrl": "./",
+    "paths": {
+        "@/*": ["src/*"]
+    }
+  },
+  "exclude": ["node_modules", "dist"]
+}

+ 0 - 1
package.json

@@ -45,7 +45,6 @@
     "screenfull": "4.2.0",
     "script-loader": "0.7.2",
     "sortablejs": "1.8.4",
-    "tui-editor": "1.3.3",
     "uglifyjs-webpack-plugin": "^2.2.0",
     "v-viewer": "^1.6.3",
     "vue-count-to": "^1.0.13",

+ 0 - 9
plopfile.js

@@ -1,9 +0,0 @@
-const viewGenerator = require('./plop-templates/view/prompt')
-const componentGenerator = require('./plop-templates/component/prompt')
-const storeGenerator = require('./plop-templates/store/prompt.js')
-
-module.exports = function(plop) {
-  plop.setGenerator('view', viewGenerator)
-  plop.setGenerator('component', componentGenerator)
-  plop.setGenerator('store', storeGenerator)
-}

+ 5 - 2
postcss.config.js

@@ -1,5 +1,8 @@
+// https://github.com/michael-ciniawsky/postcss-load-config
+
 module.exports = {
-  plugins: {
-    autoprefixer: {}
+  'plugins': {
+    // to edit target browsers: use "browserslist" field in package.json
+    'autoprefixer': {}
   }
 }

BIN
public/favicon.ico


+ 78 - 0
src/components/Breadcrumb/index.vue

@@ -0,0 +1,78 @@
+<template>
+  <el-breadcrumb class="app-breadcrumb" separator="/">
+    <transition-group name="breadcrumb">
+      <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path">
+        <span v-if="item.redirect==='noRedirect'||index==levelList.length-1" class="no-redirect">{{ item.meta.title }}</span>
+        <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
+      </el-breadcrumb-item>
+    </transition-group>
+  </el-breadcrumb>
+</template>
+
+<script>
+import pathToRegexp from 'path-to-regexp'
+
+export default {
+  data() {
+    return {
+      levelList: null
+    }
+  },
+  watch: {
+    $route() {
+      this.getBreadcrumb()
+    }
+  },
+  created() {
+    this.getBreadcrumb()
+  },
+  methods: {
+    getBreadcrumb() {
+      // only show routes with meta.title
+      let matched = this.$route.matched.filter(item => item.meta && item.meta.title)
+      const first = matched[0]
+
+      if (!this.isDashboard(first)) {
+        matched = [{ path: '/dashboard', meta: { title: 'Dashboard' }}].concat(matched)
+      }
+
+      this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
+    },
+    isDashboard(route) {
+      const name = route && route.name
+      if (!name) {
+        return false
+      }
+      return name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase()
+    },
+    pathCompile(path) {
+      // To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561
+      const { params } = this.$route
+      var toPath = pathToRegexp.compile(path)
+      return toPath(params)
+    },
+    handleLink(item) {
+      const { redirect, path } = item
+      if (redirect) {
+        this.$router.push(redirect)
+        return
+      }
+      this.$router.push(this.pathCompile(path))
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.app-breadcrumb.el-breadcrumb {
+  display: inline-block;
+  font-size: 14px;
+  line-height: 50px;
+  margin-left: 8px;
+
+  .no-redirect {
+    color: #97a8be;
+    cursor: text;
+  }
+}
+</style>

+ 44 - 0
src/components/Hamburger/index.vue

@@ -0,0 +1,44 @@
+<template>
+  <div style="padding: 0 15px;" @click="toggleClick">
+    <svg
+      :class="{'is-active':isActive}"
+      class="hamburger"
+      viewBox="0 0 1024 1024"
+      xmlns="http://www.w3.org/2000/svg"
+      width="64"
+      height="64"
+    >
+      <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" />
+    </svg>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'Hamburger',
+  props: {
+    isActive: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    toggleClick() {
+      this.$emit('toggleClick')
+    }
+  }
+}
+</script>
+
+<style scoped>
+.hamburger {
+  display: inline-block;
+  vertical-align: middle;
+  width: 20px;
+  height: 20px;
+}
+
+.hamburger.is-active {
+  transform: rotate(180deg);
+}
+</style>

+ 62 - 0
src/components/SvgIcon/index.vue

@@ -0,0 +1,62 @@
+<template>
+  <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
+  <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
+    <use :xlink:href="iconName" />
+  </svg>
+</template>
+
+<script>
+// doc: https://panjiachen.github.io/vue-element-admin-site/feature/component/svg-icon.html#usage
+import { isExternal } from '@/utils/validate'
+
+export default {
+  name: 'SvgIcon',
+  props: {
+    iconClass: {
+      type: String,
+      required: true
+    },
+    className: {
+      type: String,
+      default: ''
+    }
+  },
+  computed: {
+    isExternal() {
+      return isExternal(this.iconClass)
+    },
+    iconName() {
+      return `#icon-${this.iconClass}`
+    },
+    svgClass() {
+      if (this.className) {
+        return 'svg-icon ' + this.className
+      } else {
+        return 'svg-icon'
+      }
+    },
+    styleExternalIcon() {
+      return {
+        mask: `url(${this.iconClass}) no-repeat 50% 50%`,
+        '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.svg-icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+
+.svg-external-icon {
+  background-color: currentColor;
+  mask-size: cover!important;
+  display: inline-block;
+}
+</style>

+ 0 - 1
src/main.js

@@ -17,7 +17,6 @@ import globalComponents from './components/globalComponents'
 import App from './App'
 import store from './store'
 import base from './assets/utils/prototype/index'
-// require('./mock')
 
 import * as filters from './filters' // global filters
 

+ 64 - 0
src/permission.js

@@ -0,0 +1,64 @@
+import router from './router'
+import store from './store'
+import { Message } from 'element-ui'
+import NProgress from 'nprogress' // progress bar
+import 'nprogress/nprogress.css' // progress bar style
+import { getToken } from '@/utils/auth' // get token from cookie
+import getPageTitle from '@/utils/get-page-title'
+
+NProgress.configure({ showSpinner: false }) // NProgress Configuration
+
+const whiteList = ['/login'] // no redirect whitelist
+
+router.beforeEach(async(to, from, next) => {
+  // start progress bar
+  NProgress.start()
+
+  // set page title
+  document.title = getPageTitle(to.meta.title)
+
+  // determine whether the user has logged in
+  const hasToken = getToken()
+
+  if (hasToken) {
+    if (to.path === '/login') {
+      // if is logged in, redirect to the home page
+      next({ path: '/' })
+      NProgress.done()
+    } else {
+      const hasGetUserInfo = store.getters.name
+      if (hasGetUserInfo) {
+        next()
+      } else {
+        try {
+          // get user info
+          await store.dispatch('user/getInfo')
+
+          next()
+        } catch (error) {
+          // remove token and go to login page to re-login
+          await store.dispatch('user/resetToken')
+          Message.error(error || 'Has Error')
+          next(`/login?redirect=${to.path}`)
+          NProgress.done()
+        }
+      }
+    }
+  } else {
+    /* has no token*/
+
+    if (whiteList.indexOf(to.path) !== -1) {
+      // in the free login whitelist, go directly
+      next()
+    } else {
+      // other pages that do not have permission to access are redirected to the login page.
+      next(`/login?redirect=${to.path}`)
+      NProgress.done()
+    }
+  }
+})
+
+router.afterEach(() => {
+  // finish progress bar
+  NProgress.done()
+})

+ 0 - 6
test.http

@@ -1,6 +0,0 @@
-POST www.stock.com/admin/province HTTP/1.1
-content-type: application/json
-
-{
-    
-}

+ 98 - 0
tests/unit/components/Breadcrumb.spec.js

@@ -0,0 +1,98 @@
+import { mount, createLocalVue } from '@vue/test-utils'
+import VueRouter from 'vue-router'
+import ElementUI from 'element-ui'
+import Breadcrumb from '@/components/Breadcrumb/index.vue'
+
+const localVue = createLocalVue()
+localVue.use(VueRouter)
+localVue.use(ElementUI)
+
+const routes = [
+  {
+    path: '/',
+    name: 'home',
+    children: [{
+      path: 'dashboard',
+      name: 'dashboard'
+    }]
+  },
+  {
+    path: '/menu',
+    name: 'menu',
+    children: [{
+      path: 'menu1',
+      name: 'menu1',
+      meta: { title: 'menu1' },
+      children: [{
+        path: 'menu1-1',
+        name: 'menu1-1',
+        meta: { title: 'menu1-1' }
+      },
+      {
+        path: 'menu1-2',
+        name: 'menu1-2',
+        redirect: 'noredirect',
+        meta: { title: 'menu1-2' },
+        children: [{
+          path: 'menu1-2-1',
+          name: 'menu1-2-1',
+          meta: { title: 'menu1-2-1' }
+        },
+        {
+          path: 'menu1-2-2',
+          name: 'menu1-2-2'
+        }]
+      }]
+    }]
+  }]
+
+const router = new VueRouter({
+  routes
+})
+
+describe('Breadcrumb.vue', () => {
+  const wrapper = mount(Breadcrumb, {
+    localVue,
+    router
+  })
+  it('dashboard', () => {
+    router.push('/dashboard')
+    const len = wrapper.findAll('.el-breadcrumb__inner').length
+    expect(len).toBe(1)
+  })
+  it('normal route', () => {
+    router.push('/menu/menu1')
+    const len = wrapper.findAll('.el-breadcrumb__inner').length
+    expect(len).toBe(2)
+  })
+  it('nested route', () => {
+    router.push('/menu/menu1/menu1-2/menu1-2-1')
+    const len = wrapper.findAll('.el-breadcrumb__inner').length
+    expect(len).toBe(4)
+  })
+  it('no meta.title', () => {
+    router.push('/menu/menu1/menu1-2/menu1-2-2')
+    const len = wrapper.findAll('.el-breadcrumb__inner').length
+    expect(len).toBe(3)
+  })
+  // it('click link', () => {
+  //   router.push('/menu/menu1/menu1-2/menu1-2-2')
+  //   const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner')
+  //   const second = breadcrumbArray.at(1)
+  //   console.log(breadcrumbArray)
+  //   const href = second.find('a').attributes().href
+  //   expect(href).toBe('#/menu/menu1')
+  // })
+  // it('noRedirect', () => {
+  //   router.push('/menu/menu1/menu1-2/menu1-2-1')
+  //   const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner')
+  //   const redirectBreadcrumb = breadcrumbArray.at(2)
+  //   expect(redirectBreadcrumb.contains('a')).toBe(false)
+  // })
+  it('last breadcrumb', () => {
+    router.push('/menu/menu1/menu1-2/menu1-2-1')
+    const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner')
+    const redirectBreadcrumb = breadcrumbArray.at(3)
+    expect(redirectBreadcrumb.contains('a')).toBe(false)
+  })
+})

+ 8 - 8
tests/unit/components/Hamburger.spec.js

@@ -1,13 +1,13 @@
 import { shallowMount } from '@vue/test-utils'
-import Hamburger from '@/components/Hamburger/main.vue'
+import Hamburger from '@/components/Hamburger/index.vue'
 describe('Hamburger.vue', () => {
-  it('toggle click', () => {
-    const wrapper = shallowMount(Hamburger)
-    const mockFn = jest.fn()
-    wrapper.vm.$on('toggleClick', mockFn)
-    wrapper.find('.hamburger').trigger('click')
-    expect(mockFn).toBeCalled()
-  })
+  // it('toggle click', () => {
+  //   const wrapper = shallowMount(Hamburger)
+  //   const mockFn = jest.fn()
+  //   wrapper.vm.$on('toggleClick', mockFn)
+  //   wrapper.find('.hamburger').trigger('click')
+  //   expect(mockFn).toBeCalled()
+  // })
   it('prop isActive', () => {
     const wrapper = shallowMount(Hamburger)
     wrapper.setProps({ isActive: true })

+ 1 - 0
tests/unit/utils/formatTime.spec.js

@@ -1,4 +1,5 @@
 import { formatTime } from '@/utils/index.js'
+
 describe('Utils:formatTime', () => {
   const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01"
   const retrofit = 5 * 1000

+ 0 - 2
tests/unit/utils/parseTime.spec.js

@@ -5,11 +5,9 @@ describe('Utils:parseTime', () => {
   it('timestamp', () => {
     expect(parseTime(d)).toBe('2018-07-13 17:54:01')
   })
-
   it('timestamp string', () => {
     expect(parseTime((d + ''))).toBe('2018-07-13 17:54:01')
   })
-
   it('ten digits timestamp', () => {
     expect(parseTime((d / 1000).toFixed(0))).toBe('2018-07-13 17:54:01')
   })

+ 9 - 20
tests/unit/utils/validate.spec.js

@@ -1,28 +1,17 @@
-import { validUsername, validURL, validLowerCase, validUpperCase, validAlphabets } from '@/utils/validate.js'
+import { validUsername, isExternal } from '@/utils/validate.js'
+
 describe('Utils:validate', () => {
   it('validUsername', () => {
     expect(validUsername('admin')).toBe(true)
     expect(validUsername('editor')).toBe(true)
     expect(validUsername('xxxx')).toBe(false)
   })
-  it('validURL', () => {
-    expect(validURL('https://github.com/PanJiaChen/vue-element-admin')).toBe(true)
-    expect(validURL('http://github.com/PanJiaChen/vue-element-admin')).toBe(true)
-    expect(validURL('github.com/PanJiaChen/vue-element-admin')).toBe(false)
-  })
-  it('validLowerCase', () => {
-    expect(validLowerCase('abc')).toBe(true)
-    expect(validLowerCase('Abc')).toBe(false)
-    expect(validLowerCase('123abc')).toBe(false)
-  })
-  it('validUpperCase', () => {
-    expect(validUpperCase('ABC')).toBe(true)
-    expect(validUpperCase('Abc')).toBe(false)
-    expect(validUpperCase('123ABC')).toBe(false)
-  })
-  it('validAlphabets', () => {
-    expect(validAlphabets('ABC')).toBe(true)
-    expect(validAlphabets('Abc')).toBe(true)
-    expect(validAlphabets('123aBC')).toBe(false)
+  it('isExternal', () => {
+    expect(isExternal('https://github.com/PanJiaChen/vue-element-admin')).toBe(true)
+    expect(isExternal('http://github.com/PanJiaChen/vue-element-admin')).toBe(true)
+    expect(isExternal('github.com/PanJiaChen/vue-element-admin')).toBe(false)
+    expect(isExternal('/dashboard')).toBe(false)
+    expect(isExternal('./dashboard')).toBe(false)
+    expect(isExternal('dashboard')).toBe(false)
   })
 })

+ 0 - 17
text.text

@@ -1,17 +0,0 @@
-采购工差单管理
-{
-    采购单管理详情接口缺少工差单信息字段
-    采购工差单详情列表接口缺少判断是销售工差单还是咨询工差单
-
-}
-销售订单退货(未发货)
-{
-    缺少订单退货流程,业务审批用
-}
-流程中心
-{
-    返回的id值不正确,需要添加一个用于判断订单是咨询还是销售的字段,返回的code值不正确。
-    待办{
-        
-    }
-}

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