154 lines
4.9 KiB
JavaScript
154 lines
4.9 KiB
JavaScript
// 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),
|
||
};
|