httpClient.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import axios, { type AxiosInstance, } from 'axios'
  2. import type { ErrorResponse,ErrorResponseList } from '@/model/base'
  3. import { MessagePlugin } from 'tdesign-vue-next'
  4. import { useAppStore } from '@/stores/app'
  5. const client: AxiosInstance = axios.create({
  6. baseURL: import.meta.env.VITE_API_PREFIX,
  7. timeout: 1000
  8. })
  9. const handleError = (errorResponse: ErrorResponse) => {
  10. if (errorResponse.code === 401) {
  11. useAppStore().logout()
  12. MessagePlugin.error('登录信息失效,请重新登录')
  13. } else {
  14. MessagePlugin.error(errorResponse.message)
  15. }
  16. }
  17. client.interceptors.response.use(
  18. (response) => {
  19. return response
  20. },
  21. (error) => {
  22. let errorResponse: ErrorResponse;
  23. if (Array.isArray(error.response.data)) {
  24. const errorResponseList = error.response.data as ErrorResponseList;
  25. errorResponse = errorResponseList[0];
  26. } else {
  27. // 否则,将其视为单个 ErrorResponse
  28. errorResponse = error.response.data as ErrorResponse;
  29. }
  30. handleError(errorResponse)
  31. return Promise.reject(errorResponse)
  32. }
  33. )
  34. client.interceptors.request.use((config) => {
  35. const appStore = useAppStore()
  36. config.headers.set('Authorization', 'Bearer ' + appStore.token)
  37. return config
  38. })
  39. export default {
  40. get: async <T>(url: string, params?: any) => {
  41. const response = await client.get<T>(url, {
  42. params
  43. })
  44. return response.data as T
  45. },
  46. post: async <T>(url: string, data: Record<string, any>) => {
  47. const response = await client.post<T>(url, data)
  48. return response.data as T
  49. },
  50. delete: async (url: string,params?:any) => {
  51. await client.delete(url,{params})
  52. },
  53. put: async <T>(url: string, data: Record<string, any> = {}) => {
  54. const response = await client.put<T>(url, data)
  55. return response.data as T
  56. },
  57. // 增加文件上传的方法
  58. uploadFile: async <T>(url: string, file: File, data?: Record<string, any>) => {
  59. const formData = new FormData()
  60. formData.append('file', file)
  61. // 如果有其他参数,添加到 FormData 中
  62. if (data) {
  63. Object.keys(data).forEach((key) => {
  64. formData.append(key, data[key])
  65. })
  66. }
  67. const response = await client.post<T>(url, formData, {
  68. headers: {
  69. 'Content-Type': 'multipart/form-data'
  70. }
  71. })
  72. return response.data as T
  73. }
  74. }