Skip to content

Repository files navigation

食甚 · WhatToEat

一个根据天气 × 个人口味 × 现有食材智能推荐三餐的微信小程序。

所有内置菜谱均来自开源项目 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,脚本可重新生成)

快速开始

1. 导入小程序

  1. 打开微信开发者工具 → 导入项目,选择本目录,AppID 填你自己的小程序 AppID
  2. 首次编译即可使用(未配置密钥/云环境时,天气走兜底、上传不识别,其余功能正常)

2. 配置密钥(可选,按需启用对应功能)

所有密钥集中放在本地 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(账户云存档) 开发者工具 → 云开发

3. 开通云开发(账户云存档,可选)

  1. 开发者工具工具栏 → 云开发 → 创建环境,把环境 ID 填入 config.secrets.js 的 WX_CLOUD_ENV
  2. 右键 cloudfunctions/login → 创建并部署:云端安装依赖
  3. 重新编译,口味页顶部状态显示"已登录 · 云端同步"即生效

4. 数据构建与测试

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 clone HowToCook 到 .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 平台的使用条款并完善隐私政策

License

本项目代码以 MIT License 开源(详见仓库 LICENSE 文件,如有)。

About

这是一个帮你决定今天吃什么的小程序源码,可以综合用户口味、天气、持有的食材进行决断

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages