├── php-api/ # 改造后的PHP接口层 ├── java-ad-service/ # 若依框架微服务(广告+VIP+分账) ├── uniapp-reader/ # UniApp前端项目 │ ├── pages/ # 各端页面 │ └──
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

request.js 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // src/utils/request.js
  2. import config from '@/config'
  3. import { getToken, removeToken } from '@/utils/auth'
  4. import { toast, showConfirm, tansParams } from '@/utils/common'
  5. const request = (configObj = {}) => {
  6. // 确保配置对象有效
  7. configObj.header = configObj.header || {};
  8. // 判断是否为公开API
  9. const isPublicApi = configObj.isToken === false ||
  10. configObj.url.includes('/novel/') ||
  11. configObj.url.includes('/chapter/') ||
  12. configObj.url.includes('/category/');
  13. // 获取token
  14. const token = getToken() || '';
  15. // 仅当token存在且不是公开API时才添加token
  16. if (token && !isPublicApi && configObj.header.isToken !== false) {
  17. configObj.header['Authorization'] = 'Bearer ' + token;
  18. } else if (isPublicApi) {
  19. // 明确设置公开API不携带token
  20. configObj.header.isToken = false;
  21. }
  22. // 完整URL处理
  23. let fullUrl = configObj.url;
  24. if (!fullUrl.startsWith('http')) {
  25. fullUrl = (configObj.baseUrl || config.baseUrl || '') + fullUrl;
  26. }
  27. return new Promise((resolve, reject) => {
  28. uni.request({
  29. method: configObj.method || 'get',
  30. url: fullUrl,
  31. data: configObj.data,
  32. params: configObj.params,
  33. header: configObj.header,
  34. success: (res) => {
  35. // 处理401认证失败
  36. if (res.statusCode === 401) {
  37. const errorMsg = res.data?.msg || '认证失败,请重新登录';
  38. console.warn('认证失败:', configObj.url, errorMsg);
  39. // 清除无效token
  40. removeToken();
  41. // 显示登录提示
  42. toast(errorMsg);
  43. // 跳转到登录页面
  44. setTimeout(() => {
  45. uni.navigateTo({ url: '/pages/login/index' });
  46. }, 1500);
  47. reject(new Error(errorMsg));
  48. return;
  49. }
  50. // 处理其他成功响应
  51. else if (res.statusCode >= 200 && res.statusCode < 300) {
  52. // 如果响应数据包含code字段,需要根据code判断业务状态
  53. if (res.data && typeof res.data.code !== 'undefined') {
  54. if (res.data.code === 200) {
  55. resolve(res.data);
  56. } else {
  57. const errorMsg = res.data.msg || `请求失败 (${res.data.code})`;
  58. toast(errorMsg);
  59. reject(new Error(errorMsg));
  60. }
  61. } else {
  62. // 没有code字段,直接返回数据
  63. resolve(res.data);
  64. }
  65. }
  66. // 处理其他错误
  67. else {
  68. const errorMsg = res.data?.msg || `请求失败 (${res.statusCode})`;
  69. toast(errorMsg);
  70. reject(new Error(errorMsg));
  71. }
  72. },
  73. fail: (err) => {
  74. let message = '网络连接异常';
  75. if (err.errMsg.includes('timeout')) message = '请求超时';
  76. toast(message);
  77. reject(err);
  78. }
  79. });
  80. });
  81. }
  82. // 添加便捷方法
  83. request.get = (url, params, config = {}) => {
  84. return request({
  85. url,
  86. params,
  87. method: 'get',
  88. ...config
  89. })
  90. }
  91. request.post = (url, data, config = {}) => {
  92. return request({
  93. url,
  94. data,
  95. method: 'post',
  96. ...config
  97. })
  98. }
  99. export default request