Files
kitchen/CHANGELOG.md
2026-04-17 07:00:26 +08:00

408 lines
22 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.97.36] - 2026-04-17
### 🔧 修复 — Web端 Platform._operatingSystem 崩溃
#### 问题描述
- 🐛 **Web端崩溃**`Unsupported operation: Platform._operatingSystem`
- 🐛 **根因**`crash_guard_service.dart` 直接使用 `dart:io``Platform`
- 🐛 **影响范围**:错误报告生成(L137) + 错误对话框显示(L426)
#### 修复方案
- 🔄 **移除直接导入**:删除 `import 'dart:io'`,改用项目已有的 `PlatformUtils`
- 🛡️ **使用兼容层**`Platform.operatingSystem``PlatformUtils().operatingSystemName`
-**Web端安全**`PlatformUtils` 使用条件导入Web端返回 `'Web'`
#### 修改文件
- `lib/src/services/crash_guard_service.dart` — 移除dart:io导入使用PlatformUtils
## [0.97.35] - 2026-04-17
### 🔧 修复 — Web版API超时错误 (v2)
#### 问题描述
- 🐛 **超时错误**Web端显示"加载失败 - Exception: 加载超时,请检查网络连接"
- 🐛 **根因1**`connectTimeout: 2秒` 太短Web端经过CORS代理链路长
- 🐛 **根因2**:请求策略错误(先走代理再直连),代理不稳定导致延迟更高
#### 修复方案
- ⏱️ **增加超时时间**Web端 `connectTimeout` 从 2s → **10s**
- 🔄 **反转请求策略****优先直连** → 失败后用CORS代理备用
- 📡 **增强错误检测**:新增 `_shouldTryProxy()` 方法,检测 connectionTimeout/connectionError/statusCode=0/5xx 等情况触发代理回退
- 🛡️ **全方法覆盖**GET/POST/PUT/DELETE 四种请求方法均支持新策略
#### 请求流程变更
```
旧流程 (v1): 浏览器 → CORS代理(2s超时) → API服务器 ❌ 超时
新流程 (v2): 浏览器 → 直连API(10s超时) ✅ → 失败时 → CORS代理备用
```
#### 修改文件
- `lib/src/services/api/api_service.dart` — Web端10s超时、优先直连、_buildProxyUrl备用、_shouldTryProxy检测
## [0.97.34] - 2026-04-17
### 🔧 修复 — Web版API连接错误
#### 问题描述
- 🐛 **CORS代理失败**Web端使用 corsproxy.io 代理服务不稳定,导致 API 请求失败
- 错误信息:`ApiException(unknown). The connection errored. The XMLHttpRequest onerror callback was called.`
#### 修复方案
- 🔄 **直接请求回退机制**CORS代理失败时自动尝试直连原始URL
- 📡 **智能错误检测**:新增 `_isCorsProxyError()` 方法识别 CORS 代理相关错误
- 🛡️ **全方法覆盖**GET/POST/PUT/DELETE 四种请求方法均支持回退逻辑
- 📝 **详细日志**:添加调试日志便于追踪请求路径(代理/直连)
#### 技术实现
```dart
// 核心流程:
// 1. 尝试通过 CORS 代理请求 (corsproxy.io/?url=...)
// 2. 失败时检测是否为代理错误 (_isCorsProxyError)
// 3. 自动切换为直接请求原始 URL
// 4. 直连失败则抛出原始错误
```
#### 修改文件
- `lib/src/services/api/api_service.dart` — 新增 _buildDirectUrl、_isCorsProxyError 方法;修改 get/post/put/delete 和 _executeWithOfflineCheck 支持回退
## [0.97.33] - 2026-04-17
### ✨ 新增 — 隐私政策与用户协议页面 + 首次引导页
#### 新增功能
- 🔒 **隐私政策页面**:新增隐私政策与用户协议页面,支持分段切换和左右滑动浏览
- 📋 **公开组件**`PrivacyPolicyContent``UserAgreementContent` 为公开类,可供其他页面调用
- 🔗 **关于页面跳转**:关于页面"软件协议"入口点击后跳转至新页面
- 🎬 **首次引导页**:新增引导页,首次启动展示欢迎信息和协议,用户同意后方可使用
-**协议拦截**:启动时检查协议同意状态,未同意则跳转引导页,不同意则退出应用
#### 修改文件
- `lib/src/pages/profile/privacy_policy_page.dart` — 新增隐私政策与用户协议页面
- `lib/src/pages/profile/guide_page.dart` — 新增首次引导页(欢迎+协议同意)
- `lib/src/pages/profile/about_page.dart` — 软件协议入口跳转新页面
- `lib/src/config/app_routes.dart` — 注册 `/privacy-policy``/guide` 路由
- `lib/main.dart` — 启动时检查协议同意状态
## [0.97.32] - 2026-04-17
### ✨ 新增 — 点餐助手分享功能 + UI布局优化 + 权限页面
#### 新增功能
- 📝 **生成文本分享**:列表区域新增"生成文本"按钮,调用系统分享接口分享格式化订单文本
- 🖼️ **生成图片分享**:列表区域新增"生成图片"按钮弹出预览卡片完整渲染所有菜品确认后截图生成PNG图片并调用系统分享
- 📤 **分享区域**:独立的"分享订单"卡片组件,与底部栏"关闭订单/生成账单"按钮分离
- 🗑️ **关闭订单**:底部栏左侧新增"关闭订单"按钮,确认后标记取消并从服务器删除
- 👥 **用餐人数**桌号下方新增人数选择器支持1/2/3/4/5/6/8/10常量快速选择和自定义输入
- 🪑 **添加菜品按钮移至单号下方**:布局调整,添加菜品按钮紧跟订单头部
- 🔒 **软件权限页面**:新增权限管理页面,展示应用所需权限说明和沙盒运行说明
#### 修改文件
- `lib/src/pages/tools/cooking/order_assistant_page.dart` — 重构底部栏(仅保留关闭+账单),新增分享卡片、人数选择器、分享方法
- `lib/src/models/tools/order_model.dart` — peopleCount字段此前已添加
- `lib/src/controllers/tools/order_assistant_controller.dart` — setPeopleCount/clearAllData方法此前已添加
- `lib/src/pages/profile/permission_page.dart` — 新增权限页面
- `lib/src/pages/profile/about_page.dart` — 新增软件权限入口
## [0.97.31] - 2026-04-17
### 🔧 修复 — 二维码扫码显示网页而非JSON
#### 修复内容
- 🐛 **QR URL修正**:二维码/条形码URL从 `kitchen.php?act=get&id=xxx`返回JSON改为 `?id=xxx`加载index.html网页
- 扫码后现在正确显示点单网页,包含菜品列表、金额、备注、桌号等信息
- 网页端通过 `?id=xxx` 参数自动调用API获取订单数据并渲染
#### 修改文件
- `lib/src/models/tools/order_model.dart` — qrUrl 改为 `https://eat.wktyl.com/api/kitchen/?id=$id`
- `lib/src/services/tools/order_api_service.dart` — getQrUrls 同步修正
## [0.97.30] - 2026-04-17
### 🔧 修复 — API路径修正 + 接口测试脚本完善
#### 修复内容
- 🐛 **API路径修正**`/kitchen.php``/kitchen/kitchen.php`,所有端统一指向正确服务器路径
- 🐛 **测试脚本runInShell修复**:移除 `runInShell: true`避免shell将URL中 `&` 解释为后台运行符导致参数丢失
- 🐛 **SSE测试修复**:改用 `Process.run` + 临时文件方式读取SSE流替代 `Process.start` + stdout.fold
- 🐛 **UTF-8编码修复**curl添加 `--compressed` 参数正确处理gzip压缩响应
#### 接口验证结果(全部通过)
| # | 测试项 | 结果 |
|---|--------|------|
| 1 | 接口首页 (index) | ✅ |
| 2 | CORS预检 (OPTIONS) | ✅ |
| 3 | 创建点单 (POST create) | ✅ |
| 4 | 获取点单 (GET get) | ✅ |
| 5 | 更新点单 (POST update) | ✅ |
| 6 | 点单列表 (GET list) | ✅ |
| 7 | 统计信息 (GET stats) | ✅ |
| 8 | SSE实时推送 | ✅ |
| 9 | 清理过期 (GET cleanup) | ✅ |
| 10 | 删除点单 (GET delete) | ✅ |
| 11 | 确认删除 (404) | ✅ |
#### 修改文件
- `lib/src/services/tools/order_api_service.dart` — _basePath 修正为 /kitchen/kitchen.phpQR/barcode URL同步修正
- `lib/src/models/tools/order_model.dart` — qrUrl 修正为 /kitchen/kitchen.php
- `web_order/index.html` — API_BASE 和 SSE_URL 修正为 /kitchen/ 子路径
- `scripts/test_kitchen_api.dart` — 修复 runInShell、SSE测试、UTF-8编码问题
## [0.97.29] - 2026-04-17
### ✨ 新增 — 点餐助手PHP后端 + SSE实时推送 + 数据清理
#### 功能描述
- 🖥️ **PHP后端API**kitchen.php 完整CRUD接口JSON文件存储文件锁保证并发安全
- 📡 **SSE实时推送**kitchen_sse.php Server-Sent Events端点App更新后网页端实时刷新
- 🗑️ **数据清理**App端支持7天/30天过期清理、本地+服务器联合清理、清空全部历史
- ☁️ **远程同步**OrderApiService 对接真实API创建/更新/删除操作同步到服务器
- 🌐 **网页端SSE**web_order/index.html 接入SSE实时显示连接状态自动重连+轮询降级
#### API接口
| 操作 | 方法 | URL |
|------|------|-----|
| 创建点单 | POST | kitchen.php?act=create |
| 获取点单 | GET | kitchen.php?act=get&id=xxx |
| 更新点单 | POST | kitchen.php?act=update |
| 点单列表 | GET | kitchen.php?act=list&page=1&limit=20 |
| 删除点单 | GET | kitchen.php?act=delete&id=xxx |
| 清理过期 | GET | kitchen.php?act=cleanup&days=30 |
| 统计信息 | GET | kitchen.php?act=stats |
| SSE推送 | GET | kitchen_sse.php?order_id=xxx |
#### 新增文件
- `docs/api/kitchen.php` — 点餐助手PHP后端APICRUD + JSON存储 + 过期清理)
- `docs/api/kitchen_sse.php` — SSE实时推送端点监听订单变化推送更新
#### 修改文件
- `lib/src/services/tools/order_api_service.dart` — Mock→真实API新增 deleteOrder/cleanupExpired/getStats
- `lib/src/controllers/tools/order_assistant_controller.dart` — 新增 cleanupExpiredLocal/cleanupExpiredRemote/cleanupAllExpired
- `lib/src/pages/tools/cooking/order_assistant_page.dart` — 新增🗑️数据清理按钮和清理弹窗
- `lib/src/models/tools/order_model.dart` — qrUrl 更新为 kitchen.php?act=get&id=xxx
- `web_order/index.html` — 接入SSE实时推送新增连接状态指示器轮询降级
## [0.97.28] - 2026-04-17
### ✨ 新增 — 点餐助手工具
#### 功能描述
- 🍽️ **用户点餐**:支持从浏览记录、搜索、手动填写、商家推荐四种方式添加菜品
- 🏪 **商家推单**:一键切换商家推单模式,支持商家推荐菜品
- 📋 **账单生成**:自动计算菜品数量和金额,生成唯一单号和时间戳
- 📱 **二维码/条形码**生成点单二维码和条形码URL指向 eat.wktyl.com/api/kitchen
- 💾 **本地持久化**SharedPreferences 存储历史记录和记录条数统计
- 🌐 **网页端**web_order/index.html 支持扫码查看点单信息自动15秒刷新
- 🎨 **iOS风格UI**:毛玻璃效果、圆角卡片、动态主题适配
#### 新增文件
- `lib/src/models/tools/order_model.dart` — 点单数据模型Order、OrderItem、OrderType、OrderStatus、OrderItemSource
- `lib/src/services/tools/order_api_service.dart` — 点单API服务Mock实现后端就绪后切换
- `lib/src/controllers/tools/order_assistant_controller.dart` — 点餐助手控制器,管理状态和持久化
- `lib/src/pages/tools/cooking/order_assistant_page.dart` — 点餐助手主页面
- `lib/src/pages/tools/cooking/widgets/order_item_card.dart` — 菜品卡片组件
- `lib/src/pages/tools/cooking/widgets/add_item_sheet.dart` — 添加菜品弹窗入口
- `lib/src/pages/tools/cooking/widgets/browse_history_picker.dart` — 浏览记录选择器
- `lib/src/pages/tools/cooking/widgets/manual_input_sheet.dart` — 手动填写菜品弹窗
- `lib/src/pages/tools/cooking/widgets/qr_barcode_dialog.dart` — 二维码/条形码弹窗
- `web_order/index.html` — 网页端点单展示页
#### 修改文件
- `lib/src/models/tool_item_model.dart` — 新增 order_assistant 工具注册
- `lib/src/config/app_routes.dart` — 新增 toolsOrderAssistant 路由
## [0.97.27] - 2026-04-17
### ✨ 新增 — 瀑布流工具卡片插槽系统
#### 功能描述
- 🧩 **统一插槽系统**WaterfallSlotRegistry 统一管理瀑布流中插入的各类卡片miniCard、toolCard
- 🔀 **交替插入策略**miniCard 和 toolCard 每20个卡片交替插入位20插miniCard位40插toolCard
- 🃏 **工具卡片**:毛玻璃中等卡片样式,展示工具 icon、名称、描述、分类标签
- **详情入口**:卡片右上角 info 图标,点击进入独立工具详情页
- 🚀 **一键打开**:卡片整体点击直接跳转对应工具页面
- 📋 **强制声明**ToolItem 新增 waterfallSlot 必填字段,不声明编译报错
- 🔮 **未来扩展**:新增工具只需在 defaultTools 中声明 waterfallSlot: WaterfallSlotConfig(show: true) 即可自动出现在首页瀑布流
#### 新增文件
- `lib/src/models/waterfall_slot.dart` — 瀑布流插槽模型WaterfallSlotType、WaterfallSlot、WaterfallSlotConfig、WaterfallSlotRegistry
- `lib/src/widgets/discover/tool_card_discover_card.dart` — 瀑布流工具卡片组件(毛玻璃风格)
- `lib/src/pages/tools/tool_detail_page.dart` — 工具详情页(独立页面,展示工具信息和打开按钮)
#### 修改文件
- `lib/src/models/tool_item_model.dart` — ToolItem 新增 waterfallSlot 必填字段ToolRegistry 新增 homeCardTools getter所有 defaultTools 均声明 waterfallSlot
- `lib/src/models/discover_model.dart` — DiscoverItemType 新增 toolCard 枚举值DiscoverItem 新增 toolItemRef 字段和 toolCard 工厂构造;新增 ToolItemRef 类
- `lib/src/widgets/discover/discover_waterfall.dart` — 接入 WaterfallSlotRegistry 统一插槽系统;新增 toolCards 参数_buildItem 新增 toolCard 分支
- `lib/src/pages/home/home_page.dart` — 传递 toolCards: ToolRegistry.homeCardTools 参数
- `lib/src/config/app_routes.dart` — 新增 toolDetail 路由常量和 GetPage 注册
## [0.97.26] - 2026-04-16
### ✨ 新增 — 用料管理工具
#### 功能描述
- 🧴 **瓶子管理**:网格布局展示厨房用料瓶子,类似小瓶子视觉效果
- 📊 **分类筛选**:支持比例、调味料、食材三种类型筛选
- **增减容量**点击瓶子可快速增加或减少容量每次10%
- ✏️ **自定义瓶子**:支持自定义瓶子名称、容量、类型
- 💾 **本地持久化**:数据通过 SharedPreferences 本地存储
- 🎬 **入场动画**:网格交错入场动画,流畅的视觉体验
- 🎨 **iOS风格UI**:毛玻璃效果、圆角卡片、渐变色设计
#### 新增文件
- `lib/src/models/bottle_model.dart` — 用料瓶子数据模型,包含类型、容量、填充量等
- `lib/src/controllers/ingredient_manage_controller.dart` — 用料管理控制器,管理瓶子增删改查
- `lib/src/pages/tools/ingredient_manage_page.dart` — 用料管理主页面,网格布局展示瓶子
#### 修改文件
- `lib/src/models/tool_item_model.dart` — 注册「用料管理」工具项id: ingredient_manage, route: /tools/ingredient-manage
- `lib/src/config/app_routes.dart` — 注册路由 /tools/ingredient-manage
## [0.97.25] - 2026-04-16
### ✨ 新增 — 菜品排名Tier List工具
#### 功能描述
- 🏆 **五级排行体系**:夯(红) → 顶级(橙金) → 人上人(黄) → NPC(米白) → 拉完了(灰白)
- 📖 **浏览记录导入**:从浏览历史中选择菜品加入排名
- ❤️ **收藏导入**:从收藏列表中选择菜品加入排名
- ✏️ **手动输入**:自定义菜品名称 + 选择 emoji 图标
- 🔍 **搜索过滤**:选择面板内支持实时搜索
- 🔄 **跨层级移动**:点击菜品可移动到其他层级
- 🗑️ **删除/清空**:支持单条删除和一键清空
- 💾 **本地持久化**:数据通过 SharedPreferences 本地存储
- 🎬 **交错入场动画**:每行依次 slide + fade 进入
#### 新增文件
- `lib/src/models/dish_rank_model.dart` — 菜品排名数据模型 + 层级定义常量
- `lib/src/pages/tools/ranking/dish_ranking_controller.dart` — 排名控制器(数据管理、持久化)
- `lib/src/pages/tools/ranking/dish_ranking_page.dart` — Tier List 主页面
- `lib/src/pages/tools/ranking/dish_pick_sheet.dart` — 底部选择面板组件
#### 修改文件
- `lib/src/models/tool_item_model.dart` — 注册「菜品排名」工具项id: dish_ranking, route: /tools/dish-ranking
- `lib/src/config/app_routes.dart` — 注册路由 /tools/dish-ranking
## [0.97.24] - 2026-04-16
### ♻️ 重构 — 发现页列表下拉手势完全劫持
#### 问题
- 子列表(热门排行 ListView、标签列表、分类网格拥有独立滚动控制器
- 在子列表顶部下拉时,手势被子列表消费,外层无法劫持为打开工具中心
#### 变更
- 🔽 **禁用子列表独立滚动**:热门排行改为 `Column` + `map`,标签列表改为 `Column` + `map`,分类网格改为 `GridView` + `shrinkWrap` + `NeverScrollableScrollPhysics`
- 🎯 **统一滚动管理**:所有内容由外层 `CustomScrollView` 统一滚动,下拉手势不再被子列表拦截
- 🧹 **移除 GestureDetector 冲突**:移除外层 `GestureDetector`(会和列表滚动竞争),改用纯 `NotificationListener<ScrollNotification>` + `ClampingScrollPhysics` 捕获 `OverscrollNotification`
- 🔧 **修复 PageRoute 构造异常**:自定义 `_SlideFromTopPageRoute` 改为 `PageRouteBuilder`,修复 `NoSuchMethodError: No constructor '' declared in class 'null'`
#### 修改文件
- `lib/src/pages/discover/discover_page.dart` — 移除 GestureDetector修复 PageRoute使用 ClampingScrollPhysics
- `lib/src/pages/discover/components/discover_sections_widget.dart` — 所有子列表改为无独立滚动布局
## [0.97.23] - 2026-04-16
### ♻️ 重构 — 发现页下拉手势拦截 & 工具中心页面化
#### 变更
- 🔽 **全局下拉拦截**:发现页拦截所有下拉手势,任意位置下拉均可唤出工具中心
- 📄 **页面化导航**:工具中心从 Overlay 弹窗改为 `PageRoute` 页面导航,天然支持系统返回键
- 🎬 **从顶部滑入**:自定义 `_SlideFromTopPageRoute`,工具中心从顶部滑入(类 iOS 通知中心/搜索面板)
- ⏸️ **动画可打断**:页面转场动画支持手势打断(系统默认支持)
- 👆 **下拉关闭**:工具中心页面内下拉手势可关闭返回,带拖拽指示条
- 📳 **震动反馈**:下拉达到阈值触发中等+强烈震动
- 📱 **系统返回键**:工具中心页面支持 Android 系统返回键、iOS 滑动返回
- 🎨 **保留原有 UI**:工具中心面板 UI 不变(常用工具、分类工具、浏览记录、底部操作栏)
#### 移除
-`OverlayEntry` 方案(不支持系统返回键)
-`AnimationController` 面板动画(改用系统 PageRoute 动画)
#### 修改文件
- `lib/src/pages/discover/discover_page.dart` — 移除 Overlay 方案,改为 `GestureDetector` + `PageRoute` 导航
- `lib/src/pages/discover/components/tools_panel_widget.dart` — 重构为独立页面模式,支持下拉关闭手势和系统返回键
## [0.97.22] - 2026-04-16
### 🐛 修复 — 发现页工具中心交互优化
#### 变更
- 🔽 **从底部滑入**:工具中心改为从底部滑入(类微信小程序交互),取代原顶部滑入
- 📐 **覆盖底部tab栏**:使用 Overlay 确保工具面板层级最高,覆盖底部导航栏
- 🔘 **固定按钮可见**:底部功能按钮(首页/收藏/设置/关于)随面板一起显示
- 📳 **震动反馈**:下拉触发工具中心时添加触觉反馈(中等+强烈震动)
- 🔍 **响应式搜索**:搜索框从只读改为可输入,实时搜索匹配工具并显示结果
-**触发灵敏度**下拉阈值从80px降至50px阻尼系数从0.5提升至0.8
- 👆 **下滑关闭**:面板内下滑手势关闭面板,提示文案更新为"下滑关闭"
#### 修改文件
- `lib/src/pages/discover/discover_page.dart` — 搜索框响应式搜索、Overlay显示面板、震动反馈、灵敏度调整
- `lib/src/pages/discover/components/tools_panel_widget.dart` — 从底部滑入动画、下滑关闭手势、遮罩层分离
## [0.97.21] - 2026-04-16
### ♻️ 重构 — 发现页代码拆分与工具中心完善
#### 变更
- 📁 **代码拆分**:将 discover_page.dart (原1834行) 拆分为多个文件每个文件不超过800行
- 📦 **新建文件夹**`lib/src/pages/discover/components/` 存放拆分后的组件
- 🔧 **工具面板组件**`tools_panel_widget.dart` (792行) — 包含下拉工具中心面板所有UI
- 📊 **分区内容组件**`discover_sections_widget.dart` (685行) — 包含热门/今天吃什么/推荐三个分区
- 📄 **主文件精简**`discover_page.dart` (499行) — 保留页面骨架和状态管理
- 💾 **备份文件**`discover_page.dart.bak` 保留原始代码
#### 工具中心完善
-**上滑关闭**:支持手势上滑关闭工具中心面板
- 🔍 **搜索框**:基础信息区新增工具搜索功能
- 📝 **工具详情**:长按工具显示详情弹窗,包含使用次数、联网状态等信息
- 📂 **分类展示**:所有工具按分类分组显示(烹饪助手/健康营养/数据查询/规划管理)
- 🕐 **浏览记录**:显示最近浏览的菜谱,横向滚动卡片列表
- 🔘 **底部按钮**:固定功能按钮栏(首页/收藏/设置/关于)
- 📏 **层级修复**工具中心面板覆盖在底部tab栏之上
#### 修改文件
- `lib/src/pages/discover/discover_page.dart` — 主文件精简,引用新组件
- `lib/src/pages/discover/components/tools_panel_widget.dart` — 工具面板组件
- `lib/src/pages/discover/components/discover_sections_widget.dart` — 分区内容组件
- `lib/src/pages/discover/components/tool_detail_sheet.dart` — 工具详情弹窗
- `lib/src/pages/discover/components/browse_history_section.dart` — 浏览记录组件
- `lib/src/pages/discover/discover_page.dart.bak` — 备份
## [0.97.20] - 2026-04-16
### ♻️ 重构 — 发现页新增动态工具栏
#### 变更
- 🔄 **发现页面**:新增动态工具栏,显示常用工具快捷入口(按使用次数排序)
- 📊 **智能排序**:工具按 `usageCount` 降序排列,常用工具优先显示
- 🔧 **工具功能**:点击工具记录使用次数并跳转;"更多"按钮打开完整工具中心面板
- 💎 **视觉风格**:毛玻璃卡片效果,与 iOS 26 Liquid Glass 风格一致
- 📍 **位置调整**:工具栏位于搜索框与分段控制之间
#### 修改文件
- `lib/src/pages/discover/discover_page.dart` — 新增 _buildToolsBar、_buildToolShortcut、_buildMoreToolsCard、_navigateToTool 方法
> 📌 已移除较早版本记录(0.97.19及之前),功能已归档至软件特性清单。