Files
wxserver/云开发功能说明.md
T
yuming 3965e542fc
部署到群晖 / deploy (push) Failing after 6m22s
接入自建后端 + Gitea CI/CD
- 新增 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>
2026-06-01 15:44:09 +08:00

415 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 生日提醒小程序 - 云开发功能说明
## 📁 项目结构
```
生日提醒小程序/
├── cloudfunctions/ # 云函数目录
│ ├── login/ # 获取用户openid
│ │ ├── index.js
│ │ ├── config.json
│ │ └── package.json
│ ├── syncAnniversary/ # 同步纪念日数据
│ │ ├── index.js
│ │ ├── config.json
│ │ └── package.json
│ └── sendReminder/ # 发送提醒消息
│ ├── index.js
│ ├── config.json # 包含定时触发器配置
│ └── package.json
├── pages/ # 小程序页面
├── utils/ # 工具函数
├── app.js # 应用入口(已添加云开发初始化)
├── app.json # 应用配置
└── project.config.json # 项目配置
```
---
## 🔧 核心功能实现
### 1. 云开发初始化(app.js
```javascript
// 应用启动时初始化云开发
wx.cloud.init({
env: 'cloudbase-1gk3x0ia3a6b1f80',
traceUser: true
})
// 自动获取用户openid
await wx.cloud.callFunction({ name: 'login' })
```
**作用**
- 连接到你的云开发环境
- 获取用户唯一标识(openid
- 为后续功能提供基础
---
### 2. 订阅消息授权(add-anniversary.js
```javascript
// 用户添加纪念日并开启提醒时
wx.requestSubscribeMessage({
tmplIds: ['6J7Stt-lu7DKU6jblJ0nZGq_D81z5glnksf7qWfy5Yw']
})
```
**流程**
1. 用户添加纪念日
2. 开启"是否提醒"开关
3. 点击保存
4. 弹出订阅授权弹窗
5. 用户点击"允许"
6. 数据保存到本地和云端
**效果**
- ✅ 用户授权后才能收到推送
- ✅ 一次授权,长期有效
- ✅ 用户可随时管理订阅
---
### 3. 数据云端同步(syncAnniversary 云函数)
**支持的操作**
#### 添加纪念日
```javascript
wx.cloud.callFunction({
name: 'syncAnniversary',
data: {
action: 'add',
data: { ...anniversaryData }
}
})
```
#### 更新纪念日
```javascript
wx.cloud.callFunction({
name: 'syncAnniversary',
data: {
action: 'update',
data: { id, ...anniversaryData }
}
})
```
#### 删除纪念日
```javascript
wx.cloud.callFunction({
name: 'syncAnniversary',
data: {
action: 'delete',
data: { id }
}
})
```
**数据结构**
```javascript
{
_id: "cloud-generated-id",
_openid: "user-openid", // 自动添加
personId: "person-id",
personName: "张三",
type: "birthday",
solarYear: 1990,
solarMonth: 5,
solarDay: 15,
remindEnabled: true,
remindDays: 7,
remark: "记得买蛋糕",
createTime: Date,
updateTime: Date
}
```
---
### 4. 定时发送提醒(sendReminder 云函数)
**执行时间**:每天上午9:00
**执行流程**
```
1. 查询所有启用提醒的纪念日
2. 遍历每个纪念日
3. 计算距离纪念日还有多少天
4. 判断是否需要提醒
- 当天生日:发送
- 提前N天:发送(N=用户设置的remindDays
5. 检查今天是否已发送
6. 调用微信API发送订阅消息
7. 记录提醒日志
```
**提醒内容示例**
```
称呼:张三
临近日期:还有3天
生日日期:2025年10月30日
温馨提示:别忘了准备一份礼物哦!
```
**日志记录**
```javascript
{
anniversaryId: "anniversary-id",
personName: "张三",
typeName: "公历生日",
daysUntil: 3,
sendDate: Date,
status: "success" // 或 "failed"
}
```
---
## 🔄 数据流程图
### 用户添加纪念日
```
用户填写表单
开启提醒开关
点击保存
[请求订阅授权] ← 用户授权
保存到本地存储
同步到云数据库 ← 包含 openid
完成
```
### 定时提醒流程
```
每天 9:00
云函数被触发
查询云数据库
筛选需要提醒的纪念日
循环处理每条记录
计算剩余天数
满足条件?
├─ 是 → 发送订阅消息 → 记录日志
└─ 否 → 跳过
完成
```
---
## 🎯 关键技术点
### 1. openid 的作用
```javascript
// openid 是用户在你的小程序中的唯一标识
{
"_openid": "oABCD1234567890", // 自动添加到数据库记录
"personName": "张三",
...
}
```
**用途**
- 区分不同用户的数据
- 发送订阅消息时指定接收者
- 保证数据安全(用户只能访问自己的数据)
### 2. 订阅消息模板
**你的模板信息**
```
模板ID: 6J7Stt-lu7DKU6jblJ0nZGq_D81z5glnksf7qWfy5Yw
字段映射:
- name1.DATA → 称呼(人员姓名)
- thing2.DATA → 临近日期(还有X天)
- thing6.DATA → 生日日期(2025年10月30日)
- thing5.DATA → 温馨提示(备注或默认文案)
```
### 3. 定时触发器
**Cron 表达式**`0 0 9 * * * *`
```
秒 分 时 日 月 星期 年
0 0 9 * * * *
含义:每天上午9点0分0秒执行
```
**修改提醒时间**
```
每天早上8点: 0 0 8 * * * *
每天晚上8点: 0 0 20 * * * *
每天早晚两次: 0 0 8,20 * * * *
```
---
## 📊 数据库设计
### anniversaries(纪念日表)
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| _id | String | 主键(自动生成) | "5f1e..." |
| _openid | String | 用户openid(自动) | "oABC..." |
| personId | String | 人员ID | "id_123..." |
| personName | String | 人员姓名 | "张三" |
| type | String | 类型 | "birthday" |
| solarMonth | Number | 公历月份 | 10 |
| solarDay | Number | 公历日期 | 30 |
| remindEnabled | Boolean | 是否提醒 | true |
| remindDays | Number | 提前天数 | 7 |
| remark | String | 备注 | "买蛋糕" |
### remind_logs(提醒日志表)
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| _id | String | 主键(自动生成) | "5f1e..." |
| anniversaryId | String | 纪念日ID | "5f1e..." |
| personName | String | 人员姓名 | "张三" |
| daysUntil | Number | 剩余天数 | 3 |
| sendDate | Date | 发送时间 | Date对象 |
| status | String | 状态 | "success" |
---
## 🚨 注意事项
### 1. 订阅消息限制
- ✅ 用户主动触发授权(不能自动弹出)
- ✅ 一次授权一个模板
- ✅ 用户可以随时取消订阅
- ❌ 不能发送营销类消息
### 2. 云函数限制
**免费额度**(每天):
- 调用次数:10万次
- 运行时间:40万GBs
- 出流量:5GB
**对于个人用户,完全够用!**
### 3. 数据库限制
**免费额度**
- 容量:5GB
- 读操作:5万次/天
- 写操作:3万次/天
**估算**
- 100个用户,每人10条纪念日 = 1000条记录
- 每条约1KB,总共约1MB
- 完全在免费额度内!
---
## 🔍 调试技巧
### 1. 查看云函数日志
```
云开发控制台 → 云函数 → 选择函数 → 日志
```
**可以看到**
- 函数执行时间
- 返回结果
- 错误信息
- console.log 输出
### 2. 测试云函数
```
云开发控制台 → 云函数 → 选择函数 → 测试
输入测试参数:{}
点击"运行测试"
```
### 3. 查看数据库
```
云开发控制台 → 数据库 → 选择集合
可以:
- 查看所有记录
- 编辑数据
- 删除数据
- 导出数据
```
### 4. 模拟定时触发
```javascript
// 临时修改 Cron 表达式为每分钟执行
"0 */1 * * * * *"
// 测试完成后改回
"0 0 9 * * * *"
```
---
## 💡 优化建议
### 1. 添加提醒历史页面
显示用户收到的所有提醒记录。
### 2. 支持多个提醒时间
比如提前7天、3天、当天各提醒一次。
### 3. 自定义提醒文案
让用户可以自定义温馨提示内容。
### 4. 提醒统计
显示总共发送了多少条提醒,成功率等。
---
## 🎉 总结
现在你的小程序具备了完整的云端能力:
**数据云端存储** - 永不丢失
**自动推送提醒** - 不再遗忘
**多设备同步** - 随处访问
**安全可靠** - openid隔离
**开始享受智能生日提醒服务吧!** 🎂