video_ca/src/utils/req_base.js

99 lines
3.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 router from "@/router/index.js";
import { ElMessage } from 'element-plus';
let isRefreshing = false;
let requests = [];
// 错误处理函数
const handleResponseError = (result) => {
if (result.status !== 200) {
router.push("/login");
}
if (result.data.message === "NOT_LOGIN" || [2, 3, 4].includes(result.data.code)) {
// 检测到token过期
if (isRefreshing == false) {
isRefreshing = true;
// 这里需要替换为实际的refresh token请求
return axios.post('https://uc.ljsea.top/user/refresh_token', {
refresh_token: localStorage.getItem("refresh_token")
},{
headers: {
'Authorization': `Bearer ${localStorage.getItem("refresh_token")}`
}
}).then(res => {
const token = res.data["data"]["access_token"];
localStorage.setItem("token", token);
// 重试所有挂起的请求
requests.forEach(cb => cb(token));
requests = [];
isRefreshing = false;
// 重试当前请求
const config = result.config;
config.headers.Authorization = `Bearer ${token}`;
return request(config);
}).catch(err => {
// 刷新token失败跳转登录
ElMessage.error('登录已过期请重新登录12');
router.push("/login");
return Promise.reject(err);
});
} else if (isRefreshing) {
// 正在刷新token将请求放入队列
return new Promise(resolve => {
requests.push(token => {
result.config.headers.Authorization = `Bearer ${token}`;
resolve(request(result.config));
});
});
}
}
if (result.data.code === 7) {
ElMessage.error('该用户已存在,请重新输入!');
return null;
}
if (result.data.code === 1) {
ElMessage.error('请求失败,请稍后重试!');
}
return result.data;
};
// 请求实例缓存
const instances = new Map();
// 请求工厂函数(单例模式)
export const createRequestInstance = (baseURL, config = {}) => {
// 检查是否已存在该域名的实例
if (instances.has(baseURL)) {
return instances.get(baseURL);
}
// 创建新实例
const instance = axios.create({
baseURL,
timeout: 10000, // 默认超时时间
headers: {
'Content-Type': 'application/json'
},
...config
});
// 添加响应拦截器
instance.interceptors.response.use(
result => handleResponseError(result),
error => {
ElMessage.error('请求失败,请稍后重试!');
return Promise.reject(error);
}
);
// 缓存实例
instances.set(baseURL, instance);
return instance;
};
// 默认导出原有的阿里云请求实例
export default createRequestInstance("https://tx.ljsea.top/");