fetch.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /**
  2. * Created by ebi on 2017/5/11.
  3. */
  4. import axios from './axios.js'
  5. import router from '../router'
  6. import { removeToken, getToken } from '../utils/auth'
  7. import { ElMessage } from 'element-plus'
  8. axios.defaults.baseURL = ''
  9. axios.interceptors.request.use(config => {
  10. config.headers.token = getToken()
  11. // 小程序里用m的页面
  12. config.headers.Platform = 'pc'
  13. if (getToken() === null || getToken() === undefined) {
  14. delete config.headers.token
  15. }
  16. return config
  17. }, err => {
  18. return Promise.reject(err)
  19. })
  20. // insurance 保险 502 503 504时兜底的
  21. function fetch (url = '', params = {}, method = 'get', contentType = 'form', header = {}, insurance, timeout = 15000) {
  22. contentType === 'form' && (contentType = 'application/x-www-form-urlencoded')
  23. contentType === 'json' && (contentType = 'application/json')
  24. contentType === 'file' && (contentType = 'multipart/form-data')
  25. const query = []
  26. for (const k in params) {
  27. query.push(k + '=' + params[k])
  28. }
  29. let qs = query.join('&')
  30. if (contentType === 'application/x-www-form-urlencoded' && query.length > 0) {
  31. url += (url.indexOf('?') < 0 ? '?' : '&') + qs
  32. }
  33. if (contentType !== 'application/x-www-form-urlencoded' && method !== 'get') {
  34. qs = params
  35. }
  36. return new Promise((resolve, reject) => {
  37. const requestParams = {
  38. timeout,
  39. method,
  40. url: '/api' + url,
  41. data: qs,
  42. headers: {
  43. 'Content-Type': contentType,
  44. ...header
  45. }
  46. }
  47. const success = (response) => {
  48. const {
  49. status,
  50. data = {},
  51. statusText
  52. } = response
  53. if (status >= 200 && status <= 401) {
  54. if (data.code === 401) { // 未登录c
  55. removeToken()
  56. router.push(`/?redirect=${encodeURIComponent(window.location.href)}`)
  57. reject(new Error('需要登录'))
  58. ElMessage.error('登录过期,请重新登录')
  59. return
  60. }
  61. resolve(data)
  62. } else if (status === 500) {
  63. resolve(data)
  64. router.push('/500')
  65. } else {
  66. resolve(data)
  67. ElMessage.success(status + '-' + statusText)
  68. }
  69. }
  70. axios(requestParams).then(success).catch((err) => {
  71. if (/502|503|504/.test(err.message) || (err + '').indexOf('timeout') > -1) {
  72. if (insurance) {
  73. resolve(insurance)
  74. return
  75. }
  76. let msg = '系统繁忙,正在为您排队中,请稍后再试'
  77. if (window.location.href.indexOf('/zu') > -1) {
  78. msg += ` ${err.message}`
  79. }
  80. ElMessage.error(msg)
  81. } else {
  82. resolve(err.data)
  83. // ElMessage.error(err.data.error_description ? err.data.error_description : '网络异常,请点击重试')
  84. }
  85. })
  86. })
  87. }
  88. export default fetch