From 3aae152db67c2c5640d0f47bbfcea4083e40651b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=BF=94=E5=AE=87-=E6=97=85=E7=AE=A1=E5=AE=B6?= <153298343@qq.com> Date: Tue, 26 Apr 2022 12:10:27 +0800 Subject: [PATCH] first commit --- .editorconfig | 14 + .env.development | 5 + .env.production | 6 + .env.staging | 8 + .eslintignore | 4 + .eslintrc.js | 198 +++ .gitignore | 16 + .travis.yml | 5 + LICENSE | 21 + README.md | 0 babel.config.js | 14 + build/index.js | 35 + jest.config.js | 24 + jsconfig.json | 9 + mock/index.js | 57 + mock/mock-server.js | 81 + mock/table.js | 29 + mock/user.js | 84 ++ mock/utils.js | 25 + package.json | 67 + postcss.config.js | 8 + public/favicon.ico | Bin 0 -> 4286 bytes public/index.html | 17 + src/App.vue | 11 + src/api/dashboard.js | 17 + src/api/system/menu.js | 23 + src/api/system/permission.js | 9 + src/api/system/role.js | 23 + src/api/system/user.js | 33 + src/api/user.js | 32 + src/assets/404_images/404.png | Bin 0 -> 98071 bytes src/assets/404_images/404_cloud.png | Bin 0 -> 4766 bytes src/assets/imgs/error-img.png | Bin 0 -> 7200 bytes src/assets/imgs/error.png | Bin 0 -> 7200 bytes src/assets/imgs/favicon.ico | Bin 0 -> 5100 bytes src/assets/imgs/log.png | Bin 0 -> 3360 bytes src/assets/imgs/logo.png | Bin 0 -> 1614 bytes src/assets/logo-mini-w.png | Bin 0 -> 41845 bytes src/assets/logo-mini.png | Bin 0 -> 44387 bytes src/assets/logo.png | Bin 0 -> 10747 bytes src/components/Breadcrumb/index.vue | 89 ++ src/components/Charts/Keyboard.vue | 155 ++ src/components/Charts/LineMarker.vue | 227 +++ src/components/Charts/MixChart.vue | 271 ++++ src/components/Charts/mixins/resize.js | 56 + src/components/Hamburger/index.vue | 44 + src/components/LxHeader/index.vue | 64 + src/components/LxTable/index.vue | 1303 +++++++++++++++++ src/components/LxTableRender/render.js | 16 + src/components/PanThumb/index.vue | 142 ++ src/components/SvgIcon/index.vue | 62 + src/components/TextHoverEffect/Mallki.vue | 113 ++ src/components/ThemePicker/index.vue | 175 +++ src/icons/index.js | 9 + src/icons/svg/404.svg | 1 + src/icons/svg/bug.svg | 1 + src/icons/svg/chart.svg | 1 + src/icons/svg/clipboard.svg | 1 + src/icons/svg/component.svg | 1 + src/icons/svg/dashboard.svg | 1 + src/icons/svg/documentation.svg | 1 + src/icons/svg/drag.svg | 1 + src/icons/svg/edit.svg | 1 + src/icons/svg/education.svg | 1 + src/icons/svg/email.svg | 1 + src/icons/svg/example.svg | 1 + src/icons/svg/excel.svg | 1 + src/icons/svg/exit-fullscreen.svg | 1 + src/icons/svg/eye-open.svg | 1 + src/icons/svg/eye.svg | 1 + src/icons/svg/form.svg | 1 + src/icons/svg/fullscreen.svg | 1 + src/icons/svg/guide.svg | 1 + src/icons/svg/icon.svg | 1 + src/icons/svg/international.svg | 1 + src/icons/svg/language.svg | 1 + src/icons/svg/link.svg | 1 + src/icons/svg/list.svg | 1 + src/icons/svg/lock.svg | 1 + src/icons/svg/message.svg | 1 + src/icons/svg/money.svg | 1 + src/icons/svg/nested.svg | 1 + src/icons/svg/password.svg | 1 + src/icons/svg/pdf.svg | 1 + src/icons/svg/people.svg | 1 + src/icons/svg/peoples.svg | 1 + src/icons/svg/qq.svg | 1 + src/icons/svg/search.svg | 1 + src/icons/svg/shopping.svg | 1 + src/icons/svg/size.svg | 1 + src/icons/svg/skill.svg | 1 + src/icons/svg/star.svg | 1 + src/icons/svg/tab.svg | 1 + src/icons/svg/table.svg | 1 + src/icons/svg/theme.svg | 1 + src/icons/svg/tool.svg | 2 + src/icons/svg/toolbox.svg | 2 + src/icons/svg/tree-table.svg | 1 + src/icons/svg/tree.svg | 1 + src/icons/svg/user-group.svg | 2 + src/icons/svg/user.svg | 1 + src/icons/svg/wechat.svg | 1 + src/icons/svg/zip.svg | 1 + src/icons/svgo.yml | 22 + src/layout/components/AppMain.vue | 40 + src/layout/components/Navbar.vue | 133 ++ src/layout/components/Sidebar/FixiOSBug.js | 26 + src/layout/components/Sidebar/Item.vue | 53 + src/layout/components/Sidebar/Link.vue | 43 + src/layout/components/Sidebar/Logo.vue | 89 ++ src/layout/components/Sidebar/SidebarItem.vue | 95 ++ src/layout/components/Sidebar/index.vue | 54 + src/layout/components/index.js | 3 + src/layout/index.vue | 93 ++ src/layout/mixin/ResizeHandler.js | 45 + src/main.js | 51 + src/permission.js | 76 + src/router/index.js | 91 ++ src/settings.js | 16 + src/store/getters.js | 10 + src/store/index.js | 21 + src/store/modules/app.js | 48 + src/store/modules/permission.js | 160 ++ src/store/modules/settings.js | 32 + src/store/modules/user.js | 136 ++ src/styles/element-ui.scss | 49 + src/styles/element-variables.scss | 7 + src/styles/iconfont.css | 59 + src/styles/index.scss | 181 +++ src/styles/mixin.scss | 28 + src/styles/sidebar.scss | 246 ++++ src/styles/transition.scss | 48 + src/styles/variables copy.scss | 25 + src/styles/variables.scss | 31 + src/styles/viewui-mine.less | 4 + src/utils/auth.js | 15 + src/utils/common.js | 272 ++++ src/utils/get-page-title.js | 10 + src/utils/index.js | 117 ++ src/utils/request.js | 95 ++ src/utils/validate.js | 19 + src/views/404.vue | 228 +++ src/views/dashboard/components/BarChart.vue | 146 ++ src/views/dashboard/components/PanelGroup.vue | 188 +++ .../dashboard/components/mixins/resize.js | 55 + src/views/dashboard/index.vue | 130 ++ src/views/login/index.vue | 232 +++ src/views/system/menu.vue | 218 +++ src/views/system/permission.vue | 245 ++++ src/views/system/role.vue | 159 ++ src/views/system/user.vue | 294 ++++ tests/unit/.eslintrc.js | 5 + tests/unit/components/Breadcrumb.spec.js | 98 ++ tests/unit/components/Hamburger.spec.js | 18 + tests/unit/components/SvgIcon.spec.js | 22 + tests/unit/utils/formatTime.spec.js | 30 + tests/unit/utils/param2Obj.spec.js | 14 + tests/unit/utils/parseTime.spec.js | 35 + tests/unit/utils/validate.spec.js | 17 + vue.config.js | 148 ++ 160 files changed, 8478 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .env.staging create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 babel.config.js create mode 100644 build/index.js create mode 100644 jest.config.js create mode 100644 jsconfig.json create mode 100644 mock/index.js create mode 100644 mock/mock-server.js create mode 100644 mock/table.js create mode 100644 mock/user.js create mode 100644 mock/utils.js create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/favicon.ico create mode 100644 public/index.html create mode 100644 src/App.vue create mode 100644 src/api/dashboard.js create mode 100644 src/api/system/menu.js create mode 100644 src/api/system/permission.js create mode 100644 src/api/system/role.js create mode 100644 src/api/system/user.js create mode 100644 src/api/user.js create mode 100644 src/assets/404_images/404.png create mode 100644 src/assets/404_images/404_cloud.png create mode 100644 src/assets/imgs/error-img.png create mode 100644 src/assets/imgs/error.png create mode 100644 src/assets/imgs/favicon.ico create mode 100644 src/assets/imgs/log.png create mode 100644 src/assets/imgs/logo.png create mode 100644 src/assets/logo-mini-w.png create mode 100644 src/assets/logo-mini.png create mode 100644 src/assets/logo.png create mode 100644 src/components/Breadcrumb/index.vue create mode 100644 src/components/Charts/Keyboard.vue create mode 100644 src/components/Charts/LineMarker.vue create mode 100644 src/components/Charts/MixChart.vue create mode 100644 src/components/Charts/mixins/resize.js create mode 100644 src/components/Hamburger/index.vue create mode 100644 src/components/LxHeader/index.vue create mode 100644 src/components/LxTable/index.vue create mode 100644 src/components/LxTableRender/render.js create mode 100644 src/components/PanThumb/index.vue create mode 100644 src/components/SvgIcon/index.vue create mode 100644 src/components/TextHoverEffect/Mallki.vue create mode 100644 src/components/ThemePicker/index.vue create mode 100644 src/icons/index.js create mode 100644 src/icons/svg/404.svg create mode 100644 src/icons/svg/bug.svg create mode 100644 src/icons/svg/chart.svg create mode 100644 src/icons/svg/clipboard.svg create mode 100644 src/icons/svg/component.svg create mode 100644 src/icons/svg/dashboard.svg create mode 100644 src/icons/svg/documentation.svg create mode 100644 src/icons/svg/drag.svg create mode 100644 src/icons/svg/edit.svg create mode 100644 src/icons/svg/education.svg create mode 100644 src/icons/svg/email.svg create mode 100644 src/icons/svg/example.svg create mode 100644 src/icons/svg/excel.svg create mode 100644 src/icons/svg/exit-fullscreen.svg create mode 100644 src/icons/svg/eye-open.svg create mode 100644 src/icons/svg/eye.svg create mode 100644 src/icons/svg/form.svg create mode 100644 src/icons/svg/fullscreen.svg create mode 100644 src/icons/svg/guide.svg create mode 100644 src/icons/svg/icon.svg create mode 100644 src/icons/svg/international.svg create mode 100644 src/icons/svg/language.svg create mode 100644 src/icons/svg/link.svg create mode 100644 src/icons/svg/list.svg create mode 100644 src/icons/svg/lock.svg create mode 100644 src/icons/svg/message.svg create mode 100644 src/icons/svg/money.svg create mode 100644 src/icons/svg/nested.svg create mode 100644 src/icons/svg/password.svg create mode 100644 src/icons/svg/pdf.svg create mode 100644 src/icons/svg/people.svg create mode 100644 src/icons/svg/peoples.svg create mode 100644 src/icons/svg/qq.svg create mode 100644 src/icons/svg/search.svg create mode 100644 src/icons/svg/shopping.svg create mode 100644 src/icons/svg/size.svg create mode 100644 src/icons/svg/skill.svg create mode 100644 src/icons/svg/star.svg create mode 100644 src/icons/svg/tab.svg create mode 100644 src/icons/svg/table.svg create mode 100644 src/icons/svg/theme.svg create mode 100644 src/icons/svg/tool.svg create mode 100644 src/icons/svg/toolbox.svg create mode 100644 src/icons/svg/tree-table.svg create mode 100644 src/icons/svg/tree.svg create mode 100644 src/icons/svg/user-group.svg create mode 100644 src/icons/svg/user.svg create mode 100644 src/icons/svg/wechat.svg create mode 100644 src/icons/svg/zip.svg create mode 100644 src/icons/svgo.yml create mode 100644 src/layout/components/AppMain.vue create mode 100644 src/layout/components/Navbar.vue create mode 100644 src/layout/components/Sidebar/FixiOSBug.js create mode 100644 src/layout/components/Sidebar/Item.vue create mode 100644 src/layout/components/Sidebar/Link.vue create mode 100644 src/layout/components/Sidebar/Logo.vue create mode 100644 src/layout/components/Sidebar/SidebarItem.vue create mode 100644 src/layout/components/Sidebar/index.vue create mode 100644 src/layout/components/index.js create mode 100644 src/layout/index.vue create mode 100644 src/layout/mixin/ResizeHandler.js create mode 100644 src/main.js create mode 100644 src/permission.js create mode 100644 src/router/index.js create mode 100644 src/settings.js create mode 100644 src/store/getters.js create mode 100644 src/store/index.js create mode 100644 src/store/modules/app.js create mode 100644 src/store/modules/permission.js create mode 100644 src/store/modules/settings.js create mode 100644 src/store/modules/user.js create mode 100644 src/styles/element-ui.scss create mode 100644 src/styles/element-variables.scss create mode 100644 src/styles/iconfont.css create mode 100644 src/styles/index.scss create mode 100644 src/styles/mixin.scss create mode 100644 src/styles/sidebar.scss create mode 100644 src/styles/transition.scss create mode 100644 src/styles/variables copy.scss create mode 100644 src/styles/variables.scss create mode 100644 src/styles/viewui-mine.less create mode 100644 src/utils/auth.js create mode 100644 src/utils/common.js create mode 100644 src/utils/get-page-title.js create mode 100644 src/utils/index.js create mode 100644 src/utils/request.js create mode 100644 src/utils/validate.js create mode 100644 src/views/404.vue create mode 100644 src/views/dashboard/components/BarChart.vue create mode 100644 src/views/dashboard/components/PanelGroup.vue create mode 100644 src/views/dashboard/components/mixins/resize.js create mode 100644 src/views/dashboard/index.vue create mode 100644 src/views/login/index.vue create mode 100644 src/views/system/menu.vue create mode 100644 src/views/system/permission.vue create mode 100644 src/views/system/role.vue create mode 100644 src/views/system/user.vue create mode 100644 tests/unit/.eslintrc.js create mode 100644 tests/unit/components/Breadcrumb.spec.js create mode 100644 tests/unit/components/Hamburger.spec.js create mode 100644 tests/unit/components/SvgIcon.spec.js create mode 100644 tests/unit/utils/formatTime.spec.js create mode 100644 tests/unit/utils/param2Obj.spec.js create mode 100644 tests/unit/utils/parseTime.spec.js create mode 100644 tests/unit/utils/validate.spec.js create mode 100644 vue.config.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ea6e20f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +# http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..e800df6 --- /dev/null +++ b/.env.development @@ -0,0 +1,5 @@ +# just a flag +ENV = 'development' + +# base api +VUE_APP_BASE_API = '' diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..80c8103 --- /dev/null +++ b/.env.production @@ -0,0 +1,6 @@ +# just a flag +ENV = 'production' + +# base api +VUE_APP_BASE_API = '/prod-api' + diff --git a/.env.staging b/.env.staging new file mode 100644 index 0000000..a8793a0 --- /dev/null +++ b/.env.staging @@ -0,0 +1,8 @@ +NODE_ENV = production + +# just a flag +ENV = 'staging' + +# base api +VUE_APP_BASE_API = '/stage-api' + diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..e6529fc --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +build/*.js +src/assets +public +dist diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..c977505 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,198 @@ +module.exports = { + root: true, + parserOptions: { + parser: 'babel-eslint', + sourceType: 'module' + }, + env: { + browser: true, + node: true, + es6: true, + }, + extends: ['plugin:vue/recommended', 'eslint:recommended'], + + // add your custom rules here + //it is base on https://github.com/vuejs/eslint-config-vue + rules: { + "vue/max-attributes-per-line": [2, { + "singleline": 10, + "multiline": { + "max": 1, + "allowFirstLine": false + } + }], + "vue/singleline-html-element-content-newline": "off", + "vue/multiline-html-element-content-newline":"off", + "vue/name-property-casing": ["error", "PascalCase"], + "vue/no-v-html": "off", + 'accessor-pairs': 2, + 'arrow-spacing': [2, { + 'before': true, + 'after': true + }], + 'block-spacing': [2, 'always'], + 'brace-style': [2, '1tbs', { + 'allowSingleLine': true + }], + 'camelcase': [0, { + 'properties': 'always' + }], + 'comma-dangle': [2, 'never'], + 'comma-spacing': [2, { + 'before': false, + 'after': true + }], + 'comma-style': [2, 'last'], + 'constructor-super': 2, + 'curly': [2, 'multi-line'], + 'dot-location': [2, 'property'], + 'eol-last': 2, + 'eqeqeq': ["error", "always", {"null": "ignore"}], + 'generator-star-spacing': [2, { + 'before': true, + 'after': true + }], + 'handle-callback-err': [2, '^(err|error)$'], + 'indent': [2, 2, { + 'SwitchCase': 1 + }], + 'jsx-quotes': [2, 'prefer-single'], + 'key-spacing': [2, { + 'beforeColon': false, + 'afterColon': true + }], + 'keyword-spacing': [2, { + 'before': true, + 'after': true + }], + 'new-cap': [2, { + 'newIsCap': true, + 'capIsNew': false + }], + 'new-parens': 2, + 'no-array-constructor': 2, + 'no-caller': 2, + 'no-console': 'off', + 'no-class-assign': 2, + 'no-cond-assign': 2, + 'no-const-assign': 2, + 'no-control-regex': 0, + 'no-delete-var': 2, + 'no-dupe-args': 2, + 'no-dupe-class-members': 2, + 'no-dupe-keys': 2, + 'no-duplicate-case': 2, + 'no-empty-character-class': 2, + 'no-empty-pattern': 2, + 'no-eval': 2, + 'no-ex-assign': 2, + 'no-extend-native': 2, + 'no-extra-bind': 2, + 'no-extra-boolean-cast': 2, + 'no-extra-parens': [2, 'functions'], + 'no-fallthrough': 2, + 'no-floating-decimal': 2, + 'no-func-assign': 2, + 'no-implied-eval': 2, + 'no-inner-declarations': [2, 'functions'], + 'no-invalid-regexp': 2, + 'no-irregular-whitespace': 2, + 'no-iterator': 2, + 'no-label-var': 2, + 'no-labels': [2, { + 'allowLoop': false, + 'allowSwitch': false + }], + 'no-lone-blocks': 2, + 'no-mixed-spaces-and-tabs': 2, + 'no-multi-spaces': 2, + 'no-multi-str': 2, + 'no-multiple-empty-lines': [2, { + 'max': 1 + }], + 'no-native-reassign': 2, + 'no-negated-in-lhs': 2, + 'no-new-object': 2, + 'no-new-require': 2, + 'no-new-symbol': 2, + 'no-new-wrappers': 2, + 'no-obj-calls': 2, + 'no-octal': 2, + 'no-octal-escape': 2, + 'no-path-concat': 2, + 'no-proto': 2, + 'no-redeclare': 2, + 'no-regex-spaces': 2, + 'no-return-assign': [2, 'except-parens'], + 'no-self-assign': 2, + 'no-self-compare': 2, + 'no-sequences': 2, + 'no-shadow-restricted-names': 2, + 'no-spaced-func': 2, + 'no-sparse-arrays': 2, + 'no-this-before-super': 2, + 'no-throw-literal': 2, + 'no-trailing-spaces': 2, + 'no-undef': 2, + 'no-undef-init': 2, + 'no-unexpected-multiline': 2, + 'no-unmodified-loop-condition': 2, + 'no-unneeded-ternary': [2, { + 'defaultAssignment': false + }], + 'no-unreachable': 2, + 'no-unsafe-finally': 2, + 'no-unused-vars': [2, { + 'vars': 'all', + 'args': 'none' + }], + 'no-useless-call': 2, + 'no-useless-computed-key': 2, + 'no-useless-constructor': 2, + 'no-useless-escape': 0, + 'no-whitespace-before-property': 2, + 'no-with': 2, + 'one-var': [2, { + 'initialized': 'never' + }], + 'operator-linebreak': [2, 'after', { + 'overrides': { + '?': 'before', + ':': 'before' + } + }], + 'padded-blocks': [2, 'never'], + 'quotes': [2, 'single', { + 'avoidEscape': true, + 'allowTemplateLiterals': true + }], + 'semi': [2, 'never'], + 'semi-spacing': [2, { + 'before': false, + 'after': true + }], + 'space-before-blocks': [2, 'always'], + 'space-before-function-paren': [2, 'never'], + 'space-in-parens': [2, 'never'], + 'space-infix-ops': 2, + 'space-unary-ops': [2, { + 'words': true, + 'nonwords': false + }], + 'spaced-comment': [2, 'always', { + 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] + }], + 'template-curly-spacing': [2, 'never'], + 'use-isnan': 2, + 'valid-typeof': 2, + 'wrap-iife': [2, 'any'], + 'yield-star-spacing': [2, 'both'], + 'yoda': [2, 'never'], + 'prefer-const': 2, + 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, + 'object-curly-spacing': [2, 'always', { + objectsInObjects: false + }], + 'array-bracket-spacing': [2, 'never'] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9ad28d2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +package-lock.json +tests/**/coverage/ + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..f4be7a0 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: 10 +script: npm run test +notifications: + email: false diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6151575 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-present PanJiaChen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..fb82b27 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,14 @@ +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'] + } + } +} diff --git a/build/index.js b/build/index.js new file mode 100644 index 0000000..0c57de2 --- /dev/null +++ b/build/index.js @@ -0,0 +1,35 @@ +const { run } = require('runjs') +const chalk = require('chalk') +const config = require('../vue.config.js') +const rawArgv = process.argv.slice(2) +const args = rawArgv.join(' ') + +if (process.env.npm_config_preview || rawArgv.includes('--preview')) { + const report = rawArgv.includes('--report') + + run(`vue-cli-service build ${args}`) + + const port = 9526 + const publicPath = config.publicPath + + var connect = require('connect') + var serveStatic = require('serve-static') + const app = connect() + + app.use( + publicPath, + serveStatic('./dist', { + index: ['index.html', '/'] + }) + ) + + app.listen(port, function () { + console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`)) + if (report) { + console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`)) + } + + }) +} else { + run(`vue-cli-service build ${args}`) +} diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..143cdc8 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,24 @@ +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: { + '^@/(.*)$': '/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: '/tests/unit/coverage', + // 'collectCoverage': true, + 'coverageReporters': [ + 'lcov', + 'text-summary' + ], + testURL: 'http://localhost/' +} diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..ed079e2 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/mock/index.js b/mock/index.js new file mode 100644 index 0000000..c514c13 --- /dev/null +++ b/mock/index.js @@ -0,0 +1,57 @@ +const Mock = require('mockjs') +const { param2Obj } = require('./utils') + +const user = require('./user') +const table = require('./table') + +const mocks = [ + ...user, + ...table +] + +// for front mock +// please use it cautiously, it will redefine XMLHttpRequest, +// which will cause many of your third-party libraries to be invalidated(like progress event). +function mockXHR() { + // mock patch + // https://github.com/nuysoft/Mock/issues/300 + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send + Mock.XHR.prototype.send = function() { + if (this.custom.xhr) { + this.custom.xhr.withCredentials = this.withCredentials || false + + if (this.responseType) { + this.custom.xhr.responseType = this.responseType + } + } + this.proxy_send(...arguments) + } + + function XHR2ExpressReqWrap(respond) { + return function(options) { + let result = null + if (respond instanceof Function) { + const { body, type, url } = options + // https://expressjs.com/en/4x/api.html#req + result = respond({ + method: type, + body: JSON.parse(body), + query: param2Obj(url) + }) + } else { + result = respond + } + return Mock.mock(result) + } + } + + for (const i of mocks) { + Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response)) + } +} + +module.exports = { + mocks, + mockXHR +} + diff --git a/mock/mock-server.js b/mock/mock-server.js new file mode 100644 index 0000000..8941ec0 --- /dev/null +++ b/mock/mock-server.js @@ -0,0 +1,81 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') +const path = require('path') +const Mock = require('mockjs') + +const mockDir = path.join(process.cwd(), 'mock') + +function registerRoutes(app) { + let mockLastIndex + const { mocks } = require('./index.js') + const mocksForServer = mocks.map(route => { + return responseFake(route.url, route.type, route.response) + }) + for (const mock of mocksForServer) { + app[mock.type](mock.url, mock.response) + mockLastIndex = app._router.stack.length + } + const mockRoutesLength = Object.keys(mocksForServer).length + return { + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockLastIndex - mockRoutesLength + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes(mockDir)) { + delete require.cache[require.resolve(i)] + } + }) +} + +// for mock server +const responseFake = (url, type, respond) => { + return { + url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`), + type: type || 'get', + response(req, res) { + console.log('request invoke:' + req.path) + res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond)) + } + } +} + +module.exports = app => { + // parse app.body + // https://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex + + // watch files, hot reload mock server + chokidar.watch(mockDir, { + ignored: /mock-server/, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } + } + }) +} diff --git a/mock/table.js b/mock/table.js new file mode 100644 index 0000000..bd0e013 --- /dev/null +++ b/mock/table.js @@ -0,0 +1,29 @@ +const Mock = require('mockjs') + +const data = Mock.mock({ + 'items|30': [{ + id: '@id', + title: '@sentence(10, 20)', + 'status|1': ['published', 'draft', 'deleted'], + author: 'name', + display_time: '@datetime', + pageviews: '@integer(300, 5000)' + }] +}) + +module.exports = [ + { + url: '/vue-admin-template/table/list', + type: 'get', + response: config => { + const items = data.items + return { + code: 20000, + data: { + total: items.length, + items: items + } + } + } + } +] diff --git a/mock/user.js b/mock/user.js new file mode 100644 index 0000000..7555338 --- /dev/null +++ b/mock/user.js @@ -0,0 +1,84 @@ + +const tokens = { + admin: { + token: 'admin-token' + }, + editor: { + token: 'editor-token' + } +} + +const users = { + 'admin-token': { + roles: ['admin'], + introduction: 'I am a super administrator', + avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', + name: 'Super Admin' + }, + 'editor-token': { + roles: ['editor'], + introduction: 'I am an editor', + avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', + name: 'Normal Editor' + } +} + +module.exports = [ + // user login + { + url: '/vue-admin-template/user/login', + type: 'post', + response: config => { + const { username } = config.body + const token = tokens[username] + + // mock error + if (!token) { + return { + code: 60204, + message: 'Account and password are incorrect.' + } + } + + return { + code: 20000, + data: token + } + } + }, + + // get user info + { + url: '/vue-admin-template/user/info\.*', + type: 'get', + response: config => { + const { token } = config.query + const info = users[token] + + // mock error + if (!info) { + return { + code: 50008, + message: 'Login failed, unable to get user details.' + } + } + + return { + code: 20000, + data: info + } + } + }, + + // user logout + { + url: '/vue-admin-template/user/logout', + type: 'post', + response: _ => { + return { + code: 20000, + data: 'success' + } + } + } +] diff --git a/mock/utils.js b/mock/utils.js new file mode 100644 index 0000000..95cc27d --- /dev/null +++ b/mock/utils.js @@ -0,0 +1,25 @@ +/** + * @param {string} url + * @returns {Object} + */ +function param2Obj(url) { + const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') + if (!search) { + return {} + } + const obj = {} + const searchArr = search.split('&') + searchArr.forEach(v => { + const index = v.indexOf('=') + if (index !== -1) { + const name = v.substring(0, index) + const val = v.substring(index + 1, v.length) + obj[name] = val + } + }) + return obj +} + +module.exports = { + param2Obj +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..dd58d3b --- /dev/null +++ b/package.json @@ -0,0 +1,67 @@ +{ + "name": "vue-admin-template", + "version": "4.4.0", + "description": "A vue admin template with Element UI & axios & iconfont & permission control & lint", + "author": "Pan ", + "scripts": { + "dev": "vue-cli-service serve", + "build:prod": "vue-cli-service build", + "build:stage": "vue-cli-service build --mode staging", + "preview": "node build/index.js --preview", + "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml", + "lint": "eslint --ext .js,.vue src", + "test:unit": "jest --clearCache && vue-cli-service test:unit", + "test:ci": "npm run lint && npm run test:unit" + }, + "dependencies": { + "axios": "0.18.1", + "core-js": "3.6.5", + "echarts": "^4.2.1", + "element-ui": "2.13.2", + "js-cookie": "2.2.0", + "less-loader": "^5.0.0", + "moment": "^2.29.2", + "normalize.css": "7.0.0", + "nprogress": "0.2.0", + "path-to-regexp": "2.4.0", + "view-design": "^4.7.0", + "vue": "2.6.10", + "vue-count-to": "^1.0.13", + "vue-router": "3.0.6", + "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", + "connect": "3.6.6", + "eslint": "6.7.2", + "eslint-plugin-vue": "6.2.2", + "html-webpack-plugin": "3.2.0", + "mockjs": "1.0.1-beta3", + "runjs": "4.3.2", + "sass": "1.26.8", + "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.2", + "vue-template-compiler": "2.6.10" + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ], + "engines": { + "node": ">=8.9", + "npm": ">= 3.0.0" + }, + "license": "MIT" +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..10473ef --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,8 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + 'plugins': { + // to edit target browsers: use "browserslist" field in package.json + 'autoprefixer': {} + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1f9d1d8c3eb56fe79d845f1bd3560db9aa2dcd70 GIT binary patch literal 4286 zcmchbe{fXQ701seDfoji$Y|=c7Er2yV1t`?8xzLgM&qK*x|FyZe3zN+&ux+Hs~Wt#*JJ>V#>n#0h!*-X%+8 z3WylIJDqtbfs+0S;?&#*Ee0@ zD%qe$SugTR);lHAu;XUdL@Bq%ilyORcgNwSAN4OIZ_J+FZN};kVhyPE2nD#YwV2sX zg<^gfQuLUISx2!RAC^dVQz_GDmoRh2bWRsk$5K?!Qp+kN>l2S;oeak_zB>895B##) zgLOHEwp}GmpMOusA1NfiHNE@SuCGrXpiSL_R|UDXA9HrR%;=6L2MQXLf!Pt3_W7B< z*CUx)S?pj{P}*PMi_Pplb)2L0!*-qO;@Xqt%yM9d6Je&V3^9$0JBFwsK6rJ2sZAKy zfR|})$cxIkMq%an*PeS$!2O97txcxx@Nom{ZaY3^w*R~*m49ESMeF!p@+-sCpbUK{ zET^~lBt7PhS;fr>-Q_q$-@omsARpvSmPOq)rJPf9-n@mUX(LO|@kypxDrIeOygIHf z56arvJ}rrT^vjoCbcJHtQrM_RxmzzC0pF%=1pL6$o9?NrK3) z1>3>1Kmj|z;_1R3>Q2*^J?Z?~cCz z)Yxq<^mFrN`1)xvZ!iv@?`uGu@$51v(f9v$M}MJ9_;>^e**5{vb_2KttN>NuN+8-7 zg1fZ+tQuOVR*&Ls+ReQg=DPKoiuhT|yz6X(Rc6_TCCn3RB|J{o2je-+bjjc}u= zi4V?l-rr8Yc~vFs@39JI|L0^+Ba%ycuN1wjk3VsaG_2y`sD8<3Qx+0?+CctvJ%DJq{h&dHR|0 z{7Qb1(7qUF#K&2`VfJWZa`lb`kw)3RJ{-4d&e%o731eSV*MZrq6PYg)_m!VN z+4DLrd0~XGep_+=J08jYJiyJGu&n=9*d1dy9h8lSa6cjEPy4>I{EO*uZ>LJD6Y7uQ zf7#d=kc|Xlv?lznLNfneD`##&thyLcm-J4{izYq1Tf557jlt}CbNjPW_`N9mnccr> z_rR>?#24f9B`G>jr(g6N^rLp%k7eUw>@mbiE9c{<1I%pk#J++1aWYM-lIcYi-1r;T z+7Xm7`!BUzySW;7pv#>ef7zhepjuEBx4S0ejT4Y8Md^PnZ$mP5xz%Uo2e?YLidKt# zKZZCrR>SoA5Hr3J-9pI&y((?!Rj-5ZAAoEuOxM~Tb^2?UwZ0zr;EhRZMT=s1*5NnXrKXdP@`2aWRacXrY zZg4vj*UTB2C?py$e49=cj?!r1Tsq<=%Cuf_Q=7BnDCM`clB-Sp4I%z)Am<2#j28Zn RtY9G=jJwY;fqbIX`7e_`A~^s6 literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..fa2be91 --- /dev/null +++ b/public/index.html @@ -0,0 +1,17 @@ + + + + + + + + <%= webpackConfig.name %> + + + +
+ + + diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..ec9032c --- /dev/null +++ b/src/App.vue @@ -0,0 +1,11 @@ + + + diff --git a/src/api/dashboard.js b/src/api/dashboard.js new file mode 100644 index 0000000..ba8ceea --- /dev/null +++ b/src/api/dashboard.js @@ -0,0 +1,17 @@ +import request from '@/utils/request' + +export function getCounts() { + return request({ + url: '/api/admin/get-counts', + method: 'get' + }) +} + + +export function getChartsData(params) { + return request({ + url: '/api/admin/get-charts-data', + method: 'get', + params: params + }) +} diff --git a/src/api/system/menu.js b/src/api/system/menu.js new file mode 100644 index 0000000..b71119f --- /dev/null +++ b/src/api/system/menu.js @@ -0,0 +1,23 @@ +import request from '@/utils/request' + +export function save(data) { + return request({ + url: '/api/admin/menu/save', + method: 'post', + data + }) +} + +export function listmenu() { + return request({ + url: '/api/admin/menu', + method: 'get' + }) +} +export function del(data) { + return request({ + url: '/api/admin/menu/delete', + method: 'post', + data + }) +} diff --git a/src/api/system/permission.js b/src/api/system/permission.js new file mode 100644 index 0000000..bf322ed --- /dev/null +++ b/src/api/system/permission.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +export function setPermissions(data) { + return request({ + url: '/api/admin/role/set-permissions', + method: 'post', + data + }) +} diff --git a/src/api/system/role.js b/src/api/system/role.js new file mode 100644 index 0000000..bfa6f41 --- /dev/null +++ b/src/api/system/role.js @@ -0,0 +1,23 @@ +import request from '@/utils/request' + +export function save(data) { + return request({ + url: '/api/admin/role/save', + method: 'post', + data + }) +} + +export function list() { + return request({ + url: '/api/admin/role', + method: 'get' + }) +} +export function del(data) { + return request({ + url: '/api/admin/role/delete', + method: 'post', + data + }) +} diff --git a/src/api/system/user.js b/src/api/system/user.js new file mode 100644 index 0000000..095d17d --- /dev/null +++ b/src/api/system/user.js @@ -0,0 +1,33 @@ +import request from '@/utils/request' + +export function save(data) { + return request({ + url: '/api/admin/admin/save', + method: 'post', + data + }) +} + +export function listuser() { + return request({ + url: '/api/admin/admin', + method: 'get' + }) +} + +export function del(data) { + return request({ + url: '/api/admin/admin/delete', + method: 'post', + data + }) +} + +export function setRoles(data) { + return request({ + url: '/api/admin/admin/set-roles', + method: 'post', + data + }) +} + diff --git a/src/api/user.js b/src/api/user.js new file mode 100644 index 0000000..e12d073 --- /dev/null +++ b/src/api/user.js @@ -0,0 +1,32 @@ +import request from '@/utils/request' + +export function login(data) { + return request({ + url: '/api/admin/auth/login', + method: 'post', + data + }) +} + +export function getInfo(token) { + return request({ + url: '/api/admin/auth/me', + method: 'post', + params: { token } + }) +} + +export function logout() { + return request({ + url: '/api/admin/auth/logout', + method: 'post' + }) +} + +export function getAuthMenu(token) { + return request({ + url: '/api/admin/auth/permissions', + method: 'get', + params: { token } + }) +} \ No newline at end of file diff --git a/src/assets/404_images/404.png b/src/assets/404_images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8e2305cc973ad2121403aee4bf08728f76c461 GIT binary patch literal 98071 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 literal 0 HcmV?d00001 diff --git a/src/assets/404_images/404_cloud.png b/src/assets/404_images/404_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..c6281d09013e0a2c5f8e699a0a6038d9480291e5 GIT binary patch literal 4766 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 literal 0 HcmV?d00001 diff --git a/src/assets/imgs/error-img.png b/src/assets/imgs/error-img.png new file mode 100644 index 0000000000000000000000000000000000000000..efe8ccb98a500f4a301ac69bfc9a198f67f27820 GIT binary patch literal 7200 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%0AEPsBJ9>)v8abt?osS76M5T)NzhQH109S8tU1 z#;j-rsSPRTU%62ia`Rm!H2@WMZ;Z}sC3N^(bsfmFho(HGN5(9VUbblfq+W|QB)(tG zkED}{oDRzthAQ`)Vk9ML5SnbFohD}CInCi#qyZ)~jLxkvX?WiiV84{MNzf|tlag22 z^kJ%%=Ij26Otly#eEu^98r3HdfoPoqh*ndwPlzQVQPuAg=9;iUW{@D}u;?AHOsbBE z1qU0=BT?rbwgt6hFtb#Eylab`_?iX&+l<{`!am_vCe=FobD+n`3W+ z-k^V*I8OIxb&jd5Vck~5FZkt6Wd$#WF@)AYr`ei zS%eUb^-mfFO#_2Hqc$1@`t95@mD&<0+wVEItljOZE~2+5gFsrYEZH3r$q+hFF{r*r zuSB8wyvMaSD^rXk#g#NGs9v^j(bV{HP-D*ome>CSmke-(Q!~xrYgIqIv0CiWN;(^` zhqoRaJB(x=YC#=*F(KKu!k-2v1;74NQsfD#@53A6@nnT| zezI{2mHXoV{OnZ}PPBca z$#Ikbbss(K48uC4*$-q=W}*4zK2CRM5sDeFGU^9U?HxAGFHIfvQ{1tjmRad<`SoNT zMhb)Uuy++#N%+Kq=N3zJhbl7dBQ4w7(^N_3KtO>b<7%ps^uMTspj=CdGvH}L}8;;U=%?|`&;a*`V{0j0Fv+08nuVMdlwMD{$M(S)zTSe;n z3R8RqH50r%jZj^Ng;Kod)R+gRqiU^dnW(EJ7`-}d-chK}56dP7KLr3JuUJVDqZjx3 zSYYTb7*G1p0W6-aX)}sMMbS4tdREo%R34Evr{$%Ilc50vgTI<{3;0wanUqmTQ;JvWi@kp^8w`VzLz#VgR + + + + {{ item.meta.title }} + {{ item.meta.title }} + + + + + + + + diff --git a/src/components/Charts/Keyboard.vue b/src/components/Charts/Keyboard.vue new file mode 100644 index 0000000..0b258f3 --- /dev/null +++ b/src/components/Charts/Keyboard.vue @@ -0,0 +1,155 @@ + + + diff --git a/src/components/Charts/LineMarker.vue b/src/components/Charts/LineMarker.vue new file mode 100644 index 0000000..3dd7436 --- /dev/null +++ b/src/components/Charts/LineMarker.vue @@ -0,0 +1,227 @@ + + + diff --git a/src/components/Charts/MixChart.vue b/src/components/Charts/MixChart.vue new file mode 100644 index 0000000..c416542 --- /dev/null +++ b/src/components/Charts/MixChart.vue @@ -0,0 +1,271 @@ + + + diff --git a/src/components/Charts/mixins/resize.js b/src/components/Charts/mixins/resize.js new file mode 100644 index 0000000..b1e76e9 --- /dev/null +++ b/src/components/Charts/mixins/resize.js @@ -0,0 +1,56 @@ +import { debounce } from '@/utils' + +export default { + data() { + return { + $_sidebarElm: null, + $_resizeHandler: null + } + }, + mounted() { + this.initListener() + }, + activated() { + if (!this.$_resizeHandler) { + // avoid duplication init + this.initListener() + } + + // when keep-alive chart activated, auto resize + this.resize() + }, + beforeDestroy() { + this.destroyListener() + }, + deactivated() { + this.destroyListener() + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_sidebarResizeHandler(e) { + if (e.propertyName === 'width') { + this.$_resizeHandler() + } + }, + initListener() { + this.$_resizeHandler = debounce(() => { + this.resize() + }, 100) + window.addEventListener('resize', this.$_resizeHandler) + + this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] + this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) + }, + destroyListener() { + window.removeEventListener('resize', this.$_resizeHandler) + this.$_resizeHandler = null + + this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) + }, + resize() { + const { chart } = this + chart && chart.resize() + } + } +} diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue new file mode 100644 index 0000000..368b002 --- /dev/null +++ b/src/components/Hamburger/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/components/LxHeader/index.vue b/src/components/LxHeader/index.vue new file mode 100644 index 0000000..91589ab --- /dev/null +++ b/src/components/LxHeader/index.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/components/LxTable/index.vue b/src/components/LxTable/index.vue new file mode 100644 index 0000000..4f0c3c1 --- /dev/null +++ b/src/components/LxTable/index.vue @@ -0,0 +1,1303 @@ + + + + + diff --git a/src/components/LxTableRender/render.js b/src/components/LxTableRender/render.js new file mode 100644 index 0000000..07790ce --- /dev/null +++ b/src/components/LxTableRender/render.js @@ -0,0 +1,16 @@ +export default { + name: "TableExpand", + functional: true, + props: { + render: Function, + row: {},//当前行的数据 + column: {},//当前行的配置信息 + index: { type: Number, default: 0 }//当前所在行 + }, + render: (h, ctx) => { + const params = { + row: ctx.props.row, column: ctx.props.column, index: ctx.props.index + } + return ctx.props.render(h, params); //h(); + } +}; diff --git a/src/components/PanThumb/index.vue b/src/components/PanThumb/index.vue new file mode 100644 index 0000000..1bcf417 --- /dev/null +++ b/src/components/PanThumb/index.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..b07ded2 --- /dev/null +++ b/src/components/SvgIcon/index.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/src/components/TextHoverEffect/Mallki.vue b/src/components/TextHoverEffect/Mallki.vue new file mode 100644 index 0000000..ab526f3 --- /dev/null +++ b/src/components/TextHoverEffect/Mallki.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/src/components/ThemePicker/index.vue b/src/components/ThemePicker/index.vue new file mode 100644 index 0000000..3879c5a --- /dev/null +++ b/src/components/ThemePicker/index.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/src/icons/index.js b/src/icons/index.js new file mode 100644 index 0000000..2c6b309 --- /dev/null +++ b/src/icons/index.js @@ -0,0 +1,9 @@ +import Vue from 'vue' +import SvgIcon from '@/components/SvgIcon'// svg component + +// register globally +Vue.component('svg-icon', SvgIcon) + +const req = require.context('./svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys().map(requireContext) +requireAll(req) diff --git a/src/icons/svg/404.svg b/src/icons/svg/404.svg new file mode 100644 index 0000000..6df5019 --- /dev/null +++ b/src/icons/svg/404.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/bug.svg b/src/icons/svg/bug.svg new file mode 100644 index 0000000..05a150d --- /dev/null +++ b/src/icons/svg/bug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/chart.svg b/src/icons/svg/chart.svg new file mode 100644 index 0000000..27728fb --- /dev/null +++ b/src/icons/svg/chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/clipboard.svg b/src/icons/svg/clipboard.svg new file mode 100644 index 0000000..90923ff --- /dev/null +++ b/src/icons/svg/clipboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/component.svg b/src/icons/svg/component.svg new file mode 100644 index 0000000..207ada3 --- /dev/null +++ b/src/icons/svg/component.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/dashboard.svg b/src/icons/svg/dashboard.svg new file mode 100644 index 0000000..5317d37 --- /dev/null +++ b/src/icons/svg/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/documentation.svg b/src/icons/svg/documentation.svg new file mode 100644 index 0000000..7043122 --- /dev/null +++ b/src/icons/svg/documentation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/drag.svg b/src/icons/svg/drag.svg new file mode 100644 index 0000000..4185d3c --- /dev/null +++ b/src/icons/svg/drag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/edit.svg b/src/icons/svg/edit.svg new file mode 100644 index 0000000..d26101f --- /dev/null +++ b/src/icons/svg/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/education.svg b/src/icons/svg/education.svg new file mode 100644 index 0000000..7bfb01d --- /dev/null +++ b/src/icons/svg/education.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/email.svg b/src/icons/svg/email.svg new file mode 100644 index 0000000..74d25e2 --- /dev/null +++ b/src/icons/svg/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/example.svg b/src/icons/svg/example.svg new file mode 100644 index 0000000..46f42b5 --- /dev/null +++ b/src/icons/svg/example.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/excel.svg b/src/icons/svg/excel.svg new file mode 100644 index 0000000..74d97b8 --- /dev/null +++ b/src/icons/svg/excel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/exit-fullscreen.svg b/src/icons/svg/exit-fullscreen.svg new file mode 100644 index 0000000..485c128 --- /dev/null +++ b/src/icons/svg/exit-fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/eye-open.svg b/src/icons/svg/eye-open.svg new file mode 100644 index 0000000..88dcc98 --- /dev/null +++ b/src/icons/svg/eye-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/eye.svg b/src/icons/svg/eye.svg new file mode 100644 index 0000000..16ed2d8 --- /dev/null +++ b/src/icons/svg/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/form.svg b/src/icons/svg/form.svg new file mode 100644 index 0000000..dcbaa18 --- /dev/null +++ b/src/icons/svg/form.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/fullscreen.svg b/src/icons/svg/fullscreen.svg new file mode 100644 index 0000000..0e86b6f --- /dev/null +++ b/src/icons/svg/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/guide.svg b/src/icons/svg/guide.svg new file mode 100644 index 0000000..b271001 --- /dev/null +++ b/src/icons/svg/guide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon.svg b/src/icons/svg/icon.svg new file mode 100644 index 0000000..82be8ee --- /dev/null +++ b/src/icons/svg/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/international.svg b/src/icons/svg/international.svg new file mode 100644 index 0000000..e9b56ee --- /dev/null +++ b/src/icons/svg/international.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/language.svg b/src/icons/svg/language.svg new file mode 100644 index 0000000..0082b57 --- /dev/null +++ b/src/icons/svg/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/link.svg b/src/icons/svg/link.svg new file mode 100644 index 0000000..48197ba --- /dev/null +++ b/src/icons/svg/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/list.svg b/src/icons/svg/list.svg new file mode 100644 index 0000000..20259ed --- /dev/null +++ b/src/icons/svg/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/lock.svg b/src/icons/svg/lock.svg new file mode 100644 index 0000000..74fee54 --- /dev/null +++ b/src/icons/svg/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/message.svg b/src/icons/svg/message.svg new file mode 100644 index 0000000..14ca817 --- /dev/null +++ b/src/icons/svg/message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/money.svg b/src/icons/svg/money.svg new file mode 100644 index 0000000..c1580de --- /dev/null +++ b/src/icons/svg/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/nested.svg b/src/icons/svg/nested.svg new file mode 100644 index 0000000..06713a8 --- /dev/null +++ b/src/icons/svg/nested.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/password.svg b/src/icons/svg/password.svg new file mode 100644 index 0000000..e291d85 --- /dev/null +++ b/src/icons/svg/password.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/pdf.svg b/src/icons/svg/pdf.svg new file mode 100644 index 0000000..957aa0c --- /dev/null +++ b/src/icons/svg/pdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/people.svg b/src/icons/svg/people.svg new file mode 100644 index 0000000..2bd54ae --- /dev/null +++ b/src/icons/svg/people.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/peoples.svg b/src/icons/svg/peoples.svg new file mode 100644 index 0000000..aab852e --- /dev/null +++ b/src/icons/svg/peoples.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/qq.svg b/src/icons/svg/qq.svg new file mode 100644 index 0000000..ee13d4e --- /dev/null +++ b/src/icons/svg/qq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/search.svg b/src/icons/svg/search.svg new file mode 100644 index 0000000..84233dd --- /dev/null +++ b/src/icons/svg/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/shopping.svg b/src/icons/svg/shopping.svg new file mode 100644 index 0000000..87513e7 --- /dev/null +++ b/src/icons/svg/shopping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/size.svg b/src/icons/svg/size.svg new file mode 100644 index 0000000..ddb25b8 --- /dev/null +++ b/src/icons/svg/size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/skill.svg b/src/icons/svg/skill.svg new file mode 100644 index 0000000..a3b7312 --- /dev/null +++ b/src/icons/svg/skill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/star.svg b/src/icons/svg/star.svg new file mode 100644 index 0000000..6cf86e6 --- /dev/null +++ b/src/icons/svg/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/tab.svg b/src/icons/svg/tab.svg new file mode 100644 index 0000000..b4b48e4 --- /dev/null +++ b/src/icons/svg/tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/table.svg b/src/icons/svg/table.svg new file mode 100644 index 0000000..0e3dc9d --- /dev/null +++ b/src/icons/svg/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/theme.svg b/src/icons/svg/theme.svg new file mode 100644 index 0000000..5982a2f --- /dev/null +++ b/src/icons/svg/theme.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/tool.svg b/src/icons/svg/tool.svg new file mode 100644 index 0000000..4821cc1 --- /dev/null +++ b/src/icons/svg/tool.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/icons/svg/toolbox.svg b/src/icons/svg/toolbox.svg new file mode 100644 index 0000000..1c9c047 --- /dev/null +++ b/src/icons/svg/toolbox.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/icons/svg/tree-table.svg b/src/icons/svg/tree-table.svg new file mode 100644 index 0000000..8aafdb8 --- /dev/null +++ b/src/icons/svg/tree-table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/tree.svg b/src/icons/svg/tree.svg new file mode 100644 index 0000000..dd4b7dd --- /dev/null +++ b/src/icons/svg/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/user-group.svg b/src/icons/svg/user-group.svg new file mode 100644 index 0000000..1a3edb2 --- /dev/null +++ b/src/icons/svg/user-group.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/icons/svg/user.svg b/src/icons/svg/user.svg new file mode 100644 index 0000000..0ba0716 --- /dev/null +++ b/src/icons/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/wechat.svg b/src/icons/svg/wechat.svg new file mode 100644 index 0000000..c586e55 --- /dev/null +++ b/src/icons/svg/wechat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/zip.svg b/src/icons/svg/zip.svg new file mode 100644 index 0000000..f806fc4 --- /dev/null +++ b/src/icons/svg/zip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svgo.yml b/src/icons/svgo.yml new file mode 100644 index 0000000..d11906a --- /dev/null +++ b/src/icons/svgo.yml @@ -0,0 +1,22 @@ +# replace default config + +# multipass: true +# full: true + +plugins: + + # - name + # + # or: + # - name: false + # - name: true + # + # or: + # - name: + # param1: 1 + # param2: 2 + +- removeAttrs: + attrs: + - 'fill' + - 'fill-rule' diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue new file mode 100644 index 0000000..f6a3286 --- /dev/null +++ b/src/layout/components/AppMain.vue @@ -0,0 +1,40 @@ + + + + + + + diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue new file mode 100644 index 0000000..bfcdc99 --- /dev/null +++ b/src/layout/components/Navbar.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/layout/components/Sidebar/FixiOSBug.js b/src/layout/components/Sidebar/FixiOSBug.js new file mode 100644 index 0000000..bc14856 --- /dev/null +++ b/src/layout/components/Sidebar/FixiOSBug.js @@ -0,0 +1,26 @@ +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) + } + } + } + } +} diff --git a/src/layout/components/Sidebar/Item.vue b/src/layout/components/Sidebar/Item.vue new file mode 100644 index 0000000..a1044b3 --- /dev/null +++ b/src/layout/components/Sidebar/Item.vue @@ -0,0 +1,53 @@ + + + diff --git a/src/layout/components/Sidebar/Link.vue b/src/layout/components/Sidebar/Link.vue new file mode 100644 index 0000000..530b3d5 --- /dev/null +++ b/src/layout/components/Sidebar/Link.vue @@ -0,0 +1,43 @@ + + + diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue new file mode 100644 index 0000000..7f33fea --- /dev/null +++ b/src/layout/components/Sidebar/Logo.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue new file mode 100644 index 0000000..a418c3d --- /dev/null +++ b/src/layout/components/Sidebar/SidebarItem.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue new file mode 100644 index 0000000..fb014a2 --- /dev/null +++ b/src/layout/components/Sidebar/index.vue @@ -0,0 +1,54 @@ + + + diff --git a/src/layout/components/index.js b/src/layout/components/index.js new file mode 100644 index 0000000..97ee3cd --- /dev/null +++ b/src/layout/components/index.js @@ -0,0 +1,3 @@ +export { default as Navbar } from './Navbar' +export { default as Sidebar } from './Sidebar' +export { default as AppMain } from './AppMain' diff --git a/src/layout/index.vue b/src/layout/index.vue new file mode 100644 index 0000000..db22a7b --- /dev/null +++ b/src/layout/index.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/src/layout/mixin/ResizeHandler.js b/src/layout/mixin/ResizeHandler.js new file mode 100644 index 0000000..e8d0df8 --- /dev/null +++ b/src/layout/mixin/ResizeHandler.js @@ -0,0 +1,45 @@ +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 }) + } + } + } + } +} diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..3d59f8c --- /dev/null +++ b/src/main.js @@ -0,0 +1,51 @@ +import Vue from 'vue' + +import 'normalize.css/normalize.css' // A modern alternative to CSS resets + +import ElementUI from 'element-ui' +import '@/styles/element-variables.scss' +import locale from 'element-ui/lib/locale/lang/en' // lang i18n + +import '@/styles/index.scss' // global css + +import '@/styles/iconfont.css' +import App from './App' +import store from './store' +import router from './router' + +import ViewUI from 'view-design'; +import './styles/viewui-mine.less'; +import base from "./utils/common" +Vue.use(ViewUI); +import moment from "moment" +Vue.prototype.$moment = moment; +Vue.prototype.base = base; +import '@/icons' // icon +import '@/permission' // permission control + +/** + * If you don't want to use mock-server + * you want to use MockJs for mock api + * you can execute: mockXHR() + * + * Currently MockJs will be used in the production environment, + * please remove it before going online ! ! ! + */ +if (process.env.NODE_ENV === 'production') { + const { mockXHR } = require('../mock') + mockXHR() +} + +// set ElementUI lang to EN +//Vue.use(ElementUI, { locale }) +// 如果想要中文版 element-ui,按如下方式声明 + Vue.use(ElementUI) + +Vue.config.productionTip = false + +new Vue({ + el: '#app', + router, + store, + render: h => h(App) +}) diff --git a/src/permission.js b/src/permission.js new file mode 100644 index 0000000..309a594 --- /dev/null +++ b/src/permission.js @@ -0,0 +1,76 @@ +import router from './router' +import store from './store' +import { Message } from 'element-ui' +import NProgress from 'nprogress' // progress bar +import 'nprogress/nprogress.css' // progress bar style +import { getToken } from '@/utils/auth' // get token from cookie +import getPageTitle from '@/utils/get-page-title' + +NProgress.configure({ showSpinner: false }) // NProgress Configuration + +const whiteList = ['/login'] // no redirect whitelist + +router.beforeEach(async(to, from, next) => { + // start progress bar + NProgress.start() + + // set page title + document.title = getPageTitle(to.meta.title) + + // determine whether the user has logged in + const hasToken = getToken() + + if (hasToken) { + if (to.path === '/login') { + // if is logged in, redirect to the home page + next({ path: '/' }) + NProgress.done() + } else { + // determine whether the user has obtained his permission roles through getInfo + const hasRoles = store.getters.roles && store.getters.roles.length > 0 + if (hasRoles) { + next() + } else { + try { + // get user info + // note: roles must be a object array! such as: ['admin'] or ,['developer','editor'] + const { roles } = await store.dispatch('user/getInfo') + + // generate accessible routes map based on roles + const accessRoutes = await store.dispatch('permission/generateRoutes', roles) + + console.log(accessRoutes) + // 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(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() +}) diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..d16e88f --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,91 @@ +import Vue from 'vue' +import Router from 'vue-router' + +Vue.use(Router) + +/* Layout */ +import Layout from '@/layout' + +/** + * 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 (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 + 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/404'), + hidden: true + }, + { + path: '/', + component: Layout, + redirect: '/dashboard', + children: [{ + path: 'dashboard', + name: '系统首页', + component: () => import('@/views/dashboard/index'), + meta: { + title: '系统首页', + icon: 'dashboard' + } + }] + } +] + +/** + * asyncRoutes + * the routes that need to be dynamically loaded based on user roles + */ +export const asyncRoutes = [ + + + // 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 diff --git a/src/settings.js b/src/settings.js new file mode 100644 index 0000000..e1f6b14 --- /dev/null +++ b/src/settings.js @@ -0,0 +1,16 @@ +module.exports = { + + title: '乐益预约系统', + + /** + * @type {boolean} true | false + * @description Whether fix the header + */ + fixedHeader: true, + + /** + * @type {boolean} true | false + * @description Whether show the logo in sidebar + */ + sidebarLogo: true +} diff --git a/src/store/getters.js b/src/store/getters.js new file mode 100644 index 0000000..a108508 --- /dev/null +++ b/src/store/getters.js @@ -0,0 +1,10 @@ +const getters = { + sidebar: state => state.app.sidebar, + device: state => state.app.device, + token: state => state.user.token, + avatar: state => state.user.avatar, + name: state => state.user.name, + roles: state => state.user.roles, + permission_routes: state => state.permission.routes +} +export default getters diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 0000000..6ae5dad --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,21 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import getters from './getters' +import app from './modules/app' +import permission from './modules/permission' +import settings from './modules/settings' +import user from './modules/user' + +Vue.use(Vuex) + +const store = new Vuex.Store({ + modules: { + app, + permission, + settings, + user + }, + getters +}) + +export default store diff --git a/src/store/modules/app.js b/src/store/modules/app.js new file mode 100644 index 0000000..7ea7e33 --- /dev/null +++ b/src/store/modules/app.js @@ -0,0 +1,48 @@ +import Cookies from 'js-cookie' + +const state = { + sidebar: { + opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, + withoutAnimation: false + }, + device: 'desktop' +} + +const mutations = { + TOGGLE_SIDEBAR: state => { + state.sidebar.opened = !state.sidebar.opened + state.sidebar.withoutAnimation = false + if (state.sidebar.opened) { + Cookies.set('sidebarStatus', 1) + } else { + Cookies.set('sidebarStatus', 0) + } + }, + CLOSE_SIDEBAR: (state, withoutAnimation) => { + Cookies.set('sidebarStatus', 0) + state.sidebar.opened = false + state.sidebar.withoutAnimation = withoutAnimation + }, + TOGGLE_DEVICE: (state, device) => { + state.device = device + } +} + +const actions = { + toggleSideBar({ commit }) { + commit('TOGGLE_SIDEBAR') + }, + closeSideBar({ commit }, { withoutAnimation }) { + commit('CLOSE_SIDEBAR', withoutAnimation) + }, + toggleDevice({ commit }, device) { + commit('TOGGLE_DEVICE', device) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js new file mode 100644 index 0000000..146b041 --- /dev/null +++ b/src/store/modules/permission.js @@ -0,0 +1,160 @@ +import { + asyncRoutes, + constantRoutes +} from '@/router' +import Layout from '@/layout' +import { + getAuthMenu +} from '@/api/user.js' +/** + * Use meta.role to determine if the current user has permission + * @param roles + * @param route + */ +function hasPermission(roles, route) { + if (route.meta && route.meta.roles) { + return roles.some(role => route.meta.roles.includes(role)) + } else { + return true + } +} +/** + * 静态路由懒加载 + * @param view 格式必须为 xxx/xxx 开头不要加斜杠 + * @returns + */ +export const loadView = (view) => { + return (resolve) => require([`@/views${view}`], resolve); +} + + +/** + * Filter asynchronous routing tables by recursion + * @param routes asyncRoutes + * @param roles + */ +export function filterAsyncRoutes(routes, roles) { + const res = [] + + routes.forEach(route => { + const tmp = { + ...route + } + if (hasPermission(roles, tmp)) { + if (tmp.children) { + tmp.children = filterAsyncRoutes(tmp.children, roles) + } + res.push(tmp) + } + }) + + return res +} + +const state = { + routes: [], + addRoutes: [] +} + +/** + * 后台查询的菜单数据拼装成路由格式的数据 + * @param routes + */ +export function generaMenu(routes, data) { + data.forEach(item => { + if (item.url === "/") { + + } else { + const menu = { + path: item.url === '#' ? item.id + '_key' : item.url, + component: item.url === '#' ? Layout : loadView(item.url), + // hidden: true, + children: [], + name: 'menu_' + item.id, + meta: { + title: item.name, + id: item.id, + roles: ['admin'], + + icon: item.icon + } + } + if (item.children) { + generaMenu(menu.children, item.children) + } + routes.push(menu) + } + }) +} + +const mutations = { + SET_ROUTES: (state, routes) => { + state.addRoutes = routes + state.routes = constantRoutes.concat(routes) + } +} + + + +// const actions = { +// generateRoutes({ +// commit +// }, roles) { +// const loadMenuData = [] +// return new Promise(resolve => { +// let accessedRoutes +// let data = _routes2; +// Object.assign(loadMenuData, data) +// generaMenu(asyncRoutes, loadMenuData) +// if (roles.includes('admin')) { +// // alert(JSON.stringify(asyncRoutes)) +// accessedRoutes = asyncRoutes || [] +// } else { +// accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) +// } +// commit('SET_ROUTES', accessedRoutes) +// resolve(accessedRoutes) +// }) +// } +// } + +const actions = { + generateRoutes({ + commit + }, roles) { + return new Promise(resolve => { + const loadMenuData = [] + // 先查询后台并返回左侧菜单数据并把数据添加到路由 + getAuthMenu(state.token).then(response => { + let data = response + + //console.log(JSON.stringify(data)) + + Object.assign(loadMenuData, data) + asyncRoutes.length=0; + generaMenu(asyncRoutes, loadMenuData) + let accessedRoutes + if (roles.includes('admin')) { + // alert(JSON.stringify(asyncRoutes)) + accessedRoutes = asyncRoutes || [] + } else { + accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) + } + commit('SET_ROUTES', accessedRoutes) + resolve(accessedRoutes) + + // generaMenu(asyncRoutes, data) + }).catch(error => { + console.log(error) + }) + }) + } +} + + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js new file mode 100644 index 0000000..b3f33f8 --- /dev/null +++ b/src/store/modules/settings.js @@ -0,0 +1,32 @@ +import defaultSettings from '@/settings' + +const { showSettings, fixedHeader, sidebarLogo } = defaultSettings + +const state = { + showSettings: showSettings, + fixedHeader: fixedHeader, + sidebarLogo: sidebarLogo +} + +const mutations = { + CHANGE_SETTING: (state, { key, value }) => { + // eslint-disable-next-line no-prototype-builtins + if (state.hasOwnProperty(key)) { + state[key] = value + } + } +} + +const actions = { + changeSetting({ commit }, data) { + commit('CHANGE_SETTING', data) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/src/store/modules/user.js b/src/store/modules/user.js new file mode 100644 index 0000000..c288974 --- /dev/null +++ b/src/store/modules/user.js @@ -0,0 +1,136 @@ +import { + login, + logout, + getInfo +} from '@/api/user' +import { + getToken, + setToken, + removeToken +} from '@/utils/auth' +import { + resetRouter +} from '@/router' + +const getDefaultState = () => { + return { + token: getToken(), + name: '', + avatar: '', + roles: [] + } +} + +const state = getDefaultState() + +const mutations = { + RESET_STATE: (state) => { + Object.assign(state, getDefaultState()) + }, + SET_TOKEN: (state, token) => { + state.token = token + }, + SET_NAME: (state, name) => { + state.name = name + }, + SET_AVATAR: (state, avatar) => { + state.avatar = avatar + }, + SET_ROLES: (state, roles) => { + state.roles = roles + } +} + +const actions = { + // user login + login({ + commit + }, userInfo) { + const { + username, + password + } = userInfo + return new Promise((resolve, reject) => { + login({ + username: username.trim(), + password: password + }).then(response => { + console.log(response) + const { + data + } = response; + console.log(response.access_token) + commit('SET_TOKEN', response.access_token) + setToken(response.access_token) + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // get user info + getInfo({ + commit, + state + }) { + return new Promise((resolve, reject) => { + getInfo(state.token).then(response => { + + if (!response) { + reject('身份验证失败请重新登录') + } + response["roles"] = ["admin"]; + const { + roles, + name, + avatar + } = response + + + + commit('SET_ROLES', roles) + commit('SET_NAME', name) + commit('SET_AVATAR', avatar) + resolve(response) + }).catch(error => { + reject(error) + }) + }) + }, + + // user logout + logout({ + commit, + state + }) { + return new Promise((resolve, reject) => { + logout(state.token).then(() => { + removeToken() // must remove token first + resetRouter() + commit('RESET_STATE') + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // remove token + resetToken({ + commit + }) { + return new Promise(resolve => { + removeToken() // must remove token first + commit('RESET_STATE') + resolve() + }) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/src/styles/element-ui.scss b/src/styles/element-ui.scss new file mode 100644 index 0000000..0062411 --- /dev/null +++ b/src/styles/element-ui.scss @@ -0,0 +1,49 @@ +// cover some element-ui styles + +.el-breadcrumb__inner, +.el-breadcrumb__inner a { + font-weight: 400 !important; +} + +.el-upload { + input[type="file"] { + display: none !important; + } +} + +.el-upload__input { + display: none; +} + + +// to fixed https://github.com/ElemeFE/element/issues/2461 +.el-dialog { + transform: none; + left: 0; + position: relative; + margin: 0 auto; +} + +// refine element ui upload +.upload-container { + .el-upload { + width: 100%; + + .el-upload-dragger { + width: 100%; + height: 200px; + } + } +} + +// dropdown +.el-dropdown-menu { + a { + display: block + } +} + +// to fix el-date-picker css style +.el-range-separator { + box-sizing: content-box; +} diff --git a/src/styles/element-variables.scss b/src/styles/element-variables.scss new file mode 100644 index 0000000..df2fef5 --- /dev/null +++ b/src/styles/element-variables.scss @@ -0,0 +1,7 @@ +/* 改变主题色变量 */ +$--color-primary: #c69845; + +/* 改变 icon 字体路径变量,必需 */ +$--font-path: '~element-ui/lib/theme-chalk/fonts'; + +@import "~element-ui/packages/theme-chalk/src/index"; \ No newline at end of file diff --git a/src/styles/iconfont.css b/src/styles/iconfont.css new file mode 100644 index 0000000..5babe17 --- /dev/null +++ b/src/styles/iconfont.css @@ -0,0 +1,59 @@ +@font-face { + font-family: 'iconfont'; /* Project id 3356385 */ + src: url('//at.alicdn.com/t/font_3356385_p1159rz3ar.woff2?t=1650945259111') format('woff2'), + url('//at.alicdn.com/t/font_3356385_p1159rz3ar.woff?t=1650945259111') format('woff'), + url('//at.alicdn.com/t/font_3356385_p1159rz3ar.ttf?t=1650945259111') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-shuzhuangtu:before { + content: "\e600"; +} + +.icon-zhinan:before { + content: "\e8d0"; +} + +.icon-dingdan:before { + content: "\e645"; +} + +.icon-mingxinghuodong:before { + content: "\e8b3"; +} + +.icon-yuyuezhongxin:before { + content: "\e626"; +} + +.icon-huodongzhongxin:before { + content: "\e628"; +} + +.icon-weizhixiangqing:before { + content: "\e8ab"; +} + +.icon-tingchewei:before { + content: "\e655"; +} + +.icon-ziyuanzhongxin:before { + content: "\e604"; +} + +.icon-tuijian:before { + content: "\e627"; +} + +.icon-icon-jiantou2:before { + content: "\e603"; +} + diff --git a/src/styles/index.scss b/src/styles/index.scss new file mode 100644 index 0000000..6e3237a --- /dev/null +++ b/src/styles/index.scss @@ -0,0 +1,181 @@ +@import './variables.scss'; +@import './mixin.scss'; +@import './transition.scss'; +@import './element-ui.scss'; +@import './sidebar.scss'; + +body { + height: 100%; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; +} + +label { + font-weight: 700; +} + +html { + height: 100%; + box-sizing: border-box; +} + +#app { + height: 100%; + background-color: #eff2f9; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +a:focus, +a:active { + outline: none; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + +div:focus { + outline: none; +} + +.clearfix { + &:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } +} + +// main-container global css +.app-container { + padding:1px 20px 20px 20px; + background-color: #eff2f9; +} + + + /*表头错行 .el-table th.gutter{ + display: table-cell!important; +} */ +.pagination { + text-align: right; + /* margin-top: 8px; */ + padding: 2px 28px; + border: 1px solid #eee; + border-top: 0px; +} + +.v-table .el-table__header th { + padding: 0px !important; + background-color: #f8f8f9 !important; + font-size: 13px; + height: 42px; + color: #616161; +} + +.v-table .el-table__header th.is-sortable { + padding: 3px !important; +} + +.table-tree.text-inline .el-table__body .cell { + word-break: inherit !important; + white-space: nowrap !important; +} + +.v-table .el-table__body td { + padding: 9px 0 !important; +} + +.v-table .el-table__footer td { + padding: 7px 0 !important; +} + +/* 2021.01.30修复火狐checkbox错位问题 */ +.table-tree .el-table-column--selection .cell { + display: inline; +} + +.table-tree.text-inline .el-table th>.cell { + white-space: nowrap !important; +} + +.table-tree .el-table__body-wrapper::-webkit-scrollbar { + width: 10px; + height: 10px; +} + +.table-tree .el-table__body-wrapper::-webkit-scrollbar-thumb { + border-radius: 5px; + background: #ddd; +} + +.table-tree .table-img { + height: 40px; + border-radius: 5px; + margin-right: 10px; + width: 40px; + object-fit: cover; +} + +.table-tree .table-img:hover { + cursor: pointer; +} + +.v-table .ivu-tag-default { + border: none !important; + background: none !important; +} + +/* .v-table >>> .el-table__fixed-body-wrapper { +top: 41px !important; +} */ +.v-table .el-table__fixed:before { + border-color: none !important; +} + +/* 2021.06.19判断谷歌内核浏览重新计算table高度 */ +.chrome .el-table__fixed { + height: calc(100% - 11px) !important; + background: white; + /* box-shadow: 0px -11px 10px rgb(0 0 0 / 12%) !important; */ +} + +.chrome .el-table__body-wrapper::-webkit-scrollbar { + width: 11px; + height: 11px; +} + +.chrome .el-table__body-wrapper::-webkit-scrollbar-thumb { + border-radius: 5px; + background: #ddd; +} + +.chrome .el-table__fixed:before { + background-color: unset; +} + +.chrome .el-table__fixed-footer-wrapper { + bottom: -11.5px; +} + +.searchFields { + display: flex; + align-items: center; +} +.searchFields .el-input__inner{ + height: 32px !important; + line-height: 32px !important; +} diff --git a/src/styles/mixin.scss b/src/styles/mixin.scss new file mode 100644 index 0000000..36b74bb --- /dev/null +++ b/src/styles/mixin.scss @@ -0,0 +1,28 @@ +@mixin clearfix { + &:after { + content: ""; + display: table; + clear: both; + } +} + +@mixin scrollBar { + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } +} + +@mixin relative { + position: relative; + width: 100%; + height: 100%; +} diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss new file mode 100644 index 0000000..302d239 --- /dev/null +++ b/src/styles/sidebar.scss @@ -0,0 +1,246 @@ +#app { + + .main-container { + min-height: 100%; + transition: margin-left .28s; + margin-left: $sideBarWidth; + position: relative; + } + + .sidebar-container { + transition: width 0.28s; + width: $sideBarWidth !important; + background-color: $menuBg; + height: 100%; + position: fixed; + font-size: 0px; + top: 0; + bottom: 0; + left: 0; + z-index: 1001; + overflow: hidden; + + // reset element-ui css + .horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; + } + + .scrollbar-wrapper { + overflow-x: hidden !important; + } + + .el-scrollbar__bar.is-vertical { + right: 0px; + } + + .el-scrollbar { + height: calc(100% - 100px); + } + + &.has-logo { + .el-scrollbar { + height: calc(100% - 150px); + } + } + + .is-horizontal { + display: none; + } + + a { + display: inline-block; + width: 100%; + overflow: hidden; + } + + .svg-icon { + margin-right: 16px; + } + + .sub-el-icon { + margin-right: 12px; + margin-left: -2px; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + } + + // menu hover + .submenu-title-noDropdown, + .el-submenu__title { + &:hover { + background-color: $menuHover !important; + color: $subMenuActiveText !important; + } + } + .el-submenu .is-active{ + background-color: $menuHover !important; + } + + + + .is-active{ + background-color: $menuActiveBg !important; + //border-right: 5px solid $subMenuActiveText !important; + } + .is-active>.el-submenu__title { + color: $subMenuActiveText !important; + } + + + & .nest-menu .el-submenu>.el-submenu__title, + & .el-submenu .el-menu-item { + min-width: $sideBarWidth !important; + background-color: $subMenuBg !important; + + &:hover { + background-color: $subMenuHover !important; + color: $subMenuActiveText !important; + } + &.is-active{ + background-color: $submenuActiveBg !important; + border-right: 5px solid $subMenuActiveText !important; + color: $subMenuActiveText !important; + } + } + } + + + .hideSidebar { + .sidebar-container { + width: 54px !important; + } + + .main-container { + margin-left: 54px; + } + + .submenu-title-noDropdown { + padding: 0 !important; + position: relative; + + .el-tooltip { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + .sub-el-icon { + margin-left: 19px; + } + } + } + + .el-submenu { + overflow: hidden; + + &>.el-submenu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + .sub-el-icon { + margin-left: 19px; + } + + .el-submenu__icon-arrow { + display: none; + } + } + } + + .el-menu--collapse { + .el-submenu { + &>.el-submenu__title { + &>span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-submenu { + min-width: $sideBarWidth !important; + } + + // mobile responsive + .mobile { + .main-container { + margin-left: 0px; + } + + .sidebar-container { + transition: transform .28s; + width: $sideBarWidth !important; + } + + &.hideSidebar { + .sidebar-container { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-$sideBarWidth, 0, 0); + } + } + } + + .withoutAnimation { + + .main-container, + .sidebar-container { + transition: none; + } + } +} + +// when menu collapsed +.el-menu--vertical { + &>.el-menu { + .svg-icon { + margin-right: 16px; + } + .sub-el-icon { + margin-right: 12px; + margin-left: -2px; + } + } + + .nest-menu .el-submenu>.el-submenu__title, + .el-menu-item { + &:hover { + // you can use $subMenuHover + background-color: $menuHover !important; + } + } + + // the scroll bar appears when the subMenu is too long + >.el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } + + +} diff --git a/src/styles/transition.scss b/src/styles/transition.scss new file mode 100644 index 0000000..4cb27cc --- /dev/null +++ b/src/styles/transition.scss @@ -0,0 +1,48 @@ +// global transition css + +/* fade */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.28s; +} + +.fade-enter, +.fade-leave-active { + opacity: 0; +} + +/* fade-transform */ +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all .5s; +} + +.fade-transform-enter { + opacity: 0; + transform: translateX(-30px); +} + +.fade-transform-leave-to { + opacity: 0; + transform: translateX(30px); +} + +/* breadcrumb transition */ +.breadcrumb-enter-active, +.breadcrumb-leave-active { + transition: all .5s; +} + +.breadcrumb-enter, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(20px); +} + +.breadcrumb-move { + transition: all .5s; +} + +.breadcrumb-leave-active { + position: absolute; +} diff --git a/src/styles/variables copy.scss b/src/styles/variables copy.scss new file mode 100644 index 0000000..be55772 --- /dev/null +++ b/src/styles/variables copy.scss @@ -0,0 +1,25 @@ +// sidebar +$menuText:#bfcbd9; +$menuActiveText:#409EFF; +$subMenuActiveText:#f4f4f5; //https://github.com/ElemeFE/element/issues/12951 + +$menuBg:#304156; +$menuHover:#263445; + +$subMenuBg:#1f2d3d; +$subMenuHover:#001528; + +$sideBarWidth: 210px; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + menuText: $menuText; + menuActiveText: $menuActiveText; + subMenuActiveText: $subMenuActiveText; + menuBg: $menuBg; + menuHover: $menuHover; + subMenuBg: $subMenuBg; + subMenuHover: $subMenuHover; + sideBarWidth: $sideBarWidth; +} diff --git a/src/styles/variables.scss b/src/styles/variables.scss new file mode 100644 index 0000000..fdda1be --- /dev/null +++ b/src/styles/variables.scss @@ -0,0 +1,31 @@ +// sidebar +$menuText:#606266; +$menuActiveText:#c69845; +$subMenuActiveText:#c69845; //https://github.com/ElemeFE/element/issues/12951 + +$menuBg:#ffffff;//#304156 +$menuHover:#e0f2ff; +$menuActiveBg:#e72a24; + + +$subMenuBg:#ffffff;//#1f2d3d +$subMenuHover:#edf6ff; +$submenuActiveBg:#e72a24; + +$sideBarWidth: 210px; +$primaryColor: #c69845; +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + menuText: $menuText; + menuActiveText: $menuActiveText; + subMenuActiveText: $subMenuActiveText; + menuBg: $menuBg; + menuHover: $menuHover; + menuHover: $menuHover; + menuActiveBg: $menuActiveBg; + submenuActiveBg: $submenuActiveBg; + subMenuHover: $subMenuHover; + sideBarWidth: $sideBarWidth; + primaryColor:$primaryColor +} diff --git a/src/styles/viewui-mine.less b/src/styles/viewui-mine.less new file mode 100644 index 0000000..75a7fdb --- /dev/null +++ b/src/styles/viewui-mine.less @@ -0,0 +1,4 @@ +@import '~view-design/src/styles/index.less'; + +// Here are the variables to cover, such as: +@primary-color: #c69845; diff --git a/src/utils/auth.js b/src/utils/auth.js new file mode 100644 index 0000000..059af18 --- /dev/null +++ b/src/utils/auth.js @@ -0,0 +1,15 @@ +import Cookies from 'js-cookie' + +const TokenKey = 'vue_admin_template_token' + +export function getToken() { + return Cookies.get(TokenKey) +} + +export function setToken(token) { + return Cookies.set(TokenKey, token) +} + +export function removeToken() { + return Cookies.remove(TokenKey) +} diff --git a/src/utils/common.js b/src/utils/common.js new file mode 100644 index 0000000..6a7e618 --- /dev/null +++ b/src/utils/common.js @@ -0,0 +1,272 @@ +let base = { + isPhone (val) { + return /^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(val) + }, + isDecimal (val) { + return /(^[\-0-9][0-9]*(.[0-9]+)?)$/.test(val) + }, + isNumber (val) { + return /(^[\-0-9][0-9]*([0-9]+)?)$/.test(val) + }, + isMail (val) { + return /^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/.test(val) + }, + isUrl (url) { + return this.checkUrl(url) + }, + checkUrl (url) { + // url= 协议://(ftp的登录信息)[IP|域名](:端口号)(/或?请求参数) + var strRegex = + '^((https|http|ftp)://)?' + // (https或http或ftp):// 可有可无 + "(([\\w_!~*'()\\.&=+$%-]+: )?[\\w_!~*'()\\.&=+$%-]+@)?" + // ftp的user@ 可有可无 + '(([0-9]{1,3}\\.){3}[0-9]{1,3}' + // IP形式的URL- 3位数字.3位数字.3位数字.3位数字 + '|' + // 允许IP和DOMAIN(域名) + '(localhost)|' + // 匹配localhost + "([\\w_!~*'()-]+\\.)*" + // 域名- 至少一个[英文或数字_!~*\'()-]加上. + '\\w+\\.' + // 一级域名 -英文或数字 加上. + '[a-zA-Z]{1,6})' + // 顶级域名- 1-6位英文 + '(:[0-9]{1,5})?' + // 端口- :80 ,1-5位数字 + '((/?)|' + // url无参数结尾 - 斜杆或这没有 + "(/[\\w_!~*'()\\.;?:@&=+$,%#-]+)+/?)$" // 请求参数结尾- 英文或数字和[]内的各种字符 + var re = new RegExp(strRegex, 'i') // i不区分大小写 + // 将url做uri转码后再匹配,解除请求参数中的中文和空字符影响 + if (re.test(encodeURI(url))) { + return true + } + return false + }, + matchUrlIp (url, ip) { // url使用是否使用的当前ip + if (!url || !ip) { + return false + } + return url.indexOf(ip.replace('https://', '').replace('http://', '')) >= 0 + }, + getImgSrc (src, httpUrl) { + if (this.isUrl(src)) { + return src + } + if (httpUrl) { + return httpUrl + src + } + return src + }, + previewImg (src, httpUrl) { // 图片预览,目前只支持单图片预览 + if (src && !this.isUrl(src) && httpUrl) { + if (src.substr(0, 1) == '/' && httpUrl.substr(httpUrl.length - 1, 1) == '/') { + src = src.substr(1) + } + src = (httpUrl + src) + } + let id = 'vol-preview' + let $div = document.getElementById(id) + if (!$div) { + $div = document.createElement('div') + $div.setAttribute('id', 'vol-preview') + let $mask = document.createElement('div') + $mask.style.position = 'absolute' + $mask.style.width = '100%' + $mask.style.height = '100%' + $mask.style.background = 'black' + $mask.style.opacity = '0.6' + $div.appendChild($mask) + $div.style.position = 'fixed' + $div.style.width = '100%' + $div.style.height = '100%' + // $div.style.overflow = "scroll"; + $div.style.top = 0 + $div.style['z-index'] = 9999999 + let $img = document.createElement('img') + $img.setAttribute('class', 'vol-preview-img') + $img.style.position = 'absolute' + $img.style.top = '50%' + $img.style.left = '50%' + $img.style['max-width'] = '90%' + $img.style['max-height'] = '90%' + $img.style.transform = 'translate(-50%,-50%)' + // $img.src = src; + $img.setAttribute('src', src) + $div.appendChild($img) + $div.addEventListener('click', function () { + this.style.display = 'none' + }) + document.body.appendChild($div) + return + } + let $img1 = document.body.appendChild($div).querySelector('.vol-preview-img') + // img.src = src; + $img1.setAttribute('src', src) + $div.style.display = 'block' + }, + // 下载文件 $element 标签, url完整url, fileName 文件名, header 以key/value传值 + // backGroundUrl 后台url,如果后台url直接从后台下载,其他全部通过点击a标签下载 + dowloadFile (url, fileName, header, backGroundUrl) { + if (!url) return alert('此文件没有url不能下载') + if (!this.isUrl(url)) { + url = backGroundUrl + url + } + window.open(url) + + // let $element = document.getElementById('dowonloadfile-a'); + // if (!$element) { + // $element = document.createElement('a'); + // $element.setAttribute("id", "dowonloadfile-a"); + // document.body.append($element); + // } + // //url为一个完整的地址,并且不是后台api的地址,直接点击a标签下载 + // // if (this.isUrl(url) && !this.matchUrlIp(url, backGroundUrl)) { + // // $element.href = url; + // // $element.click(); + // // return; + // // } + + // if (!this.isUrl(url)) { + // if (!this.isUrl(backGroundUrl + url)) { + // console.log("文件路径不正确"); + // alert('文件路径不正确') + // return; + // } + // url = backGroundUrl + url; + // } + // $element.href = url; + // $element.click(); + + // //通过后台api服务器下载 + // if (!this.isUrl(url)) { + // if (!this.isUrl(backGroundUrl + url)) { + // alert('当前下载的文件url【' + url + '】不正确') + // return; + // } + // url = backGroundUrl + url; + // } + // let xmlResquest = new XMLHttpRequest(); + // xmlResquest.open("GET", url, true); + // xmlResquest.setRequestHeader("Content-type", "application/json"); + // if (header && typeof header == 'object') { + // for (const key in header) { + // xmlResquest.setRequestHeader( + // key, + // header[key] + // ); + // } + // } + + // xmlResquest.responseType = "blob"; + // xmlResquest.onload = function (oEvent) { + // if (xmlResquest.status != 200) { + // return alert('没有下载到此文件的信息') + // } + // let content = xmlResquest.response; + // $element.download = fileName; + // let blob = new Blob([content]); + // $element.href = URL.createObjectURL(blob); + // $element.click(); + // }; + // xmlResquest.send(); + }, + downloadImg (data) { + if (!data.url || !data.callback || typeof data.callback !== 'function') { + return + } + // url, backGroundUrl, header, callback + if (this.isUrl(data.url) && !this.matchUrlIp(data.url, data.backGroundUrl)) { + return data.url + } + // 通过后台api服务器下载 + if (!this.isUrl(data.url)) { + if (!this.isUrl(data.backGroundUrl + data.url)) { + return + } + data.url = data.backGroundUrl + data.url + } + var xmlResquest = new XMLHttpRequest() + xmlResquest.open('get', data.url, true) + xmlResquest.responseType = 'blob' + xmlResquest.setRequestHeader('Content-Type', 'application/json') + if (data.header && typeof data.header === 'object') { + for (const key in data.header) { + xmlResquest.setRequestHeader( + key, + data.header[key] + ) + } + } + xmlResquest.onload = function () { + if (this.status == 200) { + var blob = this.response + callback(window.URL.createObjectURL(blob)) + } + } + xmlResquest.send() + }, + // 2020.06.01增加通用方法,将普通对象转换为tree结构 + // data数据格式[ + // { name: 'tree1', id: 1, parentId: 0 }, + // { name: 'tree2', id: 2, parentId: 0 }] + + // 1、id与parentId这两个字段必须有 + // 2、树形tree需要注意Id与parentId循环依赖的问题 + // 3、callback每次生成一新的节点的时回调的方法 + + convertTree (data, callback) { + var treeIds = [] + var root_data = [] + data.forEach(x => { + if (!x.children) { + x.children = [] + } + if (!x.hidden && x.id !== undefined && x.id !== x.parentId && !data.some(s => { + return x.parentId == s.id + })) { + x.isRoot = true + callback && callback(x, data, true, treeIds) + root_data.push(x) + getTree(x.id, x, data, callback, treeIds) + } + }) + var exceptionNodes = data.filter(f => { + return treeIds.indexOf(f.id) == -1 && !f.hidden + }) + + root_data.push(...exceptionNodes) + return root_data + }, + getTreeAllParent (id, data) { // 获取某个节点的所有父节点信息2020.11.01 + var nodes = [] + if (!(data instanceof Array)) { + return nodes + } + + var _child = data.find(x => { return x.id === id }) + if (!_child) { + return [] + } + nodes.push(_child) + var _parentIds = [_child.parentId] + for (let index = 0; index < _parentIds.length; index++) { + var _node = data.find(x => { return x.id === _parentIds[index] && x.id !== x.parentId }) + if (!_node) { + return nodes + } + _parentIds.push(_node.parentId) + nodes.unshift(_node) + } + return nodes + } + +} +export default base + +// 2020.06.01增加通用方法,将普通对象转换为tree结构 +function getTree (id, node, data, callback, treeIds) { + if (treeIds.indexOf(id) == -1) { + treeIds.push(id) + } + data.forEach(x => { + if (!x.hidden && x.parentId == id) { + if (!node.children) node.children = [] + callback && callback(x, node, false) + node.children.push(x) + getTree(x.id, x, data, callback, treeIds) + } + }) +} diff --git a/src/utils/get-page-title.js b/src/utils/get-page-title.js new file mode 100644 index 0000000..a6de99d --- /dev/null +++ b/src/utils/get-page-title.js @@ -0,0 +1,10 @@ +import defaultSettings from '@/settings' + +const title = defaultSettings.title || 'Vue Admin Template' + +export default function getPageTitle(pageTitle) { + if (pageTitle) { + return `${pageTitle} - ${title}` + } + return `${title}` +} diff --git a/src/utils/index.js b/src/utils/index.js new file mode 100644 index 0000000..4830c04 --- /dev/null +++ b/src/utils/index.js @@ -0,0 +1,117 @@ +/** + * Created by PanJiaChen on 16/11/18. + */ + +/** + * Parse the time to string + * @param {(Object|string|number)} time + * @param {string} cFormat + * @returns {string | null} + */ +export function parseTime(time, cFormat) { + if (arguments.length === 0 || !time) { + return null + } + const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string')) { + if ((/^[0-9]+$/.test(time))) { + // support "1548221490638" + time = parseInt(time) + } else { + // support safari + // https://stackoverflow.com/questions/4310953/invalid-date-in-safari + time = time.replace(new RegExp(/-/gm), '/') + } + } + + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => { + const value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] } + return value.toString().padStart(2, '0') + }) + return time_str +} + +/** + * @param {number} time + * @param {string} option + * @returns {string} + */ +export function formatTime(time, option) { + if (('' + time).length === 10) { + time = parseInt(time) * 1000 + } else { + time = +time + } + const d = new Date(time) + const now = Date.now() + + const diff = (now - d) / 1000 + + if (diff < 30) { + return '刚刚' + } else if (diff < 3600) { + // less 1 hour + return Math.ceil(diff / 60) + '分钟前' + } else if (diff < 3600 * 24) { + return Math.ceil(diff / 3600) + '小时前' + } else if (diff < 3600 * 24 * 2) { + return '1天前' + } + if (option) { + return parseTime(time, option) + } else { + return ( + d.getMonth() + + 1 + + '月' + + d.getDate() + + '日' + + d.getHours() + + '时' + + d.getMinutes() + + '分' + ) + } +} + +/** + * @param {string} url + * @returns {Object} + */ +export function param2Obj(url) { + const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') + if (!search) { + return {} + } + const obj = {} + const searchArr = search.split('&') + searchArr.forEach(v => { + const index = v.indexOf('=') + if (index !== -1) { + const name = v.substring(0, index) + const val = v.substring(index + 1, v.length) + obj[name] = val + } + }) + return obj +} diff --git a/src/utils/request.js b/src/utils/request.js new file mode 100644 index 0000000..03d56d0 --- /dev/null +++ b/src/utils/request.js @@ -0,0 +1,95 @@ +import axios from 'axios' +import { + MessageBox, + Message +} from 'element-ui' +import store from '@/store' +import { + getToken +} from '@/utils/auth' + +// create an axios instance +const service = axios.create({ + baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url + // withCredentials: true, // send cookies when cross-domain requests + timeout: 5000 // request timeout +}) + +// request interceptor +service.interceptors.request.use( + config => { + // do something before request is sent + + if (store.getters.token) { + // let each request carry token + // ['X-Token'] is a custom headers key + // please modify it according to the actual situation + //config.headers['X-Token'] = getToken(); + + config.headers['Authorization'] = "Bearer " + getToken() + } + return config + }, + error => { + // do something with request error + console.log(error) // for debug + return Promise.reject(error) + } +) + +// response interceptor +service.interceptors.response.use( + /** + * If you want to get http information such as headers or status + * Please return response => response + */ + + /** + * Determine the request status by custom code + * Here is just an example + * You can also judge the status by HTTP Status Code + */ + response => { + console.log("response", response) + const res = response.data + + // if the custom code is not 20000, it is judged as an error. + + if (res.hasOwnProperty("errcode")) { + Message({ + message: res.errmsg || 'Error', + type: 'error', + duration: 5 * 1000 + }) + + // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired; + if (res.errcode === 50008 || res.errcode === 50012 || res.errcode === 50014) { + // to re-login + MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', + 'Confirm logout', { + confirmButtonText: 'Re-Login', + cancelButtonText: 'Cancel', + type: 'warning' + }).then(() => { + store.dispatch('user/resetToken').then(() => { + location.reload() + }) + }) + } + return Promise.reject(new Error(res.errmsg || 'Error')) + } else { + return res + } + }, + error => { + console.log('err' + error) // for debug + Message({ + message: error.message, + type: 'error', + duration: 5 * 1000 + }) + return Promise.reject(error) + } +) + +export default service diff --git a/src/utils/validate.js b/src/utils/validate.js new file mode 100644 index 0000000..e9532e8 --- /dev/null +++ b/src/utils/validate.js @@ -0,0 +1,19 @@ +/** + * Created by PanJiaChen on 16/11/18. + */ + +/** + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path) { + return /^(https?:|mailto:|tel:)/.test(path) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUsername(str) { + return true +} diff --git a/src/views/404.vue b/src/views/404.vue new file mode 100644 index 0000000..1791f55 --- /dev/null +++ b/src/views/404.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/src/views/dashboard/components/BarChart.vue b/src/views/dashboard/components/BarChart.vue new file mode 100644 index 0000000..199f14c --- /dev/null +++ b/src/views/dashboard/components/BarChart.vue @@ -0,0 +1,146 @@ + + + diff --git a/src/views/dashboard/components/PanelGroup.vue b/src/views/dashboard/components/PanelGroup.vue new file mode 100644 index 0000000..d0701b8 --- /dev/null +++ b/src/views/dashboard/components/PanelGroup.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/src/views/dashboard/components/mixins/resize.js b/src/views/dashboard/components/mixins/resize.js new file mode 100644 index 0000000..234953b --- /dev/null +++ b/src/views/dashboard/components/mixins/resize.js @@ -0,0 +1,55 @@ +import { debounce } from '@/utils' + +export default { + data() { + return { + $_sidebarElm: null, + $_resizeHandler: null + } + }, + mounted() { + this.$_resizeHandler = debounce(() => { + if (this.chart) { + this.chart.resize() + } + }, 100) + this.$_initResizeEvent() + this.$_initSidebarResizeEvent() + }, + beforeDestroy() { + this.$_destroyResizeEvent() + this.$_destroySidebarResizeEvent() + }, + // to fixed bug when cached by keep-alive + // https://github.com/PanJiaChen/vue-element-admin/issues/2116 + activated() { + this.$_initResizeEvent() + this.$_initSidebarResizeEvent() + }, + deactivated() { + this.$_destroyResizeEvent() + this.$_destroySidebarResizeEvent() + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_initResizeEvent() { + window.addEventListener('resize', this.$_resizeHandler) + }, + $_destroyResizeEvent() { + window.removeEventListener('resize', this.$_resizeHandler) + }, + $_sidebarResizeHandler(e) { + if (e.propertyName === 'width') { + this.$_resizeHandler() + } + }, + $_initSidebarResizeEvent() { + this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] + this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) + }, + $_destroySidebarResizeEvent() { + this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) + } + } +} diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue new file mode 100644 index 0000000..ffce2f5 --- /dev/null +++ b/src/views/dashboard/index.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/views/login/index.vue b/src/views/login/index.vue new file mode 100644 index 0000000..8804e22 --- /dev/null +++ b/src/views/login/index.vue @@ -0,0 +1,232 @@ + + + + + + + diff --git a/src/views/system/menu.vue b/src/views/system/menu.vue new file mode 100644 index 0000000..70b8f5e --- /dev/null +++ b/src/views/system/menu.vue @@ -0,0 +1,218 @@ + + diff --git a/src/views/system/permission.vue b/src/views/system/permission.vue new file mode 100644 index 0000000..47341ec --- /dev/null +++ b/src/views/system/permission.vue @@ -0,0 +1,245 @@ + + + + + + diff --git a/src/views/system/role.vue b/src/views/system/role.vue new file mode 100644 index 0000000..16aba68 --- /dev/null +++ b/src/views/system/role.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/src/views/system/user.vue b/src/views/system/user.vue new file mode 100644 index 0000000..c19fd26 --- /dev/null +++ b/src/views/system/user.vue @@ -0,0 +1,294 @@ + + + + + diff --git a/tests/unit/.eslintrc.js b/tests/unit/.eslintrc.js new file mode 100644 index 0000000..958d51b --- /dev/null +++ b/tests/unit/.eslintrc.js @@ -0,0 +1,5 @@ +module.exports = { + env: { + jest: true + } +} diff --git a/tests/unit/components/Breadcrumb.spec.js b/tests/unit/components/Breadcrumb.spec.js new file mode 100644 index 0000000..1d94c8f --- /dev/null +++ b/tests/unit/components/Breadcrumb.spec.js @@ -0,0 +1,98 @@ +import { mount, createLocalVue } from '@vue/test-utils' +import VueRouter from 'vue-router' +import ElementUI from 'element-ui' +import Breadcrumb from '@/components/Breadcrumb/index.vue' + +const localVue = createLocalVue() +localVue.use(VueRouter) +localVue.use(ElementUI) + +const routes = [ + { + path: '/', + name: 'home', + children: [{ + path: 'dashboard', + name: 'dashboard' + }] + }, + { + path: '/menu', + name: 'menu', + children: [{ + path: 'menu1', + name: 'menu1', + meta: { title: 'menu1' }, + children: [{ + path: 'menu1-1', + name: 'menu1-1', + meta: { title: 'menu1-1' } + }, + { + path: 'menu1-2', + name: 'menu1-2', + redirect: 'noredirect', + meta: { title: 'menu1-2' }, + children: [{ + path: 'menu1-2-1', + name: 'menu1-2-1', + meta: { title: 'menu1-2-1' } + }, + { + path: 'menu1-2-2', + name: 'menu1-2-2' + }] + }] + }] + }] + +const router = new VueRouter({ + routes +}) + +describe('Breadcrumb.vue', () => { + const wrapper = mount(Breadcrumb, { + localVue, + router + }) + it('dashboard', () => { + router.push('/dashboard') + const len = wrapper.findAll('.el-breadcrumb__inner').length + expect(len).toBe(1) + }) + it('normal route', () => { + router.push('/menu/menu1') + const len = wrapper.findAll('.el-breadcrumb__inner').length + expect(len).toBe(2) + }) + it('nested route', () => { + router.push('/menu/menu1/menu1-2/menu1-2-1') + const len = wrapper.findAll('.el-breadcrumb__inner').length + expect(len).toBe(4) + }) + it('no meta.title', () => { + router.push('/menu/menu1/menu1-2/menu1-2-2') + const len = wrapper.findAll('.el-breadcrumb__inner').length + expect(len).toBe(3) + }) + // it('click link', () => { + // router.push('/menu/menu1/menu1-2/menu1-2-2') + // const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner') + // const second = breadcrumbArray.at(1) + // console.log(breadcrumbArray) + // const href = second.find('a').attributes().href + // expect(href).toBe('#/menu/menu1') + // }) + // it('noRedirect', () => { + // router.push('/menu/menu1/menu1-2/menu1-2-1') + // const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner') + // const redirectBreadcrumb = breadcrumbArray.at(2) + // expect(redirectBreadcrumb.contains('a')).toBe(false) + // }) + it('last breadcrumb', () => { + router.push('/menu/menu1/menu1-2/menu1-2-1') + const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner') + const redirectBreadcrumb = breadcrumbArray.at(3) + expect(redirectBreadcrumb.contains('a')).toBe(false) + }) +}) diff --git a/tests/unit/components/Hamburger.spec.js b/tests/unit/components/Hamburger.spec.js new file mode 100644 index 0000000..01ea303 --- /dev/null +++ b/tests/unit/components/Hamburger.spec.js @@ -0,0 +1,18 @@ +import { shallowMount } from '@vue/test-utils' +import Hamburger from '@/components/Hamburger/index.vue' +describe('Hamburger.vue', () => { + it('toggle click', () => { + const wrapper = shallowMount(Hamburger) + const mockFn = jest.fn() + wrapper.vm.$on('toggleClick', mockFn) + wrapper.find('.hamburger').trigger('click') + expect(mockFn).toBeCalled() + }) + it('prop isActive', () => { + const wrapper = shallowMount(Hamburger) + wrapper.setProps({ isActive: true }) + expect(wrapper.contains('.is-active')).toBe(true) + wrapper.setProps({ isActive: false }) + expect(wrapper.contains('.is-active')).toBe(false) + }) +}) diff --git a/tests/unit/components/SvgIcon.spec.js b/tests/unit/components/SvgIcon.spec.js new file mode 100644 index 0000000..31467a9 --- /dev/null +++ b/tests/unit/components/SvgIcon.spec.js @@ -0,0 +1,22 @@ +import { shallowMount } from '@vue/test-utils' +import SvgIcon from '@/components/SvgIcon/index.vue' +describe('SvgIcon.vue', () => { + it('iconClass', () => { + const wrapper = shallowMount(SvgIcon, { + propsData: { + iconClass: 'test' + } + }) + expect(wrapper.find('use').attributes().href).toBe('#icon-test') + }) + it('className', () => { + const wrapper = shallowMount(SvgIcon, { + propsData: { + iconClass: 'test' + } + }) + expect(wrapper.classes().length).toBe(1) + wrapper.setProps({ className: 'test' }) + expect(wrapper.classes().includes('test')).toBe(true) + }) +}) diff --git a/tests/unit/utils/formatTime.spec.js b/tests/unit/utils/formatTime.spec.js new file mode 100644 index 0000000..24e165b --- /dev/null +++ b/tests/unit/utils/formatTime.spec.js @@ -0,0 +1,30 @@ +import { formatTime } from '@/utils/index.js' + +describe('Utils:formatTime', () => { + const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01" + const retrofit = 5 * 1000 + + it('ten digits timestamp', () => { + expect(formatTime((d / 1000).toFixed(0))).toBe('7月13日17时54分') + }) + it('test now', () => { + expect(formatTime(+new Date() - 1)).toBe('刚刚') + }) + it('less two minute', () => { + expect(formatTime(+new Date() - 60 * 2 * 1000 + retrofit)).toBe('2分钟前') + }) + it('less two hour', () => { + expect(formatTime(+new Date() - 60 * 60 * 2 * 1000 + retrofit)).toBe('2小时前') + }) + it('less one day', () => { + expect(formatTime(+new Date() - 60 * 60 * 24 * 1 * 1000)).toBe('1天前') + }) + it('more than one day', () => { + expect(formatTime(d)).toBe('7月13日17时54分') + }) + it('format', () => { + expect(formatTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54') + expect(formatTime(d, '{y}-{m}-{d}')).toBe('2018-07-13') + expect(formatTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54') + }) +}) diff --git a/tests/unit/utils/param2Obj.spec.js b/tests/unit/utils/param2Obj.spec.js new file mode 100644 index 0000000..e106ed8 --- /dev/null +++ b/tests/unit/utils/param2Obj.spec.js @@ -0,0 +1,14 @@ +import { param2Obj } from '@/utils/index.js' +describe('Utils:param2Obj', () => { + const url = 'https://github.com/PanJiaChen/vue-element-admin?name=bill&age=29&sex=1&field=dGVzdA==&key=%E6%B5%8B%E8%AF%95' + + it('param2Obj test', () => { + expect(param2Obj(url)).toEqual({ + name: 'bill', + age: '29', + sex: '1', + field: window.btoa('test'), + key: '测试' + }) + }) +}) diff --git a/tests/unit/utils/parseTime.spec.js b/tests/unit/utils/parseTime.spec.js new file mode 100644 index 0000000..56045af --- /dev/null +++ b/tests/unit/utils/parseTime.spec.js @@ -0,0 +1,35 @@ +import { parseTime } from '@/utils/index.js' + +describe('Utils:parseTime', () => { + const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01" + it('timestamp', () => { + expect(parseTime(d)).toBe('2018-07-13 17:54:01') + }) + it('timestamp string', () => { + expect(parseTime((d + ''))).toBe('2018-07-13 17:54:01') + }) + it('ten digits timestamp', () => { + expect(parseTime((d / 1000).toFixed(0))).toBe('2018-07-13 17:54:01') + }) + it('new Date', () => { + expect(parseTime(new Date(d))).toBe('2018-07-13 17:54:01') + }) + it('format', () => { + expect(parseTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54') + expect(parseTime(d, '{y}-{m}-{d}')).toBe('2018-07-13') + expect(parseTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54') + }) + it('get the day of the week', () => { + expect(parseTime(d, '{a}')).toBe('五') // 星期五 + }) + it('get the day of the week', () => { + expect(parseTime(+d + 1000 * 60 * 60 * 24 * 2, '{a}')).toBe('日') // 星期日 + }) + it('empty argument', () => { + expect(parseTime()).toBeNull() + }) + + it('null', () => { + expect(parseTime(null)).toBeNull() + }) +}) diff --git a/tests/unit/utils/validate.spec.js b/tests/unit/utils/validate.spec.js new file mode 100644 index 0000000..f774905 --- /dev/null +++ b/tests/unit/utils/validate.spec.js @@ -0,0 +1,17 @@ +import { validUsername, isExternal } from '@/utils/validate.js' + +describe('Utils:validate', () => { + it('validUsername', () => { + expect(validUsername('admin')).toBe(true) + expect(validUsername('editor')).toBe(true) + expect(validUsername('xxxx')).toBe(false) + }) + it('isExternal', () => { + expect(isExternal('https://github.com/PanJiaChen/vue-element-admin')).toBe(true) + expect(isExternal('http://github.com/PanJiaChen/vue-element-admin')).toBe(true) + expect(isExternal('github.com/PanJiaChen/vue-element-admin')).toBe(false) + expect(isExternal('/dashboard')).toBe(false) + expect(isExternal('./dashboard')).toBe(false) + expect(isExternal('dashboard')).toBe(false) + }) +}) diff --git a/vue.config.js b/vue.config.js new file mode 100644 index 0000000..e70f17d --- /dev/null +++ b/vue.config.js @@ -0,0 +1,148 @@ +'use strict' +const path = require('path') +const defaultSettings = require('./src/settings.js') + +function resolve(dir) { + return path.join(__dirname, dir) +} + +const name = defaultSettings.title || '乐益预约系统' // page title + +// If your port is set to 80, +// use administrator privileges to execute the command line. +// For example, Mac: sudo npm run +// You can change the port by the following methods: +// port = 9528 npm run dev OR npm run dev --port = 9528 +const port = process.env.port || process.env.npm_config_port || 8002 // dev port + +// All configuration item explanations can be find in https://cli.vuejs.org/config/ +module.exports = { + /** + * You will need to set publicPath if you plan to deploy your site under a sub path, + * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/, + * then publicPath should be set to "/bar/". + * In most cases please use '/' !!! + * Detail: https://cli.vuejs.org/config/#publicpath + */ + publicPath: '/', + outputDir: 'dist', + assetsDir: 'static', + css: { + loaderOptions: { // 向 CSS 相关的 loader 传递选项 + less: { + javascriptEnabled: true + } + } + }, + lintOnSave: process.env.NODE_ENV === 'development', + productionSourceMap: false, + devServer: { + port: port, + open: true, + overlay: { + warnings: false, + errors: true + }, + //before: require('./mock/mock-server.js'), + proxy: { + [process.env.VUE_APP_BASE_API]: { + target: 'http://dangxingjiaoyujidi.langye.net/', + changeOrigin: true, //配置跨域 + pathRewrite: { + ['^' + process.env.VUE_APP_BASE_API]: '' + } + } + } + }, + configureWebpack: { + // provide the app's title in webpack's name field, so that + // it can be accessed in index.html to inject the correct title. + name: name, + resolve: { + alias: { + '@': resolve('src') + } + } + }, + chainWebpack(config) { + // it can improve the speed of the first screen, it is recommended to turn on preload + config.plugin('preload').tap(() => [{ + rel: 'preload', + // to ignore runtime.js + // https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/cli-service/lib/config/app.js#L171 + fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/], + include: 'initial' + }]) + + // when there are many pages, it will cause too many meaningless requests + config.plugins.delete('prefetch') + + // set svg-sprite-loader + config.module + .rule('svg') + .exclude.add(resolve('src/icons')) + .end() + config.module + .rule('icons') + .test(/\.svg$/) + .include.add(resolve('src/icons')) + .end() + .use('svg-sprite-loader') + .loader('svg-sprite-loader') + .options({ + symbolId: 'icon-[name]' + }) + .end() + + // set preserveWhitespace + config.module + .rule('vue') + .use('vue-loader') + .loader('vue-loader') + .tap(options => { + options.compilerOptions.preserveWhitespace = true + return options + }) + .end() + + config + .when(process.env.NODE_ENV !== 'development', + config => { + config + .plugin('ScriptExtHtmlWebpackPlugin') + .after('html') + .use('script-ext-html-webpack-plugin', [{ + // `runtime` must same as runtimeChunk name. default is `runtime` + inline: /runtime\..*\.js$/ + }]) + .end() + config + .optimization.splitChunks({ + chunks: 'all', + cacheGroups: { + libs: { + name: 'chunk-libs', + test: /[\\/]node_modules[\\/]/, + priority: 10, + chunks: 'initial' // only package third parties that are initially dependent + }, + elementUI: { + name: 'chunk-elementUI', // split elementUI into a single package + priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app + test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm + }, + commons: { + name: 'chunk-commons', + test: resolve('src/components'), // can customize your rules + minChunks: 3, // minimum common number + priority: 5, + reuseExistingChunk: true + } + } + }) + // https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk + config.optimization.runtimeChunk('single') + } + ) + } +}