👌 安排oauth2模块

pull/59/head
smallchill 7 years ago
parent 7b7d08db01
commit 5ad248e418
  1. 55
      package-lock.json
  2. 3
      package.json
  3. 50
      src/api/system/client.js
  4. 27
      src/api/user.js
  5. 5
      src/config/website.js
  6. 12
      src/page/index/index.vue
  7. 7
      src/page/login/userlogin.vue
  8. 5
      src/router/axios.js
  9. 25
      src/store/modules/user.js
  10. 9
      src/util/auth.js
  11. 273
      src/views/system/client.vue
  12. 4
      vue.config.js

55
package-lock.json generated

@ -2713,7 +2713,8 @@
"version": "4.6.0", "version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
"dev": true "dev": true,
"optional": true
}, },
"coa": { "coa": {
"version": "2.0.2", "version": "2.0.2",
@ -4851,7 +4852,8 @@
"ansi-regex": { "ansi-regex": {
"version": "2.1.1", "version": "2.1.1",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"aproba": { "aproba": {
"version": "1.2.0", "version": "1.2.0",
@ -4872,12 +4874,14 @@
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.11", "version": "1.1.11",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"balanced-match": "^1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@ -4892,17 +4896,20 @@
"code-point-at": { "code-point-at": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"console-control-strings": { "console-control-strings": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"core-util-is": { "core-util-is": {
"version": "1.0.2", "version": "1.0.2",
@ -5019,7 +5026,8 @@
"inherits": { "inherits": {
"version": "2.0.3", "version": "2.0.3",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"ini": { "ini": {
"version": "1.3.5", "version": "1.3.5",
@ -5031,6 +5039,7 @@
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"number-is-nan": "^1.0.0" "number-is-nan": "^1.0.0"
} }
@ -5045,6 +5054,7 @@
"version": "3.0.4", "version": "3.0.4",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
@ -5052,12 +5062,14 @@
"minimist": { "minimist": {
"version": "0.0.8", "version": "0.0.8",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"minipass": { "minipass": {
"version": "2.3.5", "version": "2.3.5",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"safe-buffer": "^5.1.2", "safe-buffer": "^5.1.2",
"yallist": "^3.0.0" "yallist": "^3.0.0"
@ -5076,6 +5088,7 @@
"version": "0.5.1", "version": "0.5.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"minimist": "0.0.8" "minimist": "0.0.8"
} }
@ -5156,7 +5169,8 @@
"number-is-nan": { "number-is-nan": {
"version": "1.0.1", "version": "1.0.1",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
@ -5168,6 +5182,7 @@
"version": "1.4.0", "version": "1.4.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"wrappy": "1" "wrappy": "1"
} }
@ -5253,7 +5268,8 @@
"safe-buffer": { "safe-buffer": {
"version": "5.1.2", "version": "5.1.2",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"safer-buffer": { "safer-buffer": {
"version": "2.1.2", "version": "2.1.2",
@ -5289,6 +5305,7 @@
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"code-point-at": "^1.0.0", "code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0", "is-fullwidth-code-point": "^1.0.0",
@ -5308,6 +5325,7 @@
"version": "3.0.1", "version": "3.0.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"ansi-regex": "^2.0.0" "ansi-regex": "^2.0.0"
} }
@ -5351,12 +5369,14 @@
"wrappy": { "wrappy": {
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"yallist": { "yallist": {
"version": "3.0.3", "version": "3.0.3",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
} }
} }
}, },
@ -6557,8 +6577,7 @@
"js-base64": { "js-base64": {
"version": "2.5.1", "version": "2.5.1",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz",
"integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw=="
"dev": true
}, },
"js-cookie": { "js-cookie": {
"version": "2.2.0", "version": "2.2.0",
@ -6732,6 +6751,7 @@
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
"integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"prelude-ls": "~1.1.2", "prelude-ls": "~1.1.2",
"type-check": "~0.3.2" "type-check": "~0.3.2"
@ -8746,7 +8766,8 @@
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
"dev": true "dev": true,
"optional": true
}, },
"prettier": { "prettier": {
"version": "1.16.3", "version": "1.16.3",
@ -9448,7 +9469,8 @@
"version": "4.0.8", "version": "4.0.8",
"resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
"integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
"dev": true "dev": true,
"optional": true
}, },
"rx-lite-aggregates": { "rx-lite-aggregates": {
"version": "4.0.8", "version": "4.0.8",
@ -10834,6 +10856,7 @@
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
"integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"prelude-ls": "~1.1.2" "prelude-ls": "~1.1.2"
} }

@ -23,7 +23,8 @@
"vue-axios": "^2.1.2", "vue-axios": "^2.1.2",
"vue-i18n": "^8.7.0", "vue-i18n": "^8.7.0",
"vue-router": "^3.0.1", "vue-router": "^3.0.1",
"vuex": "^3.0.1" "vuex": "^3.0.1",
"js-base64": "^2.5.1"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "^3.1.1", "@vue/cli-plugin-babel": "^3.1.1",

@ -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
})
}

@ -1,17 +1,31 @@
import request from '@/router/axios'; import request from '@/router/axios';
import {baseUrl} from '@/config/env'; import {baseUrl} from '@/config/env';
export const loginByUsername = (tenantCode, account, password, type) => request({ export const loginByUsername = (tenantCode, username, password, type) => request({
url: '/api/blade-auth/token', url: '/api/blade-auth/oauth/token',
method: 'post', method: 'post',
headers: {
'Tenant-Code': tenantCode
},
params: { params: {
tenantCode, username,
account,
password, password,
grant_type: "password",
scope: "all",
type 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({ export const getButtons = () => request({
url: '/api/blade-system/menu/buttons', url: '/api/blade-system/menu/buttons',
method: 'get' method: 'get'
@ -22,11 +36,6 @@ export const getUserInfo = () => request({
method: 'get' method: 'get'
}); });
export const refeshToken = () => request({
url: baseUrl + '/user/refesh',
method: 'post'
})
export const getMenu = () => request({ export const getMenu = () => request({
url: '/api/blade-system/menu/routes', url: '/api/blade-system/menu/routes',
method: 'get' method: 'get'

@ -6,8 +6,11 @@ export default {
logo: "S", logo: "S",
key: 'saber',//配置主键,目前用于存储 key: 'saber',//配置主键,目前用于存储
indexTitle: 'Saber Admin', indexTitle: 'Saber Admin',
clientId: 'saber', // 客户端id
clientSecret: 'saber_secret', // 客户端密钥
tenantMode: true, // 是否开启租户模式
lockPage: '/lock', lockPage: '/lock',
tokenTime: 6000, tokenTime: 1500,
//http的status默认放行不才用统一处理的, //http的status默认放行不才用统一处理的,
statusWhiteList: [], statusWhiteList: [],
//配置首页不可关闭 //配置首页不可关闭

@ -83,16 +83,10 @@ export default {
}, 0); }, 0);
}; };
}, },
// 10token // token
refreshToken() { refreshToken() {
/*this.refreshTime = setInterval(() => { /*this.refreshTime = setInterval(() => {
const token = getStore({ if (!this.refreshLock) {
name: "token",
debug: true
});
const date = calcDate(token.datetime, new Date().getTime());
if (validatenull(date)) return;
if (!(date.seconds >= this.website.tokenTime) && !this.refreshLock) {
this.refreshLock = true; this.refreshLock = true;
this.$store this.$store
.dispatch("RefeshToken") .dispatch("RefeshToken")
@ -103,7 +97,7 @@ export default {
this.refreshLock = false; this.refreshLock = false;
}); });
} }
}, 10000);*/ }, this.website.tokenTime * 1000);*/
} }
} }
}; };

@ -5,7 +5,7 @@
ref="loginForm" ref="loginForm"
:model="loginForm" :model="loginForm"
label-width="0"> label-width="0">
<el-form-item prop="tenantCode"> <el-form-item v-if="tenantMode" prop="tenantCode">
<el-input size="small" <el-input size="small"
@keyup.enter.native="handleLogin" @keyup.enter.native="handleLogin"
v-model="loginForm.tenantCode" v-model="loginForm.tenantCode"
@ -50,10 +50,13 @@
<script> <script>
import { mapGetters } from "vuex"; import { mapGetters } from "vuex";
import website from '@/config/website';
export default { export default {
name: "userlogin", name: "userlogin",
data() { data() {
return { return {
tenantMode: website.tenantMode,
loginForm: { loginForm: {
tenantCode: "000000", tenantCode: "000000",
username: "admin", username: "admin",
@ -62,7 +65,7 @@ export default {
}, },
loginRules: { loginRules: {
tenantCode: [ tenantCode: [
{ required: true, message: "请输入租户编号", trigger: "blur" } { required: false, message: "请输入租户编号", trigger: "blur" }
], ],
username: [ username: [
{ required: true, message: "请输入用户名", trigger: "blur" } { required: true, message: "请输入用户名", trigger: "blur" }

@ -14,6 +14,8 @@ import { Message } from 'element-ui'
import website from '@/config/website'; import website from '@/config/website';
import NProgress from 'nprogress' // progress bar import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style import 'nprogress/nprogress.css' // progress bar style
import {Base64} from 'js-base64';
axios.defaults.timeout = 10000; axios.defaults.timeout = 10000;
//返回其他状态吗 //返回其他状态吗
axios.defaults.validateStatus = function (status) { axios.defaults.validateStatus = function (status) {
@ -30,8 +32,9 @@ axios.interceptors.request.use(config => {
NProgress.start() // start progress bar NProgress.start() // start progress bar
const meta = (config.meta || {}); const meta = (config.meta || {});
const isToken = meta.isToken === false; const isToken = meta.isToken === false;
config.headers['Authorization'] = `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`;
if (getToken() && !isToken) { if (getToken() && !isToken) {
config.headers['blade-auth'] = 'Bearer ' + getToken() // 让每个请求携带token--['Authorization']为自定义key 请根据实际情况自行修改 config.headers['Blade-Auth'] = 'bearer ' + getToken() // 让每个请求携带token--['Authorization']为自定义key 请根据实际情况自行修改
} }
//headers中配置serialize为true开启序列化 //headers中配置serialize为true开启序列化
if (config.method === 'post' && meta.isSerialize === true) { if (config.method === 'post' && meta.isSerialize === true) {

@ -1,4 +1,4 @@
import { setToken, removeToken } from '@/util/auth' import {setToken, setRefreshToken, removeToken} from '@/util/auth'
import {setStore, getStore} from '@/util/store' import {setStore, getStore} from '@/util/store'
import {isURL, validatenull} from '@/util/validate' import {isURL, validatenull} from '@/util/validate'
import {deepClone} from '@/util/util' import {deepClone} from '@/util/util'
@ -28,6 +28,7 @@ function addPath(ele, first) {
} }
} }
const user = { const user = {
state: { state: {
userInfo: getStore({name: 'userInfo'}) || [], userInfo: getStore({name: 'userInfo'}) || [],
@ -36,14 +37,16 @@ const user = {
menu: getStore({name: 'menu'}) || [], menu: getStore({name: 'menu'}) || [],
menuAll: [], menuAll: [],
token: getStore({name: 'token'}) || '', token: getStore({name: 'token'}) || '',
refreshToken: getStore({name: 'refreshToken'}) || '',
}, },
actions: { actions: {
//根据用户名登录 //根据用户名登录
LoginByUsername({commit}, userInfo) { LoginByUsername({commit}, userInfo) {
return new Promise((resolve) => { return new Promise((resolve) => {
loginByUsername(userInfo.tenantCode, userInfo.username, userInfo.password, userInfo.type).then(res => { loginByUsername(userInfo.tenantCode, userInfo.username, userInfo.password, userInfo.type).then(res => {
const data = res.data.data; const data = res.data;
commit('SET_TOKEN', data.accessToken); commit('SET_TOKEN', data.access_token);
commit('SET_REFRESH_TOKEN', data.refresh_token);
commit('SET_USERIFNO', data); commit('SET_USERIFNO', data);
commit('DEL_ALL_TAG'); commit('DEL_ALL_TAG');
commit('CLEAR_LOCK'); commit('CLEAR_LOCK');
@ -86,10 +89,11 @@ const user = {
//刷新token //刷新token
RefeshToken({state, commit}) { RefeshToken({state, commit}) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
refeshToken(state.refeshToken).then(res => { refeshToken(state.refreshToken).then(res => {
const data = res.data.data; const data = res.data;
commit('SET_TOKEN', data); commit('SET_TOKEN', data.access_token);
resolve(data); commit('SET_REFRESH_TOKEN', data.refresh_token);
resolve();
}).catch(error => { }).catch(error => {
reject(error) reject(error)
}) })
@ -153,6 +157,11 @@ const user = {
state.token = token; state.token = token;
setStore({name: 'token', content: state.token, type: 'session'}) setStore({name: 'token', content: state.token, type: 'session'})
}, },
SET_REFRESH_TOKEN: (state, refreshToken) => {
setRefreshToken(refreshToken)
state.refreshToken = refreshToken;
setStore({name: 'refreshToken', content: state.refreshToken, type: 'session'})
},
SET_USERIFNO: (state, userInfo) => { SET_USERIFNO: (state, userInfo) => {
state.userInfo = userInfo; state.userInfo = userInfo;
setStore({name: 'userInfo', content: state.userInfo}) setStore({name: 'userInfo', content: state.userInfo})
@ -169,6 +178,7 @@ const user = {
}, },
SET_PERMISSION: (state, permission) => { SET_PERMISSION: (state, permission) => {
let result = []; let result = [];
function getCode(list) { function getCode(list) {
list.forEach(ele => { list.forEach(ele => {
if (typeof (ele) === 'object') { if (typeof (ele) === 'object') {
@ -183,6 +193,7 @@ const user = {
}) })
} }
getCode(permission); getCode(permission);
state.permission = {}; state.permission = {};
result.forEach(ele => { result.forEach(ele => {

@ -1,5 +1,6 @@
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
const TokenKey = 'x-access-token' const TokenKey = 'x-access-token'
const RefreshTokenKey = 'x-refresh-token'
var inFifteenMinutes = new Date(new Date().getTime() + 120 * 60 * 1000); var inFifteenMinutes = new Date(new Date().getTime() + 120 * 60 * 1000);
export function getToken() { export function getToken() {
return Cookies.get(TokenKey) return Cookies.get(TokenKey)
@ -9,6 +10,14 @@ export function setToken(token) {
return Cookies.set(TokenKey, token, { expires: inFifteenMinutes }) 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() { export function removeToken() {
return Cookies.remove(TokenKey) return Cookies.remove(TokenKey)
} }

@ -0,0 +1,273 @@
<template>
<basic-container>
<avue-crud :option="option"
:data="data"
:page="page"
@row-del="rowDel"
v-model="form"
:permission="permissionList"
@row-update="rowUpdate"
@row-save="rowSave"
:before-open="beforeOpen"
@search-change="searchChange"
@search-reset="searchReset"
@selection-change="selectionChange"
@on-load="onLoad">
<template slot="menuLeft">
<el-button type="danger"
size="small"
icon="el-icon-delete"
plain
v-if="permission.client_delete"
@click="handleDelete">
</el-button>
</template>
</avue-crud>
</basic-container>
</template>
<script>
import {getList, getDetail, add, update, remove} from "@/api/system/client";
import {mapGetters} from "vuex";
export default {
data() {
return {
form: {},
page: {
pageSize: 10,
currentPage: 1,
total: 0
},
selectionList: [],
option: {
tip: false,
border: true,
index: true,
viewBtn: true,
selection: true,
column: [
{
label: "应用id",
prop: "clientId",
search: true,
rules: [{
required: true,
message: "请输入客户端id",
trigger: "blur"
}]
},
{
label: "应用密钥",
prop: "clientSecret",
search: true,
rules: [{
required: true,
message: "请输入客户端密钥",
trigger: "blur"
}]
},
{
label: "授权类型",
prop: "authorizedGrantTypes",
valueDefault: "refresh_token,password,authorization_code",
rules: [{
required: true,
message: "请输入授权类型",
trigger: "blur"
}]
},
{
label: "授权范围",
prop: "scope",
valueDefault: "all",
rules: [{
required: true,
message: "请输入授权范围",
trigger: "blur"
}]
},
{
label: "令牌秒数",
prop: "accessTokenValidity",
type: "number",
valueDefault: 3600,
rules: [{
required: true,
message: "请输入令牌过期秒数",
trigger: "blur"
}]
},
{
label: "刷新秒数",
prop: "refreshTokenValidity",
type: "number",
valueDefault: 604800,
hide: true,
rules: [{
required: true,
message: "请输入刷新令牌过期秒数",
trigger: "blur"
}]
},
{
label: "回调地址",
prop: "webServerRedirectUri",
hide: true,
rules: [{
required: true,
message: "请输入回调地址",
trigger: "blur"
}]
},
{
label: "资源集合",
prop: "resourceIds",
hide: true,
rules: [{
message: "请输入资源集合",
trigger: "blur"
}]
},
{
label: "权限",
prop: "authorities",
hide: true,
rules: [{
message: "请输入权限",
trigger: "blur"
}]
},
{
label: "自动授权",
prop: "autoapprove",
hide: true,
rules: [{
message: "请输入自动授权",
trigger: "blur"
}]
},
{
label: "附加说明",
hide: true,
prop: "additionalInformation",
span: 24,
rules: [{
message: "请输入附加说明",
trigger: "blur"
}]
},
]
},
data: []
};
},
computed: {
...mapGetters(["permission"]),
permissionList() {
return {
addBtn: this.vaildData(this.permission.client_add),
viewBtn: this.vaildData(this.permission.client_view),
delBtn: this.vaildData(this.permission.client_delete),
editBtn: this.vaildData(this.permission.client_edit)
};
},
ids() {
let ids = [];
this.selectionList.forEach(ele => {
ids.push(ele.id);
});
return ids.join(",");
}
},
methods: {
rowSave(row, loading) {
add(row).then(() => {
loading();
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
});
},
rowUpdate(row, index, loading) {
update(row).then(() => {
loading();
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
});
},
rowDel(row) {
this.$confirm("确定将选择数据删除?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
return remove(row.id);
})
.then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
});
},
searchReset() {
this.onLoad(this.page);
},
searchChange(params) {
this.onLoad(this.page, params);
},
selectionChange(list) {
this.selectionList = list;
},
handleDelete() {
if (this.selectionList.length === 0) {
this.$message.warning("请选择至少一条数据");
return;
}
this.$confirm("确定将选择数据删除?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
return remove(this.ids);
})
.then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
this.$refs.crud.toggleSelection();
});
},
beforeOpen(done, type) {
if (["edit", "view"].includes(type)) {
getDetail(this.form.id).then(res => {
this.form = res.data.data;
});
}
done();
},
onLoad(page, params = {}) {
getList(page.currentPage, page.pageSize, params).then(res => {
const data = res.data.data;
this.page.total = data.total;
this.data = data.records;
});
}
}
};
</script>
<style>
</style>

@ -1,5 +1,3 @@
// 基础路径 注意发布之前要先修改这里
let url = 'http://localhost:8800'
module.exports = { module.exports = {
lintOnSave: true, lintOnSave: true,
productionSourceMap: false, productionSourceMap: false,
@ -26,7 +24,7 @@ module.exports = {
devServer: { devServer: {
proxy: { proxy: {
'/api': { '/api': {
target: url, target: 'http://localhost',
ws: true, ws: true,
pathRewrite: { pathRewrite: {
'^/api': '/' '^/api': '/'

Loading…
Cancel
Save