fix: 修复 VoiceController Map.of 兼容性 + ExploreController 参数不匹配

- VoiceController: Map.of() -> Collections.singletonMap() 兼容 Java 8
- ExploreController: 补齐 takeoutService.roll() 缺失的 taste/priceRange/allergies 参数

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
王鹏
2026-05-08 20:02:27 +08:00
commit 802b4ba229
98 changed files with 5761 additions and 0 deletions

83
doc/box.md Normal file
View File

@@ -0,0 +1,83 @@
以下是“吃啥盲盒”开盒动效的详细分镜描述覆盖从点击到展示结果的完整过程可直接交付UI动效设计师和前端开发。
---
## 开盒动效分镜 · 吃啥盲盒
**整体时长**约1.8-2.2秒
**触发动作**:用户点击任一模式入口按钮(外卖盒/冰箱盒/附近盒)
**核心情感曲线**:期待→悬念→惊喜→清晰
**实现方式建议**优先使用Lottie + CSS关键帧动画兼容低端机型可降级为CSS动画序列
---
### 第一幕 · 震动蓄力0ms 400ms
**目标**:传达“盒子里有东西在动”,制造期待。
| 时间 | 元素 | 变化描述 | 缓动 |
|------|------|----------|------|
| 0ms | 点击的按钮/卡片 | 轻微缩放scale 1.0 → 1.05 → 1.0 | ease-out |
| 0ms | 整个盲盒入口 | 出现一圈橙色光晕从中心向外扩散后消失 | ease-out, opacity 1→0 |
| 100ms | 盲盒图标(如🎁) | 开始高频微动:左右摇摆 ±3deg频率先快后慢 | ease-in-out |
| 0-400ms | 屏幕背景(盲盒大厅) | 逐渐变暗至亮度0.6,其余元素后退感 | 线性 |
**配套反馈**:手机轻微震动(调用`wx.vibrateShort` 15ms
---
### 第二幕 · 盒盖开启400ms 1000ms
**目标**:视觉上呈现“盒子被打开”的结构变化。
| 时间 | 元素 | 变化描述 | 缓动 |
|------|------|----------|------|
| 400ms | 盲盒容器(方形盒子) | 盒盖部分分离向上位移动画Y轴偏移 -60rpx同时opacity 1→0 | ease-in |
| 450ms | 盒体内部 | 从缝隙中透出金色光芒,逐渐增强 | ease-out |
| 500ms | 盒体本身 | 向下轻微压缩scaleY 1→0.9→1模拟受力反弹 | ease-out |
| 600ms | 金色光芒 | 蔓延至整个屏幕形成短暂的白屏过渡白色遮罩从中心放射opacity 0→0.8→0 | ease-in-out持续400ms |
| 700ms | 结果承载层(卡片/空状态) | 在光芒最亮时完成挂载,但此时仍被白色遮罩覆盖 | - |
**配套反馈**第二次短震10ms强化“打开了”的触感。
---
### 第三幕 · 展示与定型1000ms 1800ms
**目标**:结果内容华丽登场,信息清晰呈现。
| 时间 | 元素 | 变化描述 | 缓动 |
|------|------|----------|------|
| 1000ms | 白色遮罩 | 开始淡出opacity 0.8→0持续300ms | ease-in |
| 1000ms | 结果卡片(外卖/菜谱/店铺) | 从缩放0.85、Y轴+30rpx开始弹出 | ease-out-back弹性动画 |
| 1100ms | 卡片内商家图片 | 单独从模糊blur 8px变清晰0px持续200ms | ease-out |
| 1200ms | 标题文字(“你抽到的外卖是…”) | 逐字或整行从上方飘入opacity 0→1Y -20→0 | ease-out |
| 1300ms | 评分/距离等次要信息 | 阶梯式出现每组延迟50ms | ease-out |
| 1500ms | 底部操作按钮 | 从下方滑入Y +40→0opacity 0→1 | ease-out |
| 1600ms | 彩带动效(可选) | 短暂彩色纸屑从卡片背后喷射3-5片 | 物理抛物线,随机旋转 |
**配套反馈**:手机长震一次(`wx.vibrateLong`)或播放轻快“叮”音效(需音频资源)
---
### 各模式动效差异点
| 模式 | 第二幕盒内光芒颜色 | 第二幕溅射粒子 | 第四幕彩带 |
|------|-------------------|---------------|-----------|
| 外卖盲盒 | 橙色→暖黄 | 迷你外卖车图标飘出 | 外卖袋emoji纸屑 |
| 冰箱盲盒 | 绿色→浅绿 | 蔬菜粒子(🥬🍅) | 餐具emoji纸屑 |
| 探店盲盒 | 紫色→粉金 | 地图标记气泡冒起 | 星星emoji纸屑 |
---
### 降级策略(性能受限时)
- 移除粒子与彩带,仅保留盒盖位移+光芒过渡+卡片弹性动画。
- 所有动画时长缩短至1.2秒弹性缓动改为普通ease-out。
- 关闭震动序列通过API判断手机性能或用户设置
---
### 开发关键参数
- **Lottie JSON 尺寸**控制在80KB以内帧率30fps。
- **CSS 动画**:使用`transform``opacity`开启GPU加速`will-change`)。
- **遮罩过渡**:使用`page-mask`绝对定位覆盖z-index分层。
- **依赖资源**:音频文件(.mp3, 5KB以内震动序列图片预加载结果卡片图提前加载
---

169
doc/plan.md Normal file
View File

@@ -0,0 +1,169 @@
以下为“吃啥盲盒ChowBox”小程序的完整开发方案整合了此前所有讨论并细化至可落地执行的程度。
---
# 吃啥盲盒ChowBox小程序 · 产品开发方案 v1.0
## 一、产品概况
**产品名称**:吃啥盲盒
**英文名**ChowBox
**Slogan**:今天吃啥?开个盲盒。
**产品定位**:一站式解决“今天吃什么”的轻决策工具,融合外卖盲盒、冰箱食材做菜、附近探店三种场景,用随机惊喜打破选择困难。
**目标用户**:都市白领、学生、独居人群、年轻家庭,经常面临吃饭决策困难的群体。
**平台形态**:微信小程序(便于传播及跳转外部平台)
---
## 二、核心功能模块
### 模式一外卖盲盒Takeout Box
- **一句话描述**:自动获取附近高质量外卖商家,随机推荐一家,一键跳转下单。
- **用户流程**
1. 授权地理位置。
2. 系统以定位为中心搜索1.53公里内外卖商家。
3. 按评分≥4.5、月销量商圈前30%、配送≤40分钟、无严重差评等规则过滤高质量池。
4. 加权随机选出1家展示店名、评分、人均、距离、起送价/配送费、热销Top3、好评亮点。
5. 用户点击“去下单”跳转美团/饿了么小程序对应商家页。
6. 可点“换一家”重新随机(保证不重复上一次结果)。
- **交互细节**:开盒动效(震动→发光→展开卡片),上方提示“你抽到的外卖是…”
### 模式二冰箱盲盒Fridge Box
- **一句话描述**:录入现有食材,智能推荐能做的菜并给出步骤,缺的调料自动提醒。
- **用户流程**
1. 输入食材(手动/语音/勾选常用),可自定义常备调料(油盐酱醋默认已有)。
2. 系统从菜谱库中匹配完全匹配所有食材都具备优先其次为缺12种辅料的菜标注“还差XX”。
3. 随机展示35道菜显示匹配度百分比及缺少食材。
4. 点开详情:用料清单、步骤图文/视频、烹饪时长、难度星级。
5. 支持一键添加缺少食材至购物清单,或分享菜谱。
6. 结合时段推荐(早餐推快手菜,冬季推炖煮)。
- **菜谱数据来源**:初始购买/爬取公开菜谱合规授权后期支持UGC上传+审核。
### 模式三探店盲盒Explore Box
- **一句话描述**:随机推荐附近一家高评价堂食好店,一键导航前往。
- **用户流程**
1. 授权定位。
2. 搜索13公里内餐饮POI地图API
3. 按评分≥4.3、评论数≥50、结合用户口味偏好与价格设定过滤。
4. 随机推荐1家店名、菜系、人均、距离、推荐语提炼用户评价、招牌菜和环境图。
5. 可“导航过去”(调起腾讯/高德地图)或查看详情页(跳转大众点评小程序)。
6. 同样支持“换一家”。
---
## 三、品牌与UI风格
- **主色调**:活力橙(#FF6A3D)搭配暖黄,体现美食与惊喜感。
- **辅助元素**:盲盒机、问号盒、食材图标等插画风;三个模式用统一“盒子”视觉容器,入口设计成盲盒机样式。
- **动效**开盒过程1.5秒震动→开盖→弹出结果卡片,增强仪式感。
- **字体**:圆体或粗圆体,传达亲切年轻气质。
- **底部导航**:首页(盲盒大厅)、记录、我的,极简结构。
---
## 四、技术架构
### 整体选型
- **前端**原生微信小程序WXML + WXSS + JavaScript使用微信官方开发工具保证最佳性能和兼容性。
- **后端**Java 8 + Spring Boot 2.x采用经典 MVC 架构,部署于云服务器或容器化环境。
- **数据库**
- 主库MySQL 5.7+(商家、菜谱、用户数据)
- 缓存Redis热点POI数据、高频菜谱匹配结果、会话缓存
- **外部服务**
- 高德地图Web APIPOI搜索、逆地理、路径规划
- 腾讯位置服务(备选)
- 菜谱数据API自建或合作方
- 微信开放能力(跳转外卖平台小程序、订阅消息、地理授权)
### 数据流
```
用户授权定位 → 后端获取经纬度 → 调用地图POI并缓存按网格+时间)→ 业务规则过滤/加权→ 随机抽取 → 返回结果
```
### 核心算法
- **高质量池筛选**SQL或内存运算完成评分、销量、配送时长过滤。
- **随机推荐**
1. 确定当日候选集(离线定时刷新或实时计算)。
2. 客户端请求时服务端从候选集中用加权随机如评分权重、用户偏好协同因子抽取1条同时记录已展示避免短时重复。
- **菜谱匹配**:将用户食材列表与菜谱食材表求交集,计算匹配度 = 交集食材数 / 菜谱总食材数降序排列随机取Top3。
---
## 五、数据策略与合规
| 数据需求 | 获取方式 | 更新频率 |
|----------|----------|----------|
| 附近餐饮POI名称、坐标、评分、人均、电话、图片 | 高德/腾讯地图POI搜索API含扩展信息 | 用户实时请求缓存1小时后台热门区域每6小时预缓存 |
| 外卖配送信息(起送价、配送费、时长) | 外卖开放平台(如有)或地图API中部分连锁商户信息 | 随POI一起 |
| 用户评价提炼(推荐语) | 使用公开点评文本摘要(通过合法数据供应商)或高德评分+标签 | 每日更新 |
| 菜谱数据 | 自建库+公开菜谱API合作 | 每周迭代 |
| 用户偏好 | 本地存储+后台用户画像(可选) | 实时 |
**合规要点**
- 不使用网页爬虫抓取外卖/点评平台商业数据所有商家信息源自地图开放API。
- 用户定位需明确授权,可拒绝或手动选择位置。
- 跳转外卖平台仅通过小程序URL Scheme合法跳转。
---
## 六、功能页面结构
1. **启动页**Logo+“今天吃啥?开个盲盒”。
2. **盲盒大厅(首页)**:三大模式入口(卡片+动效),每日一言。
3. **外卖/探店员详情页**:商家大图、信息卡片、招牌菜横滑、吸底操作按钮。
4. **冰箱盲盒-食材录入页**:输入框+标签+语音,我的常备调料编辑。
5. **菜谱推荐列表页**:菜谱卡片+匹配度+缺少食材高亮。
6. **菜谱详情页**:用料、步骤、计时器、购物车按钮。
7. **记录页**:最近开盒历史、收藏的店/菜谱。
8. **个人中心**:偏好设置(口味、忌口、价格区间)、关于我们。
---
## 七、开发路线图MVP → 全功能)
**Phase 1核心MVP46周**
- 完成原生微信小程序项目搭建,实现定位授权。
- 搭建 Java 8 + Spring Boot 后端项目,配置 MySQL 数据库连接。
- 接入高德POI搜索实现外卖盲盒基础推荐过滤+随机)。
- 设计 MySQL 数据库表结构离线导入示例菜谱100道。
- 完成冰箱盲盒基本匹配逻辑与详情展示。
- UI盲盒开启动效1.0。
**Phase 2双模式补全34周**
- 探店盲盒功能上线。
- 优化推荐权重,加入用户反馈(喜欢/踩)。
- 菜谱库扩充至500+,支持语音录入食材。
**Phase 3体验与运营23周**
- 记忆用户偏好,协同过滤简单推荐。
- 分享卡片、订阅消息(每日推荐通知)。
- 性能优化,误触防护,无结果兜底。
**Phase 4上线审核与迭代**
- 小程序全功能测试,提交审核。
- 数据监控与迭代,探索拍照识食材、多人开盒决策等创新功能。
---
## 八、预算与资源预估(最小可行)
- **研发人员**1名全栈或前后端各1兼职
- **设计**1名UI可外包关键页面
- **服务器**初期微信云托管低配约200500元/月)
- **API费用**:高德地图免费配额(日调用量<30万次足够菜谱API或数据购买约10003000元一次性
- **时间**MVP约2个月可上线测试
---
## 九、核心文案与传播素材
- **小程序简介**外卖盲盒冰箱做菜附近探店一键解决今天吃啥
- **分享文案**
我又开出了宝藏店铺你也来测测今天吃啥吧
冰箱剩菜变盛宴这个盲盒有点厉害
- **功能引导**
外卖盲盒页不知道点什么让我帮你决定
冰箱盲盒页拍下你的食材魔法就出现了
探店盲盒页好店就在转角敢不敢盲开一个
---

163
doc/ui.md Normal file
View File

@@ -0,0 +1,163 @@
下面以线框描述+关键标注的方式呈现“吃啥盲盒”核心页面的UI草图。整体采用**活力橙+暖黄**主色调,圆角卡片、盲盒机质感、轻拟物图标,营造“开盒惊喜”的氛围。
---
### 1. 盲盒大厅(首页)
```
┌──────────────────────────┐
│ 上午 11:30 📍 定位 │ <-- 状态栏/定位按钮
├──────────────────────────┤
│ │
│ 🎁 今天吃啥? │ <-- 大标题,圆体
│ 开个盲盒 │
│ │
│ ┌─ 外卖盲盒 ────────┐ │
│ │ 🛵 │ │
│ │ 开个外卖盒 │ │ <-- 主按钮,带微动效
│ │ 随机高质量外卖 │ │
│ └──────────────────┘ │
│ ┌─ 冰箱盲盒 ────────┐ │
│ │ 🥬 │ │
│ │ 开个冰箱盒 │ │
│ │ 有啥食材做啥菜 │ │
│ └──────────────────┘ │
│ ┌─ 探店盲盒 ────────┐ │
│ │ 🍜 │ │
│ │ 开个附近盒 │ │
│ │ 发现隐藏好店 │ │
│ └──────────────────┘ │
│ │
│ “今天宜尝试酸辣口味” │ <-- 每日一言
└──────────────────────────┘
```
**说明**:三个入口设计成盲盒机器视觉卡片,点击后触发开盒动效。上角定位按钮可手动切换位置。
---
### 2. 外卖盲盒结果页
```
┌──────────────────────────┐
│ ← 返回 📤 分享 │
├──────────────────────────┤
│ 🎉 你抽到的外卖是… │
│ │
│ ┌────────────────────┐ │
│ │ [商家头图] │ │
│ │ 🌟 4.8 月销999+ │ │
│ │ 川味小厨 │ │
│ │ ¥32/人 · 1.2km │ │
│ │ 30-40分钟送达 │ │
│ │ “水煮鱼绝了!” │ │
│ │ [招牌菜1][2][3] │ │
│ └────────────────────┘ │
│ │
│ ┌─ 去美团下单 ──────┐ │
│ └────────────────────┘ │
│ 🔄 再开一个 │ <-- 换一家
└──────────────────────────┘
```
**说明**:商家信息卡片居中,招牌菜可横滑。吸底按钮为主操作,弱化“换一家”防止无限循环。
---
### 3. 冰箱盲盒-食材录入页
```
┌──────────────────────────┐
│ 冰箱里有什么? │
│ │
│ ┌──────────────────┐ │
│ │ 🔍 输入食材名称 │ │ <-- 输入框带语音icon
│ └──────────────────┘ │
│ 常用:🥚鸡蛋 🍅西红柿 🥩鸡胸 🧅洋葱 │
自定义 │
│ │
│ 📦 我的常备调料 │
│ ✔️油 ✔️盐 ✔️酱油 ✔️醋 │
│ ✔️料酒 ✔️生抽 ➕添加 │
│ │
│ ┌─── 开盒做饭!───┐ │
│ └──────────────────┘ │
└──────────────────────────┘
```
**说明**:标签化快速输入,可语音录入。常备调料默认勾选,减少重复输入。按钮文案呼应“开盒”。
---
### 4. 冰箱盲盒-菜谱推荐列表
```
┌──────────────────────────┐
│ 为你找到3个菜谱 │
│ │
│ ┌─ 菜谱卡片 ────────┐ │
│ │ 西红柿炒蛋 匹配度95%│ │
│ │ 🥬 缺:小葱 │ │
│ └──────────────────┘ │
│ ┌─ 菜谱卡片 ────────┐ │
│ │ 鸡肉沙拉 匹配度80%│ │
│ │ 🥬 缺:生菜、沙拉酱 │ │
│ └──────────────────┘ │
│ ┌─ 菜谱卡片 ────────┐ │
│ │ 煎鸡胸 匹配度90%│ │
│ │ 🥬 缺:黑胡椒 │ │
│ └──────────────────┘ │
│ │
│ 🔄 换一批菜谱 │
└──────────────────────────┘
```
**说明**:卡片突出匹配度,用绿色高亮匹配,黄色标注缺失食材。优先展示全匹配菜谱。
---
### 5. 菜谱详情页
```
┌──────────────────────────┐
│ [成品图] ⭐难度2 │
│ 西红柿炒蛋 ⏱ 10分钟 │
├──────────────────────────┤
│ 🥚 用料 │
│ 鸡蛋2个 西红柿2个 盐 糖 │
│ 小葱(家里缺) → 加入购物单│
│ │
│ 📝 步骤 │
│ 1. 鸡蛋打散,加盐搅匀 │
│ 2. 西红柿切块备用 │
│ 3. 热油炒蛋,盛出 │
│ 4. 炒西红柿出汁… │
│ │
│ 🔖 计时器 📋 购物清单 │
└──────────────────────────┘
```
**说明**:用料缺货高亮并支持一键加入购物清单。步骤清晰,可内置简单计时器。
---
### 6. 探店盲盒结果页
```
┌──────────────────────────┐
│ 🎊 附近发现一家宝藏店 │
│ │
│ ┌────────────────────┐ │
│ │ [店铺头图] │ │
│ │ 🏮 藏巷·居酒屋 │ │
│ │ ⭐4.6 · 2.3km │ │
│ │ 人均 ¥120 │ │
│ │ “三文鱼厚切超满足”│ │
│ │ 🥘 招牌:鹅肝寿司 │ │
│ └────────────────────┘ │
│ │
│ ┌── 导航过去 ───────┐ │
│ └────────────────────┘ │
│ 🗺 查看详细点评 │
│ 🔄 再开一个 │
└──────────────────────────┘
```
**说明**:强调推荐语和招牌菜,导航为主要操作,跳转外部地图;可查看详情跳大众点评。
---
### 全局元素
- **颜色**:背景米白(#FFFBF4),主色橙(#FF6A3D),文字深灰(#333),高亮绿(#4CAF50)
- **圆角**卡片16px按钮24px
- **字体**:微信默认中文字体(苹方/雅黑)标题加粗大小16-20px
- **图标**:线性+面性结合,盲盒/食材使用自定义插画风
- **错误兜底**:定位失败时显示“手动选择位置”,无商家时显示“附近喵星人占领了,换片区域试试?”