index.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /* eslint-disable */
  2. import Request from './request';
  3. import { refreshToken } from '@/api/login';
  4. import indexConfig from '@/config/index.config';
  5. import mHelper from '@/utils/helper';
  6. import store from '@/store';
  7. const http = new Request();
  8. // request全局参数设置
  9. http.setConfig(config => {
  10. /* 设置全局配置 */
  11. config.baseUrl = indexConfig.baseUrl; /* 根域名不同 */
  12. const systemInfo = uni.getSystemInfoSync();
  13. const systemInfoHeaders = {
  14. 'device-name': systemInfo.brand, // 设备名称
  15. width: systemInfo.screenWidth, // 屏幕宽度
  16. height: systemInfo.screenHeight, // 屏幕高度
  17. os: systemInfo.platform, // 客户端平台
  18. 'os-version': systemInfo.system // 操作系统版本
  19. };
  20. config.header = {
  21. ...config.header,
  22. ...systemInfoHeaders
  23. };
  24. return config;
  25. });
  26. let isRefreshing = false;
  27. let requests = [];
  28. http.interceptor.request(
  29. config => {
  30. /* 请求之前拦截器 */
  31. config.header['token'] = uni.getStorageSync('accessToken');
  32. // 单商户
  33. // config.header['merchant-id'] = uni.getStorageSync('merchantId') || 1;
  34. return config;
  35. },
  36. error => {
  37. return Promise.reject(error);
  38. }
  39. );
  40. // 刷新refreshToken
  41. async function handleRefreshToken(refresh_token) {
  42. const params = {};
  43. params.group = mHelper.platformGroupFilter();
  44. params.refreshToken = refresh_token;
  45. await http.get(refreshToken, params).then(async r => {
  46. store.commit('login', r.data);
  47. isRefreshing = false;
  48. });
  49. }
  50. http.interceptor.response(
  51. async response => {
  52. /* 请求之后拦截器 */
  53. switch (response.data.status) {
  54. case 200:
  55. return response.data;
  56. case 400:
  57. mHelper.toast('错误的请求');
  58. return Promise.reject(response.data.msg);
  59. case 401:
  60. uni.removeStorageSync('accessToken');
  61. await store.commit('logout');
  62. uni.showModal({
  63. content: '登录已过期,是否跳转登录页面?',
  64. success: confirmRes => {
  65. if (confirmRes.confirm) {
  66. mHelper.backToLogin();
  67. throw response.data.msg;
  68. }
  69. }
  70. });
  71. throw response.data.msg;
  72. case 403:
  73. isRefreshing = false;
  74. // refreshToken 的返回状态为403
  75. if (response.config.url === refreshToken) {
  76. uni.removeStorageSync('accessToken');
  77. await store.commit('logout');
  78. uni.showModal({
  79. content: '登录已过期,是否跳转登录页面?',
  80. success: confirmRes => {
  81. if (confirmRes.confirm) {
  82. mHelper.backToLogin();
  83. throw response.data.msg;
  84. }
  85. }
  86. });
  87. break;
  88. } else {
  89. // 如果refreshToken为空 则直接跳转登录
  90. if (!store.state.refreshToken) {
  91. uni.removeStorageSync('accessToken');
  92. await store.commit('logout');
  93. uni.showModal({
  94. content: '登录已过期,是否跳转登录页面?',
  95. success: confirmRes => {
  96. if (confirmRes.confirm) {
  97. mHelper.backToLogin();
  98. throw response.data.msg;
  99. }
  100. }
  101. });
  102. throw response.data.msg;
  103. } else {
  104. // isRefreshing同一个页面只执行一次
  105. if (!isRefreshing) {
  106. isRefreshing = true;
  107. // 刷新token
  108. await handleRefreshToken(store.state.refreshToken, response);
  109. requests.forEach(cb => cb());
  110. requests = [];
  111. isRefreshing = false;
  112. return http.request(response.config);
  113. } else {
  114. return new Promise(resolve => {
  115. // 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行
  116. requests.push(() => {
  117. resolve(http.request(response.config));
  118. });
  119. });
  120. }
  121. }
  122. }
  123. break;
  124. // mHelper.toast(response.data.msg);
  125. // return Promise.reject(response.data.msg);
  126. case 405:
  127. mHelper.toast('当前操作不被允许');
  128. return Promise.reject(response.data.msg);
  129. case 404:
  130. mHelper.toast(response.data.msg);
  131. return Promise.reject(response.data.msg);
  132. case 429:
  133. mHelper.toast('请求过多,先休息一下吧');
  134. return Promise.reject(response.data.msg);
  135. case 500:
  136. mHelper.toast(response.data.msg);
  137. return Promise.reject(response.data.msg);
  138. default:
  139. return response.data;
  140. // mHelper.toast(response.data.msg);
  141. // return Promise.reject(response.data.msg);
  142. }
  143. },
  144. error => {
  145. return Promise.reject(error);
  146. }
  147. );
  148. export { http };