api.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import axios from 'axios'
  2. const api = axios.create({
  3. baseURL: '/api',
  4. timeout: 10000,
  5. headers: {
  6. 'Content-Type': 'application/json'
  7. }
  8. })
  9. // Request interceptor to add JWT token
  10. api.interceptors.request.use(
  11. (config) => {
  12. const token = localStorage.getItem('token')
  13. if (token) {
  14. config.headers.Authorization = `Bearer ${token}`
  15. }
  16. return config
  17. },
  18. (error) => {
  19. return Promise.reject(error)
  20. }
  21. )
  22. // Response interceptor for error handling
  23. api.interceptors.response.use(
  24. (response) => {
  25. return response.data
  26. },
  27. (error) => {
  28. // Handle 401 Unauthorized - redirect to login
  29. if (error.response?.status === 401) {
  30. localStorage.removeItem('token')
  31. // Only redirect if not already on login page
  32. if (window.location.pathname !== '/login') {
  33. window.location.href = '/login'
  34. }
  35. }
  36. const message = error.response?.data?.error || error.message || '请求失败'
  37. return Promise.reject(new Error(message))
  38. }
  39. )
  40. // Auth API
  41. export const authApi = {
  42. login: (data) => api.post('/auth/login', data),
  43. me: () => api.get('/auth/me')
  44. }
  45. // Admin API
  46. export const adminApi = {
  47. getAll: () => api.get('/admins'),
  48. getById: (id) => api.get(`/admins/${id}`),
  49. create: (data) => api.post('/admins/create', data),
  50. update: (data) => api.post('/admins/update', data),
  51. delete: (id) => api.post('/admins/delete', { id })
  52. }
  53. // Person API
  54. export const personApi = {
  55. getAll: () => api.get('/persons'),
  56. getById: (id) => api.get(`/persons/${id}`),
  57. create: (data) => api.post('/persons/create', data),
  58. update: (data) => api.post('/persons/update', data),
  59. delete: (id) => api.post('/persons/delete', { id })
  60. }
  61. // Item API
  62. export const itemApi = {
  63. getAll: () => api.get('/items'),
  64. getById: (id) => api.get(`/items/${id}`),
  65. create: (data) => api.post('/items/create', data),
  66. update: (data) => api.post('/items/update', data),
  67. delete: (id) => api.post('/items/delete', { id })
  68. }
  69. // Work Record API
  70. export const workRecordApi = {
  71. getAll: (params) => api.get('/work-records', { params }),
  72. getById: (id) => api.get(`/work-records/${id}`),
  73. create: (data) => api.post('/work-records/create', data),
  74. update: (data) => api.post('/work-records/update', data),
  75. delete: (id) => api.post('/work-records/delete', { id }),
  76. getDailySummary: (params) => api.get('/work-records/daily-summary', { params }),
  77. getMonthlySummary: (params) => api.get('/work-records/monthly-summary', { params })
  78. }
  79. // Export API - uses axios directly to handle blob responses
  80. export const exportApi = {
  81. monthly: (year, month) => {
  82. const token = localStorage.getItem('token')
  83. return axios.get('/api/export/monthly', {
  84. params: { year, month },
  85. responseType: 'blob',
  86. headers: token ? { Authorization: `Bearer ${token}` } : {}
  87. })
  88. },
  89. yearly: (year) => {
  90. const token = localStorage.getItem('token')
  91. return axios.get('/api/export/yearly', {
  92. params: { year },
  93. responseType: 'blob',
  94. headers: token ? { Authorization: `Bearer ${token}` } : {}
  95. })
  96. }
  97. }
  98. // Import API - uses axios directly to handle blob/multipart responses
  99. export const importApi = {
  100. downloadTemplate: () => {
  101. const token = localStorage.getItem('token')
  102. return axios.get('/api/import/template', {
  103. responseType: 'blob',
  104. headers: token ? { Authorization: `Bearer ${token}` } : {}
  105. })
  106. },
  107. upload: (file) => {
  108. const token = localStorage.getItem('token')
  109. const formData = new FormData()
  110. formData.append('file', file)
  111. return axios.post('/api/import/upload', formData, {
  112. headers: {
  113. 'Content-Type': 'multipart/form-data',
  114. ...(token ? { Authorization: `Bearer ${token}` } : {})
  115. }
  116. })
  117. }
  118. }
  119. export default api