96 lines
3.4 KiB
TypeScript
96 lines
3.4 KiB
TypeScript
import axios from 'axios';
|
|
import router from '../router';
|
|
import { useAuthStore } from '../stores/auth.store';
|
|
|
|
// 创建 axios 实例
|
|
const apiClient = axios.create({
|
|
baseURL: '/api/v1', // 设置基础URL
|
|
timeout: 10000, // 设置请求超时时间
|
|
withCredentials: true, // 允许携带 cookie
|
|
});
|
|
|
|
// 请求拦截器 (可选,例如添加认证 Token)
|
|
apiClient.interceptors.request.use(
|
|
(config) => {
|
|
// 可以在这里添加逻辑,比如从 store 获取 token 并添加到请求头
|
|
// const authStore = useAuthStore();
|
|
// if (authStore.token) {
|
|
// config.headers.Authorization = `Bearer ${authStore.token}`;
|
|
// }
|
|
return config;
|
|
},
|
|
(error) => {
|
|
// 处理请求错误
|
|
console.error('Request error:', error);
|
|
return Promise.reject(error);
|
|
}
|
|
);
|
|
|
|
// 响应拦截器
|
|
apiClient.interceptors.response.use(
|
|
(response) => {
|
|
// 对响应数据做点什么
|
|
return response;
|
|
},
|
|
(error) => {
|
|
// 处理响应错误
|
|
console.error('Response error:', error.response || error.message);
|
|
|
|
if (error.response) {
|
|
const { status } = error.response;
|
|
const authStore = useAuthStore(); // 在需要时获取 store 实例
|
|
|
|
// 处理常见的 HTTP 错误状态码
|
|
switch (status) {
|
|
case 401: // 未授权
|
|
// 如果用户当前是认证状态,则可能是 session 过期或无效
|
|
if (authStore.isAuthenticated) {
|
|
console.warn('Unauthorized access detected. Logging out.');
|
|
// 调用 store 中的 logout 方法,它会处理状态重置和路由跳转
|
|
authStore.logout();
|
|
// 可以选择抛出错误或返回一个特定的值,防止后续代码执行
|
|
return Promise.reject(new Error('Unauthorized, logging out.'));
|
|
} else {
|
|
// 如果用户本来就未认证,可能只是访问了需要登录的接口,暂时不强制跳转
|
|
console.log('Unauthorized access to protected route.');
|
|
}
|
|
break;
|
|
case 403: // 禁止访问
|
|
// 可以显示一个权限不足的提示
|
|
console.error('Forbidden access.');
|
|
// alert('您没有权限执行此操作。'); // 或者使用更友好的通知组件
|
|
break;
|
|
case 404: // 未找到
|
|
console.error('Resource not found.');
|
|
break;
|
|
case 500: // 服务器内部错误
|
|
console.error('Internal server error.');
|
|
// alert('服务器发生错误,请稍后重试。');
|
|
break;
|
|
// 可以根据需要添加更多错误状态码的处理
|
|
default:
|
|
console.error(`Unhandled error status: ${status}`);
|
|
}
|
|
} else if (error.request) {
|
|
// 请求已发出,但没有收到响应 (例如网络问题)
|
|
console.error('Network error or no response received:', error.request);
|
|
// alert('网络错误,请检查您的连接。');
|
|
} else {
|
|
// 发送请求时出了点问题
|
|
console.error('Error setting up request:', error.message);
|
|
}
|
|
|
|
// 将错误继续抛出,以便调用方可以捕获并处理
|
|
return Promise.reject(error);
|
|
}
|
|
);
|
|
|
|
// Passkey Management
|
|
export const fetchPasskeys = () => {
|
|
return apiClient.get('/auth/user/passkeys');
|
|
};
|
|
|
|
export const deletePasskey = (credentialID: string) => {
|
|
return apiClient.delete(`/auth/user/passkeys/${credentialID}`);
|
|
};
|
|
export default apiClient; |