- 新增 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>
This commit is contained in:
+414
@@ -0,0 +1,414 @@
|
||||
# 生日提醒小程序 - 云开发功能说明
|
||||
|
||||
## 📁 项目结构
|
||||
|
||||
```
|
||||
生日提醒小程序/
|
||||
├── 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隔离
|
||||
|
||||
**开始享受智能生日提醒服务吧!** 🎂
|
||||
|
||||
Reference in New Issue
Block a user