feat: 新增公告功能及外卖备注工具
新增公告功能接口及页面,支持查看最新公告信息 添加外卖备注工具,可管理常用备注并一键生成 优化动态筛选接口,支持多分类和标签组合筛选 移除flutter_dotenv依赖,不再使用.env文件 修复布局溢出错误处理逻辑,避免生产环境报错 新增文件选择器插件,替换receive_sharing_intent实现文件导入
This commit is contained in:
447
CHANGELOG.md
447
CHANGELOG.md
@@ -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、DuckDuckGo(2x2 网格布局)
|
||||
- 新增搜索后缀选择标签:👨🍳怎么做、😋好吃吗、💪功效、🍽️相关菜品、✏️自定义
|
||||
- 选择后缀后搜索关键词自动拼接(如「番茄炒蛋 怎么做」)
|
||||
- 自定义后缀支持输入任意关键词
|
||||
- 预览卡片实时显示最终搜索关键词
|
||||
- 选择后使用 `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:2,badge: '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: 口味偏好持久化 + 菜品详情页偏好标注
|
||||
|
||||
Reference in New Issue
Block a user