import axios from 'axios' const api = axios.create({ baseURL: '/api', timeout: 10000, headers: { 'Content-Type': 'application/json' } }) // Request interceptor to add JWT token api.interceptors.request.use( (config) => { const token = localStorage.getItem('token') if (token) { config.headers.Authorization = `Bearer ${token}` } return config }, (error) => { return Promise.reject(error) } ) // Response interceptor for error handling api.interceptors.response.use( (response) => { return response.data }, (error) => { // Handle 401 Unauthorized - redirect to login if (error.response?.status === 401) { localStorage.removeItem('token') // Only redirect if not already on login page if (window.location.pathname !== '/login') { window.location.href = '/login' } } const message = error.response?.data?.error || error.message || '请求失败' return Promise.reject(new Error(message)) } ) // Auth API export const authApi = { login: (data) => api.post('/auth/login', data), me: () => api.get('/auth/me') } // Admin API export const adminApi = { getAll: () => api.get('/admins'), getById: (id) => api.get(`/admins/${id}`), create: (data) => api.post('/admins/create', data), update: (data) => api.post('/admins/update', data), delete: (id) => api.post('/admins/delete', { id }) } // Person API export const personApi = { getAll: () => api.get('/persons'), getById: (id) => api.get(`/persons/${id}`), create: (data) => api.post('/persons/create', data), update: (data) => api.post('/persons/update', data), delete: (id) => api.post('/persons/delete', { id }) } // Item API export const itemApi = { getAll: () => api.get('/items'), getById: (id) => api.get(`/items/${id}`), create: (data) => api.post('/items/create', data), update: (data) => api.post('/items/update', data), delete: (id) => api.post('/items/delete', { id }) } // Work Record API export const workRecordApi = { getAll: (params) => api.get('/work-records', { params }), getById: (id) => api.get(`/work-records/${id}`), create: (data) => api.post('/work-records/create', data), update: (data) => api.post('/work-records/update', data), delete: (id) => api.post('/work-records/delete', { id }), getDailySummary: (params) => api.get('/work-records/daily-summary', { params }), getMonthlySummary: (params) => api.get('/work-records/monthly-summary', { params }) } // Export API - uses axios directly to handle blob responses export const exportApi = { monthly: (year, month) => { const token = localStorage.getItem('token') return axios.get('/api/export/monthly', { params: { year, month }, responseType: 'blob', headers: token ? { Authorization: `Bearer ${token}` } : {} }) }, yearly: (year) => { const token = localStorage.getItem('token') return axios.get('/api/export/yearly', { params: { year }, responseType: 'blob', headers: token ? { Authorization: `Bearer ${token}` } : {} }) } } // Import API - uses axios directly to handle blob/multipart responses export const importApi = { downloadTemplate: () => { const token = localStorage.getItem('token') return axios.get('/api/import/template', { responseType: 'blob', headers: token ? { Authorization: `Bearer ${token}` } : {} }) }, upload: (file) => { const token = localStorage.getItem('token') const formData = new FormData() formData.append('file', file) return axios.post('/api/import/upload', formData, { headers: { 'Content-Type': 'multipart/form-data', ...(token ? { Authorization: `Bearer ${token}` } : {}) } }) } } export default api