| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- 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
|