90 lines
3.4 KiB
TypeScript
90 lines
3.4 KiB
TypeScript
// src/utils/request.ts
|
||
import axios, {
|
||
type InternalAxiosRequestConfig, // 关键:导入内部配置类型
|
||
type AxiosError,
|
||
type AxiosResponse
|
||
} from 'axios';
|
||
import { ElMessage } from 'element-plus';
|
||
import router from "../router";
|
||
import useUserStore from "../store/user.ts";
|
||
|
||
// 创建实例(配置不变)
|
||
const request = axios.create({
|
||
baseURL: import.meta.env.VITE_API_BASE_URL,
|
||
timeout: 10000,
|
||
headers: { 'Content-Type': 'application/json' },
|
||
});
|
||
|
||
// 1. 请求拦截器:使用 InternalAxiosRequestConfig 类型
|
||
request.interceptors.request.use(
|
||
(config: InternalAxiosRequestConfig) => { // 类型改为 InternalAxiosRequestConfig
|
||
const userStore = useUserStore();
|
||
if (userStore.session) {
|
||
// 关键:用 set 方法添加自定义头,保持 headers 类型为 AxiosHeaders
|
||
console.log("发送session:", userStore.session);
|
||
config.headers.set('session_id', userStore.session);
|
||
}
|
||
return config; // 返回类型自动匹配
|
||
},
|
||
(error: AxiosError) => {
|
||
ElMessage.error('请求配置错误,请检查');
|
||
return Promise.reject(error);
|
||
}
|
||
);
|
||
|
||
request.interceptors.response.use(
|
||
(response: AxiosResponse) => { // 明确响应类型
|
||
const res = response.data;
|
||
if ('code' in res) {
|
||
// 有 code 字段:按原有规则校验(code=0 视为成功)
|
||
if (res.code == '400') {
|
||
ElMessage.error(res.msg || '操作失败');
|
||
return Promise.reject(res); // 业务错误抛错
|
||
}
|
||
// 有 code 时,返回 res.data(保持原有逻辑)
|
||
return res.data;
|
||
} else {
|
||
// 2. 无 code 字段:默认接口成功,直接返回原始响应数据(或根据实际结构调整)
|
||
// 注意:根据无 code 接口的实际返回格式修改(可能是 res 本身,也可能是 res.data)
|
||
return res; // 假设无 code 的接口直接返回业务数据(如 { ok: true, list: [...] })
|
||
}
|
||
},
|
||
(error: AxiosError) => {
|
||
const status = error.response?.status;
|
||
switch (status) {
|
||
case 401:
|
||
const userStore = useUserStore();
|
||
userStore.logout();
|
||
router.push('/login');
|
||
ElMessage.error('登录已过期,请重新登录');
|
||
break;
|
||
case 403:
|
||
ElMessage.error('没有权限访问');
|
||
break;
|
||
case 500:
|
||
ElMessage.error('服务器内部错误');
|
||
break;
|
||
default:
|
||
ElMessage.error('网络异常,请稍后重试');
|
||
}
|
||
return Promise.reject(error);
|
||
}
|
||
);
|
||
|
||
// 3. 封装请求方法(类型同步修改)
|
||
export const requestUtil = {
|
||
get: <T = any>(url: string, config?: InternalAxiosRequestConfig) => { // 用内部类型
|
||
return request.get<T>(url, config);
|
||
},
|
||
post: <T = any>(url: string, data?: any, config?: InternalAxiosRequestConfig) => {
|
||
return request.post<T>(url, data, config);
|
||
},
|
||
put: <T = any>(url: string, data?: any, config?: InternalAxiosRequestConfig) => {
|
||
return request.put<T>(url, data, config);
|
||
},
|
||
delete: <T = any>(url: string, config?: InternalAxiosRequestConfig) => {
|
||
return request.delete<T>(url, config);
|
||
},
|
||
};
|
||
|
||
export default request; |