-
-
{p.name}
- ¥{p.price}
-
-
{p.subtitle}
-
-
-
- 立即购买
-
+
+
+
+
+
{p.name}
+ ¥{p.price}
+
+
{p.subtitle}
+
+
+
+
+
+
+ 立即购买
+
))}
+
+
);
}
diff --git a/apps/h5-user/src/pages/LoginPage.tsx b/apps/h5-user/src/pages/LoginPage.tsx
index 0458551..d7773b7 100644
--- a/apps/h5-user/src/pages/LoginPage.tsx
+++ b/apps/h5-user/src/pages/LoginPage.tsx
@@ -2,6 +2,7 @@ import { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import AppImage from '@dukang/shared-ui/AppImage';
import { request, saveAuth } from '../lib/api';
+import { normalizePhoneInput, validateMobilePhone } from '../lib/phone';
export default function LoginPage() {
const navigate = useNavigate();
@@ -22,6 +23,11 @@ export default function LoginPage() {
async function sendCode() {
if (!ensureAgreed()) return;
+ const phoneCheck = validateMobilePhone(phone);
+ if (!phoneCheck.ok) {
+ setMsg(phoneCheck.message ?? '请输入正确的手机号码');
+ return;
+ }
setMsg('');
await request('USER_H5', '/auth/sms/send', {
method: 'POST',
@@ -42,6 +48,15 @@ export default function LoginPage() {
async function login() {
if (!ensureAgreed()) return;
+ const phoneCheck = validateMobilePhone(phone);
+ if (!phoneCheck.ok) {
+ setMsg(phoneCheck.message ?? '请输入正确的手机号码');
+ return;
+ }
+ if (!code.trim()) {
+ setMsg('请输入验证码');
+ return;
+ }
setLoading(true);
setMsg('');
try {
@@ -77,17 +92,6 @@ export default function LoginPage() {
-
-
-
-
- 或者
-
-
-
手机验证码登录
@@ -96,8 +100,13 @@ export default function LoginPage() {
type="tel"
className="login-field-input"
placeholder="请输入手机号"
+ maxLength={11}
+ inputMode="numeric"
value={phone}
- onChange={(e) => setPhone(e.target.value)}
+ onChange={(e) => {
+ setPhone(normalizePhoneInput(e.target.value));
+ setMsg('');
+ }}
/>
@@ -128,6 +137,17 @@ export default function LoginPage() {
{loading ? '登录中...' : '登录'}
+
+
+
+ 或者
+
+
+
+
-