diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index 6cb0daf..20c5f84 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -125,6 +125,20 @@ function clearHint() { apiHintTone.value = 'neutral' } +function normalizeSmsCode(value: string): string { + return value.replace(/\D/g, '').slice(0, 6) +} + +function onCaptchaInput(event: Event) { + const input = event.target as HTMLInputElement | null + const next = normalizeSmsCode(input?.value ?? '') + captcha.value = next + if (input && input.value !== next) { + input.value = next + } + captchaFieldError.value = false +} + function parseJsonErrorPayload(data: unknown): string { if (data == null || typeof data !== 'object') return '请求失败' const d = data as Record @@ -251,8 +265,9 @@ async function sendCode() { async function onSubmit() { const mobileOk = /^1[3-9]\d{9}$/.test(mobile.value.trim()) - const codeTrimmed = captcha.value.trim() - const captchaOk = codeTrimmed.length > 0 + const codeTrimmed = normalizeSmsCode(captcha.value) + captcha.value = codeTrimmed + const captchaOk = codeTrimmed.length === 6 mobileFieldError.value = !mobileOk captchaFieldError.value = mobileOk && !captchaOk if (!mobileOk) { @@ -260,7 +275,7 @@ async function onSubmit() { return } if (!captchaOk) { - setHint('请输入验证码', 'error') + setHint('请输入 6 位验证码', 'error') return } clearHint() @@ -430,15 +445,17 @@ onUnmounted(() => { />