2026-05-31 19:04:06 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 公共网络请求封装
|
2026-06-15 13:18:43 +08:00
|
|
|
|
* 职责:统一拼接 baseUrl、Authorization 头,401 自动跳转登录,自动续期 Token。
|
2026-05-31 19:04:06 +08:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var auth = require("./auth");
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @param {Object} options - 请求配置
|
|
|
|
|
|
* @param {string} options.url - 请求路径(不含基础 URL)
|
|
|
|
|
|
* @param {string} [options.method] - HTTP 方法
|
|
|
|
|
|
* @param {Object} [options.data] - 请求体
|
|
|
|
|
|
* @param {Object} [options.header] - 额外请求头
|
|
|
|
|
|
* @returns {Promise<Object>} 解析后的响应数据
|
|
|
|
|
|
*/
|
|
|
|
|
|
function request(options) {
|
|
|
|
|
|
var app = getApp();
|
|
|
|
|
|
var token = auth.getToken();
|
2026-06-15 14:24:25 +08:00
|
|
|
|
var isLoginRequest = options.url && options.url.indexOf("/api/auth/login") >= 0;
|
|
|
|
|
|
var isWechatLoginRequest = options.url && options.url.indexOf("/api/auth/wechat-login") >= 0;
|
|
|
|
|
|
|
2026-05-31 19:04:06 +08:00
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
|
|
|
|
wx.request({
|
|
|
|
|
|
url: app.globalData.apiBaseUrl + options.url,
|
|
|
|
|
|
method: options.method || "GET",
|
|
|
|
|
|
data: options.data,
|
|
|
|
|
|
header: Object.assign(
|
|
|
|
|
|
{ "Content-Type": "application/json" },
|
|
|
|
|
|
token ? { Authorization: "Bearer " + token } : {},
|
|
|
|
|
|
options.header || {}
|
|
|
|
|
|
),
|
|
|
|
|
|
success: function (response) {
|
|
|
|
|
|
var result = response.data || {};
|
2026-06-15 13:18:43 +08:00
|
|
|
|
|
|
|
|
|
|
// 自动续期:检查响应头中的新 Token
|
|
|
|
|
|
var newToken = response.header["X-New-Token"] || response.header["x-new-token"];
|
|
|
|
|
|
if (newToken) {
|
|
|
|
|
|
auth.setToken(newToken);
|
|
|
|
|
|
app.globalData.authToken = newToken;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-05-31 19:04:06 +08:00
|
|
|
|
if (response.statusCode === 401) {
|
2026-06-15 14:24:25 +08:00
|
|
|
|
// 登录接口的 401 表示用户名或密码错误,不需要跳转登录页
|
|
|
|
|
|
if (isLoginRequest || isWechatLoginRequest) {
|
|
|
|
|
|
reject(new Error(result.message || "账号不存在或密码错误"));
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 其他接口的 401 表示 token 过期,需要重新登录
|
2026-05-31 19:04:06 +08:00
|
|
|
|
auth.logout();
|
2026-06-01 11:24:20 +08:00
|
|
|
|
wx.redirectTo({ url: "/pages/login/login" });
|
2026-05-31 19:04:06 +08:00
|
|
|
|
reject(new Error("登录已过期,请重新登录"));
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (response.statusCode >= 400 || result.code !== 0) {
|
|
|
|
|
|
reject(new Error(result.message || "请求失败:" + response.statusCode));
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
resolve(result.data);
|
|
|
|
|
|
},
|
|
|
|
|
|
fail: function () {
|
|
|
|
|
|
reject(new Error("网络请求失败,请检查网络"));
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = request;
|