落地管理员 RBAC/封禁/推送任务 stub,logout 解绑 device 并统一各页 ensureAccount,同时收口 P2 生日生成与状态文档。 Co-authored-by: Cursor <cursoragent@cursor.com>
137 lines
3.2 KiB
Markdown
137 lines
3.2 KiB
Markdown
# Feature Spec: 账号登录
|
||
|
||
> Status: `Active` · Map: `5.x 账号 [P1+]` · Phase: `P1`
|
||
> 规范:[../feature-design.md](../feature-design.md)
|
||
> 关联:[profile-bootstrap.md](profile-bootstrap.md)
|
||
|
||
---
|
||
|
||
## 1. 功能定义
|
||
|
||
| 字段 | 内容 |
|
||
|---|---|
|
||
| Name | 账号登录(手机号+密码) |
|
||
| Purpose | 跨设备持久用户身份;未登录不可生成/查看生日衍生结果 |
|
||
| Business Goal | 数据归属清晰;为会员与深度版付费打底 |
|
||
|
||
| In | Out |
|
||
|---|---|
|
||
| 注册 / 登录 / 登出 / me | 微信 OAuth、短信 OTP(后续) |
|
||
| 设备身份绑定到已注册账号 | 游客可看完整报告 |
|
||
| Bearer Session | 运营 Admin 登录(独立) |
|
||
|
||
---
|
||
|
||
## 2. 用户价值
|
||
|
||
1. 换手机后仍能看到自己的档案与报告。
|
||
2. 登录后输入生日一次生成、各页直读。
|
||
3. N/A(登录本身免费)。
|
||
|
||
---
|
||
|
||
## 3. 用户角色
|
||
|
||
| Actor | 能力 |
|
||
|---|---|
|
||
| Visitor | 仅设备身份;可打开登录页;**不可**建档出结果 |
|
||
| User(已注册) | CRUD 本人档案与 TA;读已生成报告 |
|
||
| VIP / DeepAccess | 同前,权益不变 |
|
||
|
||
---
|
||
|
||
## 4. 用户流程
|
||
|
||
```text
|
||
进入结果页或建档
|
||
↓
|
||
未登录? → /login 注册或登录
|
||
↓
|
||
Device 绑定到账号 User
|
||
↓
|
||
进入档案 / 结果页(读缓存报告)
|
||
```
|
||
|
||
---
|
||
|
||
## 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 开发前检查
|
||
|
||
- [x] lexicon:登录/注册/账号
|
||
- [x] 不碰 Admin Auth
|