// 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: (url: string, config?: InternalAxiosRequestConfig) => { // 用内部类型 return request.get(url, config); }, post: (url: string, data?: any, config?: InternalAxiosRequestConfig) => { return request.post(url, data, config); }, put: (url: string, data?: any, config?: InternalAxiosRequestConfig) => { return request.put(url, data, config); }, delete: (url: string, config?: InternalAxiosRequestConfig) => { return request.delete(url, config); }, }; export default request;