完成80%

This commit is contained in:
2026-07-27 06:50:07 +08:00
parent 8475bbd19a
commit 1eae3bbef4
63 changed files with 13664 additions and 280 deletions
+33 -13
View File
@@ -234,7 +234,7 @@ import {
isRequestCancelled,
} from "@/utils/api.js";
import {
AUTH_TAC_SCENE,
AUTH_VERIFICATION_OPERATION,
createTacRenderContext,
isAuthPhone,
isSmsDeliveryOutcomeUnknown,
@@ -276,7 +276,7 @@ const authenticationNavigationFailure =
"登录已完成,但暂时无法进入家谱,请再次点击进入";
const authRequestController = createRequestController();
const smsCooldown = createAuthSmsCooldown({
sceneCode: AUTH_TAC_SCENE.SMS_LOGIN,
operationCode: AUTH_VERIFICATION_OPERATION.SMS_LOGIN,
onChange: (seconds) => {
cooldownSeconds.value = seconds;
},
@@ -407,22 +407,33 @@ const prepareGetCode = async () => {
if (!validatePhone() || !requireAgreement()) return;
sendingCode.value = true;
try {
const sceneCode = AUTH_TAC_SCENE.SMS_LOGIN;
const operationCode = AUTH_VERIFICATION_OPERATION.SMS_LOGIN;
const requestedPhone = phone.value;
const response = await appApi.getCaptchaRequirement(
{ sceneCode, subject: requestedPhone },
{ operationCode, subject: requestedPhone },
{ requestController: authRequestController },
);
if (!pageActive) return;
if (phone.value !== requestedPhone) throw new Error("手机号已变化,请重新获取验证码");
const requirement = normalizeCaptchaRequirement(response, sceneCode);
const requirement = normalizeCaptchaRequirement(response);
if (!requirement.required) {
await appApi.sendSmsCode(
{ operationCode, phone: requestedPhone },
{ requestController: authRequestController },
);
if (!pageActive) return;
sentPhone.value = requestedPhone;
smsCooldown.start();
showFeedback("验证码已发送");
return;
}
tacSequence += 1;
tacContext.value = createTacRenderContext({
requestId: `a01-sms-${tacSequence}`,
baseUrl: runtimeConfig.baseUrl,
clientId: runtimeConfig.clientId,
tenantId: runtimeConfig.tenantId,
sceneCode,
operationCode,
subject: requestedPhone,
requirement,
});
@@ -445,25 +456,33 @@ const preparePasswordLogin = async () => {
const passwordHash = calcMD5(password.value);
submitting.value = true;
try {
// 产品规则:密码登录也必须先完成滑动验证。当前登录接口不消费
// validToken,因此票据只作为本次前端验证成功的完成信号,不写入登录体。
const sceneCode = AUTH_TAC_SCENE.SMS_LOGIN;
const operationCode = AUTH_VERIFICATION_OPERATION.PASSWORD_LOGIN;
const response = await appApi.getCaptchaRequirement(
{ sceneCode, subject: requestedPhone },
{ operationCode, subject: requestedPhone },
{ requestController: authRequestController },
);
if (!pageActive) return;
if (phone.value !== requestedPhone) {
throw new Error("手机号已变化,请重新登录");
}
const requirement = normalizeCaptchaRequirement(response, sceneCode);
const requirement = normalizeCaptchaRequirement(response);
if (!requirement.required) {
await appApi.loginWithPassword(
{ phone: requestedPhone, passwordHash },
{ requestController: authRequestController },
);
if (!pageActive) return;
authenticationCommitted.value = true;
await enterAuthenticatedRoot();
return;
}
tacSequence += 1;
tacContext.value = createTacRenderContext({
requestId: `a01-password-${tacSequence}`,
baseUrl: runtimeConfig.baseUrl,
clientId: runtimeConfig.clientId,
tenantId: runtimeConfig.tenantId,
sceneCode,
operationCode,
subject: requestedPhone,
requirement,
});
@@ -504,6 +523,7 @@ const completeTac = async (result) => {
{
phone: action.phone,
passwordHash: action.passwordHash,
validToken: ticket.validToken,
},
{ requestController: authRequestController },
);
@@ -521,7 +541,7 @@ const completeTac = async (result) => {
sendingCode.value = true;
await appApi.sendSmsCode(
{
sceneCode: AUTH_TAC_SCENE.SMS_LOGIN,
operationCode: AUTH_VERIFICATION_OPERATION.SMS_LOGIN,
phone: expectedContext.subject,
validToken: ticket.validToken,
},