http.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. import { Code } from '/admin/enum/app'
  2. import axios, { AxiosInstance, AxiosRequestConfig } from 'axios'
  3. import { env, getAuthToken, removeAuthToken } from './helper'
  4. import Message from './message'
  5. import router from '/admin/router'
  6. import ResponseData from '/admin/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 : 10000
  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 (config: AxiosRequestConfig) {
  136. const token = getAuthToken()
  137. if (token) {
  138. if (!config.headers) {
  139. config.headers = {}
  140. }
  141. config.headers.authorization = 'Bearer ' + token
  142. }
  143. return config
  144. })
  145. }
  146. /**
  147. * 添加响应拦截器
  148. *
  149. */
  150. public interceptorsOfResponse(): void {
  151. this.request.interceptors.response.use(
  152. response => {
  153. const r: ResponseData = response.data
  154. const code = r.code
  155. const message = r.message
  156. if (code === 1e4) {
  157. return response
  158. }
  159. if (code === 10004) {
  160. Message.error(message || 'Error')
  161. } else if (code === Code.LOST_LOGIN || code === Code.LOGIN_EXPIRED) {
  162. // to re-login
  163. Message.confirm(message + ',需要重新登陆', function () {
  164. removeAuthToken()
  165. router.push('/login')
  166. })
  167. } else if (code === Code.LOGIN_BLACKLIST || code === Code.USER_FORBIDDEN) {
  168. Message.error(message || 'Error')
  169. removeAuthToken()
  170. // to login page
  171. router.push('/login')
  172. } else {
  173. Message.error(message || 'Error')
  174. }
  175. return Promise.reject(new Error(message || 'Error'))
  176. },
  177. error => {
  178. Message.error(error.message)
  179. return Promise.reject(error)
  180. },
  181. )
  182. }
  183. }
  184. const http = new Http()
  185. http.interceptorsOfRequest()
  186. http.interceptorsOfResponse()
  187. export default http