request.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // src/utils/request.ts
  2. import axios from 'axios'
  3. import { ElMessage } from 'element-plus'
  4. import type { AxiosInstance, AxiosResponse } from 'axios'
  5. // 创建 axios 实例
  6. const service: AxiosInstance = axios.create({
  7. baseURL: import.meta.env.VITE_API_BASE_URL || '', // 从环境变量中读取
  8. timeout: 10000, // 超时时间
  9. withCredentials: true // 是否允许携带 cookie
  10. })
  11. // 请求拦截器
  12. service.interceptors.request.use(
  13. (config) => {
  14. // 可在此添加 token 到 headers 中
  15. const token = localStorage.getItem('token')
  16. if (token) {
  17. config.headers!['Authorization'] = `${token}`
  18. }
  19. return config
  20. },
  21. (error) => {
  22. // 请求错误处理
  23. console.error('请求错误:', error)
  24. return Promise.reject(error)
  25. }
  26. )
  27. // 响应拦截器
  28. service.interceptors.response.use(
  29. (response: AxiosResponse) => {
  30. const res = response.data
  31. if (res.code !== 200) {
  32. ElMessage({
  33. message: res.msg || '请求失败',
  34. type: 'error',
  35. duration: 5 * 1000
  36. })
  37. // 特殊状态码处理,如 token 失效等
  38. if (res.code === 401) {
  39. // 跳转登录页
  40. window.location.href = '/'
  41. }
  42. return Promise.reject(res.msg || '请求失败')
  43. }
  44. return res
  45. },
  46. (error) => {
  47. // 网络错误、超时等处理
  48. const message = error.message.includes('timeout') ? '请求超时' : '网络异常'
  49. ElMessage({
  50. message,
  51. type: 'error'
  52. })
  53. return Promise.reject(error)
  54. }
  55. )
  56. // 常用请求方法封装
  57. export const http = {
  58. get<T = any>(url: string, params?: any): Promise<T> {
  59. return service.get(url, { params })
  60. },
  61. post<T = any>(url: string, data?: any): Promise<T> {
  62. return service.post(url, data)
  63. },
  64. put<T = any>(url: string, data?: any): Promise<T> {
  65. return service.put(url, data)
  66. },
  67. delete<T = any>(url: string, data?: any): Promise<T> {
  68. return service.delete(url, { data })
  69. }
  70. }
  71. export default service