Files
hldrCenter/management/src/utils/request.ts

90 lines
3.4 KiB
TypeScript
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.
// 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;