Files
dailyLove/README.md
2026-01-14 00:06:59 +08:00

195 lines
5.9 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.
# dailyLove
## 公众号每日问候推送系统
一个基于 Spring Boot 4 和响应式编程的微信公众号每日问候推送系统,可定时推送天气、节日、纪念日等个性化信息。
## 功能特性
- **定时推送**每日早上7:30推送早安问候晚上22:00推送晚安问候
- **天气信息**:实时获取并推送当地天气情况
- **纪念日提醒**:自动计算恋爱纪念日、结婚纪念日及生日倒计时
- **节日祝福**:支持农历节日和节气提醒
- **个性化内容**:彩虹话、每日一言、贴心小提示等
- **响应式架构**:使用 WebFlux 和 WebClient 实现高性能异步处理
- **配置灵活**:支持外部配置和环境变量
## 技术栈
- **后端框架**Spring Boot 4.x
- **响应式编程**Spring WebFlux + WebClient
- **JSON处理**Jackson 3
- **工具库**Hutool
- **构建工具**Maven
- **JDK版本**JDK 25
- **原生镜像**GraalVM Native Image
## 快速开始
### 环境要求
- JDK 25+
- Maven 3.6+
- 微信公众平台账号
- 天行数据API密钥
### 配置说明
`application.yml` 中配置以下参数:
```yaml
# 微信相关配置
wechat:
app-id: "your-app-id" # 微信公众号AppID
app-secret: "your-app-secret" # 微信公众号AppSecret
open-id: "user-open-id" # 接收推送的用户OpenID
template-id-morning: "template-id-for-morning" # 早安模板消息ID
template-id-night: "template-id-for-night" # 晚安模板消息ID
# 天行数据API配置
daily-love:
data:
tianxin-key: "your-tianxin-api-key" # 天行数据API密钥
city-id: "101270106" # 城市ID
girl-birthday: "1995-06-28" # 女方生日
boy-birthday: "1995-03-30" # 男方生日
cat-birthday: "2022-10-23" # 宠物生日
love-day: "2022-07-16" # 恋爱纪念日
wedding-day: "2025-10-08" # 结婚纪念日
```
### 启动应用
```bash
# 编译项目
mvn clean package
# 运行应用
java -jar target/dailylove.jar
# 或使用Maven运行
mvn spring-boot:run
```
## 项目结构
```
src/
├── main/
│ ├── java/com/bamanker/dailylove/
│ │ ├── config/ # 配置类
│ │ ├── controller/ # 控制器
│ │ ├── domain/ # 数据模型
│ │ ├── service/ # 业务服务
│ │ ├── utils/ # 工具类
│ │ └── DailyLoveApplication.java
│ └── resources/
│ └── application.yml # 应用配置
└── test/
```
## 核心功能模块
### 1. 推送控制器
- [PushDailyController](file:///D:/myWork/dailyLove/src/main/java/com/bamanker/dailylove/controller/PushDailyController.java):处理早安/晚安推送逻辑
- 支持 `/pushMorning``/pushNight` 接口手动触发推送
### 2. 定时任务
- [PushTask](file:///D:/myWork/dailyLove/src/main/java/com/bamanker/dailylove/config/PushTask.java):配置定时推送任务
- Cron表达式`0 30 7 * * ?` (早上7:30) 和 `0 0 22 * * ?` (晚上22:00)
### 3. 外部服务调用
- 使用 WebClient 调用微信API获取访问令牌
- 调用天行数据API获取天气、彩虹话、每日一言等信息
## 配置项说明
| 配置项 | 描述 | 示例 |
| --------------------------- | -------------------- | ----------- |
| wechat.app-id | 微信公众号AppID | wx123456789 |
| wechat.app-secret | 微信公众号AppSecret | abc123... |
| wechat.open-id | 接收消息的用户OpenID | oABC123... |
| daily-love.data.tianxin-key | 天行数据API密钥 | 123abc... |
| daily-love.data.city-id | 城市ID | 101270106 |
## 自定义推送内容
系统会根据以下情况进行智能提醒:
- **恋爱纪念日**:显示恋爱天数及特殊纪念日提醒
- **生日提醒**:推送生日倒计时
- **节日祝福**:农历节日、节气等
- **天气预报**:当日/次日天气情况
- **个性化内容**:彩虹话、每日一言等
## 部署方式
### Docker部署
```bash
# 构建Docker镜像
docker build -t dailylove .
# 运行容器
docker run -d -p 13145:13145 --name dailylove dailylove
```
### 原生镜像部署
项目支持GraalVM原生镜像构建启动速度更快
```bash
# 构建原生镜像
./mvnw native:compile -Pnative
# 运行原生镜像
./target/dailylove
```
## 更新日志
### **v3.1.1-native**
- 优化了响应式编程实现,避免阻塞操作
· 移除了 PushDailyController 中的 .block() 阻塞操作
· 重构了异步数据处理逻辑,使用 Mono.zip 并发获取多个数据源
· 改善了错误处理机制
- 重构了配置管理,使用@ConfigurationProperties替代静态字段
· 创建了 DailyLoveProperties 类使用 @ConfigurationProperties 注解
· 更新了配置文件结构,使用更清晰的层次结构
· 添加了环境变量支持,提高了配置的灵活性
- 修复了定时任务失效问题
· 启用了 PushTask 定时任务类,使用 @Component 注解
· 添加了日志记录以便跟踪任务执行
- 改进了错误处理,增加全局异常处理器
· 创建了专门的 PushException 异常类
· 更新了全局异常处理器 GlobalExceptionHandler
· 在关键位置添加了错误映射和处理
- 增强了配置文件,支持环境变量
· 更新了 application.yml 文件,采用新的配置结构
· 添加了日志级别配置
· 为配置项提供了默认值和环境变量支持
### **v2.4.0-native**
- 升级到Spring Boot 4
- 使用WebClient替代OpenFeign
- 支持原生镜像构建
## 贡献指南
1. Fork 本仓库
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request
## 许可证
此项目采用 MIT 许可证。