request.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. // import {
  2. // refreshTokenFn
  3. // } from "@/api/services/login.js";
  4. import api from "@/config/api.js";
  5. import Request from "@/utils/lib/request/index.js";
  6. import Foundation from "@/utils/Foundation.js";
  7. import md5 from "@/utils/md5.js";
  8. import storage from "@/utils/storage.js";
  9. import jwt from '@/utils/js_sdk/t-jwt/jwt.js';
  10. import uuid from "@/utils/uuid.modified.js";
  11. // Vue3: Store is already migrated to use createStore from Vuex 4.x
  12. // Direct state access (store.state.xxx) is still valid in Vuex 4.x
  13. import store from "../store";
  14. let isNavigateTo = false
  15. function cleanStorage() {
  16. uni.showToast({
  17. title: "你的登录状态已过期,请重新登录",
  18. icon: "none",
  19. duration: 1500,
  20. });
  21. if (uni.showLoading()) {
  22. uni.hideLoading();
  23. }
  24. storage.setHasLogin(false);
  25. storage.setAccessToken("");
  26. // storage.setRefreshToken("");
  27. storage.setUuid("");
  28. storage.setUserInfo({});
  29. /* if (!isNavigateTo) {
  30. isNavigateTo = true
  31. // 防抖处理跳转
  32. // #ifdef MP-WEIXIN || MP-HARMONY
  33. uni.navigateTo({
  34. url: "/pages/login/index",
  35. });
  36. // #endif
  37. // #ifndef MP-WEIXIN || MP-HARMONY
  38. uni.navigateTo({
  39. url: "/pages/passport/login",
  40. });
  41. // #endif
  42. } */
  43. }
  44. let http = new Request();
  45. /**
  46. * 创建uuid方法
  47. */
  48. const createUuid = () => {
  49. if (!storage.getUuid()) {
  50. storage.setUuid(uuid.v4());
  51. console.log("uuid", storage.getUuid());
  52. }
  53. }
  54. http.setConfig((config) => {
  55. createUuid();
  56. /* 设置全局配置 */
  57. config.baseURL = api.serve;
  58. config.header = {
  59. ...config.header,
  60. };
  61. config.validateStatus = (statusCode) => {
  62. // 不论什么状态,统一在正确中处理
  63. return true;
  64. };
  65. return config;
  66. });
  67. http.interceptors.request.use(
  68. (config) => {
  69. /* 请求之前拦截器。可以使用async await 做异步操作 */
  70. let accessToken = storage.getAccessToken();
  71. if(storage.getInviter()){
  72. config.header.inviter = storage.getInviter();
  73. }
  74. console.log("请求前处理");
  75. if (accessToken) {
  76. /**
  77. * 使用JWT解析
  78. * 小于当前时间将当前token清除
  79. */
  80. const decodeJwt = jwt(accessToken);
  81. const timing = new Date().getTime() / 1000
  82. if (decodeJwt.exp <= timing) {
  83. accessToken = ""
  84. storage.setAccessToken('')
  85. }
  86. const nonce = Foundation.randomString(6);
  87. const timestamp = parseInt(new Date().getTime() / 1000);
  88. const sign = md5(nonce + timestamp + accessToken);
  89. const _params = {
  90. nonce,
  91. timestamp,
  92. sign,
  93. };
  94. let params = config.params || {};
  95. params = {
  96. ...params,
  97. ..._params
  98. };
  99. config.params = params;
  100. // config.header.accessToken = accessToken;
  101. config.header.Authorization = 'Bearer '+accessToken;
  102. }
  103. createUuid();
  104. config.header = {
  105. ...config.header,
  106. uuid: storage.getUuid()
  107. };
  108. return config;
  109. },
  110. (config) => {
  111. return Promise.reject(config);
  112. }
  113. );
  114. // 是否正在刷新的标记
  115. let isRefreshing = false;
  116. //重试队列
  117. let requests = [];
  118. // 必须使用异步函数,注意
  119. http.interceptors.response.use(
  120. async (response) => {
  121. isNavigateTo = false;
  122. uni.showLoading() ? uni.hideLoading() : '';
  123. let token = storage.getAccessToken();
  124. console.log("请求后的处理",response);
  125. // token存在但401,说明过期了
  126. if ((token && response.statusCode === 401) || response.data.status === 401) {
  127. console.log('token过期或无效,跳转登录', token);
  128. cleanStorage(); // 清理缓存中的token、用户信息等
  129. uni.showToast({
  130. title: '登录已过期,请重新登录',
  131. icon: 'none',
  132. duration: 2000,
  133. complete: () => {
  134. setTimeout(() => {
  135. uni.navigateTo({
  136. url: '/pages/login/index'
  137. }); // 跳转登录页
  138. }, 2000);
  139. }
  140. });
  141. return Promise.reject('登录状态过期');
  142. }
  143. // 未登录也跳转
  144. if ((!token && !storage.getAccessToken() && response.statusCode === 401) || response.data.code === 401 || response.data.code === 403) {
  145. console.log('无token,跳转登录');
  146. cleanStorage();
  147. uni.showToast({
  148. title: `请先登录${storage.getAccessToken()}`,
  149. icon: 'none',
  150. duration: 2000,
  151. complete: () => {
  152. setTimeout(() => {
  153. uni.navigateTo({
  154. url: '/pages/login/index'
  155. });
  156. }, 2000);
  157. }
  158. });
  159. return Promise.reject('未登录');
  160. }
  161. // 请求成功但业务失败
  162. if (
  163. (response.statusCode === 200 && !response.data.success) ||
  164. response.statusCode === 400
  165. ) {
  166. if (response.data.message) {
  167. uni.showToast({
  168. title: response.data.message,
  169. icon: "none",
  170. duration: 1500,
  171. success: () => { store.state.isShowToast = true; },
  172. fail: () => { store.state.isShowToast = false; },
  173. complete: () => { store.state.isShowToast = false; }
  174. });
  175. }
  176. }
  177. return response;
  178. },
  179. (error) => {
  180. return Promise.reject(error);
  181. }
  182. );
  183. export {
  184. http
  185. };
  186. export const Method = {
  187. GET: "GET",
  188. POST: "POST",
  189. PUT: "PUT",
  190. DELETE: "DELETE",
  191. };