http.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /* eslint-disable no-console */
  2. import axios from 'axios'
  3. import cookie from 'vue-cookies'
  4. import { ElMessage } from 'element-plus'
  5. import router from '@/router'
  6. const http = axios.create({
  7. timeout: 1000 * 30,
  8. withCredentials: true,
  9. headers: {
  10. 'Content-Type': 'application/json; charset=utf-8'
  11. }
  12. })
  13. // 请求拦截
  14. http.interceptors.request.use(
  15. config => {
  16. // 语言类型
  17. config.headers.locale = cookie.get('bbcLanguage') || 'zh_CN'
  18. config.headers.timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone || 'Asia/Shanghai'
  19. if (config.url === '/p/user/recentBrowse') {
  20. config.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'
  21. } else {
  22. config.headers['Content-Type'] = 'application/json; charset=utf-8'
  23. }
  24. const token = cookie.get('bbcToken')
  25. if (token && (config.url.indexOf('/p/') === 0 || config.url === '/user/registerOrBindUser' || config.url === '/prod/prodInfo' || config.url === '/seckill/prod')) {
  26. config.headers.Authorization = token
  27. }
  28. config.url = import.meta.env.VITE_APP_BASE_API + config.url
  29. return config
  30. },
  31. error => {
  32. return Promise.reject(error)
  33. }
  34. )
  35. // 响应拦截
  36. http.interceptors.response.use(
  37. response => {
  38. const responseData = response.data
  39. // 已登录但没有用户信息时更新用户信息
  40. if (response.config.url.includes('/p/') && responseData.code !== 'A00004' && !useUserStore().nickName) {
  41. useUserStore().initUser()
  42. }
  43. if (responseData.success && responseData.code === '00000') {
  44. return Promise.resolve(responseData)
  45. } else if (responseData.code === 'A00002') {
  46. return Promise.resolve(responseData)
  47. } else {
  48. // 未授权
  49. if (responseData.code === 'A00004') {
  50. const showLogin = !response.config.dontShowLogin
  51. cookie.remove('bbcToken')
  52. // 清除用户信息
  53. useUserStore().resetUser()
  54. if (location.pathname.indexOf('user') > -1 || location.pathname.indexOf('order') > -1) {
  55. router.push('/login')
  56. } else {
  57. bus.emit('showLogin', showLogin) // 全局事件
  58. }
  59. } else if (responseData.code === 'A00001') {
  60. if (response.config.hasCatch) return Promise.reject(response) // 自定义处理提示信息
  61. // 订单接口错误不显示提示
  62. if (response.config.url.includes('/p/myOrder/orderDetail')) {
  63. return Promise.reject(response)
  64. }
  65. // A00001 用于直接显示提示用户的错误,内容由输入内容决定
  66. ElMessage({
  67. message: responseData.msg || 'Error',
  68. type: 'error',
  69. duration: 1500
  70. })
  71. return Promise.reject(response)
  72. } else if (responseData.code === 'A00005') {
  73. // 出小差
  74. ElMessage({
  75. message: $t('serviceError'),
  76. type: 'error',
  77. duration: 1500
  78. })
  79. console.error('============== 请求异常 ==============')
  80. console.log('接口地址: ', response.config.url.replace(import.meta.env.VITE_APP_BASE_APIpath, ''))
  81. console.log('异常信息: ', responseData)
  82. console.error('============== 请求异常 end ==========')
  83. }
  84. return Promise.reject(response)
  85. }
  86. },
  87. error => {
  88. console.log('error', error)
  89. }
  90. )
  91. const uploadFile = function (url, file) {
  92. return axios.put(url, file)
  93. }
  94. export default http
  95. export { uploadFile }