一个给情侣用的微信小程序:把两个人的小日子都记在一起 —— 纪念日、日记、相册、实时定位、点菜做饭、日程、喜好、愿望清单、经期记录……
A WeChat Mini Program for couples to record their life together.
✨ 功能特性
首页按三类组织共 13 个页面:
| 分组 | 功能 | 说明 |
| 记录我们 | 纪念日 | 支持阳历 / 农历,自动倒计时与到期提醒 |
| 情侣日记 | 图文日记,支持心情、天气、定位标记,图片三列瀑布流 | |
| 情侣相册 | 分类相册,双方共享,支持批量上传 | |
| 一起生活 | 点菜做饭 | 内置 416 道家常菜谱(带用量与分步做法)+ 自定义菜谱 + 互相点菜 |
| 日程 | 约定日程,到点强提醒 | |
| 愿望清单 | 双方各写各的心愿,共享给对方 | |
| 关心与日常 | TA 的喜好 | 记录对方爱吃的 / 想去的,点菜时一键标记 |
| 实时位置 | 查看双方的实时位置与距离 | |
| 经期记录 | 经期记录与周期预测 | |
| 天气 | 实时本地天气与穿衣建议 | |
| 其它 | 绑定情侣 | 邀请码绑定 / 解除,自动计算「在一起」天数 |
| 我的 | 昵称、头像、登录状态管理 |
- 游客可先逛:未登录也能看到首页品牌与天气,登录后再解锁情侣功能(符合审核合规)。
- 实时天气基于 Open-Meteo,完全免费、无需 API key。
- 内置菜谱源自开源项目 HowToCook(The Unlicense,公共领域),共 416 道,离线可用。
🛠 技术架构
┌─────────────────────────────────────────────┐
│ 微信小程序(前端) │
│ 原生 WXML / WXSS / JS,无第三方 UI 框架 │
│ pages/* 13 个页面 · utils/* 工具与数据访问层 │
└───────────────┬─────────────────────────────┘
│ @tencent-ai/workbuddy-cloud-sdk
▼
┌─────────────────────────────────────────────┐
│ WorkBuddy Cloud(后端) │
│ · 身份认证:微信登录 (wx.login + signIn…) │
│ · 数据库:PostgreSQL + PostgREST │
│ · 行级安全:RLS(couple_id 隔离,二次校验) │
│ · 文件存储:相册图片 / 视频 │
└─────────────────────────────────────────────┘
- 前端:原生微信小程序,UI 采用粉色系主题(
#ff6b81导航条、#fff5f7背景)。
- 后端:WorkBuddy Cloud SDK —— 提供基于 PostgreSQL 的数据库、身份认证与文件存储,接口风格类似 Supabase(
cloud.database.from('表').select())。
- 数据隔离:每一张情侣表都强制带
couple_id查询条件,并由数据库 RLS(行级安全)二次校验,couple_id必须属于当前用户所在的couples行,保证情侣之间互不可见。
- 天气:
utils/weather.js直接请求 Open-Meteo 公开接口,无需后端中转、无需密钥。
- 订阅消息:纪念日、点菜、愿望三类微信订阅消息,模板字段组装见
utils/message.js。
📁 目录结构
情侣小屋/ ├── app.js / app.json / app.wxss # 小程序入口与全局配置 ├── project.config.json # 项目配置(含 appid) ├── pages/ # 13 个页面,每个含 .js/.wxml/.wxss/.json │ ├── index/ # 首页(Hero + 天气 + 最近纪念日 + 功能网格) │ ├── bind/ # 绑定 / 解绑情侣 │ ├── anniversary/ # 纪念日 │ ├── diary/ # 情侣日记 │ ├── album/ # 情侣相册 │ ├── location/ # 实时位置 │ ├── recipe/ # 点菜做饭(菜谱库) │ ├── mine/ # 我的 │ ├── weather/ # 天气 │ ├── schedule/ # 日程 │ ├── preference/ # TA 的喜好 │ ├── cycle/ # 经期记录 │ └── wish/ # 愿望清单 ├── utils/ # 工具与数据访问层(核心逻辑) │ ├── cloud.js # 云服务初始化(endpoint + publishableKey) │ ├── api.js # 数据访问层:所有表的 CRUD 与 RLS 约定 │ ├── features.js # 首页功能入口清单(分组 / 文案) │ ├── recipes.js # 内置 416 道菜谱(生成产物,勿手改) │ ├── weather.js # Open-Meteo 天气封装 │ ├── message.js # 订阅消息内容组装 │ └── … # 倒计时、农历、定位、上传、日志等 ├── scripts/ │ └── build-recipes-from-howtocook.py # 从 HowToCook 重新生成菜谱库 ├── docs/ # 更细的配置文档(域名 / 订阅消息 / 菜谱) │ ├── 菜谱库说明.md │ ├── 订阅消息配置指南.md │ ├── 订阅消息服务端对接.md │ ├── 平台后台域名配置.md │ ├── 天气域名配置.md │ └── 定位地名配置说明.md └── tests/ # Node 单元测试(18 套件) ├── project.test.js # 全量静态检查(0 错误 0 警告) └── recipes.test.js 等
🚀 部署与配置(面向开发者)
1. 前置条件
- 微信开发者工具(最新版)
- 一个微信小程序 AppID(在 微信公众平台 注册)
- 一个 WorkBuddy Cloud 云服务实例(在 WorkBuddy 平台为当前小程序开通云服务,得到
endpoint与publishableKey)
2. 获取代码
git clone <你的仓库地址>
cd <项目目录>
点击下方下载源码程序
3. 配置云服务(必须)
编辑 utils/cloud.js,把示例值替换成你在 WorkBuddy 云平台开通云服务后得到的配置:
const publicConfig = {
endpoint: 'https://你的云服务地址',
publishableKey: '你的 publishableKey'
}
⚠️ 切勿把真实的生产
publishableKey提交到公开仓库(见下方「开源前检查清单」)。
4. 配置小程序 AppID(必须)
编辑 project.config.json,将 appid 改为你自己的小程序 AppID:
{ “appid”: “你自己的小程序AppID” }
5. 配置服务器域名(必须)
在 微信公众平台 → 开发 → 开发管理 → 开发设置 → 服务器域名 中,把以下域名加入 request 合法域名:
| 域名 | 用途 |
https://mp-api.app.workbuddy.host |
WorkBuddy Cloud 接口 |
https://api.open-meteo.com |
实时天气 |
本地调试可在「微信开发者工具 → 详情 → 本地设置」勾选「不校验合法域名」。详细见
docs/平台后台域名配置.md、docs/天气域名配置.md。
6. 配置订阅消息(可选)
若需要纪念日 / 点菜 / 愿望的微信订阅消息推送,需在公众平台「订阅消息 → 我的模板」中申请对应模板,并把模板 ID 填入 utils/subscribe.config.js。字段组装规则见 utils/message.js 与 docs/订阅消息配置指南.md。
7. 定位权限(可选)
app.json 已声明 scope.userLocation 与 requiredPrivateInfos(getLocation / chooseLocation)。首次使用定位功能时小程序会向用户申请授权。
8. 编译运行
用微信开发者工具打开项目根目录,编译即可预览。上传发布在微信开发者工具或 WorkBuddy 平台完成。
🗄 数据库表结构参考(需在云平台自行创建)
本仓库提供数据访问层(utils/api.js),其中约定了以下表与字段。它们需在你的 WorkBuddy Cloud 实例中创建,并配置对应的 RLS 行级安全策略。
| 表名 | 关键字段 | 说明 |
profiles |
owner_id(用户) · owner_name · avatar_url · couple_id · couple_role |
用户档案;更新策略只允许改自己的行 |
couples |
user_a · user_b · invite_code · relation_date · relation_at |
情侣关系;user_a/user_b 可为空表示待绑定 |
anniversaries |
couple_id · title · calendar_type(阳/农历) · month · day · start_year · emoji · repeat_yearly · remind_days |
纪念日 |
diaries |
couple_id · owner_name · content · images(数组) · mood · weather · location_name · latitude · longitude |
情侣日记 |
albums |
couple_id · name · emoji · sort_order |
相册分类 |
album_items |
couple_id · album_id · media_type · file_path · thumb_path · width · height · remark |
相册内容 |
locations |
couple_id · owner_id · latitude · longitude · address · city · precision_m · address_manual |
实时位置 |
recipe_orders |
couple_id · recipe_id · dish_name · note · servings · status(pending/done) · done_at · cooker_id |
互相点菜 |
recipes_custom |
couple_id · name · emoji · category · taste · duration · servings · ingredients(JSON) · steps(JSON) · tips |
双方自定义菜谱 |
reminders |
couple_id · kind · title · body · link · remind_at · is_read |
应用内提醒 |
subscriptions |
owner_id · couple_id · template_id · subscribed |
订阅消息开关 |
schedules |
couple_id · title · category · event_date · event_time · repeat_rule · priority · remind_before · is_done |
日程 |
preferences |
couple_id · owner_name · category · title · detail · is_favorite |
对方喜好 |
wishes |
couple_id · owner_id · title · category · detail · target_date · status(open/done) · notified |
愿望清单 |
cycles |
couple_id · owner_name · start_date · end_date · cycle_length · period_length · flow · symptom · note |
经期记录 |
安全相关的服务端对象(被 api.js 调用,但 SQL 不在本仓库,需在云平台以 SECURITY DEFINER 函数提供):
find_couple_by_invite(p_code)—— 绑定前绕过 RLS 查找邀请码
accept_invite(p_code)—— 绑定动作,绕过 RLS 写入couples
couples表的更新策略couples_update_member—— 仅关系成员可更新
所有情侣表务必配置 RLS:每行查询强制
couple_id条件 + 数据库层二次校验,且couple_id必须属于当前用户所在的couples行。这是数据隔离的底线,务必在云控制台核对。
🔐 安全与隐私
- 数据隔离:情侣数据通过
couple_id在应用层与数据库层(RLS)双重隔离,情侣之间互不可见。
- 凭据管理:
utils/cloud.js的publishableKey属于可公开的发布密钥(publishable key),但为安全起见,开源时仍建议替换为占位符或自建实例的密钥;project.config.json的appid务必替换为你自己的。
- 位置信息:仅在用户明确授权后采集,用于展示双方距离与日记定位,不上传无关信息。
📖 使用说明
面向最终用户的详细使用指南见 docs/使用说明.md,涵盖:如何登录与绑定情侣、各功能模块怎么用、常见问题。
🧪 测试
项目自带 Node 单元测试(纯逻辑层,不依赖微信运行时): node --test tests/*.test.js # 运行全部 18 套件 node tests/recipes.test.js # 仅校验菜谱库数据完整性 node tests/project.test.js # 全量静态检查(应 0 错误 0 警告) 测试覆盖:数据访问层字段映射、菜谱库完整性(字段齐全 / id 与菜名唯一 / 分类合法 / 分页逻辑)、首页功能清单一致性、各工具模块等。
🍳 重新生成菜谱库(可选)
内置菜谱来自 HowToCook(The Unlicense)。utils/recipes.js是生成产物,不要手改,改了会被重新生成覆盖。如需更新菜谱: git clone --depth 1 https://github.com/Anduin2017/HowToCook.git python scripts/build-recipes-from-howtocook.py <HowToCook路径> utils/recipes.js node tests/recipes.test.js # 生成后务必跑一次校验 生成规则与字段映射详见docs/菜谱库说明.md。
📦 开源前检查清单
将本项目发布到公开仓库前,请确认:
utils/cloud.js中的publishableKey与endpoint已替换为占位符或你自己的实例配置
project.config.json中的appid已替换为你自己的小程序 AppID
- 已在 WorkBuddy Cloud 实例中创建上述数据表并配置 RLS 策略(或已在文档中说明)
- 微信公众平台已配置服务器域名(
mp-api.app.workbuddy.host、api.open-meteo.com)
- 如需订阅消息,已配置模板 ID(见
utils/subscribe.config.js)
- 添加
.gitignore忽略node_modules/、miniprogram_npm/等
- 在仓库根目录放置
LICENSE文件
📄 许可证与致谢
- 本项目代码:采用 MIT License(见 LICENSE)。
- 内置菜谱数据:来自 HowToCook,许可为 The Unlicense(公共领域),可自由使用、修改、商用,无署名义务。菜谱页底部已标注来源。
- 天气数据:来自 Open-Meteo,免费公开气象数据。
- 感谢以上开源项目与数据服务,让这个小工具得以快速成型。
情侣小屋 · 使用说明
欢迎使用「情侣小屋」!这是一份写给使用者的指南,告诉你每个功能怎么玩。开发 / 部署相关内容请看仓库根目录的 README.md。
一、第一次打开
- 进入小程序后,首页会先展示品牌页和今天的天气。
- 点击 「一键登录」,用微信授权登录(不会读取你的微信昵称,昵称需要自己设置)。
- 登录后,首页会显示你和 TA 的专属卡片。
没绑定情侣前,大部分情侣功能处于「锁定」状态,先完成绑定即可解锁全部。
二、绑定情侣(两个人都要做)
情侣小屋是双人共享的,需要你们两个人都登录后「绑定」到一起。
发起方(你):
- 在首页点击「生成邀请码」(或在「绑定情侣」页操作)。
- 把生成的 6 位邀请码发给 TA,或直接在微信里分享小程序给 TA。
接受方(TA):
- 打开小程序并登录。
- 进入「绑定情侣」页,输入你发来的邀请码,点击绑定。
- 绑定成功后,两人就进入同一个「小屋」了。
设置在一起的日子:
- 绑定后,在首页点击「在一起」面板,可以设置你们正式在一起的日期和时间。
- 之后首页会实时显示「我们已经在一起 N 天 HH:MM:SS」。
只有发起邀请的一方可以「解除绑定」。解除后,对方下次进入时会自动清理残留的绑定关系。
三、记录我们
💗 纪念日
- 支持阳历和农历两种日期,可设每年的重复提醒。
- 可设置「提前 N 天提醒」,到期会通过应用内提醒 / 微信订阅消息通知你。
- 首页会自动显示最近的下一个纪念日和倒计时。
📖 情侣日记
- 写图文日记,记录每天的小事。
- 支持:文字、多张图片(每行 3 张)、心情、天气、定位标记。
- 双方都能看到、一起写,是你们的共同回忆。
📷 情侣相册
- 可以按主题建相册分类(比如「旅行」「美食」「宠物」)。
- 支持一次选多张批量上传,照片双方实时共享。
- 长按可删除。
四、一起生活
🍳 点菜做饭
- 内置 416 道家常菜谱,带准确用量和分步做法,离线也能看。
- 顶部可按分类筛选、按菜名搜索,列表滚动到底自动加载更多。
- 点开一道菜可看到食材清单、做法步骤、小贴士(含热量)。
- 互相点菜:看到想吃的菜,点「点它」下单,对方会收到通知;做好了可以标记为「已完成」。
- 我喜欢吃的:在菜谱上标记 TA 爱吃的,下次点菜一眼就能看到。
- 自定义菜谱:也可以自己添加拿手菜(带食材、做法)。
📅 日程
- 记录两人的约定(约会、电影、出差……)。
- 可设提醒提前量,临近时应用内强提醒。
- 支持单次 / 重复规则、优先级标记。
✨ 愿望清单
- 双方各写各的心愿(想去的地方、想要的东西……)。
- 写下的愿望会共享给对方,TA 看到后可以帮你实现;实现后标记为「已完成」。
五、关心与日常
💝 TA 的喜好
- 记录对方的喜好,分类如「爱吃」「想去」等。
- 点菜时能直接看到 TA 爱吃的菜,贴心不踩雷。
📍 实时位置
- 授权定位后,可以看到双方的实时位置和距离。
- 适合「你到哪儿了」「我们差多远」这种场景。
- 也可以手动标注一个地点(比如「公司」「家」)。
🌸 经期记录
- 记录经期开始 / 结束,填写周期长度、经期长度等信息。
- 小程序会根据历史自动学习并预测下一次时间,方便提前关心。
🌤 天气
- 首页直接显示今天的天气、温度区间、风力湿度和穿衣建议。
- 数据来自 Open-Meteo,免费实时更新。
六、我的
- 设置你的昵称和头像(微信登录不自动带昵称,建议第一时间设置,否则双方会显示为同一个名字)。
- 查看 / 管理登录状态。
七、常见问题
Q:为什么我看不到对方写的日记 / 相册? A:请确认两人都已登录且成功绑定到同一个小屋(首页显示双方头像即表示已绑定)。
Q:天气显示不出来? A:天气需要联网,且小程序后台需配置 api.open-meteo.com 为合法域名(开发者侧配置)。定位失败时会用默认城市兜底。
Q:实时位置不准 / 不显示? A:首次使用需授权定位权限;在手机系统设置里给小程序开启「位置」权限即可。
Q:邀请码用不了? A:不能用自己的邀请码绑定;邀请码已被使用或不存在都会提示。重新生成一个即可。
Q:数据存在哪里?安全吗? A:数据按「情侣关系」隔离存储,只有你们两个人能看到彼此的内容。具体技术说明见 README 的「安全与隐私」章节。
Q:菜谱能自己加吗? A:可以。在「点菜做饭」里添加自定义菜谱,只有你们两人共享。
希望这个小屋,能装下你们的小日子 💗
部分功能截图



