19 KiB
19 KiB
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不同背景色)
- 系统日志深色代码块样式
使用示例
// 导航到反馈页面
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服务器地址中间部分用代替(如 freeing.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 编码导致中文标题乱码
- CMakeLists.txt 添加
- 📦 打包配置修复:
- Inno Setup 压缩格式改为
lzma2/max(兼容 6.7.1) - 权限改为
PrivilegesRequired=lowest(兼容 6.7.1) - 下载并安装 ChineseSimplified.isl 中文语言包
- Inno Setup 压缩格式改为
修改文件
windows/runner/win32_window.cpp— 图标加载改用 LoadImage 256px + WM_SETICON + DPI 重载windows/runner/main.cpp— 窗口宽度 420→520windows/CMakeLists.txt— 添加 /utf-8 编译选项windows/runner/resources/app_icon.ico— 重新生成 17 尺寸 ICOinstaller.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 打包 - 安装程序支持中文界面、桌面快捷方式、安装后自动启动
- 创建 Inno Setup 安装脚本
修改文件
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_tagsscripts/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_ohospubspec.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: 小妈菜园交互优化 + 商店布局修复