# U8 Chat 2.0 · 登录密码（密码登录 / 设置密码 / 忘记密码）产品需求文档（PRD）

| 项目 | 内容 |
|---|---|
| 文档版本 | v1.0（2026-09-22）· 新增功能：给账号加一条**可选的、后设置的**登录密码 |
| 功能模块 | ① 登录页（新增「密码登录」入口）② 我的 → 隐私和安全 → 登录密码 |
| 适用端 | iOS / Android（同一个 App，一套规则）。Web / Desktop 本期不做，原因见第九章 |
| 演示页 | 同目录 `index.html`（**18 屏可点击**：A 登录与注册 **5 屏** · B 设置与修改密码 6 屏 · C 忘记密码 5 屏 · D 通知与总览 2 屏）。**它的作用＝给 UI 设计的「流程 + 入口」清单**；版式细节以 UI 为准（见决策 23） |
| 设计稿 | Figma `6dsI4eKdAoZr4RP0uILIBq`（U8 Chat 2.0）· PAGE「iOS端」：**SECTION「登录注册」`1092:61746`**（1 个画板「登录」`1092:66063`）与 **SECTION「我的-隐私和安全」`803:143913`**（5 个画板，入口页 `802:128996`）。⚠️ 登录画板的**主体是实机截图的位图**，矢量部分只有右上角新增的「网络诊断」入口 —— 所以本次做法是：**已有画板 1:1 照做（一句文案都不自造），只新增「密码登录」入口与「登录密码」行**；设计稿没画的页面在交付物里逐屏标注「设计稿未画 · 文案本次自拟」。⚠️ **这份设计图＝「目标状态」（我们要做成这样），但它不全** —— 有一部分功能是**以前的 UI 同事**做的，图纸不在其中，所以「**设计图里没有 ≠ 这个页面没做过**」；**哪些页面已经开发完成，一律由产品确认**（2026-09-23 产品澄清） |
| 参照产品 | Telegram（Password / Two-Step Verification 的形态）—— 但**明确不采用它的 2FA**，理由见第三章 |
| 一句话需求 | 账号体系不变（手机号首次登录即注册）；新增**后设置的登录密码**，设置后可用「手机号 + 密码」登录；**忘记密码**走短信验证码重置；**本期不额外做两步验证（2FA）** |

> **本 PRD 做了什么**：这个功能的界面工作量不大（登录页多一个入口、设置里多一行），真正要写清的是三件事 —— ① **密码与验证码是什么关系**（两条平行的登录方式，不是两步验证）；② **忘记密码怎么自救**（本期没有客服）；③ **密码的规则、错误次数、锁定，以及重置后的设备处置**。分别落在第三、七、八章。
> **与既有交付物的关系**：验证码参数（5 位 / 5 分钟 / 30s 重发 / 错误 5 次锁 24 小时）与「修改手机号」统一；系统通知由官方账号「U8 Chat」承载、验证码走哪条通道、新设备登录通知**全部沿用「设备管理」6.9.1**，本 PRD 不重新定义。
> **演示页怎么用**：`index.html` 共 18 屏，左栏可按「核心路径（P0）/ 规则与状态（P1）」筛屏；手机屏上的**虚线框**就是可点的地方，鼠标悬停会显示它跳到哪一屏。
> **本次范围（2026-09-23 产品明确）**：只做 **密码登录 + 忘记密码**；密码登录的前提＝**手机号已注册登录、且用户自己设置过密码**（**没有默认密码**）。**已经开发完成的页面**（登录验证码页、手机号位数校验弹窗）**不再画**；**与本次无关的元素**（网络诊断入口、国家编码能否点等）**既不做标注也不做解释**（开发有疑问产品会自己解答）。演示页说明栏**只写本次新增的内容**。
> **演示版与设计稿的关系（2026-09-23 产品澄清，重要）**：**本演示与 PRD 都是「UI 设计之前的输入」** —— 作用是告诉 UI「这个功能**有哪些流程、有哪些页面、从哪儿进**」，并给出每个页面的**规则与文案建议**。已有的 Figma 画板（登录页、我的-隐私和安全）照做；还没画的页面由本演示给出**建议稿**。**最终视觉以 UI 设计为准**，因此按钮摆放、间距一类版式细节**不作为评审与验收项**。

---

## 一、背景与目标

### 1.1 背景

U8 Chat 的账号体系里**手机号就是账号**：注册、登录、加好友、找回都围绕它。原本唯一的登录方式是「手机号 + 验证码」，并且**新用户手机首次登录即完成注册** —— 没有独立的注册流程，用户在这一步看不到「注册」两个字。**这套逻辑本次保持不变。**

本次新增的是一条**平行的登录方式**：登录密码。

- **定位**：手机不在身边 / 收不到验证码时的**备用入口**；常用设备上更快的登录路径；服务端侧多一道不依赖短信通道的凭证。
- **形态**：密码是**后设置的、可选的**（产品原话：「密码是后设置的」）—— 不强制、不弹窗打断，入口放在「我的 → 隐私和安全 → 登录密码」，由用户在**已登录状态下**自己设。

### 1.2 现状问题（本次要解决的）

| # | 问题 | 后果 |
|---|---|---|
| 1 | 只有验证码一条路 | **短信收不到就登不进来**：境外卡、短信被拦截、运营商故障、换机未同步、手机不在身边。账号下有活跃设备时，验证码还只发到已登录设备的会话里，手机不在身边同样拿不到 |
| 2 | 密码是「后设置」的，却没有入口 | 没有地方设置、也没有地方能看出「我到底设过没有」 |
| 3 | 忘记密码无路可走 | 本期**没有客服功能**；只做密码登录不做找回，忘记密码的用户会永久失联 |
| 4 | 密码与验证码的关系没有定义 | 会不会变成 Telegram 那样的两步验证？要不要每次登录输两个凭证？不定义就会被各端各做一套 |

### 1.3 目标

**业务目标**
- 在不改变账号体系、不增加注册流程的前提下，把「收不到验证码就登不进来」这个**单点问题**补掉。
- 为后续的风控与账号安全能力留下挂钩点：**密码 + 设备 + 通知**三条线索。

**用户目标**
- 想设密码的人**能找到地方设置**，并且明确知道「设了之后验证码登录依然可用」；
- 忘记密码的人**能自己救回来**（本期靠短信验证码）；
- 输错密码的人**知道还能试几次、什么时候能再试、还有哪条路能走**。

### 1.4 成功指标（上线首月，目标值需先取基线再锁定）

| 指标 | 目标 |
|---|---|
| 密码设置率（已登录用户中设置过登录密码的占比） | ≥ 20% |
| 密码登录成功率（进入密码登录页 → 登录成功） | ≥ 85% |
| 忘记密码流程完成率（进入「忘记密码」→ 重置成功） | ≥ 60% |
| 与密码相关的用户反馈 / 工单 | 目标 **0**（本期无客服，只能靠文案与自助页兜住） |

---

## 二、范围

### 2.1 本期做

- 登录页新增「密码登录」入口 + 密码登录页（含**密码错误 / 次数超限锁定 / 该号未设置密码**三种结果）
- 「我的 → 隐私和安全」新增「登录密码」行，含**设置 / 修改 / 关闭**
- **忘记密码**：短信验证码 → 设置新密码 → 用新密码登录
- 「没收到验证码？」自助排查页（**无客服口径**）
- 系统通知沿用官方账号「U8 Chat」：新用户首次登录 / 登录验证码 / 新设备登录（**密码登录也发**）
- 密码规则校验、密码错误次数与锁定

### 2.2 本期不做（明确划出）

| 不做的事 | 原因 |
|---|---|
| **登录 / 注册的验证码页** | **已开发完成**，本次不重复设计（演示里也不再画）—— 见决策 24 |
| **两步验证（2FA）** | **已决策不做**，完整论证见**第三章** |
| 邮箱 / 好友辅助找回 | 账号体系只有手机号，没有邮箱；没有可用的好友关系链做辅助验证 |
| 密码提示（hint）、密保问题 | 没有找回通道配套，做了也救不回人；反而给撞库者提供线索 |
| 账号申诉与人工找回（需客服） | 本期没有客服功能。这是**下一期的第一优先级**（见 3.5） |
| 强制设置密码 / 首次登录弹窗引导设置 | 密码定位是**可选**的备用入口，强制会挡住只想用验证码的绝大多数用户 |
| 密码有效期 / 定期强制改密 | 没有客服兜底时，任何「到期必须改」的规则都会制造失联用户 |
| 生物识别（Face ID / 指纹）解锁应用 | 属「应用锁」，随全局排期 |
| 资金密码 / 支付密码的任何改动 | 与登录密码是两套东西，归属资产模块（设备管理亦已决策不做资金密码二次验证） |
| Web / Desktop 的密码登录 | 见第九章 |
| 深色模式、大字号无障碍适配 | 随全局一起排期 |

---

## 三、核心决策：做了密码登录，为什么不再单独做两步验证（2FA）★

> 这一章正面回答产品提出的问题：**「有了密码登录，是不是就可以不做两步验证了？」**
> **结论：可以不做的，本期也建议不做。** 下面按「概念 → 能力 → 代价 → 兜底 → 触发条件」说清。

### 3.1 先把三个容易混的东西分开

| 概念 | 是什么 | U8 里对应什么 |
|---|---|---|
| **登录方式** | 进入账号的一道门。**多道门之间是「选一道走」** | ① 验证码登录 ② 密码登录 ③ 扫码登录（②为本期新增） |
| **两步验证（2FA）** | **同一次登录里要求两种不同因子**（知识 + 持有）= 「一道门上加两道锁」 | **本期不做**。Telegram 的 Two-Step Verification 就是它：验证码之后还要再输密码 |
| **敏感操作二次验证** | 登录**之后**做高危操作时再确认一次身份 | 已有：换绑手机号先验旧号；本 PRD 新增：改密码 / 关密码要验当前密码；设备管理已决策不做资金密码 / Face ID |

**关键区别**：密码登录与验证码登录是**两条平行的路（二选一）**，不是同一条路上的两道关卡。所以「做了密码登录」**不等于**「已经做了两步验证」—— 两者解决的不是同一个问题。但正因为密码提供了第二条独立的进门路径，**2FA 的必要性反而下降**（见 3.3、3.4）。

### 3.2 2FA 能防什么

2FA 的收益只有一条：**当第一个因子泄露时，攻击者仍然需要第二个因子。**

| 攻击场景 | 2FA 有没有用 |
|---|---|
| 密码被撞库 / 泄露，攻击者拿密码登录 | **有用**（还差一条验证码） |
| 验证码被截获（短信劫持、诱导转发、木马读短信） | 有用（还差密码）—— 前提是攻击者**不知道密码** |
| 手机被偷但已解锁、App 处于已登录状态 | **没用**（攻击者直接就是"已登录"状态） |
| 用户被诱导，自己把验证码念给了骗子 | **没用**（登录是在用户自己的设备上完成的） |

而 U8 的现实是：**主登录方式就是验证码**。攻击者要进门，通常得先控制手机号（补卡 / 换绑）或控制一台已登录设备 —— 这两件事 **2FA 都拦不住**。真正拦得住、且事后能止损的是「登录通知 + 远程注销」（见 3.4）。另外，验证码作为第二因子，本身并不比密码更"硬"：短信可以被劫持，而手机号还可能被补卡。

### 3.3 2FA 的代价（本期尤其不该做的理由）

| 代价 | 具体到 U8 |
|---|---|
| **忘记密码 = 永久失联** | 2FA 意味着密码成为**登录的必经凭证**。本期**没有客服、没有申诉、没有账号找回**（`修改手机号` PRD 也明确本期不开免验证口子）—— 忘记那个密码的用户**没有任何路可以走**。这是最硬的一条反对理由：**在找回通道上线之前，不该引入"用户可能忘掉、且无法找回"的必填凭证** |
| **抵消「备用入口」的价值** | 密码的定位是「手机不在身边时用」。若密码登录仍要求验证码，那么手机不在身边时这条路同样走不通 —— 功能白做 |
| **登录变重** | 每台设备、每次登录都要过两道。对绝大多数只是换手机的用户，这是纯粹的摩擦 |
| **支持成本** | 本期没有客服，任何"卡在登录"的用户都无处求助，只能卸载 |

### 3.4 U8 已有的兜底（覆盖面比 2FA 更广）

| 兜底 | 作用 | 归属 |
|---|---|---|
| **新设备登录通知** | 每一次新的登录（验证码 / 密码 / 扫码）都给其它在线端发一条通知，**事后可发现** | 设备管理 6.9.1（本期沿用；密码登录也发） |
| **设备管理里远程注销** | 发现异常后**一键掐断**任意设备的会话 | 设备管理（已有交付物） |
| **扫码登录 + 手机端确认** | 电脑上登录必须由手机端确认，等于给桌面端加了一道"持有手机"的因子 | 设备管理 6.8 |
| **密码错误锁定** | 提高密码被暴力破解的成本 | 本 PRD 8.2 |
| **敏感操作二次验证** | 换绑手机号先验旧号；改密码 / 关密码验当前密码 | 修改手机号交付物 + 本 PRD |

一句话：**U8 的安全投入放在「登录之后」（可见、可止损），而不是「登录那一刻」（不可见、一旦忘记就锁死）。在只有手机号一个账号体系、且没有客服的阶段，这是更划算的一侧。**

同时要点明：**「二次验证」这个需求并不等于 2FA**。产品希望的那种"关键操作再确认一次"的能力，已经通过上表最后一行被满足了，只是它不叫两步验证。

### 3.5 什么情况下应该回头做 2FA（触发条件，写下来备查）

出现以下任意一条，重新评估：

1. **客服 / 账号申诉通道上线**（忘记密码能被人工救回）—— 这是最前置的条件；
2. 数据上出现「密码被撞库后成功登录」的真实案例；
3. 密码登录成为**主要**登录方式（占比 > 50%）；
4. 监管或合规要求。

如果将来做，**建议形态是「可选开启」的 2FA**：默认关闭，用户主动开启；开启时要求绑定手机号并**生成一组恢复码（Recovery Code）**，并明确告知「忘记密码只能靠恢复码或人工核验」。**不要做成默认强制。**

---

## 四、名词定义

| 名词 | 定义 |
|---|---|
| 登录密码 | 用户自选的、用于登录的密码。**与资金密码 / 支付密码无关**，两者互不影响 |
| 验证码登录 | 手机号 + 验证码。5 位数字 / 5 分钟有效。账号下有活跃设备时，验证码改走官方账号会话（不走短信） |
| 密码登录 | 手机号 + 登录密码。**不发验证码**，不受「验证码只发已登录设备」的限制 |
| 首次登录即注册 | 手机号在库里不存在时，验证码验证通过即**创建账号并登录**，用户无感知、页面上不出现「注册」 |
| 官方账号 U8 Chat | 承载系统通知的官方会话（带认证标识、可聊天），三条消息见 7.7 |
| 重置票据 | 忘记密码流程中，验证码校验通过后签发的一次性凭证（10 分钟有效，用后作废） |
| 活跃设备 | 账号下当前有效（未注销、未过期）的登录会话 |

---

## 五、用户与场景

| 场景 | 描述 | 走哪条路 | 关键诉求 |
|---|---|---|---|
| **A · 换新手机（短信收得到）** | 新设备登录 | 验证码登录 | 保持现状，别变复杂 |
| **B · 手机不在身边** | 在别的设备上要登录 | **密码登录** | 只要密码就能进 |
| **C · 想给账号加一道锁** | 已登录，去设置密码 | 设置登录密码（B1→B2） | 知道设了之后还能用验证码 |
| **D · 忘了密码** | 密码登录这条路走不通 | **忘记密码**（C1→C4） | 用手机号能救回来 |
| **E · 密码可能泄露** | 怀疑被别人知道 | 改密码（B4）/ 重置（C1） | 改完能把设备踢掉 |
| **F · 手机号也停用了** | 任何验证码都收不到 | ⚠️ **无路可走** | 本期只能自助提示（C5），下一期账号找回 |

---

## 六、功能总览

```
                        ┌───────────────────────────────────────────────┐
                        │  登录页（A1）                                  │
                        │  手机号 + 验证码        ← 默认（原样保留）      │
                        │  「密码登录」            ← 本次新增             │
                        └───────┬──────────────────────┬────────────────┘
                                │                      │
                    验证码路（原样保留）          密码路（本次新增）
                                │                      │
              ┌─────────────────▼──────────┐  ┌────────▼────────────────────┐
              │ 验证码页：已开发完成        │  │ 密码登录页（A3）             │
              │ · 没有账号 → 自动注册+登录   │  │ · 密码错   → A4（还剩几次）  │
              │ · 有账号   → 直接登录        │  │ · 错太多   → A5（锁 15 分钟）│
              │                             │  │ · 没设过   → A6（回验证码）  │
              │ （不在本次演示范围）        │  │ · 忘记密码 → C1              │
              └─────────────────────────────┘  └─────────────────────────────┘
                                               └─────────────────────────────┘

   已登录侧（B）                          忘记密码（C）
   ┌───────────────────────────────┐     ┌────────────────────────────────────┐
   │ 我的 → 隐私和安全（B1）        │     │ 忘记密码（C1）                     │
   │ 「登录密码」= 未设置 / 已设置  │     │   → 短信验证码（C2）                │
   │  ├ 设置（B2 → B3）             │     │   → 设置新密码（C3）                │
   │  ├ 修改（B4 → B5）             │     │   → 重置成功（C4）                  │
   │  └ 关闭（B6）                  │     │   → 其它设备上的登录全部失效        │
   └───────────────────────────────┘     │ 收不到短信 → 自助排查（C5）        │
                                          └────────────────────────────────────┘

   共用兜底（D）：官方账号 U8 Chat 的新设备登录通知（D1）· 设备管理里远程注销 · 扫码登录
```

### 6.1 页面清单

| 屏 | 名称 | 说明 | 优先级 |
|---|---|---|---|
| A1 | 登录页 · 验证码登录（默认） | 底部新增「密码登录」入口 | P0 |
| A3 | 登录页 · 用密码登录 | 本次核心新增页 | P0 |
| A4 | 密码错误（弹窗） | 给出剩余次数 | P0 |
| A5 | 错误次数过多 · 暂时锁定（弹窗） | 15 分钟，验证码登录不受影响 | P1 |
| A6 | 该账号还没有设置登录密码（弹窗） | 直接回验证码登录 | P1 |
| B1 | 我的 → 隐私和安全 | 「登录密码」入口 | P0 |
| B2 | 设置登录密码 | 双输入 + 规则说明 | P0 |
| B3 | 设置成功（弹窗） | 说明忘记可用短信重置 | P0 |
| B4 | 修改登录密码 | 验当前密码 + 关闭入口 | P0 |
| B5 | 修改成功（弹窗） | 明确「其它设备不被踢」 | P0 |
| B6 | 关闭登录密码（确认弹窗） | 两按钮 | P1 |
| C1 | 忘记密码 · 发送验证码 | 号码只展示 + 中间四位脱敏 | P0 |
| C2 | 输入验证码短信（重置） | 复用同一套验证码页 | P0 |
| C3 | 设置新密码 | 规则与 B2 逐字一致 | P0 |
| C4 | 重置成功（弹窗） | 其它设备登录失效 | P0 |
| C5 | 没收到验证码？（自助排查） | 两条自查 + 无客服口径的标注 | P1 |
| D1 | 官方账号 U8 Chat | 三条系统通知 | P0 |
| D2 | 登录方式总览 | 流程梳理（也是 2FA 结论的图示） | P0 |

---

## 七、需求详述

### 7.1 登录页与「首次登录即注册」`#A1`（P0）

**入口**：App 启动后未登录 → 直接落在登录页。**这一页的默认方式不变，仍是验证码登录。**

| 元素 | 内容 | 规则 |
|---|---|---|
| 标题 | **手机号登录** | 照 Figma 画板「登录」`1092:66063` |
| 副标题 | 未注册的用户，验证后将自动注册账号并登录 | 照画板；**「首次登录即注册」就落在这句话里** |
| 右上角 | 网络诊断 | 画板已有，本次不改 |
| 国家 / 地区行 | 🇨🇳 中国 | **可以切换，且是已经开发好的功能** —— 本次**不画、不标注**（2026-09-23 产品确认） |
| 号码行 | 11 位数字；空时显示占位 `000 0000 0000` | 位数不对在点「继续」时就地拦（**与既有登录页一致，不在本次演示**）；**不发码、不消耗次数** |
| 主按钮 | 继续 | **空输入时置灰**（照画板），输入 11 位后变紫 |
| 底部 | ○ 登录即代表同意**用户协议**和**隐私政策** | 照画板 |
| ★ 本次新增 | **密码登录**（放在同意条款行下方居中，进 A3） | 画板之外**唯一**的新增 |

**验证码登录 = 首次登录即注册（本次不变）**

> 登录验证码页（输入 5 位验证码那一屏）**已经开发完成**，本演示与 UI 都**不再重复画**（2026-09-23 产品确认）；下面这段讲的是**服务端判定**，仍然成立。

```
用户输入手机号 → 点「继续」→ 发验证码
   → 输入验证码 → 服务端校验
       ├─ 手机号在库里不存在 → 创建账号 → 登录成功 → 该设备收到「新用户首次登录」欢迎消息
       └─ 手机号已存在       → 直接登录
```

| 规则 | 说明 |
|---|---|
| 触发条件 | 验证码校验通过，且该手机号**没有账号** |
| 用户可见的差异 | **没有**。页面上不出现「注册」，也不出现「欢迎注册」 |
| 需要用户额外填的信息 | **没有**。昵称、头像等资料一律后续在「我的 → 编辑资料」补 |
| 新用户第一台设备的验证码通道 | **短信**（账号下没有活跃设备） |
| 登录成功后的可见证据 | 官方账号会话里的「新用户首次登录」欢迎消息（见 7.7） |

> ⚠️ **不要**为了"密码功能"在登录页加「注册」按钮或「密码登录 / 注册」两个 Tab —— 那会把一个无感的自动注册变成用户要做的选择题。


**按设计稿还原（2026-09-23 拿到画板后）**：登录页 **1:1 照 Figma 画板「登录」**（`1092:66063`）—— 标题「手机号登录」· 副标题「未注册的用户，验证后将自动注册账号并登录」· 国家行「🇨🇳 中国」· 号码行 `+86` + 占位 `000 0000 0000`（带下拉尖角）· 灰色「继续」· 底部「○ 登录即代表同意用户协议和隐私政策」· 右上角「网络诊断」，**逐字逐项照画板**。按钮**空输入时置灰**（画板画的就是这个状态），输入 11 位号码后变紫。

> ★ **本次唯一的新增**：同意条款行下方一行居中的紫色「**密码登录**」入口（走进 A3）。画板上既有元素的位置与文案**一处未动**。（入口放在哪儿是建议，最终由 UI 定。）

### 7.2 密码登录 `#A3` `#A4` `#A5` `#A6`（P0）

**入口**：登录页底部「密码登录」（A1 → A3）。**唯一入口**，不在别处再放。

> ⚠️ **不支持「默认密码」**：系统**不提供任何默认密码**，也**不允许"没设置过密码就直接用密码登录"**。密码**只能由用户自己设置**（B1 → B2）；没设过密码时，点「登录」一律走 **A6**（提示用验证码登录）。**这是本功能的硬前提**（2026-09-23 产品明确）。

| 元素 | 内容 | 规则 |
|---|---|---|
| 标题 | **手机号登录** | 与登录页同一标题 |
| 副标题 | 输入手机号与密码 | 建议文案，最终以 UI 为准 |
| 国家行 / 号码行 | 🇨🇳 中国 · `+86` + 11 位号码 | 与登录页一致 |
| 密码行 | 掩码圆点 + 右侧「**显示**」 | 可切明文自查 |
| 主按钮 | **登录** | 空输入置灰，输入后变紫 |
| 底部条款行 | ○ 登录即代表同意**用户协议**和**隐私政策** | 与登录页一致 |
| ★ 底部**两排**链接 | **上排「忘记密码？」** → C1 ／ **下排「验证码登录」** → A1 | 忘记密码是密码登录唯一的自救口，**不能藏进设置**；两排而不是一行，避免误点 |

**点「登录」的结果分支**

| # | 条件 | 表现 | 屏 |
|---|---|---|---|
| 1 | 手机号 + 密码正确 | **直接登录成功**（与验证码登录完全一致）；所有**其它**在线端收到「新设备登录」通知 | D1 |
| 2 | 手机号存在、密码错误 | iOS 弹窗「密码错误，请重新输入（还可以尝试 4 次）」→ 点「好」**保留手机号、清空密码** | A4 |
| 3 | 错误次数达到阈值 | iOS 弹窗「密码错误次数过多，请 15 分钟后再试。你也可以用验证码登录。」 | A5 |
| 4 | 手机号存在，但**从未设置过密码** | iOS 弹窗「这个账号还没有设置登录密码，请用验证码登录。」→ 点「好」**回 A1 且带入手机号** | A6 |
| 5 | 手机号位数不对 | iOS 弹窗给出提示，不发请求（**与既有登录页一致，不在本次演示**） | — |
| 6 | 手机号不存在 | ⚠️ **与 A6 同一提示**「这个账号还没有设置登录密码」—— 不泄露"该号码未注册" | A6 |

**规则**

- **不发验证码**：密码登录与验证码通道无关，因此**不受**「验证码只发已登录设备」的限制 —— 这正是它作为备用入口的价值。
- **新设备上直接放行**（已拍板）：不要求第二因素，风险由「新设备登录通知 + 设备管理远程注销」承担。
- **不做「记住密码 / 记住我」勾选框**（**2026-09-22 已拍板**）：登录态默认记住（与验证码登录一致）；要退出走「我的 → 退出登录」。
- **不改动登录页的默认方式**：默认永远是验证码登录。
- 密码字段**不做长度预校验**：位数/规则只在服务端判定，客户端只负责拦截"空密码"。

### 7.3 设置登录密码 `#B1` `#B2` `#B3`（P0）

**入口路径**：我的 → 隐私和安全 → 登录密码。入口页 **1:1 照 Figma 画板「我的-隐私和安全」**（`802:128996`）：卡片一 = 已拉黑的用户（2）/ 锁定码&Face ID（关闭）/ **登录密码（本次新增）** / 资金密码（已设置）/ 密保问题（未设置）；卡片二 = 手机号（不允许任何人）；卡片三 = 注销账号（红字）。

> ★ **本次唯一的新增**：在「锁定码&Face ID」与「资金密码」之间插入一行「**登录密码**」（绿色钥匙图标），值两态 **未设置** / **已设置**；其余每一行都是画板原样。（行放在哪儿是建议，最终由 UI 定。）

| 元素 | 内容 | 规则 |
|---|---|---|
| 行右侧值 | **未设置**（灰）/ **已设置** | 未设置 → 进 B2；已设置 → 进 B4 |
| 卡片说明 | 登录密码用于**收不到验证码时**登录账号，也可以在常用设备上快速登录。设置后**验证码登录依然可用**。 | 「设置后仍可用验证码」这句必须留 |
| 本页不放的行 | 两步验证 / 密码提示 / 密保问题 / 邮箱 | **不做就不画**（见 2.2、第三章） |
| 占位行 | 应用锁（未启用）、设备 | 分别是全局排期与他人已交付功能，点了给提示、不跳屏 |

**B2 设置页**

| 元素 | 内容 |
|---|---|
| 标题 / 说明 | 设置登录密码 / 设置后，你可以用「手机号 + 密码」登录 U8 Chat。密码只保存在服务器，我们不会以任何方式向你索要。 |
| 输入 | 密码 + 确认密码（双输入）。**默认隐藏**（掩码），右侧**眼睛图标**可切明文 |
| 规则文案 | 6–18 位，**至少包含字母和数字**；不能与手机号相同 |
| 按钮 | 完成（**不做置灰**，点了再校验） |
| 失败反馈 | iOS 弹窗：不符合规则 / 两次输入不一致（文案见第十章） |

**B3 成功弹窗**：紫圆 ✓ +「登录密码已设置」+「现在可以用手机号 + 密码登录 U8 Chat。忘记密码时可以**通过短信验证码进行重置**。」+「完成」→ 回 B1（该行值变「已设置」）。

- 设置密码**不产生新登录**，因此**不发**「新设备登录」通知。
- 设置成功后**不发**账号安全通知（**2026-09-22 已拍板**）：设置密码没有产生新登录，通知会变成噪音。

### 7.4 修改登录密码 `#B4` `#B5`（P0）

| 元素 | 内容 | 规则 |
|---|---|---|
| 输入 | 当前密码 + 新密码 + 确认新密码。**默认隐藏**（掩码），右侧**眼睛图标**可切明文 | **必须先验当前密码** —— 手机在别人手里且未锁屏时，这是唯一挡得住的一道 |
| 当前密码错误 | iOS 弹窗「当前密码不正确」 | **不计入** A4 / A5 的登录错误计数（那套只针对登录） |
| 新密码规则 | 与 B2 **逐字一致** | 同一规则在两处写法不同是最容易被当 bug 上报的问题 |
| 后果说明 | 修改后**所有会话（含本机）全部退出**，需要用新密码重新登录 | **比换绑更严**：改密码是敏感操作，全清最安全；与 C4 重置密码的口径一致 |
| 按钮 | 完成 | |
| 底部 | 红色「关闭登录密码」→ B6 | 密码可选项必须可关 |

**B5 成功弹窗**：紫圆 ✓ +「登录密码已更改」+「为保护账号安全，**其它设备上的登录已全部退出**。请用新密码重新登录。」+「**去登录**」→ A3（密码登录页）。

- 本机也被登出，所以**唯一出口是把用户送回登录页**，而不是回「隐私和安全」。

### 7.5 关闭登录密码 `#B6`（P1）

| 项 | 规则 |
|---|---|
| 入口 | 修改密码页（B4）底部的红色「关闭登录密码」 |
| 形式 | iOS **两按钮确认弹窗**：取消 ｜ 关闭 |
| 文案 | 关闭后将只能用验证码登录，确定要关闭登录密码吗？ |
| 前置校验 | **必须同时校验当前密码**（用 B4 已输入的那一次），否则拿到手机的人可以一键把密码关掉 |
| 关闭后 | 服务端清掉密码 → 回 B1（行值变「未设置」）→ 结果弹窗「登录密码已关闭」 |
| 通知 | **不发**「新设备登录」通知（没有产生新登录）；**不发**短信通知（**2026-09-22 已拍板**） |
| 影响 | 其它设备上的登录**不受影响**（关密码不等于登出） |

### 7.6 忘记密码 `#C1` `#C2` `#C3` `#C4` `#C5`（P0）

**入口**：密码登录页的「忘记密码？」（A3）。**唯一入口** —— 登不进来的人进不去设置页。

```
A3 忘记密码？ → C1 发送验证码（号码只读）
   → C2 输入验证码短信（5 位 / 5 分钟）
       → 校验通过 → 签发一次性重置票据（10 分钟）
           → C3 设置新密码（双输入）
               → C4 重置成功（其它设备登录全部失效）→ 去登录（回 A3）
       → 收不到短信 → C5 自助排查 → 重新发送（回 C2）
```

| 屏 | 关键规则 |
|---|---|
| C1 | 号码**只展示、不可改**（从 A3 带过来，**中间四位脱敏**）—— 不做成输入框；点「发送验证码」走**短信**（这条流程不依赖活跃设备）。**本页不放「没收到验证码？」** —— 那时还没发码，那颗链接属于 C2 |
| C2 | 与换绑、登录**同一套验证码页**（气泡 + 号码 + 5 方框 + 浮动键盘 + 30s 重发），号码同样**中间四位脱敏**；多一行「← 没收到验证码？」 |
| C3 | 新密码 + 确认新密码，规则与 B2 **逐字一致**；**不允许返回改手机号**（票据与号码绑定，返回即作废） |
| C4 | 紫圆 ✓ +「登录密码已重置」+「请用新密码登录。为保护账号安全，**其它设备上的登录已全部失效**。」+「去登录」→ A3 |
| C5 | **两条**自查（信号与短信拦截 / 号码是否填对）—— 原「等 60 秒后重发」已删（用户会主动重发，不必教）；按钮「**知道了**」回到 C2。号码停用 / 丢失怎么办**不作为用户文案** —— 页面上只留一条**标注**（给开发 / UI 看），文字放在演示页右侧说明栏 |

**规则**

- **只走短信**：忘记密码的用户可能没有任何活跃设备，因此这条流程**不能**把验证码发到官方账号会话（与登录、换绑的通道规则不同，这是有意为之）。
- **不泄露号码是否注册**：该号码不存在时，同样提示「验证码已发送」。
- **重置票据**：10 分钟有效、一次有效；过期或复用 → 「本次操作已超时，请重新验证手机号」。
- **重置后注销该账号其它所有设备**（**2026-09-22 已拍板**）：重置密码通常意味着用户怀疑账号出了问题，保留其它会话等于把风险留着。（换绑手机号采用「不强制下线」，因为那是正常使用中的用户 —— 两处口径不同是有意的。）
- **被下线的设备不推送**，下次打开 App 时提示「登录已失效，请重新登录」。
- **不做**冷却规则（如"重置后 N 小时内不能再改"）：没有客服，误伤没法救。

### 7.7 系统通知与安全兜底 `#D1`（P0）

**承载方式沿用「设备管理」6.9.1，不重新定义**：官方账号「U8 Chat」，带认证标识、像用户一样出现在会话列表、可聊天，状态显示「客服」。

| # | 消息 | 触发 | 发给谁 |
|---|---|---|---|
| ① | 新用户首次登录（欢迎 + 立规矩） | 新注册用户登录**第一台设备** | 该设备自己 |
| ② | 登录验证码 | 新设备用「手机号 + 验证码」登录时 | **已登录的活跃设备**（无活跃设备时走短信） |
| ③ | 新设备登录 | 账号产生**一次新的登录（会话）** —— 含**密码登录**、扫码登录；同一台设备退出后重新登录也算 | **所有其它在线端** |

**本次新增带来的变化**

- 密码登录**不发验证码**：不产生 ②；登录成功时产生 ③。
- 「③ 新设备登录」的文案里，兜底出口**只有**「**我的 → 设备**」终止会话（**不含**「修改登录密码」，也不含「联系客服」—— 2026-09-23 拍板）。
- 三处验证码场景（登录 / 换绑 / 忘记密码）的短信文案统一，且**都不出现「联系客服」**。

| 场景 | 验证码通道 |
|---|---|
| 登录（新用户第一台设备 / 账号下无活跃设备） | 短信 |
| 登录（账号下有活跃设备） | 官方账号 U8 Chat 会话（留「改用短信」兜底） |
| 换绑手机号（验旧号 / 验新号） | 短信 |
| **忘记密码** | **短信**（本期没有"改用官方账号会话"的分支，因为用户可能没有任何活跃设备） |

---

## 八、规则与边界

### 8.1 密码规则

| 项 | 规则 | 说明 |
|---|---|---|
| 长度 | **6–18 位** | |
| 字符 | **至少包含字母和数字**，允许符号 | **不要求**大小写混合 + 特殊字符：这类规则会挡住普通人，本期靠锁定与登录通知承担安全 |
| 禁止 | 不能与手机号相同 | 客户端与服务端都校 |
| 保存 | 只存哈希（服务端）；客户端不落盘 | 明文只在设置/登录的请求体里出现 |
| 显示 | 默认掩码，可切明文 | |
| 强度条 | **不做** | 对「8 位以上 + 字母数字」这条规则没有增量信息 |
| 密码提示 hint | **不做** | 见 2.2 |

### 8.2 密码错误与锁定

| 项 | 规则 |
|---|---|
| 计数维度 | **按手机号累计**（不是按设备）。换设备不清零，否则等于没锁 |
| 连续错误 | **连续 5 次** → 锁定 **15 分钟** |
| 再次触发 | 解锁后再连续错 5 次 → 锁定 **24 小时** |
| 锁定期内 | 即使密码正确也**不放行**；但**验证码登录始终可用** |
| 记录清零 | 一次**成功登录**后计数清零 |
| 提示 | 弹窗必须同时给**时长**与**出路**（「你也可以用验证码登录」） |
| 申诉 | 本期**不做**（没有客服），到期自动解锁 |
| 通知 | 锁定/解锁都**不发**通知 |

> 与换绑的差异：换绑是「错误 5 次/小时 → 锁 24 小时」。密码登录是**高频入口**，误伤成本更高，所以起跳更短（15 分钟）；24 小时档留给"反复触发"。

### 8.3 验证码参数（全站统一，与「修改手机号」一致）

| 项 | 值 |
|---|---|
| 位数 | **5 位数字**（方框 5 个） |
| 有效期 | **5 分钟** |
| 重发冷却 | **30 秒**（界面显示「30s后再试」，归零后变「重新发送验证码」） |
| 错误上限 | 5 次 / 小时 |
| 超限后果 | 锁定 **24 小时**，到期自动解锁；本期不做申诉 |
| 提交方式 | 输满 5 位**自动提交**（无确认按钮） |

> **2026-09-22 已拍板：验证码位数全站统一 5 位**（登录 / 换绑 / 忘记密码共用同一套验证码服务，见 **决策 20**）。任何一处要改位数，三处必须同时改。

### 8.4 状态对照表（一屏看全）

| 场景 | 判定 | 用户看到 | 屏 | 是否计数 | 是否通知 |
|---|---|---|---|---|---|
| 密码正确 | 校验通过 | 直接进会话列表 | — | 清零 | 给其它端发「新设备登录」 |
| 密码错误（未超限） | 校验失败 | iOS 弹窗 + 剩余次数 | A4 | +1 | 否 |
| 密码错误（超限） | 达阈值 | iOS 弹窗 + 锁定时长 | A5 | 开始锁定 | 否 |
| 锁定期内尝试 | 服务端拒 | 同 A5 | A5 | 不累计 | 否 |
| 该号未设置密码 | 账号无密码 | iOS 弹窗 + 回验证码登录 | A6 | 不计数 | 否 |
| 手机号不存在 | 账号不存在 | **同 A6 文案** | A6 | 不计数 | 否 |
| 手机号位数不对 | 客户端校验 | iOS 弹窗 | — | 不计数 | 否 |
| 设置密码成功 | 校验通过 | 结果弹窗 | B3 | — | 否（已拍板不发） |
| 修改密码成功 | 校验通过 | 结果弹窗 | B5 | — | **所有会话（含本机）退出** → 回登录页 |
| 关闭密码成功 | 校验通过 | 结果弹窗 | — | — | 否（已拍板不发） |
| 重置密码成功 | 校验通过 | 结果弹窗 | C4 | — | **其它端登录失效** |
| 重置票据过期 | 超 10 分钟 | 弹窗「本次操作已超时」 | — | — | 否 |

### 8.5 多端并发与中断

同一账号**允许**在多端同时保持登录（**2026-09-22 已拍板**，沿用现状）；密码变更**不强制**登出其它端（见 7.4）。

| 场景 | 处理 |
|---|---|
| 两台设备同时改密码 | 先提交者生效；后提交者按"当前密码不正确"处理（它的当前密码已失效）。**不引入**"改密码进行中"的锁 |
| 重置密码进行中，另一台设备改密码 | 重置流程以**重置票据**为准；重置成功后，另一台设备的登录会失效（8.6 / C4） |
| 设置密码时 App 被杀 | 无副作用（设置是单次提交）；重进 B1 看到「未设置」 |
| 重置流程中途返回 | 票据作废，需从 C1 重新开始 |
| 密码登录过程中网络中断 | Toast「网络解析失败，请切换网络后重试」（沿用客户端现有文案）；**不计入**错误次数 |

### 8.6 与扫码登录、设备管理的关系

| 关系 | 规则 |
|---|---|
| 扫码登录 | **不变**。扫码登录不经过登录页，也不需要密码；它产生「新设备登录」通知 |
| 设备管理 | **不变**。密码登录成功后，新设备会出现在设备列表里；发现异常可在设备管理里注销 |
| 换绑手机号 | **不要求**输入登录密码（换绑靠"验旧号验证码"，见修改手机号交付物）。换绑成功后，**密码保留不变**，登录手机号也跟着变。**2026-09-22 已拍板**：**不**在换绑成功页加「登录密码不变」的提示（换绑交付物本次不改） |
| 注销登录 | 与密码无关；退出登录后再次登录仍需凭证（验证码或密码） |
| 资金密码 | **两套东西**，互不影响 |

### 8.7 号码与账号边界

| 场景 | 规则 |
|---|---|
| 手机号被换绑后旧号 | 旧号 + 旧密码**不能**登录（账号已跟随新号）；旧号能否重新注册为新账号 → 见「修改手机号」待确认项（建议冷却 30 天） |
| 同一手机号在不同端 | 一套密码，全局生效；密码变更后立即生效（下一次登录用新密码） |
| 密码设置前的历史设备 | **不受影响**，不会被强制登出 |

---

## 九、跨端行为

| 端 | 本期 |
|---|---|
| **iOS / Android** | **做**。同一套规则、同一套文案、同一套锁定策略（服务端统一判定） |
| **Web / Desktop** | **本期不做密码登录** |

**Web / Desktop 为什么不做**

1. Web / Desktop 的登录**已经被扫码登录覆盖**（设备管理 6.8：电脑端出二维码 → 手机端确认授权），用户不会因为"Web 上没有密码登录"而登不进来；
2. Web 上的密码输入与「扫码 + 手机端确认」是两套安全模型，混在一起会出现「电脑上输密码就直接进，不需要手机确认」的绕过路径 —— 这会削弱设备管理刚建立的那道确认；
3. Web 端的登录页是另一套实现（不在本次的原型与设计范围内），不做更干净。

**跨端一致性要求（给研发）**：验证码参数、密码错误计数与锁定、错误码语义**必须由服务端统一**，各端只负责展示。任何一端自行放宽校验，都会让另外两端的锁定失效。

---

## 十、文案（可直接落地）

**A · 登录与注册**

| 屏 | 位置 | 文案 |
|---|---|---|
| A1 | 说明 | 输入手机号，我们会发送一条含验证码的短信。**还没有账号的手机号将自动注册。** |
| A1 | 标题 / 副标题 / 条款行 / **新增链接** | 手机号登录 / 未注册的用户，验证后将自动注册账号并登录 / ○ 登录即代表同意用户协议和隐私政策 / **密码登录**（本次新增） |
| A3 | 标题 / 副标题 | 手机号登录 / 输入手机号与密码（建议文案） |
| A3 | 密码行 / 按钮 / **两排链接** | 眼睛图标 / 登录 / 上排「忘记密码？」· 下排「验证码登录」 |
| A4 | 弹窗 | 密码错误，请重新输入（还可以尝试 4 次） ／「好」 |
| A5 | 弹窗 | 密码错误次数过多，请 15 分钟后再试。你也可以用验证码登录。 ／「好」 |
| A6 | 弹窗 | 这个账号还没有设置登录密码，请用验证码登录。 ／「好」 |

**B · 设置与修改密码**

| 屏 | 位置 | 文案 |
|---|---|---|
| B1 | 行 | 登录密码 → **未设置** / **已设置** |
| B1 | 卡片说明 | 登录密码用于**收不到验证码时**登录账号，也可以在常用设备上快速登录。设置后**验证码登录依然可用**。 |
| B2 | 标题 / 说明 | 设置登录密码 / 设置后，你可以用「手机号 + 密码」登录 U8 Chat。密码只保存在服务器，我们不会以任何方式向你索要。 |
| B2 | 输入 / 规则 / 按钮 | 密码 + 确认密码（**默认隐藏**，右侧**眼睛图标**切明文） / 6–18 位，**至少包含字母和数字**；不能与手机号相同。 / 完成 |
| B2 | 弹窗（规则不符） | 密码需为 6–18 位，且至少包含字母和数字 ／「好」 |
| B2 | 弹窗（两次不一致） | 两次输入的密码不一致，请重新输入 ／「好」 |
| B3 | 弹窗 | 登录密码已设置 / 现在可以用手机号 + 密码登录 U8 Chat。忘记密码时可以**通过短信验证码进行重置**。 / 完成 |
| B4 | 标题 / 说明 | 修改登录密码 / 先输入当前密码，再设置新密码。 |
| B4 | 后果 | 修改后**其它设备上的登录会全部退出**，**你自己也要用新密码重新登录**。 |
| B4 | 弹窗（当前密码错） | 当前密码不正确，请重新输入 ／「好」 |
| B4 | 底部 | **关闭登录密码**（红色） |
| B5 | 弹窗 | 登录密码已更改 / 为保护账号安全，**其它设备上的登录已全部退出**。请用新密码重新登录。 / **去登录** |
| B6 | 弹窗 | 关闭后将只能用验证码登录，确定要关闭登录密码吗？ / 取消 ｜ **关闭** |
| B6 | 结果弹窗 | 登录密码已关闭 ／ 完成 |

**C · 忘记密码**

| 屏 | 位置 | 文案 |
|---|---|---|
| C1 | 标题 / 说明 | 忘记密码 / 我们将发送验证码到你的登录手机号。（**已精简**，原来两句） |
| C1 | 号码（**居中展示**）/ 按钮 | +86 183 **** 8215 / 发送验证码 |
| C2 | 标题 | 输入验证码短信 |
| C3 | 标题 / 说明 / 输入 | 设置新密码 / 验证通过。请设置新的登录密码，之后用新密码登录 U8 Chat。 / 新密码 + 确认新密码（**默认隐藏**） |
| C4 | 弹窗 | 登录密码已重置 / 请用新密码登录。为保护账号安全，**其它设备上的登录已全部失效**。 / 去登录 |
| C5 | 标题 / 说明 | 没收到验证码？ / 按顺序检查这两点，多数情况是短信被拦截了。 |
| C5 | **两条**自查 | 1 看手机有没有信号，并检查**短信拦截、垃圾短信箱**；2 核对你填的号码是不是 **+86 183 **** 8215**（登录手机号本身，中间四位脱敏）。 |
| C5 | **标注**（不面向用户） | 如果这个手机号已经**停用或丢失**，收不到短信就没办法重置密码。**账号找回**（申诉 + 人工核验）正在开发中，请留意后续版本更新。 |
| C5 | 按钮 | **知道了**（回 C2 验证码页，不触发重发） |

**通用（沿用客户端现有文案，不新造）**

| 场景 | 文案 |
|---|---|
| 网络异常 | 网络解析失败，请切换网络后重试（Toast） |
| 服务端错误 | 服务器内部错误（Toast） |
| 重置票据过期 | 本次操作已超时，请重新验证手机号 ／「好」 |
| 多端并发重置 | 这个账号正在另一台设备上重置密码，请稍后再试 ／「好」 |
| 风控限制 | 账号暂时被限制，请稍后重试（**文案里不出现「联系客服」**） |

---

## 十一、接口与埋点

### 11.1 接口

| # | 接口 | 入参 | 出参与关键错误 |
|---|---|---|---|
| 1 | 发送验证码 | `phone` + `scene`（`login` / `rebind_old` / `rebind_new` / **`reset_pwd`**） | 成功即返回；`EXCEED_LIMIT`（超频）、`LOCKED`（锁定中） |
| 2 | 验证码登录 / 注册 | `phone` + `code` | 成功返回 `token` + `is_new_user`（**客户端不展示**，仅用于埋点与决定是否发欢迎消息） |
| 3 | **密码登录** | `phone` + `password` | 成功返回 `token`；错误：`PASSWORD_WRONG`（带 `remain_try`）、`PASSWORD_LOCKED`（带 `unlock_at`）、`NO_PASSWORD_SET`、`PHONE_NOT_FOUND`（**客户端与 `NO_PASSWORD_SET` 同表现**） |
| 4 | 设置密码 | 登录态 + `new_password` + `confirm` | 成功；错误：`PASSWORD_WEAK` / `SAME_AS_PHONE` |
| 5 | 修改密码 | 登录态 + `current_password` + `new_password` | 成功；错误：`PASSWORD_WRONG`（**不计入登录锁定**） |
| 6 | 关闭密码 | 登录态 + `current_password` | 成功 |
| 7 | 重置-发码 | `phone` | 与 #1 的 `reset_pwd` 同源；**无论号码是否注册都返回成功** |
| 8 | 重置-校验 | `phone` + `code` | 成功返回 **`reset_token`（10 分钟、一次有效）**；错误：`CODE_WRONG` / `CODE_EXPIRED` |
| 9 | 重置-提交 | `reset_token` + `new_password` + `request_id` | **幂等**（`request_id` 去重，防重复提交）；成功后**注销该账号其它所有会话** |

**两条硬约束（给研发）**

- 重置-提交接口的**号码必须从 `reset_token` 取**，客户端不得传号码（否则可越权改任意账号的密码）；
- 「设置密码 / 修改密码 / 关闭密码」接口必须校验**当前密码或登录态 + 二次校验**，不得只认登录态（否则拿到已解锁手机即可改密码）。

### 11.2 埋点

| 事件 | 触发 | 关键字段 |
|---|---|---|
| `login_page_view` | 打开登录页 | `default_tab=code` |
| `login_switch_password` | 点「密码登录」 | |
| `login_switch_code` | 点「用验证码登录」 | |
| `password_login_submit` | 点「登录」 | `result`（`success` / `wrong` / `locked` / `no_password` / `phone_invalid`） |
| `password_setting_click` | B1 点「登录密码」行 | `current_state`（`unset` / `set`） |
| `password_set_success` | 设置成功 | |
| `password_change_success` | 修改成功 | |
| `password_disable_confirm` | 确认关闭 | |
| `forgot_password_start` | 点「忘记密码？」 | |
| `forgot_password_reset_success` | 重置成功 | `duration_ms` |
| `no_code_help_view` | 打开 C5 | |
| `password_rule_rejected` | 规则校验失败 | `reason`（`weak` / `mismatch` / `same_as_phone`） |

---

## 十二、验收标准

1. 未登录打开 App 落在登录页，**默认仍是验证码登录**；底部有「密码登录」入口。
2. **新用户手机号首次登录即注册**：号码不存在时，验证码验证通过后直接登录成功，页面上**不出现「注册」字样**，且该设备收到官方账号的「新用户首次登录」消息。
3. 已设置过密码的账号：手机号 + 正确密码 → **直接登录成功**；其它在线端收到「新设备登录」通知。
4. 密码错误时给 iOS 弹窗，文案含**剩余次数**；点「好」后**手机号保留、密码清空**。
5. **连续错 5 次锁定 15 分钟**；锁定期内即使密码正确也不放行；**验证码登录始终可用**。
6. 从未设置过密码的账号走密码登录 → 弹窗「这个账号还没有设置登录密码，请用验证码登录」，点「好」回登录页并**带入手机号**。
7. **手机号不存在的提示与 #6 完全一致**（不泄露号码是否注册）。
8. 「我的 → 隐私和安全 → 登录密码」行的值随之正确变化：**未设置 / 已设置**。
9. 设置密码：双输入一致且符合规则才能成功；成功后弹窗明确「忘记密码时可以**通过短信验证码进行重置**」，返回后行值变「已设置」。
10. 修改密码：**必须输对当前密码**；当前密码错误走独立文案，**不计入**登录错误次数。改成功后**所有会话（含本机）退出**，弹窗「去登录」把用户送回登录页；另：设置 / 修改 / 重置**三处的密码输入框默认隐藏**（掩码），右侧**眼睛图标**可切明文。
11. 关闭密码：必须校验当前密码；确认弹窗为「取消 ｜ 关闭」两按钮；关闭后行值回到「未设置」，且**其它设备不被登出**。
12. 忘记密码：号码**只读**；走**短信**验证码（即使该账号有活跃设备）；校验通过后才能设置新密码。
13. 重置成功：**该账号其它所有设备上的登录失效**；被下线的设备下次打开提示「登录已失效，请重新登录」。
14. 重置票据：10 分钟有效、一次有效；过期或复用给「本次操作已超时，请重新验证手机号」。
15. 「没收到验证码？」页存在，三条自查 + 停用/丢失的说明齐全，**全站文案不出现「联系客服」**。
16. 密码相关的所有弹窗、按钮在浅色背景下**白字可读**（对比度 ≥ 3.4）。
17. 演示页 `index.html` 的 18 屏全部可点、无死链；筛选「核心路径 / 规则与状态」计数正确。

---

## 十三、决策与待确认

### 13.1 已决策（产品已拍板，开发可直接依此执行）

| 编号 | 决策 |
|---|---|
| 决策 1 | 密码**后设置、不强制**、不做首次登录弹窗引导；入口在「我的 → 隐私和安全 → 登录密码」 |
| 决策 2 | **保留**「新用户手机首次登录即注册」，登录页**不出现**「注册」按钮 |
| 决策 3 | 密码登录与验证码登录是**两条平行的登录方式（二选一）**，**不叠加** |
| 决策 4 | **本期不做两步验证（2FA）**，理由与未来触发条件见第三章 |
| 决策 5 | 在**新设备**上用密码登录**直接放行**，不要求第二因素；风险由「新设备登录通知 + 设备管理远程注销」承担 |
| 决策 6 | 忘记密码**只走短信验证码**（不依赖活跃设备） |
| 决策 7 | 验证码参数与「修改手机号」统一：5 位 / 5 分钟 / 30s 重发 / 错误 5 次锁 24 小时 |
| 决策 8 | 系统通知沿用官方账号「U8 Chat」；密码登录也发「新设备登录」通知 |
| 决策 9 | 本期**没有客服**：全站文案不出现「联系客服」，自助路径由 C5 承担 |
| 决策 10 | 版式与零件**复用「修改手机号」已定稿口径**（iOS 系统弹窗、二级页圆形返回、验证码页版式） |
| 决策 11 | **重置登录密码后，注销该账号其它所有设备**（2026-09-22 拍板）。被下线的设备**不推送**，下次打开提示「登录已失效，请重新登录」 |
| 决策 12 | 登录密码规则＝**6–18 位**，且**至少包含字母和数字**；不能与手机号相同（**不要求**大小写混合与特殊字符）（2026-09-22 拍板） |
| 决策 13 | 密码错误阈值＝连续 **5 次**错 → 锁 **15 分钟**；解锁后再连续 5 次 → 锁 **24 小时**；锁定期内**验证码登录不受影响**（2026-09-22 拍板） |
| 决策 14 | 换绑手机号成功后**不**加「登录密码不变」的提示（2026-09-22 拍板，换绑交付物不改） |
| 决策 15 | 修改 / 关闭登录密码时**必须**校验当前密码；**关闭密码不发通知**（2026-09-22 拍板，按建议） |
| 决策 16 | 设置登录密码成功后**不发**账号安全通知（2026-09-22 拍板，按建议） |
| 决策 17 | 重置密码时**不校验**新密码是否与旧密码相同（**允许相同**）（2026-09-22 拍板，按建议） |
| 决策 18 | 密码登录页**不做**「记住密码 / 记住我」；登录态默认记住，退出走「我的 → 退出登录」（2026-09-22 拍板，按建议） |
| 决策 19 | **允许**同一账号在多端同时保持登录（沿用现状）；密码变更不强制登出其它端（2026-09-22 拍板） |
| 决策 20 | **验证码位数全站统一 5 位**（登录 / 换绑 / 忘记密码）。「修改手机号」PRD 里「验证码位数与登录统一」这一待确认项据此闭环（2026-09-22 拍板） |
| 决策 21 | **登录页 1:1 照 Figma 画板「登录」`1092:66063`**，只在同意条款行下方新增一行「密码登录」入口；画板上既有元素与文案一处不动（2026-09-23 拍板） |
| 决策 22 | **「我的-隐私和安全」1:1 照 Figma 画板 `802:128996`**，只在「锁定码&Face ID」与「资金密码」之间新增「登录密码」行；其余行原样（2026-09-23 拍板） |
| 决策 25 | **本功能只做「密码登录 + 忘记密码」**：密码登录前提＝手机号已注册登录 **且用户自己设置过密码**，**没有默认密码**，没设过一律走 A6；**已开发完成的页面**（登录验证码页、手机号位数校验）不再画；**与本次无关的元素**（网络诊断、国家编码能否点…）不做标注也不解释（2026-09-23 拍板） |
| 决策 27 | **修改登录密码成功后，注销该账号所有会话（含本机）** —— 用户需用新密码重新登录；成功弹窗的按钮是「去登录」→ A3（2026-09-23 拍板，口径与 C4 重置密码一致） |
| 决策 28 | 设置 / 修改 / 重置密码的输入框**默认隐藏**（掩码），右侧**眼睛图标**可切明文（2026-09-23 拍板） |
| 决策 30 | **设计图＝目标状态，但不全**（部分功能由以前的 UI 同事做过、图纸不在其中）—— 「设计图里没有」**不等于**「没做过 / 不存在」；**哪些页面已开发完成一律由产品确认**（2026-09-23 拍板） |
| 决策 29 | 登录页的「**国家/地区可以切换**」，但那是**已经开发好的功能** —— 本次演示**不画、不标注**（2026-09-23 产品确认） |
| 决策 26 | 演示页说明栏**只写本次新增的内容**：不解释既有功能、不解释与本次无关的元素（2026-09-23 拍板） |
| 决策 24 | **登录验证码页已开发完成**，本次演示与 UI 都**不再画**它；「新用户手机首次登录即注册」的逻辑不变，写在登录页副标题里（2026-09-23 拍板） |
| 决策 23 | **本演示与 PRD 是「UI 设计之前的输入」**：以「有哪些流程、哪些页面、从哪儿进」为准；已有画板 1:1 照做，未画的页面给建议稿；**最终视觉以 UI 为准，按钮摆放等版式细节不作为评审与验收项**（2026-09-23 拍板） |

### 13.2 待确认（不阻塞开发）

> **（2026-09-23 补充）** 登录页的「国家/地区」**可以切换**（产品已确认，是已开发好的功能）—— 本次不画；早期本 PRD 曾擅自写成「固定 +86、不可点」，已撤。
> **版式类问题不再列在这里** —— 入口摆哪儿、按钮放哪，本演示给建议、**最终以 UI 设计为准**（见决策 23）。下表只剩**流程与内容**类的 2 条。

| # | 问题 | 建议 |
|---|---|---|
| ① | 客服 / 账号申诉上线后，C5 是否补「账号找回」入口？ | 建议**补**，并把 C5 作为下一期账号找回的接入点 |
| ② | 设计稿未画的页面（A3、B2–B6、C1–C5）的**文案**由本演示建议（例：A3 副标题「输入手机号与密码」）；**版式**由 UI 定、不需要回填 | 建议文案照本演示执行；要改文案直接提，改动很小 |

---

## 十四、与其它交付物的关系 / 相对现状改了什么

### 14.1 与其它交付物的边界

| 交付物 | 本次是否改动 | 说明 |
|---|---|---|
| `设备管理` | **不改** | 验证码通道规则、新设备登录通知、官方账号「U8 Chat」全部**沿用**；密码登录已在其口径里（"含扫码、密码登录"） |
| `修改手机号` | **不改** | 验证码页版式与参数、iOS 弹窗、圆形返回被本次**复用**；换绑流程本身不动 |
| `文件夹` / `表情回复` | **不改** | 与登录无关 |
| 底部 Tab 口径 | **不改** | 本次的「隐私和安全」是二级页，不涉及 Tab |

### 14.2 相对现状改了什么

1. **登录页**多一个入口：「密码登录」（默认仍是验证码登录）。
2. **新增密码登录页**及其三种结果（密码错 / 锁定 / 未设过密码）。
3. **「我的 → 隐私和安全」**多一行「登录密码」（未设置 / 已设置），含设置、修改、关闭三条路径。
4. **新增忘记密码流程**（短信验证码 → 设置新密码 → 重置后其它设备失效）。
5. **新增自助排查页**「没收到验证码？」（因为本期没有客服）。
6. **安全兜底补一句**：新设备登录通知 / 换绑后的安全提示里，出口从"改密码"变为可落地的「我的 → 隐私和安全 → 登录密码」。
7. **明确不做**：两步验证（2FA）、邮箱找回、密码提示、账号申诉（第三章 + 2.2）。

### 14.3 相对设计稿改了什么

| 画板 | 本 PRD 的改动 |
|---|---|
| 登录 `1092:66063` | **只新增一处**：同意条款行下方一行居中的紫色「密码登录」入口。其余（标题「手机号登录」、副标题、国家行、号码行、灰色「继续」、同意条款行、右上角「网络诊断」）**逐字照画板** |
| 我的-隐私和安全 `802:128996` | **只新增一处**：在「锁定码&Face ID」与「资金密码」之间插入「登录密码」行（绿色钥匙图标，值「未设置」）。其余 6 行 + 「注销账号」**照画板** |
| 设计稿未画 | A3 密码登录页、B2–B6 设置 / 修改 / 关闭密码、C1–C5 忘记密码、A4–A6 错误弹窗 —— 版式沿用登录页与换绑的零件，**文案由本演示建议**（供 UI 参考）。按决策 23，这些页面**只要「流程 + 入口 + 规则」对了就达到目的**，视觉以 UI 为准 |

### 14.4 设计图里有哪些相关画板（2026-09-23）

产品给的 UI 设计稿是 Figma 文件 **「U8 Chat」`umRiEY84pJQmfomeNkbjOf`** · PAGE「iOS端」`1:218` —— 与「修改手机号」用的「U8 Chat 2.0」`6dsI4eKdAoZr4RP0uILIBq` **不是同一个文件**。逐屏核对结果：

| 我们建议的屏 | **这份设计图里**有没有 | 位置 / 说明（⚠️ 图纸不全，「没有」**不代表没做过**） |
|---|---|---|
| A1 登录页 | ✅ **已有** | `iOS 2.0` 画布里的「登录」`8673:84289` —— 与本 PRD 用的底图**是同一张**（截图位图 + 右上角「网络诊断」） |
| ~~A2 登录验证码页~~ | ✅ **已开发完成** | 产品 2026-09-23 明确：这一页已经开发完了，**本演示与 UI 都不再画**。UI 稿里另有 `iOS` 旧画布的两屏「登录-输入验证码」`4884:65979` / `4947:66162`（旧版：紫色「‹ 返回」文字 + 右下「重新获取 / 23s 后再试」+「← 修改手机号」），仅供参考 |
| B1 我的-隐私和安全 | ✅ **已有** | `iOS 2.0` 里的「我的-隐私和安全」`6659:102208`（与 14.3 用的 `802:128996` 是同一设计） |
| **A3 密码登录页** | ❌ **还没有** | 全文件搜不到任何「密码登录 / 用密码登录」画板 |
| **B2–B6 设置 / 修改 / 关闭登录密码** | ❌ **还没有** | 只有**资金密码**的同名画板（首次设置 / 重置 / 修改资金密码，共 9 屏），而那是 **6 位圆点 + 数字键盘**的形态，与「6–18 位含字母」的文本密码不同 |
| **C1–C5 忘记密码** | ❌ **还没有** | 无任何「忘记密码 / 重置登录密码」画板 |
| **A4–A6 错误弹窗** | ❌ **还没有** | — |

**结论**：**这份设计图里没有「登录密码」相关的任何画板**。但如信息表所说，**设计图不全**（老 UI 同事做的功能不在里面），所以**不能据此断定"UI 没做过这套流程"** —— 已开发完成的部分**由产品确认**（例：登录验证码页就是产品确认已开发完、本次不画的）。本演示与 PRD 的价值是：给 UI 一份「要画哪些页面、从哪儿进、每页什么规则」的清单。已有设计的两个页面我们按它 1:1 还原并在其上各加一处入口；其余 18 屏是**建议稿**，UI 出图后以 UI 为准（决策 23）。

**顺带核到的其它画布内容**（不在本次范围，仅供参考）：`我的-更改手机号` 11 屏（＝「修改手机号」交付物）、`资金密码` 系列 9 屏、`web端扫码登录后-移动端接收到「登录确认」`、`被注销设备端-退出登录`、以及首页 / 资产 / 群聊等大量既有画板。

---

## 十五、附录：演示页索引（`index.html`，18 屏）

| 屏 | 名称 | 分组 | 优先级 | 对应本文 |
|---|---|---|---|---|
| A1 | 登录页 · 验证码登录（默认） | A · 登录与注册 | P0 | 7.1 |
| A3 | 登录页 · 用密码登录 | A · 登录与注册 | P0 | 7.2 |
| A4 | 密码错误（弹窗） | A · 登录与注册 | P1 | 7.2 |
| A5 | 错误次数过多 · 暂时锁定（弹窗） | A · 登录与注册 | P1 | 8.2 |
| A6 | 该账号还没有设置登录密码（弹窗） | A · 登录与注册 | P1 | 7.2 |
| B1 | 我的 → 隐私和安全（登录密码入口） | B · 设置与修改密码 | P0 | 7.3 |
| B2 | 设置登录密码 | B · 设置与修改密码 | P0 | 7.3 |
| B3 | 设置成功（弹窗） | B · 设置与修改密码 | P0 | 7.3 |
| B4 | 修改登录密码 | B · 设置与修改密码 | P0 | 7.4 |
| B5 | 修改成功（弹窗） | B · 设置与修改密码 | P0 | 7.4 |
| B6 | 关闭登录密码（确认弹窗） | B · 设置与修改密码 | P1 | 7.5 |
| C1 | 忘记密码 · 发送验证码 | C · 忘记密码 | P0 | 7.6 |
| C2 | 输入验证码短信（重置密码） | C · 忘记密码 | P0 | 7.6 |
| C3 | 设置新密码 | C · 忘记密码 | P0 | 7.6 |
| C4 | 重置成功（弹窗） | C · 忘记密码 | P0 | 7.6 |
| C5 | 没收到验证码？（自助排查） | C · 忘记密码 | P1 | 7.6 |
| D1 | 官方账号 U8 Chat（三条消息） | D · 通知与总览 | P0 | 7.7 |
| D2 | 登录方式总览（三条路 + 兜底） | D · 通知与总览 | P0 | 第三章 / 第六章 |

**主流程演示顺序**：A1（点「继续」后是**已开发完成**的验证码页，不进演示）· A1 → A3 → A4 / A5 / A6（密码登录的三种结果）· A3 → C1 → C2 → C3 → C4（忘记密码）· B1 → B2 → B3 / B4 → B5 / B6（设置与修改）。

