request.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import { extend } from 'umi-request'
  2. import cleanDeep from 'clean-deep'
  3. import { browser, openLoading, closeLoading } from '@/helpers/utils'
  4. import { setLogout, setLoginError, state } from '@/state'
  5. import { postMessage } from './native-message'
  6. import { showLoadingToast, showToast, closeToast } from 'vant'
  7. import baseEvent from '@/base-event'
  8. export interface SearchInitParams {
  9. rows?: string | number
  10. page?: string | number
  11. }
  12. const request = extend({
  13. // requestType: 'form',
  14. timeout: 20000,
  15. timeoutMessage: '请求超时'
  16. })
  17. // request.use(async (ctx, next) => {
  18. // const { url, options } = ctx.req
  19. // const prefix = options.prefix || '';
  20. // const baseUrl: string = url.replace(prefix, '') || '';
  21. // const linkUrl: string = (ApiRouter as any)[baseUrl];
  22. // if (linkUrl) {
  23. // ctx.req.url = prefix + linkUrl;
  24. // }
  25. // await next();
  26. // })
  27. // 是否是初始化接口
  28. let initRequest = false
  29. let toast: ReturnType<typeof setTimeout>
  30. request.interceptors.request.use(
  31. (url, options: any) => {
  32. // openLoading();
  33. if (!options.hideLoading) {
  34. clearTimeout(toast)
  35. baseEvent.emit('toastShow')
  36. // clearTimeout(toast)
  37. // showLoadingToast({
  38. // message: '加载中...',
  39. // forbidClick: true,
  40. // loadingType: 'spinner',
  41. // duration: 0
  42. // })
  43. }
  44. initRequest = options.initRequest || false
  45. const Authorization = sessionStorage.getItem('Authorization') || ''
  46. const authHeaders: any = {}
  47. if (
  48. Authorization &&
  49. ![
  50. '/api-oauth/userlogin',
  51. // `${state.platformApi}/user/getUserInfo`,
  52. '/api-oauth/open/sendSms'
  53. ].includes(url)
  54. ) {
  55. authHeaders.Authorization = Authorization
  56. }
  57. if (state?.user?.data?.schoolInfos) {
  58. const schoolId = (state.user.data.schoolInfos || [])
  59. .map((item) => {
  60. return item.id
  61. })
  62. .join(',')
  63. if (schoolId) {
  64. // console.log('schoolId', schoolId)
  65. // options.data ? (options.data.schoolId = schoolId) : null
  66. // options.params ? (options.params.schoolId = schoolId) : null
  67. authHeaders.schoolId = schoolId
  68. }
  69. }
  70. return {
  71. url,
  72. options: {
  73. ...options,
  74. params: cleanDeep(options.params),
  75. data: cleanDeep(options.data),
  76. headers: {
  77. ...options.headers,
  78. ...authHeaders
  79. }
  80. }
  81. }
  82. },
  83. { global: false }
  84. )
  85. request.interceptors.response.use(
  86. async (res) => {
  87. toast = setTimeout(() => {
  88. baseEvent.emit('toastClose')
  89. // closeToast()
  90. }, 100)
  91. if (res.status > 299 || res.status < 200) {
  92. clearTimeout(toast)
  93. const msg = '服务器错误,状态码' + res.status
  94. baseEvent.emit('toastClose')
  95. showToast(msg)
  96. throw new Error(msg)
  97. }
  98. const data = await res.clone().json()
  99. // 999 为特殊code码
  100. if (data.code !== 200 && data.errCode !== 0 && data.code !== 999) {
  101. let msg = data.msg || data.message || '处理失败,请重试'
  102. if (initRequest) {
  103. if (data.code === 403 || data.code === 5000) {
  104. setLogout()
  105. } else {
  106. setLoginError()
  107. }
  108. }
  109. console.log(data.code, '5104')
  110. if (!(data.code === 403 || data.code === 5000)) {
  111. clearTimeout(toast)
  112. baseEvent.emit('toastClose')
  113. showToast(msg)
  114. }
  115. const browserInfo = browser()
  116. if (data.code === 5000) {
  117. msg += '5000'
  118. if (browserInfo.isApp) {
  119. postMessage({
  120. api: 'login'
  121. })
  122. } else {
  123. setLogout()
  124. }
  125. }
  126. throw new Error(msg)
  127. }
  128. return res
  129. },
  130. { global: false }
  131. )
  132. export default request