# Changelog All notable changes to this project will be documented in this file. ## [0.99.24] - 2026-04-21 ### ✨ 新功能 — 意见反馈系统重构:5轮对话+双发邮件+本地存储 #### 功能概述 将原有的简单聊天式意见反馈页面重构为完整的**状态机驱动反馈系统**,支持5轮结构化对话、邮件双发(管理员+用户自动回复)、设备信息收集、本地持久化存储和防滥用限制。 #### 核心特性 - 🎯 **状态机架构**:采用有限状态机管理反馈流程(idle → selecting → chatting_1~4 → completed → sending → success/failed) - 💬 **5轮完整对话**:选择反馈类型(1轮) + 用户输入4条详细描述 = 共5轮交互 - 📧 **双发邮件机制**: - 第一封:发送到管理员(ad@avefs.com),包含完整对话记录+设备信息(UUID/IP/版本号)+系统日志 - 第二封:如果用户填写了邮箱,自动发送iOS风格确认邮件(含反馈编号、处理流程、联系方式) - 📱 **设备信息自动收集**:UUID、IP地址、应用版本、平台信息、操作系统版本、运行日志 - 💾 **本地持久化存储**:使用shared_preferences保存所有反馈会话历史(最多50条) - 🚫 **防滥用机制**: - 每日限制3次提交 - 冷却时间30分钟 - 跨天自动重置计数器 - 🎨 **iOS 26风格UI**: - 对话进度指示器(第X/4轮,剩余X轮) - 完成后显示提交面板(摘要卡片+邮箱输入+发送按钮) - 发送中状态指示器 - 成功/失败对话框(支持返回修改或重试或提交新反馈) #### 新增文件 - `lib/src/models/feedback_model.dart` — 数据模型定义 - `FeedbackState` 枚举(9种状态) - `FeedbackSessionStatus` 枚举(draft/sent/failed) - `DeviceInfo` 模型(uuid/ip/version/platform/logs) - `FeedbackMessage` 模型(text/isUser/type/timestamp) - `FeedbackSession` 模型(完整会话,支持不可变操作) - `lib/src/services/local/feedback_storage_service.dart` — 本地存储服务 - CRUD操作(save/getAll/get/delete/clearAll) - 限制检查(canSubmitFeedback/recordSubmission/resetDailyCount) - 自动跨天重置逻辑 - 最大50条历史记录限制 #### 修改文件 - `lib/src/pages/profile/social/chat_page.dart` — 完全重构为状态机驱动的反馈页面 - 状态转换逻辑(_advanceToNextRound/_completeConversation) - 设备信息收集(_createSession) - 邮件发送流程(_submitFeedback + 成功/失败对话框) - 动态底部UI切换(类型选择→输入栏→提交面板→发送中指示器) - 进度显示(当前轮次/剩余轮次) - 错误处理与重试机制 - `lib/src/services/data/business/email_service.dart` — 扩展邮件服务 - 新增 `sendFeedbackEmails()` 方法(双发入口) - 新增 `_sendFeedbackToAdmin()` (发送给管理员,iOS风格HTML模板) - 新增 `_sendAutoReplyToUser()` (自动回复给用户,绿色成功主题HTML) - 新增 `_buildFeedbackAdminHtml()` (管理员邮件模板:用户信息卡片+对话记录+系统日志) - 新增 `_buildFeedbackAutoReplyHtml()` (用户回复模板:感谢语+摘要+后续步骤+联系方式) - 新增 `_getBaseEmailStyles()` / `_buildInfoRow()` / `_escapeHtml()` 辅助方法 - 新增 `FeedbackSendResult` 结果类(success/adminSent/userSent/errorMessage) #### 技术亮点 - **不可变数据设计**:FeedbackSession使用不可变操作(addMessage/markAsCompleted等),每次返回新实例,便于状态追踪和调试 - **优雅降级**:设备信息获取失败不影响主流程(try-catch包裹每个采集点) - **用户体验优化**: - Bot引导语提示剩余轮次数 - 邮箱选填并明确提示用途 - 发送失败可返回修改或直接重试 - 成功后可选择返回或立即开始新反馈 - **邮件模板**: - 采用Apple SF Pro字体栈 - 响应式设计(移动端适配@media查询) - 渐变色头部(紫色主题/绿色成功主题) - 信息网格布局(2列自适应) - 对话消息区分样式(用户/Bot不同背景色) - 系统日志深色代码块样式 #### 使用示例 ```dart // 导航到反馈页面 Navigator.push(context, CupertinoPageRoute(builder: (_) => FeedbackPage())); // 用户流程: // 1. 选择类型(Bug/功能建议/体验优化/其他) // 2. 输入4条详细描述(带轮次提示) // 3. 查看摘要,可选填邮箱 // 4. 点击"📤 发送反馈" // 5. 收到成功提示(如填了邮箱还会收到确认邮件) ``` #### 后续扩展方向 - 🔮 反馈历史列表页面(查看已提交的反馈) - 🔮 管理后台集成(API对接替代SMTP直发) - 🔮 图片/截图附件支持 - 🔮 反馈分类统计图表 - 🔮 用户回复追踪(多轮客服对话) --- ## [0.99.23] - 2026-04-21 ### 🎨 UI优化 — 发送菜谱对话框线路选择样式重构 #### 修改内容 - 🎨 **线路1(官方线路1)URL脱敏显示**: - SMTP服务器地址中间部分用***代替(如 free***ing.com) - 保护服务器信息安全,避免完整URL暴露 - ✨ **线路2升级为VIP专属邮箱**: - 名称改为「✨ VIP 专属邮箱」,添加VIP标签和👑皇冠图标 - 采用紫色主题(#9B59B6),深浅模式均有专属背景色 - 锁定无法选择,右侧显示🔒锁定图标 - 隐藏详细配置信息(不显示用户名和服务器地址) - 副标题提示「高级会员专属线路,更稳定快速」 - 🔧 **新增URL脱敏方法**:`_maskUrl()` 对长URL进行中间部分遮蔽处理 - 📐 **布局优化**:收件人邮箱输入框移至发送线路选择上方,符合用户操作流程(先填写收件人,再选择线路) #### 修改文件 - `lib/src/widgets/recipe_detail/interaction/recipe_email_button.dart` — 线路选择UI重构+VIP样式+URL脱敏 ## [0.99.22] - 2026-04-21 ### ✨ 新功能 — 美食年轮:可视化美食旅程档案 #### 修复 - 🐛 修复美食年轮页面数据不实时更新的问题:用 Obx 包裹内容区域,通过迭代 RxList 和访问 RxMap.values 注册响应式依赖(.length/.count 不会触发 GetX 响应式通知) - 🐛 修复浏览记录/笔记/分享记录数据丢失的竞态条件:控制器使用 lazyPut 延迟初始化,onInit 中异步加载历史数据未完成时 addHistory/addNote/addRecord 已执行,导致空列表保存覆盖旧数据。添加 Completer 确保初始化完成后才执行写操作 - 🐛 修复 RecipeDetailController._recordBrowseHistory 未 await addHistory 的问题 - 🐛 修复月度足迹收藏数显示0的问题:FeedItemModel.fromJson 反序列化时缺少 'createdAt' key 匹配(保存用 'createdAt',读取只查 'created_at'/'post_time'),导致从 Hive 加载后 createdAt 为 null #### 修改内容 - ✨ **美食年轮页面**: - 新增「美食年轮」页面,聚合浏览/收藏/笔记/评分数据,生成可视化美食旅程档案 - 🎯 **Hero总览区**:圆形年轮动画展示使用天数,外圈随浏览量动态增长 - 📊 **数据总览**:4格统计卡片(浏览菜谱数/收藏数/笔记数/评分数) - 🧬 **味觉DNA**:6维雷达图(辣/甜/咸/酸/鲜/香),基于口味偏好设置和浏览数据推断,显示味觉人格类型 - 🏆 **美食里程碑**:9项成就时间线(初识美食/探索者/资深食客/百科/心动时刻/收藏家/记录者/品鉴师/全能美食家) - 📅 **月度足迹**:最近3个月活动摘要,含浏览/收藏/笔记/评分数量和热门分类 - 🍜 **菜系探索度**:环形图展示已探索菜系种类和占比 - 入口位于设置页「🚀 功能」区域,图标 CupertinoIcons.circle_grid_3x3 #### 修改文件 - `lib/src/pages/profile/data/food_timeline_page.dart` — 新建,美食年轮页面 - `lib/src/config/app_routes.dart` — 新增 foodTimeline 路由定义和页面注册 - `lib/src/pages/profile/profile_settings.dart` — 功能区域新增美食年轮入口 ## [0.99.21] - 2026-04-21 ### 🖥️ Windows 桌面端修复 — 图标清晰度/窗口宽度/中文乱码 #### 修改内容 - 🎨 **图标清晰度修复**: - 从 `icon_1024x1024.png` 重新生成 ICO,包含 17 种尺寸(16~256px) - 窗口类注册改用 `WNDCLASSEX` + `RegisterClassEx`,分别设置 `hIcon` 和 `hIconSm` - `LoadImage` 显式加载 256×256 大图标 + 48×48 小图标,替代 `LoadIcon`(仅 32×32) - 窗口创建后通过 `WM_SETICON` 设置 `ICON_BIG` 和 `ICON_SMALL` - DPI 变化时(`WM_DPICHANGED`)重新加载图标 - 安装脚本添加 `ie4uinit.exe -show` 自动刷新图标缓存 - 📐 **窗口加宽**: - 默认宽度从 420px 调整为 520px - 最小宽度从 360px 调整为 480px - 🔤 **中文乱码修复**: - CMakeLists.txt 添加 `/utf-8` 编译选项,解决 MSVC 默认 GBK 编码导致中文标题乱码 - 📦 **打包配置修复**: - Inno Setup 压缩格式改为 `lzma2/max`(兼容 6.7.1) - 权限改为 `PrivilegesRequired=lowest`(兼容 6.7.1) - 下载并安装 ChineseSimplified.isl 中文语言包 #### 修改文件 - `windows/runner/win32_window.cpp` — 图标加载改用 LoadImage 256px + WM_SETICON + DPI 重载 - `windows/runner/main.cpp` — 窗口宽度 420→520 - `windows/CMakeLists.txt` — 添加 /utf-8 编译选项 - `windows/runner/resources/app_icon.ico` — 重新生成 17 尺寸 ICO - `installer.iss` — 修复兼容性问题 + 添加图标缓存刷新代码 ## [0.99.20] - 2026-04-21 ### 🖥️ Windows 桌面端适配 — 窗口尺寸/图标/名称/交互/打包 #### 修改内容 - 🖥️ **窗口尺寸改为竖屏**: - 默认窗口从 1280×720(横屏)改为 420×800(手机比例竖屏) - 窗口启动自动居中显示 - 添加最小窗口尺寸限制(360×600),防止窗口过小导致布局异常 - 🎨 **应用图标和名称**: - 将 `assets/icons/icon_1024x1024.png` 转换为 ICO 替换 Windows 默认图标 - 窗口标题从 `mom_kitchen` 改为 `小妈厨房` - EXE 元数据更新:ProductName=小妈厨房,CompanyName=微风暴工作室 - 🖱️ **鼠标拖动滚动**: - 添加 `DesktopScrollBehavior`,支持鼠标拖拽滚动列表 - 同时支持触控板和触控笔拖拽 - ⌨️ **桌面端返回导航**: - 支持 `Alt+←` 键返回上一页 - 支持 `Backspace` 键返回上一页 - 支持 `BrowserBack` 键返回(鼠标侧键 XButton1) - 支持 `BrowserForward` 键前进(鼠标侧键 XButton2) - C++ 层处理 `WM_XBUTTONUP` 消息,将鼠标侧键转换为浏览器导航键 - 📦 **打包配置**: - 创建 Inno Setup 安装脚本 `installer.iss`,生成单个安装程序 EXE - 配置 `distribute_options.yaml` 支持 flutter_distributor 打包 - 安装程序支持中文界面、桌面快捷方式、安装后自动启动 #### 修改文件 - `windows/runner/main.cpp` — 窗口尺寸改为 420×800,标题改为「小妈厨房」 - `windows/runner/win32_window.cpp` — 窗口居中 + 最小尺寸限制(WM_GETMINMAXINFO) - `windows/runner/flutter_window.cpp` — 鼠标侧键支持(WM_XBUTTONUP) - `windows/runner/Runner.rc` — EXE 元数据更新 - `windows/runner/resources/app_icon.ico` — 替换为应用图标 - `lib/main.dart` — 添加 DesktopScrollBehavior + KeyboardListener(快捷键返回) - `installer.iss` — 新建,Inno Setup 安装脚本 - `distribute_options.yaml` — 新建,flutter_distributor 配置 ## [0.99.19] - 2026-04-21 ### ✨ 新功能 — 个人中心:用户卡片改为开发计划卡片 #### 修改内容 - ✨ **开发计划卡片**: - 用户信息卡片替换为「开发计划」卡片,点击弹出 Cupertino Sheet - Sheet 展示 12 项开发路线图,含状态标签(即将上线/开发中/规划中) - 路线图内容:多端适配、用户中心、工具中心、导出功能、菜品投稿、社区互动、智能推荐、食材管理、营养分析、多语言支持、云同步、消息通知 - 移除旧的登录/编辑/个性化按钮(登录功能暂不开发) - 移除 ProfileController 和 PersonalizationPage 依赖 #### 修改文件 - `lib/src/pages/profile/profile_home.dart` — 用户卡片改为开发计划卡片 + Sheet 弹窗 ## [0.99.18] - 2026-04-20 ### ✨ 新功能 — 今天吃什么:动态筛选(选项越多,匹配越少) #### 修改内容 - ✨ **动态筛选核心功能**: - 分类从 `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及之前),功能已归档至软件特性清单。 > - 0.99.15: 公告页面(列表+下拉刷新+四种状态) > - 0.99.14: 外卖备注工具(口味/配送/整活分类+一键生成) > - 0.99.13: 菜谱外部搜索按钮+搜索后缀选择 > - 0.99.12: 邮件发送SSL握手失败+VPN代理检测+连接容错 > - 0.99.11: 邮件发送全链路修复(fallback配置/allowInsecure/限额计数/超时) > - 0.99.10: 邮件发送HandshakeException深度修复 > - 0.99.9: 邮件发送HandshakeException+备选端口 > - 0.99.8: 移除flutter_dotenv依赖 > - 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: 口味偏好持久化 + 菜品详情页偏好标注 > - 0.98.6: 软件信息页面图标/参考文献扩充/偏好设置重写/路由修复 > - 0.98.5: 软件信息页面 + 了解我们页面 > - 0.98.4: 小妈菜园交互优化 + 商店布局修复