Pārlūkot izejas kodu

feat: 删除admin

xiansin 2 gadi atpakaļ
vecāks
revīzija
6000c7f83d
100 mainītis faili ar 0 papildinājumiem un 2878 dzēšanām
  1. 0 14
      admin/.editorconfig
  2. 0 7
      admin/.env.development
  3. 0 8
      admin/.env.production
  4. 0 8
      admin/.env.staging
  5. 0 4
      admin/.eslintignore
  6. 0 199
      admin/.eslintrc.js
  7. 0 22
      admin/.gitignore
  8. 0 5
      admin/.travis.yml
  9. 0 21
      admin/LICENSE
  10. 0 1
      admin/README.md
  11. 0 14
      admin/babel.config.js
  12. 0 35
      admin/build/index.js
  13. BIN
      admin/dist/favicon.ico
  14. 0 0
      admin/dist/index.html
  15. 0 0
      admin/dist/static/css/app.1fd2e4a2.css
  16. 0 1
      admin/dist/static/css/chunk-108aa6c0.1ffac5c4.css
  17. 0 0
      admin/dist/static/css/chunk-2ebb70fd.5af944f2.css
  18. 0 1
      admin/dist/static/css/chunk-35fdf859.b1dd7a76.css
  19. 0 0
      admin/dist/static/css/chunk-3c4ffd20.a7f215c8.css
  20. 0 1
      admin/dist/static/css/chunk-444aa728.73fcc08e.css
  21. 0 1
      admin/dist/static/css/chunk-6ac0bf10.434f3abf.css
  22. 0 1
      admin/dist/static/css/chunk-7d76bb29.59d1c6b8.css
  23. 0 0
      admin/dist/static/css/chunk-ab13d2fa.13a7e89e.css
  24. 0 0
      admin/dist/static/css/chunk-ba681190.2b5710d5.css
  25. 0 1
      admin/dist/static/css/chunk-e34561be.fbb524c4.css
  26. 0 0
      admin/dist/static/css/chunk-libs.6c6afc1b.css
  27. BIN
      admin/dist/static/fonts/element-icons.535877f5.woff
  28. BIN
      admin/dist/static/fonts/element-icons.732389de.ttf
  29. BIN
      admin/dist/static/img/401.089007e7.gif
  30. BIN
      admin/dist/static/img/404.a57b6f31.png
  31. BIN
      admin/dist/static/img/404_cloud.0f4bc32b.png
  32. BIN
      admin/dist/static/img/ck_logo2.3660a340.png
  33. BIN
      admin/dist/static/img/login_bg.c8cb7c12.png
  34. BIN
      admin/dist/static/img/login_person.99735ceb.png
  35. BIN
      admin/dist/static/img/logo.70abf323.png
  36. 0 0
      admin/dist/static/js/app.c9e230f6.js
  37. 0 0
      admin/dist/static/js/chunk-09edf666.011ef410.js
  38. 0 0
      admin/dist/static/js/chunk-108aa6c0.4a53a4e9.js
  39. 0 1
      admin/dist/static/js/chunk-2d0e5357.75de929d.js
  40. 0 9
      admin/dist/static/js/chunk-2d21e918.ca0bd271.js
  41. 0 1
      admin/dist/static/js/chunk-2d230fe7.a21e19a8.js
  42. 0 0
      admin/dist/static/js/chunk-2ebb70fd.8d97a2fa.js
  43. 0 1
      admin/dist/static/js/chunk-35fdf859.ce1aa75e.js
  44. 0 0
      admin/dist/static/js/chunk-3c4ffd20.69414002.js
  45. 0 0
      admin/dist/static/js/chunk-444aa728.bab381b6.js
  46. 0 0
      admin/dist/static/js/chunk-6ac0bf10.904bc94f.js
  47. 0 0
      admin/dist/static/js/chunk-7d76bb29.49839c8b.js
  48. 0 1
      admin/dist/static/js/chunk-ab13d2fa.d8db382f.js
  49. 0 0
      admin/dist/static/js/chunk-ba681190.a4b2fd82.js
  50. 0 0
      admin/dist/static/js/chunk-e34561be.c3c558b6.js
  51. 0 0
      admin/dist/static/js/chunk-elementUI.bb38e23d.js
  52. 0 0
      admin/dist/static/js/chunk-libs.1c027863.js
  53. 0 24
      admin/jest.config.js
  54. 0 9
      admin/jsconfig.json
  55. 0 110
      admin/package.json
  56. 0 9
      admin/plopfile.js
  57. 0 5
      admin/postcss.config.js
  58. BIN
      admin/public/favicon.ico
  59. 0 15
      admin/public/index.html
  60. 0 11
      admin/src/App.vue
  61. 0 15
      admin/src/api/common.js
  62. 0 16
      admin/src/api/index.js
  63. 0 33
      admin/src/api/system/log.js
  64. 0 41
      admin/src/api/system/purview.js
  65. 0 48
      admin/src/api/system/role.js
  66. BIN
      admin/src/assets/401_images/401.gif
  67. BIN
      admin/src/assets/404_images/404.png
  68. BIN
      admin/src/assets/404_images/404_cloud.png
  69. BIN
      admin/src/assets/common/logo.png
  70. BIN
      admin/src/assets/custom-theme/fonts/element-icons.ttf
  71. BIN
      admin/src/assets/custom-theme/fonts/element-icons.woff
  72. 0 0
      admin/src/assets/custom-theme/index.css
  73. 0 82
      admin/src/components/Breadcrumb/index.vue
  74. 0 50
      admin/src/components/DrawerWrapper/index.vue
  75. 0 109
      admin/src/components/Exports/index.vue
  76. 0 44
      admin/src/components/Hamburger/index.vue
  77. 0 22
      admin/src/components/Iconfont/index.vue
  78. 0 66
      admin/src/components/Pagination/index.vue
  79. 0 261
      admin/src/components/Upload/index.vue
  80. 0 54
      admin/src/config/purview.js
  81. 0 37
      admin/src/directive/auth/auth.js
  82. 0 13
      admin/src/directive/auth/index.js
  83. 0 16
      admin/src/directive/index.js
  84. 0 68
      admin/src/filters/index.js
  85. 0 68
      admin/src/layout/components/AppMain.vue
  86. 0 138
      admin/src/layout/components/Navbar.vue
  87. 0 26
      admin/src/layout/components/Sidebar/FixiOSBug.js
  88. 0 41
      admin/src/layout/components/Sidebar/Item.vue
  89. 0 43
      admin/src/layout/components/Sidebar/Link.vue
  90. 0 82
      admin/src/layout/components/Sidebar/Logo.vue
  91. 0 94
      admin/src/layout/components/Sidebar/SidebarItem.vue
  92. 0 54
      admin/src/layout/components/Sidebar/index.vue
  93. 0 94
      admin/src/layout/components/TagsView/ScrollPane.vue
  94. 0 292
      admin/src/layout/components/TagsView/index.vue
  95. 0 4
      admin/src/layout/components/index.js
  96. 0 95
      admin/src/layout/index.vue
  97. 0 45
      admin/src/layout/mixin/ResizeHandler.js
  98. 0 68
      admin/src/main.js
  99. 0 76
      admin/src/permission.js
  100. 0 143
      admin/src/router/index.js

+ 0 - 14
admin/.editorconfig

xqd
@@ -1,14 +0,0 @@
-# https://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

+ 0 - 7
admin/.env.development

xqd
@@ -1,7 +0,0 @@
-# just a flag
-ENV = 'development'
-
-# base api
-VUE_APP_BASE_API = 'http://www.zsy.me/api'
-
-VUE_APP_IMAGE_URL = 'http://www.zsy.me'

+ 0 - 8
admin/.env.production

xqd
@@ -1,8 +0,0 @@
-# just a flag
-ENV = 'production'
-
-# base api
-VUE_APP_BASE_API = 'https://t3.9026.com/api'
-
-VUE_APP_IMAGE_URL = 'https://t3.9026.com/'
-

+ 0 - 8
admin/.env.staging

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

+ 0 - 4
admin/.eslintignore

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

+ 0 - 199
admin/.eslintrc.js

xqd
@@ -1,199 +0,0 @@
-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']
-  }
-}

+ 0 - 22
admin/.gitignore

xqd
@@ -1,22 +0,0 @@
-.DS_Store
-node_modules/
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-**/*.log
-
-tests/**/coverage/
-tests/e2e/reports
-selenium-debug.log
-
-# Editor directories and files
-.idea
-.vscode
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.local
-
-package-lock.json
-yarn.lock

+ 0 - 5
admin/.travis.yml

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

+ 0 - 21
admin/LICENSE

xqd
@@ -1,21 +0,0 @@
-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.

+ 0 - 1
admin/README.md

xqd
@@ -1 +0,0 @@
-## 张四爷后台管理

+ 0 - 14
admin/babel.config.js

xqd
@@ -1,14 +0,0 @@
-module.exports = {
-  presets: [
-    // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app
-    '@vue/cli-plugin-babel/preset'
-  ],
-  'env': {
-    'development': {
-      // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require().
-      // This plugin can significantly increase the speed of hot updates, when you have a large number of pages.
-      // https://panjiachen.github.io/vue-element-admin-site/guide/advanced/lazy-loading.html
-      'plugins': ['dynamic-import-node']
-    }
-  }
-}

+ 0 - 35
admin/build/index.js

xqd
@@ -1,35 +0,0 @@
-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}`)
-}

BIN
admin/dist/favicon.ico


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/index.html


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/css/app.1fd2e4a2.css


+ 0 - 1
admin/dist/static/css/chunk-108aa6c0.1ffac5c4.css

xqd
@@ -1 +0,0 @@
-.pagination-custom{margin-top:10px}.card[data-v-35bc302e]{width:320px;border:1px solid #e4e8eb;text-align:left}.card .item[data-v-35bc302e]{padding:5px 15px;line-height:1.05}.card .detail[data-v-35bc302e]{border-top:1px solid #e4e8eb;height:45px;line-height:45px;padding:0 10px;color:#9a9a9a}.router-link[data-v-35bc302e]{margin-right:10px}.cover-img[data-v-35bc302e]{width:80px}.detail-wrapper[data-v-535c6a6c]{background:#fff}.detail-wrapper .bottom[data-v-535c6a6c]{width:100%;height:60px;background:#fff;-webkit-box-shadow:0 -3px 10px rgba(0,0,0,.1);box-shadow:0 -3px 10px rgba(0,0,0,.1);position:relative;z-index:1000001}.detail-wrapper .bottom .el-button[data-v-535c6a6c]{min-width:5rem}.app-main>.detail-wrapper[data-v-535c6a6c]{background:#fff}.app-main>.detail-wrapper .bottom[data-v-535c6a6c]{width:calc(100% + 20px);left:0;position:fixed;bottom:0;right:0}.temp-item[data-v-e3bc873a]{padding:10px 0;position:relative;border-bottom:1px solid #eee}.temp-item.draggable[data-v-e3bc873a]{cursor:move}.temp-item.draggable[data-v-e3bc873a]:before{font-family:element-icons!important;content:"";width:10px;height:10px;position:absolute;left:-6px;-webkit-transform:translateY(-10px);transform:translateY(-10px);color:#666}.temp-item.draggable[data-v-e3bc873a]:hover:before{color:#000}.temp-item .temp-input[data-v-e3bc873a]{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center;margin:0 10px}.temp-item .temp-color[data-v-e3bc873a]{width:80px;text-align:center}.temp-item .temp-op[data-v-e3bc873a]{width:80px;margin-left:10px;cursor:pointer}.temp-item .temp-op>i[data-v-e3bc873a]{font-size:22px;color:#f56c6c}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/css/chunk-2ebb70fd.5af944f2.css


+ 0 - 1
admin/dist/static/css/chunk-35fdf859.b1dd7a76.css

xqd
@@ -1 +0,0 @@
-.errPage-container[data-v-35ca77fc]{width:800px;max-width:100%;margin:100px auto}.errPage-container .pan-back-btn[data-v-35ca77fc]{background:#008489;color:#fff;border:none!important}.errPage-container .pan-gif[data-v-35ca77fc]{margin:0 auto;display:block}.errPage-container .pan-img[data-v-35ca77fc]{display:block;margin:0 auto;width:100%}.errPage-container .text-jumbo[data-v-35ca77fc]{font-size:60px;font-weight:700;color:#484848}.errPage-container .list-unstyled[data-v-35ca77fc]{font-size:14px}.errPage-container .list-unstyled li[data-v-35ca77fc]{padding-bottom:5px}.errPage-container .list-unstyled a[data-v-35ca77fc]{color:#008489;text-decoration:none}.errPage-container .list-unstyled a[data-v-35ca77fc]:hover{text-decoration:underline}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/css/chunk-3c4ffd20.a7f215c8.css


+ 0 - 1
admin/dist/static/css/chunk-444aa728.73fcc08e.css

xqd
@@ -1 +0,0 @@
-.brand-search{margin-bottom:10px}.brand-search .div-box{margin-right:10px}.brand-search .clear-where{color:#409eff;cursor:pointer}.router-link[data-v-07d23ddc]{margin-right:10px}.cover-img[data-v-07d23ddc]{width:80px}.detail-wrapper[data-v-535c6a6c]{background:#fff}.detail-wrapper .bottom[data-v-535c6a6c]{width:100%;height:60px;background:#fff;-webkit-box-shadow:0 -3px 10px rgba(0,0,0,.1);box-shadow:0 -3px 10px rgba(0,0,0,.1);position:relative;z-index:1000001}.detail-wrapper .bottom .el-button[data-v-535c6a6c]{min-width:5rem}.app-main>.detail-wrapper[data-v-535c6a6c]{background:#fff}.app-main>.detail-wrapper .bottom[data-v-535c6a6c]{width:calc(100% + 20px);left:0;position:fixed;bottom:0;right:0}.exports{display:inline-block}.exports-dialog{z-index:9999!important}.el-dialog .el-button{width:auto!important}.el-button~.app-exports{margin-left:10px;margin-right:5px}.pagination-custom{margin-top:10px}

+ 0 - 1
admin/dist/static/css/chunk-6ac0bf10.434f3abf.css

xqd
@@ -1 +0,0 @@
-.brand-search{margin-bottom:10px}.brand-search .div-box{margin-right:10px}.brand-search .clear-where{color:#409eff;cursor:pointer}.pagination-custom{margin-top:10px}

+ 0 - 1
admin/dist/static/css/chunk-7d76bb29.59d1c6b8.css

xqd
@@ -1 +0,0 @@
-.area-tree{width:500px}.area-tree .el-tree-node__content{height:42px}.custom-tree-node[data-v-6b28b8c0]{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-size:16px;float:right;border-bottom:1px solid #f5f5f5}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/css/chunk-ab13d2fa.13a7e89e.css


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/css/chunk-ba681190.2b5710d5.css


+ 0 - 1
admin/dist/static/css/chunk-e34561be.fbb524c4.css

xqd
@@ -1 +0,0 @@
-.pagination-custom{margin-top:10px}.detail-wrapper[data-v-535c6a6c]{background:#fff}.detail-wrapper .bottom[data-v-535c6a6c]{width:100%;height:60px;background:#fff;-webkit-box-shadow:0 -3px 10px rgba(0,0,0,.1);box-shadow:0 -3px 10px rgba(0,0,0,.1);position:relative;z-index:1000001}.detail-wrapper .bottom .el-button[data-v-535c6a6c]{min-width:5rem}.app-main>.detail-wrapper[data-v-535c6a6c]{background:#fff}.app-main>.detail-wrapper .bottom[data-v-535c6a6c]{width:calc(100% + 20px);left:0;position:fixed;bottom:0;right:0}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/css/chunk-libs.6c6afc1b.css


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


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


BIN
admin/dist/static/img/401.089007e7.gif


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


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


BIN
admin/dist/static/img/ck_logo2.3660a340.png


BIN
admin/dist/static/img/login_bg.c8cb7c12.png


BIN
admin/dist/static/img/login_person.99735ceb.png


BIN
admin/dist/static/img/logo.70abf323.png


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/js/app.c9e230f6.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/js/chunk-09edf666.011ef410.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/js/chunk-108aa6c0.4a53a4e9.js


+ 0 - 1
admin/dist/static/js/chunk-2d0e5357.75de929d.js

xqd
@@ -1 +0,0 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0e5357"],{9406:function(n,a,t){"use strict";t.r(a);var e=function(){var n=this,a=n.$createElement,t=n._self._c||a;return t("div",{staticClass:"dashboard-container"},[n._v(" Dashboard ")])},r=[],c={name:"Dashboard",data:function(){return{}},created:function(){}},s=c,o=t("2877"),u=Object(o["a"])(s,e,r,!1,null,null,null);a["default"]=u.exports}}]);

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 9
admin/dist/static/js/chunk-2d21e918.ca0bd271.js


+ 0 - 1
admin/dist/static/js/chunk-2d230fe7.a21e19a8.js

xqd
@@ -1 +0,0 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d230fe7"],{ef3c:function(e,r,n){"use strict";n.r(r);n("5319"),n("ac1f");var t,u,a={created:function(){var e=this.$route,r=e.params,n=e.query,t=r.path;this.$router.replace({path:"/"+t,query:n})},render:function(e){return e()}},c=a,o=n("2877"),p=Object(o["a"])(c,t,u,!1,null,null,null);r["default"]=p.exports}}]);

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/js/chunk-2ebb70fd.8d97a2fa.js


+ 0 - 1
admin/dist/static/js/chunk-35fdf859.ce1aa75e.js

xqd
@@ -1 +0,0 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-35fdf859"],{"1a27":function(t,a,i){"use strict";i("a5e5")},"24e2":function(t,a,i){"use strict";i.r(a);var e=function(){var t=this,a=t.$createElement,i=t._self._c||a;return i("div",{staticClass:"errPage-container"},[i("el-button",{staticClass:"pan-back-btn",attrs:{icon:"el-icon-arrow-left"},on:{click:t.back}},[t._v(" 返回 ")]),i("el-row",[i("el-col",{attrs:{span:12}},[i("h1",{staticClass:"text-jumbo text-ginormous"},[t._v(" Oops! ")]),t._v(" gif来源"),i("a",{attrs:{href:"https://zh.airbnb.com/",target:"_blank"}},[t._v("airbnb")]),t._v(" 页面 "),i("h2",[t._v("你没有权限去该页面")]),i("h6",[t._v("如有不满请联系你领导")]),i("ul",{staticClass:"list-unstyled"},[i("li",[t._v("或者你可以去:")]),i("li",{staticClass:"link-type"},[i("router-link",{attrs:{to:"/dashboard"}},[t._v(" 回首页 ")])],1),i("li",{staticClass:"link-type"},[i("a",{attrs:{href:"https://www.taobao.com/"}},[t._v("随便看看")])]),i("li",[i("a",{attrs:{href:"#"},on:{click:function(a){a.preventDefault(),t.dialogVisible=!0}}},[t._v("点我看图")])])])]),i("el-col",{attrs:{span:12}},[i("img",{attrs:{src:t.errGif,width:"313",height:"428",alt:"Girl has dropped her ice cream."}})])],1),i("el-dialog",{attrs:{visible:t.dialogVisible,title:"随便看"},on:{"update:visible":function(a){t.dialogVisible=a}}},[i("img",{staticClass:"pan-img",attrs:{src:t.ewizardClap}})])],1)},s=[],r=i("cc6c"),l=i.n(r),n={name:"Page401",data:function(){return{errGif:l.a+"?"+ +new Date,ewizardClap:"https://wpimg.wallstcn.com/007ef517-bafd-4066-aae4-6883632d9646",dialogVisible:!1}},methods:{back:function(){this.$route.query.noGoBack?this.$router.push({path:"/dashboard"}):this.$router.go(-1)}}},c=n,o=(i("1a27"),i("2877")),u=Object(o["a"])(c,e,s,!1,null,"35ca77fc",null);a["default"]=u.exports},a5e5:function(t,a,i){},cc6c:function(t,a,i){t.exports=i.p+"static/img/401.089007e7.gif"}}]);

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/js/chunk-3c4ffd20.69414002.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/js/chunk-444aa728.bab381b6.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/js/chunk-6ac0bf10.904bc94f.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/js/chunk-7d76bb29.49839c8b.js


+ 0 - 1
admin/dist/static/js/chunk-ab13d2fa.d8db382f.js

xqd
@@ -1 +0,0 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-ab13d2fa"],{"122a":function(t,s,a){},"1db4":function(t,s,a){"use strict";a.r(s);var e=function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"wscn-http404-container"},[a("div",{staticClass:"wscn-http404"},[t._m(0),a("div",{staticClass:"bullshit"},[a("div",{staticClass:"bullshit__oops"},[t._v("OOPS!")]),t._m(1),a("div",{staticClass:"bullshit__headline"},[t._v(t._s(t.message))]),a("div",{staticClass:"bullshit__info"},[t._v("Please check that the URL you entered is correct, or click the button below to return to the homepage.")]),a("a",{staticClass:"bullshit__return-home",attrs:{href:""}},[t._v("Back to home")])])])])},c=[function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",{staticClass:"pic-404"},[e("img",{staticClass:"pic-404__parent",attrs:{src:a("a36b"),alt:"404"}}),e("img",{staticClass:"pic-404__child left",attrs:{src:a("26fc"),alt:"404"}}),e("img",{staticClass:"pic-404__child mid",attrs:{src:a("26fc"),alt:"404"}}),e("img",{staticClass:"pic-404__child right",attrs:{src:a("26fc"),alt:"404"}})])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"bullshit__info"},[t._v("All rights reserved "),a("a",{staticStyle:{color:"#20a0ff"},attrs:{href:"https://wallstreetcn.com",target:"_blank"}},[t._v("wallstreetcn")])])}],i={name:"Page404",computed:{message:function(){return"The webmaster said that you can not enter this page..."}}},l=i,n=(a("35e7"),a("2877")),r=Object(n["a"])(l,e,c,!1,null,"26fcd89f",null);s["default"]=r.exports},"26fc":function(t,s,a){t.exports=a.p+"static/img/404_cloud.0f4bc32b.png"},"35e7":function(t,s,a){"use strict";a("122a")},a36b:function(t,s,a){t.exports=a.p+"static/img/404.a57b6f31.png"}}]);

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/js/chunk-ba681190.a4b2fd82.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/js/chunk-e34561be.c3c558b6.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/js/chunk-elementUI.bb38e23d.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/dist/static/js/chunk-libs.1c027863.js


+ 0 - 24
admin/jest.config.js

xqd
@@ -1,24 +0,0 @@
-module.exports = {
-  moduleFileExtensions: ['js', 'jsx', 'json', 'vue'],
-  transform: {
-    '^.+\\.vue$': 'vue-jest',
-    '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':
-      'jest-transform-stub',
-    '^.+\\.jsx?$': 'babel-jest'
-  },
-  moduleNameMapper: {
-    '^@/(.*)$': '<rootDir>/src/$1'
-  },
-  snapshotSerializers: ['jest-serializer-vue'],
-  testMatch: [
-    '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
-  ],
-  collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'],
-  coverageDirectory: '<rootDir>/tests/unit/coverage',
-  // 'collectCoverage': true,
-  'coverageReporters': [
-    'lcov',
-    'text-summary'
-  ],
-  testURL: 'http://localhost/'
-}

+ 0 - 9
admin/jsconfig.json

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

+ 0 - 110
admin/package.json

xqd
@@ -1,110 +0,0 @@
-{
-  "name": "vue-element-admin",
-  "version": "4.4.0",
-  "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features",
-  "author": "Pan <panfree23@gmail.com>",
-  "scripts": {
-    "dev": "vue-cli-service serve",
-    "lint": "eslint --ext .js,.vue src",
-    "build:prod": "vue-cli-service build",
-    "build:stage": "vue-cli-service build --mode staging",
-    "preview": "node build/index.js --preview",
-    "new": "plop",
-    "test:unit": "jest --clearCache && vue-cli-service test:unit",
-    "test:ci": "npm run lint && npm run test:unit"
-  },
-  "dependencies": {
-    "@wangeditor/editor": "^5.0.1",
-    "@wangeditor/editor-for-vue": "^1.0.0",
-    "axios": "0.18.1",
-    "clipboard": "2.0.4",
-    "core-js": "3.6.5",
-    "driver.js": "0.9.5",
-    "echarts": "4.2.1",
-    "element-ui": "^2.15.8",
-    "flex.css": "^1.1.7",
-    "fuse.js": "3.4.4",
-    "js-cookie": "^3.0.1",
-    "js-file-download": "^0.4.12",
-    "jsonlint": "1.6.3",
-    "jszip": "3.2.1",
-    "lodash": "^4.17.21",
-    "normalize.css": "7.0.0",
-    "nprogress": "0.2.0",
-    "path-to-regexp": "2.4.0",
-    "qs": "^6.10.3",
-    "screenfull": "4.2.0",
-    "script-loader": "0.7.2",
-    "sortablejs": "1.8.4",
-    "vue": "^2.6.14",
-    "vue-count-to": "1.0.13",
-    "vue-router": "3.0.2",
-    "vue-splitpane": "1.0.4",
-    "vuedraggable": "^2.20.0",
-    "vuex": "3.1.0"
-  },
-  "devDependencies": {
-    "@vue/cli-plugin-babel": "4.4.4",
-    "@vue/cli-plugin-eslint": "4.4.4",
-    "@vue/cli-plugin-unit-jest": "4.4.4",
-    "@vue/cli-service": "4.4.4",
-    "@vue/test-utils": "1.0.0-beta.29",
-    "autoprefixer": "9.5.1",
-    "babel-eslint": "10.1.0",
-    "babel-jest": "23.6.0",
-    "babel-plugin-dynamic-import-node": "2.3.3",
-    "chalk": "2.4.2",
-    "chokidar": "2.1.5",
-    "connect": "3.6.6",
-    "eslint": "6.7.2",
-    "eslint-plugin-vue": "6.2.2",
-    "html-webpack-plugin": "3.2.0",
-    "husky": "1.3.1",
-    "lint-staged": "8.1.5",
-    "plop": "2.3.0",
-    "runjs": "4.3.2",
-    "sass": "1.26.2",
-    "sass-loader": "8.0.2",
-    "script-ext-html-webpack-plugin": "2.1.3",
-    "serve-static": "1.13.2",
-    "svg-sprite-loader": "4.1.3",
-    "svgo": "1.2.0",
-    "vue-template-compiler": "^2.6.14"
-  },
-  "browserslist": [
-    "> 1%",
-    "last 2 versions"
-  ],
-  "bugs": {
-    "url": "https://github.com/PanJiaChen/vue-element-admin/issues"
-  },
-  "engines": {
-    "node": ">=8.9",
-    "npm": ">= 3.0.0"
-  },
-  "keywords": [
-    "vue",
-    "admin",
-    "dashboard",
-    "element-ui",
-    "boilerplate",
-    "admin-template",
-    "management-system"
-  ],
-  "license": "MIT",
-  "lint-staged": {
-    "src/**/*.{js,vue}": [
-      "eslint --fix",
-      "git add"
-    ]
-  },
-  "husky": {
-    "hooks": {
-      "pre-commit": "lint-staged"
-    }
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/PanJiaChen/vue-element-admin.git"
-  }
-}

+ 0 - 9
admin/plopfile.js

xqd
@@ -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)
-}

+ 0 - 5
admin/postcss.config.js

xqd
@@ -1,5 +0,0 @@
-module.exports = {
-  plugins: {
-    autoprefixer: {}
-  }
-}

BIN
admin/public/favicon.ico


+ 0 - 15
admin/public/index.html

xqd
@@ -1,15 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="renderer" content="webkit">
-    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
-    <title><%= webpackConfig.name %></title>
-  </head>
-  <body>
-    <div id="app"></div>
-    <!-- built files will be auto injected -->
-  </body>
-</html>

+ 0 - 11
admin/src/App.vue

xqd
@@ -1,11 +0,0 @@
-<template>
-  <div id="app">
-    <router-view />
-  </div>
-</template>
-
-<script>
-export default {
-  name: 'App'
-}
-</script>

+ 0 - 15
admin/src/api/common.js

xqd
@@ -1,15 +0,0 @@
-/**
- * Created by JianJia.Zhou<jianjia.zhou> on 2022/3/2.
- */
-import request from '@/utils/request'
-
-export function captcha() {
-  return request({
-    url: '/captcha',
-    method: 'get'
-  })
-}
-
-export default {
-  captcha
-}

+ 0 - 16
admin/src/api/index.js

xqd
@@ -1,16 +0,0 @@
-/**
- * Created by JianJia.Zhou<jianjia.zhou> on 2022/3/2.
- */
-import common from './common'
-import purview from './system/purview'
-import role from './system/role'
-import log from './system/log'
-
-const api = {
-  ...common,
-  purview,
-  role,
-  log
-}
-
-export default api

+ 0 - 33
admin/src/api/system/log.js

xqd
@@ -1,33 +0,0 @@
-/**
- * Created by JianJia.Zhou<jianjia.zhou> on 2022/3/11.
- */
-import request from '@/utils/request'
-
-export function operate(params) {
-  return request({
-    url: '/record/operate',
-    method: 'get',
-    params
-  })
-}
-
-export function login(params) {
-  return request({
-    url: '/record/login',
-    method: 'get',
-    params
-  })
-}
-
-export function config() {
-  return request({
-    url: '/record/config',
-    method: 'get'
-  })
-}
-
-export default {
-  operate,
-  login,
-  config
-}

+ 0 - 41
admin/src/api/system/purview.js

xqd
@@ -1,41 +0,0 @@
-/**
- * Created by JianJia.Zhou<jianjia.zhou> on 2022/3/11.
- */
-import request from '@/utils/request'
-
-export function lists(params) {
-  return request({
-    url: '/purview/lists',
-    method: 'get',
-    params
-  })
-}
-export function create(data) {
-  return request({
-    url: '/purview/create',
-    method: 'post',
-    data
-  })
-}
-
-export async function update(data) {
-  return request({
-    url: `/purview/${data.id}/update`,
-    method: 'post',
-    data
-  })
-}
-
-export function destroy(id) {
-  return request({
-    url: `/purview/${id}/destroy`,
-    method: 'post'
-  })
-}
-
-export default {
-  lists,
-  create,
-  update,
-  destroy
-}

+ 0 - 48
admin/src/api/system/role.js

xqd
@@ -1,48 +0,0 @@
-/**
- * Created by JianJia.Zhou<jianjia.zhou> on 2022/3/11.
- */
-import request from '@/utils/request'
-
-export function lists(params) {
-  return request({
-    url: '/purview/role/lists',
-    method: 'get',
-    params
-  })
-}
-export function create(data) {
-  return request({
-    url: '/purview/role/create',
-    method: 'post',
-    data
-  })
-}
-
-export async function show(id) {
-  return request({
-    url: `/purview/role/${id}/show`
-  })
-}
-
-export async function update(data) {
-  return request({
-    url: `/purview/role/${data.id}/update`,
-    method: 'post',
-    data
-  })
-}
-
-export function destroy(id) {
-  return request({
-    url: `/purview/role/${id}/destroy`,
-    method: 'post'
-  })
-}
-
-export default {
-  lists,
-  create,
-  show,
-  update,
-  destroy
-}

BIN
admin/src/assets/401_images/401.gif


BIN
admin/src/assets/404_images/404.png


BIN
admin/src/assets/404_images/404_cloud.png


BIN
admin/src/assets/common/logo.png


BIN
admin/src/assets/custom-theme/fonts/element-icons.ttf


BIN
admin/src/assets/custom-theme/fonts/element-icons.woff


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
admin/src/assets/custom-theme/index.css


+ 0 - 82
admin/src/components/Breadcrumb/index.vue

xqd
@@ -1,82 +0,0 @@
-<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(route) {
-      // if you go to the redirect page, do not update the breadcrumbs
-      if (route.path.startsWith('/redirect/')) {
-        return
-      }
-      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: '概览' }}].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>

+ 0 - 50
admin/src/components/DrawerWrapper/index.vue

xqd
@@ -1,50 +0,0 @@
-<template>
-  <div class="detail-wrapper" flex="dir:top">
-    <el-scrollbar wrap-class="scrollbar-wrapper">
-      <slot name="body" />
-    </el-scrollbar>
-    <div class="bottom" flex="main:center cross:center">
-      <slot name="bottom" />
-    </div>
-  </div>
-</template>
-
-<script>
-export default {
-  name: 'DrawerWrapper',
-  data() {
-    return {}
-  },
-  computed: {},
-  methods: {}
-}
-</script>
-
-<style lang="scss" scoped>
-  .detail-wrapper{
-    background: #fff;
-    .bottom{
-      width: 100%;
-      height: 60px;
-      background: #fff;
-      box-shadow: 0 -3px 10px rgba(0,0,0,.1);
-      position: relative;
-      z-index: 1000001;
-      .el-button{
-        min-width: 5rem;
-      }
-    }
-  }
-  .app-main{
-    >.detail-wrapper{
-      background: #fff;
-      .bottom{
-        width: calc(100% + 20px);
-        left: 0;
-        position: fixed;
-        bottom: 0;
-        right: 0;
-      }
-    }
-  }
-</style>

+ 0 - 109
admin/src/components/Exports/index.vue

xqd
@@ -1,109 +0,0 @@
-<template>
-  <div class="exports">
-    <!--导出对话框-->
-    <el-dialog
-      title="正在导出"
-      :visible.sync="exportForm.barVisible"
-      class="app-exports-dialog"
-      width="25%"
-      @open="handleOpen"
-      @close="handleClose"
-    >
-      <div class="modal-body">
-        <el-progress :text-inside="true" :stroke-width="18" :percentage="exportForm.percentage" />
-      </div>
-      <div v-if="exportForm.percentage === 100 && exportForm.downloadUrl" flex="dir:right" style="margin-top: 20px;">
-        <a target="_blank" :href="exportForm.downloadUrl">
-          <input
-            οnclick="this.parentNode.click();"
-            type="button"
-            value="点击下载"
-            class="el-button el-button--primary el-button--small"
-          >
-        </a>
-      </div>
-    </el-dialog>
-    <div style="display:inline-block; margin-right: 5px;" @click="handleExport">
-      <slot />
-    </div>
-  </div>
-</template>
-
-<script>
-const _ = require('lodash/core')
-export default {
-  name: 'Exports',
-  props: {
-    searchForm: {
-      type: Object,
-      default() {
-        return {}
-      }
-    },
-    downUrl: {
-      type: String,
-      required: true
-    }
-  },
-  data() {
-    return {
-      exportForm: {
-        barVisible: false,
-        downloadUrl: '',
-        percentage: 0
-      }
-    }
-  },
-  methods: {
-    handleExport() {
-      this.exportForm.barVisible = true
-      this.exportForm.percentage = 0
-      this.exportForm.downloadUrl = ''
-      const search = _.clone(this.searchForm)
-      this.$request({
-        url: this.downUrl,
-        method: 'get',
-        params: _.extend(search, { flag: 'EXPORT' })
-      }).then(e => {
-        if (e.data.code === 0) {
-          this.exportForm.percentage = 100
-          this.exportForm.downloadUrl = e.data.data.downloadUrl
-        } else {
-          this.$message.error(e.data.msg)
-        }
-      }).catch(e => {
-        this.$message.error('导出失败')
-        console.error(e)
-      })
-    },
-    handleOpen() {
-      /* let style = document.createElement('style')
-        style.id = 'app_exports'
-        style.append(`.v-modal{ z-index: 998 !important;}`)
-        document.querySelector('head').append(style)*/
-    },
-    handleClose() {
-      // document.querySelector('#app_exports').remove()
-    }
-  }
-}
-</script>
-
-<style lang="scss">
-  .exports {
-    display: inline-block;
-  }
-
-  .exports-dialog {
-    z-index: 9999 !important;
-  }
-
-  .el-dialog .el-button {
-    width: initial !important;
-  }
-
-  .el-button ~ .app-exports {
-    margin-left: 10px;
-    margin-right: 5px;
-  }
-</style>

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

xqd
@@ -1,44 +0,0 @@
-<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>

+ 0 - 22
admin/src/components/Iconfont/index.vue

xqd
@@ -1,22 +0,0 @@
-<template>
-  <i class="iconfont" :class="name" :style="{fontSize: size + 'px'}" />
-</template>
-
-<script>
-export default {
-  name: 'Iconfont',
-  props: {
-    name: {
-      type: String,
-      required: true
-    },
-    size: {
-      type: Number,
-      default: 16
-    }
-  }
-}
-</script>
-
-<style scoped>
-</style>

+ 0 - 66
admin/src/components/Pagination/index.vue

xqd
@@ -1,66 +0,0 @@
-<template>
-  <div class="pagination-custom" flex="dir:right cross:center" :style="{ marginTop: top, marginBottom: bottom }">
-    <el-pagination
-      v-if="Object.keys(pagination).length"
-      background
-      :current-page.sync="pagination.currentPage"
-      layout="total, sizes, prev, pager, next"
-      :total="pagination.total"
-      :page-sizes="pageSizes"
-      :page-size="pageSizes[0]"
-      @current-change="handlePageChange"
-      @size-change="handleSizeChange"
-    />
-  </div>
-</template>
-
-<script>
-import defaultSetting from '@/settings'
-export default {
-  name: 'Pagination',
-  props: {
-    top: {
-      type: Number,
-      default: 10
-    },
-    bottom: {
-      type: Number,
-      default: 10
-    },
-    pagination: {
-      type: Object,
-      default() {
-        return {
-          currentPage: 1,
-          defaultPageSize: 10,
-          limit: 15,
-          offset: 0,
-          pageCount: 1,
-          pageSize: 15,
-          total: 100
-        }
-      },
-      required: true
-    }
-  },
-  data() {
-    return {
-      pageSizes: defaultSetting.pageSizes
-    }
-  },
-  methods: {
-    handlePageChange(page) {
-      this.$emit('change', page)
-    },
-    handleSizeChange(size) {
-      this.$emit('changeSize', size)
-    }
-  }
-}
-</script>
-
-<style lang="scss">
-  .pagination-custom{
-    margin-top: 10px;
-  }
-</style>

+ 0 - 261
admin/src/components/Upload/index.vue

xqd
@@ -1,261 +0,0 @@
-<template>
-  <div class="upload-container" flex="main:left cross:center" :class="{ single: isSingle }">
-    <div v-for="(file,index) in fileList" :key="index" class="upload-image" :class="{file: !isImage(file.path)}">
-      <div class="upload-image-remove" flex="main:center cross:center">
-        <el-popover
-          v-model="file.popoverVisible"
-          placement="top"
-          width="160"
-          trigger="hover"
-        >
-          <p>确定删除?</p>
-          <div style="text-align: right; margin: 0">
-            <el-button size="mini" type="text" @click="file.popoverVisible = false">取消</el-button>
-            <el-button type="primary" size="mini" @click="handleRemove(index)">确定</el-button>
-          </div>
-          <i slot="reference" class="el-icon-delete-solid delete" />
-        </el-popover>
-        <template v-if="!isImage(file.path)">
-          <i class="el-icon-download download" @click="handleDown(file.url)" />
-        </template>
-      </div>
-      <template v-if="isImage(file.path)">
-        <el-image
-          :src="file.url"
-          :preview-src-list="previewList"
-        />
-      </template>
-      <template v-else>
-        <iconfont :name="fileExtIcons[getFileExt(file.path)] ? fileExtIcons[getFileExt(file.path)] : fileExtIcons.other" class="files-icon" />
-      </template>
-    </div>
-    <el-upload
-      v-loading="loading"
-      class="uploader-box"
-      :action="actionUrl"
-      :multiple="isMultiple"
-      :show-file-list="false"
-      :limit="max"
-      :accept="accept"
-      :on-success="handleSuccess"
-      :before-upload="beforeUpload"
-    >
-      <i slot="default" class="el-icon-upload upload-icon" />
-    </el-upload>
-  </div>
-</template>
-
-<script>
-const _ = require('lodash')
-import Axios from 'axios'
-import fileDownload from 'js-file-download'
-import { ossImg, replaceOssImg, getFilename } from '@/utils'
-import { isImage } from '@/utils/validate'
-export default {
-  name: 'Upload',
-  props: {
-    isSingle: {
-      type: Boolean,
-      default: false
-    },
-    isMultiple: {
-      type: Boolean,
-      default: false
-    },
-    // eslint-disable-next-line vue/require-default-prop
-    value: {
-      // eslint-disable-next-line vue/require-prop-type-constructor
-      type: String | Object | Array
-    },
-    max: {
-      type: Number,
-      default: 999
-    },
-    accept: {
-      type: String,
-      default: 'image/*'
-    }
-  },
-  data() {
-    return {
-      loading: false,
-      actionUrl: process.env.VUE_APP_BASE_API + '/upload',
-      fileList: [],
-      initData: this.value,
-      fileExtIcons: {
-        zip: 'icon-zip',
-        xls: 'icon-Excel',
-        xlsx: 'icon-Excel',
-        ppt: 'icon-f-ppt',
-        pptx: 'icon-f-ppt',
-        doc: 'icon-Word',
-        pdf: 'icon-pdf-fill',
-        txt: 'icon-txt',
-        other: 'icon-qitawenjian'
-      }
-    }
-  },
-  computed: {
-    previewList() {
-      return _.map(this.fileList, 'url')
-    },
-    inputValue() {
-      const arr = _.map(this.fileList, 'path')
-      return this.isSingle ? arr.toString() : arr
-    }
-  },
-  watch: {
-    value(val) {
-      if (!_.isEmpty(val) && !_.eq(this.initData, val)) {
-        this.initData = val
-      }
-    },
-    initData() {
-      this.fileList = []
-      if (Array.isArray(this.initData)) {
-        this.initData.forEach(obj => {
-          this.fileList.push({
-            path: replaceOssImg(obj),
-            url: ossImg(obj),
-            popoverVisible: false
-          })
-        })
-      } else {
-        this.fileList.push({
-          path: replaceOssImg(this.initData),
-          url: ossImg(this.initData),
-          popoverVisible: false
-        })
-      }
-    }
-  },
-  methods: {
-    handleSuccess(res) {
-      this.loading = false
-      const { code, data, message } = res
-      if (code !== 200) {
-        this.$message({
-          message: message,
-          type: 'error',
-          duration: 2 * 1000
-        })
-      } else {
-        data.popoverVisible = false
-        this.fileList.push(data)
-        this.$emit('input', this.inputValue)
-      }
-    },
-    beforeUpload(e) {
-      this.loading = true
-    },
-    handleRemove(index) {
-      this.popoverVisible = false
-      this.fileList.splice(index, 1)
-      this.$emit('input', this.inputValue)
-    },
-    isImage(file) {
-      return isImage(file)
-    },
-    handleDown(url) {
-      Axios.get(url, {
-        responseType: 'blob'
-      }).then(res => {
-        fileDownload(res.data, getFilename(url).filename)
-      })
-    },
-    getFileExt(url) {
-      return getFilename(url).ext
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-  .upload-container{
-    flex-wrap: wrap;
-    &.single{
-      width: 138px;
-      height: 128px;
-      overflow: hidden;
-    }
-    .uploader-box{
-      background-color: #fbfdff;
-      border: 1px dashed #c0ccda;
-      border-radius: 6px;
-      width: 128px;
-      height: 128px;
-      cursor: pointer;
-      display: flex;
-      align-items: center;
-      justify-content: center;
-      margin-bottom: 10px;
-      overflow: hidden;
-      .upload-icon{
-        font-size: 26px;
-        color: #555;
-      }
-    }
-    .download{
-      margin-left: 10px;
-    }
-    .files-icon{
-      font-size: 64px !important;
-      position: absolute;
-      top: 50%;
-      left: 50%;
-      transform: translate(-50%, -50%);
-      color: #666;
-    }
-    .el-upload{
-      line-height: 146px;
-    }
-    .upload-image{
-      width: 128px;
-      height: 128px;
-      border: 1px dashed #c0ccda;
-      border-radius: 6px;
-      background-color: #fbfdff;
-      padding: 4px;
-      margin-bottom: 10px;
-      position: relative;
-      margin-right: 10px;
-      animation: upload-success cubic-bezier(0, 0.24, 1, 0.94) .5s;
-      &:hover{
-        background: #f5f5f5;
-        .upload-image-remove{
-          opacity: 1;
-        }
-      }
-      &.file{
-        background: #fff;
-      }
-      .el-image{
-        width: 100%;
-        height: 100%;
-        border-radius: 3px;
-      }
-      .upload-image-remove{
-        position: absolute;
-        top: 0;
-        left: 0;
-        z-index: 11;
-        width: 100%;
-        height: 100%;
-        background: rgba(0,0,0,.4);
-        color: #fff;
-        font-size: 20px;
-        cursor: pointer;
-        border-radius: 6px;
-        opacity: 0;
-        transition: .3s;
-        .plus{
-          margin-right: 25px;
-        }
-      }
-    }
-    @keyframes upload-success {
-      0%{transform: translateY(-50px)}
-      100%{transform: translateY(0px)}
-    }
-  }
-</style>

+ 0 - 54
admin/src/config/purview.js

xqd
@@ -1,54 +0,0 @@
-/**
- * Created by JianJia.Zhou<jianjia.zhou> on 2022/3/11.
- */
-export default {
-  brand: {
-    // 用于节点auth
-    auth: 'brand',
-    brand: {
-      index: 'brand/index',
-      create: 'brand/create',
-      edit: 'brand/edit',
-      delete: 'brand/delete',
-      disabled: 'brand/disabled',
-      template: 'brand/template'
-    },
-    account: {
-      index: 'brand/account/index',
-      create: 'brand/account/create',
-      edit: 'brand/account/edit',
-      disabled: 'brand/account/disabled'
-    }
-  },
-  system: {
-    auth: 'system',
-    purview: {
-      index: 'system/purview',
-      create: 'purview/create',
-      edit: 'purview/edit',
-      delete: 'purview/delete'
-    },
-    role: {
-      index: 'system/role',
-      create: 'role/create',
-      edit: 'role/edit',
-      delete: 'role/delete'
-    },
-    area: {
-      index: 'system/area',
-      create: 'area/create',
-      edit: 'area/edit',
-      delete: 'area/delete'
-    },
-    template: {
-      index: 'system/template',
-      create: 'template/create',
-      edit: 'template/edit',
-      delete: 'template/delete'
-    },
-    record: {
-      login: 'record/login',
-      operate: 'record/operate'
-    }
-  }
-}

+ 0 - 37
admin/src/directive/auth/auth.js

xqd
@@ -1,37 +0,0 @@
-import store from '@/store'
-import { isEmpty } from 'lodash'
-
-function checkAuth(el, binding) {
-  const { value } = binding
-  const auths = store.getters && store.getters.auths
-  if (isEmpty(value)) throw new Error(`need auths! Like v-auth="['admin','editor']"`)
-
-  let hasAuth = false
-  if (value && value instanceof Array) {
-    if (value.length > 0) {
-      hasAuth = value.some(auth => {
-        return auths.includes(auth)
-      })
-    }
-  } else if (value && value instanceof String) {
-    hasAuth = auths.includes(value)
-  }
-  // 一个权限都没有表示所有的权限都有,即超管
-  if (!hasAuth && auths.length) {
-    if (el.nodeName === 'BUTTON') {
-      el.setAttribute('disabled', true)
-      el.className += ' is-disabled'
-    } else {
-      el.parentNode && el.parentNode.removeChild(el)
-    }
-  }
-}
-
-export default {
-  inserted(el, binding) {
-    checkAuth(el, binding)
-  },
-  update(el, binding) {
-    checkAuth(el, binding)
-  }
-}

+ 0 - 13
admin/src/directive/auth/index.js

xqd
@@ -1,13 +0,0 @@
-import auth from './auth'
-
-const install = function(Vue) {
-  Vue.directive('auth', auth)
-}
-
-if (window.Vue) {
-  window['auth'] = auth
-  Vue.use(install); // eslint-disable-line
-}
-
-auth.install = install
-export default auth

+ 0 - 16
admin/src/directive/index.js

xqd
@@ -1,16 +0,0 @@
-/**
- * Created by JianJia.Zhou<jianjia.zhou> on 2022/3/11.
- */
-
-import auth from './auth'
-const directives = {
-  auth
-}
-
-export default {
-  install(Vue) {
-    Object.keys(directives).forEach((key) => {
-      Vue.directive(key, directives[key])
-    })
-  }
-}

+ 0 - 68
admin/src/filters/index.js

xqd
@@ -1,68 +0,0 @@
-// import parseTime, formatTime and set to filter
-export { parseTime, formatTime } from '@/utils'
-
-/**
- * Show plural label if time is plural number
- * @param {number} time
- * @param {string} label
- * @return {string}
- */
-function pluralize(time, label) {
-  if (time === 1) {
-    return time + label
-  }
-  return time + label + 's'
-}
-
-/**
- * @param {number} time
- */
-export function timeAgo(time) {
-  const between = Date.now() / 1000 - Number(time)
-  if (between < 3600) {
-    return pluralize(~~(between / 60), ' minute')
-  } else if (between < 86400) {
-    return pluralize(~~(between / 3600), ' hour')
-  } else {
-    return pluralize(~~(between / 86400), ' day')
-  }
-}
-
-/**
- * Number formatting
- * like 10000 => 10k
- * @param {number} num
- * @param {number} digits
- */
-export function numberFormatter(num, digits) {
-  const si = [
-    { value: 1E18, symbol: 'E' },
-    { value: 1E15, symbol: 'P' },
-    { value: 1E12, symbol: 'T' },
-    { value: 1E9, symbol: 'G' },
-    { value: 1E6, symbol: 'M' },
-    { value: 1E3, symbol: 'k' }
-  ]
-  for (let i = 0; i < si.length; i++) {
-    if (num >= si[i].value) {
-      return (num / si[i].value).toFixed(digits).replace(/\.0+$|(\.[0-9]*[1-9])0+$/, '$1') + si[i].symbol
-    }
-  }
-  return num.toString()
-}
-
-/**
- * 10000 => "10,000"
- * @param {number} num
- */
-export function toThousandFilter(num) {
-  return (+num || 0).toString().replace(/^-?\d+/g, m => m.replace(/(?=(?!\b)(\d{3})+$)/g, ','))
-}
-
-/**
- * Upper case first char
- * @param {String} string
- */
-export function uppercaseFirst(string) {
-  return string.charAt(0).toUpperCase() + string.slice(1)
-}

+ 0 - 68
admin/src/layout/components/AppMain.vue

xqd
@@ -1,68 +0,0 @@
-<template>
-  <section class="app-main" :class="{hasMainGap: hasMainGap }">
-    <transition name="fade-transform" mode="out-in">
-      <keep-alive :include="cachedViews">
-        <router-view :key="key" />
-      </keep-alive>
-    </transition>
-  </section>
-</template>
-
-<script>
-import { hasMainGap } from '@/settings'
-export default {
-  name: 'AppMain',
-  computed: {
-    cachedViews() {
-      return this.$store.state.tagsView.cachedViews
-    },
-    hasMainGap() {
-      return hasMainGap
-    },
-    key() {
-      return this.$route.path
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.app-main {
-  /* 50= navbar  50  */
-  min-height: calc(100vh - 50px);
-  width: 100%;
-  position: relative;
-  overflow: hidden;
-  /*padding: 10px;*/
-}
-
-.fixed-header+.app-main {
-  padding-top: 50px;
-  &.hasMainGap{
-    padding: 55px 5px 5px 5px;
-  }
-}
-
-.hasTagsView {
-  .app-main {
-    /* 84 = navbar + tags-view = 50 + 34 */
-    min-height: calc(100vh - 84px);
-  }
-
-  .fixed-header+.app-main {
-    padding-top: 84px;
-    &.hasMainGap{
-      padding: 88px 5px 5px 5px;
-    }
-  }
-}
-</style>
-
-<style lang="scss">
-// fix css style bug in open el-dialog
-.el-popup-parent--hidden {
-  .fixed-header {
-    padding-right: 15px;
-  }
-}
-</style>

+ 0 - 138
admin/src/layout/components/Navbar.vue

xqd
@@ -1,138 +0,0 @@
-<template>
-  <div class="navbar">
-    <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
-
-    <breadcrumb id="breadcrumb-container" class="breadcrumb-container" />
-
-    <div class="right-menu">
-
-      <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
-        <div class="avatar-wrapper">
-          <img :src="avatar+'?imageView2/1/w/80/h/80'" class="user-avatar">
-          <i class="el-icon-caret-bottom" />
-        </div>
-        <el-dropdown-menu slot="dropdown">
-          <router-link to="/">
-            <el-dropdown-item>首页</el-dropdown-item>
-          </router-link>
-          <el-dropdown-item divided @click.native="logout">
-            <span style="display:block;">退出</span>
-          </el-dropdown-item>
-        </el-dropdown-menu>
-      </el-dropdown>
-    </div>
-  </div>
-</template>
-
-<script>
-import { mapGetters } from 'vuex'
-import Breadcrumb from '@/components/Breadcrumb'
-import Hamburger from '@/components/Hamburger'
-
-export default {
-  components: {
-    Breadcrumb,
-    Hamburger
-  },
-  computed: {
-    ...mapGetters([
-      'sidebar',
-      'avatar',
-      'device'
-    ])
-  },
-  methods: {
-    toggleSideBar() {
-      this.$store.dispatch('app/toggleSideBar')
-    },
-    async logout() {
-      await this.$store.dispatch('user/logout')
-      this.$router.push(`/login?redirect=${this.$route.fullPath}`)
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.navbar {
-  height: 50px;
-  overflow: hidden;
-  position: relative;
-  background: #fff;
-  box-shadow: 0 1px 4px rgba(0,21,41,.08);
-
-  .hamburger-container {
-    line-height: 46px;
-    height: 100%;
-    float: left;
-    cursor: pointer;
-    transition: background .3s;
-    -webkit-tap-highlight-color:transparent;
-
-    &:hover {
-      background: rgba(0, 0, 0, .025)
-    }
-  }
-
-  .breadcrumb-container {
-    float: left;
-  }
-
-  .errLog-container {
-    display: inline-block;
-    vertical-align: top;
-  }
-
-  .right-menu {
-    float: right;
-    height: 100%;
-    line-height: 50px;
-
-    &:focus {
-      outline: none;
-    }
-
-    .right-menu-item {
-      display: inline-block;
-      padding: 0 8px;
-      height: 100%;
-      font-size: 18px;
-      color: #5a5e66;
-      vertical-align: text-bottom;
-
-      &.hover-effect {
-        cursor: pointer;
-        transition: background .3s;
-
-        &:hover {
-          background: rgba(0, 0, 0, .025)
-        }
-      }
-    }
-
-    .avatar-container {
-      margin-right: 30px;
-
-      .avatar-wrapper {
-        margin-top: 5px;
-        position: relative;
-
-        .user-avatar {
-          cursor: pointer;
-          width: 40px;
-          height: 40px;
-          border-radius: 10px;
-        }
-
-        .el-icon-caret-bottom {
-          cursor: pointer;
-          position: absolute;
-          right: -20px;
-          top: 25px;
-          font-size: 12px;
-        }
-      }
-    }
-  }
-}
-</style>

+ 0 - 26
admin/src/layout/components/Sidebar/FixiOSBug.js

xqd
@@ -1,26 +0,0 @@
-export default {
-  computed: {
-    device() {
-      return this.$store.state.app.device
-    }
-  },
-  mounted() {
-    // In order to fix the click on menu on the ios device will trigger the mouseleave bug
-    // https://github.com/PanJiaChen/vue-element-admin/issues/1135
-    this.fixBugIniOS()
-  },
-  methods: {
-    fixBugIniOS() {
-      const $subMenu = this.$refs.subMenu
-      if ($subMenu) {
-        const handleMouseleave = $subMenu.handleMouseleave
-        $subMenu.handleMouseleave = (e) => {
-          if (this.device === 'mobile') {
-            return
-          }
-          handleMouseleave(e)
-        }
-      }
-    }
-  }
-}

+ 0 - 41
admin/src/layout/components/Sidebar/Item.vue

xqd
@@ -1,41 +0,0 @@
-<script>
-export default {
-  name: 'MenuItem',
-  functional: true,
-  props: {
-    icon: {
-      type: String,
-      default: ''
-    },
-    title: {
-      type: String,
-      default: ''
-    }
-  },
-  render(h, context) {
-    const { icon, title } = context.props
-    const vnodes = []
-
-    if (icon) {
-      if (icon.includes('el-icon')) {
-        vnodes.push(<i class={[icon, 'sub-el-icon']} />)
-      } else {
-        vnodes.push(<iconfont name={icon} />)
-      }
-    }
-
-    if (title) {
-      vnodes.push(<span slot='title'>{(title)}</span>)
-    }
-    return vnodes
-  }
-}
-</script>
-
-<style scoped>
-.sub-el-icon {
-  color: currentColor;
-  width: 1em;
-  height: 1em;
-}
-</style>

+ 0 - 43
admin/src/layout/components/Sidebar/Link.vue

xqd
@@ -1,43 +0,0 @@
-<template>
-  <component :is="type" v-bind="linkProps(to)">
-    <slot />
-  </component>
-</template>
-
-<script>
-import { isExternal } from '@/utils/validate'
-
-export default {
-  props: {
-    to: {
-      type: String,
-      required: true
-    }
-  },
-  computed: {
-    isExternal() {
-      return isExternal(this.to)
-    },
-    type() {
-      if (this.isExternal) {
-        return 'a'
-      }
-      return 'router-link'
-    }
-  },
-  methods: {
-    linkProps(to) {
-      if (this.isExternal) {
-        return {
-          href: to,
-          target: '_blank',
-          rel: 'noopener'
-        }
-      }
-      return {
-        to: to
-      }
-    }
-  }
-}
-</script>

+ 0 - 82
admin/src/layout/components/Sidebar/Logo.vue

xqd
@@ -1,82 +0,0 @@
-<template>
-  <div class="sidebar-logo-container" :class="{'collapse':collapse}">
-    <transition name="sidebarLogoFade">
-      <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
-        <img v-if="logo" src="@/assets/common/logo.png" class="sidebar-logo">
-        <h1 v-else class="sidebar-title">{{ title }} </h1>
-      </router-link>
-      <router-link v-else key="expand" class="sidebar-logo-link" to="/">
-        <img v-if="logo" src="@/assets/common/logo.png" class="sidebar-logo">
-        <h1 class="sidebar-title">{{ title }} </h1>
-      </router-link>
-    </transition>
-  </div>
-</template>
-
-<script>
-export default {
-  name: 'SidebarLogo',
-  props: {
-    collapse: {
-      type: Boolean,
-      required: true
-    }
-  },
-  data() {
-    return {
-      title: '城市会员管理后台',
-      logo: true
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.sidebarLogoFade-enter-active {
-  transition: opacity 1.5s;
-}
-
-.sidebarLogoFade-enter,
-.sidebarLogoFade-leave-to {
-  opacity: 0;
-}
-
-.sidebar-logo-container {
-  position: relative;
-  width: 100%;
-  height: 50px;
-  line-height: 50px;
-  background: #2b2f3a;
-  text-align: center;
-  overflow: hidden;
-
-  & .sidebar-logo-link {
-    height: 100%;
-    width: 100%;
-
-    & .sidebar-logo {
-      width: 32px;
-      height: 32px;
-      vertical-align: middle;
-      margin-right: 12px;
-    }
-
-    & .sidebar-title {
-      display: inline-block;
-      margin: 0;
-      color: #fff;
-      font-weight: 600;
-      line-height: 50px;
-      font-size: 14px;
-      font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
-      vertical-align: middle;
-    }
-  }
-
-  &.collapse {
-    .sidebar-logo {
-      margin-right: 0px;
-    }
-  }
-}
-</style>

+ 0 - 94
admin/src/layout/components/Sidebar/SidebarItem.vue

xqd
@@ -1,94 +0,0 @@
-<template>
-  <div v-if="!item.hidden">
-    <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow">
-      <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)">
-        <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}">
-          <item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="onlyOneChild.meta.title" />
-        </el-menu-item>
-      </app-link>
-    </template>
-
-    <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
-      <template slot="title">
-        <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" />
-      </template>
-      <sidebar-item
-        v-for="child in item.children"
-        :key="child.path"
-        :is-nest="true"
-        :item="child"
-        :base-path="resolvePath(child.path)"
-        class="nest-menu"
-      />
-    </el-submenu>
-  </div>
-</template>
-
-<script>
-import path from 'path'
-import { isExternal } from '@/utils/validate'
-import Item from './Item'
-import AppLink from './Link'
-import FixiOSBug from './FixiOSBug'
-
-export default {
-  name: 'SidebarItem',
-  components: { Item, AppLink },
-  mixins: [FixiOSBug],
-  props: {
-    // route object
-    item: {
-      type: Object,
-      required: true
-    },
-    isNest: {
-      type: Boolean,
-      default: false
-    },
-    basePath: {
-      type: String,
-      default: ''
-    }
-  },
-  data() {
-    // To fix https://github.com/PanJiaChen/vue-admin-template/issues/237
-    // TODO: refactor with render function
-    this.onlyOneChild = null
-    return {}
-  },
-  methods: {
-    hasOneShowingChild(children = [], parent) {
-      const showingChildren = children.filter(item => {
-        if (item.hidden) {
-          return false
-        } else {
-          // Temp set(will be used if only has one showing child)
-          this.onlyOneChild = item
-          return true
-        }
-      })
-      // When there is only one child router, the child router is displayed by default
-      if (showingChildren.length === 1 && parent.path === '/') {
-        return true
-      }
-
-      // Show parent if there are no child router to display
-      if (showingChildren.length === 0) {
-        this.onlyOneChild = { ... parent, path: '', noShowingChildren: true }
-        return true
-      }
-
-      return false
-    },
-    resolvePath(routePath) {
-      if (isExternal(routePath)) {
-        return routePath
-      }
-      if (isExternal(this.basePath)) {
-        return this.basePath
-      }
-      return path.resolve(this.basePath, routePath)
-    }
-  }
-}
-</script>

+ 0 - 54
admin/src/layout/components/Sidebar/index.vue

xqd
@@ -1,54 +0,0 @@
-<template>
-  <div :class="{'has-logo':showLogo}">
-    <logo v-if="showLogo" :collapse="isCollapse" />
-    <el-scrollbar wrap-class="scrollbar-wrapper">
-      <el-menu
-        :default-active="activeMenu"
-        :collapse="isCollapse"
-        :background-color="variables.menuBg"
-        :text-color="variables.menuText"
-        :unique-opened="false"
-        :active-text-color="variables.menuActiveText"
-        :collapse-transition="false"
-        mode="vertical"
-      >
-        <sidebar-item v-for="route in permission_routes" :key="route.path" :item="route" :base-path="route.path" />
-      </el-menu>
-    </el-scrollbar>
-  </div>
-</template>
-
-<script>
-import { mapGetters } from 'vuex'
-import Logo from './Logo'
-import SidebarItem from './SidebarItem'
-import variables from '@/styles/variables.scss'
-
-export default {
-  components: { SidebarItem, Logo },
-  computed: {
-    ...mapGetters([
-      'permission_routes',
-      'sidebar'
-    ]),
-    activeMenu() {
-      const route = this.$route
-      const { meta, path } = route
-      // if set path, the sidebar will highlight the path you set
-      if (meta.activeMenu) {
-        return meta.activeMenu
-      }
-      return path
-    },
-    showLogo() {
-      return this.$store.state.settings.sidebarLogo
-    },
-    variables() {
-      return variables
-    },
-    isCollapse() {
-      return !this.sidebar.opened
-    }
-  }
-}
-</script>

+ 0 - 94
admin/src/layout/components/TagsView/ScrollPane.vue

xqd
@@ -1,94 +0,0 @@
-<template>
-  <el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.native.prevent="handleScroll">
-    <slot />
-  </el-scrollbar>
-</template>
-
-<script>
-const tagAndTagSpacing = 4 // tagAndTagSpacing
-
-export default {
-  name: 'ScrollPane',
-  data() {
-    return {
-      left: 0
-    }
-  },
-  computed: {
-    scrollWrapper() {
-      return this.$refs.scrollContainer.$refs.wrap
-    }
-  },
-  mounted() {
-    this.scrollWrapper.addEventListener('scroll', this.emitScroll, true)
-  },
-  beforeDestroy() {
-    this.scrollWrapper.removeEventListener('scroll', this.emitScroll)
-  },
-  methods: {
-    handleScroll(e) {
-      const eventDelta = e.wheelDelta || -e.deltaY * 40
-      const $scrollWrapper = this.scrollWrapper
-      $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4
-    },
-    emitScroll() {
-      this.$emit('scroll')
-    },
-    moveToTarget(currentTag) {
-      const $container = this.$refs.scrollContainer.$el
-      const $containerWidth = $container.offsetWidth
-      const $scrollWrapper = this.scrollWrapper
-      const tagList = this.$parent.$refs.tag
-
-      let firstTag = null
-      let lastTag = null
-
-      // find first tag and last tag
-      if (tagList.length > 0) {
-        firstTag = tagList[0]
-        lastTag = tagList[tagList.length - 1]
-      }
-
-      if (firstTag === currentTag) {
-        $scrollWrapper.scrollLeft = 0
-      } else if (lastTag === currentTag) {
-        $scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth
-      } else {
-        // find preTag and nextTag
-        const currentIndex = tagList.findIndex(item => item === currentTag)
-        const prevTag = tagList[currentIndex - 1]
-        const nextTag = tagList[currentIndex + 1]
-
-        // the tag's offsetLeft after of nextTag
-        const afterNextTagOffsetLeft = nextTag.$el.offsetLeft + nextTag.$el.offsetWidth + tagAndTagSpacing
-
-        // the tag's offsetLeft before of prevTag
-        const beforePrevTagOffsetLeft = prevTag.$el.offsetLeft - tagAndTagSpacing
-
-        if (afterNextTagOffsetLeft > $scrollWrapper.scrollLeft + $containerWidth) {
-          $scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth
-        } else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) {
-          $scrollWrapper.scrollLeft = beforePrevTagOffsetLeft
-        }
-      }
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.scroll-container {
-  white-space: nowrap;
-  position: relative;
-  overflow: hidden;
-  width: 100%;
-  ::v-deep {
-    .el-scrollbar__bar {
-      bottom: 0px;
-    }
-    .el-scrollbar__wrap {
-      height: 49px;
-    }
-  }
-}
-</style>

+ 0 - 292
admin/src/layout/components/TagsView/index.vue

xqd
@@ -1,292 +0,0 @@
-<template>
-  <div id="tags-view-container" class="tags-view-container">
-    <scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll">
-      <router-link
-        v-for="tag in visitedViews"
-        ref="tag"
-        :key="tag.path"
-        :class="isActive(tag)?'active':''"
-        :to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
-        tag="span"
-        class="tags-view-item"
-        @click.middle.native="!isAffix(tag)?closeSelectedTag(tag):''"
-        @contextmenu.prevent.native="openMenu(tag,$event)"
-      >
-        {{ tag.title }}
-        <span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
-      </router-link>
-    </scroll-pane>
-    <ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu">
-      <li @click="refreshSelectedTag(selectedTag)">刷新</li>
-      <li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)">关闭</li>
-      <li @click="closeOthersTags">关闭其他</li>
-      <li @click="closeAllTags(selectedTag)">关闭所有</li>
-    </ul>
-  </div>
-</template>
-
-<script>
-import ScrollPane from './ScrollPane'
-import path from 'path'
-
-export default {
-  components: { ScrollPane },
-  data() {
-    return {
-      visible: false,
-      top: 0,
-      left: 0,
-      selectedTag: {},
-      affixTags: []
-    }
-  },
-  computed: {
-    visitedViews() {
-      return this.$store.state.tagsView.visitedViews
-    },
-    routes() {
-      return this.$store.state.permission.routes
-    }
-  },
-  watch: {
-    $route() {
-      this.addTags()
-      this.moveToCurrentTag()
-    },
-    visible(value) {
-      if (value) {
-        document.body.addEventListener('click', this.closeMenu)
-      } else {
-        document.body.removeEventListener('click', this.closeMenu)
-      }
-    }
-  },
-  mounted() {
-    this.initTags()
-    this.addTags()
-  },
-  methods: {
-    isActive(route) {
-      return route.path === this.$route.path
-    },
-    isAffix(tag) {
-      return tag.meta && tag.meta.affix
-    },
-    filterAffixTags(routes, basePath = '/') {
-      let tags = []
-      routes.forEach(route => {
-        if (route.meta && route.meta.affix) {
-          const tagPath = path.resolve(basePath, route.path)
-          tags.push({
-            fullPath: tagPath,
-            path: tagPath,
-            name: route.name,
-            meta: { ...route.meta }
-          })
-        }
-        if (route.children) {
-          const tempTags = this.filterAffixTags(route.children, route.path)
-          if (tempTags.length >= 1) {
-            tags = [...tags, ...tempTags]
-          }
-        }
-      })
-      return tags
-    },
-    initTags() {
-      const affixTags = this.affixTags = this.filterAffixTags(this.routes)
-      for (const tag of affixTags) {
-        // Must have tag name
-        if (tag.name) {
-          this.$store.dispatch('tagsView/addVisitedView', tag)
-        }
-      }
-    },
-    addTags() {
-      const { name } = this.$route
-      if (name) {
-        this.$store.dispatch('tagsView/addView', this.$route)
-      }
-      return false
-    },
-    moveToCurrentTag() {
-      const tags = this.$refs.tag
-      this.$nextTick(() => {
-        for (const tag of tags) {
-          if (tag.to.path === this.$route.path) {
-            this.$refs.scrollPane.moveToTarget(tag)
-            // when query is different then update
-            if (tag.to.fullPath !== this.$route.fullPath) {
-              this.$store.dispatch('tagsView/updateVisitedView', this.$route)
-            }
-            break
-          }
-        }
-      })
-    },
-    refreshSelectedTag(view) {
-      this.$store.dispatch('tagsView/delCachedView', view).then(() => {
-        const { fullPath } = view
-        this.$nextTick(() => {
-          this.$router.replace({
-            path: '/redirect' + fullPath
-          })
-        })
-      })
-    },
-    closeSelectedTag(view) {
-      this.$store.dispatch('tagsView/delView', view).then(({ visitedViews }) => {
-        if (this.isActive(view)) {
-          this.toLastView(visitedViews, view)
-        }
-      })
-    },
-    closeOthersTags() {
-      this.$router.push(this.selectedTag)
-      this.$store.dispatch('tagsView/delOthersViews', this.selectedTag).then(() => {
-        this.moveToCurrentTag()
-      })
-    },
-    closeAllTags(view) {
-      this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => {
-        if (this.affixTags.some(tag => tag.path === view.path)) {
-          return
-        }
-        this.toLastView(visitedViews, view)
-      })
-    },
-    toLastView(visitedViews, view) {
-      const latestView = visitedViews.slice(-1)[0]
-      if (latestView) {
-        this.$router.push(latestView.fullPath)
-      } else {
-        // now the default is to redirect to the home page if there is no tags-view,
-        // you can adjust it according to your needs.
-        if (view.name === 'Dashboard') {
-          // to reload home page
-          this.$router.replace({ path: '/redirect' + view.fullPath })
-        } else {
-          this.$router.push('/')
-        }
-      }
-    },
-    openMenu(tag, e) {
-      const menuMinWidth = 105
-      const offsetLeft = this.$el.getBoundingClientRect().left // container margin left
-      const offsetWidth = this.$el.offsetWidth // container width
-      const maxLeft = offsetWidth - menuMinWidth // left boundary
-      const left = e.clientX - offsetLeft + 15 // 15: margin right
-
-      if (left > maxLeft) {
-        this.left = maxLeft
-      } else {
-        this.left = left
-      }
-
-      this.top = e.clientY
-      this.visible = true
-      this.selectedTag = tag
-    },
-    closeMenu() {
-      this.visible = false
-    },
-    handleScroll() {
-      this.closeMenu()
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.tags-view-container {
-  height: 34px;
-  width: 100%;
-  background: #fff;
-  border-bottom: 1px solid #d8dce5;
-  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04);
-  .tags-view-wrapper {
-    .tags-view-item {
-      display: inline-block;
-      position: relative;
-      cursor: pointer;
-      height: 26px;
-      line-height: 26px;
-      border: 1px solid #d8dce5;
-      color: #495060;
-      background: #fff;
-      padding: 0 8px;
-      font-size: 12px;
-      margin-left: 5px;
-      margin-top: 4px;
-      &:first-of-type {
-        margin-left: 15px;
-      }
-      &:last-of-type {
-        margin-right: 15px;
-      }
-      &.active {
-        background-color: #42b983;
-        color: #fff;
-        border-color: #42b983;
-        &::before {
-          content: '';
-          background: #fff;
-          display: inline-block;
-          width: 8px;
-          height: 8px;
-          border-radius: 50%;
-          position: relative;
-          margin-right: 2px;
-        }
-      }
-    }
-  }
-  .contextmenu {
-    margin: 0;
-    background: #fff;
-    z-index: 3000;
-    position: absolute;
-    list-style-type: none;
-    padding: 5px 0;
-    border-radius: 4px;
-    font-size: 12px;
-    font-weight: 400;
-    color: #333;
-    box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3);
-    li {
-      margin: 0;
-      padding: 7px 16px;
-      cursor: pointer;
-      &:hover {
-        background: #eee;
-      }
-    }
-  }
-}
-</style>
-
-<style lang="scss">
-//reset element css of el-icon-close
-.tags-view-wrapper {
-  .tags-view-item {
-    .el-icon-close {
-      width: 16px;
-      height: 16px;
-      vertical-align: 2px;
-      border-radius: 50%;
-      text-align: center;
-      transition: all .3s cubic-bezier(.645, .045, .355, 1);
-      transform-origin: 100% 50%;
-      &:before {
-        transform: scale(.6);
-        display: inline-block;
-        vertical-align: -3px;
-      }
-      &:hover {
-        background-color: #b4bccc;
-        color: #fff;
-      }
-    }
-  }
-}
-</style>

+ 0 - 4
admin/src/layout/components/index.js

xqd
@@ -1,4 +0,0 @@
-export { default as AppMain } from './AppMain'
-export { default as Navbar } from './Navbar'
-export { default as Sidebar } from './Sidebar/index.vue'
-export { default as TagsView } from './TagsView/index.vue'

+ 0 - 95
admin/src/layout/index.vue

xqd
@@ -1,95 +0,0 @@
-<template>
-  <div :class="classObj" class="app-wrapper">
-    <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
-    <sidebar class="sidebar-container" />
-    <div :class="{hasTagsView:needTagsView}" class="main-container">
-      <div :class="{'fixed-header':fixedHeader}">
-        <navbar />
-        <tags-view v-if="needTagsView" />
-      </div>
-      <app-main />
-    </div>
-  </div>
-</template>
-
-<script>
-import { AppMain, Navbar, Sidebar, TagsView } from './components'
-import ResizeMixin from './mixin/ResizeHandler'
-import { mapState } from 'vuex'
-
-export default {
-  name: 'Layout',
-  components: {
-    AppMain,
-    Navbar,
-    Sidebar,
-    TagsView
-  },
-  mixins: [ResizeMixin],
-  computed: {
-    ...mapState({
-      sidebar: state => state.app.sidebar,
-      device: state => state.app.device,
-      needTagsView: state => state.settings.tagsView,
-      fixedHeader: state => state.settings.fixedHeader
-    }),
-    classObj() {
-      return {
-        hideSidebar: !this.sidebar.opened,
-        openSidebar: this.sidebar.opened,
-        withoutAnimation: this.sidebar.withoutAnimation,
-        mobile: this.device === 'mobile'
-      }
-    }
-  },
-  methods: {
-    handleClickOutside() {
-      this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-  @import "~@/styles/mixin.scss";
-  @import "~@/styles/variables.scss";
-
-  .app-wrapper {
-    @include clearfix;
-    position: relative;
-    height: 100%;
-    width: 100%;
-
-    &.mobile.openSidebar {
-      position: fixed;
-      top: 0;
-    }
-  }
-
-  .drawer-bg {
-    background: #000;
-    opacity: 0.3;
-    width: 100%;
-    top: 0;
-    height: 100%;
-    position: absolute;
-    z-index: 999;
-  }
-
-  .fixed-header {
-    position: fixed;
-    top: 0;
-    right: 0;
-    z-index: 9;
-    width: calc(100% - #{$sideBarWidth});
-    transition: width 0.28s;
-  }
-
-  .hideSidebar .fixed-header {
-    width: calc(100% - 54px)
-  }
-
-  .mobile .fixed-header {
-    width: 100%;
-  }
-</style>

+ 0 - 45
admin/src/layout/mixin/ResizeHandler.js

xqd
@@ -1,45 +0,0 @@
-import store from '@/store'
-
-const { body } = document
-const WIDTH = 992 // refer to Bootstrap's responsive design
-
-export default {
-  watch: {
-    $route(route) {
-      if (this.device === 'mobile' && this.sidebar.opened) {
-        store.dispatch('app/closeSideBar', { withoutAnimation: false })
-      }
-    }
-  },
-  beforeMount() {
-    window.addEventListener('resize', this.$_resizeHandler)
-  },
-  beforeDestroy() {
-    window.removeEventListener('resize', this.$_resizeHandler)
-  },
-  mounted() {
-    const isMobile = this.$_isMobile()
-    if (isMobile) {
-      store.dispatch('app/toggleDevice', 'mobile')
-      store.dispatch('app/closeSideBar', { withoutAnimation: true })
-    }
-  },
-  methods: {
-    // use $_ for mixins properties
-    // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
-    $_isMobile() {
-      const rect = body.getBoundingClientRect()
-      return rect.width - 1 < WIDTH
-    },
-    $_resizeHandler() {
-      if (!document.hidden) {
-        const isMobile = this.$_isMobile()
-        store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop')
-
-        if (isMobile) {
-          store.dispatch('app/closeSideBar', { withoutAnimation: true })
-        }
-      }
-    }
-  }
-}

+ 0 - 68
admin/src/main.js

xqd
@@ -1,68 +0,0 @@
-import Vue from 'vue'
-
-import Cache from './utils/cache'
-
-import 'normalize.css/normalize.css' // a modern alternative to CSS resets
-
-import Element from 'element-ui'
-import './styles/element-variables.scss'
-
-import '@/styles/index.scss' // global css
-import 'flex.css'
-
-import App from './App'
-import store from './store'
-import router from './router'
-import Api from './api'
-
-import Lodash from 'lodash'
-
-import './utils/iconfont' // icon
-import './permission' // permission control
-import './utils/error-log' // error log
-import request from './utils/request' // request
-import { checkAuth } from './utils/auth' // check auth
-import purview from './config/purview' // config purview
-
-// 自定义指令
-import Directives from './directive'
-
-import * as filters from './filters'
-
-Vue.use(Element, {
-  size: Cache.get('size') || 'medium' // set element-ui default size
-})
-
-// register global utility filters
-Object.keys(filters).forEach(key => {
-  Vue.filter(key, filters[key])
-})
-
-Vue.use({
-  install(Vue, options) {
-    Vue.prototype.$api = Api
-    Vue.prototype.$request = request
-
-    // 校验权限
-    Vue.prototype.$checkAuth = checkAuth
-    window['$checkAuth'] = checkAuth
-
-    // 权限
-    Vue.prototype.purview = purview
-    window['purview'] = purview
-
-    // lodash
-    Vue.prototype._ = Lodash
-  }
-})
-
-Vue.use(Directives)
-
-Vue.config.productionTip = false
-
-new Vue({
-  el: '#app',
-  router,
-  store,
-  render: h => h(App)
-})

+ 0 - 76
admin/src/permission.js

xqd
@@ -1,76 +0,0 @@
-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', '/auth-redirect'] // 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() // hack: https://github.com/PanJiaChen/vue-element-admin/pull/2939
-    } else {
-      // determine whether the user has obtained his permission roles through getInfo
-      const storeAuths = store.getters.auths
-      const hasAuths = storeAuths || (Array.isArray(storeAuths) && (storeAuths.length === 0 || storeAuths.length > 0))
-      if (hasAuths) {
-        next()
-      } else {
-        try {
-          // get user info
-          // note: roles must be a object array! such as: ['admin'] or ,['developer','editor']
-          const { auths } = await store.dispatch('user/getAuths')
-
-          // generate accessible routes map based on roles
-          const accessRoutes = await store.dispatch('permission/generateRoutes', auths)
-
-          // dynamically add accessible routes
-          router.addRoutes(accessRoutes)
-
-          // hack method to ensure that addRoutes is complete
-          // set the replace: true, so the navigation will not leave a history record
-          next({ ...to, replace: true })
-        } catch (error) {
-          console.log('-->data', 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 - 143
admin/src/router/index.js

xqd
@@ -1,143 +0,0 @@
-import Vue from 'vue'
-import Router from 'vue-router'
-import auths from '@/config/purview'
-
-Vue.use(Router)
-
-/* Layout */
-import Layout from '@/layout'
-
-/* Router Modules */
-
-/**
- * Note: sub-menu only appear when route children.length >= 1
- * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
- *
- * hidden: true                   if set true, item will not show in the sidebar(default is false)
- * alwaysShow: true               if set true, will always show the root menu
- *                                if not set alwaysShow, when item has more than one children route,
- *                                it will becomes nested mode, otherwise not show the root menu
- * redirect: noRedirect           if set noRedirect will no redirect in the breadcrumb
- * name:'router-name'             the name is used by <keep-alive> (must set!!!)
- * meta : {
-    roles: ['admin','editor']    control the page roles (you can set multiple roles)
-    title: 'title'               the name show in sidebar and breadcrumb (recommend set)
-    icon: 'svg-name'/'el-icon-x' the icon show in the sidebar
-    noCache: true                if set true, the page will no be cached(default is false)
-    affix: true                  if set true, the tag will affix in the tags-view
-    breadcrumb: false            if set false, the item will hidden in breadcrumb(default is true)
-    activeMenu: '/example/list'  if set path, the sidebar will highlight the path you set
-  }
- */
-
-/**
- * constantRoutes
- * a base page that does not have permission requirements
- * all roles can be accessed
- */
-export const constantRoutes = [
-  {
-    path: '/login',
-    component: () => import('@/views/login/index'),
-    hidden: true
-  },
-  {
-    path: '/404',
-    component: () => import('@/views/error-page/404'),
-    hidden: true
-  },
-  {
-    path: '/401',
-    component: () => import('@/views/error-page/401'),
-    hidden: true
-  },
-  {
-    path: '/redirect',
-    component: Layout,
-    hidden: true,
-    children: [
-      {
-        path: '/redirect/:path(.*)',
-        component: () => import('@/views/redirect/index')
-      }
-    ]
-  },
-  {
-    path: '/',
-    component: Layout,
-    redirect: '/dashboard',
-    children: [
-      {
-        path: 'dashboard',
-        component: () => import('@/views/dashboard/index'),
-        name: 'Dashboard',
-        meta: {
-          title: '概览',
-          icon: 'icon-dashboard',
-          affix: true
-        }
-      }
-    ]
-  }
-]
-
-/**
- * asyncRoutes
- * the routes that need to be dynamically loaded based on user roles
- */
-export const asyncRoutes = [
-  /** when your routing map is too long, you can split it into small modules **/
-
-  {
-    path: '/system',
-    component: Layout,
-    redirect: 'noRedirect',
-    name: 'System',
-    meta: {
-      title: '系统',
-      icon: 'icon-xitong',
-      auth: auths.system.auth
-    },
-    children: [
-      {
-        path: 'purview',
-        component: () => import('@/views/system/purview'),
-        name: 'Purview',
-        meta: {
-          title: '权限管理',
-          noCache: true,
-          auth: auths.system.purview.index
-        }
-      },
-      {
-        path: 'role',
-        component: () => import('@/views/system/role'),
-        name: 'PurviewRole',
-        meta: {
-          title: '角色管理',
-          noCache: true,
-          auth: auths.system.role.index
-        }
-      }
-    ]
-  },
-
-  // 404 page must be placed at the end !!!
-  { path: '*', redirect: '/404', hidden: true }
-]
-
-const createRouter = () => new Router({
-  mode: 'history', // require service support
-  scrollBehavior: () => ({ y: 0 }),
-  routes: constantRoutes
-})
-
-const router = createRouter()
-
-// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
-export function resetRouter() {
-  const newRouter = createRouter()
-  router.matcher = newRouter.matcher // reset router
-}
-
-export default router

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels