// utils/request.js // 配置API基础URL // const BASE_URL = "https://api.gzshuxing.cn"; // 请根据实际API地址修改 // const BASE_URL = "http://100.82.191.127:3000"; // 旧的API地址 // const BASE_URL = "http://100.82.191.127:8000"; // ThinkPHP 8 API地址 // const BASE_URL = "http://localhost:8000" const BASE_URL = "http://eacgh.cn:8000" /** * 封装的网络请求工具 * @param {String} url 请求路径 * @param {String} method 请求方法 * @param {Object} data 请求数据 * @param {Boolean} needAuth 是否需要携带token * @returns {Promise} 返回Promise对象 */ const request = (url, method = "GET", data = {}, needAuth = false) => { // 完整请求地址 const requestUrl = BASE_URL + url; // 请求头 const header = { "content-type": "application/json", }; // 如果需要token,从本地存储获取token并添加到请求头 if (needAuth) { const token = wx.getStorageSync("token"); if (token) { header["Authorization"] = `Bearer ${token}`; } else { // 如果是刷新token接口,允许在没有token的情况下调用 if (url === "/api/user/refresh-token") { // 允许刷新token接口在没有token的情况下调用 } else { // 如果需要认证但没有token,可能需要跳转到登录页 return Promise.reject(new Error("未登录或登录已过期")); } } } // 返回Promise return new Promise((resolve, reject) => { wx.request({ url: requestUrl, method, data, header, success: (res) => { // 请求成功 const { statusCode, data } = res; // 如果状态码为401,需要区分是登录接口还是其他接口 if (statusCode === 401) { // 如果是登录接口,直接返回数据,让业务层处理 if (url === "/api/user/login" || url === "/api/user/mini-login") { resolve(data); return; } // 如果是刷新token接口,也直接返回,让业务层处理 if (url === "/api/user/refresh-token") { resolve(data); return; } // 如果是获取用户信息接口,返回错误让登录页面处理 if (url === "/api/user/profile") { reject(new Error("未登录或登录已过期")); return; } // 其他接口的401状态码,视为token失效 // 清除存储的token wx.removeStorageSync("token"); wx.removeStorageSync("userInfo"); // 跳转到登录页 wx.navigateTo({ url: "/pages/login/index", }); reject(new Error("未登录或登录已过期")); return; } // 其他错误状态码 if (statusCode !== 200) { // 如果是登录接口,仍然让业务层处理响应数据 if (url === "/api/user/login" || url === "/api/user/mini-login") { resolve(data); return; } reject(new Error(data.message || `请求失败,状态码:${statusCode}`)); return; } // 正常HTTP状态码200,但需要检查业务状态码 if (statusCode === 200) { // 检查业务状态码 if (data && data.code !== 200 && data.code !== 1) { // 业务错误,创建包含完整错误信息的错误对象 const businessError = new Error(data.msg || '业务错误'); businessError.data = data; businessError.code = data.code; reject(businessError); return; } // 业务成功 resolve(data); return; } }, fail: (err) => { // 请求失败 reject(err); }, }); }); }; // 导出各种请求方法 module.exports = { // GET请求 - 支持向后兼容的参数格式 get: (url, arg2 = {}, arg3 = false) => { // 处理向后兼容:如果第二个参数是布尔值,则说明是旧格式 (url, needAuth) if (typeof arg2 === 'boolean') { // 旧格式: get(url, needAuth) const needAuth = arg2; return request(url, "GET", {}, needAuth); } else { // 新格式: get(url, params, needAuth) const params = arg2; const needAuth = arg3 !== false ? arg3 : false; // 将参数转换为查询字符串 const queryString = Object.keys(params).length > 0 ? '?' + Object.keys(params).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`).join('&') : ''; const fullUrl = url + queryString; return request(fullUrl, "GET", {}, needAuth); } }, // POST请求 post: (url, data, needAuth = false) => request(url, "POST", data, needAuth), // PUT请求 put: (url, data, needAuth = false) => request(url, "PUT", data, needAuth), // DELETE请求 delete: (url, needAuth = false) => request(url, "DELETE", {}, needAuth), };