feat: 用户配置隔离与食物智能识别

1. Config 表用户隔离
   - 添加 user_id 字段,复合主键 (user_id, key)
   - 现有数据归属 ID=1 用户
   - 所有 get_config/save_config 调用传入 user_id

2. 食物文字智能识别
   - 本地数据库优先匹配(快速)
   - 识别失败时自动调用通义千问 AI(准确)
   - 有配置 API Key 才调用,否则返回本地结果

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-24 11:32:17 +08:00
parent afc6d2fb5e
commit 0f11e8ad56
7 changed files with 215 additions and 29 deletions

View File

@@ -0,0 +1,64 @@
# 用户配置隔离与食物智能识别设计
## 背景
1. **用户数据隔离问题**config 表是全局的,所有用户共享同一份配置
2. **食物文字识别问题**:文字输入时只用本地数据库匹配,无法识别复杂菜肴
## 设计决策
| 决策点 | 选择 |
|--------|------|
| Config 表修复范围 | 只修复 config 表,添加 user_id |
| 现有数据归属 | 归属给 ID=1 的用户 |
| 食物识别策略 | 本地优先,识别失败时调用大模型 |
| 大模型优先级 | 通义千问优先,没配置则回退本地 |
## 数据库变更
### Config 表新结构
```sql
CREATE TABLE config (
user_id INT NOT NULL,
`key` VARCHAR(100) NOT NULL,
value TEXT,
PRIMARY KEY (user_id, `key`)
)
```
### 迁移策略
1. 添加 user_id 列,默认值为 1
2. 现有数据自动归属到 ID=1 用户
3. 重建复合主键
## 食物智能识别流程
```
用户输入食物描述 → 本地数据库匹配
全部识别成功? ──是──→ 返回结果(快速)
↓ 否
有通义千问 API Key ──否──→ 返回本地结果
↓ 是
调用通义千问标准化 → 重新本地计算 → 返回结果(准确)
```
### 判断"识别失败"标准
当解析结果中存在 `calories = 0``estimated = False` 的食物项。
## 修改文件
1. `src/vitals/core/database.py` - config 函数增加 user_id 参数
2. `src/vitals/core/calories.py` - 增加智能 AI 回退逻辑
3. `src/vitals/web/app.py` - 调用处传入 user_id
4. `src/vitals/cli.py` - 调用处传入 user_id
5. `src/vitals/core/report.py` - 调用处传入 user_id
## 向后兼容
- 现有 4 个用户数据不受影响
- 现有配置归属 ID=1 用户
- 新用户创建时有独立配置空间