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': '/'