Files
kitchen/CHANGELOG.md
2026-04-19 04:17:54 +08:00

13 KiB
Raw Blame History

Changelog

All notable changes to this project will be documented in this file.

[0.99.6] - 2026-04-19

🐛 Bug 修复 — 帮我做决定转盘指针指向分界线

问题描述

  • 转盘指针总是指向扇区分界线:旋转结束后指针停在两个扇区的交界线上,而非内容区域中心
  • 根因分析
    1. extraSpins 始终为整数5~9视觉旋转角度为 extraSpins ×,永远是完整圈数,转盘每次都回到起始位置
    2. _onSpinComplete 中角度计算存在 * 5 遗留 bug 和 + π/2 错误偏移

修复方案

  • 📝 修改 decision_maker_page.dart
    • 采用"预选结果 + 精确角度"标准转盘方案
    • 先随机选中目标扇区,再计算指针指向该扇区中心所需的精确旋转角度
    • 在扇区内添加 ±30% 随机偏移,避免每次都指向正中心,更自然
    • 移除 _onSpinComplete 中错误的角度反算逻辑,改用预设结果

技术说明

  • 标准转盘实现应先确定结果再计算动画,而非先动画再反算结果
  • startDegreeOffset: -90 使第一个扇区从12点方向开始计算时无需额外偏移

修改文件

  • lib/src/pages/tools/cooking/decision_maker_page.dart — 修复转盘旋转与结果计算逻辑

[0.99.5] - 2026-04-19

🐛 Bug 修复 — 发现页面 Dismissible 组件错误

问题描述

  • 发现页面热门列表 Dismissible 报错右滑显示操作面板后Dismissible widget 未从树中移除,导致红色错误提示
  • 错误信息"A dismissed Dismissible widget is still part of the tree"

修复方案

  • 📝 修改 discover_sections_widget.dart
    • 将右滑操作的 confirmDismiss 返回值从 true 改为 false
    • 移除 onDismissed 回调中的显示操作面板逻辑
    • 改为在 confirmDismiss 中直接调用 _showQuickActions() 并返回 false
    • 这样 Dismissible 不会真正被 dismiss避免 widget 树不一致的错误

技术说明

  • Flutter 的 Dismissible 组件要求:当 confirmDismiss 返回 true 时,必须在 onDismissed 中立即移除该 widget
  • 如果只是想展示操作面板而不删除 item应在 confirmDismiss 中处理并返回 false

修改文件

  • lib/src/pages/discover/components/discover_sections_widget.dart — 修复 Dismissible 逻辑

[0.99.4] - 2026-04-19

新功能 — 分享记录管理页面

分享记录页面(🔗 分享管理)

  • 📄 新增 share_record_model.dart:分享记录数据模型,支持文本/链接/二维码/邮件四种分享类型
  • 🎮 新增 share_record_controller.dart分享记录控制器SharedPreferences 持久化,支持搜索/筛选/统计
  • 📱 新增 share_records_page.dartiOS 26 Liquid Glass 风格分享记录页面,支持搜索、类型筛选、左滑删除、清空、重新分享、查看菜谱详情
  • 🔗 修改 app_routes.dart:新增 /share-records 路由常量和页面映射
  • 🏠 修改 profile_home.dart:分享记录入口图标改为 CupertinoIcons.share,路由指向新的分享记录页面
  • 📤 修改 recipe_detail_controller.dart:分享菜谱时自动记录到分享历史

修改文件

  • lib/src/models/data/share_record_model.dart — 新建:分享记录模型
  • lib/src/controllers/data/share_record_controller.dart — 新建:分享记录控制器
  • lib/src/pages/profile/social/share_records_page.dart — 新建:分享记录页面
  • lib/src/config/app_routes.dart — 新增路由 + 页面映射 + PageInfo
  • lib/src/pages/profile/profile_home.dart — 分享记录入口路由修正
  • lib/src/controllers/recipe/recipe_detail_controller.dart — 分享时自动记录

[0.99.3] - 2026-04-19

新功能 — 评分记录管理页面

评分记录页面( 评分管理)

  • 新增 rating_records_page.dartiOS 26 Liquid Glass 风格的评分记录管理页面
    • 评分列表:展示用户所有评分记录,包含菜谱封面、名称、分类、星级、评分等级标签
    • 搜索功能:实时搜索评分记录(按菜谱名称/分类过滤)
    • 评分筛选按评分等级5分/4分/3分/2分/1分快速筛选
    • 排序功能:支持最新/最早/高分优先/低分优先四种排序
    • 批量管理:编辑模式下支持全选/批量删除评分记录
    • 统计信息:顶部展示总记录数、平均分、各评分等级数量
    • 导出功能:支持 JSON/CSV 导出评分记录
    • 空状态:无评分时展示引导用户去发现菜谱
    • 长按操作:长按评分卡片进入编辑模式
    • 点击跳转:点击评分卡片跳转到对应菜谱详情页
  • 📊 新增 RatingRecordModel:评分记录数据模型,支持 Hive 持久化
    • 包含recipeId、recipeTitle、coverImage、categoryName、score、ratedAt、type
    • 提供scoreLabel完美/推荐/一般/较差/不推荐、scoreEmoji、displayDate 等便捷属性
    • 支持fromJson/toJson/copyWith 序列化和复制
  • 🎮 新增 RatingRecordsController:评分记录控制器
    • 与 ActionController 的 ratedItems 同步,自动合并已有评分数据
    • 支持 Hive 持久化存储,应用重启后数据不丢失
    • 支持增删改查、搜索、筛选、排序、批量操作、统计、导出
  • 🗄️ HiveService 扩展:新增 ratingRecordBox 和 CRUD 方法
  • 🔗 路由注册:新增 /rating-records 路由
  • 🔄 profile_home.dart:评分记录入口从 favorites 路由改为 ratingRecords 路由

修改文件

  • lib/src/models/data/rating_record_model.dart — 新建:评分记录数据模型
  • lib/src/controllers/data/rating_records_controller.dart — 新建:评分记录控制器
  • lib/src/pages/profile/rating_records_page.dart — 新建:评分记录管理页面
  • lib/src/services/data/hive_service.dart — 扩展:新增评分记录 Box 和 CRUD 方法
  • lib/src/config/app_routes.dart — 新增路由常量和页面注册
  • lib/src/app_binding.dart — 新增 RatingRecordsController 全局注册
  • lib/src/pages/profile/profile_home.dart — 评分记录入口路由修正

[0.99.2] - 2026-04-19

新功能 — 帮我做决定转盘工具 + 工具中心内容扩展

帮我做决定(🎯 转盘决策工具)

  • 🎯 新增 decision_maker_page.dart:转盘随机决策工具页面
    • 支持模板模式:内置"今天吃什么"、"喝什么"、"做还是不做"、"去哪里玩"、"选哪个"5个预设模板
    • 支持自定义模式:用户自由添加/删除选项最多12个自动分配颜色和emoji
    • 旋转动画:使用 fl_chart PieChart 绘制扇形 + RotationTransition 实现流畅旋转动画Curves.decelerate 减速曲线)
    • 结果弹出动画ScaleTransition + FadeTransition 弹性弹出结果卡片
    • 触感反馈:结果确定时 HapticFeedback.mediumImpact()
    • 结果复制:一键复制决定结果到剪贴板
    • 决定历史记录最近10条决定结果支持清空
    • 指针组件CustomPainter 绘制顶部三角形指针,带阴影和白色边框
  • 🛤️ 路由注册:新增 /tools/decision-maker 路由
  • 📋 工具注册:在 ToolRegistry 中注册,分类为 cooking瀑布流展示 priority:2badge: 'NEW'

工具中心页面内容扩展

  • 精选推荐区域:横向滚动卡片展示推荐工具(帮我做决定、小妈菜园、烹饪计时器、点餐助手、每周菜单规划)
  • 🕐 最近使用区域按使用频率排序展示最近使用的4个工具显示使用次数
  • 🎬 入场动画增强:精选推荐和最近使用区域增加 SlideTransition + FadeTransition 交错动画
  • 🔍 搜索状态优化:搜索时隐藏推荐/最近区域,仅展示搜索结果

修改文件

  • lib/src/pages/tools/cooking/decision_maker_page.dart — 新建:帮我做决定页面
  • lib/src/pages/tools/tools_center_page.dart — 扩展:新增精选推荐/最近使用区域
  • lib/src/models/tool_item_model.dart — 新增 decision_maker 工具项
  • lib/src/config/app_routes.dart — 新增路由常量和页面注册

[0.99.1] - 2026-04-19

🔧 修复 — 版本号同步 + Android 应用名修正 + R8 Play Core 警告

版本号同步

  • 📌 pubspec.yaml:版本号从 0.96.0+95 同步更新至 0.99.1+100与 CHANGELOG 一致
  • 📱 profile_home.dart:底部版本号显示从 v0.88.5 更新至 v0.99.1
  • ⚙️ profile_settings.dart:底部版本号显示从 v0.88.5 更新至 v0.99.1

Android 应用名修正

  • 🏷️ AndroidManifest.xmlandroid:label 从 "mom_kitchen" 改为 "小妈厨房",与应用中文名一致

R8 Play Core 缺失类警告修复

  • 🛡️ proguard-rules.pro:添加 Play Core 分包安装相关类的 -dontwarn 规则
  • 🔧 原因Flutter 引擎引用了 com.google.android.play.core.splitinstall.* 等类,但项目未使用分包安装功能,这些类在运行时不会被调用
  • 效果:抑制 R8 编译时的 12 条 Missing class 警告

修改文件

  • pubspec.yaml — 版本号同步 0.96.0 → 0.99.1
  • lib/src/pages/profile/profile_home.dart — 版本号显示更新
  • lib/src/pages/profile/profile_settings.dart — 版本号显示更新
  • android/app/src/main/AndroidManifest.xml — 应用名改为中文
  • android/app/proguard-rules.pro — 添加 Play Core dontwarn 规则

[0.99.0] - 2026-04-19

🐛 修复 — Android Release 包缓存失效、图片加载不出、浏览记录丢失

根因分析

Release 包开启了 R8 代码混淆(isMinifyEnabled=true),但缺少 Proguard 规则文件, 导致 Hive、SharedPreferences、CachedNetworkImage 等依赖的反射类被混淆或移除, 序列化/反序列化失败 → 所有本地缓存数据丢失 → 图片无法加载 → 浏览记录为空。

修复内容

  • 🛡️ 新增 proguard-rules.pro:保护 Hive TypeAdapter、SharedPreferences、CachedNetworkImage、Dio 等反射类不被 R8 混淆
  • ⚙️ build.gradle.ktsrelease 构建启用 isMinifyEnabled=true + isShrinkResources=true 并引用 proguard 规则
  • 🔒 AndroidManifest.xml:添加 android:allowBackup=false 防止 Auto Backup 覆盖缓存;添加 android:networkSecurityConfig 确保 HTTPS 请求正常
  • 🌐 新增 network_security_config.xml:配置网络安全策略,允许访问 eat.wktyl.com 的 HTTPS 资源
  • 🧹 修复 RecipeImageCache.clearCache():原来传空字符串 evictFromCache('') 无效,改为使用 DefaultCacheManager().emptyCache() 正确清理

修改文件

  • android/app/proguard-rules.pro — 新建Proguard 混淆规则
  • android/app/build.gradle.kts — 启用代码压缩和混淆,引用 proguard 规则
  • android/app/src/main/AndroidManifest.xml — 添加 allowBackup/networkSecurityConfig
  • android/app/src/main/res/xml/network_security_config.xml — 新建:网络安全配置
  • lib/src/widgets/recipe/recipe_image.dart — 修复 RecipeImageCache.clearCache() 无效实现

[0.98.10] - 2026-04-18

🔧 重构 — 删除接口 RESTful 规范化

删除接口重构GET → DELETE

  • 🗑️ RESTful 规范:删除接口从 GET ?act=delete&id=xxx 改为 DELETE ?id=xxx
  • 🔒 CORS 配置:后端新增 DELETE 方法支持 (Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS)
  • 🔄 前端适配RecipeShareService.deleteRecipeShare()_dio.get() 改为 _dio.delete()
  • 📝 参数简化:删除操作不再需要 act=delete 参数,直接使用 HTTP 方法语义
  • 📚 文档同步API_DOC.md 新增删除接口详细说明,包含请求/响应示例

技术改进

  • 符合 RESTful 原则:使用正确的 HTTP 方法表达语义DELETE 表示删除)
  • 避免 GET 副作用GET 请求不应有副作用,删除操作必须使用非常规方法
  • 提升安全性:某些防火墙/代理会记录但不执行 GET 请求的副作用操作
  • 向后兼容:后端同时支持新旧两种方式(优先检测 DELETE 方法)

修改文件

  • docs/api/recipe_share.php — 添加 DELETE 方法支持、更新 CORS 配置、修改文件头注释
  • lib/src/services/data/recipe_share_service.dart — 删除方法改为 RESTful DELETE
  • docs/api/doc/API_DOC.md — 新增删除接口完整文档(参数、返回值、示例)

📌 已移除较早版本记录(0.98.9及之前),功能已归档至软件特性清单。

  • 0.98.9: 菜谱分享本地存储 + 3天自动过期清理
  • 0.98.8: 二维码分享URL生成 + PHP分享页面
  • 0.98.7: 口味偏好持久化 + 菜品详情页偏好标注
  • 0.98.6: 软件信息页面图标/参考文献扩充/偏好设置重写/路由修复
  • 0.98.5: 软件信息页面 + 了解我们页面
  • 0.98.4: 小妈菜园交互优化 + 商店布局修复