index.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. import Axios, { AxiosInstance, AxiosRequestConfig } from "axios";
  2. import qs from "qs";
  3. import NProgress from "../progress";
  4. import { getToken, getRelaComNo } from "/@/utils/auth";
  5. import { store } from "/@/store";
  6. import { trigger } from "/@/plugins/errorHooks/trigger";
  7. import {
  8. PureHttpError,
  9. RequestMethods,
  10. PureHttpResponse,
  11. PureHttpRequestConfig
  12. } from "./types.d";
  13. // 相关配置请参考:www.axios-js.com/zh-cn/docs/#axios-request-config-1
  14. const defaultConfig: AxiosRequestConfig = {
  15. baseURL: "",
  16. timeout: 10000,
  17. headers: {
  18. Accept: "application/json, text/plain, */*",
  19. "Content-Type": "application/json",
  20. "X-Requested-With": "XMLHttpRequest"
  21. },
  22. // 数组格式参数序列化
  23. paramsSerializer: params => qs.stringify(params, { indices: false })
  24. };
  25. class PureHttp {
  26. constructor() {
  27. this.httpInterceptorsRequest();
  28. this.httpInterceptorsResponse();
  29. }
  30. // 初始化配置对象
  31. private static initConfig: PureHttpRequestConfig = {};
  32. // 保存当前Axios实例对象
  33. private static axiosInstance: AxiosInstance = Axios.create(defaultConfig);
  34. // 请求拦截
  35. private httpInterceptorsRequest(): void {
  36. PureHttp.axiosInstance.interceptors.response.use(response => {
  37. const { data } = response;
  38. const { code, message } = data;
  39. //响应code 检查登出
  40. if (
  41. Number(code) >= 101 &&
  42. Number(code) <= 140 &&
  43. message !== "账户已禁用"
  44. ) {
  45. trigger("userLogout");
  46. }
  47. return response;
  48. });
  49. PureHttp.axiosInstance.interceptors.request.use(
  50. (config: PureHttpRequestConfig) => {
  51. const $config = config;
  52. // console.log($config);
  53. // 开启进度条动画
  54. NProgress.start();
  55. // 优先判断post/get等方法是否传入回掉,否则执行初始化设置等回掉
  56. if (typeof config.beforeRequestCallback === "function") {
  57. config.beforeRequestCallback($config);
  58. return $config;
  59. }
  60. if (PureHttp.initConfig.beforeRequestCallback) {
  61. PureHttp.initConfig.beforeRequestCallback($config);
  62. return $config;
  63. }
  64. const token = getToken();
  65. const relaComNo = getRelaComNo();
  66. const isSuper = store.state.value["pure-user"].isSuperUser;
  67. if (token && config && config.data) {
  68. config.data["token"] = token;
  69. config.data["relaComNo"] = config.data["relaComNo"]
  70. ? config.data["relaComNo"]
  71. : relaComNo;
  72. if (config.data["noRela"] || isSuper) {
  73. config.data["relaComNo"] = "";
  74. delete config.data["noRela"];
  75. }
  76. if (config.data["emptyRela"] || isSuper) {
  77. delete config.data["relaComNo"];
  78. delete config.data["emptyRela"];
  79. }
  80. return $config;
  81. } else {
  82. return $config;
  83. }
  84. },
  85. error => {
  86. return Promise.reject(error);
  87. }
  88. );
  89. }
  90. // 响应拦截
  91. private httpInterceptorsResponse(): void {
  92. const instance = PureHttp.axiosInstance;
  93. instance.interceptors.response.use(
  94. (response: PureHttpResponse) => {
  95. const $config = response.config;
  96. // 关闭进度条动画
  97. NProgress.done();
  98. // 优先判断post/get等方法是否传入回掉,否则执行初始化设置等回掉
  99. if (typeof $config.beforeResponseCallback === "function") {
  100. $config.beforeResponseCallback(response);
  101. return response.data;
  102. }
  103. if (PureHttp.initConfig.beforeResponseCallback) {
  104. PureHttp.initConfig.beforeResponseCallback(response);
  105. return response.data;
  106. }
  107. return response.data;
  108. },
  109. (error: PureHttpError) => {
  110. const $error = error;
  111. $error.isCancelRequest = Axios.isCancel($error);
  112. // 关闭进度条动画
  113. NProgress.done();
  114. // 所有的响应异常 区分来源为取消请求/非取消请求
  115. return Promise.reject($error);
  116. }
  117. );
  118. }
  119. // 通用请求工具函数
  120. public request<T>(
  121. method: RequestMethods,
  122. url: string,
  123. param?: AxiosRequestConfig,
  124. axiosConfig?: PureHttpRequestConfig
  125. ): Promise<T> {
  126. const config = {
  127. method,
  128. url,
  129. ...param,
  130. ...axiosConfig
  131. } as PureHttpRequestConfig;
  132. // 单独处理自定义请求/响应回掉
  133. return new Promise((resolve, reject) => {
  134. PureHttp.axiosInstance
  135. .request(config)
  136. .then((response: undefined) => {
  137. resolve(response);
  138. })
  139. .catch(error => {
  140. reject(error);
  141. });
  142. });
  143. }
  144. // 单独抽离的post工具函数
  145. public post<T, P>(
  146. url: string,
  147. params?: T,
  148. config?: PureHttpRequestConfig
  149. ): Promise<P> {
  150. return this.request<P>("post", url, params, config);
  151. }
  152. // 单独抽离的get工具函数
  153. public get<T, P>(
  154. url: string,
  155. params?: T,
  156. config?: PureHttpRequestConfig
  157. ): Promise<P> {
  158. return this.request<P>("get", url, params, config);
  159. }
  160. }
  161. export const http = new PureHttp();