From afe847c4007b4cb870c5a0aa4669d5d78a175f7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Wed, 22 Jul 2026 14:52:32 +0800 Subject: [PATCH] revert: retain `tel` autocomplete for phone fields --- docs/project-memory/shared-memory/pitfalls.md | 2 +- docs/【项目基线】当前产品与工程约束-2026-05-15.md | 2 +- src/components/auth/BindPhoneScreen.tsx | 2 +- src/components/auth/LoginScreen.tsx | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index 1b696a019..719c347bc 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -1794,7 +1794,7 @@ - 现象:登录弹窗的手机号被浏览器回填为 `+86 1xxxxxxxxxx`,点击获取验证码或登录后返回“手机号格式不正确”。 - 原因:`autocomplete="tel"` 允许浏览器回填含国家码的完整电话号码,`inputMode="numeric"` 只提示软键盘布局,不会过滤自动填充;历史 `normalizePhoneInput` 还保留了 `+`,而后端大陆手机号边界只接受 11 位国内号码。 -- 处理:手机号字段用 `autocomplete="tel-national"` 提示国内号码,并在 `authService.normalizePhoneInput` 统一把 `+86 1xxxxxxxxxx` 和 `86 1xxxxxxxxxx` 收口为 `1xxxxxxxxxx`;所有认证请求和最近登录号码缓存继续共用该边界,不在单个页签临时特判。 +- 处理:手机号字段保留 `autocomplete="tel"`,不改写浏览器自动填充策略;在 `authService.normalizePhoneInput` 统一主动把 `+86 1xxxxxxxxxx` 和 `86 1xxxxxxxxxx` 收口为 `1xxxxxxxxxx`,所有认证请求和最近登录号码缓存继续共用该边界,不在单个页签临时特判。 - 验证:`npm run test -- src/services/authService.test.ts`,覆盖带 `+86`、不带加号的 `86` 和普通 11 位国内号码。 - 关联:`src/services/authService.ts`、`src/services/authService.test.ts`、`src/components/auth/LoginScreen.tsx`、`src/components/auth/BindPhoneScreen.tsx`。 diff --git a/docs/【项目基线】当前产品与工程约束-2026-05-15.md b/docs/【项目基线】当前产品与工程约束-2026-05-15.md index a1a4fee84..088c00f3a 100644 --- a/docs/【项目基线】当前产品与工程约束-2026-05-15.md +++ b/docs/【项目基线】当前产品与工程约束-2026-05-15.md @@ -55,7 +55,7 @@ Genarrative / 陶泥儿是一个 AI 原生互动内容与小游戏平台。当 9. 账号信息面板只展示 `账号信息` 标题;绑定手机号和绑定微信以紧凑模块展示当前绑定状态,已绑定手机号展示完整手机号,已绑定微信优先展示微信平台实际返回并由后端保存的 `wechatDisplayName`。小程序 `jscode2session` 不能直接返回微信昵称或个人微信号,只能稳定拿到当前小程序维度的 `openid`,并在满足微信开放平台条件时拿到 `unionid`;小程序昵称来自快捷登录后按需展示的原生 `input type="nickname"` 提交的 `displayName`。后端下发 `wechatAccount` 作为绑定账号标识,前端在没有真实昵称时展示微信账号尾号,不展示裸“已绑定”。换绑入口放在对应模块右上角,退出登录和退出全部设备固定放在面板内容最底部。 10. H5 登录态从未登录变为已登录,或从已登录变为未登录后,必须刷新当前页面一次,确保推荐运行态、作品架、个人缓存和私有 query 都按新身份重新初始化;普通 access token 续期、账号资料更新和同一登录态内的设置变化不得触发整页刷新。 11. 同一账号允许多端同时在线。新增登录和单设备退出只影响对应 refresh session,不得提升账号级 `tokenVersion` 让其它设备的 access token 失效;只有“退出全部设备”、修改密码、重置密码等明确安全动作才吊销全端 refresh session 并提升 `tokenVersion`。 -12. 主站手机号输入以中国大陆 11 位国内号码为前端提交口径;输入框使用 `tel-national` 提示浏览器回填国内号码,认证 service 边界还必须把浏览器可能回填的 `+86 1xxxxxxxxxx` 或 `86 1xxxxxxxxxx` 收口为 `1xxxxxxxxxx`,再用于验证码、密码登录、绑定、换绑、重置密码和最近登录号码缓存;不得只依赖 `inputMode="numeric"`,它只是软键盘提示,不会限制自动填充值。 +12. 主站手机号输入以中国大陆 11 位国内号码为前端提交口径;输入框保留 `autocomplete="tel"` 与浏览器默认电话号码回填能力,不通过改写自动填充类型规避国家码。认证 service 边界必须主动把浏览器可能回填的 `+86 1xxxxxxxxxx` 或 `86 1xxxxxxxxxx` 收口为 `1xxxxxxxxxx`,再用于验证码、密码登录、绑定、换绑、重置密码和最近登录号码缓存;不得只依赖 `inputMode="numeric"`,它只是软键盘提示,不会限制自动填充值。 ## 账户与充值 diff --git a/src/components/auth/BindPhoneScreen.tsx b/src/components/auth/BindPhoneScreen.tsx index 0215786e0..149d13fbf 100644 --- a/src/components/auth/BindPhoneScreen.tsx +++ b/src/components/auth/BindPhoneScreen.tsx @@ -118,7 +118,7 @@ export function BindPhoneScreen({ 手机号 setPhone(event.target.value)} diff --git a/src/components/auth/LoginScreen.tsx b/src/components/auth/LoginScreen.tsx index 3819a683a..669704f3d 100644 --- a/src/components/auth/LoginScreen.tsx +++ b/src/components/auth/LoginScreen.tsx @@ -261,7 +261,7 @@ export function LoginScreen({ 手机号 setPhone(event.target.value)} @@ -504,7 +504,7 @@ function PhoneCodeForm({ 手机号 onPhoneChange(event.target.value)} @@ -600,7 +600,7 @@ function PasswordResetPanel({ 手机号 onPhoneChange(event.target.value)}