save code
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
import axios from 'axios';
|
||||
|
||||
const api = axios.create({
|
||||
baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:5000/api/v1',
|
||||
timeout: 10000,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
|
||||
api.interceptors.request.use(
|
||||
(config) => {
|
||||
const token = localStorage.getItem('token');
|
||||
if (token) {
|
||||
config.headers.Authorization = `Bearer ${token}`;
|
||||
}
|
||||
return config;
|
||||
},
|
||||
(error) => {
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
|
||||
api.interceptors.response.use(
|
||||
(response) => {
|
||||
return response.data;
|
||||
},
|
||||
(error) => {
|
||||
if (error.response) {
|
||||
const { status, data } = error.response;
|
||||
switch (status) {
|
||||
case 400:
|
||||
console.error('参数错误:', data?.message);
|
||||
break;
|
||||
case 401:
|
||||
localStorage.removeItem('token');
|
||||
localStorage.removeItem('user');
|
||||
window.location.href = '/login';
|
||||
break;
|
||||
case 403:
|
||||
console.error('权限不足:', data?.message);
|
||||
break;
|
||||
case 404:
|
||||
console.error('资源不存在:', data?.message);
|
||||
break;
|
||||
case 500:
|
||||
console.error('服务器错误:', data?.message);
|
||||
break;
|
||||
default:
|
||||
console.error('请求失败:', data?.message);
|
||||
}
|
||||
} else if (error.request) {
|
||||
console.error('网络错误');
|
||||
} else {
|
||||
console.error('请求失败:', error.message);
|
||||
}
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
|
||||
export default api;
|
||||
@@ -0,0 +1,34 @@
|
||||
export const authAPI = {
|
||||
login: async (username, password) => {
|
||||
const response = await fetch(`${import.meta.env.VITE_API_BASE_URL}/auth/login`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({ username, password }),
|
||||
});
|
||||
return response.json();
|
||||
},
|
||||
|
||||
getCurrentUser: async () => {
|
||||
const token = localStorage.getItem('token');
|
||||
const response = await fetch(`${import.meta.env.VITE_API_BASE_URL}/auth/me`, {
|
||||
headers: {
|
||||
'Authorization': `Bearer ${token}`,
|
||||
},
|
||||
});
|
||||
return response.json();
|
||||
},
|
||||
|
||||
logout: async () => {
|
||||
const token = localStorage.getItem('token');
|
||||
const response = await fetch(`${import.meta.env.VITE_API_BASE_URL}/auth/logout`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': `Bearer ${token}`,
|
||||
},
|
||||
});
|
||||
return response.json();
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,21 @@
|
||||
import api from './api';
|
||||
|
||||
export const projectAPI = {
|
||||
getList: (params) => api.get('/projects', { params }),
|
||||
|
||||
getDetail: (id) => api.get(`/projects/${id}`),
|
||||
|
||||
create: (data) => api.post('/projects', data),
|
||||
|
||||
update: (id, data) => api.put(`/projects/${id}`, data),
|
||||
|
||||
delete: (id) => api.delete(`/projects/${id}`),
|
||||
|
||||
getStatistics: (params) => api.get('/projects/statistics', { params }),
|
||||
|
||||
getGroupStatistics: (params) => api.get('/projects/statistics/group', { params }),
|
||||
|
||||
getTimelineStatistics: (params) => api.get('/projects/statistics/timeline', { params }),
|
||||
|
||||
export: (params) => api.get('/projects/export', { params, responseType: 'blob' }),
|
||||
};
|
||||
@@ -0,0 +1,15 @@
|
||||
import api from './api';
|
||||
|
||||
export const userAPI = {
|
||||
getList: (params) => api.get('/users', { params }),
|
||||
|
||||
getDetail: (id) => api.get(`/users/${id}`),
|
||||
|
||||
create: (data) => api.post('/users', data),
|
||||
|
||||
update: (id, data) => api.put(`/users/${id}`, data),
|
||||
|
||||
delete: (id) => api.delete(`/users/${id}`),
|
||||
|
||||
resetPassword: (id, newPassword) => api.post(`/users/${id}/reset-password`, { new_password: newPassword }),
|
||||
};
|
||||
Reference in New Issue
Block a user