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:
@@ -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 用户
|
||||
- 新用户创建时有独立配置空间
|
||||
Reference in New Issue
Block a user