From 5ad248e418e25e7fc206ad6d6149cd9966388a91 Mon Sep 17 00:00:00 2001 From: smallchill Date: Mon, 25 Mar 2019 18:35:56 +0800 Subject: [PATCH] =?UTF-8?q?:ok=5Fhand:=20=E5=AE=89=E6=8E=92oauth2=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 55 ++++-- package.json | 93 ++++----- src/api/system/client.js | 50 +++++ src/api/user.js | 27 ++- src/config/website.js | 61 +++--- src/page/index/index.vue | 134 ++++++------- src/page/login/userlogin.vue | 7 +- src/router/axios.js | 75 +++---- src/store/modules/user.js | 373 ++++++++++++++++++----------------- src/util/auth.js | 11 +- src/views/system/client.vue | 273 +++++++++++++++++++++++++ vue.config.js | 4 +- 12 files changed, 770 insertions(+), 393 deletions(-) create mode 100644 src/api/system/client.js create mode 100644 src/views/system/client.vue diff --git a/package-lock.json b/package-lock.json index 4454860..e01a70d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2713,7 +2713,8 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "dev": true, + "optional": true }, "coa": { "version": "2.0.2", @@ -4851,7 +4852,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -4872,12 +4874,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4892,17 +4896,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5019,7 +5026,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -5031,6 +5039,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5045,6 +5054,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5052,12 +5062,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5076,6 +5088,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -5156,7 +5169,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -5168,6 +5182,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -5253,7 +5268,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -5289,6 +5305,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5308,6 +5325,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5351,12 +5369,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -6557,8 +6577,7 @@ "js-base64": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", - "dev": true + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" }, "js-cookie": { "version": "2.2.0", @@ -6732,6 +6751,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, + "optional": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -8746,7 +8766,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "dev": true, + "optional": true }, "prettier": { "version": "1.16.3", @@ -9448,7 +9469,8 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true + "dev": true, + "optional": true }, "rx-lite-aggregates": { "version": "4.0.8", @@ -10834,6 +10856,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, + "optional": true, "requires": { "prelude-ls": "~1.1.2" } diff --git a/package.json b/package.json index 1303417..eaf80c8 100644 --- a/package.json +++ b/package.json @@ -1,48 +1,49 @@ { - "name": "saber-admin", - "version": "1.0.0", - "private": true, - "scripts": { - "serve": "vue-cli-service serve", - "build": "vue-cli-service build", - "lint": "vue-cli-service lint", - "analyz": "npm_config_report=true npm run build", - "test:unit": "vue-cli-service test:unit", - "test:e2e": "vue-cli-service test:e2e" - }, - "dependencies": { - "axios": "^0.18.0", - "babel-polyfill": "^6.26.0", - "classlist-polyfill": "^1.2.0", - "element-ui": "^2.4.5", - "js-cookie": "^2.2.0", - "mockjs": "^1.0.1-beta3", - "nprogress": "^0.2.0", - "script-loader": "^0.7.2", - "vue": "^2.5.16", - "vue-axios": "^2.1.2", - "vue-i18n": "^8.7.0", - "vue-router": "^3.0.1", - "vuex": "^3.0.1" - }, - "devDependencies": { - "@vue/cli-plugin-babel": "^3.1.1", - "@vue/cli-plugin-eslint": "^3.1.5", - "@vue/cli-service": "^3.1.4", - "chai": "^4.1.2", - "node-sass": "^4.9.0", - "sass-loader": "^7.0.1", - "vue-template-compiler": "^2.5.17", - "webpack-bundle-analyzer": "^3.0.3" - }, - "lint-staged": { - "*.js": [ - "vue-cli-service lint", - "git add" - ], - "*.vue": [ - "vue-cli-service lint", - "git add" - ] - } + "name": "saber-admin", + "version": "1.0.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "lint": "vue-cli-service lint", + "analyz": "npm_config_report=true npm run build", + "test:unit": "vue-cli-service test:unit", + "test:e2e": "vue-cli-service test:e2e" + }, + "dependencies": { + "axios": "^0.18.0", + "babel-polyfill": "^6.26.0", + "classlist-polyfill": "^1.2.0", + "element-ui": "^2.4.5", + "js-cookie": "^2.2.0", + "mockjs": "^1.0.1-beta3", + "nprogress": "^0.2.0", + "script-loader": "^0.7.2", + "vue": "^2.5.16", + "vue-axios": "^2.1.2", + "vue-i18n": "^8.7.0", + "vue-router": "^3.0.1", + "vuex": "^3.0.1", + "js-base64": "^2.5.1" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "^3.1.1", + "@vue/cli-plugin-eslint": "^3.1.5", + "@vue/cli-service": "^3.1.4", + "chai": "^4.1.2", + "node-sass": "^4.9.0", + "sass-loader": "^7.0.1", + "vue-template-compiler": "^2.5.17", + "webpack-bundle-analyzer": "^3.0.3" + }, + "lint-staged": { + "*.js": [ + "vue-cli-service lint", + "git add" + ], + "*.vue": [ + "vue-cli-service lint", + "git add" + ] + } } diff --git a/src/api/system/client.js b/src/api/system/client.js new file mode 100644 index 0000000..194cf3d --- /dev/null +++ b/src/api/system/client.js @@ -0,0 +1,50 @@ +import request from '@/router/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/api/blade-system/client/list', + method: 'get', + params: { + ...params, + current, + size, + } + }) +} + +export const getDetail = (id) => { + return request({ + url: '/api/blade-system/client/detail', + method: 'get', + params: { + id + } + }) +} + +export const remove = (ids) => { + return request({ + url: '/api/blade-system/client/remove', + method: 'post', + params: { + ids, + } + }) +} + +export const add = (row) => { + return request({ + url: '/api/blade-system/client/submit', + method: 'post', + data: row + }) +} + +export const update = (row) => { + return request({ + url: '/api/blade-system/client/submit', + method: 'post', + data: row + }) +} + diff --git a/src/api/user.js b/src/api/user.js index 2bf81d4..21090a0 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -1,17 +1,31 @@ import request from '@/router/axios'; import {baseUrl} from '@/config/env'; -export const loginByUsername = (tenantCode, account, password, type) => request({ - url: '/api/blade-auth/token', +export const loginByUsername = (tenantCode, username, password, type) => request({ + url: '/api/blade-auth/oauth/token', method: 'post', + headers: { + 'Tenant-Code': tenantCode + }, params: { - tenantCode, - account, + username, password, + grant_type: "password", + scope: "all", type } }) +export const refeshToken = (refresh_token) => request({ + url: '/api/blade-auth/oauth/token', + method: 'post', + params: { + refresh_token, + grant_type: "refresh_token", + scope: "all", + } +}) + export const getButtons = () => request({ url: '/api/blade-system/menu/buttons', method: 'get' @@ -22,11 +36,6 @@ export const getUserInfo = () => request({ method: 'get' }); -export const refeshToken = () => request({ - url: baseUrl + '/user/refesh', - method: 'post' -}) - export const getMenu = () => request({ url: '/api/blade-system/menu/routes', method: 'get' diff --git a/src/config/website.js b/src/config/website.js index 4fd8523..2d8f8f3 100644 --- a/src/config/website.js +++ b/src/config/website.js @@ -2,35 +2,38 @@ * 全局配置文件 */ export default { - title: "saber", - logo: "S", - key: 'saber',//配置主键,目前用于存储 - indexTitle: 'Saber Admin', - lockPage: '/lock', - tokenTime: 6000, - //http的status默认放行不才用统一处理的, - statusWhiteList: [], - //配置首页不可关闭 - isFirstPage: false, - fistPage: { - label: "首页", - value: "/wel/index", - params: {}, - query: {}, - meta: { - i18n: 'dashboard' - }, - group: [], - close: false + title: "saber", + logo: "S", + key: 'saber',//配置主键,目前用于存储 + indexTitle: 'Saber Admin', + clientId: 'saber', // 客户端id + clientSecret: 'saber_secret', // 客户端密钥 + tenantMode: true, // 是否开启租户模式 + lockPage: '/lock', + tokenTime: 1500, + //http的status默认放行不才用统一处理的, + statusWhiteList: [], + //配置首页不可关闭 + isFirstPage: false, + fistPage: { + label: "首页", + value: "/wel/index", + params: {}, + query: {}, + meta: { + i18n: 'dashboard' }, - //配置菜单的属性 - menu: { - iconDefault: 'iconfont icon-caidan', - props: { - label: 'name', - path: 'path', - icon: 'source', - children: 'children' - } + group: [], + close: false + }, + //配置菜单的属性 + menu: { + iconDefault: 'iconfont icon-caidan', + props: { + label: 'name', + path: 'path', + icon: 'source', + children: 'children' } + } } diff --git a/src/page/index/index.vue b/src/page/index/index.vue index 944835b..0711bb2 100644 --- a/src/page/index/index.vue +++ b/src/page/index/index.vue @@ -3,25 +3,25 @@ :class="{'avue--collapse':isCollapse}">
- +
- +
- + + v-if="$route.meta.keepAlive"/> + v-if="!$route.meta.keepAlive"/>
@@ -38,73 +38,67 @@ diff --git a/src/page/login/userlogin.vue b/src/page/login/userlogin.vue index 15d7015..b67e37d 100644 --- a/src/page/login/userlogin.vue +++ b/src/page/login/userlogin.vue @@ -5,7 +5,7 @@ ref="loginForm" :model="loginForm" label-width="0"> - + import { mapGetters } from "vuex"; +import website from '@/config/website'; + export default { name: "userlogin", data() { return { + tenantMode: website.tenantMode, loginForm: { tenantCode: "000000", username: "admin", @@ -62,7 +65,7 @@ export default { }, loginRules: { tenantCode: [ - { required: true, message: "请输入租户编号", trigger: "blur" } + { required: false, message: "请输入租户编号", trigger: "blur" } ], username: [ { required: true, message: "请输入用户名", trigger: "blur" } diff --git a/src/router/axios.js b/src/router/axios.js index 75ee549..912fb50 100644 --- a/src/router/axios.js +++ b/src/router/axios.js @@ -8,61 +8,64 @@ import axios from 'axios' import store from '@/store/'; import router from '@/router/router' -import { serialize } from '@/util/util' -import { getToken } from '@/util/auth' -import { Message } from 'element-ui' +import {serialize} from '@/util/util' +import {getToken} from '@/util/auth' +import {Message} from 'element-ui' import website from '@/config/website'; import NProgress from 'nprogress' // progress bar import 'nprogress/nprogress.css' // progress bar style +import {Base64} from 'js-base64'; + axios.defaults.timeout = 10000; //返回其他状态吗 axios.defaults.validateStatus = function (status) { - return status >= 200 && status <= 500; // 默认的 + return status >= 200 && status <= 500; // 默认的 }; //跨域请求,允许保存cookie axios.defaults.withCredentials = true; // NProgress Configuration NProgress.configure({ - showSpinner: false + showSpinner: false }); //HTTPrequest拦截 axios.interceptors.request.use(config => { - NProgress.start() // start progress bar - const meta = (config.meta || {}); - const isToken = meta.isToken === false; - if (getToken() && !isToken) { - config.headers['blade-auth'] = 'Bearer ' + getToken() // 让每个请求携带token--['Authorization']为自定义key 请根据实际情况自行修改 - } - //headers中配置serialize为true开启序列化 - if (config.method === 'post' && meta.isSerialize === true) { - config.data = serialize(config.data); - } - return config + NProgress.start() // start progress bar + const meta = (config.meta || {}); + const isToken = meta.isToken === false; + config.headers['Authorization'] = `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`; + if (getToken() && !isToken) { + config.headers['Blade-Auth'] = 'bearer ' + getToken() // 让每个请求携带token--['Authorization']为自定义key 请根据实际情况自行修改 + } + //headers中配置serialize为true开启序列化 + if (config.method === 'post' && meta.isSerialize === true) { + config.data = serialize(config.data); + } + return config }, error => { - return Promise.reject(error) + return Promise.reject(error) }); //HTTPresponse拦截 axios.interceptors.response.use(res => { - NProgress.done(); - const status = res.data.code || 200 - const statusWhiteList = website.statusWhiteList || []; - const message = res.data.msg || '未知错误'; - //如果在白名单里则自行catch逻辑处理 - if (statusWhiteList.includes(status)) return Promise.reject(res); - //如果是401则跳转到登录页面 - if (status === 401) store.dispatch('FedLogOut').then(() => router.push({ path: '/login' })); - // 如果请求为非200否者默认统一处理 - if (status !== 200) { - Message({ - message: message, - type: 'error' - }) - return Promise.reject(new Error(message)) - } - return res; + NProgress.done(); + const status = res.data.code || 200 + const statusWhiteList = website.statusWhiteList || []; + const message = res.data.msg || '未知错误'; + //如果在白名单里则自行catch逻辑处理 + if (statusWhiteList.includes(status)) return Promise.reject(res); + //如果是401则跳转到登录页面 + if (status === 401) store.dispatch('FedLogOut').then(() => router.push({path: '/login'})); + // 如果请求为非200否者默认统一处理 + if (status !== 200) { + Message({ + message: message, + type: 'error' + }) + return Promise.reject(new Error(message)) + } + return res; }, error => { - NProgress.done(); - return Promise.reject(new Error(error)); + NProgress.done(); + return Promise.reject(new Error(error)); }) export default axios; diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 7e12fe3..92c55be 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -1,196 +1,207 @@ -import { setToken, removeToken } from '@/util/auth' -import { setStore, getStore } from '@/util/store' -import { isURL, validatenull } from '@/util/validate' -import { deepClone } from '@/util/util' +import {setToken, setRefreshToken, removeToken} from '@/util/auth' +import {setStore, getStore} from '@/util/store' +import {isURL, validatenull} from '@/util/validate' +import {deepClone} from '@/util/util' import webiste from '@/config/website' -import { loginByUsername, getUserInfo, getMenu, getTopMenu, logout, refeshToken, getButtons } from '@/api/user' +import {loginByUsername, getUserInfo, getMenu, getTopMenu, logout, refeshToken, getButtons} from '@/api/user' function addPath(ele, first) { - const menu = webiste.menu; - const propsConfig = menu.props; - const propsDefault = { - label: propsConfig.label || 'name', - path: propsConfig.path || 'path', - icon: propsConfig.icon || 'icon', - children: propsConfig.children || 'children' - } - const icon = ele[propsDefault.icon]; - ele[propsDefault.icon] = validatenull(icon) ? menu.iconDefault : icon; - const isChild = ele[propsDefault.children] && ele[propsDefault.children].length !== 0; - if (!isChild) ele[propsDefault.children] = []; - if (!isChild && first && !isURL(ele[propsDefault.path])) { - ele[propsDefault.path] = ele[propsDefault.path] + '/index' - } else { - ele[propsDefault.children].forEach(child => { - addPath(child); - }) - } + const menu = webiste.menu; + const propsConfig = menu.props; + const propsDefault = { + label: propsConfig.label || 'name', + path: propsConfig.path || 'path', + icon: propsConfig.icon || 'icon', + children: propsConfig.children || 'children' + } + const icon = ele[propsDefault.icon]; + ele[propsDefault.icon] = validatenull(icon) ? menu.iconDefault : icon; + const isChild = ele[propsDefault.children] && ele[propsDefault.children].length !== 0; + if (!isChild) ele[propsDefault.children] = []; + if (!isChild && first && !isURL(ele[propsDefault.path])) { + ele[propsDefault.path] = ele[propsDefault.path] + '/index' + } else { + ele[propsDefault.children].forEach(child => { + addPath(child); + }) + } } + const user = { - state: { - userInfo: getStore({ name: 'userInfo' }) || [], - permission: getStore({ name: 'permission' }) || {}, - roles: [], - menu: getStore({ name: 'menu' }) || [], - menuAll: [], - token: getStore({ name: 'token' }) || '', + state: { + userInfo: getStore({name: 'userInfo'}) || [], + permission: getStore({name: 'permission'}) || {}, + roles: [], + menu: getStore({name: 'menu'}) || [], + menuAll: [], + token: getStore({name: 'token'}) || '', + refreshToken: getStore({name: 'refreshToken'}) || '', + }, + actions: { + //根据用户名登录 + LoginByUsername({commit}, userInfo) { + return new Promise((resolve) => { + loginByUsername(userInfo.tenantCode, userInfo.username, userInfo.password, userInfo.type).then(res => { + const data = res.data; + commit('SET_TOKEN', data.access_token); + commit('SET_REFRESH_TOKEN', data.refresh_token); + commit('SET_USERIFNO', data); + commit('DEL_ALL_TAG'); + commit('CLEAR_LOCK'); + resolve(); + }) + }) + }, + GetButtons({commit}) { + return new Promise((resolve) => { + getButtons().then(res => { + const data = res.data.data; + commit('SET_PERMISSION', data); + resolve(); + }) + }) + }, + //根据手机号登录 + LoginByPhone({commit}, userInfo) { + return new Promise((resolve) => { + loginByUsername(userInfo.phone, userInfo.code).then(res => { + const data = res.data.data; + commit('SET_TOKEN', data); + commit('DEL_ALL_TAG'); + commit('CLEAR_LOCK'); + resolve(); + }) + }) + }, + GetUserInfo({commit}) { + return new Promise((resolve, reject) => { + getUserInfo().then((res) => { + const data = res.data.data; + commit('SET_ROLES', data.roles); + resolve(data); + }).catch(err => { + reject(err); + }) + }) + }, + //刷新token + RefeshToken({state, commit}) { + return new Promise((resolve, reject) => { + refeshToken(state.refreshToken).then(res => { + const data = res.data; + commit('SET_TOKEN', data.access_token); + commit('SET_REFRESH_TOKEN', data.refresh_token); + resolve(); + }).catch(error => { + reject(error) + }) + }) + }, + // 登出 + LogOut({commit}) { + return new Promise((resolve, reject) => { + logout().then(() => { + commit('SET_TOKEN', '') + commit('SET_MENU', []) + commit('SET_ROLES', []) + commit('DEL_ALL_TAG'); + commit('CLEAR_LOCK'); + removeToken() + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + //注销session + FedLogOut({commit}) { + return new Promise(resolve => { + commit('SET_TOKEN', '') + commit('SET_MENU', []) + commit('SET_ROLES', []) + commit('DEL_ALL_TAG'); + commit('CLEAR_LOCK'); + removeToken() + resolve() + }) + }, + GetTopMenu() { + return new Promise(resolve => { + getTopMenu().then((res) => { + const data = res.data.data || [] + resolve(data) + }) + }) + }, + //获取系统菜单 + GetMenu({commit, dispatch}, parentId) { + return new Promise(resolve => { + getMenu(parentId).then((res) => { + const data = res.data.data + let menu = deepClone(data); + menu.forEach(ele => { + addPath(ele, true); + }) + commit('SET_MENU', menu) + dispatch('GetButtons'); + resolve(menu) + }) + }) + }, + }, + mutations: { + SET_TOKEN: (state, token) => { + setToken(token) + state.token = token; + setStore({name: 'token', content: state.token, type: 'session'}) }, - actions: { - //根据用户名登录 - LoginByUsername({ commit }, userInfo) { - return new Promise((resolve) => { - loginByUsername(userInfo.tenantCode, userInfo.username, userInfo.password, userInfo.type).then(res => { - const data = res.data.data; - commit('SET_TOKEN', data.accessToken); - commit('SET_USERIFNO', data); - commit('DEL_ALL_TAG'); - commit('CLEAR_LOCK'); - resolve(); - }) - }) - }, - GetButtons({ commit }) { - return new Promise((resolve) => { - getButtons().then(res => { - const data = res.data.data; - commit('SET_PERMISSION', data); - resolve(); - }) - }) - }, - //根据手机号登录 - LoginByPhone({ commit }, userInfo) { - return new Promise((resolve) => { - loginByUsername(userInfo.phone, userInfo.code).then(res => { - const data = res.data.data; - commit('SET_TOKEN', data); - commit('DEL_ALL_TAG'); - commit('CLEAR_LOCK'); - resolve(); - }) - }) - }, - GetUserInfo({ commit }) { - return new Promise((resolve, reject) => { - getUserInfo().then((res) => { - const data = res.data.data; - commit('SET_ROLES', data.roles); - resolve(data); - }).catch(err => { - reject(err); - }) - }) - }, - //刷新token - RefeshToken({ state, commit }) { - return new Promise((resolve, reject) => { - refeshToken(state.refeshToken).then(res => { - const data = res.data.data; - commit('SET_TOKEN', data); - resolve(data); - }).catch(error => { - reject(error) - }) - }) - }, - // 登出 - LogOut({ commit }) { - return new Promise((resolve, reject) => { - logout().then(() => { - commit('SET_TOKEN', '') - commit('SET_MENU', []) - commit('SET_ROLES', []) - commit('DEL_ALL_TAG'); - commit('CLEAR_LOCK'); - removeToken() - resolve() - }).catch(error => { - reject(error) - }) - }) - }, - //注销session - FedLogOut({ commit }) { - return new Promise(resolve => { - commit('SET_TOKEN', '') - commit('SET_MENU', []) - commit('SET_ROLES', []) - commit('DEL_ALL_TAG'); - commit('CLEAR_LOCK'); - removeToken() - resolve() - }) - }, - GetTopMenu() { - return new Promise(resolve => { - getTopMenu().then((res) => { - const data = res.data.data || [] - resolve(data) - }) - }) - }, - //获取系统菜单 - GetMenu({ commit, dispatch }, parentId) { - return new Promise(resolve => { - getMenu(parentId).then((res) => { - const data = res.data.data - let menu = deepClone(data); - menu.forEach(ele => { - addPath(ele, true); - }) - commit('SET_MENU', menu) - dispatch('GetButtons'); - resolve(menu) - }) - }) - }, + SET_REFRESH_TOKEN: (state, refreshToken) => { + setRefreshToken(refreshToken) + state.refreshToken = refreshToken; + setStore({name: 'refreshToken', content: state.refreshToken, type: 'session'}) }, - mutations: { - SET_TOKEN: (state, token) => { - setToken(token) - state.token = token; - setStore({ name: 'token', content: state.token, type: 'session' }) - }, - SET_USERIFNO: (state, userInfo) => { - state.userInfo = userInfo; - setStore({ name: 'userInfo', content: state.userInfo }) - }, - SET_MENU: (state, menu) => { - state.menu = menu - setStore({ name: 'menu', content: state.menu, type: 'session' }) - }, - SET_MENU_ALL: (state, menuAll) => { - state.menuAll = menuAll; - }, - SET_ROLES: (state, roles) => { - state.roles = roles; - }, - SET_PERMISSION: (state, permission) => { - let result = []; - function getCode(list) { - list.forEach(ele => { - if (typeof (ele) === 'object') { - const chiildren = ele.children; - const code = ele.code; - if (chiildren) { - getCode(chiildren) - } else { - result.push(code); - } - } + SET_USERIFNO: (state, userInfo) => { + state.userInfo = userInfo; + setStore({name: 'userInfo', content: state.userInfo}) + }, + SET_MENU: (state, menu) => { + state.menu = menu + setStore({name: 'menu', content: state.menu, type: 'session'}) + }, + SET_MENU_ALL: (state, menuAll) => { + state.menuAll = menuAll; + }, + SET_ROLES: (state, roles) => { + state.roles = roles; + }, + SET_PERMISSION: (state, permission) => { + let result = []; - }) + function getCode(list) { + list.forEach(ele => { + if (typeof (ele) === 'object') { + const chiildren = ele.children; + const code = ele.code; + if (chiildren) { + getCode(chiildren) + } else { + result.push(code); } - getCode(permission); - state.permission = {}; - result.forEach(ele => { - state.permission[ele] = true; - }); - setStore({ name: 'permission', content: state.permission, type: 'session' }) - } + } + + }) + } + + getCode(permission); + state.permission = {}; + result.forEach(ele => { + state.permission[ele] = true; + }); + setStore({name: 'permission', content: state.permission, type: 'session'}) } + } } export default user diff --git a/src/util/auth.js b/src/util/auth.js index 63c2222..5ffeb0f 100644 --- a/src/util/auth.js +++ b/src/util/auth.js @@ -1,5 +1,6 @@ import Cookies from 'js-cookie' const TokenKey = 'x-access-token' +const RefreshTokenKey = 'x-refresh-token' var inFifteenMinutes = new Date(new Date().getTime() + 120 * 60 * 1000); export function getToken() { return Cookies.get(TokenKey) @@ -9,6 +10,14 @@ export function setToken(token) { return Cookies.set(TokenKey, token, { expires: inFifteenMinutes }) } +export function getRefreshToken() { + return Cookies.get(RefreshTokenKey) +} + +export function setRefreshToken(token) { + return Cookies.set(RefreshTokenKey, token) +} + export function removeToken() { return Cookies.remove(TokenKey) -} \ No newline at end of file +} diff --git a/src/views/system/client.vue b/src/views/system/client.vue new file mode 100644 index 0000000..8320bb6 --- /dev/null +++ b/src/views/system/client.vue @@ -0,0 +1,273 @@ + + + + + diff --git a/vue.config.js b/vue.config.js index 7018ac1..ebfd9fe 100644 --- a/vue.config.js +++ b/vue.config.js @@ -1,5 +1,3 @@ -// 基础路径 注意发布之前要先修改这里 -let url = 'http://localhost:8800' module.exports = { lintOnSave: true, productionSourceMap: false, @@ -26,7 +24,7 @@ module.exports = { devServer: { proxy: { '/api': { - target: url, + target: 'http://localhost', ws: true, pathRewrite: { '^/api': '/'