Files
kitchen/docs/dev/UNFINISHED_FEATURES.md
2026-04-10 06:41:08 +08:00

461 lines
20 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.
# 📋 未完成功能清单
> 文档创建: 2026-04-09
> 最后更新: 2026-04-10
> 数据来源: `LOCAL_FEATURES_PLAN.md` 阶段三~五 + 项目全面分析
> 说明: 记录所有未完成的功能任务,跟踪开发进度
> 优先级说明: P1=核心功能 P2=重要功能 P3=增强功能
> 优先级值1-5: 5=最高优先级(多次提及自动提升)
---
## 📊 总体进度
| 阶段 | 总任务 | 已完成 | 未完成 | 完成率 |
|------|--------|--------|--------|--------|
| 三:热量追踪+营养分析 | 7 | 7 | 0 | 100% ✅ |
| 四:购物清单 | 5 | 5 | 0 | 100% ✅ |
| 五:增强功能 | 7 | 7 | 0 | 100% ✅ |
| 六:主页体验优化 | 5 | 5 | 0 | 100% ✅ |
| Bug 修复 | 19 | 19 | 0 | 100% ✅ |
| 七:今天吃什么增强 | 5 | 5 | 0 | 100% ✅ |
| 八API v2.0.0 迁移+Bug修复 | 9 | 9 | 0 | 100% ✅ |
| 九:架构修复+核心Bug | 6 | 0 | 6 | 0% 🔴 |
| 十:代码质量提升 | 5 | 0 | 5 | 0% 🟡 |
| 十一:烹饪模式+营养仪表盘 | 4 | 0 | 4 | 0% 🟢 |
| 十二:社交+通知增强 | 4 | 0 | 4 | 0% 🟢 |
| 十三AI+规划高级功能 | 4 | 0 | 4 | 0% 🔵 |
| **合计** | **80** | **57** | **23** | **71%** |
---
### 技术要点
- `ShoppingItemModel` 已有 `category` 字段,分类展示直接用 `groupby`
- 勾选已购用 `isChecked` 字段,写入 Hive 持久化
- 从菜谱添加需解析 `RecipeModel.ingredients`,转为 `ShoppingItemModel` 列表
- 购物清单页面需 iOS26 Liquid Glass 风格
### 已完成文件清单
| 文件路径 | 说明 |
|---------|------|
| `lib/src/controllers/shopping/shopping_list_controller.dart` | 购物清单控制器 |
| `lib/src/pages/shopping/shopping_list_page.dart` | 购物清单页面 |
| `lib/src/models/shopping/shopping_item_model.dart` | 购物清单模型(已存在) |
### 路由
| 路由路径 | 页面 |
|---------|------|
| `/shopping-list` | 购物清单页面 |
---
## 🟡 阶段五增强功能P2/P3
**目标**:烹饪计时器 + 用量换算 + 过敏原检测 + 烹饪笔记 + 用餐提醒 + BMI + 份量缩放
**前置依赖**:各功能独立,无强依赖
**关键阻塞**5.5 用餐提醒需 `flutter_local_notifications`
| 序号 | 任务 | 产出文件 | 优先级 | 状态 | 说明 |
|------|------|---------|--------|------|------|
| 5.1 | 烹饪计时器页面 | `lib/src/pages/tools/cooking_timer_page.dart` | P2 | ✅ 已完成 | 已添加入口到"我的"首页 |
### 开发顺序建议
---
## 🟡 阶段七今天吃什么增强P1
**目标**:实现接口支持的动态筛选功能
**前置依赖**:接口已支持(`api_what_to_eat.php` v1.24.0
**分析结论**:接口已完整支持随机/智能/分类/标签/营养素筛选APP端未调用
| 序号 | 任务 | 产出文件 | 优先级 | 状态 | 说明 |
|------|------|---------|--------|------|------|
| 7.1 | 实现分类筛选UI | `what_to_eat_page.dart` | P1 | ✅ 已完成 | 显示接口返回的分类列表供选择 |
| 7.2 | 实现标签筛选UI | `what_to_eat_page.dart` | P1 | ✅ 已完成 | 显示接口返回的标签列表 |
| 7.3 | 实现营养素筛选UI | `what_to_eat_page.dart` | P1 | ✅ 已完成 | 热量/蛋白质/脂肪范围滑块 |
| 7.4 | 调用 available_filters 接口 | `what_to_eat_repository.dart` | P1 | ✅ 已完成 | 根据已选条件获取可用筛选 |
| 7.5 | 保存筛选偏好 | `HiveService` | P2 | ✅ 已完成 | 本地记住用户偏好 |
### 接口分析
| 端点 | APP调用 | 说明 |
|------|---------|------|
| `act=random` | ✅ 已调用 | 随机模式 |
| `act=smart` | ✅ 已调用 | 智能模式(仅用偏好) |
| `act=config` | ✅ 已调用 | 获取配置 |
| `act=subcategories` | ✅ 已调用 | 获取子分类 |
| `act=available_filters` | ✅ 已调用 | 动态筛选 |
### 筛选参数(接口支持)
| 参数 | 类型 | APP实现 |
|------|------|--------|
| `include_categories` | int[] | ✅ 已实现 |
| `exclude_categories` | int[] | ✅ 已实现 |
| `include_tags` | int[] | ✅ 已实现 |
| `exclude_tags` | int[] | ✅ 已实现 |
| `exclude_allergens` | string[] | ✅ 已实现 |
| `nutrition` | string | ✅ 已实现 |
### 验收标准
- [x] 支持分类多选筛选
- [x] 支持标签多选筛选
- [x] 支持营养素范围筛选
- [x] 筛选结果实时更新
---
## 🔵 阶段八API v2.0.0 迁移 + Bug修复P0/P1
**目标**:迁移到 API v2.0.0 合并接口修复用户反馈的8个严重Bug
---
## 🔴 阶段九:架构修复+核心BugP0/P1
**目标**:修复架构违规和核心功能缺失
**发现时间**2026-04-10flutter analyze 全面扫描 + 项目分析)
**关键阻塞**:无
| 序号 | 任务 | 产出文件 | 优先级 | 状态 | 说明 |
|------|------|---------|--------|------|------|
| 9.1 | 热门排行点击跳转详情 | `lib/src/pages/hot/hot_page.dart` | P0 | ❌ 未修复 | L148 有 TODO点击无响应需跳转到 RecipeDetailPage |
| 9.2 | 首页改用 Repository 层 | `lib/src/pages/home_page.dart` | P0 | ❌ 未修复 | 直接使用 `_apiService` 绕过 Repository需改为 `RecipeRepository` |
| 9.3 | 合并收藏功能(去重) | `cart_controller.dart` + `favorites_controller.dart` | P1 | ❌ 未修复 | CartController 实为收藏功能但命名混乱,需统一为 FavoritesController |
| 9.4 | 合并搜索控制器(去重) | `search_controller.dart` + `search/search_controller.dart` | P1 | ❌ 未修复 | 两个搜索控制器并存,需合并为一个 |
| 9.5 | 聊天页面功能化或移除 | `lib/src/pages/chat_module/chat_page.dart` | P2 | ❌ 未修复 | 纯 Demo 硬编码消息,需接入真实功能或移除入口 |
| 9.6 | 多语言词条扩充 | `app_zh.arb` / `app_en.arb` | P1 | ❌ 未修复 | 仅 21 词条,大量中文硬编码,需补全页面文字 |
### 问题详情
#### 9.1 热门排行点击无法跳转详情
- **现象**:热门排行列表项点击无响应
- **代码位置**`hot_page.dart:148``// TODO: 点击跳转到菜谱详情页`
- **方案**:使用 `Get.toNamed('/recipe-detail', arguments: item.id)` 跳转
#### 9.2 首页绕过 Repository 层
- **现象**`home_page.dart` 直接 `final ApiService _apiService = ApiService()`
- **影响**:违反架构分层,无法统一缓存/错误处理/数据转换
- **方案**:改为 `final RecipeRepository _recipeRepository = RecipeRepository()`,通过 Repository 获取数据
#### 9.3 收藏功能重复
- **现象**`CartController` + `CartPage``FavoritesController` + `FavoritesPage` 两套并存
- **影响**:收藏状态不同步,代码冗余
- **方案**
1. 删除 `CartController` + `CartPage`
2. 将 CartController 的 quantity 逻辑合并到 FavoritesController
3. 底部 Tab 收藏入口统一指向 FavoritesPage
#### 9.4 搜索控制器重复
- **现象**`controllers/search_controller.dart``controllers/search/search_controller.dart` 两个文件
- **影响**:搜索逻辑分散,修改一处容易遗漏另一处
- **方案**:保留 `search/search_controller.dart`(目录结构更规范),删除根目录版本,更新所有引用
#### 9.5 聊天页面
- **现象**`ChatPage` 只有硬编码消息 `{'text': '你好,这是聊天示例。', 'me': false}`
- **方案A**:接入 AI 聊天 API如菜谱问答
- **方案B**:改为"意见反馈"页面
- **方案C**:移除入口,待后续有需求再添加
#### 9.6 多语言覆盖率
- **现象**`app_zh.arb` 仅 21 词条,大量页面文字如"今天吃什么"、"热门排行"、"我的足迹"等硬编码
- **方案**:逐页面提取硬编码文字到 arb 文件,优先覆盖核心页面(首页、搜索、详情、发现)
### 开发顺序建议
```
9.1 热门排行跳转详情(最小改动,立竿见影)
→ 9.2 首页改用 Repository架构规范
→ 9.4 合并搜索控制器(消除冗余)
→ 9.3 合并收藏功能(消除冗余)
→ 9.6 多语言词条扩充(持续进行)
→ 9.5 聊天页面(最后处理)
```
### 验收标准
- [ ] 热门排行点击可跳转到菜谱详情页
- [ ] 首页通过 Repository 层获取数据
- [ ] 收藏功能只有一套实现
- [ ] 搜索功能只有一套实现
- [ ] 聊天页面有真实功能或已移除入口
- [ ] 核心页面文字已提取到 arb 文件
---
## 🟡 阶段十代码质量提升P1/P2
**目标**:提升代码可维护性和健壮性
**前置依赖**:阶段九完成
**关键阻塞**:无
| 序号 | 任务 | 产出文件 | 优先级 | 状态 | 说明 |
|------|------|---------|--------|------|------|
| 10.1 | 统一 Controller 注册 | `lib/src/bindings/app_binding.dart` | P1 | ❌ 未实现 | 部分用 `Get.put()`,部分用 `Get.find()`,需统一 Binding |
| 10.2 | HiveService 数据迁移机制 | `lib/src/services/data/hive_service.dart` | P2 | ❌ 未实现 | Box schema 变更时无迁移策略,可能导致数据丢失 |
| 10.3 | 统一错误处理 | `lib/src/services/api/api_exception.dart` | P1 | ❌ 未实现 | 部分 Repository 抛 Exception部分返回空数据需统一错误码 |
| 10.4 | 离线缓存策略 | `lib/src/services/data/storage_service.dart` | P1 | ❌ 未实现 | API 数据仅靠 Dio 缓存,离线时首页无数据 |
| 10.5 | DesignTokens 与 ThemeService 解耦 | `lib/src/config/design_tokens.dart` | P2 | ❌ 未实现 | 页面混用静态常量和动态值,暗色模式适配不一致 |
### 问题详情
#### 10.1 Controller 注册不统一
- **现象**:部分页面在 `build()``Get.put()`,部分在 `onInit()``Get.find()`
- **影响**Controller 生命周期不可控,可能重复创建或找不到
- **方案**:每个页面创建对应 Binding`AppBinding` 中统一注册
#### 10.2 HiveService 无数据迁移
- **现象**Box schema 变更后直接崩溃或数据丢失
- **方案**:添加 `boxVersion` 字段,打开 Box 时检查版本号,执行迁移逻辑
#### 10.3 错误处理不统一
- **现象**`RecipeRepository``Exception``FeedRepository` 返回空列表
- **方案**:定义 `AppException` 层级NetworkException / ParseException / StorageExceptionRepository 统一抛出
#### 10.4 离线缓存
- **现象**:无网络时首页显示"暂无菜谱"
- **方案**API 成功时将数据写入 Hive离线时从 Hive 读取
#### 10.5 DesignTokens 解耦
- **现象**:页面同时使用 `DesignTokens.text1`(静态)和 `themeService.textColor.value`(动态)
- **方案**:所有颜色值通过 `ThemeService` 获取,`DesignTokens` 仅保留间距/圆角/字号等不变量
### 开发顺序建议
```
10.1 统一 Controller 注册(架构基础)
→ 10.3 统一错误处理(稳定性)
→ 10.4 离线缓存(用户体验)
→ 10.2 HiveService 迁移机制(数据安全)
→ 10.5 DesignTokens 解耦(代码规范)
```
### 验收标准
- [ ] 所有 Controller 通过 Binding 注册
- [ ] HiveService 支持 schema 版本迁移
- [ ] Repository 统一抛出 AppException
- [ ] 离线时首页可显示缓存数据
- [ ] 页面颜色值统一通过 ThemeService 获取
---
## 🟢 阶段十一:烹饪模式+营养仪表盘P1
**目标**:实现核心增强功能,提升应用价值
**前置依赖**:阶段九完成
**关键阻塞**:无
| 序号 | 任务 | 产出文件 | 优先级 | 状态 | 说明 |
|------|------|---------|--------|------|------|
| 11.1 | 🍳 烹饪模式 | `lib/src/pages/recipe/cooking_mode_page.dart` | P1 | ❌ 未实现 | 详情页"开始烹饪"按钮,步骤引导+计时器联动 |
| 11.2 | 📊 营养追踪仪表盘 | `lib/src/pages/home/nutrition_dashboard.dart` | P1 | ❌ 未实现 | 首页展示今日营养摄入环形图,整合 MealRecordController |
| 11.3 | 🛒 菜谱食材一键加入购物清单 | `lib/src/pages/recipe/recipe_detail_page.dart` | P1 | ❌ 未实现 | 详情页"加入购物清单"按钮,自动解析食材 |
| 11.4 | 📖 菜谱步骤图文模式 | `lib/src/pages/recipe/recipe_detail_page.dart` | P2 | ❌ 未实现 | 步骤展开/折叠,每步配图+计时器 |
### 功能详情
#### 11.1 烹饪模式
- **入口**:菜谱详情页 → "🍳 开始烹饪"按钮
- **功能**
- 全屏步骤引导,左右滑动切换步骤
- 当前步骤高亮,已完成步骤置灰
- 每步自动启动计时器(如有时间信息)
- 支持语音播报TTS
- 支持暂停/继续/跳过
- **技术方案**PageView + StepIndicator + CookingTimerController
#### 11.2 营养追踪仪表盘
- **入口**:首页顶部卡片区域
- **功能**
- 今日热量/蛋白质/脂肪/碳水摄入环形图
- 与每日目标对比进度
- 点击跳转到营养中心详情
- **技术方案**NutritionRing widget + MealRecordController
#### 11.3 食材一键加入购物清单
- **入口**:菜谱详情页 → "🛒 加入购物清单"按钮
- **功能**
- 解析 `RecipeModel.ingredients``ShoppingItemModel` 列表
- 弹出确认弹窗,可勾选/取消勾选食材
- 确认后写入 Hive
- **技术方案**ShoppingListController.addFromRecipe()
#### 11.4 步骤图文模式
- **入口**:菜谱详情页步骤区域
- **功能**
- 步骤卡片展开/折叠
- 每步配图(如有)
- 每步计时器快捷按钮
- 步骤编号 + 预计时间
### 开发顺序建议
```
11.3 食材加入购物清单(最小改动,复用现有 ShoppingListController
→ 11.2 营养追踪仪表盘(复用现有 NutritionRing + MealRecordController
→ 11.4 步骤图文模式(增强详情页)
→ 11.1 烹饪模式(最复杂,需新建页面)
```
### 验收标准
- [ ] 详情页有"开始烹饪"按钮,点击进入步骤引导模式
- [ ] 首页显示今日营养摄入环形图
- [ ] 详情页可一键将食材加入购物清单
- [ ] 详情页步骤支持展开/折叠
---
## 🟢 阶段十二:社交+通知增强P2
**目标**:增加社交分享和通知提醒功能
**前置依赖**:阶段十一完成
**关键阻塞**12.1 需 `share_plus`12.2 需 `flutter_local_notifications`
| 序号 | 任务 | 产出文件 | 优先级 | 状态 | 说明 |
|------|------|---------|--------|------|------|
| 12.1 | 📱 分享菜谱 | `lib/src/pages/recipe/recipe_detail_page.dart` | P2 | ❌ 未实现 | 生成菜谱卡片图片,支持系统分享 |
| 12.2 | 🔔 烹饪提醒通知 | `lib/src/services/notification_service.dart` | P2 | ❌ 未实现 | 定时提醒烹饪步骤,与计时器联动 |
| 12.3 | 🔍 搜索建议/热词 | `lib/src/pages/search/search_page.dart` | P2 | ❌ 未实现 | 搜索页展示热门搜索词,输入时自动补全 |
| 12.4 | 📸 拍照记录 | `lib/src/pages/tools/cooking_note_page.dart` | P3 | ❌ 未实现 | 烹饪笔记支持拍照上传,记录成品 |
### 功能详情
#### 12.1 分享菜谱
- **入口**:菜谱详情页 → 分享按钮
- **功能**
- 生成菜谱卡片图片(封面+标题+食材摘要)
- 调用 iOS Share Sheet / Android 分享面板
- 支持保存到相册
- **技术方案**`screenshot` + `share_plus`
#### 12.2 烹饪提醒通知
- **入口**:烹饪模式 → 设置提醒
- **功能**
- 烹饪步骤到达时发送本地通知
- 计时器完成时通知
- 支持自定义提醒时间
- **技术方案**`flutter_local_notifications`
#### 12.3 搜索建议/热词
- **入口**:搜索页搜索栏
- **功能**
- 空搜索框时展示热门搜索词
- 输入时自动补全建议
- 热门搜索词从 API 获取
- **技术方案**`RecipeRepository.fetchTags()` 获取热词
#### 12.4 拍照记录
- **入口**:烹饪笔记 → 拍照按钮
- **功能**
- 调用相机拍照或从相册选择
- 图片压缩后保存到本地
- 笔记列表展示缩略图
- **技术方案**`image_picker` + 本地文件存储
### 需引入的外部依赖
| 依赖 | 用途 | 纯Dart | 鸿蒙兼容 |
|------|------|--------|---------|
| `share_plus` | 系统分享 | ❌ | ⚠️ 需适配 |
| `flutter_local_notifications` | 本地通知 | ❌ | ⚠️ 需适配 |
| `image_picker` | 拍照/相册 | ❌ | ⚠️ 需适配 |
| `screenshot` | 截图 | ✅ | ✅ |
### 验收标准
- [ ] 详情页可分享菜谱卡片到其他应用
- [ ] 烹饪计时器完成时发送本地通知
- [ ] 搜索页展示热门搜索词
- [ ] 烹饪笔记可添加照片
---
## 🔵 阶段十三AI+规划高级功能P3
**目标**:实现智能化和规划类高级功能
**前置依赖**:阶段十二完成
**关键阻塞**13.1 需 AI API13.2 需日历组件
| 序号 | 任务 | 产出文件 | 优先级 | 状态 | 说明 |
|------|------|---------|--------|------|------|
| 13.1 | 🤖 AI 菜谱推荐 | `lib/src/services/ai_recommend_service.dart` | P3 | ❌ 未实现 | 基于口味偏好+浏览历史,智能推荐菜谱 |
| 13.2 | 📅 每周菜单规划 | `lib/src/pages/tools/meal_planner_page.dart` | P3 | ❌ 未实现 | 日历视图规划一周饮食,自动生成购物清单 |
| 13.3 | 🧮 食材用量换算增强 | `lib/src/pages/tools/serving_scaler_page.dart` | P3 | ❌ 未实现 | 增强份量缩放,支持不同单位换算 |
| 13.4 | 🌙 就寝提醒 | `lib/src/pages/settings/health_reminder_page.dart` | P3 | ❌ 未实现 | 根据饮食时间推荐健康作息 |
### 功能详情
#### 13.1 AI 菜谱推荐
- **入口**:首页"为你推荐"Tab
- **功能**
- 基于用户口味偏好PreferenceController
- 基于浏览历史FootprintsPage 数据)
- 基于收藏记录FavoritesController
- 推荐相似菜谱
- **技术方案**:调用后端推荐 API 或本地协同过滤算法
#### 13.2 每周菜单规划
- **入口**:工具页 → "📅 每周菜单"
- **功能**
- 日历视图选择日期
- 每日早/中/晚三餐分配菜谱
- 自动汇总生成购物清单
- 支持拖拽调整
- **技术方案**:自定义日历组件 + Hive 持久化
#### 13.3 食材用量换算增强
- **入口**:工具页 → 份量缩放
- **功能**
- 支持克/千克/磅/盎司互转
- 支持毫升/升/杯/汤匙互转
- 常用食材密度表
- **技术方案**:扩展 `serving_scaler_page.dart`,添加单位换算 Tab
#### 13.4 就寝提醒
- **入口**:设置 → 健康提醒
- **功能**
- 根据晚餐时间推荐就寝时间
- 睡前不宜进食提醒
- 与营养追踪联动
- **技术方案**`flutter_local_notifications` + 健康算法
### 验收标准
- [ ] "为你推荐"展示个性化推荐菜谱
- [ ] 每周菜单可规划三餐并生成购物清单
- [ ] 份量缩放支持多种单位换算
- [ ] 就寝提醒根据饮食时间智能推荐
---
## 📎 软件特性功能汇总
> 以下功能已开发完成或开发中,从历史版本号归档而来
| 功能 | 状态 | 首次版本 | 说明 |
|------|------|---------|------|
| 热量追踪+营养分析 | ✅ 已完成 | v0.3x | 环形图+饼图+折线图+目标设置 |
| 购物清单 | ✅ 已完成 | v0.4x | 添加/删除/勾选/分类/从菜谱添加 |
| 烹饪计时器 | ✅ 已完成 | v0.5x | 多步骤倒计时 |
| 用量换算 | ✅ 已完成 | v0.5x | 常用单位换算 |
| 过敏原检测 | ✅ 已完成 | v0.5x | 标记含过敏原菜谱 |
| 烹饪笔记 | ✅ 已完成 | v0.5x | 按菜谱关联笔记 |
| BMI 计算器 | ✅ 已完成 | v0.5x | 含健康建议 |
| 份量缩放 | ✅ 已完成 | v0.5x | 按比例调整食材用量 |
| 主页体验优化 | ✅ 已完成 | v0.6x | 骨架屏+动画+搜索+详情页 |
| 今天吃什么增强 | ✅ 已完成 | v0.7x | 分类/标签/过敏原三维筛选 |
| API v2.0.0 迁移 | ✅ 已完成 | v0.8x | 合并接口+8个Bug修复 |
| 动态主题 | ✅ 已完成 | v0.6x | 多主题色+暗色模式+卡片滑动方向 |
| Liquid Glass 风格 | ✅ 已完成 | v0.6x | 底栏+搜索栏+分段控件+卡片 |
| 收藏管理 | ✅ 已完成 | v0.8x | 编辑/排序/分类/跳转详情 |
| 静态分析清理 | ✅ 已完成 | v0.52 | 107→1 个 info0 error/warning |