request.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import axios from 'axios'
  2. import { Message } from 'element-ui'
  3. import router from '@/router'
  4. const service = axios.create({
  5. baseURL: process.env.VUE_APP_BASE_API || '',
  6. timeout: 60000
  7. })
  8. // 请求拦截器
  9. service.interceptors.request.use(
  10. config => {
  11. const token = localStorage.getItem('token')
  12. if (token) {
  13. config.headers['Authorization'] = `Bearer ${token}`
  14. }
  15. return config
  16. },
  17. error => {
  18. console.error('请求错误:', error)
  19. return Promise.reject(error)
  20. }
  21. )
  22. // 响应拦截器
  23. service.interceptors.response.use(
  24. response => {
  25. const res = response.data
  26. if (res.code === 200) {
  27. return res
  28. } else {
  29. Message.error(res.message || '请求失败')
  30. return Promise.reject(new Error(res.message || '请求失败'))
  31. }
  32. },
  33. error => {
  34. console.error('响应错误:', error)
  35. if (error.response) {
  36. if (error.response.status === 401) {
  37. Message.error('登录已过期,请重新登录')
  38. localStorage.clear()
  39. router.push('/login')
  40. } else if (error.response.status === 504) {
  41. Message.error('请求处理中(服务器繁忙),请勿重复提交,稍后刷新列表查看')
  42. } else {
  43. Message.error(error.response.data?.message || '请求失败')
  44. }
  45. } else {
  46. // 网络层错误(含超时 ECONNABORTED)
  47. if (error.code === 'ECONNABORTED' || (error.message && error.message.includes('timeout'))) {
  48. Message.error('请求超时,内容可能已保存成功,请勿重复提交,稍后刷新列表查看')
  49. } else {
  50. Message.error('网络请求失败')
  51. }
  52. }
  53. return Promise.reject(error)
  54. }
  55. )
  56. export default service