requestAI.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /**
  2. * 封装的axios的工具类
  3. * 负责请求的公共配置,以及请求拦截,响应拦截,错误处理,网络不佳处理
  4. */
  5. import axios from 'axios'
  6. import { Toast } from 'vant';
  7. import errorCode from '@/utils/errorCode'
  8. import { getQyCode, authLock } from '@/utils/wecomLogin.ts';
  9. axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
  10. const service = axios.create({
  11. baseURL: process.env.VUE_APP_AIDESIGN_API + '/standard',
  12. timeout: 180000,
  13. // withCredentials: true
  14. });
  15. // request拦截器
  16. service.interceptors.request.use(config => {
  17. const guidInfo = JSON.parse(window.localStorage.getItem('guidInfo'));
  18. const token = window.localStorage.getItem('AIToken');
  19. if (guidInfo && guidInfo.guid) {
  20. let loginMark = guidInfo.guid;
  21. config.headers['loginmark'] = loginMark;
  22. }
  23. if (token) {
  24. config.headers['token'] = token;
  25. }
  26. if (config.data instanceof FormData) {
  27. // 若未手动设置 Content-Type,则删除默认值(让浏览器自动添加正确的 multipart 头)
  28. if (!config.headers['Content-Type']) {
  29. delete config.headers['Content-Type'];
  30. }
  31. }
  32. return config
  33. }, error => {
  34. Promise.reject(error)
  35. })
  36. // 响应拦截器
  37. service.interceptors.response.use(async(res) => {
  38. const code = res.data.StatusCode || 200;
  39. const msg = errorCode[code] || res.data.msg || errorCode['default']
  40. if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
  41. return res.data
  42. }
  43. if (code === 401) {
  44. console.log(msg)
  45. } else if (code === 500) {
  46. Toast(msg);
  47. return Promise.reject(new Error(msg))
  48. } else if (code === 420) {
  49. // 双重判断:内存锁 + 本地缓存锁
  50. const isLock = authLock.isAuthorizing || window.localStorage.getItem('isWechatAuthorizing') === 'true';
  51. if (isLock) {
  52. return Promise.reject(new Error('正在授权,请勿重复操作'));
  53. }
  54. // 1. 立即加锁(关键:先锁再执行跳转)
  55. authLock.lock();
  56. try {
  57. // 2. 取消所有未完成的请求(中断并发接口)
  58. const cancelTokenSource = axios.CancelToken.source();
  59. service.defaults.cancelToken = cancelTokenSource.token;
  60. cancelTokenSource.cancel('授权失效,中断请求');
  61. // 3. 微任务延迟跳转:给其他接口足够时间感知锁状态
  62. await Promise.resolve(); // 或 setTimeout(() => {}, 0)
  63. // 4. 拼接授权链接并跳转(记录当前页面用于回跳)
  64. getQyCode()
  65. } catch (err) {
  66. // 异常时解锁
  67. authLock.unlock();
  68. console.error('授权跳转失败:', err);
  69. }
  70. }
  71. // else if (code !== 200 && code !== 204) {
  72. // Toast(msg);
  73. // return Promise.reject('error')
  74. // }
  75. else {
  76. return res.data
  77. }
  78. },
  79. error => {
  80. console.log('完整错误信息:', error);
  81. console.log('错误配置:', error.config);
  82. // 1. 获取设备及企业微信信息
  83. const userAgent = navigator.userAgent; // 核心信息
  84. // console.log("userAgent=", userAgent)
  85. // 解析userAgent中的关键信息(可选,方便阅读)
  86. const isiOS = /iPhone|iPad|iPod/i.test(userAgent);
  87. const isAndroid = /Android/i.test(userAgent);
  88. const wxworkVersion = (userAgent.match(/wxwork\/(\d+\.\d+\.\d+)/) || [])[1]; // 企业微信版本号
  89. const systemVersion = isiOS ? (userAgent.match(/OS (\d+_\d+)/) || [])[1].replace(/_/g, '.') : (userAgent.match(/Android (\d+\.\d+)/) || [])[1]; // Android版本(如13.0)
  90. // iOS版本(如16.5)
  91. // 2. 打印/记录设备信息
  92. console.log('设备信息:', {
  93. userAgent: userAgent, // 原始字符串(用于完整分析)
  94. system: isiOS ? 'iOS' : isAndroid ? 'Android' : '未知',
  95. systemVersion: systemVersion || '未知',//系统版本
  96. wxworkVersion: wxworkVersion || '未知', // 企业微信版本
  97. networkType: (navigator.connection && navigator.connection.effectiveType) ||
  98. (navigator.connection && navigator.connection.type) ||
  99. '未知',
  100. timestamp: new Date().toLocaleString() // 报错时间
  101. });
  102. // console.log('err' + error)
  103. let { message } = error;
  104. if (message == "Network Error") {
  105. message = "网络异常,请切换网络后重试";
  106. console.log('触发网络错误的请求URL:', error.config.url);
  107. }
  108. else if (message.includes("timeout")) {
  109. message = "系统接口请求超时";
  110. }
  111. else if (message.includes("Request failed with status code")) {
  112. message = "系统接口" + message.substr(message.length - 3) + "异常";
  113. }
  114. Toast(message);
  115. return Promise.reject(error)
  116. }
  117. )
  118. export default service