interceptor.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import Taro from '@tarojs/taro';
  2. import api from './server/index';
  3. import { setApp } from './config';
  4. import bookStore from '@src/store/book'
  5. import { enumDictList, getRechargeTemplate } from './server/index/index';
  6. import indexStore from './store/index'
  7. export interface ResData {
  8. code: number,
  9. data: any,
  10. fail: boolean,
  11. msg: string,
  12. success: boolean
  13. }
  14. //拦截器
  15. let isOpne = false //弹窗是否开启
  16. // 因没有权限等待的请求
  17. let pendingRequests: any[] = [];
  18. // 请求拦截器
  19. const requestInterceptor = (chain) => {
  20. // 展示loding弹窗逻辑
  21. if (app.isLoding && !isOpne) {
  22. isOpne = true
  23. Taro.showLoading({ title: "加载中..." })
  24. }
  25. const requestParams = chain.requestParams;
  26. requestParams.url = requestParams.url?.match(/^http[s]?:\/\//ig) ? requestParams.url : app.apiUrl + requestParams.url
  27. // 是登录接口token换成inittoken
  28. let token = requestParams.url.match(/(\/jsCodeLogin)|(\/appComponent\/list)/ig) ? app.initToken : app.token
  29. // 不存在token并且不是init和login接口关闭请求
  30. if (!token && !requestParams.url.match(/(\/jsCodeLogin)|(\/loginInitialize)/ig)) {
  31. // 打印日志或执行一些清理操作
  32. console.log("Token 无效,取消请求,并存入待请求列表,授权后重新请求");
  33. // 存入待请求列表
  34. pendingRequests.push(chain);
  35. // 返回一个被拒绝的Promise以中断请求
  36. return new Promise(() => { });
  37. }
  38. //分类列表假如上次请求的频道没变就不再获取
  39. if (requestParams.url.includes('/app/bookCategory/list')) {
  40. if (requestParams.data.workDirection === bookStore.oldWorkDirection) {
  41. log("阻止参数不变获取分类")
  42. return new Promise(() => { });
  43. } else {
  44. //赋值本次的请求
  45. bookStore.setData({ oldWorkDirection: requestParams.data.workDirection })
  46. }
  47. }
  48. requestParams.header = {
  49. ...requestParams.header,
  50. "Token": token
  51. }
  52. // 继续请求
  53. return chain.proceed(requestParams);
  54. };
  55. // 响应拦截器
  56. const responseInterceptor = (chain) => {
  57. return chain.proceed(chain.requestParams).then(async (response) => {
  58. const { data } = response;
  59. let { code } = data
  60. // 在这里处理返回的数据
  61. switch (code) {
  62. case 200:
  63. // 初始化接口调用登录接口,登录接口存在自己的执行判断
  64. if (chain.requestParams.url.includes("loginInitialize")) {
  65. // 存放初始token和app信息
  66. setApp({ initToken: data.data.token, appInfo: data.data.appInfo,payVersion:data.data.appInfo.iosPayment })
  67. // 获取枚举
  68. enumDictList()
  69. // 登录
  70. let user: any = await api.login()
  71. // 存放user信息到本地
  72. Taro.setStorageSync("userInfo", user)
  73. // 获取充值模板
  74. await getRechargeTemplate()
  75. // 判断是否需要隐藏支付
  76. if(app.system === "ios"){
  77. let iosShowPay = app?.proVersion? app?.payVersion >= app?.proVersion : false
  78. console.log("是ios",iosShowPay)
  79. setApp({iosShowPay})
  80. }else{
  81. setApp({iosShowPay:true})
  82. }
  83. console.log("获取当前APP", app); // 获取当前小程序版本号,
  84. // 设置已登录状态让页面刷新接口
  85. indexStore.setData({ isLogin: true })
  86. // 检测待请求列表中是否存在请求,存在就执行请求
  87. while (pendingRequests.length > 0) {
  88. console.log("存在待请求")
  89. const pendingChain = pendingRequests.shift();
  90. Taro.request(pendingChain.requestParams);
  91. }
  92. }
  93. break;
  94. case 300:
  95. log("token过期,重新登录", data)
  96. setApp({ token: "" })
  97. await api.loginInit(app.appId)
  98. // 重新执行当前请求
  99. console.log("登录后重新请求===>")
  100. const newRequestParams = chain.requestParams;
  101. return Taro.request(newRequestParams).then(newResponse => newResponse.data);
  102. default:
  103. log("未知错误", data)
  104. Taro.showToast({
  105. title: data.msg,
  106. icon: 'error',
  107. duration: 1000
  108. })
  109. break;
  110. }
  111. //关闭login弹窗
  112. if (isOpne) {
  113. isOpne = false
  114. Taro.hideLoading()
  115. }
  116. return data;
  117. });
  118. };
  119. // 添加请求拦截器
  120. Taro.addInterceptor(requestInterceptor);
  121. // 添加响应拦截器
  122. Taro.addInterceptor(responseInterceptor);