GPU_Web/src/utils/index.ts
Leo_Ding e50e03dcc6 111
2026-01-12 18:29:32 +08:00

66 lines
1.9 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, { AxiosInstance, InternalAxiosRequestConfig } from "axios";
import { message } from "ant-design-vue";
import { useRouter, useRoute } from "vue-router";
// 从环境变量读取基础 URL
const BASE_URL = import.meta.env.VITE_API_BASIC;
console.log("API Basic URL:", import.meta.env.VITE_API_BASIC);
console.log("All env:", import.meta.env);
const router = useRouter();
// 创建 axios 实例
const request: AxiosInstance = axios.create({
baseURL: BASE_URL,
timeout: 10000, // 10 秒超时
withCredentials: false, // 跨域请求时发送 cookies
headers: {
"Content-Type": "application/json",
},
});
// 请求拦截器(可选:加 token、loading 等)
request.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
// 例如:从 localStorage 获取 token
const token = localStorage.getItem("token");
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
(error) => {
return Promise.reject(error);
}
);
// 响应拦截器统一处理错误、code 等)
request.interceptors.response.use(
(response) => {
console.log("response", response);
// 假设后端返回格式为 { code: 200, data: ..., message: '' }
const { code, data, message } = response.data;
console.log("Response Data:", response.data);
if (code === 1) {
return data??code;
} else {
// 可抛出业务错误
return Promise.reject(new Error(message || "请求失败"));
}
},
(error) => {
// 网络错误 or 超时等
console.log(error);
const res = error.response;
if (res.status === 401) {
message.error("登录已过期,请重新登录");
localStorage.clear();
setTimeout(() => {
window.location.href = "/login";
}, 3000);
} else {
return Promise.reject(error.response.data);
}
}
);
export default request;