一个根据天气 × 个人口味 × 现有食材智能推荐三餐的微信小程序。
所有内置菜谱均来自开源项目 HowToCook(程序员做饭指南),由脚本离线构建为小程序数据,感谢原作者与全部贡献者。
名字取自《诗经》"既醉以酒,尔肴既将"——把每天的"吃什么"变成一件有仪式感的小事。
- 天气联动推荐:接入腾讯位置服务天气,按当日最高温(覆盖 -20℃ 以下)与天气现象匹配口味;高温推凉拌/酸辣,低温推炖菜/热汤,阴雨推暖胃食物
- 三种口味模式:随机(全看运气)/ 模糊(4 味型 + 3 口感粗分类)/ 精细化(28 味型 + 19 口感细标签),按温度、天气分档配置,所有设置改完立即生效,无需保存
- 三餐套餐与单菜抽卡:三餐按 主食/配菜/汤粥 营养搭配,每道菜可单独"换一换",整组可"重抽"
- 食材匹配:输入现有食材,按"口味优先 → 食材覆盖率"排序推荐可做的菜,并提示缺少哪些材料(基础调料不算缺料,支持别名,如 西红柿↔番茄)
- 菜谱详情:HowToCook 风格三区排版(准备清单 / 烹饪方式 / 注意事项),用料精确到克/毫升,步骤带时间轴编号,难度 5 点评分
- 自定义忌口:内置忌口(海鲜/牛肉/羊肉/葱姜蒜等)+ 自定义输入,语义匹配用料与口味标签,自动排除调料误伤(如 鸡精 ≠ 鸡)
- 菜谱上新:拍照/选图 → OCR 识别 → DeepSeek 结构化整理,或手动粘贴 Markdown;识别失败自动入队可重试
- 账户云存档:微信云开发静默登录,口味配置、场景设置、上传菜谱随 openid 存云端,清缓存不丢(未配置云环境自动退化为本地模式)
- 菜谱搜索:菜名模糊 + 风味标签混合搜索
- 我的收藏:任何菜都可点爱心收藏(内置 + 自己上传的菜),底部「收藏」页集中查看并支持站内搜索;上传菜可在详情页手动编辑风味标签
- 原生微信小程序(WXML / WXSS / JS),基础库 3.x
- 微信云开发(CloudBase):登录与账户数据同步
- Node.js 脚本(构建数据、批量口味标注、包体检查、单测)
- 双主题:原生 darkmode(
theme.json)+ 页面级 CSS 变量,跟随系统或手动切换
├── app.js / app.json / app.wxss # 小程序入口、全局配置、全局样式与设计 token
├── theme.json # 原生 darkmode 双主题色(窗口/导航/tabBar)
├── config.js # 全局控制变量(不含密钥)
├── config.example.js # 密钥模板:复制为 config.secrets.js 后填写
├── pages/
│ ├── index/ # 首页:天气 + 三餐/单菜/食材 + 重抽
│ ├── preferences/ # 口味设置:三种模式、温度/天气分档、忌口、外观
│ ├── favorites/ # 我的收藏:收藏列表 + 站内搜索
│ ├── onboard/ # 首次使用引导
│ ├── upload/ # 上新:拍照/选图 OCR、手动填写、归档管理
│ ├── search/ # 搜索:菜名 + 风味标签
│ └── detail/ # 菜谱详情:三区排版 + 时间轴步骤
├── custom-tab-bar/ # 自定义底部 tabBar
├── components/ # 通用组件(如有)
├── data/ # 词库、菜品索引
├── dishDataA/ # 菜谱数据分包(按品类拆分,主包瘦身)
├── utils/ # 推荐引擎、天气、存储、云同步、MD 渲染、OCR 等
├── cloudfunctions/login/ # 云函数:静默登录返回 openid
├── scripts/ # 构建/标注/测试脚本
└── preview/ # 本地预览图(gitignore,脚本可重新生成)
- 打开微信开发者工具 → 导入项目,选择本目录,AppID 填你自己的小程序 AppID
- 首次编译即可使用(未配置密钥/云环境时,天气走兜底、上传不识别,其余功能正常)
所有密钥集中放在本地 config.secrets.js(已被 .gitignore 排除,不会上传):
copy config.example.js config.secrets.js # Windows
cp config.example.js config.secrets.js # macOS / Linux然后填入:
| 密钥 | 用途 | 申请地址 |
|---|---|---|
TENCENT_WEATHER_KEY |
实时天气(按最高温推荐) | https://lbs.qq.com/ |
DEEPSEEK_API_KEY |
新菜谱结构化解析、批量口味标注 | https://platform.deepseek.com/ |
BAIDU_OCR_API_KEY / SECRET_KEY |
上传菜谱图片 OCR 识别 | https://console.bce.baidu.com/ |
WX_CLOUD_ENV |
云开发环境 ID(账户云存档) | 开发者工具 → 云开发 |
- 开发者工具工具栏 → 云开发 → 创建环境,把环境 ID 填入
config.secrets.js的WX_CLOUD_ENV - 右键
cloudfunctions/login→ 创建并部署:云端安装依赖 - 重新编译,口味页顶部状态显示"已登录 · 云端同步"即生效
npm install -g pnpm # 无需安装,以下均为 Node 内置脚本(node >= 18)
node scripts/test-recommend.mjs # 推荐引擎 + 词库 + 天气 + 搜索单测(110+ 项)
node scripts/check-ui.mjs # UI 一致性检查(图标/对比度/emoji/橙色审计)
node scripts/check-package.mjs # 主包/分包体积检查(微信 2MB 限制)
node preview/build-preview.mjs # 重新生成 12 张手机预览图菜谱数据来自
.cache/HowToCook构建产物;重新构建请先git cloneHowToCook 到.cache/HowToCook,再运行node scripts/build-dishes.mjs与node scripts/tag-dishes.mjs(口味标注需 DeepSeek Key)。
- 密钥不入库:所有 API Key 仅存在于本地
config.secrets.js;config.js与仓库中不包含任何密钥 - 定位与天气:仅在获取实时天气时请求位置信息,且使用最高温作为推荐依据
- 账户数据:云存档仅保存 openid 与用户主动产生的配置/菜谱,不上传照片原图
- 云数据库权限:请保持集合默认"仅创建者可读写",确保 openid 文档仅本人可访问
注意:若你 fork 过含旧密钥的历史版本,请到各平台重置/轮换对应 API Key。
- 菜谱数据来源:开源项目 HowToCook(MIT License)——所有内置菜谱的用料、步骤与注意事项均由该项目 Markdown 原稿构建而来,本仓库不包含其原始图片资源
- 本项目代码供个人学习使用;如需公开部署,请遵守各 API 平台的使用条款并完善隐私政策
本项目代码以 MIT License 开源(详见仓库 LICENSE 文件,如有)。