import axios from 'axios';
|
import config from '/config';
|
import {deepEncode, decode} from '@/utils/tools.js';
|
import {ElNotification, ElMessage} from 'element-plus';
|
|
import {auth} from '@/plugins';
|
import cache from '@/utils/cache';
|
|
import store from '@/store';
|
|
import {useAppStore} from '@/store/modules';
|
|
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
|
|
/**
|
* 创建axios实例
|
* @type {axios.AxiosInstance}
|
*/
|
const service = axios.create({
|
/**
|
* axios中请求配置有baseURL选项,表示请求URL公共部分
|
*/
|
baseURL: import.meta.env.MODE === 'development' ? config.localUrl : config.baseUrl,
|
/**
|
* 超时
|
*/
|
timeout: 1000 * 64
|
})
|
|
// request拦截器
|
service.interceptors.request.use(config => {
|
const appStore = useAppStore(store);
|
|
const {headers, method, url} = config;
|
|
appStore.setLoading(url, true);
|
|
/**
|
* 让每个请求携带自定义token 请根据实际情况自行修改
|
* @type {string}
|
*/
|
headers['Authorization'] = 'Bearer ' + auth.getToken();
|
|
/**
|
* get
|
*/
|
const params = config.params || {}
|
params.userId = auth.getToken();
|
config.params = params;
|
|
/**
|
* post put
|
*/
|
if (method === 'post' || method === 'put') {
|
const data = config.data || {};
|
data.userId = auth.getToken();
|
data.token = auth.getToken();
|
|
config.data = typeof data === 'object' ? deepEncode(data) : data;
|
|
const options = config.options || {};
|
|
/**
|
* 幂等性
|
*/
|
if (options.idempotent) {
|
const requestObj = {
|
url, data: typeof data === 'object' ? JSON.stringify(deepEncode(data)) : data, time: new Date().getTime()
|
}
|
/**
|
* 请求数据大小
|
* @type {number}
|
*/
|
const requestSize = Object.keys(JSON.stringify(requestObj)).length;
|
/**
|
* 限制存放数据5M
|
* @type {number}
|
*/
|
const limitSize = 5 * 1024 * 1024;
|
if (requestSize >= limitSize) {
|
console.warn(`[${url}]: ` + '请求数据大小超出允许的5M限制,无法进行防重复提交验证。')
|
return config;
|
}
|
const sessionObj = cache.session.getJSON('sessionObj');
|
|
if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
|
cache.session.setJSON('sessionObj', requestObj)
|
|
} else {
|
|
const s_url = sessionObj.url; // 请求地址
|
const s_data = sessionObj.data; // 请求数据
|
const s_time = sessionObj.time; // 请求时间
|
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
|
if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
|
const message = '数据正在处理,请勿重复提交';
|
console.error(`[${s_url}]: ` + message)
|
// return Promise.reject(new Error(message))
|
} else {
|
cache.session.setJSON('sessionObj', requestObj)
|
}
|
}
|
}
|
}
|
return config
|
}, error => {
|
console.log(error)
|
Promise.reject(error)
|
})
|
|
// 响应拦截器
|
service.interceptors.response.use(result => {
|
const appStore = useAppStore(store);
|
const {config} = result;
|
const {url} = config;
|
appStore.setLoading(url, false);
|
|
if (config.responseType === 'blob') {
|
return result;
|
}
|
|
if (typeof result.data === 'string') {
|
result.data = JSON.parse(result.data.replace(/[\t\r\n]/g, ''));
|
}
|
|
const {data} = result;
|
const options = config.options || {};
|
const {success, messages} = data;
|
if (!success) {
|
if (options.failMessage) {
|
ElNotification.error({title: options.failMessage});
|
}
|
if (messages === 'string' && messages) {
|
ElNotification.error({title: messages});
|
} else {
|
messages.list.forEach(({level, message}) => {
|
// if (level === 'Error') {
|
ElNotification.error({title: decode(message)});
|
// }
|
});
|
}
|
return Promise.reject(data);
|
}
|
if (options.successMessage) {
|
ElNotification.success(options.successMessage);
|
}
|
return data;
|
}, error => {
|
console.log('err' + error)
|
let {message} = error;
|
if (message == "Network Error") {
|
message = "后端接口连接异常";
|
} else if (message.includes("timeout")) {
|
message = "系统接口请求超时";
|
} else if (message.includes("Request failed with status code")) {
|
message = "系统接口" + message.substr(message.length - 3) + "异常";
|
}
|
ElMessage({message})
|
return Promise.reject(error)
|
})
|
export default service
|