// src/utils/request.js import config from '@/config' import { getToken, removeToken } from '@/utils/auth' import { toast, showConfirm, tansParams } from '@/utils/common' const request = (configObj = {}) => { // 确保配置对象有效 configObj.header = configObj.header || {}; // 判断是否为公开API const isPublicApi = configObj.isToken === false || configObj.url.includes('/novel/') || configObj.url.includes('/chapter/') || configObj.url.includes('/category/'); // 获取token const token = getToken() || ''; // 仅当token存在且不是公开API时才添加token if (token && !isPublicApi && configObj.header.isToken !== false) { configObj.header['Authorization'] = 'Bearer ' + token; } else if (isPublicApi) { // 明确设置公开API不携带token configObj.header.isToken = false; } // 完整URL处理 let fullUrl = configObj.url; if (!fullUrl.startsWith('http')) { fullUrl = (configObj.baseUrl || config.baseUrl || '') + fullUrl; } return new Promise((resolve, reject) => { uni.request({ method: configObj.method || 'get', url: fullUrl, data: configObj.data, params: configObj.params, header: configObj.header, success: (res) => { // 处理401认证失败 if (res.statusCode === 401) { const errorMsg = res.data?.msg || '认证失败,请重新登录'; console.warn('认证失败:', configObj.url, errorMsg); // 清除无效token removeToken(); // 显示登录提示 toast(errorMsg); // 跳转到登录页面 setTimeout(() => { uni.navigateTo({ url: '/pages/login/index' }); }, 1500); reject(new Error(errorMsg)); return; } // 处理其他成功响应 else if (res.statusCode >= 200 && res.statusCode < 300) { // 如果响应数据包含code字段,需要根据code判断业务状态 if (res.data && typeof res.data.code !== 'undefined') { if (res.data.code === 200) { resolve(res.data); } else { const errorMsg = res.data.msg || `请求失败 (${res.data.code})`; toast(errorMsg); reject(new Error(errorMsg)); } } else { // 没有code字段,直接返回数据 resolve(res.data); } } // 处理其他错误 else { const errorMsg = res.data?.msg || `请求失败 (${res.statusCode})`; toast(errorMsg); reject(new Error(errorMsg)); } }, fail: (err) => { let message = '网络连接异常'; if (err.errMsg.includes('timeout')) message = '请求超时'; toast(message); reject(err); } }); }); } // 添加便捷方法 request.get = (url, params, config = {}) => { return request({ url, params, method: 'get', ...config }) } request.post = (url, data, config = {}) => { return request({ url, data, method: 'post', ...config }) } export default request