import { extend } from 'umi-request';
import router from 'umi/router';
import { message } from 'antd';
import { invokeBucLogin } from '@/utils/utils';
message.config({
maxCount: 1,
duration: 1,
});
const codeMessage: any = {
200: '服务器成功返回请求的数据。',
201: '新建或修改数据成功。',
202: '一个请求已经进入后台排队(异步任务)。',
204: '删除数据成功。',
400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
401: '用户没有权限(令牌、用户名、密码错误)。',
403: '用户得到授权,但是访问是被禁止的。',
404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
406: '请求的格式不可得。',
410: '请求的资源被永久删除,且不会再得到的。',
422: '当创建一个对象时,发生一个验证错误。',
500: '服务器发生错误,请检查服务器。',
502: '网关错误。',
503: '服务不可用,服务器暂时过载或维护。',
504: '网关超时。',
ADC100006: 'access_token即将过期,请换取最新的token!',
ADC00000: '系统异常',
ADC00005: '参数不合法',
ADC00017: '数据字段超长',
ADC00019: '修改了其他ChangeList的数据',
ADC00028: '没有用户登录',
ADC00032: '任务还在运行中',
ADC00035: '已经灰度发布或已上线',
ADC00036: '数据已存在,不允许重复插入',
ADC00037: '文件不存在',
ADC00068: '数据别名不允许重复!',
ADC00040: '文件上传失败!',
ADC00041: '文件下载错误!',
ADC00042: '文件大小超过限制!',
ADC000067: '申请流程异常!',
ADC00066: '项目名称已存在!',
ADC00043: '项目已立项,不允许二次立项!',
ADC00044: '模型未处理,请联系管理员!',
ADC00045: '工时已超出每日上限,请检查!',
ADC00046: '结项申请已提交,请勿重复提交!',
ADC00047: '您无权限查看该流程!',
ADC00048: '项目未立项,无法挂起!',
ADC00049: '项目立项审批中,无法挂起!',
ADC00050: '项目已挂起!',
ADC00051: '项目已结项,无法挂起!',
ADC00052: '项目已废弃,无法挂起!',
ADC00053: '项目非挂起中,无法重启!',
ADC00054: '项目未立项,无法结项!',
ADC00055: '项目立项审批中,无法结项!',
ADC00056: '项目已挂起,无法结项!',
ADC00057: '项目已结项!',
ADC00058: '项目已废弃,无法结项!',
ADC00059: '项目已废弃!',
ADC00060: '不存在相关流程!',
ADC00061: '不允许重复绑定!',
ADC00065: '当前租户未配置审批流程!',
ADC00062: '您不是管理员,无法转交其他用户的审批任务!',
ADC00063: '您不是管理员,无法终止其他用户的工作流!',
ADC00064: '交付任务已存在!',
ADC100001: 'access_token已过期,请重新登录!',
ADC100002: 'refresh_token已过期,请重新登录!',
ADC100003: '无登录信息,请登录!',
ADC100004: '登录异常,请联系管理员!',
ADC100005: '无租户信息,请申请绑定租户流程!',
};
// 当正在刷新Token时,后续所有继续发来的accessToken失效的请求都应该被缓存到数组requestsCache中,直到Token刷新结束再重发请求
let isRefreshingTokenLock = false;
let _cacheRequest: any = [];
/**
* 异常处理程序
*/
const errorHandler = (error: { response: Response }): Response => {
const { response } = error;
message.error(response?.statusText || '您的网络发生异常,无法连接服务器');
return response;
};
/**
* 响应code异常处理程序
*/
const codeHandler = async (response: { code: number | string; msg: string; success: any }) => {
const { pathname } = window.location;
const { code, msg, success } = response;
if (code === 1000) {
message.error(msg);
localStorage.clear();
if (!(pathname.indexOf('login') > -1)) {
router.push(`/login?redirect=${encodeURIComponent(pathname)}`);
}
return;
}
if (code === 403 || code === 'ADC00047') {
// ADC00047流程访问无权限
router.push('/exception/403');
return;
}
if (code <= 504 && code >= 500) {
router.push('/exception/500');
return;
}
if (code >= 404 && code < 422) {
router.push('/exception/404');
return;
}
if (code === 'ADC100004') {
message.error('登录异常,请联系管理员!');
router.push(`/login?redirect=${encodeURIComponent(pathname)}`);
return;
}
if (code === 'ADC100003' || code === 'ADC100001' || code === 'ADC100002') {
// 失效无登陆去第三方登陆
invokeBucLogin(window.location.href);
return;
}
if (!success) {
if (code !== 'ADC100006') {
const codeText = codeMessage[code] || msg;
message.error(codeText);
}
}
};
const request = extend({
prefix: process.env.NODE_ENV === 'development' ? '/apis/adc' : '/adc',
errorHandler, // 默认错误处理,请求已发送但服务端返回状态码非 2xx 的响应
credentials: 'include',
});
request.interceptors.request.use((url, options: any) => {
console.log(url);
const { headers, requestType, data } = options;
const token = window.localStorage.getItem('accessToken');
!!token && (headers.accessToken = token);
if (requestType === 'form' && !(data instanceof FormData)) {
const filedata = new FormData();
filedata.append('param', JSON.stringify(data));
options.data = filedata;
}
return {
options: { ...options, headers },
};
});
request.interceptors.response.use(async (response: any, options: any): Promise<any> => {
if (options.responseType === 'blob') {
return response;
}
const data = await response.clone().json();
if (data.code !== 'ADC100006') {
codeHandler(data);
return response;
}
if (isRefreshingTokenLock === true) {
// 表示正在执行刷新Token时还没有新token时别的请求正在返回在这里做拦截存起来
if (response.url.indexOf('/auth/refreshToken/') == -1) {
const promise = new Promise((resolve) => {
_cacheRequest.push(() => {
resolve(retry(response.url, options));
});
});
return promise;
}
}
if (isRefreshingTokenLock === false) {
// 首个接口发现token过期去请求换取新token,此时别的请求也可能同时携带旧token需缓存
if (data.code === 'ADC100006') {
// 设置节流阀,表示正在执行刷新Token时
isRefreshingTokenLock = true;
// 续token
const { success, resultData } = await postRefreshToken();
// 当获取刷新令牌返回 code
if (!success) {
return;
}
isRefreshingTokenLock = false; // 刷新新token完成开始后续操作
window.localStorage.setItem('accessToken', resultData.accessToken);
await _cacheRequest.forEach((cb: any) => {
cb();
});
_cacheRequest = [];
return retry(response.url, options); // 返回首次当前接口
}
}
});
const retry = async (url: any, options: any) => {
return request(url, options);
};
const postRefreshToken = async () => {
return request(`/auth/refreshToken/${localStorage.getItem('accessToken')}`, {
method: 'GET',
});
};
export default request;
浙公网安备 33010602011771号