349 lines
13 KiB
Markdown
349 lines
13 KiB
Markdown
# 📋 未完成功能清单
|
||
|
||
> 文档创建: 2026-04-09
|
||
> 最后更新: 2026-04-09
|
||
> 数据来源: `LOCAL_FEATURES_PLAN.md` 阶段三~五
|
||
> 说明: 记录所有未完成的功能任务,跟踪开发进度
|
||
> 优先级说明: P1=核心功能 P2=重要功能 P3=增强功能
|
||
> 优先级值1-5: 5=最高优先级(多次提及自动提升)
|
||
|
||
---
|
||
|
||
## 📊 总体进度
|
||
|
||
| 阶段 | 总任务 | 已完成 | 未完成 | 完成率 |
|
||
|------|--------|--------|--------|--------|
|
||
| 三:热量追踪+营养分析 | 7 | 7 | 0 | 100% ✅ |
|
||
| 四:购物清单 | 5 | 5 | 0 | 100% ✅ |
|
||
| 五:增强功能 | 7 | 0 | 7 | 0% |
|
||
| 六:主页体验优化 | 5 | 3 | 2 | 60% |
|
||
| Bug 修复 | 9 | 4 | 5 | 44% |
|
||
| 七:今天吃什么增强 | 5 | 0 | 5 | 0% |
|
||
| **合计** | **38** | **19** | **19** | **50%** |
|
||
|
||
---
|
||
|
||
|
||
|
||
### 开发顺序建议
|
||
|
||
```
|
||
4.1 ShoppingListController ✅
|
||
→ 4.4 食材分类展示组件 ✅
|
||
→ 4.2 购物清单页面 ✅
|
||
→ 4.3 从菜谱添加食材入口 ✅
|
||
→ 4.5 我的页面增加入口 ✅
|
||
```
|
||
|
||
### 技术要点
|
||
|
||
- `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 | ❌ 未创建 | `pages/tools/` 目录不存在 |
|
||
| 5.2 | 用量换算工具页面 | `lib/src/pages/tools/unit_converter_page.dart` | P2 | ❌ 未创建 | |
|
||
| 5.3 | 过敏原检测逻辑 | `lib/src/services/allergen_checker.dart` | P2 | ❌ 未创建 | |
|
||
| 5.4 | 烹饪笔记功能 | `lib/src/controllers/cooking_note_controller.dart` | P3 | ❌ 未创建 | |
|
||
| 5.5 | 用餐提醒 | `lib/src/services/notification_service.dart` | P3 | ❌ 未创建 | 需 `flutter_local_notifications` |
|
||
| 5.6 | BMI 计算器 | `lib/src/pages/tools/bmi_calculator_page.dart` | P3 | ❌ 未创建 | |
|
||
| 5.7 | 份量缩放工具 | `lib/src/pages/tools/serving_scaler_page.dart` | P3 | ❌ 未创建 | |
|
||
|
||
### 开发顺序建议
|
||
|
||
```
|
||
5.1 烹饪计时器(纯 UI,无外部依赖)
|
||
→ 5.2 用量换算(纯逻辑,无外部依赖)
|
||
→ 5.6 BMI 计算器(纯逻辑,无外部依赖)
|
||
→ 5.7 份量缩放(纯逻辑,无外部依赖)
|
||
→ 5.3 过敏原检测(需偏好数据)
|
||
→ 5.4 烹饪笔记(需 HiveService)
|
||
→ 5.5 用餐提醒(需 flutter_local_notifications,鸿蒙兼容性待验证)
|
||
```
|
||
|
||
### 技术要点
|
||
|
||
- 烹饪计时器:用 `Stream.periodic` 实现倒计时,支持多步骤
|
||
- 用量换算:纯 Dart Map 映射,无需外部包
|
||
- 过敏原检测:比对 `PreferenceController.blockedAllergens` 与菜谱成分
|
||
- 烹饪笔记:`CookingNoteModel` 已有,Controller 调 `HiveService` CRUD
|
||
- 用餐提醒:`flutter_local_notifications` 有原生依赖,鸿蒙兼容性需验证
|
||
- BMI 计算器:`体重 / 身高²`,纯计算
|
||
- 份量缩放:按比例缩放食材用量,纯计算
|
||
- 所有工具页面需 iOS26 Liquid Glass 风格
|
||
|
||
---
|
||
|
||
## 🔗 需引入的外部依赖
|
||
|
||
| 依赖 | 用途 | 阶段 | 纯Dart | 鸿蒙兼容 | 状态 |
|
||
|------|------|------|--------|---------|------|
|
||
| `fl_chart` | 图表绘制 | 三 | ✅ 是 | ✅ 是 | ✅ 已本地适配 |
|
||
| `flutter_local_notifications` | 本地通知 | 五 | ❌ 否 | ⚠️ 待验证 | ❌ 未引入 |
|
||
|
||
---
|
||
|
||
## 📝 验收标准
|
||
|
||
### 阶段三 ✅
|
||
- [x] 环形进度正确显示当日热量占比
|
||
- [x] 三大营养素比例饼图正确
|
||
- [x] 周/月趋势折线图可交互
|
||
- [x] 可设置每日营养目标
|
||
|
||
### 阶段四
|
||
- [ ] 可从菜谱添加食材到购物清单
|
||
- [ ] 可勾选已购物品
|
||
- [ ] 食材按分类展示
|
||
|
||
### 阶段五
|
||
- [ ] 烹饪计时器支持多步骤倒计时
|
||
- [ ] 用量换算覆盖常用单位
|
||
- [ ] 过敏原检测可标记含过敏原的菜谱
|
||
- [ ] 烹饪笔记可按菜谱关联
|
||
- [ ] 用餐提醒可设置时间并准时通知
|
||
- [ ] BMI 计算器结果含健康建议
|
||
- [ ] 份量缩放可按比例调整食材用量
|
||
|
||
---
|
||
|
||
## 🔵 阶段六:主页体验优化(P1)
|
||
|
||
**目标**:修复主页交互体验问题,提升可用性
|
||
**前置依赖**:无
|
||
**关键阻塞**:无
|
||
|
||
| 序号 | 任务 | 产出文件 | 优先级 | 状态 | 问题描述 |
|
||
|------|------|---------|--------|------|---------|
|
||
| 6.1 | 增大卡片交互按钮点击区域 | `lib/src/pages/home_page.dart` | P1 | ❌ 未修复 | 图标16px过小,点击困难,需增大到20px+扩大热区 |
|
||
| 6.2 | 添加骨架屏加载效果 | `lib/src/widgets/skeleton/` | P1 | ❌ 未创建 | 加载中无骨架屏,用户体验差 |
|
||
| 6.3 | 支持动态主题切换 | `lib/src/services/ui/theme_service.dart` | P2 | ❌ 未实现 | 当前主题固定,需支持跟随系统/手动切换 |
|
||
| 6.4 | 搜索功能+搜索页面 | `lib/src/pages/search/search_page.dart` | P1 | ❌ 未创建 | 搜索栏只读无跳转,需完整搜索功能 |
|
||
| 6.5 | 菜谱详情页 | `lib/src/pages/recipe/recipe_detail_page.dart` | P1 | ❌ 未创建 | 点击卡片只显示Toast,需跳转到详情页 |
|
||
|
||
### 问题详情
|
||
|
||
#### 6.1 交互按钮过小
|
||
- **现状**:图标 16px,点击热区仅文字区域
|
||
- **影响**:用户难以准确点击,误触率高
|
||
- **方案**:图标增大到 20px,Padding 从 2px 增加到 8px,使用 `InkWell` 扩大热区
|
||
|
||
#### 6.2 骨架屏缺失
|
||
- **现状**:加载时显示 `CupertinoActivityIndicator`
|
||
- **影响**:页面跳动,感知加载时间长
|
||
- **方案**:使用 `Shimmer` 或自定义骨架屏组件,模拟卡片结构
|
||
|
||
#### 6.3 动态主题
|
||
- **现状**:主题固定,仅支持亮/暗色
|
||
- **影响**:无法满足个性化需求
|
||
- **方案**:扩展 ThemeService,支持多主题色(蓝/绿/紫/橙)
|
||
|
||
#### 6.4 搜索功能
|
||
- **现状**:搜索栏 `readOnly: true`,点击无响应
|
||
- **影响**:核心功能缺失
|
||
- **方案**:创建 SearchPage,支持历史记录、热门搜索、结果列表
|
||
|
||
#### 6.5 详情页缺失
|
||
- **现状**:点击卡片 `ToastService.show('${item.title} 👀')`
|
||
- **影响**:无法查看菜谱详情
|
||
- **方案**:创建 RecipeDetailPage,展示封面、食材、步骤、营养
|
||
|
||
### 开发顺序建议
|
||
|
||
```
|
||
6.1 增大交互按钮(最小改动,立竿见影)
|
||
→ 6.2 骨架屏(提升感知性能)
|
||
→ 6.4 搜索页面(核心功能)
|
||
→ 6.5 菜谱详情页(核心功能)
|
||
→ 6.3 动态主题(增强体验)
|
||
```
|
||
|
||
### 验收标准
|
||
- [x] 交互按钮点击成功率 > 95%
|
||
- [x] 骨架屏与真实内容结构一致
|
||
- [ ] 主题切换实时生效,无闪烁
|
||
- [x] 搜索支持关键词高亮、历史记录
|
||
- [ ] 详情页展示完整菜谱信息
|
||
|
||
---
|
||
|
||
## 🔴 Bug修复清单(P0)
|
||
|
||
**目标**:修复用户反馈的严重问题
|
||
**发现时间**:2026-04-09
|
||
|
||
| 序号 | 问题描述 | 影响页面 | 优先级 | 状态 | 可能原因 |
|
||
|------|---------|---------|--------|------|---------|
|
||
| B.1 | 发现页营养中心部分按钮卡死闪退 | `discover_page.dart` | P0 | ❌ 未修复 | 空指针/异步异常未捕获 |
|
||
| B.2 | goal-setting页面被链接提示 | `goal_setting_page.dart` | P0 | ❌ 未修复 | 路由或依赖注入问题 |
|
||
| B.3 | 今天吃什么选择无反应 | `what_to_eat_page.dart` | P0 | ❌ 未修复 | 状态管理或逻辑错误 |
|
||
| B.4 | 主题设置页面不协调 | `personalization_page.dart` | P1 | ❌ 未修复 | 布局比例、缺少分割线 |
|
||
|
||
### 问题详情
|
||
|
||
#### B.1 发现页营养中心卡死闪退
|
||
- **现象**:点击部分按钮后应用卡死并闪退
|
||
- **可能原因**:
|
||
- 控制器未正确初始化
|
||
- 异步操作未正确处理异常
|
||
- 空安全违规访问
|
||
- **排查方向**:检查 `DiscoverPage` 中的按钮点击事件处理
|
||
|
||
#### B.2 goal-setting页面链接问题
|
||
- **现象**:页面显示"被链接"提示
|
||
- **可能原因**:
|
||
- 路由参数传递错误
|
||
- GetX依赖注入问题
|
||
- 页面生命周期问题
|
||
- **排查方向**:检查路由跳转和控制器注册
|
||
|
||
#### B.3 今天吃什么无反应
|
||
- **现象**:点击"开始选择"、"随机"、"智能"按钮后无结果
|
||
- **可能原因**:
|
||
- 算法逻辑错误
|
||
- 数据源为空
|
||
- 状态未正确更新
|
||
- **排查方向**:检查 `WhatToEatController` 的选择逻辑
|
||
|
||
#### B.4 主题设置页面不协调
|
||
- **现象**:
|
||
- 页面比例不均衡
|
||
- 缺少分割线
|
||
- 部分参数设置不生效
|
||
- **可能原因**:
|
||
- 布局使用固定尺寸
|
||
- 缺少视觉分隔
|
||
- 主题持久化逻辑问题
|
||
- **排查方向**:重构布局,添加分割线,检查主题保存逻辑
|
||
|
||
### 修复顺序建议
|
||
```
|
||
B.1 卡死闪退(最严重,优先修复)
|
||
→ B.3 今天吃什么(核心功能)
|
||
→ B.2 goal-setting链接问题
|
||
→ B.4 主题设置UI(体验优化)
|
||
```
|
||
|
||
### 验收标准
|
||
- [ ] 发现页所有按钮正常响应,无闪退
|
||
- [ ] goal-setting页面正常打开,无异常提示
|
||
- [ ] 今天吃什么功能完整可用,有结果反馈
|
||
- [ ] 主题设置页面美观协调,设置实时生效
|
||
|
||
---
|
||
|
||
## 🔴 Bug修复清单 第二波(P0)
|
||
|
||
**发现时间**:2026-04-09(第二轮反馈)
|
||
|
||
| 序号 | 问题描述 | 影响页面 | 优先级 | 状态 | 可能原因 |
|
||
|------|---------|---------|--------|------|---------|
|
||
| B.5 | 发现页购物清单点击无反应 | `discover_page.dart` | P0 | ✅ 已修复 | 按钮事件未绑定 |
|
||
| B.6 | 我的页面购物清单被拦截 | `profile_home.dart` | P0 | ✅ 已修复 | PageRegistry 未注册 |
|
||
| B.7 | 右上角 debug 标签 | `main.dart` | P1 | ✅ 已修复 | debugShowCheckedModeBanner未关闭 |
|
||
| B.8 | 发现页营养中心报告被拦截 | `discover_page.dart` | P0 | ✅ 已修复 | PageRegistry 未注册 |
|
||
| B.9 | 收藏页面单一无交互 | `favorites_page.dart` | P2 | ❌ 未修复 | 缺少删除/排序/分类功能 |
|
||
|
||
### 问题详情
|
||
|
||
#### B.5 发现页购物清单点击无反应
|
||
- **现象**:点击购物清单入口无响应
|
||
- **排查方向**:检查按钮onTap事件和路由跳转
|
||
|
||
#### B.6 我的页面购物清单被拦截
|
||
- **现象**:页面显示"被拦截"提示
|
||
- **排查方向**:检查PageStandardsMiddleware和页面规范
|
||
|
||
#### B.7 Debug标签
|
||
- **现象**:右上角显示DEBUG标签
|
||
- **修复方案**:设置 `debugShowCheckedModeBanner: false`
|
||
|
||
#### B.8 营养中心报告被拦截
|
||
- **现象**:点击报告入口显示"被拦截"
|
||
- **排查方向**:检查路由注册和页面规范
|
||
|
||
#### B.9 收藏页面单一
|
||
- **现象**:只有列表,无删除/排序/分类功能
|
||
- **优化方向**:添加滑动删除、分类筛选、排序选项
|
||
|
||
### 修复顺序建议
|
||
```
|
||
B.7 去掉 Debug 标签(最简单,立即生效) ✅
|
||
→ B.5/B.6/B.8 路由/拦截问题(核心功能) ✅ 全部修复
|
||
→ B.9 收藏页面优化(体验增强)
|
||
```
|
||
|
||
### 验收标准
|
||
- [x] 所有购物清单入口正常跳转
|
||
- [x] 营养中心报告页面正常打开
|
||
- [x] 无 DEBUG 标签显示
|
||
- [ ] 收藏页面支持删除和排序
|
||
|
||
---
|
||
|
||
## 🟡 阶段七:今天吃什么增强(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 | ❌ |
|
||
|
||
### 验收标准
|
||
- [ ] 支持分类多选筛选
|
||
- [ ] 支持标签多选筛选
|
||
- [ ] 支持营养素范围筛选
|
||
- [ ] 筛选结果实时更新
|