3965e542fc
部署到群晖 / deploy (push) Failing after 6m22s
- 新增 server/:Node + Express + SQLite + node-cron 实现登录、纪念日 CRUD 和定时订阅消息推送 - 新增 .gitea/workflows/deploy.yml:推送即触发群晖 Docker 部署,监听 15002 - utils/api.js:自动按 envVersion 切换本地/线上 BASE_URL - app.js 与 add-anniversary.js 移除 wx.cloud 调用,改走自建后端 - cloudfunctions/ 暂保留以便回滚 - 一并提交此前未入库的首页 / 设置页 / 日历 / 万年历等改造 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
7.0 KiB
7.0 KiB
生日提醒小程序 - 云开发部署指南
📋 部署步骤概览
上传云函数 → 创建数据库集合 → 配置定时触发器 → 测试功能
🚀 第一步:上传云函数
1.1 打开云开发控制台
- 在微信开发者工具中,点击顶部菜单 "云开发"
- 进入云开发控制台
- 确认环境ID为:
cloudbase-1gk3x0ia3a6b1f80
1.2 上传云函数
需要上传3个云函数:
1. 上传 login 云函数
右键点击 cloudfunctions/login
→ 选择 "上传并部署:云端安装依赖"
→ 等待上传完成(约30秒)
2. 上传 syncAnniversary 云函数
右键点击 cloudfunctions/syncAnniversary
→ 选择 "上传并部署:云端安装依赖"
→ 等待上传完成(约30秒)
3. 上传 sendReminder 云函数
右键点击 cloudfunctions/sendReminder
→ 选择 "上传并部署:云端安装依赖"
→ 等待上传完成(约30秒)
1.3 验证上传结果
在云开发控制台 → 云函数,应该看到3个云函数:
- ✅ login
- ✅ syncAnniversary
- ✅ sendReminder
🗄️ 第二步:创建数据库集合
2.1 进入数据库管理
云开发控制台 → 数据库
2.2 创建集合
需要创建2个集合:
1. anniversaries(纪念日数据)
点击 "添加集合"
集合名称:anniversaries
权限设置:仅创建者可读写
字段说明:
{
_id: String, // 自动生成
_openid: String, // 自动生成(用户openid)
personId: String, // 人员ID
personName: String, // 人员姓名
type: String, // 类型:birthday/lunar_birthday/wedding等
customTypeName: String,// 自定义类型名称
isLunar: Boolean, // 是否农历
solarYear: Number, // 公历年份
solarMonth: Number, // 公历月份
solarDay: Number, // 公历日期
importance: String, // 重要程度
remindEnabled: Boolean,// 是否开启提醒
remindDays: Number, // 提前提醒天数
remark: String, // 备注
createTime: Date, // 创建时间
updateTime: Date // 更新时间
}
2. remind_logs(提醒日志)
点击 "添加集合"
集合名称:remind_logs
权限设置:仅创建者可读写
字段说明:
{
_id: String, // 自动生成
anniversaryId: String, // 纪念日ID
personName: String, // 人员姓名
typeName: String, // 类型名称
daysUntil: Number, // 剩余天数
sendDate: Date, // 发送日期
status: String, // 状态:success/failed
error: String // 错误信息(如果失败)
}
⏰ 第三步:配置定时触发器
3.1 进入触发器管理
云开发控制台 → 云函数 → sendReminder → 触发器
3.2 创建触发器
方法1:自动配置(推荐)
触发器已在 config.json 中配置,上传云函数时会自动创建:
{
"name": "dailyReminder",
"type": "timer",
"config": "0 0 9 * * * *"
}
方法2:手动创建
如果没有自动创建,手动添加:
点击 "新建触发器"
触发器名称:dailyReminder
触发周期:自定义
Cron表达式:0 0 9 * * * *
说明:每天上午9点执行
3.3 Cron 表达式说明
格式:秒 分 时 日 月 星期 年
常用配置:
0 0 9 * * * * - 每天上午9:00
0 0 8,20 * * * * - 每天上午8:00和晚上8:00
0 0 9 * * 1-5 * - 工作日上午9:00
🧪 第四步:测试功能
4.1 测试订阅消息授权
- 在小程序中添加一个纪念日
- 开启"是否提醒"开关
- 点击保存
- 应该弹出订阅消息授权弹窗
- 点击"允许"
4.2 测试云函数
在云开发控制台 → 云函数 → sendReminder:
点击 "测试"
输入参数:{}
点击 "运行测试"
查看返回结果:
{
"success": true,
"total": 1,
"successCount": 1,
"failCount": 0
}
4.3 查看数据库
在云开发控制台 → 数据库:
- anniversaries 集合:应该看到刚才添加的纪念日数据
- remind_logs 集合:如果触发了提醒,应该有日志记录
4.4 测试订阅消息接收
方法1:手动触发(立即测试)
在云开发控制台 → 云函数 → sendReminder → 运行测试
方法2:等待定时触发
等到第二天上午9:00,自动触发提醒
方法3:修改定时器(快速测试)
临时修改 Cron 表达式为:0 */1 * * * * *(每分钟执行一次)
测试完成后改回:0 0 9 * * * *
⚙️ 第五步:项目配置
5.1 修改 project.config.json
确认云函数根目录配置:
{
"cloudfunctionRoot": "cloudfunctions/",
"miniprogramRoot": "./",
"appid": "你的AppID",
"projectname": "生日提醒小程序"
}
5.2 确认 app.json
无需额外配置,订阅消息权限已自动启用。
🎯 功能验证清单
完成以下验证,确保功能正常:
- 云开发初始化成功(控制台无报错)
- 能够获取到用户 openid
- 添加纪念日时弹出订阅授权
- 纪念日数据同步到云端(查看数据库)
- 手动执行 sendReminder 云函数成功
- 定时触发器配置成功
- 能够收到订阅消息推送
🐛 常见问题
Q1: 云函数上传失败?
A: 检查网络连接,或手动安装依赖:
cd cloudfunctions/login
npm install
然后选择 "上传并部署:不安装依赖"
Q2: 获取不到 openid?
A:
- 确认已上传 login 云函数
- 在真机上测试(开发者工具可能有限制)
- 查看控制台日志
Q3: 订阅消息没有弹出?
A:
- 确认在真机上测试(开发者工具不支持)
- 检查模板ID是否正确
- 每个用户需要单独授权
Q4: 定时触发器不执行?
A:
- 确认 Cron 表达式正确
- 查看云函数日志
- 手动测试云函数是否正常
Q5: 收不到订阅消息?
A:
- 确认用户已授权订阅
- 检查数据库中有 openid
- 查看 remind_logs 是否有记录
- 检查云函数权限配置
📊 监控和维护
1. 查看云函数日志
云开发控制台 → 云函数 → 选择函数 → 日志
2. 查看提醒统计
查询 remind_logs 集合:
// 查看今天的提醒记录
db.collection('remind_logs')
.where({
sendDate: _.gte(new Date(new Date().toDateString()))
})
.get()
3. 数据备份
定期导出数据库数据:
云开发控制台 → 数据库 → 导出
💰 费用说明
免费额度(每天)
- 云函数调用:10万次
- 数据库读操作:5万次
- 数据库写操作:3万次
- 云存储容量:5GB
对于个人使用,完全免费!
🎉 部署完成!
现在你的生日提醒小程序已经具备了完整的推送提醒功能:
✅ 用户添加纪念日时自动请求订阅授权 ✅ 数据自动同步到云端 ✅ 每天上午9点自动检查并发送提醒 ✅ 提醒记录自动保存到数据库
享受你的智能生日提醒吧! 🎂