124 lines
3.5 KiB
JavaScript
124 lines
3.5 KiB
JavaScript
// 引入配置文件
|
||
import config from './config.js';
|
||
|
||
/**
|
||
* 封装 uni.request 的通用请求方法
|
||
* @param {Object} options - 请求选项
|
||
* @param {string} options.url - 请求地址,可以是相对路径(会自动添加baseURL)或完整URL
|
||
* @param {string} options.method - 请求方法,默认为GET
|
||
* @param {Object} options.data - 请求数据
|
||
* @param {Object} options.header - 自定义请求头,会与默认请求头合并
|
||
* @param {boolean} options.loading - 是否显示加载提示,默认为false
|
||
* @returns {Promise} - 返回Promise对象
|
||
*/
|
||
export default function request(options) {
|
||
return new Promise((resolve, reject) => {
|
||
// 开发环境使用mock数据
|
||
if (process.env.NODE_ENV === 'development' && options.mock) {
|
||
// 模拟微信登录接口
|
||
if (options.url === '/auth/login') {
|
||
return resolve({
|
||
code: 200,
|
||
data: {
|
||
token: 'mock-token-123',
|
||
openid: 'mock-openid',
|
||
access_token: 'mock-access-token',
|
||
userInfo: {
|
||
nickName: '测试用户',
|
||
avatarUrl: '/static/mock-avatar.png'
|
||
}
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
// 显示加载提示
|
||
if (options.loading) {
|
||
uni.showLoading({
|
||
title: '加载中...'
|
||
});
|
||
}
|
||
|
||
// 判断URL是否为完整URL(以http开头),如果不是则添加baseURL
|
||
const url = options.url.startsWith('http') ? options.url : config.baseURL + options.url;
|
||
|
||
// 合并默认请求头和自定义请求头
|
||
const header = {
|
||
...config.headers,
|
||
...options.header
|
||
};
|
||
|
||
// 如果有token,添加到请求头
|
||
const token = uni.getStorageSync('token');
|
||
if (token) {
|
||
header['Authorization'] = token;
|
||
}
|
||
|
||
// 发起请求
|
||
uni.request({
|
||
url: url,
|
||
method: options.method || 'GET',
|
||
data: options.data,
|
||
header: header,
|
||
timeout: options.timeout || config.timeout,
|
||
success: (res) => {
|
||
// 隐藏加载提示
|
||
if (options.loading) {
|
||
uni.hideLoading();
|
||
}
|
||
|
||
// 处理响应
|
||
if (res.statusCode === 200) {
|
||
// 业务状态码处理
|
||
if (res.data.code === 200 || res.data.code === 0) {
|
||
resolve(res.data);
|
||
} else if (res.data.code === 401) {
|
||
// 未授权,清除token并跳转到登录页
|
||
uni.removeStorageSync('token');
|
||
uni.showToast({
|
||
title: '登录已过期,请重新登录',
|
||
icon: 'none',
|
||
duration: 2000
|
||
});
|
||
setTimeout(() => {
|
||
uni.navigateTo({
|
||
url: '/pages/login/index'
|
||
});
|
||
}, 1000);
|
||
reject(res.data);
|
||
} else {
|
||
// 其他业务错误
|
||
uni.showToast({
|
||
title: res.data.msg || '请求失败',
|
||
icon: 'none',
|
||
duration: 2000
|
||
});
|
||
reject(res.data);
|
||
}
|
||
} else {
|
||
// HTTP状态码错误
|
||
uni.showToast({
|
||
title: `请求失败,状态码:${res.statusCode}`,
|
||
icon: 'none',
|
||
duration: 2000
|
||
});
|
||
reject(res.data);
|
||
}
|
||
},
|
||
fail: (err) => {
|
||
// 隐藏加载提示
|
||
if (options.loading) {
|
||
uni.hideLoading();
|
||
}
|
||
|
||
// 网络错误等
|
||
uni.showToast({
|
||
title: '网络请求失败',
|
||
icon: 'none',
|
||
duration: 2000
|
||
});
|
||
reject(err);
|
||
}
|
||
});
|
||
});
|
||
} |