Files
kitchen/CHANGELOG.md
2026-04-15 07:11:28 +08:00

265 lines
17 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.
# Changelog
All notable changes to this project will be documented in this file.
## [0.96.1] - 2026-04-15
### 🐛 修复 — Flutter调试安装APK卡住 / Release构建找不到APK
#### Bug修复
- 🐛 **修复 `flutter run` 调试时 APK 安装一直卡在 "Installing build\app\outputs\flutter-apk\app-debug.apk..." 的问题**
- 原因:`local.properties` 中残留 `flutter.buildMode=release`/`flutter.versionName`/`flutter.versionCode` 等自动生成属性,干扰 Flutter 工具的构建模式判断和 APK 路径查找
- 修复:清理 `local.properties` 中的自动生成属性(这些属性由 Flutter 构建时自动写入,不应持久化)
- 修复:卸载设备上旧版本应用 + `flutter clean` 清理构建缓存
- 🐛 **修复 `flutter build apk --release` 构建后报 "Gradle build failed to produce an .apk file" 的问题**
- 原因:`android/build.gradle.kts` 中的构建目录重定向(`newBuildDir``../../build`)是 Flutter 新版模板的正确设计,误删后导致 APK 路径不匹配
- 修复:恢复 `build.gradle.kts` 中的 `newBuildDir` 重定向逻辑,确保 APK 输出到 `<项目根>/build/app/outputs/flutter-apk/`
## [0.96.0] - 2026-04-15
### 📧 菜谱邮件分享功能 — 发送菜谱详情到邮箱
#### 新增功能
- 🆕 **邮件分享按钮** — 菜谱详情页底部新增"📧 发送菜谱到邮箱"按钮
- 点击弹出底部对话框支持3种发送线路选择
- 🚀 官方线路1 (gg@0gg.cc via free.mboxhosting.com)
- ✉️ 官方线路2 (2821981550@qq.com via smtp.qq.com)
- 🔧 自定义SMTP用户填写服务器/账号/密码/端口)
- 支持纯文本+HTML双格式邮件包含菜谱标题、简介、食材、步骤、营养信息
- HTML邮件采用iOS风格设计渐变头部、圆角卡片、营养网格布局
- 邮件标题格式:🍳 {菜谱名称} — 小妈厨房菜谱分享
- 输入校验:邮箱格式、必填项检查
- 发送状态反馈发送中显示loading、成功/失败Toast提示
- 🆕 **EmailService** — 基于 `mailer` 库的SMTP邮件发送服务
- 多线路支持官方线路1/线路2/自定义SMTP
- 支持异常捕获MailerException/SocketException/通用异常
- Logger日志记录发送结果
- 发送成功/失败自动记录到 EmailHistoryController
- 🆕 **发件记录页面** — 足迹页统计栏新增📧发件记录入口
- 记录列表展示:菜谱标题、收件人、线路、状态、时间
- 左滑删除单条记录
- 清空全部记录
- 点击查看详情弹窗(收件人/发件人/服务器/线路/主题/状态/错误信息)
- 点击"查看菜谱"跳转菜谱详情
- 统计头部:总记录数 + 成功/失败数量标签
- 🆕 **EmailRecordModel** — 邮件发送记录模型SharedPreferences JSON持久化
- 🆕 **EmailHistoryController** — 邮件记录控制器最多200条记录
#### Dependencies
- 新增: mailer ^7.1.0
#### 影响文件
- `pubspec.yaml` — 添加 mailer 依赖
- `lib/src/services/data/email_service.dart` — 新建邮件发送服务(多线路+历史记录)
- `lib/src/widgets/recipe_detail/interaction/recipe_email_button.dart` — 新建邮件按钮组件
- `lib/src/models/data/email_record_model.dart` — 新建邮件记录模型
- `lib/src/controllers/data/email_history_controller.dart` — 新建邮件记录控制器
- `lib/src/pages/profile/social/email_history_page.dart` — 新建发件记录页面
- `lib/src/pages/profile/social/footprints_page.dart` — 统计栏增加发件记录入口
- `lib/src/pages/home/recipe_detail_page.dart` — 底部添加邮件按钮
- `lib/src/config/app_routes.dart` — 注册 /email-history 路由
## [0.95.0] - 2026-04-14
### 🔄 MiniCardPage 滑动引擎重构 — 引入 flutter_card_swiper
#### 重构
- 🔄 **自定义手势系统移除** — 移除 GestureDetector + 3个AnimationControllerexit/enter/bounce+ 手动拖拽追踪(_dragX/_dragY) 的自实现滑动系统
- 🔄 **引入 flutter_card_swiper ^7.2.0** — 使用专业 Tinder 风格卡片滑动库替代自实现
- CardSwiper 内置:滑动动画、回弹效果、堆叠缩放、旋转角度
- CardSwiperController 支持程序化控制swipe(direction)、undo()、moveTo(index)
- onSwipe/onUndo 回调统一处理 like/dislike/撤销逻辑
- 配置threshold=80, maxAngle=20, scale=0.92, duration=300ms, numberOfCardsDisplayed=2
#### 删除代码(-158行
- ~~_exitAnimController / _enterAnimController / _bounceAnimController~~ — 3个AnimationController
- ~~/_dragX / _dragY / _isDragging / _isAnimatingExit / _exitDirection / _exitStartX / _exitStartY~~ — 手势状态变量
- ~~/_swipeRight() / _swipeLeft() / _startExitAnimation() / _onExitComplete() / _goPrev() / _bounceBack() / _buildSwipeLabel()~~ — 7个手势方法
#### 新增代码(+30行
- `CardSwiperController _swiperController` — 程序化控制器
- `_handleSwipe(previousIndex, currentIndex, direction)` — 统一滑动回调
- `_handleUndo(previousIndex, currentIndex, direction)` — 撤销回调
- `CardSwiper` widget 替代原 `GestureDetector + Transform` 嵌套
#### 保留功能100%不变)
- ✅ 分类筛选 / 搜索 / 网格视图切换
- ✅ 收藏 / 分享 / 详情跳转 / 全屏查看器
- ✅ 图片预加载 / 本地缓存 / SharedPreferences持久化
- ✅ MiniCardImageView 组件(液态玻璃效果)
- ✅ MiniCardViewer 全屏查看器
#### Dependencies
- 新增: flutter_card_swiper ^7.2.0
#### 影响文件
- `pubspec.yaml` — 添加 flutter_card_swiper 依赖
- `lib/src/pages/discover/mini_card/mini_card_page.dart` — 核心重构1262行→1104行减少12.5%
- `lib/src/pages/discover/mini_card/mini_card_image_view.dart` — 分类描述提升为独立显眼行fontSm + 85%透明度 + 2行显示
#### 补充修复v0.95.0-hotfix
- 🐛 **卡片右侧空白** — CardSwiper padding 从 `horizontal:16` 改为 `EdgeInsets.zero`,内部 width 从 `maxW-32` 改为 `constraints.maxWidth`
- 🎨 **底部层叠效果** — 布局从 Column 重构为 Stack底部操作栏使用 `Positioned(bottom:0)` + `BackdropFilter(sigma:20)` + 渐变遮罩(0→0.95),卡片视觉延伸至按钮下方
- 🏷️ **分类栏**`_buildCategoryChips` 已正确遍历 `_meta.categories.entries`显示全部11个分类✨全部 🥬素菜 🥩荤菜 🦞水产 🌅早餐 🍚主食 🍲汤与粥 🧃饮品 🍰甜品 📦半成品加工 🪙酱料)
- 📝 **分类描述** — MiniCardImageView 已通过 `_meta.descriptions[recipe.category]` 获取对应分类描述,独立行显示
## [0.94.0] - 2026-04-14
### 🎬 迷你卡片动画系统重构 — 滑出飞走+入场弹性+回弹弹簧+图片预加载+缓存
#### 优化
- 🎬 **滑出飞走动画** — 拖拽超过阈值后,卡片带旋转+位移飞出屏幕easeIn加速不再瞬间跳变
- 🎬 **入场弹性动画** — 新卡片从 scale 0.88→1.0 + opacity 0→1 弹性进入easeOutBack回弹曲线
- 🎬 **回弹弹簧动画** — 拖拽未达阈值时卡片平滑弹回原位easeOut减速不再硬切
- 🎬 **下一张卡片联动** — 滑出过程中,下一张卡片从 scale 0.92→1.0 + opacity 0.6→1.0 逐渐浮现
- 🖼️ **图片预加载** — 切换卡片时 precacheImage 预加载后续3张图片消除转圈等待
- 🖼️ **CachedNetworkImage 替换** — MiniCardImageView/MiniCardViewer/MiniCardPage 全部替换 Image.network → CachedNetworkImage
- 磁盘缓存 maxWidthDiskCache/maxHeightDiskCache: 800/1200
- 内存缓存 memCacheWidth/memCacheHeight: 800
- fadeIn 300ms easeOut 渐入效果
- 🎬 **滑出动画期间禁止拖拽** — 防止动画中重复触发滑动手势
#### Bug修复
- 🐛 **动画控制器未绑定** — 原 _likeAnimController/_nopeAnimController 创建后从未驱动任何动画,卡片切换全靠 setState 硬切
- 🐛 **图片无缓存** — Image.network 每次切换都重新请求网络,导致转圈加载
#### 影响文件
- `lib/src/pages/discover/mini_card/mini_card_page.dart` — 动画系统重构+CachedNetworkImage+预加载
- `lib/src/pages/discover/mini_card/mini_card_image_view.dart` — CachedNetworkImage替换
- `lib/src/pages/discover/mini_card/mini_card_viewer.dart` — CachedNetworkImage替换
## [0.93.0] - 2026-04-14
### 🎨 视觉拉满 + 滚动卡顿修复 + 布局Bug修复
#### 优化
- 🎨 **液态玻璃效果拉满** — 迷你卡片3层BackdropFilter+光感折射+荤素标签玻璃效果
- 🎨 **底部栏恢复毛玻璃** — 瀑布流底部状态栏恢复BackdropFilter(sigmaX/Y:20)+渐变+边框
- 🖼️ **CachedNetworkImage** — 迷你卡片图片改用CachedNetworkImage避免滚动时重复网络请求
- 🏗️ **ValueNotifier隔离** — 副栏显隐状态改用ValueNotifier不再触发全局setState重建瀑布流
- 🏗️ **merge保留缓存** — DiscoverData.merge()保留已有flattenedItems缓存并追加新项避免重新shuffle导致滚动跳动
- 🏗️ **RepaintBoundary** — 迷你卡片添加RepaintBoundary隔离渲染不影响其他卡片绘制
#### Bug修复
- 🐛 **滚动卡顿** — 移除_applyPendingDiscoverIfAny中的clearCache()调用避免滚动中列表重新shuffle
- 🐛 **Column溢出** — 错误页和空数据页改用SingleChildScrollView包裹防止溢出
- 🐛 **SliverMasonryGrid null check** — 空chunk不再创建SliverMasonryGrid防止null check错误
- 🐛 **tag_discover_card溢出** — 标签类型和数量文字添加Flexible包裹防止Row溢出
- 🐛 **image_viewer_page** — _extractImageUrl改为imageUrlExtractor回调参数修复未定义方法错误
- 🐛 **discover_waterfall Colors** — 添加material导入修复Colors未定义错误
- 🐛 **主页缓存恢复** — _loadDiscover已有数据时使用merge而非替换保持列表顺序稳定
#### 影响文件
- `lib/src/pages/home/home_page.dart` — ValueNotifier隔离+merge策略+布局修复
- `lib/src/widgets/discover/mini_card_discover_card.dart` — 液态玻璃拉满+CachedNetworkImage+RepaintBoundary
- `lib/src/widgets/discover/discover_waterfall.dart` — 底部栏毛玻璃+空chunk保护+material导入
- `lib/src/widgets/discover/tag_discover_card.dart` — Row溢出修复
- `lib/src/models/discover_model.dart` — merge保留flattenedItems缓存
- `lib/src/widgets/image_viewer/image_viewer_page.dart` — imageUrlExtractor回调
## [0.92.9] - 2026-04-14
### 🃏 迷你卡片优化 — 液态玻璃效果+详情跳转+Bug修复
#### 优化
- 🎨 **液态玻璃效果重设计** — 底部信息区改为"装水玻璃杯"效果
- 使用 ClipRect + BackdropFilter(sigmaX/Y: 30) 实现高斯模糊
- 顶部白色半透明边框(0.25 alpha)模拟光线折射
- 渐变背景(0.05→0.12 alpha)模拟水杯透明度
- 文字添加 Shadow(black54/black38) 增强可读性
- 按钮使用渐变玻璃效果(0.25→0.1 alpha)替代纯色
- 🆕 **categoryName 显示** — 迷你卡片底部信息区显示分类名称标签(液态玻璃胶囊样式)
- 🆕 **详情按钮API搜索** — 点击详情按钮通过 RecipeRepository.search() 搜索菜名获取API真实ID再跳转菜谱详情页
- 🆕 **全屏查看器详情按钮** — 全屏查看器中详情按钮也通过API搜索跳转
#### Bug修复
- 🐛 **setState after dispose** — _goNext()/_goPrev() 添加 mounted 检查,防止动画回调在页面销毁后调用 setState
- 🐛 **MediaQuery initState 报错** — 图片预加载从 initState 移至 didChangeDependencies
- 🐛 **分享功能改为图片分享** — 使用 RepaintBoundary 截取卡片组件为PNG图片通过 ShareXFiles 分享
- 🐛 **PaginatedData 缺少 totalPages** — 补充必需参数
#### 影响文件
- `lib/src/pages/discover/mini_card_page.dart` — 液态玻璃重设计+详情跳转+Bug修复
## [0.92.8] - 2026-04-14
### 🃏 迷你卡片页面 — Tinder风格滑动浏览菜品 + 首页瀑布流插入
#### 新增功能
- 🆕 **迷你卡片页面** — 交友软件风格左右滑动浏览菜品
- 数据源:`/assets/recipes.json`341道菜11个分类
- 图片URL`https://eat.wktyl.com/api/assets/mpic/{id}.jpeg`
- 左右拖拽滑动切换菜品卡片,拖拽距离>80触发滑动
- 滑动时显示"❤️ 喜欢"或"👎 下一道"标签
- 底部4个操作按钮下一道/收藏/喜欢/上一道
- 进度条显示浏览进度
- 🆕 **分类筛选** — 顶部横向滚动分类标签(全部/素菜/荤菜/水产等11类
- 🆕 **搜索功能** — 搜索菜品名称,点击结果跳转到对应卡片
- 🆕 **网格视图** — 卡片/网格双视图切换响应式布局2/3/4列
- 🆕 **收藏集成** — 卡片右上角收藏按钮,与全局收藏系统联动
- 🆕 **本地缓存** — SharedPreferences存储5-10条记录不含图片离线fallback
- 🆕 **喜欢/不喜欢记录** — 持久化到SharedPreferences重启保留
- 🆕 **缓存管理** — 缓存管理页面新增迷你卡片缓存清理入口
- 🆕 **图片独立组件** — _MiniCardImageView 独立组件,文本在图片内底部展示
- 🆕 **液态玻璃效果** — 卡片顶部操作栏和底部信息区使用 GlassContainer 毛玻璃
- 🆕 **全屏图片查看器** — 点击卡片打开全屏 PageView左右滑动切换异步预加载5张相邻图片
- 🆕 **分享按钮** — 使用 share_plus 分享菜品信息+图片URL
- 🆕 **缓存优先加载** — 查看过的卡片存入缓存,下次进入先显示缓存再内部加载
- 🆕 **首页瀑布流插入** — 迷你卡片以全宽横幅插入首页瀑布流1:20比例
- 每20个瀑布流item后插入1个迷你卡片横幅
- 点击横幅跳转迷你卡片页面支持指定卡片ID
- MiniCardDiscoverCard 组件:液态玻璃+全宽图片+分类标签
- 🆕 **MiniCardService** — 独立数据服务,支持缓存优先,供多页面复用
- 🆕 **路由参数支持** — 迷你卡片页面支持 initialRecipeId 参数,从首页跳转到指定卡片
#### 入口
- 个人中心 → 迷你卡片原null路由已连接
- 首页瀑布流 → 迷你卡片横幅每20个item后出现
#### 影响文件
- `lib/src/models/mini_card_model.dart` — 新建数据模型
- `lib/src/pages/discover/mini_card_page.dart` — 重构:图片独立组件+全屏查看器+分享+缓存优先
- `lib/src/config/app_routes.dart` — 路由支持 initialRecipeId 参数
- `lib/src/pages/profile/profile_home.dart` — 连接入口
- `lib/src/pages/profile/data/cache_manage_page.dart` — 新增迷你卡片缓存管理
- `lib/src/widgets/discover/mini_card_discover_card.dart` — 新建瀑布流迷你卡片横幅组件
- `lib/src/widgets/discover/discover_waterfall.dart` — 支持迷你卡片插入SliverMainAxisGroup
- `lib/src/models/discover_model.dart` — 新增 miniCard 类型和 MiniCardRecipeRef
- `lib/src/services/data/mini_card_service.dart` — 新建迷你卡片数据服务
- `lib/src/pages/home/home_page.dart` — 加载迷你卡片数据,传递给瀑布流
## [0.92.7] - 2026-04-14
### 🧬 营养成分交互增强 + 食材详情页修复
#### 新增功能
- 🆕 **营养成分展开更多** — 菜品详情页详细营养成分标题右侧新增"更多"按钮
- 点击弹出底部对话框CupertinoModalPopup从下到上弹出
- 每个营养成分显示emoji图标+名称+数值+跳转提示
- 点击营养成分跳转到含该成分的菜品列表页
- 营养成分emoji映射表31种营养成分对应emoji
- 🆕 **营养成分菜品列表页** — 新增 NutritionRecipeListPage
- 使用 `api_filter.php?act=filter_recipes&nutrition_name=` 接口查询
- 支持分页加载,显示菜品卡片+图片
- 路由: `/nutrition-recipe-list`
#### 修复内容
- 🐛 **食材详情菜谱数量显示0** — 修复 `recipeCount` 始终为0的问题
- 根因API `ingredient_detail` 不返回 `statistics` 字段,但返回 `related_recipes` 数组
- 修复IngredientModel 新增 `relatedRecipes` 字段和 `effectiveRecipeCount` getter
-`statistics.recipeCount` 为0时fallback 到 `related_recipes.length`
- 同时支持 `recipe_count``view_count` 顶层字段
- 🔧 **食材详情卡片位置调整** — 将"食材详情"卡片移到"储存方法"下面
#### 影响文件
- `lib/src/widgets/recipe_detail/info/recipe_nutrition_section.dart` — 新增展开更多+弹窗+跳转
- `lib/src/pages/discover/nutrition_recipe_list_page.dart` — 新建
- `lib/src/config/app_routes.dart` — 新增路由
- `lib/src/models/recipe/ingredient_model.dart` — 新增relatedRecipes+effectiveRecipeCount
- `lib/src/pages/tools/ingredient_detail_page.dart` — 修复count+调整卡片顺序
> 📌 已移除较早版本记录(0.92.6及之前),功能已归档至软件特性清单。