import axios from 'axios'; // 引入axios
|
//import QS from 'qs'; // 引入qs模块,用来序列化post类型的数据,后面会提到
|
|
import { Toast, Dialog } from 'vant';
|
import store from "@/store/index";
|
import i18n from '@/i18n';
|
import router from '@/router/router'
|
import { signatureGenerate } from "@/utils/signatureUtil"
|
class AxiosRequest {
|
/**
|
* @description Class AxiosRequest constructor.
|
* @param {String} baseUrl Request base url.
|
* @param {Object} headers Request headers config.
|
* @param {Boolean} isLoading Request loading switch.
|
*/
|
constructor(baseUrl, headers, isLoading) {
|
this.baseUrl = baseUrl;
|
this.headers = headers;
|
this.isLoading = isLoading;
|
this.queue = {};
|
}
|
|
/**
|
* @description Get inside config.
|
* @returns Inside config.
|
*/
|
getInsideConfig() {
|
const config = {
|
// alert: Axios default base url param is "baseURL" not is "baseUrl" !
|
baseURL: this.baseUrl,
|
headers: this.headers,
|
timeout: 10000
|
}
|
return config;
|
}
|
|
/**
|
* @description Destroy completed request.
|
* @param {String} url The completed request.
|
*/
|
destroy(url) {
|
delete this.queue[url];
|
if (!Object.keys(this.queue).length) {
|
// Present request complete.
|
// Remove request loading.
|
if (this.isLoading) {
|
Toast.clear();
|
}
|
}
|
}
|
|
/**
|
* @description The axios intercept.
|
* @param {Function} instance Create axios get instance.
|
* @param {String} url Request url.
|
*/
|
interceptors(instance, url) {
|
// Request intercept.
|
instance.interceptors.request.use(
|
config => {
|
var token = store.state.user.userInfo.token
|
if (token) {
|
if (!config.params) {
|
config.params = {}
|
}
|
config.params.token = token;
|
// console.log(config)
|
// const METHOD = config.method.toUpperCase()
|
// if (METHOD === 'GET') {
|
// if (!config.params) {
|
// config.params = {}
|
// }
|
// config.params.token = token;
|
// } else if(METHOD === 'POST') {
|
// if (!config.data) {
|
// config.data = {}
|
// }
|
// config.data.token = token
|
// } else {
|
// // TODO
|
// }
|
}
|
if (!Object.keys(this.queue).length) {
|
if (this.isLoading) {
|
// Add request loading.
|
Toast.loading({
|
duration: 0,
|
forbidClick: true,
|
loadingType: "spinner",
|
message: i18n.t('加载中...')
|
});
|
}
|
this.queue[url] = true;
|
}
|
// 获取请求头参数
|
const { timestamp, signature } = signatureGenerate()
|
// 分别将签名、时间戳 至请求头
|
if (signature) config.headers["sign"] = signature
|
if (timestamp) config.headers["tissuePaper"] = timestamp
|
return config;
|
},
|
error => {
|
if (this.isLoading) {
|
Toast.clear();
|
}
|
return Promise.reject(error);
|
}
|
);
|
// Response intercept.
|
instance.interceptors.response.use(
|
result => {
|
this.destroy(url);
|
if (result.data.code == 0||result.data.code == 200) {
|
return result.data;
|
} else if (result.data.code == 401) {
|
Dialog.confirm({
|
confirmButtonText: i18n.t('确定'),
|
cancelButtonText: i18n.t('取消'),
|
title: i18n.t('提示'),
|
message: i18n.t('未实名认证,是否认证?'),
|
beforeClose: (action, done) => {
|
if (action === 'confirm') {
|
done();
|
router.push({
|
path: '/authentication'
|
});
|
} else {
|
done();
|
}
|
},
|
});
|
return result.data;
|
} else if (result.data.code == 403) {
|
router.replace({
|
path: '/login',
|
query: {
|
redirect: router.currentRoute.fullPath
|
}
|
});
|
store.commit('user/SET_OUT');
|
} else {
|
if (result.data.msg != undefined) { Toast(i18n.t(result.data.msg)); }
|
return Promise.reject(result.data);
|
}
|
},
|
error => {
|
if (this.isLoading) {
|
Toast.clear();
|
}
|
if (error.code == 'ERR_NETWORK') {
|
Toast({ message: 'ERR_NETWORK', type: 'fail', duration: 1000 })
|
} else if (error.code == 'ECONNABORTED') {
|
//Toast({ message: 'Network Timeout', type: 'fail', duration: 2000 })
|
return Promise.reject(error);
|
}
|
// if (error.message.includes("timeout")) {
|
// Toast.fail(i18n.t("网络超时!"));
|
// }
|
return Promise.reject(error);
|
}
|
);
|
}
|
|
/**
|
* @description Axios request function.
|
* @param {Object} options Axios request options.
|
* @returns Create axios get instance.
|
*/
|
request(options) {
|
const instance = axios.create();
|
options = Object.assign(this.getInsideConfig(), options);
|
this.interceptors(instance, options.url);
|
return instance(options);
|
}
|
}
|
|
export default AxiosRequest;
|