special_request.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import axios from 'axios';
  2. import { CACHE_KEY } from '@/constants';
  3. import { Local, Session } from '@/utils/storage';
  4. const api = axios.create({
  5. baseURL: import.meta.env.VITE_SCIENTIFIC_API_URL || import.meta.env.VITE_API_URL,
  6. timeout: 1000 * 60,
  7. responseType: 'json',
  8. paramsSerializer: {
  9. serialize: (params) => {
  10. // 简单的参数序列化,替代 qs
  11. return Object.keys(params)
  12. .map(key => {
  13. const val = params[key];
  14. if (val === undefined || val === null) return '';
  15. if (Array.isArray(val)) {
  16. return val.map(v => `${encodeURIComponent(key)}=${encodeURIComponent(v)}`).join('&');
  17. }
  18. return `${encodeURIComponent(key)}=${encodeURIComponent(val)}`;
  19. })
  20. .filter(p => p !== '')
  21. .join('&');
  22. },
  23. },
  24. });
  25. api.interceptors.request.use((request) => {
  26. // 设置请求头
  27. if (request.headers) {
  28. const token = uni.getStorageSync('SCITOKEN');
  29. if (token) {
  30. request.headers.Authorization = 'Bearer ' + token;
  31. }
  32. }
  33. return request;
  34. });
  35. api.interceptors.response.use(
  36. (response) => {
  37. // 如果是 blob 响应,直接返回
  38. if (response.config.responseType === 'blob') {
  39. return response;
  40. }
  41. if (response.data.code === 200) {
  42. return Promise.resolve(response.data);
  43. } else if (response.data.code === 401) {
  44. uni.showModal({
  45. title: '系统提示',
  46. content: '登录状态已过期,您可以继续留在该页面,或者重新登录',
  47. confirmText: '重新登录',
  48. cancelText: '取消',
  49. success: function (modalRes) {
  50. if (modalRes.confirm) {
  51. Session.clear();
  52. Local.remove(CACHE_KEY.TOKEN);
  53. uni.reLaunch({
  54. url: '/pages/login/index'
  55. });
  56. }
  57. }
  58. });
  59. return Promise.reject(response.data);
  60. } else {
  61. const msg = response.data.msg || '系统错误';
  62. uni.showToast({ title: msg, icon: 'none' });
  63. return Promise.reject(response.data);
  64. }
  65. return Promise.resolve(response.data);
  66. },
  67. async (error) => {
  68. let message = error.message;
  69. if (message === 'Network Error') {
  70. message = '后端网络故障';
  71. } else if (message.includes('timeout')) {
  72. message = '接口请求超时';
  73. }
  74. uni.showToast({ title: message, icon: 'none' });
  75. return Promise.reject(error);
  76. }
  77. );
  78. export default api;