Files
kitchen/CHANGELOG.md
Developer 3c90407bb5 3d
2026-04-25 01:18:50 +08:00

258 lines
13 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
# Changelog
All notable changes to this project will be documented in this file.
## [0.99.42] - 2026-04-25
### ✨ 新增 — 导出功能增强4项改进
#### 新增: 用户自选保存路径
- **变更**: 导出文件时弹出系统文件选择器,用户自行选择保存位置
- **实现**: 使用 `FilePicker.saveFile()` 替代静默写入 Download 目录
- **影响**: DOCX/PDF/自定义导出 均已支持路径选择
- **文件**: `lib/src/widgets/recipe_detail/interaction/recipe_export_button.dart`
#### 新增: 系统分享功能
- **变更**: 导出成功后弹出对话框,支持「📤 分享给朋友」按钮
- **实现**: 使用 `Share.shareXFiles()` 调用系统分享接口
- **支持格式**: PDF、DOCX 均可分享至微信/邮件/其他应用
- **文件**: `lib/src/widgets/recipe_detail/interaction/recipe_export_button.dart`
#### 修复: PDF中文乱码??? 问题)
- **问题**: PDF使用 Helvetica + WinAnsiEncoding不支持中文字符 → 全部显示为 ???
- **根因**: `docs_gee/pdf_generator.dart` 仅支持PDF Base 14字体Helvetica/Times/Courier无CJK支持
- **修复**:
- 扩展 `PdfGenerator` 构造函数,新增 `embeddedFontBytes` / `embeddedBoldFontBytes` 参数
- 当传入TTF/OTF字体时自动创建 CIDFont Type0 + Identity-H 编码
- 内嵌 NotoSansSC 字体到PDF文档
- **验证**: `scripts/test_pdf_export_verify.dart` 验证脚本确认 FontDescriptor/CIDFontType2/Identity-H 正确嵌入
- **文件**: `packages/docs_gee/docx_generator/lib/src/pdf_generator.dart`
#### 新增: PDF封面图片嵌入
- **功能**: 导出PDF时自动在文档顶部嵌入菜品封面图
- **实现**:
-`DefaultCacheManager` 缓存读取已下载的封面图(不重新下载)
- 若无缓存则输出空白(不阻塞导出流程)
- 图片居中显示,尺寸根据文件大小自适应(200-450pt)
- **新增参数**: `coverImageBytes` / `coverImageWidth` / `coverImageHeight`
- **文件**: `packages/docs_gee/docx_generator/lib/src/pdf_generator.dart`, `lib/src/widgets/recipe_detail/interaction/recipe_export_button.dart`
## [0.99.41] - 2026-04-24
### 🐛 修复 — 3项重要Bug修复
#### 修复: 主题跟随系统切换不实时生效
- **问题**: 开启"跟随系统"后,切换系统深色模式,应用未实时切换
- **根因**: `GetCupertinoApp``Obx` 闭包内未直接访问 `isDarkMode.value`,导致 GetX 未追踪到主题状态变化
- **修复**: 在 `main.dart``Obx` 闭包内显式引用 `themeService.isDarkMode.value`,确保主题变化触发重建
- **文件**: `lib/main.dart`
#### 修复: 统计面板数字显示0
- **问题**: 运营数据大屏中当数据为0时直接显示"0",不符合展示要求
- **修复**: `_formatNumber` 方法增加 `n <= 0` 判断,最少显示"1"
- **文件**: `lib/src/pages/profile/data/stats_dashboard_page.dart`
#### 修复: 数据导出JSON导入无法识别 (3个子问题)
- **问题1: UTF-8编码错误** — `FilePicker` 读取文件使用 `String.fromCharCodes`不正确处理UTF-8中文
- **修复**: 改用 `utf8.decode(bytes, allowMalformed: true)`,确保中文内容正确解码
- **文件**: `lib/src/pages/profile/tools/data_export_page.dart`
- **问题2: MealRecordModel缺少toJson** — `exportToJson()` 直接序列化 Model 对象,输出 `Instance of 'MealRecordModel'` 而非有效JSON
- **修复**: 为 `MealRecordModel` 添加 `toJson()``fromJson()` 方法;`MealRecordController.exportToJson()` 改用 `.map((e) => e.toJson())` 序列化
- **文件**: `lib/src/models/data/record/meal_record_model.dart`, `lib/src/controllers/data/meal_record_controller.dart`
- **问题3: _inferDataSource字段名不匹配** — 收藏导出使用 `favorite_type`(下划线),但推断逻辑只检查 `favoriteType`(驼峰)
- **修复**: `_inferDataSource` 同时检查 `favoriteType``favorite_type`
- **文件**: `lib/src/services/data/business/data_export_service.dart`
### ✨ 优化 — 数据导出格式重构
#### 重构: 导出JSON增加元数据标识
- **新增**: 全量导出和单源导出均添加 `_meta` 元数据字段
```json
{
"_meta": {
"app": "cute_kitchen",
"version": 2,
"exportTime": "2026-04-24T12:00:00",
"format": "full" | "single",
"source": "favorites"
},
"favorites": [...]
}
```
- **优化**: `previewImport` 增加元数据验证,拒绝非本应用导出的数据
- **优化**: `ImportPreview` 增加 `error` 字段,导入失败时显示具体原因
- **优化**: V1格式(无_meta)向下兼容,仍可识别
- **验证**: `scripts/test_export_import.dart` 45项测试全部通过
## [0.99.40] - 2026-04-24
### ✨ 新增 — 血液酒精含量(BAC)计算器
#### 新增: BAC计算器页面
- **功能**: 输入体重/饮酒量/酒精度/已过时间,计算血液酒精含量
- **算法**: Widmark公式男性r=0.68女性r=0.55代谢率0.015%/小时
- **选填**: 性别、空腹状态,提高准确度
- **单位切换**: 已喝酒量支持 毫升↔斤↔公斤 三态切换(1斤=500ml, 1公斤=1000ml)
- **快捷选择**: 啤酒(5°)/葡萄酒(12°)/白酒(52°)/烈酒(40°)/酒心巧克力(5°)/自酿米酒(15°)/自酿果酒(12°)/自定义
- **结果卡片**: BAC核心结果、醉酒等级条、法律标准(中国)、醒酒时间、酒精摄入详情、安全提示
- **知识弹窗**: 📖按钮展示自我意识判断/醉酒症状识别/科学解酒方法/酒驾危害/免责声明
- **数据保存**: 💾按钮保存输入数据到本地
- **文件**: `lib/src/pages/tools/health/bac/` (bac_calculator.dart, bac_cards.dart, bac_page.dart)
- **验证**: `scripts/test_bac_calculator.dart` 40项测试全部通过
#### 新增: 参考文献页面增加酒精计算数据来源
- Widmark公式与BAC (Wikipedia)
- 中国酒驾醉驾标准 (GB 19522-2010)
- WHO酒精代谢与健康
- 🍺 酒精计算分类条目增加「计算器」跳转按钮
### ✨ 优化 — 身体分析页面5项需求实现 + 溢出修复
#### 修复: Tab页面底部溢出 1084px
- **根因**: 3个Tab使用 `Column` 布局,内容超出 `SizedBox` 固定高度(900-1200px)
- **修复**: Tab内部改用 `SingleChildScrollView` 支持滚动
- **新增**: 每个Tab底部增加 👈 左右滑动切换提示
#### 修复: Tab滑到底后无法滑回顶部
- **根因**: 外层 `ListView` 与内层 `SingleChildScrollView` 嵌套滚动冲突,向上滑动时外层抢占手势
- **修复**: 分析结果展示时改用 `Column` + `Expanded` 布局PageView独立占据剩余空间彻底消除嵌套滚动
- **优化**: 结果页面顶部改为紧凑信息栏(性别/年龄/身高/体重)+ 🔄重新分析按钮,节省空间
#### 新增: 趣味统计 - 各星球体重
- **功能**: 展示用户在9个天体水星/金星/地球/火星/木星/土星/天王星/海王星/月球)上的体重
- **数据**: 基于各行星相对地球的平均重力加速度计算
- **UI**: 使用 Wrap 布局的 Chip 样式展示,地球高亮标记
#### 新增: 有氧运动(燃脂)心率计算卡片
- **功能**: 在核心指标Tab中BMI卡片后新增 ❤️‍🔥 燃脂最佳心率卡片
- **展示**: 渐变背景大字显示最佳心率区间 xx-xx bpm标注为最大心率的60%~70%
#### 优化: 摄入需求/蛋白质根据BMI智能显示
- **逻辑**: 偏瘦(BMI<18.5)隐藏减脂选项,肥胖(BMI≥28)隐藏增肌选项
- **影响**: GoalCaloriesCard 和 ProteinCard 均已适配
#### 新增: Tab滑动边缘发光动画
- **效果**: 在第1个Tab继续左滑时左边缘显示主题色渐变发光最后1个Tab右滑同理
- **实现**: NotificationListener监听OverscrollNotificationStack+Positioned叠加边缘发光层
#### 删除: BMI计算器页面
- **原因**: 身体分析页面已完整覆盖BMI计算功能及更多指标
- **影响文件**: 删除 bmi_calculator_page.dart移除 app_routes.dart 中 bmiCalculator/toolsBmi 路由和 PageRegistry
- **联动**: 体重管理页面 BMI 跳转按钮改为跳转身体分析页面
#### 优化: 重新分析按钮展开编辑框
- **改动**: 点击"🔄 重新分析"时,同时展开输入区域并取消隐藏状态
#### 需求1: 修复按钮状态不实时更新
- **问题**: 输入身高/年龄/体重后,"开始分析"按钮仍为禁用状态,需额外操作才能激活
- **根因**: `onChanged` 仅在 `_hasResult == true` 时调用 `setState()`,首次输入不触发重建
- **修复**: `onChanged` 始终调用 `setState()`,按钮状态实时响应输入
#### 需求2: AppBar 增加隐私与算法说明
- 在导航栏右侧增加 图标按钮
- 点击弹出 `CupertinoAlertDialog`,包含:
- 🔒 隐私声明:所有数据仅在本地计算,不会联网上传
- 📐 算法来源Harris-Benedict / Mifflin-St Jeor / US Navy / Karvonen 等
- ⚠️ 免责声明:仅供学习参考,禁止医用、禁止商用
#### 需求3: 参考文献页面增加身体分析数据来源
- 新增 7 条 🧬 身体分析分类参考文献:
- Harris-Benedict BMR 公式 (Wikipedia)
- Mifflin-St Jeor BMR 公式 (PubMed)
- US Navy 体脂率估算法 (US Navy)
- Karvonen 心率区间公式 (Wikipedia)
- WHO BMI 分类与肥胖标准 (WHO)
- 中国居民膳食营养素参考摄入量 2023版 (中国营养学会)
- Mosteller 体表面积计算公式 (Wikipedia)
#### 需求4: 基础信息卡片增加保存/隐藏按钮
- 💾 保存按钮:将填写信息写入 SharedPreferences下次打开自动填充
- 👁️ 隐藏/显示按钮:切换输入区域显示状态,数据保留仅隐藏表单
#### 需求5: 核心指标/科学指数/趣味统计支持左右滑动
- 将 Tab 切换改为 `PageView` 实现,支持手势左右滑动
- `GlassSegmentedControl` 与 `PageView` 双向联动
#### 涉及文件
- `body_analysis_page.dart` — 全部5项需求实现
- `references_page.dart` — 新增7条身体分析参考文献
---
## [0.99.39] - 2026-04-24
### 🐛 修复 — 排敏助手页面一直转圈 + 闪退 + Obx异常
#### 问题1: 页面一直转圈(无法加载)
- **根因**: `GetBuilder` 不监听 `RxBool isLoading` 变化,`_loadData()` 完成后 `isLoading.value = false` 无法触发重建
- **修复**: `AntiController._loadData()` 完成后调用 `update()``anti_main_page` 中 `isLoading` 判断改用 `Obx` 局部包裹
#### 问题2: Obx "improper use" 异常
- **根因**: 将整个页面用 `Obx` 包裹,但部分页面未直接访问 `.obs` 变量GetX 无法追踪
- **修复**: 所有页面改回 `GetBuilder` + controller 中所有数据修改方法添加 `update()` 调用
#### 问题3: 点击"开始记录"闪退
- **根因**: 只有 `antiMain` 路由有 `binding` 注册 `AntiController`其他6个子路由缺少 binding导航时 `Get.find<AntiController>()` 找不到 controller
- **修复**: 所有 anti 子路由添加 `binding: BindingsBuilder(() => Get.lazyPut(() => AntiController(), fenix: true))`
#### 问题4: Opacity 断言错误
- **根因**: `Curves.easeOutBack` 回弹曲线值超过1.0`Opacity` 要求值在 [0.0, 1.0] 范围
- **修复**: `opacity: value.clamp(0.0, 1.0)`
#### 涉及文件
- `anti_controller.dart` — 所有修改数据方法添加 `update()` 调用
- `anti_main_page.dart` — `GetBuilder` + 局部 `Obx` 包裹 `isLoading`
- `anti_detail/add/heatmap/rating/tags/list_page.dart` — 改回 `GetBuilder`
- `app_routes.dart` — 所有 anti 路由添加 binding + fenix: true
- `anti_empty_state.dart` — opacity clamp 修复
---
## [0.99.38] - 2026-04-24
### 🧹 清理 — 排敏模块(anti) 135项分析警告清零
#### 修复Warnings (5项)
- `_isSubmitting` 未使用 → 添加到保存按钮防重复提交逻辑
- `dead_code` / `dead_null_aware_expression` → `as String` 改为 `as String?`
- `_hoveredIndex` 未使用 → 移除
- `isHalfFilled` 未使用 → 移除
#### 修复Deprecated (119项)
- `withOpacity()` 全部替换为 `withValues(alpha:)` (14个文件)
#### 修复Info (11项)
- `use_build_context_synchronously` → 添加 `mounted` 检查 + `// ignore` 注释
- `prefer_final_fields` → `_selectedTags` 改为 `final`
- `unnecessary_import` → 移除冗余 `cupertino.dart` 导入
- `strict_top_level_inference` → `var` 改为具体类型 `AllergenElimination`
---
## [0.99.37] - 2026-04-24
### ✨ 新增 + 🐛 修复 — 身体分析新增9项指标 + Conicity Index单位修复
#### 新增指标
- 🔬 **科学指数Tab** +4项
- 🏋️ FFMI 无脂肪质量指数 + 标准化FFMI + 等级判定
- 📐 Ponderal 体重指数Rohrer指数BMI改进版
- ⚡ 基础代谢效率 (BMR/kg)
- 🔔 锥度指数 (Conicity Index需腰围)
- 🎮 **趣味统计Tab** +5项
- 🫁 一生呼吸总次数
- 👁️ 一生眨眼总次数
- 🧴 一生皮肤细胞脱落量
- 🍽️ 一生消耗食物总重量
- 🚶 一生行走距离估算
#### 🐛 Bug修复
- 修复 Conicity Index 计算公式中 waist 单位错误cm→m原结果偏大约1000倍
#### 验证
- 新增 `scripts/test_body_analysis.dart` 算法验证脚本59项测试全部通过
- 运行: `dart run scripts/test_body_analysis.dart`