You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

httpN.ts 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. import { IHttpResponse, IObject } from '@/types/interface'
  2. import router from "@/router";
  3. // import { useRouter, useRoute } from 'vue-router'
  4. import axios, { AxiosRequestConfig } from 'axios'
  5. import qs from 'qs'
  6. import { getToken } from './cache'
  7. import { getValueByKeys } from './utils'
  8. import { ElMessage } from 'element-plus'
  9. import { SM4Util } from '@/utils/sm4'
  10. import { sm4Key } from '@/utils/utils'
  11. import BaseService from '@/utils/baseService'
  12. import { setCache } from '@/utils/cache'
  13. // const router = useRouter()
  14. const sm4 = new SM4Util()
  15. let baseURL = ''
  16. // console.log(import.meta.env)
  17. if (import.meta.env.MODE === 'production') {
  18. // 生产环境逻辑
  19. // console.log('这是生产环境')
  20. baseURL = import.meta.env.VITE_APP_BASE_URL_N
  21. }
  22. const httpN = axios.create({
  23. baseURL,
  24. timeout: 10 * 1000,
  25. })
  26. httpN.interceptors.request.use(
  27. function (config: any) {
  28. config.headers['X-Requested-With'] = 'XMLHttpRequest'
  29. config.headers['Request-Start'] = new Date().getTime()
  30. const token = getToken()
  31. if (token) {
  32. config.headers['Access-Token'] = token
  33. }
  34. if (config.method?.toUpperCase() === 'GET') {
  35. config.params = { ...config.params, _t: new Date().getTime() }
  36. }
  37. if (
  38. Object.values(config.headers).includes(
  39. 'application/x-www-form-urlencoded'
  40. )
  41. ) {
  42. config.data = qs.stringify(config.data)
  43. }
  44. return config
  45. },
  46. function (error) {
  47. return Promise.reject(error)
  48. }
  49. )
  50. // httpN.interceptors.response.use(
  51. // (response) => {
  52. // if (response.data.code === 401002) {
  53. // ElMessage.error(response.data.message)
  54. // redirectLogin();
  55. // } else if (response.data.code === 401001) {
  56. // redirectLogin()
  57. // } else if (
  58. // response.data.code === 403003 ||
  59. // response.data.code === 403001 ||
  60. // response.data.code === 403004
  61. // ) {
  62. // ElMessage.error(response.data.message)
  63. // }
  64. // return response
  65. // },
  66. // (error) => {
  67. // const status = getValueByKeys(error, 'response.status', 500)
  68. // const httpCodeLabel: IObject<string> = {
  69. // 400: '请求参数错误',
  70. // 401: '未授权,请登录',
  71. // 403: '拒绝访问',
  72. // 404: `请求地址出错: ${getValueByKeys(error, 'response.config.url', '')}`,
  73. // 408: '请求超时',
  74. // 500: 'API接口报500错误',
  75. // 501: '服务未实现',
  76. // 502: '网关错误',
  77. // 503: '服务不可用',
  78. // 504: '网关超时',
  79. // 505: 'HTTP版本不受支持',
  80. // }
  81. // if (error && error.response) {
  82. // console.error('请求错误', error.response.data)
  83. // }
  84. // if (status === 401) {
  85. // redirectLogin()
  86. // }
  87. // return Promise.reject(new Error(httpCodeLabel[status] || '接口错误'))
  88. // }
  89. // )
  90. //
  91. // 防抖标志位(默认允许显示错误)
  92. let canShowError = true;
  93. // 恢复错误显示权限(防抖时间结束后允许再次显示)
  94. const resetErrorPermission = () => {
  95. canShowError = true;
  96. };
  97. httpN.interceptors.response.use(
  98. (response) => {
  99. // console.log('响应N==>', response)
  100. const code = response.data.code || 200;
  101. const msg = response.data.message;
  102. // 处理msg中有多个'业务校验失败:',只显示一个
  103. msg.replace(/(业务校验失败:)+/, "业务校验失败:");
  104. // console.log('响应N==>', code,":", msg)
  105. // console.log('canShowError',canShowError)
  106. // 处理 401002 错误(token已过期)
  107. if (code === 401002) {
  108. if (canShowError) {
  109. canShowError = false;
  110. console.log('处理 401002 错误')
  111. ElMessage.error(msg);
  112. setTimeout(resetErrorPermission, 5000); // 1秒后允许再次显示错误
  113. }
  114. redirectLogin();
  115. }
  116. // 处理 401001 错误(直接跳转登录,不显示错误)
  117. else if (code === 401001) {
  118. redirectLogin();
  119. }
  120. // 处理 403xxx 系列错误(显示错误)
  121. else if (code === 403001) {
  122. if (canShowError) {
  123. canShowError = false;
  124. ElMessage.error(msg);
  125. setTimeout(resetErrorPermission, 1000); // 1秒后允许再次显示错误
  126. }
  127. return Promise.reject(response.data.data);
  128. }
  129. else if (
  130. code === 403003 ||
  131. code === 403004
  132. ) {
  133. if (canShowError) {
  134. canShowError = false;
  135. ElMessage.error(msg);
  136. setTimeout(resetErrorPermission, 1000); // 1秒后允许再次显示错误
  137. }
  138. return Promise.reject(msg);
  139. }
  140. // 其他非 200 错误(添加防抖)
  141. else if (code !== 200) {
  142. if (canShowError) {
  143. canShowError = false;
  144. ElMessage.error(msg);
  145. setTimeout(resetErrorPermission, 1000); // 1秒后允许再次显示错误
  146. }
  147. return Promise.reject("error");
  148. }else {
  149. return response;
  150. }
  151. },
  152. (error) => {
  153. console.log("error==>", error)
  154. const status = getValueByKeys(error, "response.status", 500);
  155. const httpCodeLabel: IObject<string> = {
  156. 400: "请求参数错误",
  157. 401: "未授权,请登录",
  158. 403: "拒绝访问",
  159. 404: `请求地址出错: ${getValueByKeys(error, "response.config.url", "")}`,
  160. 408: "请求超时",
  161. 500: "API接口报500错误",
  162. 501: "服务未实现",
  163. 502: "网关错误",
  164. 503: "服务不可用",
  165. 504: "网关超时",
  166. 505: "HTTP版本不受支持"
  167. };
  168. if (error && error.response) {
  169. console.error("请求错误", error.response.data);
  170. }
  171. if (status === 401) {
  172. redirectLogin();
  173. }
  174. return Promise.reject(new Error(httpCodeLabel[status] || "接口错误"));
  175. }
  176. );
  177. const redirectLogin = () => {
  178. // console.log('redirectLogin');
  179. router.push('/login')
  180. return
  181. }
  182. export default (o: AxiosRequestConfig): Promise<IHttpResponse> => {
  183. return new Promise((resolve, reject) => {
  184. httpN(o)
  185. .then((res: any) => {
  186. if(res){
  187. res.data.statusCode = res.data.code
  188. return resolve(res.data)
  189. }
  190. })
  191. .catch(reject)
  192. })
  193. }