95 lines
2.4 KiB
TypeScript
95 lines
2.4 KiB
TypeScript
|
|
import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
|
|||
|
|
import { message } from 'ant-design-vue';
|
|||
|
|
|
|||
|
|
// 创建axios实例
|
|||
|
|
const request: AxiosInstance = axios.create({
|
|||
|
|
baseURL: '/api/v1', // 使用 /api/v1,代理会保留完整路径
|
|||
|
|
timeout: 30000,
|
|||
|
|
headers: {
|
|||
|
|
'Content-Type': 'application/json',
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 请求拦截器
|
|||
|
|
request.interceptors.request.use(
|
|||
|
|
(config) => {
|
|||
|
|
const token = localStorage.getItem('token');
|
|||
|
|
if (token) {
|
|||
|
|
config.headers.Authorization = `Bearer ${token}`;
|
|||
|
|
}
|
|||
|
|
return config;
|
|||
|
|
},
|
|||
|
|
(error) => {
|
|||
|
|
return Promise.reject(error);
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// 响应拦截器
|
|||
|
|
request.interceptors.response.use(
|
|||
|
|
(response: AxiosResponse) => {
|
|||
|
|
// 直接返回响应数据
|
|||
|
|
return response.data;
|
|||
|
|
},
|
|||
|
|
(error) => {
|
|||
|
|
const { response } = error;
|
|||
|
|
|
|||
|
|
if (response) {
|
|||
|
|
const { status, data } = response;
|
|||
|
|
|
|||
|
|
switch (status) {
|
|||
|
|
case 401:
|
|||
|
|
message.error('登录已过期,请重新登录');
|
|||
|
|
localStorage.removeItem('token');
|
|||
|
|
localStorage.removeItem('user');
|
|||
|
|
localStorage.removeItem('role');
|
|||
|
|
localStorage.removeItem('name');
|
|||
|
|
window.location.href = '/login';
|
|||
|
|
break;
|
|||
|
|
case 403:
|
|||
|
|
message.error('没有权限访问');
|
|||
|
|
break;
|
|||
|
|
case 404:
|
|||
|
|
message.error('请求的资源不存在');
|
|||
|
|
break;
|
|||
|
|
case 500:
|
|||
|
|
message.error('服务器错误');
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
message.error(data?.message || '请求失败');
|
|||
|
|
}
|
|||
|
|
} else if (error.code === 'ECONNABORTED') {
|
|||
|
|
message.error('请求超时');
|
|||
|
|
} else {
|
|||
|
|
message.error('网络错误');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return Promise.reject(error);
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// 导出请求方法
|
|||
|
|
export default request;
|
|||
|
|
|
|||
|
|
// 通用请求方法
|
|||
|
|
export const http = {
|
|||
|
|
get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {
|
|||
|
|
return request.get(url, config);
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
|
|||
|
|
return request.post(url, data, config);
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
|
|||
|
|
return request.put(url, data, config);
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {
|
|||
|
|
return request.delete(url, config);
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
|
|||
|
|
return request.patch(url, data, config);
|
|||
|
|
},
|
|||
|
|
};
|