feat: 新增公告功能及外卖备注工具

新增公告功能接口及页面,支持查看最新公告信息
添加外卖备注工具,可管理常用备注并一键生成
优化动态筛选接口,支持多分类和标签组合筛选
移除flutter_dotenv依赖,不再使用.env文件
修复布局溢出错误处理逻辑,避免生产环境报错
新增文件选择器插件,替换receive_sharing_intent实现文件导入
This commit is contained in:
Developer
2026-04-20 08:21:40 +08:00
parent 5667435b56
commit b1acdbdf05
43 changed files with 8269 additions and 2029 deletions

View File

@@ -3,216 +3,293 @@
All notable changes to this project will be documented in this file.
## [0.99.6] - 2026-04-19
## [0.99.18] - 2026-04-20
### 🐛 Bug 修复 — 帮我做决定转盘指针指向分界线
### ✨ 新功能 — 今天吃什么:动态筛选(选项越多,匹配越少)
#### 修改内容
-**动态筛选核心功能**
- 分类从 `api_filter.php` 加载(大类+子类),标签和匹配数从 `filter_steps` 动态更新
- 选择分类/标签后实时刷新匹配数和可用标签,选项越多匹配越少
- 标签显示对应菜谱数量0匹配标签自动禁用+删除线
- 过敏原排除功能(客户端过滤)
- 300ms 防抖避免频繁请求
- 🔧 **API 扩展**
- `api_what_to_eat.php``filter_steps` 新增 `available_tags` 返回标签+数量
- 分类选择自动展开子分类支持3级递归
- `filter_apply` 同步支持分类展开逻辑
- 📁 **文件拆分**
- `what_to_eat_page.dart`1053行拆分为3个文件
- `what_to_eat_page.dart` — 主页面骨架(~168行
- `widgets/what_to_eat_result_card.dart` — 结果卡片+操作按钮(~280行
- `widgets/what_to_eat_filters.dart` — 分类/标签/过敏原筛选+公共组件(~470行
- 🧪 **接口验证脚本**`scripts/test_filter_steps.dart` 验证动态筛选效果
#### 修改文件
- `lib/src/pages/discover/what_to_eat_page.dart` — 重写为精简主页面
- `lib/src/pages/discover/widgets/what_to_eat_result_card.dart` — 新建,结果卡片组件
- `lib/src/pages/discover/widgets/what_to_eat_filters.dart` — 新建,筛选组件集合
- `lib/src/controllers/tools/what_to_eat_controller.dart` — 重写,动态筛选+防抖
- `lib/src/repositories/what_to_eat_repository.dart` — 新增 fetchFilterSteps 方法
- `docs/api/api_what_to_eat.php` — filter_steps 新增 available_tags
- `scripts/test_filter_steps.dart` — 新建,接口验证脚本
## [0.99.17] - 2026-04-20
### 🐛 Bug 修复 — 收藏页搜索框高度不足比例不协调
#### 修改内容
- 🐛 **修复收藏页搜索框高度不足**
- `GlassContainer` 增加 `vertical: DesignTokens.space2` 垂直内边距
- `CupertinoTextField``padding``EdgeInsets.zero` 改为 `EdgeInsets.symmetric(vertical: DesignTokens.space2)`
- 搜索框整体高度增加,与页面其他元素比例更协调
#### 修改文件
- `lib/src/pages/profile/social/favorites_page.dart` — 搜索框高度修复
### ✨ 新功能 — 数据管理中心:菜谱分类+食材分类,均显示大类+小类层级结构
#### 修改内容
-**新增食材分类卡片**
- 使用 `fetchIngredientMainCategories()` + `fetchIngredientSubCategories()` 接口
- 标签卡显示「X大类 · Y小类」teal 主题色
- 详情弹窗展示层级结构:大类可展开/折叠显示小类
- 大类显示食材数量和小类数量,小类显示食材数量
- 🔧 **菜谱分类数据修正**
- 数据源从 `fetchCategories()` 改为 `fetchMainCategories()` + `fetchRecipeSubCategories()`
- 标签卡显示从「X类」改为「X大类 · Y小类」
- 详情弹窗从平铺列表改为层级结构:大类可展开/折叠显示小类
- `LocalDataService` 新增 `getRecipeCategories()`/`syncRecipeCategories()``getIngredientCategories()`/`syncIngredientCategories()` 及缓存管理
- `syncAll()` 同步流程新增菜谱分类和食材分类同步步骤
#### 修改文件
- `lib/src/pages/profile/data/data_center_page.dart` — 新增食材分类卡片和弹窗,菜谱分类层级展示
- `lib/src/services/data/storage/local_data_service.dart` — 新增菜谱分类和食材分类方法及缓存
## [0.99.16] - 2026-04-20
### 🐛 Bug 修复 — 运营数据大屏 + 依赖替换 + Release模式布局溢出过滤
#### 修改内容
- 📝 **Release 模式过滤布局溢出错误**
- `main.dart``FlutterError.onError` 在 release 模式下跳过布局溢出类错误overflowed/renderflex/hasSize等
- `crash_guard_service.dart``CupertinoDialogReportMode` 在 release 模式下自动拒绝布局溢出报告,不弹对话框
- debug 模式不受影响,仍会正常展示所有错误
- 📝 **运营数据大屏修复**
- 修复 `StatsRepository` 使用 `ApiResponse.fromJson(null)` 导致 data 永远为 null 的 bug
- 新增「🗄️ 数据库概览」「🔌 接口调用分布」「🏆 热门排行 TOP5」板块
- 📝 **依赖替换 `receive_sharing_intent` → `file_picker_ohos`**
- 删除 `pubspec.yaml``receive_sharing_intent` 依赖
- `data_export_page.dart` 改用 `FilePicker.platform.pickFiles()` 选择 JSON 文件导入
#### 修改文件
- `lib/main.dart` — release 模式过滤布局溢出错误
- `lib/src/services/system/crash_guard_service.dart` — release 模式跳过布局溢出报告
- `lib/src/repositories/online_repository.dart` — 修复数据解析bug新增fetchBasicStats()
- `lib/src/pages/profile/data/stats_dashboard_page.dart` — 重写页面,热门排行替代月度趋势
- `lib/src/pages/profile/tools/data_export_page.dart` — 移除receive_sharing_intent改用file_picker_ohos
- `pubspec.yaml` — 删除receive_sharing_intent依赖
## [0.99.15] - 2026-04-20
### ✨ 新功能 — 公告页面
#### 功能描述
- 新增「📢 公告」页面,展示系统公告列表
- API接口: `https://yy.vogov.cn/api/app/notice_api.php`
- 支持下拉刷新CupertinoSliverRefreshControl
- 四种状态展示:加载中 / 加载失败(含重试) / 暂无公告 / 公告列表
- 公告卡片含编号、内容、作者、创建/更新时间
- 列表底部"到底了"提示
- 个人中心「营销信息」改为「📢 公告」,点击跳转公告页面
- 全部使用 DesignTokens深色模式完整支持
#### 修改文件
- `lib/src/pages/profile/info/notice_page.dart` — 新增公告页面
- `lib/src/config/api_config.dart` — 新增 noticeBaseUrl 和 notice 接口配置
- `lib/src/config/app_routes.dart` — 添加路由 /notice
- `lib/src/pages/profile/profile_home.dart` — 营销信息改为公告入口
## [0.99.14] - 2026-04-20
### ✨ 新功能 — 外卖备注工具
#### 功能描述
- 新增「🛵 外卖备注」工具页面,支持管理外卖常用备注
- 三大分类:🌶️ 口味、🛵 配送、🎭 整活,各含默认备注模板
- 口味:少盐、少油、少糖、微辣、不要辣等 14 条
- 配送:放门口、不要敲门、尽快送达等 11 条
- 整活:画个笑脸、写句鼓励的话等 10 条
- 支持选择备注 → 一键生成组合备注 → 复制到剪贴板
- 支持添加/编辑/删除自定义备注
- 偏好设置页「偏好摘要」新增「添加备注」按钮,一键将偏好摘要写入外卖备注
#### 修改文件
- `lib/src/pages/tools/cooking/takeout_note_page.dart` — 新增外卖备注页面(分类管理、默认备注、增删改查、一键生成)
- `lib/src/models/app/tool_item_model.dart` — ToolRegistry 注册新工具
- `lib/src/config/app_routes.dart` — 添加路由 /tools/takeout-note
- `lib/src/pages/profile/settings/preference_page.dart` — 偏好摘要增加一键添加备注按钮
## [0.99.13] - 2026-04-20
### ✨ 新功能 — 菜谱外部搜索按钮 + 搜索后缀选择
#### 功能描述
- 在菜谱详情页邮件按钮右侧新增「🔍 搜索」按钮(按钮移至相似菜品上方)
- 点击弹出 Cupertino 风格底部弹窗,展示搜索引擎选择列表
- 支持 4 个搜索引擎百度、Google、Bing、DuckDuckGo2x2 网格布局)
- 新增搜索后缀选择标签:👨‍🍳怎么做、😋好吃吗、💪功效、🍽️相关菜品、✏️自定义
- 选择后缀后搜索关键词自动拼接(如「番茄炒蛋 怎么做」)
- 自定义后缀支持输入任意关键词
- 预览卡片实时显示最终搜索关键词
- 选择后使用 `url_launcher` 在外部浏览器中搜索
#### 修改文件
- `lib/src/widgets/recipe_detail/interaction/recipe_email_button.dart` — 新增 SearchEngine 枚举 + 搜索按钮 + 搜索后缀选择 + 2x2 网格 + 浏览器跳转
- `lib/src/pages/home/recipe_detail_page.dart` — 邮件+搜索按钮移至相似菜品上方
## [0.99.12] - 2026-04-19
### 🐛 Bug 修复 — 邮件发送SSL握手失败 + VPN代理检测 + 连接容错
#### 问题描述
- **转盘指针总是指向扇区分界线**:旋转结束后指针停在两个扇区的交界线上,而非内容区域中心
- **465/SSL HandshakeException**`SecureSocket.connect`直接SSL握手失败延迟SSL升级也失败后无回退
- **587/STARTTLS Socket关闭**VPN代理拦截SMTP流量服务器不发问候就关闭连接
- **DNS解析到VPN代理IP**`198.18.14.246`等虚拟IP代理不正确转发SMTP协议
- **关闭VPN代理后邮件发送成功**确认根因为VPN/代理拦截SMTP连接
#### 修复方案
- 📝 **修改 `packages/mailer/lib/src/smtp/connection.dart`**
- SSL直连失败 → 延迟SSL升级 → 升级也失败则回退到明文连接由STARTTLS机制处理加密
- 三级容错策略:`SecureSocket.connect``Socket.connect + SecureSocket.secure``Socket.connect(明文)`
- 📝 **修改 `lib/src/services/data/business/email_service.dart`**
- DNS预解析新增VPN/代理IP检测`198.18.x`/`10.x`/`172.16.x`/`127.x` 等代理地址段
- 检测到代理IP时输出警告日志建议关闭VPN
- `MailerException` 细化错误提示:`SmtpUnsecureException`/`SmtpClientAuthenticationException`/`SmtpNoGreetingException`/`SmtpClientCommunicationException` 各有专属提示
- `HandshakeException``Socket was closed` 错误提示增加"建议关闭VPN后重试"
#### 修改文件
- `packages/mailer/lib/src/smtp/connection.dart` — SSL三级容错策略
- `lib/src/services/data/business/email_service.dart` — VPN检测 + 错误提示优化
## [0.99.11] - 2026-04-19
### 🐛 Bug 修复 — 邮件发送全链路修复fallback配置/allowInsecure/限额计数/超时)
#### 问题描述
- **邮件发送持续失败**:服务器正常但所有端口尝试均失败
- **根因分析**(全链路追踪 调用端→发送端→结果端):
1. `587/SSL` fallback配置根本性错误587端口是STARTTLS端口不支持直接SSL连接`ssl:true`导致SecureSocket握手必然失败
2. `25/明文` fallback无实际意义绝大多数ISP封禁25端口防垃圾邮件
3. `allowInsecure: !ssl` 逻辑陷阱STARTTLS fallback时`allowInsecure=true`若服务器不支持STARTTLS则明文发送凭证现代SMTP服务器会拒绝
4. QQ邮箱使用账号密码而非授权码QQ SMTP需要设置中生成的授权码账号密码会触发认证失败
5. 每日限额计数包含`sending`状态app崩溃后残留的sending记录占额度导致限额耗尽
6. 无发送超时配置移动网络下默认60秒等待过长
#### 修复方案
- 📝 **修改 `email_service.dart`**
- 移除`587/SSL``25/明文` fallback仅保留`587/STARTTLS`作为有效备选
- `allowInsecure`统一设为`false`确保STARTTLS必须升级成功否则抛出`SmtpUnsecureException`而非明文传凭证
- QQ邮箱密码改为授权码占位提示
- 自定义SMTP fallback同步移除`587/SSL`
- 添加`timeout: Duration(seconds: 30)`发送超时
- 新增`TimeoutException`专门捕获,提示连接超时
- 📝 **修改 `email_history_controller.dart`**
- `todaySentCount`仅计`success`状态,排除`sending`(崩溃残留)和`failed`
#### 修改文件
- `lib/src/services/data/business/email_service.dart` — fallback修正 + allowInsecure修复 + 超时配置 + QQ授权码
- `lib/src/controllers/user/email_history_controller.dart` — 限额计数仅计success
## [0.99.10] - 2026-04-19
### 🐛 Bug 修复 — 邮件发送 HandshakeException 深度修复
#### 问题描述
- **465端口SSL握手持续失败**`HandshakeException: Connection terminated during handshake`
- **587端口STARTTLS也失败**`Socket was closed even though a response was expected`
- **根因分析**
1. `extraSpins` 始终为整数5~9视觉旋转角度为 `extraSpins × 2π`,永远是完整圈数,转盘每次都回到起始位置
2. `_onSpinComplete` 中角度计算存在 `* 5` 遗留 bug 和 `+ π/2` 错误偏移
1. `ignoreBadCertificate: true` 仅控制证书验证无法修复TLS协议层握手失败
2. `SecureSocket.connect` 在Android设备上直接进行TLS握手某些服务器/网络环境下握手被中断
3. 之前只有单级备选465→587无法覆盖587端口SSL模式等场景
#### 修复方案
- 📝 **修改 `decision_maker_page.dart`**
- 采用"预选结果 + 精确角度"标准转盘方案
- 先随机选中目标扇区,再计算指针指向该扇区中心所需的精确旋转角度
- 在扇区内添加 ±30% 随机偏移,避免每次都指向正中心,更自然
- 移除 `_onSpinComplete` 中错误的角度反算逻辑,改用预设结果
#### 技术说明
- 标准转盘实现应先确定结果再计算动画,而非先动画再反算结果
- `startDegreeOffset: -90` 使第一个扇区从12点方向开始计算时无需额外偏移
- 📝 **修改 `packages/mailer/lib/src/smtp/connection.dart`**
- `connect()` 方法新增 HandshakeException 容错SSL直连失败后先建立明文TCP连接延迟200ms后再升级为SSL
- 此方案绕过 `SecureSocket.connect` 的TLS握手问题通过分步连接给服务器更多准备时间
- 📝 **修改 `lib/src/services/data/business/email_service.dart`**
- `SmtpRoute` 重构:`fallbackPort`/`fallbackSsl` 替换为 `List<SmtpFallback>` 多级备选
- 新增 `SmtpFallback` 类:支持 port/ssl/label 三元组配置
- 预设线路1新增3级备选587/STARTTLS → 587/SSL → 25/明文
- 预设线路2新增2级备选587/STARTTLS → 587/SSL
- `sendRecipeEmailCustom` 自定义SMTP也支持自动备选端口
- `HandshakeException` 错误提示更精确:标注"TLS协议层错误(非证书问题)"
- `SocketException` 新增连接拒绝识别:区分端口未开放 vs 网络故障
#### 修改文件
- `lib/src/pages/tools/cooking/decision_maker_page.dart` — 修复转盘旋转与结果计算逻辑
- `packages/mailer/lib/src/smtp/connection.dart` — SSL连接容错HandshakeException后分步重连
- `lib/src/services/data/business/email_service.dart` — 多级fallback + 自定义SMTP备选 + 错误提示优化
## [0.99.5] - 2026-04-19
## [0.99.9] - 2026-04-19
### 🐛 Bug 修复 — 发现页面 Dismissible 组件错误
### 🐛 Bug 修复 — 邮件发送 HandshakeException
#### 问题描述
- **发现页面热门列表 Dismissible 报错**右滑显示操作面板后Dismissible widget 未从树中移除,导致红色错误提示
- **错误信息**"A dismissed Dismissible widget is still part of the tree"
- **官方线路发送邮件失败**:连接 SMTP 服务器 465 端口时抛出 `HandshakeException: Connection terminated during handshake`
- **根因分析**
1. `SmtpServer` 未设置 `ignoreBadCertificate: true`,证书验证失败
2. 更深层原因465端口(隐式SSL)的TLS握手在Android设备上可能因服务器TLS配置变更/网络中间设备干扰而失败,`ignoreBadCertificate`仅控制证书验证无法修复TLS协议层握手失败
3. 587端口(STARTTLS)通常更稳定,因为先建立明文连接再升级加密
#### 修复方案
- 📝 **修改 `discover_sections_widget.dart`**
- 将右滑操作的 `confirmDismiss` 返回值从 `true` 改为 `false`
- 移除 `onDismissed` 回调中的显示操作面板逻辑
- 改为在 `confirmDismiss` 中直接调用 `_showQuickActions()` 并返回 `false`
- 这样 Dismissible 不会真正被 dismiss避免 widget 树不一致的错误
#### 技术说明
- Flutter 的 Dismissible 组件要求:当 `confirmDismiss` 返回 `true` 时,必须在 `onDismissed` 中立即移除该 widget
- 如果只是想展示操作面板而不删除 item应在 `confirmDismiss` 中处理并返回 `false`
- 📝 **修改 `email_service.dart`**
- `SmtpServer` 添加 `ignoreBadCertificate: true`
- `SmtpRoute` 新增 `fallbackPort`/`fallbackSsl` 备选端口配置
- 预设线路添加587端口(STARTTLS)作为备选
- `sendRecipeEmail` 主端口发送失败后自动尝试备选端口
- 新增 `HandshakeException` 专门捕获,提供更清晰的错误提示
#### 修改文件
- `lib/src/pages/discover/components/discover_sections_widget.dart` — 修复 Dismissible 逻辑
- `lib/src/services/data/business/email_service.dart` — SmtpServer ignoreBadCertificate + 备选端口 + 自动重试
---
## [0.99.4] - 2026-04-19
## [0.99.8] - 2026-04-19
### ✨ 新功能 — 分享记录管理页面
### 🔧 重构 — 移除 flutter_dotenv 依赖
#### 分享记录页面(🔗 分享管理)
- 📄 **新增 `share_record_model.dart`**:分享记录数据模型,支持文本/链接/二维码/邮件四种分享类型
- 🎮 **新增 `share_record_controller.dart`**分享记录控制器SharedPreferences 持久化,支持搜索/筛选/统计
- 📱 **新增 `share_records_page.dart`**iOS 26 Liquid Glass 风格分享记录页面,支持搜索、类型筛选、左滑删除、清空、重新分享、查看菜谱详情
- 🔗 **修改 `app_routes.dart`**:新增 `/share-records` 路由常量和页面映射
- 🏠 **修改 `profile_home.dart`**:分享记录入口图标改为 `CupertinoIcons.share`,路由指向新的分享记录页面
- 📤 **修改 `recipe_detail_controller.dart`**:分享菜谱时自动记录到分享历史
#### 变更说明
- **移除 flutter_dotenv 库**:不再需要运行时加载 `.env` 文件SMTP凭证改为代码直接配置
- **删除 `.env.example` 模板文件**:不再需要环境变量模板
- **移除 `.env` 资源声明**pubspec.yaml 中不再将 `.env` 作为 asset 打包
#### 修改文件
- `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` — 分享时自动记录
- `pubspec.yaml` — 移除 `flutter_dotenv: ^5.2.1` 依赖,移除 `.env` 资源声明
- `lib/main.dart` — 移除 `dotenv.load()` 初始化代码和 import
- `lib/src/services/data/business/email_service.dart` — SMTP凭证从 `dotenv.env[...]` 改为直接硬编码配置
- `.env.example` — 删除(不再需要)
## [0.99.3] - 2026-04-19
### ✨ 新功能 — 评分记录管理页面
#### 评分记录页面(⭐ 评分管理)
-**新增 `rating_records_page.dart`**iOS 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.xml**`android: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.kts`**release 构建启用 `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.99.7及之前),功能已归档至软件特性清单。
> - 0.99.7: 邮件分享系统升级(HTML模板+限额+记录管理)
> - 0.99.6: 帮我做决定转盘指针指向分界线修复
> - 0.99.5: 发现页面Dismissible组件错误修复
> - 0.99.4: 分享记录管理页面(模型+控制器+页面+路由)
> - 0.99.3: 评分记录管理页面 + RatingRecordModel + RatingRecordsController + HiveService扩展
> - 0.99.2: 帮我做决定转盘工具 + 工具中心内容扩展
> - 0.99.1: 版本号同步 + Android应用名修正 + R8 Play Core警告修复
> - 0.99.0: Android Release包缓存失效/图片加载不出/浏览记录丢失修复
> - 0.98.10: 删除接口RESTful规范化
> - 0.98.9: 菜谱分享本地存储 + 3天自动过期清理
> - 0.98.8: 二维码分享URL生成 + PHP分享页面
> - 0.98.7: 口味偏好持久化 + 菜品详情页偏好标注