From 3780ebefadffab898098912b96008a2d81c98623 Mon Sep 17 00:00:00 2001
From: ival <610568032@qq.com>
Date: Tue, 2 Jul 2019 16:29:52 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0nclient=E5=B7=A5=E7=A8=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.editorconfig | 14 +
.env.development | 16 +
.env.production | 5 +
.env.staging | 5 +
.eslintignore | 4 +
.eslintrc.js | 196 +++++++
.gitignore | 16 +
.postcssrc.js | 8 +
.travis.yml | 5 +
Jenkinsfile-prd | 26 +
Jenkinsfile-test | 26 +
LICENSE | 21 +
README-zh.md | 96 ++++
README.md | 89 ++++
babel.config.js | 5 +
build/index.js | 35 ++
jest.config.js | 24 +
package.json | 73 +++
public/favicon.png | Bin 0 -> 11827 bytes
public/index.html | 17 +
src/App.vue | 11 +
src/api/login.js | 78 +++
src/api/user.js | 99 ++++
src/assets/401_images/401.gif | Bin 0 -> 164227 bytes
src/assets/404_images/404.png | Bin 0 -> 98071 bytes
src/assets/404_images/404_cloud.png | Bin 0 -> 4766 bytes
src/components/Breadcrumb/index.vue | 78 +++
src/components/Hamburger/index.vue | 44 ++
src/components/PopMenu/index.vue | 262 ++++++++++
src/components/QrCode/index.vue | 44 ++
src/components/QueryListPage/DataForm.vue | 287 +++++++++++
src/components/QueryListPage/QueryForm.vue | 483 ++++++++++++++++++
.../QueryListPage/QueryListPage.vue | 455 +++++++++++++++++
src/components/SvgIcon/index.vue | 43 ++
src/components/TurnbackBar/index.vue | 41 ++
src/icons/index.js | 9 +
src/icons/svg/dashboard.svg | 1 +
src/icons/svg/example.svg | 1 +
src/icons/svg/eye-open.svg | 1 +
src/icons/svg/eye.svg | 1 +
src/icons/svg/form.svg | 1 +
src/icons/svg/link.svg | 1 +
src/icons/svg/map-mange.svg | 1 +
src/icons/svg/nested.svg | 1 +
src/icons/svg/password.svg | 1 +
src/icons/svg/plan-mange.svg | 1 +
src/icons/svg/table.svg | 1 +
src/icons/svg/tree.svg | 1 +
src/icons/svg/user.svg | 1 +
src/icons/svgo.yml | 22 +
src/layout/components/AppMain.vue | 17 +
src/layout/components/Entry.vue | 40 ++
src/layout/components/Logout.vue | 88 ++++
src/layout/components/Navbar.vue | 162 ++++++
src/layout/components/Sidebar/SidebarItem.vue | 59 +++
src/layout/components/Sidebar/index.vue | 29 ++
src/layout/components/index.js | 3 +
src/layout/index.vue | 87 ++++
src/layout/mixin/ResizeHandler.js | 41 ++
src/layout1/components/AppMain.vue | 31 ++
src/layout1/components/ChangePassword.vue | 147 ++++++
src/layout1/components/Navbar.vue | 145 ++++++
src/layout1/components/Sidebar/FixiOSBug.js | 26 +
src/layout1/components/Sidebar/Item.vue | 29 ++
src/layout1/components/Sidebar/Link.vue | 36 ++
src/layout1/components/Sidebar/Logo.vue | 82 +++
.../components/Sidebar/SidebarItem.vue | 102 ++++
src/layout1/components/Sidebar/index.vue | 56 ++
src/layout1/components/index.js | 3 +
src/layout1/index.vue | 93 ++++
src/layout1/mixin/ResizeHandler.js | 45 ++
src/main.js | 55 ++
src/mixin/WindowResizeHandler.js | 35 ++
src/permission.js | 110 ++++
src/router/index.js | 118 +++++
src/scripts/ConstConfig.js | 13 +
src/scripts/GlobalPlugin.js | 35 ++
src/settings.js | 16 +
src/store/getters.js | 16 +
src/store/index.js | 21 +
src/store/modules/app.js | 48 ++
src/store/modules/permission.js | 106 ++++
src/store/modules/settings.js | 31 ++
src/store/modules/user.js | 183 +++++++
src/styles/element-ui.scss | 44 ++
src/styles/index.scss | 65 +++
src/styles/mixin.scss | 28 +
src/styles/sidebar.scss | 213 ++++++++
src/styles/transition.scss | 48 ++
src/styles/variables.scss | 25 +
src/utils/Export2Excel.js | 270 ++++++++++
src/utils/PermissionType.js | 11 +
src/utils/auth.js | 86 ++++
src/utils/baseUrl.js | 14 +
src/utils/get-page-title.js | 10 +
src/utils/index.js | 111 ++++
src/utils/login.js | 8 +
src/utils/request.js | 64 +++
src/utils/runPlan.js | 282 ++++++++++
src/utils/sock.js | 211 ++++++++
src/utils/stomp.js | 37 ++
src/utils/throttle.js | 170 ++++++
src/utils/time.js | 46 ++
src/utils/validate.js | 20 +
src/views/components/drapLeft/index.vue | 106 ++++
src/views/dashboard/index.vue | 31 ++
src/views/error-page/401.vue | 107 ++++
src/views/error-page/404.vue | 255 +++++++++
src/views/login/index.vue | 208 ++++++++
src/views/login/loginNew.vue | 192 +++++++
src/views/login/loginNewPlan.vue | 188 +++++++
src/views/login/loginNewScreen.vue | 188 +++++++
src/views/login/loginPlan.vue | 210 ++++++++
src/views/login/loginScreen.vue | 210 ++++++++
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/parseTime.spec.js | 28 +
tests/unit/utils/validate.spec.js | 17 +
vue.config.js | 135 +++++
122 files changed, 8569 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 .postcssrc.js
create mode 100644 .travis.yml
create mode 100644 Jenkinsfile-prd
create mode 100644 Jenkinsfile-test
create mode 100644 LICENSE
create mode 100644 README-zh.md
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 package.json
create mode 100644 public/favicon.png
create mode 100644 public/index.html
create mode 100644 src/App.vue
create mode 100644 src/api/login.js
create mode 100644 src/api/user.js
create mode 100644 src/assets/401_images/401.gif
create mode 100644 src/assets/404_images/404.png
create mode 100644 src/assets/404_images/404_cloud.png
create mode 100644 src/components/Breadcrumb/index.vue
create mode 100644 src/components/Hamburger/index.vue
create mode 100644 src/components/PopMenu/index.vue
create mode 100644 src/components/QrCode/index.vue
create mode 100644 src/components/QueryListPage/DataForm.vue
create mode 100644 src/components/QueryListPage/QueryForm.vue
create mode 100644 src/components/QueryListPage/QueryListPage.vue
create mode 100644 src/components/SvgIcon/index.vue
create mode 100644 src/components/TurnbackBar/index.vue
create mode 100644 src/icons/index.js
create mode 100644 src/icons/svg/dashboard.svg
create mode 100644 src/icons/svg/example.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/link.svg
create mode 100644 src/icons/svg/map-mange.svg
create mode 100644 src/icons/svg/nested.svg
create mode 100644 src/icons/svg/password.svg
create mode 100644 src/icons/svg/plan-mange.svg
create mode 100644 src/icons/svg/table.svg
create mode 100644 src/icons/svg/tree.svg
create mode 100644 src/icons/svg/user.svg
create mode 100644 src/icons/svgo.yml
create mode 100644 src/layout/components/AppMain.vue
create mode 100644 src/layout/components/Entry.vue
create mode 100644 src/layout/components/Logout.vue
create mode 100644 src/layout/components/Navbar.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/layout1/components/AppMain.vue
create mode 100644 src/layout1/components/ChangePassword.vue
create mode 100644 src/layout1/components/Navbar.vue
create mode 100644 src/layout1/components/Sidebar/FixiOSBug.js
create mode 100644 src/layout1/components/Sidebar/Item.vue
create mode 100644 src/layout1/components/Sidebar/Link.vue
create mode 100644 src/layout1/components/Sidebar/Logo.vue
create mode 100644 src/layout1/components/Sidebar/SidebarItem.vue
create mode 100644 src/layout1/components/Sidebar/index.vue
create mode 100644 src/layout1/components/index.js
create mode 100644 src/layout1/index.vue
create mode 100644 src/layout1/mixin/ResizeHandler.js
create mode 100644 src/main.js
create mode 100644 src/mixin/WindowResizeHandler.js
create mode 100644 src/permission.js
create mode 100644 src/router/index.js
create mode 100644 src/scripts/ConstConfig.js
create mode 100644 src/scripts/GlobalPlugin.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/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.scss
create mode 100644 src/utils/Export2Excel.js
create mode 100644 src/utils/PermissionType.js
create mode 100644 src/utils/auth.js
create mode 100644 src/utils/baseUrl.js
create mode 100644 src/utils/get-page-title.js
create mode 100644 src/utils/index.js
create mode 100644 src/utils/login.js
create mode 100644 src/utils/request.js
create mode 100644 src/utils/runPlan.js
create mode 100644 src/utils/sock.js
create mode 100644 src/utils/stomp.js
create mode 100644 src/utils/throttle.js
create mode 100644 src/utils/time.js
create mode 100644 src/utils/validate.js
create mode 100644 src/views/components/drapLeft/index.vue
create mode 100644 src/views/dashboard/index.vue
create mode 100644 src/views/error-page/401.vue
create mode 100644 src/views/error-page/404.vue
create mode 100644 src/views/login/index.vue
create mode 100644 src/views/login/loginNew.vue
create mode 100644 src/views/login/loginNewPlan.vue
create mode 100644 src/views/login/loginNewScreen.vue
create mode 100644 src/views/login/loginPlan.vue
create mode 100644 src/views/login/loginScreen.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/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 000000000..f669cf1f7
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,14 @@
+# http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 4
+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 000000000..2c5c25f12
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,16 @@
+# just a flag
+NODE_ENV = 'development'
+
+# base api
+# VUE_APP_BASE_API = 'https://joylink.club/jlcloud'
+# VUE_APP_BASE_API = 'http://192.168.3.4:9000'
+VUE_APP_BASE_API = 'http://192.168.3.6:9000'
+
+# vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable,
+# to control whether the babel-plugin-dynamic-import-node plugin is enabled.
+# It only does one thing by converting all import() to require().
+# This configuration can significantly increase the speed of hot updates,
+# when you have a large number of pages.
+# Detail: https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js
+
+VUE_CLI_BABEL_TRANSPILE_MODULES = true
diff --git a/.env.production b/.env.production
new file mode 100644
index 000000000..e05ea2043
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,5 @@
+# just a flag
+NODE_ENV = 'production'
+
+# base api
+VUE_APP_BASE_API = 'https://joylink.club/jlcloud'
diff --git a/.env.staging b/.env.staging
new file mode 100644
index 000000000..c12fe731a
--- /dev/null
+++ b/.env.staging
@@ -0,0 +1,5 @@
+# just a flag
+NODE_ENV = 'test'
+
+# base api
+VUE_APP_BASE_API = 'https://joylink.club/jlcloud'
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 000000000..e6529fc09
--- /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 000000000..bbe07d664
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,196 @@
+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': ["error", "tab"],
+ '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 000000000..9ad28d23d
--- /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/.postcssrc.js b/.postcssrc.js
new file mode 100644
index 000000000..10473efcf
--- /dev/null
+++ b/.postcssrc.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/.travis.yml b/.travis.yml
new file mode 100644
index 000000000..16574d97a
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,5 @@
+language: node_js
+node_js: stable
+script: npm run test
+notifications:
+ email: false
diff --git a/Jenkinsfile-prd b/Jenkinsfile-prd
new file mode 100644
index 000000000..872713823
--- /dev/null
+++ b/Jenkinsfile-prd
@@ -0,0 +1,26 @@
+pipeline {
+ agent {
+ node {
+ label 'master'
+ }
+ }
+
+ stages {
+ stage('Package') {
+ tools {
+ nodejs 'nodejs-10'
+ }
+ steps {
+ sh 'npm install'
+ sh 'npm run build'
+ }
+ }
+ stage('Publish') {
+ steps {
+ sh 'cp -rf ./dist/* /usr/local/joylink/jlclient'
+ }
+ }
+ }
+
+
+}
diff --git a/Jenkinsfile-test b/Jenkinsfile-test
new file mode 100644
index 000000000..ad09944fc
--- /dev/null
+++ b/Jenkinsfile-test
@@ -0,0 +1,26 @@
+pipeline {
+ agent {
+ node {
+ label 'master'
+ }
+ }
+
+ stages {
+ stage('Package') {
+ tools {
+ nodejs 'nodejs-10'
+ }
+ steps {
+ sh 'npm install'
+ sh 'npm run test'
+ }
+ }
+ stage('Publish') {
+ steps {
+ sh 'cp -rf ./dist/* /usr/local/joylink/jlclient'
+ }
+ }
+ }
+
+
+}
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 000000000..61515750d
--- /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-zh.md b/README-zh.md
new file mode 100644
index 000000000..32243a46d
--- /dev/null
+++ b/README-zh.md
@@ -0,0 +1,96 @@
+# vue-admin-template
+
+> 这是一个极简的 vue admin 管理后台。它只包含了 Element UI & axios & iconfont & permission control & lint,这些搭建后台必要的东西。
+
+[线上地址](http://panjiachen.github.io/vue-admin-template)
+
+[国内访问](https://panjiachen.gitee.io/vue-admin-template)
+
+目前版本为 `v4.0+` 基于 `vue-cli` 进行构建,若你想使用旧版本,可以切换分支到[tag/3.11.0](https://github.com/PanJiaChen/vue-admin-template/tree/tag/3.11.0),它不依赖 `vue-cli`。
+
+## Extra
+
+如果你想要根据用户角色来动态生成侧边栏和 router,你可以使用该分支[permission-control](https://github.com/PanJiaChen/vue-admin-template/tree/permission-control)
+
+## 相关项目
+
+[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
+
+[electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)
+
+[vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template)
+
+写了一个系列的教程配套文章,如何从零构建后一个完整的后台项目:
+
+- [手摸手,带你用 vue 撸后台 系列一(基础篇)](https://juejin.im/post/59097cd7a22b9d0065fb61d2)
+- [手摸手,带你用 vue 撸后台 系列二(登录权限篇)](https://juejin.im/post/591aa14f570c35006961acac)
+- [手摸手,带你用 vue 撸后台 系列三 (实战篇)](https://juejin.im/post/593121aa0ce4630057f70d35)
+- [手摸手,带你用 vue 撸后台 系列四(vueAdmin 一个极简的后台基础模板,专门针对本项目的文章,算作是一篇文档)](https://juejin.im/post/595b4d776fb9a06bbe7dba56)
+- [手摸手,带你封装一个 vue component](https://segmentfault.com/a/1190000009090836)
+
+## Build Setup
+
+```bash
+# 克隆项目
+git clone https://github.com/PanJiaChen/vue-admin-template.git
+
+# 进入项目目录
+cd vue-admin-template
+
+# 安装依赖
+npm install
+
+# 建议不要直接使用 cnpm 安装以来,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
+npm install --registry=https://registry.npm.taobao.org
+
+# 启动服务
+npm run dev
+```
+
+浏览器访问 [http://localhost:9528](http://localhost:9528)
+
+## 发布
+
+```bash
+# 构建测试环境
+npm run build:stage
+
+# 构建生产环境
+npm run build:prod
+```
+
+## 其它
+
+```bash
+# 预览发布环境效果
+npm run preview
+
+# 预览发布环境效果 + 静态资源分析
+npm run preview -- --report
+
+# 代码格式检查
+npm run lint
+
+# 代码格式检查并自动修复
+npm run lint -- --fix
+```
+
+更多信息请参考 [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/)
+
+## Demo
+
+![demo](https://github.com/PanJiaChen/PanJiaChen.github.io/blob/master/images/demo.gif)
+
+## Browsers support
+
+Modern browsers and Internet Explorer 10+.
+
+| [](http://godban.github.io/browsers-support-badges/)IE / Edge | [](http://godban.github.io/browsers-support-badges/)Firefox | [](http://godban.github.io/browsers-support-badges/)Chrome | [](http://godban.github.io/browsers-support-badges/)Safari |
+| --------- | --------- | --------- | --------- |
+| IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions
+
+## License
+
+[MIT](https://github.com/PanJiaChen/vue-admin-template/blob/master/LICENSE) license.
+
+Copyright (c) 2017-present PanJiaChen
diff --git a/README.md b/README.md
new file mode 100644
index 000000000..bd3dbc87e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,89 @@
+# vue-admin-template
+
+English | [简体中文](./README-zh.md)
+
+> A minimal vue admin template with Element UI & axios & iconfont & permission control & lint
+
+**Live demo:** http://panjiachen.github.io/vue-admin-template
+
+
+**The current version is `v4.0+` build on `vue-cli`. If you want to use the old version , you can switch branch to [tag/3.11.0](https://github.com/PanJiaChen/vue-admin-template/tree/tag/3.11.0), it does not rely on `vue-cli`**
+
+## Build Setup
+
+
+```bash
+# clone the project
+git clone https://github.com/PanJiaChen/vue-element-admin.git
+
+# enter the project directory
+cd vue-element-admin
+
+# install dependency
+npm install
+
+# develop
+npm run dev
+```
+
+This will automatically open http://localhost:9527
+
+## Build
+
+```bash
+# build for test environment
+npm run build:stage
+
+# build for production environment
+npm run build:prod
+```
+
+## Advanced
+
+```bash
+# preview the release environment effect
+npm run preview
+
+# preview the release environment effect + static resource analysis
+npm run preview -- --report
+
+# code format check
+npm run lint
+
+# code format check and auto fix
+npm run lint -- --fix
+```
+
+Refer to [Documentation](https://panjiachen.github.io/vue-element-admin-site/guide/essentials/deploy.html) for more information
+
+## Demo
+
+![demo](https://github.com/PanJiaChen/PanJiaChen.github.io/blob/master/images/demo.gif)
+
+## Extra
+
+If you want router permission && generate menu by user roles , you can use this branch [permission-control](https://github.com/PanJiaChen/vue-admin-template/tree/permission-control)
+
+For `typescript` version, you can use [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (Credits: [@Armour](https://github.com/Armour))
+
+## Related Project
+
+[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
+
+[electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)
+
+[vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template)
+
+## Browsers support
+
+Modern browsers and Internet Explorer 10+.
+
+| [](http://godban.github.io/browsers-support-badges/)IE / Edge | [](http://godban.github.io/browsers-support-badges/)Firefox | [](http://godban.github.io/browsers-support-badges/)Chrome | [](http://godban.github.io/browsers-support-badges/)Safari |
+| --------- | --------- | --------- | --------- |
+| IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions
+
+## License
+
+[MIT](https://github.com/PanJiaChen/vue-admin-template/blob/master/LICENSE) license.
+
+Copyright (c) 2017-present PanJiaChen
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 000000000..5e0f39c22
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ presets: [
+ '@vue/app'
+ ]
+}
diff --git a/build/index.js b/build/index.js
new file mode 100644
index 000000000..0c57de2aa
--- /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 000000000..9f8bb7917
--- /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/package.json b/package.json
new file mode 100644
index 000000000..c6aa5e19b
--- /dev/null
+++ b/package.json
@@ -0,0 +1,73 @@
+{
+ "name": "vue-admin-template",
+ "version": "4.1.0",
+ "description": "A vue admin template with Element UI & axios & iconfont & permission control & lint",
+ "author": "Pan ",
+ "license": "MIT",
+ "scripts": {
+ "dev": "vue-cli-service serve",
+ "build": "vue-cli-service build",
+ "test": "vue-cli-service build --mode staging",
+ "preview": "node build/index.js --preview",
+ "lint": "eslint --ext .js,.vue src",
+ "test:unit": "jest --clearCache && vue-cli-service test:unit",
+ "test:ci": "npm run lint && npm run test:unit",
+ "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml"
+ },
+ "dependencies": {
+ "axios": "0.18.0",
+ "echarts": "^4.2.1",
+ "element-ui": "2.7.2",
+ "js-cookie": "2.2.0",
+ "js-md5": "^0.7.3",
+ "normalize.css": "7.0.0",
+ "nprogress": "0.2.0",
+ "path-to-regexp": "2.4.0",
+ "qrcode.vue": "^1.6.2",
+ "stompjs": "^2.3.3",
+ "storejs": "^1.0.25",
+ "vue": "2.6.10",
+ "vue-router": "3.0.6",
+ "vuedraggable": "^2.20.0",
+ "vuex": "3.1.0",
+ "xlsx": "^0.14.2"
+ },
+ "devDependencies": {
+ "@babel/core": "7.0.0",
+ "@babel/register": "7.0.0",
+ "@vue/cli-plugin-babel": "3.6.0",
+ "@vue/cli-plugin-eslint": "3.6.0",
+ "@vue/cli-plugin-unit-jest": "3.6.3",
+ "@vue/cli-service": "3.6.0",
+ "@vue/test-utils": "1.0.0-beta.29",
+ "autoprefixer": "^9.5.1",
+ "babel-core": "7.0.0-bridge.0",
+ "babel-eslint": "10.0.1",
+ "babel-jest": "23.6.0",
+ "chalk": "2.4.2",
+ "connect": "3.6.6",
+ "eslint": "5.15.3",
+ "eslint-plugin-vue": "5.2.2",
+ "file-loader": "^3.0.1",
+ "html-webpack-plugin": "3.2.0",
+ "mockjs": "1.0.1-beta3",
+ "node-sass": "^4.9.0",
+ "runjs": "^4.3.2",
+ "sass-loader": "^7.1.0",
+ "script-ext-html-webpack-plugin": "2.1.3",
+ "script-loader": "0.7.2",
+ "serve-static": "^1.13.2",
+ "svg-sprite-loader": "4.1.3",
+ "svgo": "1.2.2",
+ "vue-template-compiler": "2.6.10"
+ },
+ "engines": {
+ "node": ">=8.9",
+ "npm": ">= 3.0.0"
+ },
+ "browserslist": [
+ "> 1%",
+ "last 2 versions",
+ "not ie <= 8"
+ ]
+}
diff --git a/public/favicon.png b/public/favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..e250916ab2d432e1f70e015a54722dd713e65a77
GIT binary patch
literal 11827
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
literal 0
HcmV?d00001
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 000000000..7a0b35453
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+ <%= webpackConfig.name %>
+
+
+
+
+
+
+
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 000000000..98b06c41a
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/src/api/login.js b/src/api/login.js
new file mode 100644
index 000000000..ebc5aed91
--- /dev/null
+++ b/src/api/login.js
@@ -0,0 +1,78 @@
+import request from '@/utils/request'
+
+// 修改密码
+export function changePassword(userId, data) {
+ return request({
+ url: `/api/login/${userId}/password`,
+ method: 'put',
+ data: data
+ })
+}
+
+// 账号密码 其他系统
+export function login(params) {
+ return request({
+ url: '/api/login',
+ method: 'post',
+ data: params
+ });
+}
+
+// 获取登陆url 二维码 其他系统
+export function getLoginUrl(params) {
+ return request({
+ url: '/api/login/url',
+ method: 'get',
+ params: params
+ });
+}
+
+
+// 获取登录信息
+export function getInfo(token) {
+ return request({
+ url: '/api/login/getUserInfo',
+ method: 'get',
+ params: { token }
+ });
+}
+
+// 登出
+export function logout(token) {
+ return request({
+ url: '/api/login/logout',
+ method: 'get',
+ params: {
+ token
+ }
+ });
+}
+
+// 检查登陆状态
+export function checkLoginStatus(sessionId) {
+ return new Promise((resolve, reject) => {
+ request({
+ url: '/api/login/checkStatus',
+ method: 'get',
+ params: {
+ sessionId: sessionId
+ }
+ }).then(response => {
+ if (response.data.status === '2') {
+ resolve(response);
+ } else {
+ reject(response);
+ }
+ }).catch(error => {
+ reject(error);
+ });
+ });
+}
+
+// 检测持续在线 防止掉线在大屏或者仿真系统下
+export function checkLoginLine() {
+ return request({
+ url: '/api/cache/heartBeat',
+ method: 'get',
+ });
+}
diff --git a/src/api/user.js b/src/api/user.js
new file mode 100644
index 000000000..dd4041fee
--- /dev/null
+++ b/src/api/user.js
@@ -0,0 +1,99 @@
+import request from '@/utils/request';
+
+
+/** 查询用户参数*/
+export function getUserConfigInfo() {
+ return request({
+ url: '/api/user/config',
+ method: 'get'
+ });
+}
+
+// /** 注册用户*/
+// export function createUserInfo(data) {
+// return request({
+// url: '/api/userinfo/create',
+// method: 'put',
+// data: data
+// });
+// }
+// /** 根据用户Id获取用户信息*/
+// export function getUserInfoByOpenId(params) {
+// return request({
+// url: '/api/userinfo/getByOpenId',
+// method: 'get',
+// params: params
+// });
+// }
+
+// /** 根据姓名或者手机号查询用户*/
+// export function getUserInfoByNameOrMobile(params) {
+// return request({
+// url: '/api/userinfo/nameOrMobile',
+// method: 'get',
+// params: params
+// });
+// }
+
+// /** 设置用户参数*/
+// export function setUserConfigInfo(data) {
+// return request({
+// url: '/api/user/config',
+// method: 'post',
+// data: data
+// });
+// }
+
+// /** 获取销售列表*/
+// export function getSellerList() {
+// return request({
+// url: `/api/user/seller`,
+// method: 'get'
+// });
+// }
+
+// /** 查询用户列表*/
+// export function getUserList(params) {
+// return request({
+// url: `/api/user`,
+// method: 'get',
+// params: params
+// });
+// }
+
+// /** 模糊查询用户 昵称、名称、手机号*/
+// export function getDimUserList(params) {
+// return request({
+// url: `/api/user/fuzzy`,
+// method: 'get',
+// params: params
+// });
+// }
+
+
+// /** 获取用户订阅地图列表*/
+// export function getUserSubscribe(userId) {
+// return request({
+// url: `/api/user/subscribe/${userId}`,
+// method: 'get'
+// });
+// }
+
+// /** 保存用户订阅地图列表*/
+// export function saveUserSubscribe(data) {
+// return request({
+// url: '/api/user/subscribe',
+// method: 'post',
+// data: data
+// });
+// }
+
+
+// // 修改用户权限
+// export function putRoles(data) {
+// return request({
+// url: `/api/user/${data.id}/role`,
+// method: 'put',
+// data: data
+// });
+// }
diff --git a/src/assets/401_images/401.gif b/src/assets/401_images/401.gif
new file mode 100644
index 0000000000000000000000000000000000000000..cd6e0d9433421b3f29d0ec0c40f755e354728000
GIT binary patch
literal 164227
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