66 lines
1.9 KiB
TypeScript
66 lines
1.9 KiB
TypeScript
// 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;
|