121 lines
3.3 KiB
JavaScript
121 lines
3.3 KiB
JavaScript
// utils/request.js
|
|
import { buildClubHeaders } from './club-context';
|
|
|
|
function getLoginFallbackUrl() {
|
|
try {
|
|
const { getLoginPageUrl } = require('./fighter-only.js');
|
|
return getLoginPageUrl();
|
|
} catch (e) {
|
|
return '/pages/fighter/fighter';
|
|
}
|
|
}
|
|
|
|
function goLoginPage(hint) {
|
|
try {
|
|
const { kickToLoginPage, LOGIN_HINT_KEY, clearAuthSession } = require('./fighter-only.js');
|
|
if (typeof kickToLoginPage === 'function') {
|
|
kickToLoginPage(hint);
|
|
return;
|
|
}
|
|
if (hint) wx.setStorageSync(LOGIN_HINT_KEY || 'login_page_hint', hint);
|
|
clearAuthSession && clearAuthSession({ hint });
|
|
} catch (e) {
|
|
try {
|
|
if (hint) wx.setStorageSync('login_page_hint', hint);
|
|
wx.removeStorageSync('token');
|
|
} catch (e2) {}
|
|
}
|
|
const url = getLoginFallbackUrl();
|
|
wx.reLaunch({
|
|
url,
|
|
fail: () => {
|
|
try { wx.redirectTo({ url }); } catch (e2) {}
|
|
},
|
|
});
|
|
}
|
|
|
|
function clearAuthAndGoLogin(hint) {
|
|
goLoginPage(
|
|
hint ||
|
|
'账号状态异常,您的账号可能已被封禁或登录已失效。请点击一键登录重试;若仍无法进入,请联系客服。'
|
|
);
|
|
}
|
|
|
|
function showAuthFailModal(serverMsg) {
|
|
const hint =
|
|
(serverMsg && String(serverMsg).trim()) ||
|
|
'账号状态异常,您的账号可能已被封禁或登录已失效。请点击一键登录重试;若仍无法进入,请联系客服。';
|
|
// 直接清会话进登录页,避免卡在「伪已登录」我的页且不再发请求
|
|
clearAuthAndGoLogin(hint);
|
|
}
|
|
|
|
function request(options) {
|
|
const app = getApp();
|
|
const token = wx.getStorageSync('token');
|
|
|
|
if (!token) {
|
|
return Promise.resolve({
|
|
statusCode: 401,
|
|
data: { code: 401, msg: '未登录' },
|
|
errMsg: 'request:ok',
|
|
});
|
|
}
|
|
|
|
const header = buildClubHeaders({
|
|
'Content-Type': 'application/json',
|
|
...options.header,
|
|
});
|
|
if (token) {
|
|
header['Authorization'] = 'Bearer ' + token;
|
|
}
|
|
|
|
return new Promise((resolve) => {
|
|
wx.request({
|
|
url: app.globalData.apiBaseUrl + options.url,
|
|
method: options.method || 'GET',
|
|
data: options.data || {},
|
|
header,
|
|
timeout: options.timeout || 15000,
|
|
success: async (res) => {
|
|
if (res.statusCode === 401 || res.statusCode === 403) {
|
|
const serverMsg =
|
|
(res.data && (res.data.msg || res.data.message)) || '';
|
|
// 业务封禁文案优先;登录页会展示
|
|
if (app.globalData.loginPromise) {
|
|
try {
|
|
await app.globalData.loginPromise;
|
|
const retryRes = await request(options);
|
|
resolve(retryRes);
|
|
} catch (err) {
|
|
showAuthFailModal(serverMsg);
|
|
resolve(res);
|
|
}
|
|
return;
|
|
}
|
|
|
|
showAuthFailModal(serverMsg);
|
|
resolve(res);
|
|
return;
|
|
}
|
|
resolve(res);
|
|
},
|
|
fail: (err) => {
|
|
console.warn('request fail:', options.url, err && err.errMsg);
|
|
resolve({
|
|
statusCode: 0,
|
|
data: {
|
|
code: 408,
|
|
msg: (err && err.errMsg) || '网络请求失败',
|
|
},
|
|
errMsg: (err && err.errMsg) || 'request:fail',
|
|
});
|
|
},
|
|
});
|
|
});
|
|
}
|
|
|
|
export default request;
|
|
export { goLoginPage, clearAuthAndGoLogin };
|
|
// 兼容旧引用
|
|
export { LOGIN_HINT_KEY } from './fighter-only.js';
|