Files
DDUp/docs/plans/2026-01-20-reading-module-design.md
2026-01-20 17:55:43 +08:00

205 lines
7.7 KiB
Markdown
Raw Permalink 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.

# 阅读模块设计文档
**日期:** 2026-01-20
**状态:** 已确认,待实现
---
## 概述
为 Vitals 健康管理应用添加阅读习惯追踪功能,作为精神健康的一部分。用户可以记录阅读时长、书籍信息、读后感和心情,并在首页汇总展示。
---
## 功能需求
### 记录内容
- **时长**:阅读分钟数
- **书名**:输入书名,自动搜索封面
- **封面**:通过 OpenLibrary API 自动获取(中文书为主)
- **作者**:自动获取或手动输入(可选)
- **心情**5 个表情选择(😄😊😐😔😢)
- **读后感**:文字记录(可选)
### 页面展示
- **阅读页面**:书库视图,按书名归类展示
- **首页汇总**:今日阅读时长、书名、心情
### 统计图表
- 阅读时长趋势图(近 30 天)
- 心情分布饼图
- 我的书库(封面网格)
---
## 数据模型
### 阅读记录表 (reading)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | INTEGER | 主键,自增 |
| user_id | INTEGER | 用户 ID |
| date | DATE | 阅读日期 |
| title | TEXT | 书名 |
| author | TEXT | 作者(可选) |
| cover_url | TEXT | 封面 URL |
| duration | INTEGER | 时长(分钟) |
| mood | TEXT | 心情(😄😊😐😔😢) |
| notes | TEXT | 读后感(可选) |
---
## 页面设计
### 阅读页面布局 (/reading)
```
┌─────────────────────────────────────┐
│ 导航栏(首页/运动/饮食/睡眠/...
├─────────────────────────────────────┤
│ 📚 我的阅读 │
│ 本月已读 12.5 小时 · 3 本书在读 │
├─────────────────────────────────────┤
│ 阅读统计(图表区) │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 时长趋势图 │ │ 心情分布 │ │
│ │ (近30天) │ │ (饼图) │ │
│ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────┤
│ 我的书库 │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ 封面 │ │ 封面 │ │ 封面 │ │
│ │书名 │ │书名 │ │书名 │ │
│ │5.2h │ │3.1h │ │4.2h │ │
│ └──────┘ └──────┘ └──────┘ │
├─────────────────────────────────────┤
记录阅读(按钮) │
└─────────────────────────────────────┘
```
### 记录阅读模态框
```
┌─────────────────────────────────────┐
│ 记录阅读 ✕ │
├─────────────────────────────────────┤
│ 书名 * │
│ ┌─────────────────────────────┐ │
│ │ 输入书名,自动搜索封面 │ │
│ └─────────────────────────────┘ │
│ ┌──────┐ │
│ │ 封面 │ ← 自动获取 │
│ └──────┘ │
│ │
│ 阅读时长 * 阅读日期 │
│ ┌──────────┐ ┌──────────┐ │
│ │ 30 分钟 │ │ 今天 │ │
│ └──────────┘ └──────────┘ │
│ │
│ 今天的阅读心情 │
│ 😄 😊 😐 😔 😢 │
│ ○ ● ○ ○ ○ │
│ │
│ 读后感(选填) │
│ ┌─────────────────────────────┐ │
│ │ │ │
│ └─────────────────────────────┘ │
│ │
│ [ 保存记录 ] │
└─────────────────────────────────────┘
```
### 首页汇总集成
```
┌─────────────────────────────────────┐
│ 📊 今日概览 │
├─────────────────────────────────────┤
│ 🏃 运动 🍽️ 饮食 😴 睡眠 │
│ 45分钟 1280卡 7.5小时 │
├─────────────────────────────────────┤
│ ⚖️ 体重 📚 阅读 │
│ 70.0kg 45分钟 😊 │
│ 《三体》 │
└─────────────────────────────────────┘
```
---
## API 设计
### 新增端点
| 端点 | 方法 | 说明 |
|------|------|------|
| `/api/reading` | GET | 获取阅读记录(支持 ?days=N |
| `/api/reading` | POST | 添加阅读记录 |
| `/api/reading/{id}` | DELETE | 删除记录 |
| `/api/reading/today` | GET | 今日阅读摘要 |
| `/api/reading/stats` | GET | 阅读统计(时长趋势、心情分布) |
| `/api/books/search` | GET | 搜索书籍封面OpenLibrary |
| `/reading` | GET | 阅读页面 HTML |
### 首页改动
- 仅修改首页前端 HTML新增调用 `/api/reading/today`
- **不修改** `/api/today``/api/week` 接口
---
## 技术实现
### 文件改动
| 文件 | 改动 |
|------|------|
| `src/vitals/core/models.py` | 新增 `Reading` dataclass |
| `src/vitals/core/database.py` | 新增 `reading` 表 + CRUD 函数 |
| `src/vitals/web/app.py` | 新增 API 端点 + 阅读页面 HTML + 导航更新 |
### 书籍封面获取
- **数据源**OpenLibrary API免费、无需 Key
- **搜索接口**`https://openlibrary.org/search.json?q={书名}`
- **封面接口**`https://covers.openlibrary.org/b/id/{cover_id}-M.jpg`
- **防抖处理**:输入 500ms 后触发搜索
- **本地优先**:已记录过的书名优先从本地匹配
### 交互细节
- 点击书籍封面展开该书的阅读历史
- 心情选择使用表情图标点选
- 时长输入支持快捷选择15/30/45/60 分钟)
---
## 设计系统
沿用 Vitals 现有设计系统:
| 元素 | 值 |
|------|------|
| Primary | `#3B82F6` |
| Secondary | `#60A5FA` |
| CTA | `#F97316` |
| Background | `#F8FAFC` |
| Text | `#1E293B` |
| Headings | Lora |
| Body | Raleway |
| Style | Vibrant & Block-based |
---
## 实现步骤
1. 新增 `Reading` 数据模型
2. 新增 `reading` 数据库表和 CRUD 函数
3. 新增阅读相关 API 端点
4. 新增书籍搜索 APIOpenLibrary
5. 创建阅读页面 HTML书库视图 + 统计图表)
6. 创建记录阅读模态框
7. 更新所有页面导航栏添加「阅读」链接
8. 更新首页前端获取阅读摘要
9. 测试验证