完成全部后端和管理系统
This commit is contained in:
@@ -1,41 +1,90 @@
|
||||
import axios from 'axios';
|
||||
// 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 baseURL = import.meta.env.VITE_API_BASE_URL;
|
||||
|
||||
// 创建 Axios 实例
|
||||
// 创建实例(配置不变)
|
||||
const request = axios.create({
|
||||
baseURL, // 自动拼接基础地址
|
||||
timeout: 5000, // 超时时间
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
baseURL: import.meta.env.VITE_API_BASE_URL,
|
||||
timeout: 10000,
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
});
|
||||
|
||||
// 请求拦截器(可选,可添加 token 等)
|
||||
// 1. 请求拦截器:使用 InternalAxiosRequestConfig 类型
|
||||
request.interceptors.request.use(
|
||||
(config) => {
|
||||
// 示例:添加认证 token
|
||||
// const token = localStorage.getItem('token');
|
||||
// if (token) {
|
||||
// config.headers.Authorization = `Bearer ${token}`;
|
||||
// }
|
||||
return config;
|
||||
(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) => {
|
||||
(error: AxiosError) => {
|
||||
ElMessage.error('请求配置错误,请检查');
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
|
||||
// 响应拦截器(可选,统一处理错误)
|
||||
request.interceptors.response.use(
|
||||
(response) => {
|
||||
return response.data; // 直接返回响应体中的 data
|
||||
(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) => {
|
||||
console.error('请求错误:', error);
|
||||
(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;
|
||||
Reference in New Issue
Block a user