zcloud-ui
Version:
A Component Library for Vue.js.
137 lines (134 loc) • 4.5 kB
JavaScript
/**
* axios interceptor 拦截器配置
*/
import NProgress from 'nprogress'; // Progress 进度条
import 'nprogress/nprogress.css'; // Progress 进度条 样式
// import qs from 'qs';序列化数据
import { Message } from 'element-ui';
import { Environment } from 'zcloud-ui/src/config/index';
import { codeResponse } from './ruleCode';
class Interceptor {
constructor ({ TimeOut, axios }) {
this.axios = axios;
this.req = {
timeout: TimeOut
}; // 防止同个链接连续请求
this.request();
this.response();
}
// isBrowser () {
// return process.client;
// }
requestTimeout (name, time) {
setTimeout(() => {
if (this.req[name]) {
delete this.req[name];
}
}, time || this.req.timeout);
}
// 对请求数据做些什么
request () {
this.axios.interceptors.request.use((request) => {
request.urlGuid = request.url; // 防止同个链接连续请求
// 本地
if (~request.url.indexOf('.json')) {
request.method = 'GET';
request.url = '/data/' + request.url;
// 线上
} else if (request.headers.ignoreRepeat || !this.req[request.urlGuid]) {
request.url = request.url.includes('http') ? request.url : (Environment.REQUEST_URL + request.url);
this.req[request.urlGuid] = true;
this.requestTimeout(request.urlGuid, request.timeout);
this.cancel(request);
} else if (this.req[request.urlGuid]) {
return Promise.reject('重复请求' + request.url);
}
NProgress.start();
return request;
}, (error) => Promise.reject(error));
}
// 超时处理
cancel (request) {
request.timer = setTimeout(() => {
NProgress.done();
delete this.req[request.urlGuid]; // 防止同个链接连续请求
if (!request.headers.ignoreError) {
Message.error({
showClose: true,
message: '请求超时,请稍后再试',
customClass: 'yl-fix-mask'
});
}
request.cancel();
}, request.timeout);
}
isAppDo (item, response) {
if (item.show) {//eslint-disable-line
if (window.localStorage.getItem('comeform') === 'app') {
console.log('isApp = true', response.data);
response.data.isApp = true;
} else {
Message.error({
showClose: true,
message: item.show.msg || `${response.data.msg}`,
customClass: 'zl-fix-mask'
});
item.show.clear ? sessionStorage.clear() : '';
setTimeout(() => {
item.show.href ? window.location.href = item.show.href() : '';
}, 1500);
}
}
return response.data;
}
// 对响应数据做点什么
response () {
this.axios.interceptors.response.use((response) => {
clearTimeout(response.config.timer);
NProgress.done();
delete this.req[response.config.urlGuid]; // 防止同个链接连续请求
if (response.data) {
for (const item of codeResponse) {
if (item.code.includes(response.data.code)) {
if (item.success) {
// 为 omp特殊处理
return ((Environment.PLATFORM === 'OMP' && !response.config.headers.inside) || response.config.headers.returnAll) ? response.data : response.data.result || response.data.data;
} else {
// 针对app 如果是app进入的页面 localStoragec存储字段 comeform='app'
// 如果token失效 则不跳转sso 直接根据抛出的异常来判断与原生交互
return Promise.reject(this.isAppDo(item, response));
}
}
}
if (!(response.config.headers && response.config.headers.ignoreError)) {
Message.error({
showClose: true,
message: `${response.data.msg}`,
customClass: 'zl-fix-mask'
});
}
return Promise.reject(this.formatResponseData(response));
}
return response;
}, (error) => {
NProgress.done();
return Promise.reject(error);
});
}
formatResponseData (response) {
let responsex = {}, apiCode = response.config.url;
try {
responsex = {
api: apiCode,
req: JSON.parse(response.config.data || {}),
res: response.data,
reqStr: response.config.data,
resStr: JSON.stringify(response.data || {})
};
} catch (error) {
responsex = {};
}
return responsex;
}
}
export default Interceptor;