Files
DDUp/docs/plans/2026-01-19-settings-page-design.md
Rocky 3bfb059898 docs: 添加设置页面设计文档
包含用户管理和系统管理两个功能模块的完整设计:
- 用户档案切换(家庭多用户支持)
- 体重录入功能
- 数据清除功能(按时间/类型/全部)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 21:43:06 +08:00

230 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 设置页面设计文档
## 概述
为 Vitals 健康管理应用添加设置页面,包含用户管理和系统管理两个功能模块。
### 需求
1. **用户管理** - 简单档案切换,支持多用户(如家庭成员)
2. **系统管理** - 体重录入和历史数据清除
---
## 一、数据模型变更
### 新增 User 模型
```python
# src/vitals/core/models.py
class User(BaseModel):
id: int | None = None
name: str # 用户名称,如"爸爸"、"妈妈"
avatar: str | None = None # 头像(可选,用于区分)
created_at: datetime
is_active: bool = True # 当前激活的用户
```
### 数据库变更
1. **新增 `users` 表**:存储用户档案
2. **现有表添加 `user_id` 字段**exercise、meal、sleep、weight、config 表都需要关联到具体用户
3. **默认用户迁移**:首次升级时,自动创建一个"默认用户",将现有数据关联到该用户
### 数据隔离
- 切换用户后,所有页面只显示当前用户的数据
- 通过 Cookie 记录当前用户 ID
- API 请求自动根据当前用户过滤数据
---
## 二、页面 UI 结构
### 页面布局 (`/settings`)
```
┌─────────────────────────────────────────────────────┐
│ 导航栏 [首页] [运动] [饮食] [睡眠] [体重] [报告] [⚙设置] │
├─────────────────────────────────────────────────────┤
│ │
│ [👤 用户管理] [🔧 系统管理] ← 标签页切换 │
│ ───────────────────────────────────────────── │
│ │
│ (标签页内容区域) │
│ │
└─────────────────────────────────────────────────────┘
```
### 用户管理标签页
```
┌─────────────────────────────────────────────────────┐
│ 当前用户: [小明 ✓] │
├─────────────────────────────────────────────────────┤
│ 用户列表: │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 👤 │ │ 👤 │ │ 👤 │ │ │ │
│ │ 小明 │ │ 小红 │ │ 爸爸 │ │ 添加 │ │
│ │ [切换] │ │ [切换] │ │ [切换] │ │ 用户 │ │
│ │ [编辑] │ │ [编辑] │ │ [编辑] │ │ │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────────┘│
└─────────────────────────────────────────────────────┘
```
**交互说明**
- 点击用户卡片的「切换」按钮,切换到该用户
- 当前激活用户显示勾选标记
- 「添加用户」打开弹窗创建新档案
- 「编辑」可修改名称或删除用户(删除需二次确认)
### 添加/编辑用户弹窗
```
┌──────────────────────────┐
│ 用户名称: [________] │
│ [取消] [保存] [删除] │
└──────────────────────────┘
```
---
## 三、系统管理标签页
### 布局
```
┌─────────────────────────────────────────────────────┐
│ [👤 用户管理] [🔧 系统管理] │
│ ───────────────────────────────────────────── │
│ │
│ ┌─ 体重录入 ─────────────────────────────────────┐ │
│ │ 当前用户: 小明 │ │
│ │ 日期: [2026-01-19 ▼] 体重: [__] kg │ │
│ │ 体脂率: [__] % (选填) 备注: [________] │ │
│ │ [录入体重] │ │
│ └───────────────────────────────────────────────┘ │
│ │
│ ┌─ 数据清除 ─────────────────────────────────────┐ │
│ │ ⚠️ 警告:删除的数据无法恢复,请谨慎操作 │ │
│ │ │ │
│ │ 清除方式: │ │
│ │ ○ 按时间范围 │ │
│ │ 从 [2026-01-01] 到 [2026-01-19] │ │
│ │ │ │
│ │ ○ 按数据类型 │ │
│ │ □ 运动记录 □ 饮食记录 □ 睡眠记录 □ 体重 │ │
│ │ │ │
│ │ ○ 清除全部数据 │ │
│ │ │ │
│ │ [清除数据] ← 红色警示按钮 │ │
│ └───────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
```
### 删除确认弹窗
```
┌──────────────────────────────────────┐
│ ⚠️ 确认删除 │
│ │
│ 即将删除以下数据: │
│ • 用户:小明 │
│ • 范围2026-01-01 至 2026-01-19 │
│ • 类型:运动记录、饮食记录 │
│ • 共 45 条记录 │
│ │
│ 此操作不可撤销! │
│ │
│ 请输入 "确认删除" 以继续: │
│ [____________] │
│ │
│ [取消] [删除] │
└──────────────────────────────────────┘
```
**安全措施**
- 删除前显示将被删除的记录数量
- 需要输入「确认删除」文字才能执行
- 删除按钮为红色警示样式
---
## 四、API 接口设计
### 用户管理 API
| 方法 | 路径 | 功能 |
|------|------|------|
| `GET` | `/api/users` | 获取所有用户列表 |
| `GET` | `/api/users/current` | 获取当前激活用户 |
| `POST` | `/api/users` | 创建新用户 |
| `PUT` | `/api/users/{id}` | 更新用户信息 |
| `DELETE` | `/api/users/{id}` | 删除用户(含其所有数据) |
| `POST` | `/api/users/{id}/switch` | 切换到指定用户 |
### 数据清除 API
| 方法 | 路径 | 功能 |
|------|------|------|
| `POST` | `/api/data/preview-delete` | 预览将删除的数据量 |
| `DELETE` | `/api/data/clear` | 执行数据清除 |
### 清除请求参数
```python
class DataClearRequest(BaseModel):
user_id: int # 目标用户
mode: str # "range" | "type" | "all"
date_from: date | None = None # 按时间范围
date_to: date | None = None
data_types: list[str] | None = None # ["exercise", "meal", "sleep", "weight"]
confirm_text: str # 必须为 "确认删除"
```
### 用户状态存储
使用 Cookie 存储当前用户 ID
```
Cookie: vitals_current_user=1
```
- 所有现有 API 自动根据 Cookie 中的用户 ID 过滤数据
- 未设置 Cookie 时使用默认用户ID=1
---
## 五、实现文件清单
### 需要修改的文件
| 文件 | 修改内容 |
|------|----------|
| `src/vitals/core/models.py` | 新增 `User` 模型和 `DataClearRequest` 模型 |
| `src/vitals/core/database.py` | 新增用户表、添加 `user_id` 字段、数据迁移、清除函数 |
| `src/vitals/web/app.py` | 新增 `/settings` 页面、用户管理 API、数据清除 API、修改现有 API 支持多用户 |
### 实现步骤
1. **数据库层**
- 创建 `users`
- 为 exercise/meal/sleep/weight/config 表添加 `user_id` 字段
- 编写数据迁移逻辑(现有数据归属默认用户)
- 实现用户 CRUD 函数
- 实现数据清除函数
2. **API 层**
- 实现用户管理接口
- 实现数据清除接口
- 修改现有接口支持 `user_id` 过滤
3. **前端页面**
- 创建设置页面 HTML/CSS/JS
- 实现标签页切换
- 实现用户管理交互
- 实现数据清除交互(含确认弹窗)
4. **导航更新**
- 在所有页面导航栏添加「设置」入口