client.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import axios from 'axios'
  2. /**
  3. * baseURL 解析优先级:
  4. * 1. URL 参数 apiBase (admin 跳转过来时携带, 自动携带当前 admin 域名,
  5. * 支持一份 React 部署服务多套环境 test/pre/prod)
  6. * 2. 构建时环境变量 VITE_API_BASE_URL (兜底, 直接访问 React URL 时用)
  7. * 3. 开发默认 /videoVector (走 Vite proxy 直连本地 video-vector)
  8. */
  9. function resolveBaseURL(): string {
  10. if (import.meta.env.VITE_FORCE_LOCAL === 'true') {
  11. console.log('[baseURL] VITE_FORCE_LOCAL=true, 强制走本地 proxy /videoVector')
  12. return '/videoVector'
  13. }
  14. const urlApiBase = new URLSearchParams(window.location.search).get('apiBase')
  15. if (urlApiBase) {
  16. console.log('[baseURL] 使用 URL 参数 apiBase:', urlApiBase)
  17. return urlApiBase
  18. }
  19. const fallback = import.meta.env.VITE_API_BASE_URL ?? '/videoVector'
  20. console.log('[baseURL] 使用兜底值:', fallback)
  21. return fallback
  22. }
  23. const baseURL = resolveBaseURL()
  24. console.log('[baseURL] 最终 baseURL:', baseURL, '| DEV:', import.meta.env.DEV, '| VITE_FORCE_LOCAL:', import.meta.env.VITE_FORCE_LOCAL)
  25. const client = axios.create({
  26. baseURL,
  27. timeout: 60_000,
  28. withCredentials: true, // 跨域请求自动携带 admin Cookie(用于 manager-new Session 鉴权)
  29. headers: {
  30. 'Content-Type': 'application/json',
  31. },
  32. })
  33. // 简易错误日志(MVP 不做复杂全局拦截)
  34. client.interceptors.response.use(
  35. (resp) => resp,
  36. (err) => {
  37. console.error('[API ERROR]', err?.message, err?.response?.data)
  38. return Promise.reject(err)
  39. },
  40. )
  41. export default client