From 4780771d0db9fe8096b6dbac831a57b1aa8de5d9 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: Mon, 25 Apr 2022 16:03:46 +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 -> 16958 bytes public/index.html | 17 + public/logo-blue.png | Bin 0 -> 12523 bytes public/res/template-box.xlsx | Bin 0 -> 9009 bytes public/res/template-tool.xlsx | Bin 0 -> 9243 bytes public/res/template-user.xlsx | Bin 0 -> 8976 bytes 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/tool/list.js | 47 + src/api/tool/log.js | 21 + src/api/toolbox/exception.js | 21 + src/api/toolbox/list.js | 77 + src/api/toolbox/log.js | 21 + src/api/toolbox/user.js | 55 + 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/banshou.png | Bin 0 -> 5950 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/lantou.png | Bin 0 -> 4293 bytes src/assets/logo-blue.png | Bin 0 -> 5617 bytes src/assets/logo-mini-blue.png | Bin 0 -> 48385 bytes src/assets/logo-mini.png | Bin 0 -> 8205 bytes src/assets/logo.png | Bin 0 -> 11180 bytes src/assets/toolbox.png | Bin 0 -> 3248 bytes src/assets/toolbox_on.png | Bin 0 -> 3237 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 | 88 ++ 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 | 599 ++++++++ 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 | 247 ++++ src/views/login/index.vue | 232 +++ src/views/system/menu.vue | 223 +++ src/views/system/permission.vue | 245 ++++ src/views/system/role.vue | 159 ++ src/views/system/user.vue | 294 ++++ src/views/tool/list.vue | 662 +++++++++ src/views/tool/log.vue | 205 +++ src/views/toolbox/exception.vue | 227 +++ src/views/toolbox/list.vue | 552 +++++++ src/views/toolbox/log.vue | 189 +++ src/views/toolbox/user.vue | 502 +++++++ src/views/toolbox/view.vue | 260 ++++ src/views/toolbox/warning.vue | 256 ++++ 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 ++ 183 files changed, 12234 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 public/logo-blue.png create mode 100644 public/res/template-box.xlsx create mode 100644 public/res/template-tool.xlsx create mode 100644 public/res/template-user.xlsx 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/tool/list.js create mode 100644 src/api/tool/log.js create mode 100644 src/api/toolbox/exception.js create mode 100644 src/api/toolbox/list.js create mode 100644 src/api/toolbox/log.js create mode 100644 src/api/toolbox/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/banshou.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/lantou.png create mode 100644 src/assets/logo-blue.png create mode 100644 src/assets/logo-mini-blue.png create mode 100644 src/assets/logo-mini.png create mode 100644 src/assets/logo.png create mode 100644 src/assets/toolbox.png create mode 100644 src/assets/toolbox_on.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 src/views/tool/list.vue create mode 100644 src/views/tool/log.vue create mode 100644 src/views/toolbox/exception.vue create mode 100644 src/views/toolbox/list.vue create mode 100644 src/views/toolbox/log.vue create mode 100644 src/views/toolbox/user.vue create mode 100644 src/views/toolbox/view.vue create mode 100644 src/views/toolbox/warning.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..64d817f257d09f6c42f828c59c54ed7d20cb44db GIT binary patch literal 16958 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 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/public/logo-blue.png b/public/logo-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..e0049c3f39f186155fc2f89e6883f52eb32a5303 GIT binary patch literal 12523 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 literal 0 HcmV?d00001 diff --git a/public/res/template-box.xlsx b/public/res/template-box.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5dd1686381a6a1401e68965a8b163bd373de6f2c GIT binary patch literal 9009 zcmaJ{1z40_)217#r39oq1Zj}&?r!N^N*Za9E-7h{1_4Rw4gu-zSW;j?I)BjbeSP(N z|L&TYj#XqFvlrEhSJ{#_W6dL4N^PdnVzB%^&G6oT9ML^|ZS z!r3A6(?weD*6MdOIIl15j$nUB_nY@|uHpl_mJjG+{1aVcprh#{ypeJ33LVUVo?6ywIoeaWTH_ZY*-wc#%4F)succ&5OR=Iq+zFC*I4~r=HK{HbcnJ_}ewr zcJXtd{h>y3-btIYo-}C%VgWRJYc|}AjDn*KM_)EKONn-iS{j;uL5ff@gjN_!47CbA z`>KXwOn;_m&kKIC->qkfbZ|3iQopvAZthDi+*1$HOX*6;*;cXpc01x-j)*!j6%bO{ zurC{8pCKPQ%%|yztkJ!VMM6fE;(_L6%2$VL8(R5STl|`n_bm~s_mS|(ndz~A#TO+sarNuiNrTl#e zUe*zxWoB7{KFT1dv_18zj<&0)^G5?c5(*V{@C9!e82!^bis4!TeL)1 z`{1fZ-E&94B>|iU9GCZWpN(YFc{4XjHxe)Fyx`K0<8Z;b zQoH$5lK$JIWlFMZNO>jB;eAo)+M`#={Dl0Zc!{P+es*eHw?`mai_1PQ_AeQkL8!a^ z=C|O@CPrE*8f`Jl>L?EDPeVt6PsH9cS|Gr&8u`rh|Ozbys^Gf35T z%qE_rXl|{Fy8|~5Cd)jA&@5P`EQ1V9M&8=q zZ+c!SB&Zv6JNS|dS|7GLt3q4i^895o=s7`o=6P~ex*h{c8Kyj>9(kIS7-(BpNN=qr z589COGh`dmNs2Sv-{(7|YByL;7UKaBB%Z0wSE)8FV2F*F+49&wZyMq;Ruo(GkQjL> z#OZcQD`;=W@P>7+uYE~r0~~uObLSpV+AWFlT>gWC58vmzx{cY9L&IL8SnOQO^fsPzl~^Ysmad6g8{|nX4b+ z8+F){Z4HlXSYPo?FiJ9J^$3!(z95$y59N4#bXwfYxoVrjHrMqLv@MJbSeBQu@$boM zrR`;2Ee1>xP4zUa&vZM$C@+Kki<7e|YW0P-?|R|!BGF3qKJ=aP#*$zcgT?y_Ux(B< z88nbiv8Q{u*GlGVc(`y_w-dl0U;{*^M3+69!m{>?_?!GxECK`12YL)VaV>1;Ue$@9 zL|2xXv8FYoLc&?%!WsKxT-|W z7m2;BosnluG!EA@&z89ozFI^_)}QcP_8UG1BV*O?a6k`5u2VkgnDxTov#u7a;GA@6 zrINUcd`n*PL1l#S#raS@k|*qb_*#wSrXT&qM)E!)|22TB%XJH{_pa%>y>K(FWSX=- zcM1rUJ(0-0AD+E|{{N%s@!)-kB4-OzThl)dURk2Vk$G4M2on6Cx#@4QAHqLEV_!=S zNWh8SjJxfl`K>wDWRLs>8GJ4O8kGyCsB{=%k)Bl&hU;e%THXfi{z^f=9LrG|za<$A?e z&*Y(T;@EaCTqOdcnXWTpXizasX%8-(7;Z`$iQm}6?)TwQ&p=c$K-Se!VPP8jxUSYJw7b#;Jw>1) zrYmqGB9OO6BHhf9`Rp2D(Hnvi?g5u@&h1%_whD*8Xh`f;~2u`QdF6$nt zv4bSdZim~QjfuK!n&5O(f5!m2P`CF~=hm!M>uMYV08=rR7QRzexx949j#LWyMS#ca zT)TPyeGumju-swEy3hx?T9S{Kwa7V&d@SGbkn_XBUi z7K!2q{g;DXi$dEo?5?Q>iPDAn=xx-P~xqfK&3bV`9L41A{%ax5;T2mGY!y3vwt zDTY`(i_}Z}WM5+<`ex`pIR;`{!QG(u&xkp4ZTW@nAtR)6|*hZh$nvy)MPMJvzBrWWu!%TADNe`dPbr!!VA2V^$hf zo~d6UHS0kih<&j1is z0UFO>?=kK+3%6=m-20S|q@EqmPlNIR0n#O%hHuuUwhm3!k35BGh`w-lhX`l3!Lnu9 zLj-)0H{fw_CmMKlQRwnQ)^L?9syeba{DB(a>&wsV1tHhIxbaH4G2paW>LoYB08~vvgS8W{4uSot>}D7F~DI3 zi4v?7VD(RcPo}qJZ27`2L(~2Z!N(4wRe0D$-GJ|eAM=_%tGYO%a*7dl|W;coT{7S`&cv*ZAu1^&;k)jVs$&3)2gv@QRmp>-9o) zX35jW+gE~k1ZK+A8ByeLwxo$HZ##o7k)a6$Ada@%8yD~s$Z!!*=WgMDuTxLRxh!QL z%B)y<2nf`lM~0KLyN#*SV}UfOy9b<~!oKG>yoYW#yk;IuycnUcN$dWEh_W3F)$a>A zkKTuAij^f9{Q=5T%+JPhvrGgIWhb$Wrh{vZ^qegcIE|$Ket<3uM#w`dAd@3#tiT9n$&6`9n~<%2!z)h zT+q_qc|ui#50!OmNYsxPAGT?_a#{h@%ngucd90_bU} zw9?`gQ%5tW&if$eI%|=eqAn4>X%{|PUuLN1^b_Wb+4%Y_{I`n(ThZHU*LuSt+sKIQ z>1nx@xO&{xgwy2I^w|;Md#2BHiRyagO7f~1b#?QJsJZ%OC8s>x`?~KHsnAn!Ls=u} zZa@@KuW)nl!y9L3zS2a|)etJ05n#G7O`E>! z!R$JI$I(#~{1PXKEY!2JZ=*KCP0KkA`AX^wFoEdErGI_7YBst9bI|8+beEkGgEqdYsnX4} zHnq-j*+=hMy#Sl^h*dpdixFcslo!)j*Wuj)8EHjuO^!^ov8Ac($6vJ6C+bLBadcXY zbtBWu)C=%*l%8M{h+s?=1_M$>Q1;|=t5i^?Xbi$5OAxFneAF~uwP9;W+>^p+ym(HD zatpz<7OKztgbF2erB*Eg@!$Ifu|a7@&SAtdVKoVpb;4$xh5Idr8)H&bvevG8Bkj=ZMYy(g7Wt-k=Ik{?Y1hsH(wd|J-4(S9 zt`d#4h+`e|#Ws?G*Dxn`uwV**CI)khv$D~c{uJV?*Dt(B2|Q}Drzd!9X}>2D2`3IU z;guU^GTk{?P}Z@~!yNUg;nNoC6lt(x`raF#n}6ur?MP1Nq8cmHm1YHQDP#KO$yk1x zLu!#g#Mb%hp43ef8V_o)Pcl~%q2ZG5*x2-$st^Wzw|A-?3P;DQ4_td;v!L7`9?_{~ zD+-vk5rx5jxLb0FgK)xJhpYE>K4jdvwb9kfOJA%)FwS-I!+y$=IfIQ6saL`$3I_4q zRD2$-DdRJ@;Hi+c@$j1@4audQjDaNrcq3s|9U!O-~YQOLL zwJjD$;saUQaOv7qasDk*h*iUvZn{vocBkz=&lZTt*KwR0c2RGw+&>>6Z-3y@=jQ77 z4yRX#Ry0=KJRxfnU-f;JctQpuTO z=^o|QO1quGelsu(<0VMx&Z=uDj8tF6kil@x4>R~=FbAI|Vw0BVnDz~~u`%rP){yWc z3!;pdq|SGyZaen&hB`%q&v4ZhTKpteH?!)=+3o$s|T z-<;W8ZP-#cxth#^85G}Ae>+L0EYxVFER$M)&YyYr{cb~{cfBBbnBT+aYF>e|Z&J}= zjFd{&%DJ_V0rxcqE=?jSZk#kCZn6lnGloU`Ht8CR_XV>-(|7V0Z?4uxFWRLTVkdS) z$z*3>Fi*ui0_qik%K4Z~PZ!ftXFYm?s`cN>T+p1Bp542@cyl(O$z(}`h178Brd|rc zL>04uEZ4{0Fzb?dH))_B;q!g3UtlTHG>(IpG>5m|+!7}k`GOM(_pMu(Sgt~}nHjXb zgv~|8cu))?y5z|U`IBerfD4~&ZW6w+0JN7gvrf-A7`%3F*xPZ=@DXNY6$HFqUnNUz zilDu@6&55DBvDF_=1CSq#7kSeo*Xb&NRj3LW|$%&_=$NIYwKvW0NL2k>o_eGM2@Cj zJxrd6FUuKELDC6F4Vl{C8by76hbxoM>xvl%o*kdHAo6kf@^LE{sg^oa)XNKaJRN`3 zDG)`xkm&`6%>{`dsu#die+VY>`6_7^mR#{oj-QMFdV5$I3YwU!LYyq_`^I|Jx+~Rr zhTv#s)4eNIOmxb7#oi#uwzz1!d1*sb9~)DgDM?@=xw8@rDH3sFI_3K@y36?8;p85# zZwN%6Dh63+omq9s2<)Vhm$HrEy0 zd)uFFcW<0iM?exQbx@$jz5;j=wy#wRP6tu368ovt3p1LqdSCTlpdEr)a)!E+m}zj; z)j34l`+PxrYc{v%%OtWXATM|SJQP0=axT_J5WC*`fQnq7xT2PpcL0a4iXOtEFd8#o zo5^546^tX3VIP1PwW0$vk{la^q}3q!p`!!cloA=s(dXG{n_~^c_n_JreSKefy2Nom zg_=~MkD8Oo*;q>-B9Ws}t0n6pCzxYnS9jZxY{B9MTJmX}W;?Z4S0KV##A{(yp9$eU zgUaSj)&ipWjdH>-#u6=<8PtL{F5pl6o`98{CkdwXII|e$935|X+$|^>?l+CV4QOZ* zZH;WlrL{MkU)6JKnvDyshj!JS`>AON!NbfkHho%T|qV3b&nF zr#Y%UGWHq+44dJHJL&`cCRw+9D$CR?yIW`BWItYW=z_$0#J?;{f2}b+Ayv)nfVG0Q zsKmg|yiHu#oc_J+EI0^u;dy9{PCi_ZjKD(+!pXwO(bPo6+0oL@{73a^`_TXI6hsd` z^gl#Dv*XywR+SnHAUh%Rzk}0=vVI4G-SV3IIcq zLtTSSxbWTNtDFG1yaTwv4|9UGQYO7(T&y8c=BaF+9J(NfsQ1mDidX)3-WtCmBC zF510FHoGqtJg$7bkvn8yXwmh8&Fbwe<6&ToYcB(m=wa!nJRvI!a4!>Pg5Dd>)mxI` z%hLq642Drl`ev=1o%+rK#%E95d2b|!moqivD!9J7UL$#|y`gC!{_Y@fc;*6N_a+)7 zey%lUro;fpa^2KdFmdW%iX-!hti+vCJlDn?rGq7?{E@+{R;sX*1 zADnMI7u1ajxo3x?GMAmEQsddbA&X2bVKb+jw2erWSMvhEM|WOM$P84g@0gd2AeZrs zRP+tXc!{Gjmx%E(>NN$^m8;fXetBB<7Hc^xR~{6A9csu0o`C_-O}*`ZnqfX0r;|+- zfl>k{eqx}ey_TC)CYB@~=POPTM{K<)N;93nQBO?7GRjuo5qA&|X(lSGAWf|bJBV=g zm-j9tA)mr#(%FzJTFPjHse&H`ZR@+3yhonvCse;DM}p~4JvCd= zv_263f2-}G%?x4SXlnCkAKH`4rRo0RyXA*oH1gjvOplUfal_JG%;-Ijdwa7*&J`PD z*7-TvH#rk;-(=bQ5h|=Wt^Jl}Ati>12KeZd%gxkfFOx=sMG}3M{HP}X*Gm3^z&@82 zC9s#9=Ayr3Y4aqsyQ+N$OylnHtLwmk&6n@ym?&cPyp%^?gz(bFTaNCiDhg)uvWpdP z3mB6Ja5UQ~+I=||@5y|oDEG2^iSDguBb)1(0s514Bx$t~_xVW!BK8;Q07f zM|gTcy5}&UIbhV=VJwnGJYByhYr4!6!kFI2;uXA%PHJ6dU$$13 zbCNDfW?<_f^}zh%=fep!Dl21VMH6ls6s9YV3AmOghiK2U-r9m|!y!>4BrE6-4{M2M zv=U_|s-bBe5KXd-p6S<6O&bDf!=d4JR9Q|F#qzb$rig4KJ>s{9d2UaA9aoFamIUXn zsTD&UVm9uZjn!(NEazMwuz(W~*;B%^$&JQ}QD)vSZMuw}VMHFk$6K8E~ zCy5#U;Ij-`LntA?h*T+_{ma(-n`RVodh0Ms(TSzWQiD@X$cOk?EHxvJPdd)PP7YM* zaD!*pf&MfKzOrK0f^YLLCYmahqJ3!}^$C)`;uw-}NY=ZWY?S${8@eNtSsT!^nU|?q zW<@zg8&8M z#@Rt3VR-Xt>=fMHq96{Rki2t|?-sDt2|{ZV20YMvS#bXSYei=@?dcb!{jV!qjKXu? z#XC!qJQ<%&k6pW0((q3 zKgT0;zVQ$ae?`piM*mDfk2*h%A`twg^CM*bm$Ao~{5c+tJ&u1c`oG)zlhc0`{%Mc; zpKAYM`2U3HPtN+6cF@C?{@dtZ4ECSue{!zB)L|Yt#b4@wGqC^bp&wbupX2eNSz-Re zNj^UAzq{mjl$Z(sk)Zxu=%1PF(auklH2$gfUwQ4%dH$@Te$7Mvz`WN-|`wsb&eEMZE>z``BsHi`e{AW4yYl7$pKI>u0 z|Ag&-E&7p0{y82!toqZ#zmdwnul!G1`BC?$*L?p=_ZP{mC{g#rH{2Oxgb F`#)+rig^G4 literal 0 HcmV?d00001 diff --git a/public/res/template-tool.xlsx b/public/res/template-tool.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..96334d6b83d243292f703cf3df96f47d5fba3a5f GIT binary patch literal 9243 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 literal 0 HcmV?d00001 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/tool/list.js b/src/api/tool/list.js new file mode 100644 index 0000000..20208ef --- /dev/null +++ b/src/api/tool/list.js @@ -0,0 +1,47 @@ +import request from '@/utils/request' + + + +export function listTool(params) { + return request({ + url: '/api/admin/tool', + method: 'get', + params: params + }) +} + + +export function save(data) { + return request({ + url: '/api/admin/tool/save', + method: 'post', + data + }) +} + + +export function del(data) { + return request({ + url: '/api/admin/tool/delete', + method: 'post', + data + }) +} + +export function doimport(data) { + return request({ + url: '/api/admin/tool/do-import', + method: 'post', + data + }) +} + + + +export function previewimport(params) { + return request({ + url: '/api/admin/tool/preview-import', + method: 'get', + params: params + }) +} diff --git a/src/api/tool/log.js b/src/api/tool/log.js new file mode 100644 index 0000000..61c349c --- /dev/null +++ b/src/api/tool/log.js @@ -0,0 +1,21 @@ +import request from '@/utils/request' + + + +export function listrecord(params) { + return request({ + url: '/api/admin/record', + method: 'get', + params: params + }) +} + + + +export function listClientTools(params) { + return request({ + url: '/api/admin/record/get-client-tools/' + params.client_id, + method: 'get', + params: params + }) +} diff --git a/src/api/toolbox/exception.js b/src/api/toolbox/exception.js new file mode 100644 index 0000000..aeaeab7 --- /dev/null +++ b/src/api/toolbox/exception.js @@ -0,0 +1,21 @@ +import request from '@/utils/request' + + + +export function listnoReturn(params) { + return request({ + url: '/api/admin/exception/no-return', + method: 'get', + params: params + }) +} + + + +export function listMaintain(params) { + return request({ + url: '/api/admin/exception/maintain', + method: 'get', + params: params + }) +} diff --git a/src/api/toolbox/list.js b/src/api/toolbox/list.js new file mode 100644 index 0000000..84e2901 --- /dev/null +++ b/src/api/toolbox/list.js @@ -0,0 +1,77 @@ +import request from '@/utils/request' + + +//工具箱数据同步 +export function syncData(id) { + return request({ + url: '/api/admin/client/sync-data/' + id, + method: 'get' + }) +} + +//工具箱数据库结构比对 +export function checkStructure(id) { + return request({ + url: '/api/admin/client/check-structure/' + id, + method: 'get' + }) +} + +//工具箱数据库连接测试 +export function testConnection(id) { + return request({ + url: '/api/admin/client/test-connection/' + id, + method: 'get' + }) +} + + +export function listToolbox(params) { + return request({ + url: '/api/admin/client', + method: 'get', + params: params + }) +} +export function listToolboxtool(params, id) { + return request({ + url: '/api/admin/client/get-tools/' + id, + method: 'get', + params: params + }) +} + +export function save(data) { + return request({ + url: '/api/admin/client/save', + method: 'post', + data + }) +} + + +export function del(data) { + return request({ + url: '/api/admin/client/delete', + method: 'post', + data + }) +} + +export function doimport(data) { + return request({ + url: '/api/admin/client/do-import', + method: 'post', + data + }) +} + + + +export function previewimport(params) { + return request({ + url: '/api/admin/client/preview-import', + method: 'get', + params: params + }) +} diff --git a/src/api/toolbox/log.js b/src/api/toolbox/log.js new file mode 100644 index 0000000..0816ac8 --- /dev/null +++ b/src/api/toolbox/log.js @@ -0,0 +1,21 @@ +import request from '@/utils/request' + + + +export function listclientTouch(params) { + return request({ + url: '/api/admin/client-touch', + method: 'get', + params: params + }) +} + + + +export function listTouchTypes(params) { + return request({ + url: '/api/admin/client-touch/get-types', + method: 'get', + params: params + }) +} diff --git a/src/api/toolbox/user.js b/src/api/toolbox/user.js new file mode 100644 index 0000000..5a2cf39 --- /dev/null +++ b/src/api/toolbox/user.js @@ -0,0 +1,55 @@ +import request from '@/utils/request' + + + +export function listUser(params) { + return request({ + url: '/api/admin/user', + method: 'get', + params: params + }) +} + + +export function save(data) { + return request({ + url: '/api/admin/user/save', + method: 'post', + data + }) +} + +export function setPermission(data, id) { + return request({ + url: '/api/admin/user/' + id + '/set-permissions', + method: 'post', + data + }) +} + + + + +export function doimport(data) { + return request({ + url: '/api/admin/user/do-import', + method: 'post', + data + }) +} + +export function del(data) { + return request({ + url: '/api/admin/user/delete', + method: 'post', + data + }) +} + +export function previewimport(params) { + return request({ + url: '/api/admin/user/preview-import', + method: 'get', + params: params + }) +} 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/banshou.png b/src/assets/banshou.png new file mode 100644 index 0000000000000000000000000000000000000000..0d978c186f24772d5f83f875777e6c66d5ad242d GIT binary patch literal 5950 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 Nd0$tv@}70X{{YtoDnI}L 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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 WW=y3NU8(mHG$sb-s7gKO$o~Tcs?Q++ literal 0 HcmV?d00001 diff --git a/src/assets/logo-blue.png b/src/assets/logo-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..675208098c7801b073acc08bf6f9fc1a5bb6fb6a GIT binary patch literal 5617 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πtzYvC|WunDk(`CCn?BAxNz17S#1 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 Y1>PQOj3KvD!my1NGH29Z)w8io#Gh@l&ap&OL$ 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 literal 0 HcmV?d00001 diff --git a/src/assets/toolbox.png b/src/assets/toolbox.png new file mode 100644 index 0000000000000000000000000000000000000000..d84ac15b8e63032b4181269031c4fdc49da0a394 GIT binary patch literal 3248 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 buo?bls#uhfZi+MGT|rPJq64AA`VjIP6)=(9 literal 0 HcmV?d00001 diff --git a/src/assets/toolbox_on.png b/src/assets/toolbox_on.png new file mode 100644 index 0000000000000000000000000000000000000000..d9839ab85b17f8855edf036fed15878f899c0bb6 GIT binary patch literal 3237 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 + + + + {{ 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..96a7ba7 --- /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..77c1742 --- /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..603ff92 --- /dev/null +++ b/src/layout/components/Sidebar/Logo.vue @@ -0,0 +1,88 @@ + + + + + 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..4b997ba --- /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..3fbc7c0 --- /dev/null +++ b/src/styles/element-variables.scss @@ -0,0 +1,7 @@ +/* 改变主题色变量 */ +$--color-primary: #122583; + +/* 改变 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..581971c --- /dev/null +++ b/src/styles/iconfont.css @@ -0,0 +1,599 @@ +@font-face { + font-family: 'iconfont'; /* Project id 3289311 */ + src: url('//at.alicdn.com/t/font_3289311_1kjben9l2ui.woff2?t=1650868484740') format('woff2'), + url('//at.alicdn.com/t/font_3289311_1kjben9l2ui.woff?t=1650868484740') format('woff'), + url('//at.alicdn.com/t/font_3289311_1kjben9l2ui.ttf?t=1650868484740') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-tongbu:before { + content: "\e694"; +} + +.icon-add:before { + content: "\e605"; +} + +.icon-arrow-down:before { + content: "\e606"; +} + +.icon-archive:before { + content: "\e607"; +} + +.icon-arrow-left:before { + content: "\e608"; +} + +.icon-zoom-out:before { + content: "\e609"; +} + +.icon-arrow-right:before { + content: "\e60a"; +} + +.icon-arrow-left-up:before { + content: "\e60b"; +} + +.icon-arrow-right-down:before { + content: "\e60c"; +} + +.icon-arrow-up:before { + content: "\e60d"; +} + +.icon-arrow-right-up:before { + content: "\e60e"; +} + +.icon-backspace:before { + content: "\e60f"; +} + +.icon-bar-chart:before { + content: "\e610"; +} + +.icon-bar-chart-alt:before { + content: "\e613"; +} + +.icon-caret-left:before { + content: "\e614"; +} + +.icon-calendar:before { + content: "\e615"; +} + +.icon-caret-right:before { + content: "\e616"; +} + +.icon-chevron-double-left:before { + content: "\e617"; +} + +.icon-caret-down:before { + content: "\e618"; +} + +.icon-chevron-double-down:before { + content: "\e619"; +} + +.icon-book:before { + content: "\e61a"; +} + +.icon-arrow-left-down:before { + content: "\e61b"; +} + +.icon-bookmark:before { + content: "\e61c"; +} + +.icon-circle-add:before { + content: "\e61d"; +} + +.icon-circle:before { + content: "\e61e"; +} + +.icon-chevron-up:before { + content: "\e61f"; +} + +.icon-caret-up:before { + content: "\e620"; +} + +.icon-check:before { + content: "\e621"; +} + +.icon-camera:before { + content: "\e622"; +} + +.icon-circle-arrow-up:before { + content: "\e623"; +} + +.icon-circle-arrow-right:before { + content: "\e624"; +} + +.icon-circle-arrow-left:before { + content: "\e625"; +} + +.icon-chevron-double-up:before { + content: "\e626"; +} + +.icon-circle-arrow-down:before { + content: "\e627"; +} + +.icon-chevron-down:before { + content: "\e628"; +} + +.icon-circle-error:before { + content: "\e629"; +} + +.icon-call:before { + content: "\e62a"; +} + +.icon-circle-warning:before { + content: "\e62b"; +} + +.icon-clock:before { + content: "\e62c"; +} + +.icon-cloud:before { + content: "\e62d"; +} + +.icon-clipboard:before { + content: "\e62e"; +} + +.icon-circle-remove:before { + content: "\e62f"; +} + +.icon-circle-help:before { + content: "\e630"; +} + +.icon-cloud-upload:before { + content: "\e631"; +} + +.icon-computer:before { + content: "\e632"; +} + +.icon-circle-information:before { + content: "\e633"; +} + +.icon-close:before { + content: "\e634"; +} + +.icon-document-check:before { + content: "\e635"; +} + +.icon-document-download:before { + content: "\e638"; +} + +.icon-credit-card:before { + content: "\e639"; +} + +.icon-document:before { + content: "\e63a"; +} + +.icon-drag:before { + content: "\e63b"; +} + +.icon-clipboard-check:before { + content: "\e63c"; +} + +.icon-email:before { + content: "\e63d"; +} + +.icon-delete-alt:before { + content: "\e63e"; +} + +.icon-chevron-double-right:before { + content: "\e63f"; +} + +.icon-chevron-left:before { + content: "\e640"; +} + +.icon-chevron-right:before { + content: "\e641"; +} + +.icon-external-link:before { + content: "\e642"; +} + +.icon-eye:before { + content: "\e644"; +} + +.icon-filter-alt:before { + content: "\e645"; +} + +.icon-cloud-download:before { + content: "\e646"; +} + +.icon-circle-check:before { + content: "\e647"; +} + +.icon-filter:before { + content: "\e648"; +} + +.icon-folder-check:before { + content: "\e649"; +} + +.icon-document-remove:before { + content: "\e64a"; +} + +.icon-folder:before { + content: "\e64b"; +} + +.icon-edit-alt:before { + content: "\e64c"; +} + +.icon-expand:before { + content: "\e64d"; +} + +.icon-enter:before { + content: "\e64e"; +} + +.icon-copy:before { + content: "\e64f"; +} + +.icon-laptop:before { + content: "\e650"; +} + +.icon-document-empty:before { + content: "\e651"; +} + +.icon-heart:before { + content: "\e652"; +} + +.icon-folder-download:before { + content: "\e653"; +} + +.icon-folder-add:before { + content: "\e654"; +} + +.icon-image:before { + content: "\e655"; +} + +.icon-link:before { + content: "\e656"; +} + +.icon-home:before { + content: "\e657"; +} + +.icon-location:before { + content: "\e658"; +} + +.icon-inbox:before { + content: "\e659"; +} + +.icon-megaphone:before { + content: "\e65a"; +} + +.icon-menu:before { + content: "\e65b"; +} + +.icon-folder-remove:before { + content: "\e65c"; +} + +.icon-eye-off:before { + content: "\e65d"; +} + +.icon-moon:before { + content: "\e65e"; +} + +.icon-mobile:before { + content: "\e65f"; +} + +.icon-lock:before { + content: "\e660"; +} + +.icon-list:before { + content: "\e661"; +} + +.icon-log-out:before { + content: "\e662"; +} + +.icon-message-alt:before { + content: "\e663"; +} + +.icon-notification-off:before { + content: "\e664"; +} + +.icon-options-horizontal:before { + content: "\e665"; +} + +.icon-percentage:before { + content: "\e666"; +} + +.icon-next:before { + content: "\e668"; +} + +.icon-pin:before { + content: "\e669"; +} + +.icon-favorite:before { + content: "\e66a"; +} + +.icon-remove:before { + content: "\e66b"; +} + +.icon-link-alt:before { + content: "\e66c"; +} + +.icon-refresh:before { + content: "\e66d"; +} + +.icon-play:before { + content: "\e66e"; +} + +.icon-search:before { + content: "\e66f"; +} + +.icon-send:before { + content: "\e670"; +} + +.icon-settings:before { + content: "\e671"; +} + +.icon-notification:before { + content: "\e672"; +} + +.icon-select:before { + content: "\e673"; +} + +.icon-message:before { + content: "\e674"; +} + +.icon-options-vertical:before { + content: "\e675"; +} + +.icon-shopping-cart:before { + content: "\e676"; +} + +.icon-shopping-cart-add:before { + content: "\e677"; +} + +.icon-grid:before { + content: "\e678"; +} + +.icon-stop:before { + content: "\e679"; +} + +.icon-speakers:before { + content: "\e67a"; +} + +.icon-previous:before { + content: "\e67b"; +} + +.icon-table:before { + content: "\e67c"; +} + +.icon-repeat:before { + content: "\e67d"; +} + +.icon-switch:before { + content: "\e67e"; +} + +.icon-map:before { + content: "\e67f"; +} + +.icon-undo:before { + content: "\e680"; +} + +.icon-user:before { + content: "\e681"; +} + +.icon-unlock:before { + content: "\e682"; +} + +.icon-tablet:before { + content: "\e683"; +} + +.icon-share:before { + content: "\e684"; +} + +.icon-user-remove:before { + content: "\e685"; +} + +.icon-user-add:before { + content: "\e686"; +} + +.icon-sunrise:before { + content: "\e687"; +} + +.icon-sun:before { + content: "\e688"; +} + +.icon-sort:before { + content: "\e689"; +} + +.icon-user-check:before { + content: "\e68a"; +} + +.icon-warning:before { + content: "\e68b"; +} + +.icon-volume-off:before { + content: "\e68c"; +} + +.icon-tag:before { + content: "\e68d"; +} + +.icon-shuffle:before { + content: "\e68e"; +} + +.icon-users:before { + content: "\e68f"; +} + +.icon-webcam:before { + content: "\e690"; +} + +.icon-volume-up:before { + content: "\e691"; +} + +.icon-zoom-in:before { + content: "\e692"; +} + +.icon-pause:before { + content: "\e693"; +} + +.icon-daochu:before { + content: "\e636"; +} + +.icon-daoru:before { + content: "\e637"; +} + +.icon-attachment:before { + content: "\e602"; +} + +.icon-board:before { + content: "\e603"; +} + +.icon-iconset0204:before { + content: "\e667"; +} + +.icon-serialnumber:before { + content: "\e604"; +} + +.icon-delete:before { + content: "\e600"; +} + +.icon-edit:before { + content: "\e601"; +} + 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..9ee6e73 --- /dev/null +++ b/src/styles/variables.scss @@ -0,0 +1,31 @@ +// sidebar +$menuText:#606266; +$menuActiveText:#122583; +$subMenuActiveText:#122583; //https://github.com/ElemeFE/element/issues/12951 + +$menuBg:#ffffff;//#304156 +$menuHover:#e0f2ff; +$menuActiveBg:#1ea946; + + +$subMenuBg:#ffffff;//#1f2d3d +$subMenuHover:#edf6ff; +$submenuActiveBg:#1ea946; + +$sideBarWidth: 210px; +$primaryColor: #122583; +// 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..b984936 --- /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: #122583; 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..6e6b300 --- /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..5fd9de6 --- /dev/null +++ b/src/views/dashboard/index.vue @@ -0,0 +1,247 @@ + + + + + diff --git a/src/views/login/index.vue b/src/views/login/index.vue new file mode 100644 index 0000000..2583a9c --- /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..e233acb --- /dev/null +++ b/src/views/system/menu.vue @@ -0,0 +1,223 @@ + + 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/src/views/tool/list.vue b/src/views/tool/list.vue new file mode 100644 index 0000000..e257729 --- /dev/null +++ b/src/views/tool/list.vue @@ -0,0 +1,662 @@ + + + diff --git a/src/views/tool/log.vue b/src/views/tool/log.vue new file mode 100644 index 0000000..02ea784 --- /dev/null +++ b/src/views/tool/log.vue @@ -0,0 +1,205 @@ + + diff --git a/src/views/toolbox/exception.vue b/src/views/toolbox/exception.vue new file mode 100644 index 0000000..6173992 --- /dev/null +++ b/src/views/toolbox/exception.vue @@ -0,0 +1,227 @@ + + diff --git a/src/views/toolbox/list.vue b/src/views/toolbox/list.vue new file mode 100644 index 0000000..95a2e76 --- /dev/null +++ b/src/views/toolbox/list.vue @@ -0,0 +1,552 @@ + + + diff --git a/src/views/toolbox/log.vue b/src/views/toolbox/log.vue new file mode 100644 index 0000000..7d5c5f0 --- /dev/null +++ b/src/views/toolbox/log.vue @@ -0,0 +1,189 @@ + + diff --git a/src/views/toolbox/user.vue b/src/views/toolbox/user.vue new file mode 100644 index 0000000..0204666 --- /dev/null +++ b/src/views/toolbox/user.vue @@ -0,0 +1,502 @@ + + + + diff --git a/src/views/toolbox/view.vue b/src/views/toolbox/view.vue new file mode 100644 index 0000000..ba004b4 --- /dev/null +++ b/src/views/toolbox/view.vue @@ -0,0 +1,260 @@ + + + diff --git a/src/views/toolbox/warning.vue b/src/views/toolbox/warning.vue new file mode 100644 index 0000000..b4fe1cc --- /dev/null +++ b/src/views/toolbox/warning.vue @@ -0,0 +1,256 @@ + + 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..0847f39 --- /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 || 8082 // 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://118.31.104.155:8082/', + 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') + } + ) + } +}