factory_web/src/utils/request.js

242 lines
6.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import axios from 'axios';
import { ElNotification, ElMessageBox } from 'element-plus';
import sysConfig from "@/config";
import tool from '@/utils/tool';
import router from '@/router';
axios.defaults.baseURL = sysConfig.API_URL;
axios.defaults.timeout = sysConfig.TIMEOUT;
// 是否正在刷新的标记
let isRefreshing = false;
// 重试队列,每一项将是一个待执行的函数形式
let requests = [];
// HTTP request 拦截器
axios.interceptors.request.use(
(config) => {
let token = tool.cookie.get("TOKEN")?tool.cookie.get("TOKEN"):tool.data.get("TOKEN");
if(token){
config.headers[sysConfig.TOKEN_NAME] = sysConfig.TOKEN_PREFIX + token
}
if(!sysConfig.REQUEST_CACHE && config.method == 'get'){
config.params = config.params || {};
// config.params['_'] = new Date().getTime();
}
Object.assign(config.headers, sysConfig.HEADERS)
return config;
},
(error) => {
return Promise.reject(error);
}
);
//FIX 多个API同时401时疯狂弹窗BUG
let MessageBox_401_show = false
// HTTP response 拦截器
axios.interceptors.response.use(
(response) => {
return response;
},
(error) => {
if (error.response) {
if (error.response.status == 401) {
if(error.response.data.err_code == 'no_active_account'){
ElNotification.warning({
title: '请求失败',
message: "账户密码错误或已禁用"
});
// if (!isRefreshing) {
// isRefreshing = true;
// axios({
// method: 'post',
// url: sysConfig.API_URL+'/auth/token/refresh/',
// headers: {
// Authorization: `Bearer ${tool.cookie.get("TOKEN")}`,
// },
// data:{refresh:tool.cookie.get("TOKEN_REFRESH")}
// }).then(res=>{
// debugger;
// console.log(res.data.access);
// // 替换本地的token
// tool.cookie.set("TOKEN", res.data.access);
// tool.data.set("TOKEN_TIME", new Date().getTime());
// error.config.headers[sysConfig.TOKEN_NAME] = sysConfig.TOKEN_PREFIX + res.data.access;
// isRefreshing = false;
// requests.forEach(cb => cb())
// //发起后将requests置空
// requests=[];
// return axios(error.config)
// }).catch(()=>{
// // refresh_token 有值 , 但是过期了, 请求失败
// router.push('/login')
// })
// }else{
// //如果正在刷新token将发起的请求暂存在requests中
// return new Promise((resolve)=>{
// requests.push(()=>{
// resolve(axios(error.config));
// })
// })
// }
}else{
// ElMessageBox.confirm('当前用户已被登出或无权限访问当前资源,请尝试重新登录后再操作。', '无权限访问', {
// type: 'error',
// closeOnClickModal: false,
// center: true,
// confirmButtonText: '重新登录'
// }).then(() => {
router.replace({path: '/login'});
// }).catch(() => {})
}
} else {
if(error.response.data.err_msg=='人脸未匹配,请调整位置'){}else{
ElNotification.warning({
title: '请求失败',
message: error.response.data.err_msg || `Status:${error.response.status},未知错误!`
});
}
}
} else {
ElNotification.error({
title: '请求错误',
message: "请求服务器无响应!"
});
}
return Promise.reject(error.response);
}
);
var http = {
/** get 请求
* @param {string} url 接口地址
* @param {object} params 请求参数
* @param {object} config 参数
*/
get: function(url, params={}, config={}) {
return new Promise((resolve, reject) => {
axios({
method: 'get',
url: url,
params: params,
...config
}).then((response) => {
resolve(response.data);
}).catch((error) => {
reject(error);
})
})
},
/** post 请求
* @param {string} url 接口地址
* @param {object} data 请求参数
* @param {object} config 参数
*/
post: function(url, data={}, config={}) {
return new Promise((resolve, reject) => {
axios({
method: 'post',
url: url,
data: data,
...config
}).then((response) => {
resolve(response.data);
}).catch((error) => {
reject(error);
})
})
},
/** put 请求
* @param {string} url 接口地址
* @param {object} data 请求参数
* @param {object} config 参数
*/
put: function(url, data={}, config={}) {
return new Promise((resolve, reject) => {
axios({
method: 'put',
url: url,
data: data,
...config
}).then((response) => {
resolve(response.data);
}).catch((error) => {
reject(error);
})
})
},
/** patch 请求
* @param {string} url 接口地址
* @param {object} data 请求参数
* @param {object} config 参数
*/
patch: function(url, data={}, config={}) {
return new Promise((resolve, reject) => {
axios({
method: 'patch',
url: url,
data: data,
...config
}).then((response) => {
resolve(response.data);
}).catch((error) => {
reject(error);
})
})
},
/** delete 请求
* @param {string} url 接口地址
* @param {object} data 请求参数
* @param {object} config 参数
*/
delete: function(url, data={}, config={}) {
return new Promise((resolve, reject) => {
axios({
method: 'delete',
url: url,
data: data,
...config
}).then((response) => {
resolve(response.data);
}).catch((error) => {
reject(error);
})
})
},
/** jsonp 请求
* @param {string} url 接口地址
* @param {string} name JSONP回调函数名称
*/
jsonp: function(url, name='jsonp'){
return new Promise((resolve) => {
var script = document.createElement('script')
var _id = `jsonp${Math.ceil(Math.random() * 1000000)}`
script.id = _id
script.type = 'text/javascript'
script.src = url
window[name] =(response) => {
resolve(response)
document.getElementsByTagName('head')[0].removeChild(script)
try {
delete window[name];
}catch(e){
window[name] = undefined;
}
}
document.getElementsByTagName('head')[0].appendChild(script)
})
}
}
export default http;