完成全部后端和管理系统

This commit is contained in:
2025-11-03 17:23:03 +08:00
parent dfd1438981
commit 83b200c841
29 changed files with 1722 additions and 522 deletions

View File

@@ -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;