feat: 修复用户登陆模块
This commit is contained in:
@@ -159,6 +159,7 @@ export default function AuthFormContent() {
|
|||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
},
|
},
|
||||||
|
credentials: 'include',
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
credential,
|
credential,
|
||||||
type: 'phone',
|
type: 'phone',
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import { authService, WECHAT_STATUS, STATUS_MESSAGES } from "../../services/auth
|
|||||||
|
|
||||||
// 配置常量
|
// 配置常量
|
||||||
const POLL_INTERVAL = 2000; // 轮询间隔:2秒
|
const POLL_INTERVAL = 2000; // 轮询间隔:2秒
|
||||||
|
const BACKUP_POLL_INTERVAL = 3000; // 备用轮询间隔:3秒
|
||||||
const QR_CODE_TIMEOUT = 300000; // 二维码超时:5分钟
|
const QR_CODE_TIMEOUT = 300000; // 二维码超时:5分钟
|
||||||
|
|
||||||
export default function WechatRegister() {
|
export default function WechatRegister() {
|
||||||
@@ -26,6 +27,7 @@ export default function WechatRegister() {
|
|||||||
|
|
||||||
// 使用 useRef 管理定时器,避免闭包问题和内存泄漏
|
// 使用 useRef 管理定时器,避免闭包问题和内存泄漏
|
||||||
const pollIntervalRef = useRef(null);
|
const pollIntervalRef = useRef(null);
|
||||||
|
const backupPollIntervalRef = useRef(null); // 备用轮询定时器
|
||||||
const timeoutRef = useRef(null);
|
const timeoutRef = useRef(null);
|
||||||
const isMountedRef = useRef(true); // 追踪组件挂载状态
|
const isMountedRef = useRef(true); // 追踪组件挂载状态
|
||||||
const containerRef = useRef(null); // 容器DOM引用
|
const containerRef = useRef(null); // 容器DOM引用
|
||||||
@@ -67,6 +69,10 @@ export default function WechatRegister() {
|
|||||||
clearInterval(pollIntervalRef.current);
|
clearInterval(pollIntervalRef.current);
|
||||||
pollIntervalRef.current = null;
|
pollIntervalRef.current = null;
|
||||||
}
|
}
|
||||||
|
if (backupPollIntervalRef.current) {
|
||||||
|
clearInterval(backupPollIntervalRef.current);
|
||||||
|
backupPollIntervalRef.current = null;
|
||||||
|
}
|
||||||
if (timeoutRef.current) {
|
if (timeoutRef.current) {
|
||||||
clearTimeout(timeoutRef.current);
|
clearTimeout(timeoutRef.current);
|
||||||
timeoutRef.current = null;
|
timeoutRef.current = null;
|
||||||
@@ -239,6 +245,40 @@ export default function WechatRegister() {
|
|||||||
};
|
};
|
||||||
}, [clearTimers]);
|
}, [clearTimers]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备用轮询机制 - 防止丢失状态
|
||||||
|
* 每3秒检查一次,仅在获取到二维码URL且状态为waiting时执行
|
||||||
|
*/
|
||||||
|
useEffect(() => {
|
||||||
|
// 只在有auth_url、session_id且状态为waiting时启动备用轮询
|
||||||
|
if (wechatAuthUrl && wechatSessionId && wechatStatus === WECHAT_STATUS.WAITING) {
|
||||||
|
console.log('备用轮询:启动备用轮询机制');
|
||||||
|
|
||||||
|
backupPollIntervalRef.current = setInterval(() => {
|
||||||
|
try {
|
||||||
|
if (wechatStatus === WECHAT_STATUS.WAITING && isMountedRef.current) {
|
||||||
|
console.log('备用轮询:检查微信状态');
|
||||||
|
// 添加 .catch() 静默处理异步错误,防止被 ErrorBoundary 捕获
|
||||||
|
checkWechatStatus().catch(error => {
|
||||||
|
console.warn('备用轮询检查失败(静默处理):', error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// 捕获所有同步错误,防止被 ErrorBoundary 捕获
|
||||||
|
console.warn('备用轮询执行出错(静默处理):', error);
|
||||||
|
}
|
||||||
|
}, BACKUP_POLL_INTERVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清理备用轮询
|
||||||
|
return () => {
|
||||||
|
if (backupPollIntervalRef.current) {
|
||||||
|
clearInterval(backupPollIntervalRef.current);
|
||||||
|
backupPollIntervalRef.current = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}, [wechatAuthUrl, wechatSessionId, wechatStatus, checkWechatStatus]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 测量容器尺寸并计算缩放比例
|
* 测量容器尺寸并计算缩放比例
|
||||||
*/
|
*/
|
||||||
@@ -314,6 +354,7 @@ export default function WechatRegister() {
|
|||||||
>
|
>
|
||||||
<iframe
|
<iframe
|
||||||
src={wechatAuthUrl}
|
src={wechatAuthUrl}
|
||||||
|
title="微信扫码登录"
|
||||||
width="300"
|
width="300"
|
||||||
height="350"
|
height="350"
|
||||||
style={{
|
style={{
|
||||||
|
|||||||
@@ -179,6 +179,7 @@ export default function SignInIllustration() {
|
|||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
},
|
},
|
||||||
|
credentials: 'include',
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
credential,
|
credential,
|
||||||
type,
|
type,
|
||||||
|
|||||||
Reference in New Issue
Block a user