http.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. import { Code } from '@/enum/app';
  2. import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';
  3. import { env, getAuthToken, removeAuthToken } from '@/support/helper';
  4. import Message from '@/support/message';
  5. import router from '@/router';
  6. import ResponseData from '@/types/responseData';
  7. /**
  8. * http util
  9. */
  10. class Http {
  11. /**
  12. * axios config
  13. * @protected
  14. */
  15. protected config: AxiosRequestConfig = {};
  16. /**
  17. * base url
  18. * @protected
  19. */
  20. protected baseURL: string = '';
  21. /**
  22. * http request timeout
  23. *
  24. * @protected
  25. */
  26. protected timeout: number = 0;
  27. /**
  28. * http request headers
  29. *
  30. * @protected
  31. */
  32. protected headers: { [k: string]: string } = {};
  33. /**
  34. * axios instance
  35. *
  36. * @protected
  37. */
  38. protected request: AxiosInstance;
  39. /**
  40. * instance
  41. */
  42. constructor() {
  43. this.request = axios.create(this.getConfig());
  44. }
  45. /**
  46. * get request
  47. *
  48. * @param path
  49. * @param params
  50. */
  51. public get(path: string, params: object = {}) {
  52. return this.request.get(this.baseURL + path, {
  53. params
  54. });
  55. }
  56. /**
  57. * post request
  58. *
  59. * @param path
  60. * @param data
  61. */
  62. public post(path: string, data: object = {}) {
  63. return this.request.post(this.baseURL + path, data);
  64. }
  65. /**
  66. * put request
  67. *
  68. * @param path
  69. * @param data
  70. */
  71. public put(path: string, data: object = {}) {
  72. return this.request.put(this.baseURL + path, data);
  73. }
  74. /**
  75. * delete request
  76. *
  77. * @param path
  78. */
  79. public delete(path: string) {
  80. return this.request.delete(this.baseURL + path);
  81. }
  82. /**
  83. * set timeout
  84. *
  85. * @param timeout
  86. * @returns
  87. */
  88. public setTimeout(timeout: number): Http {
  89. this.timeout = timeout;
  90. return this;
  91. }
  92. /**
  93. * set baseurl
  94. *
  95. * @param url
  96. * @returns
  97. */
  98. public setBaseUrl(url: string): Http {
  99. this.baseURL = url;
  100. return this;
  101. }
  102. /**
  103. * set headers
  104. *
  105. * @param key
  106. * @param value
  107. * @returns
  108. */
  109. public setHeader(key: string, value: string): Http {
  110. this.headers.key = value;
  111. return this;
  112. }
  113. /**
  114. * get axios 配置
  115. *
  116. * @returns
  117. */
  118. protected getConfig(): AxiosRequestConfig {
  119. // set base url
  120. this.config.baseURL = this.baseURL ? this.baseURL : env('VITE_BASE_URL');
  121. // set timeout
  122. this.config.timeout = this.timeout ? this.timeout : 60000;
  123. // set ajax request
  124. this.headers['X-Requested-With'] = 'XMLHttpRequest';
  125. // set dashboard request
  126. this.headers['Request-from'] = 'Dashboard';
  127. this.config.headers = this.headers;
  128. return this.config;
  129. }
  130. /**
  131. * 添加请求拦截器
  132. *
  133. */
  134. public interceptorsOfRequest(): void {
  135. this.request.interceptors.request.use(function (
  136. config: AxiosRequestConfig
  137. ) {
  138. const token = getAuthToken();
  139. if (token) {
  140. if (!config.headers) {
  141. config.headers = {};
  142. }
  143. config.headers.authorization = 'Bearer ' + token;
  144. }
  145. return config;
  146. });
  147. }
  148. /**
  149. * 添加响应拦截器
  150. *
  151. */
  152. public interceptorsOfResponse(): void {
  153. this.request.interceptors.response.use(
  154. response => {
  155. const r: ResponseData = response.data;
  156. const code = r.code;
  157. const message = r.message;
  158. if (code === 1e4) {
  159. return r;
  160. }
  161. if (code === 10004) {
  162. Message.error(message || 'Error');
  163. } else if (code === Code.LOST_LOGIN || code === Code.LOGIN_EXPIRED) {
  164. // to re-login
  165. Message.confirm(message + ',需要重新登陆', function () {
  166. removeAuthToken();
  167. router.push('/login');
  168. });
  169. } else if (
  170. code === Code.LOGIN_BLACKLIST ||
  171. code === Code.USER_FORBIDDEN
  172. ) {
  173. Message.error(message || 'Error');
  174. removeAuthToken();
  175. // to login page
  176. router.push('/login');
  177. } else if (code === -2333) {//对视频上传错误特殊处理的状态码
  178. ElMessageBox.alert(
  179. `上传失败,《${message}》文件名已存在,请修改后重新上传`
  180. );
  181. } else {
  182. Message.error(message || 'Error');
  183. }
  184. return Promise.reject(new Error(message || 'Error'));
  185. },
  186. error => {
  187. Message.error(error.message);
  188. return Promise.reject(error);
  189. }
  190. );
  191. }
  192. }
  193. const http = new Http();
  194. http.interceptorsOfRequest();
  195. http.interceptorsOfResponse();
  196. export default http;