request.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import axios, { AxiosResponse, InternalAxiosRequestConfig } from 'axios';
  2. import utils from '@/utils/index';
  3. import router from '@/router';
  4. function jumpTo(){
  5. //清空缓存
  6. // localStorage.clear();
  7. localStorage.removeItem('token');
  8. localStorage.removeItem('userInfo');
  9. let loginType = localStorage.getItem('loginType');
  10. if(!['/login','/login/qrcode','/login/sunshineRun'].includes(router.currentRoute.value.path)){
  11. if (loginType == "3") {
  12. router.push('/login/sunshineRun?auto=1');
  13. } else if (loginType == "2") {
  14. router.push('/login/qrcode?auto=1');
  15. } else {
  16. router.push('/login?auto=1');
  17. }
  18. }
  19. };
  20. axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
  21. axios.defaults.headers['auth'] = true;
  22. // 创建 axios 实例
  23. const service = axios.create({
  24. baseURL: import.meta.env.VITE_APP_BASE_API,
  25. timeout: 20000
  26. });
  27. // 请求拦截器
  28. service.interceptors.request.use(
  29. (config: InternalAxiosRequestConfig) => {
  30. //console.log("config", config)
  31. const token = localStorage.getItem('token') || '';
  32. if (token && Boolean(config.headers['auth']) == true) {
  33. config.headers['Authorization'] = 'JWT ' + token;
  34. }
  35. if (!token && Boolean(config.headers['auth']) == true) {
  36. delete config.headers['auth'];
  37. const message = '缺少凭证,请重新登录!';
  38. jumpTo();
  39. ElMessage({ message: message, type: 'error', duration: 5 * 1000 });
  40. return Promise.reject(message);
  41. }
  42. // get请求修改Content-Type
  43. if (config.method?.toLowerCase() === 'get') {
  44. config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
  45. }
  46. // get请求映射params参数
  47. if (config.method === 'get' && config.data) {
  48. let url = config.url + '?' + utils.tansParams(config.data);
  49. url = url.slice(0, -1);
  50. config.data = {};
  51. config.url = url;
  52. }
  53. // FormData数据去请求头Content-Type
  54. if (config.data instanceof FormData) {
  55. delete config.headers['Content-Type'];
  56. }
  57. delete config.headers['auth'];
  58. return config;
  59. },
  60. (error: any) => {
  61. //console.log(error);
  62. return Promise.reject(error);
  63. }
  64. );
  65. // 响应拦截器
  66. service.interceptors.response.use(
  67. (res: AxiosResponse) => {
  68. const code = res.data.code;
  69. const status = res.data.status;
  70. const message = res.data.message;
  71. if (code === 401) {
  72. jumpTo();
  73. ElMessage({ message: message, type: 'error', duration: 5 * 1000 });
  74. return Promise.reject('凭证已过期,请重新登录!');
  75. } else if (status == 500) {
  76. ElMessage({ message: message, type: 'error', duration: 5 * 1000 });
  77. return Promise.reject(message);
  78. } else {
  79. return Promise.resolve(res.data);
  80. }
  81. },
  82. (error: any) => {
  83. let { message, response } = error;
  84. if (message == 'Network Error') {
  85. message = '网络异常';
  86. } else if (message.includes('timeout')) {
  87. message = '请求超时';
  88. } else if (response.status == 401) {
  89. jumpTo();
  90. ElMessage({ message: '请重新登录', type: 'error', duration: 5 * 1000 });
  91. return Promise.reject('凭证已过期,请重新登录!');
  92. } else if (message.includes('Request failed with status code')) {
  93. if (response.data.status) {
  94. message = response.data.message;
  95. } else {
  96. message = '系统接口' + message.substr(message.length - 3) + '异常';
  97. }
  98. }
  99. ElMessage({ message: message, type: 'error', duration: 5 * 1000 });
  100. return Promise.reject(error);
  101. }
  102. );
  103. export default service;