refactor(passport): 适配二维码登录后端ConfirmLoginResult接口

- 扩展ConfirmLoginResult状态字段,添加accessToken、expiresIn等信息
- 新增绑定手机号、跳转等下一步操作字段支持
- 更新登录确认逻辑,使用status字段判断confirmed状态
- 支持successMessage及message多样提示内容
- 增加绑定手机号状态时提示并跳转到手机号绑定页
- 保留兼容旧版success布尔字段处理逻辑
This commit is contained in:
2026-04-07 16:59:49 +08:00
parent 8da0108f56
commit 93b79237f7
2 changed files with 37 additions and 8 deletions

View File

@@ -78,19 +78,36 @@ export interface ConfirmLoginParam {
deviceInfo?: string; deviceInfo?: string;
} }
// 确认登录响应 // 确认登录响应(适配后端 QrLoginStatusResponse
export interface ConfirmLoginResult { export interface ConfirmLoginResult {
// 是否成功 // 状态: pending-等待扫码, scanned-已扫码, confirmed-已确认, bind_phone-待绑定手机号, expired-已过期
success: boolean; status: string;
// 消息 // JWT访问令牌(仅在confirmed状态时返回)
message: string; accessToken?: string;
// 登录用户信息 // 用户信息
userInfo?: { userInfo?: {
userId: number; userId: number;
username?: string;
nickname?: string; nickname?: string;
avatar?: string; avatar?: string;
phone?: string; phone?: string;
}; };
// 剩余过期时间(秒)
expiresIn?: number;
// 租户ID
tenantId?: number;
// 是否需要绑定手机号
needBindPhone?: boolean;
// 状态提示信息
message?: string;
// 下一步操作bind_phone-绑定手机号, redirect-跳转, wait-等待
nextAction?: string;
// 跳转URL当nextAction为redirect时使用
redirectUrl?: string;
// 成功消息
successMessage?: string;
// 兼容字段:如果后端返回 success
success?: boolean;
} }
/** /**

View File

@@ -140,10 +140,13 @@ const QRConfirmPage: React.FC = () => {
} }
}); });
if (result.success) { // 根据 status 判断成功confirmed 表示登录成功
const isConfirmed = result.status === 'confirmed' || result.success === true;
if (isConfirmed) {
setConfirmed(true); setConfirmed(true);
Taro.showToast({ Taro.showToast({
title: '登录确认成功', title: result.successMessage || result.message || '登录确认成功',
icon: 'success', icon: 'success',
duration: 2000 duration: 2000
}); });
@@ -164,6 +167,15 @@ const QRConfirmPage: React.FC = () => {
}); });
} }
}, 3000); }, 3000);
} else if (result.status === 'bind_phone' || result.needBindPhone) {
// 需要绑定手机号
Taro.showToast({
title: '请先绑定手机号',
icon: 'none'
});
setTimeout(() => {
Taro.redirectTo({ url: '/passport/sms-login' });
}, 1500);
} else { } else {
setError(result.message || '登录确认失败'); setError(result.message || '登录确认失败');
} }