Feature Spec: 账号登录
Status: Active · Map: 5.x 账号 [P1+] · Phase: P1
规范:../feature-design.md
关联:profile-bootstrap.md
1. 功能定义
| 字段 |
内容 |
| Name |
账号登录(手机号+密码) |
| Purpose |
跨设备持久用户身份;未登录不可生成/查看生日衍生结果 |
| Business Goal |
数据归属清晰;为会员与深度版付费打底 |
| In |
Out |
| 注册 / 登录 / 登出 / me |
微信 OAuth、短信 OTP(后续) |
| 设备身份绑定到已注册账号 |
游客可看完整报告 |
| Bearer Session |
运营 Admin 登录(独立) |
2. 用户价值
- 换手机后仍能看到自己的档案与报告。
- 登录后输入生日一次生成、各页直读。
- N/A(登录本身免费)。
3. 用户角色
| Actor |
能力 |
| Visitor |
仅设备身份;可打开登录页;不可建档出结果 |
| User(已注册) |
CRUD 本人档案与 TA;读已生成报告 |
| VIP / DeepAccess |
同前,权益不变 |
4. 用户流程
5. 页面设计
| 路由 |
页面 |
/login |
LoginPage(注册/登录切换) |
/mine |
展示账号手机号尾号 + 退出 |
6. 页面状态规范
| 状态 |
UI |
| Loading |
登录中 |
| Error |
密码错误 / 手机号已注册 |
| Normal |
跳转 redirect 或 /mine |
7. Business Rules
| ID |
Rule |
| R1 |
临时开放: 任意非空手机号 + 任意密码均可登录;未注册则自动建号写入 DB |
| R2 |
登录/注册统一走 OpenLogin;不校验历史密码,仍会更新 password_hash 记录本次输入 |
| R3 |
登录成功后:签发 session;device_identities.user_id 改绑到账号 |
| R4 |
生成/查看档案与报告 API 必须已注册(users.phone 非空)且有效 session 或已绑设备账号 |
| R5 |
登出作废 session;设备可再登录其他账号 |
| R6 |
正式环境恢复校验前须改回本 Spec |
8. 数据模型影响
users.phone UNIQUE · users.password_hash · users.nickname
user_sessions(token, user_id, expires_at)
9. API 需求
| Method |
Path |
说明 |
| POST |
/api/v1/auth/register |
注册 |
| POST |
/api/v1/auth/login |
登录 |
| POST |
/api/v1/auth/logout |
登出 |
| GET |
/api/v1/auth/me |
当前账号 |
10. 权限设计
| 能力 |
Visitor |
User |
| register/login |
✓ |
✓ |
| profiles / reports 写读 |
✗ |
✓ |
11. 埋点
auth_register · auth_login · auth_logout
12. 测试验收标准
| Given |
When |
Then |
| 新设备 |
未登录 POST portrait |
401 |
| 注册成功 |
建档 |
200 且生成报告包 |
| 登录另一设备 |
list profiles |
见同一账号数据 |
| 已登录设备 |
POST logout 后无 Bearer 再 GET /auth/me |
401(设备已解绑,刷新不再显示登录态) |
13. AI 开发前检查