api.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. // API配置
  2. const API_CONFIG = {
  3. // 开发环境API地址
  4. dev: {
  5. baseUrl: 'http://localhost:8080'
  6. },
  7. // 生产环境API地址
  8. prod: {
  9. baseUrl: 'http://43.143.204.137:8080'
  10. }
  11. };
  12. // 获取当前环境
  13. const isProduction = process.env.NODE_ENV === 'production';
  14. // 导出当前环境的API基础URL
  15. export const BASE_URL = isProduction ? API_CONFIG.prod.baseUrl : API_CONFIG.dev.baseUrl;
  16. /**
  17. * 发送HTTP请求的通用方法
  18. * @param {Object} options 请求选项
  19. * @returns {Promise} Promise对象
  20. */
  21. export const request = (options) => {
  22. return new Promise((resolve, reject) => {
  23. const token = uni.getStorageSync('token') || '';
  24. console.log(`发起请求: ${options.method || 'GET'} ${options.url}`, options.data);
  25. // 显示加载提示
  26. if (options.showLoading !== false) {
  27. uni.showLoading({
  28. title: options.loadingText || '加载中...',
  29. mask: true
  30. });
  31. }
  32. // 请求开始时间
  33. const startTime = Date.now();
  34. const requestTask = uni.request({
  35. url: BASE_URL + options.url,
  36. method: options.method || 'GET',
  37. data: options.data || {},
  38. header: {
  39. 'Content-Type': 'application/json',
  40. 'Authorization': token ? `Bearer ${token}` : '',
  41. ...options.header
  42. },
  43. timeout: options.timeout || 30000, // 请求超时时间,默认30秒
  44. success: (res) => {
  45. // 请求结束时间和耗时
  46. const endTime = Date.now();
  47. const duration = endTime - startTime;
  48. console.log(`请求响应: ${options.url}, 耗时: ${duration}ms`, res);
  49. // 二维码接口特殊处理,即使状态码不是200,只要有数据就算成功
  50. if (options.url.indexOf('/api/qrcode/generate') !== -1) {
  51. // 检查是否有二维码数据
  52. if (res.data && res.data.qrCodeUrl) {
  53. console.log(`二维码接口请求成功: ${options.url}`, res.data);
  54. resolve(res.data);
  55. return;
  56. }
  57. }
  58. // 统一处理响应
  59. if (res.statusCode === 200) {
  60. // 修改判断逻辑,适应后端返回格式
  61. if (res.data && (res.data.code === 0 || res.data.code === 200 || res.data.success === true)) {
  62. console.log(`请求成功: ${options.url}`, res.data);
  63. resolve(res.data);
  64. } else {
  65. // 业务错误
  66. console.error(`业务错误: ${options.url}`, res.data);
  67. uni.showToast({
  68. icon: 'none',
  69. title: res.data.message || res.data.msg || '请求失败'
  70. });
  71. reject(res.data);
  72. }
  73. } else if (res.statusCode === 401) {
  74. // 未授权,需要登录
  75. console.error(`未授权: ${options.url}`, res);
  76. uni.showToast({
  77. icon: 'none',
  78. title: '请先登录'
  79. });
  80. // 可以在这里处理登录逻辑
  81. reject(res);
  82. } else {
  83. // 其他HTTP错误
  84. console.error(`HTTP错误: ${options.url} (${res.statusCode})`, res);
  85. uni.showToast({
  86. icon: 'none',
  87. title: `请求失败(${res.statusCode})`
  88. });
  89. reject(res);
  90. }
  91. },
  92. fail: (err) => {
  93. console.error(`请求失败: ${options.url}`, err);
  94. uni.showToast({
  95. icon: 'none',
  96. title: err.errMsg?.includes('timeout') ? '网络请求超时' : '网络请求失败'
  97. });
  98. reject(err);
  99. },
  100. complete: () => {
  101. // 关闭loading
  102. if (options.showLoading !== false) {
  103. uni.hideLoading();
  104. }
  105. // 可能的重试逻辑
  106. if (options.retry && options.retryCount > 0 && options.retryCondition) {
  107. // 省略重试逻辑实现...
  108. }
  109. }
  110. });
  111. // 记录requestTask,方便后续可能的取消操作
  112. if (options.requestTaskCallback) {
  113. options.requestTaskCallback(requestTask);
  114. }
  115. });
  116. };
  117. // 导出API接口
  118. export const API = {
  119. // 行程相关接口
  120. trip: {
  121. create: (data) => request({ url: '/api/trip/create', method: 'POST', data }),
  122. update: (data) => request({ url: '/api/trip/update', method: 'POST', data }),
  123. delete: (id) => request({ url: `/api/trip/delete/${id}`, method: 'POST' }),
  124. detail: (id) => request({ url: `/api/trip/detail/${id}`, method: 'GET' }),
  125. list: () => request({ url: '/api/trip/list', method: 'GET' }),
  126. sync: (data) => request({ url: '/api/trip/sync', method: 'POST', data }),
  127. generateQrCode: (data) => request({ url: '/api/qrcode/generate', method: 'POST', data })
  128. }
  129. };