request.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
  2. import { ElMessage } from 'element-plus'
  3. // 创建 axios 实例
  4. const service: AxiosInstance = axios.create({
  5. baseURL: import.meta.env.VITE_API_BASE_URL || '/api',
  6. timeout: 30000
  7. })
  8. // 请求拦截器
  9. service.interceptors.request.use(
  10. (config) => {
  11. // 从 localStorage 获取 token
  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. // 响应拦截器
  23. service.interceptors.response.use(
  24. (response: AxiosResponse) => {
  25. const res = response.data
  26. // 根据后端约定的状态码判断
  27. if (res.code !== 200 && res.code !== 0) {
  28. ElMessage.error(res.msg || res.message || '请求失败')
  29. // 401 未登录或 token 过期
  30. if (res.code === 401) {
  31. localStorage.removeItem('token')
  32. window.location.href = '/login'
  33. }
  34. return Promise.reject(new Error(res.msg || '请求失败'))
  35. }
  36. return res
  37. },
  38. (error) => {
  39. const message = error.response?.data?.msg || error.message || '网络错误'
  40. ElMessage.error(message)
  41. return Promise.reject(error)
  42. }
  43. )
  44. // 封装请求方法
  45. export const request = {
  46. get<T = any>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
  47. return service.get(url, { params, ...config })
  48. },
  49. post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
  50. return service.post(url, data, config)
  51. },
  52. put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
  53. return service.put(url, data, config)
  54. },
  55. delete<T = any>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
  56. return service.delete(url, { params, ...config })
  57. }
  58. }
  59. export default service