|
|
// utils/request.js
|
|
|
const { getAuthHeader, clearAuthData } = require('./token');
|
|
|
|
|
|
const BASE_URL = 'http://localhost:3000'; // 替换为你的后端接口域名
|
|
|
|
|
|
/**
|
|
|
* 封装 wx.request
|
|
|
* @param {Object} options - 请求配置
|
|
|
* @param {string} options.url - 接口路径(不包含域名)
|
|
|
* @param {string} [options.method='GET'] - 请求方法
|
|
|
* @param {Object} [options.data] - 请求参数
|
|
|
* @param {boolean} [options.showLoading=true] - 是否显示加载提示
|
|
|
* @param {string} [options.loadingText='加载中...'] - 加载提示文字
|
|
|
*/
|
|
|
const request = (options) => {
|
|
|
const {
|
|
|
url,
|
|
|
method = 'GET',
|
|
|
data = {},
|
|
|
showLoading = true,
|
|
|
loadingText = '加载中...'
|
|
|
} = options;
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
let loadingHide = () => {};
|
|
|
|
|
|
// 显示 loading
|
|
|
if (showLoading) {
|
|
|
wx.showLoading({
|
|
|
title: loadingText,
|
|
|
mask: true
|
|
|
});
|
|
|
loadingHide = wx.hideLoading;
|
|
|
}
|
|
|
|
|
|
wx.request({
|
|
|
url: BASE_URL + url,
|
|
|
method,
|
|
|
data,
|
|
|
header: getAuthHeader(),
|
|
|
success: (res) => {
|
|
|
const { statusCode, data: responseData } = res;
|
|
|
if (statusCode === 200) {
|
|
|
// 假设后端返回格式:{ code: 200, data: {}, msg: 'success' }
|
|
|
if (responseData.code === 200) {
|
|
|
resolve(responseData.data);
|
|
|
} else {
|
|
|
// 特殊处理401未授权错误
|
|
|
if (responseData.code === 401 || statusCode === 401) {
|
|
|
// token可能已过期,清除本地认证信息
|
|
|
clearAuthData();
|
|
|
wx.showToast({
|
|
|
title: '登录已过期,请重新登录',
|
|
|
icon: 'none'
|
|
|
});
|
|
|
|
|
|
// 跳转到登录页
|
|
|
setTimeout(() => {
|
|
|
wx.redirectTo({
|
|
|
url: '/pages/login/login'
|
|
|
});
|
|
|
}, 1500);
|
|
|
|
|
|
reject(responseData);
|
|
|
} else {
|
|
|
// 其他业务错误(如参数错误等)
|
|
|
wx.showToast({
|
|
|
title: responseData.msg || '请求失败',
|
|
|
icon: 'none'
|
|
|
});
|
|
|
reject(responseData);
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
// HTTP 状态码非 200
|
|
|
if (statusCode === 401) {
|
|
|
// token可能已过期,清除本地认证信息
|
|
|
clearAuthData();
|
|
|
wx.showToast({
|
|
|
title: '登录已过期,请重新登录',
|
|
|
icon: 'none'
|
|
|
});
|
|
|
|
|
|
// 跳转到登录页
|
|
|
setTimeout(() => {
|
|
|
wx.redirectTo({
|
|
|
url: '/pages/login/login'
|
|
|
});
|
|
|
}, 1500);
|
|
|
} else {
|
|
|
// wx.showToast({
|
|
|
// title: `请求错误 ${statusCode}`,
|
|
|
// icon: 'none'
|
|
|
// });
|
|
|
}
|
|
|
reject(res);
|
|
|
}
|
|
|
},
|
|
|
fail: (err) => {
|
|
|
wx.showToast({
|
|
|
title: '网络异常,请稍后重试',
|
|
|
icon: 'none'
|
|
|
});
|
|
|
reject(err);
|
|
|
},
|
|
|
complete: () => {
|
|
|
// 隐藏 loading
|
|
|
loadingHide();
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
};
|
|
|
|
|
|
module.exports = {
|
|
|
request,
|
|
|
get: (url, data, options = {}) => request({ ...options, url, method: 'GET', data }),
|
|
|
post: (url, data, options = {}) => request({ ...options, url, method: 'POST', data })
|
|
|
}; |