# 登录管理 UI 设计文档(PRD v2.0 对齐) > **版本**:v2.0 · **日期**:2026-04-30 > **PRD 来源**:`PRD/登录管理/用户登录管理模块PRD.md`(v2.0) > **数据模型来源**:`DATA_MODEL/DATA_MODEL_LOGIN.md` > **技术约束来源**:`TECH_STACK/登录管理技术方案.md`、`AGENTS.md` --- ## 1. 模块目标与覆盖范围 本次 UI 调整目标:将登录管理相关设计与 PRD v2.0 全面对齐,重点修正以下差异: 1. 登录页从“单一账号密码登录”升级为**双登录方式 Tab**: - 手机号 + 密码登录(默认) - 手机号 + 短信验证码登录 2. 删除“忘记用户名”入口(该流程已废弃) 3. 补齐“重置密码/设置新密码”页面(公共组件,支持两种入口文案) 4. 保留“微信扫码登录(即将开放)”禁用态入口 --- ## 2. 页面清单(P0) | 页面 | 文件 | URL 建议 | 对应 Story/US | 状态 | |---|---|---|---|---| | Tenant 识别页 | `UI_DESIGN/登录_UI.html` | `/account/tenant/verify/` | Story 1 / US-ACCOUNT-002 | ✅ | | 登录页(双 Tab) | `UI_DESIGN/登录_账号密码_UI.html` | `/account/login/` | Story 2、Story 5、Story 6(禁用态) | ✅ | | 设置新密码页(公共组件) | `UI_DESIGN/登录_重置密码_UI.html` | `/account/password/reset/` | Story 3 步骤三 + §5.3.4 | ✅(新增) | > 注:找回密码 Step1/Step2(手机号+验证码校验)流程在本轮以登录页入口与重置页组件方式完成设计闭环;后续可独立补全完整 Stepper 页面原型。 --- ## 3. 设计基线(UI System 对齐) ### 3.1 色彩与组件 Token - 背景:`neutral-50` - 主按钮:`primary-600 / 700 / 800` - 错误提示:`danger-600` - 成功提示:`success-600` - 警告提示:`warning-600` - 卡片:`bg-white + border-neutral-200 + rounded-xl + shadow-lg` ### 3.2 交互组件 - 输入框:Label 在上,错误提示在下 - 密码框:支持显示/隐藏 - 滑块拼图:支持刷新、成功态、失败抖动态 - 登录方式 Tab:默认“密码登录”,切换后清空两侧输入并重置滑块 - CTA 状态:disabled / loading / success 跳转 ### 3.3 主题策略 - 本模块静态原型仅提供 Light 模式展示(`data-theme="light"`) - 不提供主题切换控件 --- ## 4. 页面规范 ## 4.1 Tenant 识别页(`登录_UI.html`) ### 页面结构 - 左侧:品牌区(Logo、产品价值描述) - 右侧:Tenant 识别卡片 - 标题:欢迎使用 Fonrey 房睿 - 副标题:请输入您公司的专属识别码以继续 - 字段:公司识别码(12位纯数字) - 按钮:确认 - 错误区:固定高度,避免布局抖动 - 帮助文案:联系 Tenant Admin 获取识别码 ### 校验与状态 - 输入仅保留数字,超长截断为 12 位 - 少于 12 位提交:提示“识别码须为 12 位数字” - 成功:缓存 tenant 信息并跳转登录页(双 Tab) - 失败:提示“识别码无效,请联系您的Tenant Admin(租户管理员)获取正确的识别码” - 网络异常:提示“网络连接失败,请检查网络后重试” ### 接口映射 - `POST /api/auth/tenant/verify/` - Request:`{ tenant_code }` --- ## 4.2 登录页(`登录_账号密码_UI.html`) ### 顶部信息 - 显示当前租户名:`正在登录:{tenant_name}` - 提供“切换公司”入口 + 二次确认弹窗 - 可显示 Session 过期提示条 ### 登录方式 Tab(核心) | Tab | 默认 | 字段组成 | |---|---|---| | 密码登录 | ✅ | 手机号 + 密码 + 滑块验证 + 登录 | | 验证码登录 | - | 手机号 + 滑块验证 + 短信验证码 + 登录 | ### Tab 切换规则 - 切换后: - 清空当前 Tab 输入 - 清空错误提示 - 重置滑块状态 - 清空短信验证码倒计时状态 ### 密码登录(Story 2) - 手机号:11 位数字,自动过滤非数字 - 密码:必填,显示/隐藏切换 - 滑块:必须先通过 - 登录按钮:三项满足后可点击 - 失败提示:统一“手机号或密码错误,请重新输入” - 锁定提示:“账号已被临时锁定,请 30 分钟后重试,或联系管理员解锁” - 停用提示:“账号已停用,请联系您的管理员” ### 验证码登录(Story 5) - 手机号:11 位数字 - 获取验证码按钮: - 需先通过滑块后才可点击 - 点击后进入 60s 冷却 - 验证码输入:6 位数字 - 登录按钮:手机号 + 验证码均满足后可点击 - 验证失败提示: - “验证码有误,请重新输入” - 过期:“验证码已过期,请重新获取” ### 其他入口 - 忘记密码(保留) - 微信扫码登录(即将开放,禁用态) - 删除“忘记用户名”入口 ### 接口映射 - `POST /api/auth/login/` - `POST /api/auth/login/phone/` - `POST /api/auth/logout/` - `POST /api/auth/recover/password/request/` - `POST /api/auth/recover/password/verify/` - `POST /api/auth/recover/password/reset/` --- ## 4.3 设置新密码页(`登录_重置密码_UI.html`) 本页面是公共组件页面,支持两种业务上下文: | 模式 | 标题 | 提示文案 | 按钮文案 | 提交后行为 | |---|---|---|---|---| | `initial`(首次登录强制修改) | 欢迎使用 Fonrey,请先设置您的登录密码 | 您当前使用的是初始密码,为保障账号安全,请立即设置新密码后开始使用 | 确认并进入系统 | 保持 Session,进入首页 | | `recover`(找回密码步骤三) | 重置您的登录密码 | 请输入您的新密码,设置完成后请使用新密码重新登录 | 确认重置密码 | 使所有 Session 失效,跳转登录页并提示 | ### 字段与校验 - 新密码 - 确认新密码 - 实时强度校验(逐条): - 长度 ≥ 8 - 包含字母 - 包含数字 - 一致性校验:两次输入必须一致 ### 强制约束(initial 模式) - 不显示“跳过” - 不允许返回业务页面 - 页面仅保留密码设置流程 --- ## 5. 状态矩阵 | 页面 | 状态 | 说明 | |---|---|---| | Tenant 识别页 | idle/loading/success/error/network_error | 完整覆盖 Story 1 | | 登录页-密码 Tab | default/captcha_pass/submitting/credential_error/locked/disabled/session_expired | 完整覆盖 Story 2 | | 登录页-验证码 Tab | default/captcha_required/otp_sending/otp_countdown/otp_error/otp_expired/submitting | 完整覆盖 Story 5 | | 设置新密码页 | default/strength_checking/mismatch_error/submitting/success | 覆盖 Story 3 Step3 + §5.3.4 | --- ## 6. 可访问性与实现约束 1. 输入框均有 Label,不仅依赖 placeholder 2. 错误文案使用 `aria-describedby` 关联字段 3. 图标按钮(显示密码/刷新验证码)提供 `aria-label` 4. 支持键盘 Tab 顺序与 Enter 提交 5. 静态原型以原生 JS + Alpine 为主,确保 `file://` 可直接评审 --- ## 7. 本轮交付与验收清单 ### 交付文件 - `UI_DESIGN/登录管理/登录_UI.md`(本文档) - `UI_DESIGN/登录_UI.html`(Tenant 识别) - `UI_DESIGN/登录_账号密码_UI.html`(双 Tab 登录) - `UI_DESIGN/登录_重置密码_UI.html`(新增:公共设置新密码页) ### 验收项 - [ ] 登录页存在“密码登录 / 验证码登录”双 Tab 且可切换 - [ ] Tab 切换后输入与滑块状态已重置 - [ ] 密码登录按手机号校验(11位数字) - [ ] 验证码登录需先滑块通过才能“获取验证码” - [ ] “忘记用户名”入口已移除,“忘记密码”入口保留 - [ ] 新增“设置新密码”页面并覆盖 initial/recover 两种上下文 - [ ] 微信扫码登录为禁用“即将开放”态 - [ ] 关键交互无控制台报错