save code

This commit is contained in:
xsl
2026-01-26 08:04:53 +08:00
parent 0895398138
commit e4b59c5ee4
1238 changed files with 95107 additions and 1068 deletions
+61
View File
@@ -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;
+34
View File
@@ -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();
},
};
+21
View File
@@ -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' }),
};
+15
View File
@@ -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 }),
};