2025-12-03 16:07:38 +08:00
|
|
|
|
// const baseUrl = "https://api.collect.hs.hnzhwlkj.club/"; //这里放置url域名32044
|
|
|
|
|
|
// const baseUrl = "https://api.collect.xyh.muzili.top/"; //这里放置url域名32044
|
2025-12-22 11:44:02 +08:00
|
|
|
|
const baseUrl = "https://bsh.info.yw.hnzhwlkj.cn/"; //这里放置url域名32044
|
2025-12-03 16:07:38 +08:00
|
|
|
|
// const baseUrl = "https://114.215.24.240:8106/api/v1/"; //这里放置url域名32044
|
2026-03-13 10:17:12 +08:00
|
|
|
|
import { loginOnce } from '@/utils/auth.js';
|
|
|
|
|
|
|
|
|
|
|
|
// 正在重试的请求队列
|
|
|
|
|
|
const retryQueue = [];
|
|
|
|
|
|
let isRefreshing = false;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 处理 401 错误,重新登录后重试请求
|
|
|
|
|
|
*/
|
|
|
|
|
|
async function handle401Error(originalOptions) {
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
|
// 将请求加入队列
|
|
|
|
|
|
retryQueue.push({ options: originalOptions, resolve, reject });
|
|
|
|
|
|
|
|
|
|
|
|
// 如果没有正在刷新 token,开始刷新
|
|
|
|
|
|
if (!isRefreshing) {
|
|
|
|
|
|
isRefreshing = true;
|
|
|
|
|
|
|
|
|
|
|
|
loginOnce().then((result) => {
|
|
|
|
|
|
isRefreshing = false;
|
|
|
|
|
|
|
|
|
|
|
|
if (result.success) {
|
|
|
|
|
|
// 登录成功,重试所有队列中的请求
|
|
|
|
|
|
retryQueue.forEach(({ options, resolve, reject }) => {
|
|
|
|
|
|
request(options).then(resolve).catch(reject);
|
|
|
|
|
|
});
|
|
|
|
|
|
// 清空队列
|
|
|
|
|
|
retryQueue.length = 0;
|
|
|
|
|
|
} else {
|
2026-05-08 13:28:09 +08:00
|
|
|
|
// 登录失败,拒绝所有队列中的请求并跳转登录页
|
2026-03-13 10:17:12 +08:00
|
|
|
|
retryQueue.forEach(({ reject }) => {
|
|
|
|
|
|
reject({ data: { message: '登录失败,请重新登录' } });
|
|
|
|
|
|
});
|
|
|
|
|
|
retryQueue.length = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-03 16:07:38 +08:00
|
|
|
|
export function request(options){//封装的requset
|
|
|
|
|
|
let { url,data,method } = options;
|
|
|
|
|
|
data = data || {},
|
|
|
|
|
|
uni.showLoading({
|
|
|
|
|
|
title: ''
|
|
|
|
|
|
});
|
2026-03-13 10:17:12 +08:00
|
|
|
|
|
2025-12-03 16:07:38 +08:00
|
|
|
|
return new Promise((resolve,rejext)=>{
|
|
|
|
|
|
uni.request({//这里是uniapp网络请求的api
|
|
|
|
|
|
url: baseUrl + url, //仅为示例,并非真实接口地址。
|
|
|
|
|
|
data,
|
|
|
|
|
|
header:{'content-type': 'application/x-www-form-urlencoded','Fdesk-Auth-Token': 'Bearer ' + uni.getStorageSync('token'),'Fdesk-Language': uni.getStorageSync('i18locale')?uni.getStorageSync('i18locale'):'zh','Fdesk-Login-Type': 'wechat','Fdesk-System-Code':'wechat'},
|
|
|
|
|
|
method:method||"GET",//默认请求方式是get
|
2026-03-13 10:17:12 +08:00
|
|
|
|
success: async (res) => {
|
2025-12-03 16:07:38 +08:00
|
|
|
|
uni.hideLoading();
|
2026-03-13 10:17:12 +08:00
|
|
|
|
|
|
|
|
|
|
// 检查 401 错误(可能是 res.statusCode === 401 或 res.data.code === 401)
|
|
|
|
|
|
if (res.statusCode === 401 || (res.data && res.data.code === 401)) {
|
|
|
|
|
|
console.log('Token expired, attempting silent login...');
|
|
|
|
|
|
try {
|
|
|
|
|
|
const retryResult = await handle401Error(options);
|
|
|
|
|
|
resolve(retryResult);
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
resolve(res); // 返回原始错误响应
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
resolve(res);
|
|
|
|
|
|
}
|
2025-12-03 16:07:38 +08:00
|
|
|
|
},
|
2026-03-13 10:17:12 +08:00
|
|
|
|
fail: (err) => {
|
|
|
|
|
|
uni.hideLoading();
|
|
|
|
|
|
rejext(err);
|
|
|
|
|
|
},
|
2025-12-03 16:07:38 +08:00
|
|
|
|
complete: (data)=>{
|
|
|
|
|
|
uni.hideLoading();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
export function requestx(options){//封装的requset
|
|
|
|
|
|
let { url,data,method } = options;
|
|
|
|
|
|
data = data || {};
|
|
|
|
|
|
return new Promise((resolve,rejext)=>{
|
|
|
|
|
|
uni.request({//这里是uniapp网络请求的api
|
|
|
|
|
|
url: baseUrl + url, //仅为示例,并非真实接口地址。
|
|
|
|
|
|
data,
|
|
|
|
|
|
header:{'content-type': 'application/x-www-form-urlencoded','Fdesk-Auth-Token': 'Bearer ' + uni.getStorageSync('openid')},
|
|
|
|
|
|
method:method||"GET",//默认请求方式是get
|
|
|
|
|
|
success: (res) => {
|
|
|
|
|
|
resolve(res)
|
|
|
|
|
|
},
|
|
|
|
|
|
complete: (data)=>{
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
export function showToast(options){//封装Toast
|
|
|
|
|
|
let { title,duration,icon } = options;
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title:title,
|
|
|
|
|
|
duration: 2000,
|
|
|
|
|
|
icon:icon || "none"
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|