78 Commits

Author SHA1 Message Date
bamanker
1c133b59f6 用webclient重构
All checks were successful
Build Push and Deploy Image / build (push) Successful in 25m25s
2026-01-13 15:54:21 +08:00
bamanker
e33eea291c 用webclient重构 2026-01-13 15:53:46 +08:00
bamanker
6f9816a695 变更为webclient响应式客户端 2026-01-12 18:07:12 +08:00
bamanker
06cfebccab 增加探针配置
All checks were successful
Build Push and Deploy Image / build (push) Successful in 22m32s
2026-01-08 13:59:30 +08:00
bamanker
54202d8fd7 Merge remote-tracking branch 'origin/version3-native-localBuild' into version3-native-localBuild 2026-01-08 13:32:16 +08:00
bamanker
21b8d2e6e6 修改原生镜像构建参数 2026-01-08 13:32:04 +08:00
b7b3d44992 更新 README.md 2026-01-08 13:05:09 +08:00
bamanker
1cb7828acf 修改计算日期差的api,增加了结婚纪念日
Some checks failed
Build Push and Deploy Image / build (push) Failing after 33m43s
2026-01-08 13:02:46 +08:00
xue-bamanker
2929e0d1c0 修复jackson序列化/反序列化时出现Cannot construct instance of...的问题
All checks were successful
Build Push and Deploy Image / build (push) Successful in 37m1s
2026-01-07 23:57:12 +08:00
bamanker
02f9c7afdf 修改了公众号推送模板
All checks were successful
Build Push and Deploy Image / build (push) Successful in 19m51s
2026-01-07 12:58:59 +08:00
bamanker
89ebf65b7d 修复了json获取格式错误的问题 2026-01-07 12:39:05 +08:00
bamanker
693939af54 修改deployment文件存活探针的端口 2026-01-06 09:38:32 +08:00
2b9ec9e2be 修复deployment中的nodeport无效问题
All checks were successful
Build Push and Deploy Image / build (push) Successful in 20m39s
2026-01-06 00:27:07 +08:00
bamanker
3352d7efc1 修改deployment文件中namespace属性
Some checks failed
Build Push and Deploy Image / build (push) Failing after 21m34s
2026-01-05 23:40:42 +08:00
bamanker
1118fa6b26 用jackson替换fastjson 2026-01-05 22:58:10 +08:00
bamanker
291e46921d 用jackson替换fastjson
Some checks failed
Build Push and Deploy Image / build (push) Failing after 23m5s
2026-01-05 22:49:53 +08:00
bamanker
740bc07a2b 用jackson替换fastjson 2026-01-05 22:36:44 +08:00
cf29b08d02 更新 deployment-temp.yml
Some checks failed
Build Push and Deploy Image / build (push) Failing after 12m22s
2026-01-05 18:54:34 +08:00
bamanker
8e2281060c 更改构建命令,适应gitea
Some checks failed
Build Push and Deploy Image / build (push) Has been cancelled
2026-01-05 18:08:25 +08:00
bamanker
e2d44f9e89 升级springboot为4.0.1 2026-01-05 17:51:38 +08:00
bamanker
40a3a12233 fix了k8s devops的配置 2023-11-30 23:25:26 +08:00
bamanker
7a145c40bd fix了k8s devops的配置 2023-11-28 00:55:23 +08:00
bamanker
89efefd7c1 fix了k8s devops的配置 2023-11-28 00:39:56 +08:00
bamanker
c3e0a2cf6e 增加了k8s devops的配置 2023-11-23 15:45:57 +08:00
bamanker
b80bdb6370 增加了k8s devops的配置 2023-11-23 15:38:44 +08:00
bamanker
9f35e58970 Merge remote-tracking branch 'origin/version3-native-localBuild' into version3-native-localBuild 2023-11-23 15:23:59 +08:00
bamanker
e0d0e9701b 增加了k8s devops的配置 2023-11-23 15:23:33 +08:00
bamanker
90c2dc3a05 增加了k8s devops的配置 2023-11-23 15:21:39 +08:00
bamanker
d51ffb35c9 增加了k8s devops的配置 2023-11-23 15:08:12 +08:00
bamanker
eaec895ff0 增加了k8s devops的配置 2023-11-23 15:03:54 +08:00
bamanker
4d660bbff8 增加了k8s devops的配置 2023-11-23 14:55:43 +08:00
bamanker
70f55ef987 增加了k8s devops的配置 2023-11-23 14:54:22 +08:00
bamanker
773a759473 增加了k8s devops的配置 2023-11-23 13:46:49 +08:00
bamanker
ed7ce1279a 增加了k8s devops的配置 2023-11-23 12:59:54 +08:00
bamanker
524f0f63ae 增加了k8s devops的配置 2023-11-23 11:47:21 +08:00
bamanker
a6699e26a7 增加了k8s devops的配置 2023-11-23 11:10:07 +08:00
bamanker
b79710a1fc 添加了GraalVM的原生镜像版本-本地编译版本
-修复了@Resource注入失败导致的程序跑不起来的问题
2023-11-13 15:30:11 +08:00
bamanker
af50397afb 添加了GraalVM的原生镜像版本-本地编译版本
-添加了dockerfile中workdir参数2
2023-11-11 21:31:37 +08:00
bamanker
888b0e670f 添加了GraalVM的原生镜像版本-本地编译版本
-添加了dockerfile中workdir参数2
2023-11-11 21:24:20 +08:00
bamanker
6067550bd2 添加了GraalVM的原生镜像版本-本地编译版本
-添加了dockerfile中workdir参数1
2023-11-11 21:04:18 +08:00
bamanker
e0d5d784f8 添加了GraalVM的原生镜像版本-本地编译版本
-添加了dockerfile中workdir参数
2023-11-11 20:49:55 +08:00
bamanker
5ae844ea33 添加了GraalVM的原生镜像版本-本地编译版本
-修复了若干bug(容器中应用无法打开的问题)
2023-11-11 20:33:14 +08:00
bamanker
6eaa123087 添加了GraalVM的原生镜像版本-本地编译版本
修改dockerfile中的ENTRYPOINT参数
2023-11-11 18:58:57 +08:00
bamanker
f8c2ea8206 添加了GraalVM的原生镜像版本-本地编译版本
修改dockerfile3
2023-11-11 18:34:16 +08:00
bamanker
cf10cec717 添加了GraalVM的原生镜像版本-本地编译版本
修改dockerfile3
2023-11-11 18:14:56 +08:00
bamanker
7513fac8d8 添加了GraalVM的原生镜像版本-本地编译版本
修改dockerfile2
2023-11-11 18:10:40 +08:00
bamanker
f46c78b9f1 添加了GraalVM的原生镜像版本-本地编译版本
修改dockerfile2
2023-11-11 18:07:03 +08:00
bamanker
659c8e6f3b 添加了GraalVM的原生镜像版本-本地编译版本
修改dockerfile1
2023-11-11 17:57:32 +08:00
bamanker
3d6530f148 添加了GraalVM的原生镜像版本-本地编译版本
修改dockerfile1
2023-11-11 17:52:40 +08:00
bamanker
0c00085e9f 添加了GraalVM的原生镜像版本-本地编译版本
修改dockerfile
2023-11-11 17:38:17 +08:00
bamanker
474b16c662 添加了GraalVM的原生镜像版本-本地编译版本
修改了构建器参数,增加了jfr监控等
2023-11-11 17:23:01 +08:00
bamanker
3a18a6b7a6 添加了GraalVM的原生镜像版本-本地编译版本3 2023-11-11 12:18:05 +08:00
bamanker
9cb5e77bb5 添加了GraalVM的原生镜像版本-本地编译版本2 2023-11-11 11:43:06 +08:00
bamanker
392c50ceb9 添加了GraalVM的原生镜像版本-本地编译版本1 2023-11-11 11:34:36 +08:00
bamanker
38152b7786 添加了GraalVM的原生镜像版本-本地编译版本 2023-11-11 11:27:14 +08:00
bamanker
e11418a3fa 添加了GraalVM的原生镜像版本 2023-11-09 23:43:24 +08:00
bamanker
62babb92ac 添加了GraalVM的原生镜像版本 2023-11-09 23:25:46 +08:00
bamanker
27096c2cd2 添加了GraalVM的原生镜像版本 2023-11-09 23:24:47 +08:00
bamanker
fc3ed87fe7 添加了GraalVM的原生镜像版本 2023-11-09 22:56:44 +08:00
bamanker
a58a15c674 优化了构建参数3 2023-06-13 19:54:41 +08:00
bamanker
57785ac9da 优化了构建参数2 2023-06-13 19:45:17 +08:00
bamanker
029d17a66c 优化了构建参数 2023-06-12 13:48:38 +08:00
bamanker
0e6c149597 123 2023-06-10 16:59:54 +08:00
bamanker
9e491112ff 增加了测试接口 ip/test 2023-05-15 16:07:50 +08:00
bamanker
4e7bdc6edd 增加了测试接口 ip/test 2023-05-15 12:54:23 +08:00
bamanker
a458f3c90a 修改了dockerfile文件并且增加了sh脚本 2023-05-15 12:47:43 +08:00
bamanker
5133ad69af 修改了dockerfile文件并且增加了sh脚本 2023-05-15 12:42:45 +08:00
bamanker
8deffb8629 修改了dockerfile文件并且增加了sh脚本 2023-05-15 12:37:26 +08:00
bamanker
d61951cbb4 修改了dockerfile文件并且增加了sh脚本 2023-05-15 12:35:21 +08:00
bamanker
ef76ad7bf8 修改了dockerfile文件并且增加了sh脚本 2023-05-15 12:32:47 +08:00
bamanker
2a2c27264a 修改了dockerfile文件并且增加了sh脚本 2023-05-15 12:19:50 +08:00
bamanker
ee17a6be4a 修改了dockerfile文件 2023-05-15 11:55:35 +08:00
bamanker
c32a7d5b55 修改了dockerfile文件 2023-05-15 11:44:27 +08:00
bamanker
c6f5b14615 修改了dockerfile文件 2023-05-15 11:18:32 +08:00
bamanker
d8acf918e6 修改了dockerfile文件 2023-05-15 11:04:16 +08:00
bamanker
9fd3611a20 增加了dockerfile文件 2023-05-14 15:16:02 +08:00
bamanker
acc021d2f1 修复了恋爱纪念日计算错误 2023-05-13 23:29:38 +08:00
bamanker
ebad21bf78 删除了nacos注册中心 2023-05-12 13:06:57 +08:00
28 changed files with 1520 additions and 502 deletions

3
.dockerignore Normal file
View File

@@ -0,0 +1,3 @@
*
!target/dailylove*
!Dockerfile

170
.gitea/workflows/build.yml Normal file
View File

@@ -0,0 +1,170 @@
name: Build Push and Deploy Image
on:
push:
#tag 触发
tags:
- 'v*'
# 分支触发
# branches:
# - main
workflow_dispatch: #手动构建h
#设置全局环境变量
env:
PATH: /opt/node/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
REGISTRY: ${{ secrets.DOCKER_REGISTRY }}
IMAGE_NAMESPACE: bamanker # todo 可以通过读取pom文件获取下面这些属性值
IMAGE_NAME: dailylove
APP_NAME: daily-love
# 构建 Job
jobs:
build:
runs-on: ubuntu-node22 # 如果host构建:linux_amd64
# container:
# image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/catthehacker/ubuntu:act-latest
steps:
- name: Print system info 1
run: echo " The job was automatically triggered by a ${{ gitea.event_name }} event."
- name: Print system info 2
run: echo " This job is now running on a ${{ runner.os }} server hosted by Gitea!"
- name: Print system info 3
run: echo " The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: Print env
run: env && blkid
- name: Install dependencies
run: |
apt-get update &&
apt-get install -y gettext &&
apt-get install -y maven &&
apt-get install -y sudo &&
apt-get install -y iptables
- name: Set up Docker
uses: http://139.9.216.111:3000/bamanker/setup-docker-action@v4.6.0
with:
# 版本大于28会有兼容性问题
version: type=archive,channel=stable,version=v27.4.0
daemon-config: |
{
"registry-mirrors":["https://docker.1ms.run"],
"dns": ["8.8.8.8", "114.114.114.114"]
}
- name: Generate maven config
uses: http://139.9.216.111:3000/bamanker/maven-settings-action@v3.1.0
with:
mirrors: '[{"id": "alimaven", "name": "aliyun maven", "mirrorOf": "central", "url": "http://maven.aliyun.com/nexus/content/groups/public/"}]'
# - uses: http://localhost:3000/bamanker/setup-node@v6
# with:
# node-version: 24
# cache: 'npm'
# - run: node -v
# 下载仓库源码依赖node环境因此构建服务器本地需要下载安装node并设置环境变量
- name: Checkout repository code
#使用自定义仓库action
uses: http://139.9.216.111:3000/bamanker/checkout@v4
# 获取 TAG 并设置为环境变量
- name: Get version
id: get_version
# e.g. refs/tags/v1.0.0
run: |
echo "APP_TAG=${GITHUB_REF/refs\/tags\/v}" >> $GITHUB_ENV
# 检查 TAG 并传参
- name: Set envVar
id: set_envar
run: |
echo "The app version is $APP_TAG" && echo "tag=$APP_TAG" >> $GITHUB_OUTPUT &&
echo "now workspace: ${{ github.workspace }}"
# 为其他配置文件注入环境变量
- name: Inject envVar
run: |
envsubst < ./deployment-temp.yml > ./deployment.yml &&
cat ./deployment.yml
# 安装java环境
- name: Set up Java
uses: http://139.9.216.111:3000/bamanker/setup-graalvm@v1
with:
distribution: 'graalvm'
java-version: '25.0.1'
cache: 'maven'
# maven 构建
- name: Build with Maven
run: mvn clean native:compile -DskipTests -Pnative
# 登录镜像仓库,方便后续上传镜像
- name: Login to Docker Registry
uses: http://139.9.216.111:3000/bamanker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
# # 获取时间戳
# - name: Get datetime
# id: datetime
# run: |
# echo "datetime=$(date '+%Y-%m-%d-%H-%M-%S')" >> $GITHUB_OUTPUT
# 构建并上传镜像
- name: Build and push Docker image
# uses: http://139.9.216.111:3000/bamanker/build-push-action@v4
# 获取上一步截取到的版本号,既 1.0.0
#只能这样接收
env:
TAG: ${{ steps.set_envar.outputs.tag }}
run: |
ls &&
docker build --file Dockerfile --tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ env.IMAGE_NAME }}:${{ env.TAG }} . &&
docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ env.IMAGE_NAME }}:${{ env.TAG }}
# uses: http://139.9.216.111:3000/bamanker/docker-build-push@v5
# with:
# context: .
## platforms: linux/amd64
# file: Dockerfile
# push: true
# tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ env.IMAGE_NAME }}:${{ env.TAG }}
#发布到 k8s
#安装 kubectl
- name: Setup kubectl
run: |
curl -LO "https://dl.k8s.io/release/v1.33.0/bin/linux/amd64/kubectl" &&
chmod +x kubectl &&
mv kubectl /usr/local/bin/
- name: Configure kubeconfig
# 假设您的 KUBE_CONFIG 秘密是 Base64 编码的 kubeconfig 文件内容
run: |
# 1. 创建 ~/.kube 目录
mkdir -p $HOME/.kube
# 2. 将 Base64 编码的 KUBE_CONFIG 秘密解码并写入默认配置文件
echo "${{ secrets.KUBE_CONFIG }}" | base64 -d > $HOME/.kube/config
# 3. 确保 kubectl 知道配置文件的位置 (可选, 但安全)
echo "KUBECONFIG=$HOME/.kube/config" >> $GITHUB_ENV
- name: Deploy with kubectl
run: |
kubectl apply -f ./deployment.yml
- name: k8s Check Pods Health
run: |
kubectl get pod -n default -l app=${{ env.APP_NAME }}
- name: k8s Update Deployment
run: |
kubectl rollout restart deployment ${{ env.APP_NAME }}

4
.gitignore vendored
View File

@@ -1,6 +1,6 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
@@ -30,4 +30,4 @@ build/
!**/src/test/**/build/
### VS Code ###
.vscode/
.vscode/

11
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,11 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 已忽略包含查询文件的默认文件夹
/queries/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
/.idea/

5
Dockerfile Normal file
View File

@@ -0,0 +1,5 @@
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/ubuntu:jammy
MAINTAINER bamanker
COPY target/dailylove /root/dailylove/
EXPOSE 13145
CMD /root/dailylove/dailylove -XX:StartFlightRecording='filename=recording.jfr,dumponexit=true,duration=10s'

12
LICENSE
View File

@@ -1,12 +0,0 @@
Copyright (c) 2023 bamanker
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

View File

@@ -1,36 +1,27 @@
# dailyLove
#### 介绍
#### 软件架构
软件架构说明
#### 安装教程
1. xxxx
2. xxxx
3. xxxx
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
# dailyLove
#### 介绍
公众号每日问候推送
#### 软件架构
软件架构说明
#### 安装教程
1. xxxx
2. xxxx
3. xxxx
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request

101
deployment-temp.yml Normal file
View File

@@ -0,0 +1,101 @@
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: $APP_NAME # 标签 用于选择器
version: $APP_TAG
name: $APP_NAME # Deployment名称
namespace: default # 一定要写名称空间
spec:
progressDeadlineSeconds: 600
replicas: 1 # 副本数 1个 pod
revisionHistoryLimit: 2
selector:
matchLabels:
app: $APP_NAME # 选择器 匹配 pod 标签
strategy:
rollingUpdate:
maxSurge: 50%
maxUnavailable: 50%
type: RollingUpdate
template:
metadata:
labels:
app: $APP_NAME # pod 标签
version: $APP_TAG
spec:
imagePullSecrets:
- name: dockerhub-id #提前在项目下配置访问私有镜像仓库的账号密码
containers:
- name: $APP_NAME # 容器名称
image: $REGISTRY/$IMAGE_NAMESPACE/$IMAGE_NAME:$APP_TAG # 镜像地址
imagePullPolicy: Always
# 存活探针配置
livenessProbe: # 存活探针:失败意味着应用彻底挂了,需要重启来恢复
httpGet:
path: /actuator/health/liveness # 探针路径
port: 13145 # 探针端口
scheme: HTTP # 协议
initialDelaySeconds: 20 # 容器启动后延迟 xx秒开始检查
periodSeconds: 10 # 每隔 15秒检查一次
timeoutSeconds: 5 # 10秒未返回结果则超时
# successThreshold: 1 # 成功 1 次就认定为健康
failureThreshold: 3 # 探测失败后的重试次数,当达到这个次数后就判定结果为失败,重启容器
#就绪探针配置
readinessProbe:
httpGet:
path: /actuator/health/readiness # 探针路径
port: 13145 # 探针端口
scheme: HTTP # 协议
initialDelaySeconds: 10 # 容器启动后等 30 秒再开始检查
periodSeconds: 5 # 每 5 秒检查一次,比存活探针频繁
timeoutSeconds: 5 # 超时时间 3 秒
# successThreshold: 1 # 成功 1 次就认为就绪
failureThreshold: 2 # 失败 3 次才认为未就绪,会从负载均衡摘掉
# 启动探针配置(可选,启动慢的应用必须配)
# startupProbe:
# httpGet:
# path: /actuator/health/liveness # 用存活探针的路径
# port: 13145
# scheme: HTTP
# initialDelaySeconds: 0 # 立即开始检查
# periodSeconds: 5 # 每 5 秒检查一次
# timeoutSeconds: 3 # 超时时间 3 秒
# successThreshold: 1 # 成功 1 次就认为启动完成
# failureThreshold: 30 # 失败 30 次150 秒)才认为启动失败
# 生命周期钩子,优雅关闭
lifecycle:
preStop:
sleep:
seconds: 10 #容器停止前先等 10 秒,让流量切走
ports:
- containerPort: 13145 # 应用端口
protocol: TCP
# 资源限制
resources:
limits:
cpu: 99m # 最多 0.1核 CPU
memory: 65Mi # 最多 65m 内存
# 环境变量配置
env:
- name: TZ
value: "Asia/Shanghai"
---
apiVersion: v1
kind: Service
metadata:
labels:
app: $APP_NAME
name: $APP_NAME
namespace: default
spec:
type: NodePort
externalTrafficPolicy: Local
ports:
- name: http
protocol: TCP
port: 13145
nodePort: 30045
selector:
app: $APP_NAME

187
pom.xml
View File

@@ -5,22 +5,38 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
<version>4.0.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<groupId>com.bamanker</groupId>
<artifactId>dailyLove</artifactId>
<version>0.1.3</version>
<name>dailyLove</name>
<description>dailyLove</description>
<artifactId>dailylove</artifactId>
<version>v2.4.0-native</version>
<name>dailylove</name>
<description>dailylove-forK8S</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<fastjson.version>2.0.21</fastjson.version>
<openfeign.version>3.1.5</openfeign.version>
<nacos.version>2021.1</nacos.version>
<hutool.version>5.8.10</hutool.version>
<java.version>25</java.version>
<maven.compiler.source>25</maven.compiler.source>
<maven.compiler.target>25</maven.compiler.target>
<!-- <fastjson.version>2.0.60</fastjson.version>-->
<!-- <openfeign.version>5.0.0</openfeign.version>-->
<hutool.version>5.8.25</hutool.version>
<docker.private.repository>registry.cn-chengdu.aliyuncs.com/bamanker</docker.private.repository>
<!-- <docker.private.repository>172.17.0.1:10888/my_work</docker.private.repository>-->
</properties>
<dependencies>
<dependency>
@@ -28,62 +44,145 @@
<artifactId>hutool-core</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${openfeign.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-openfeign</artifactId>-->
<!-- <version>${openfeign.version}</version>-->
<!-- </dependency>-->
<!-- 如果需要显式指定 Jackson 3 -->
<dependency>
<groupId>tools.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.fastjson2</groupId>-->
<!-- <artifactId>fastjson2</artifactId>-->
<!-- <version>${fastjson.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<!-- Spring Boot Actuator提供健康检查端点 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>dailylove</finalName>
<!--指定filtering=true.maven的占位符解析表达式就可以用于它里面的文件-->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<!--为本机映像程序添加配置,生成的配置文件位于
META-INF/native-image/groupID/artifactID/native-image.properties
也可以手动配置-->
<configuration>
<mainClass>com.bamanker.dailylove.DailyLoveApplication</mainClass>
<buildArgs>
<!--开启dashboard-->
<!-- <arg>-H:DashboardDump=dailylove -H:+DashboardAll</arg>-->
<buildArg>-H:+ReportExceptionStackTraces</buildArg>
<!--生成诊断报告-->
<buildArg>-H:+PrintAnalysisCallTree</buildArg>
<!--开启监控代理-->
<buildArg>--enable-monitoring=jfr,heapdump,jvmstat</buildArg>
<!-- <arg>&#45;&#45;pgo</arg>-->
<!---Ob: 快速构建模式,编译快但性能差点,适合开发调试-->
<buildArg>-Ob</buildArg>
<!-- <buildArg>&#45;&#45;gc=G1</buildArg>-->
<!-- <arg>-march=native</arg>-->
<!-- <arg>-H:+BuildReport</arg>-->
</buildArgs>
<!--启动详细输出-->
<verbose>true</verbose>
<!--配置jvm参数-->
<!-- <jvmArgs>
</jvmArgs>-->
<!--<agent>
<enabled>true</enabled>
<options>
<option>experimental-class-loader-support</option>
</options>
</agent>-->
</configuration>
</plugin>
<plugin>
<!--支持yaml读取pom的参数-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<release>25</release>
<annotationProcessors>
<annotationProcessor>lombok.launch.AnnotationProcessorHider$AnnotationProcessor
</annotationProcessor>
</annotationProcessors>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -2,13 +2,16 @@ package com.bamanker.dailylove;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* @author bamanker
*/
@SpringBootApplication
@EnableFeignClients
//@EnableFeignClients
//开启定时任务
@EnableScheduling
//@ImportAutoConfiguration({FeignAutoConfiguration.class})
public class DailyLoveApplication {
public static void main(String[] args) {

View File

@@ -0,0 +1,139 @@
package com.bamanker.dailylove.config;
import cn.hutool.core.util.ClassUtil;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
/**
* 反射将所有项目类扫描加入到服务, 大力出奇迹的操作,感觉不太合适,不过先让服务跑起来
*
* @author bamanker
*/
@Component
public class ClassReflectConfig {
static boolean begin = true;
@Value("${scanclass}")
private Boolean scanclass;
@Autowired
private ThreadPoolTaskExecutor executorService;
@PostConstruct
public void init() {
if (scanclass) {
System.err.println("配置文件下 scanclass 开启了生成反射类");
} else {
System.err.println("配置文件下 scanclass 关闭了生成反射类");
}
synchronized (ClassReflectConfig.class) {
if (begin && scanclass) {
begin = false;
executorService.submit(() -> {
// {
// // 先抓取上一次的文件,生成
// try {
// BufferedReader utf8Reader = ResourceUtil
// .getUtf8Reader("classpath:/META-INF/native-image/reflect-config.json");
// String res = utf8Reader.lines().collect(Collectors.joining());
// List object = ProJsonUtil.toObject(res, List.class);
// for (Object object2 : object) {
// try {
// Map object22 = (Map) object2;
// handlerClass(Class.forName(ProMapUtil.getStr(object22, "name")));
// } catch (Exception e) {
// }
// }
// } catch (Exception e) {
// log.error("生成文件异常", e);
// }
// }
{
// 扫描系统第二级开始的包
String packageName = ClassReflectConfig.class.getPackageName();
String proPackageName = packageName.substring(0,
packageName.indexOf(".", packageName.indexOf(".") + 1));
// 可以在这个地方,添加除了服务以外其他的包,将会加入反射,以供graalvm生成配置
List<String> asList = Arrays.asList(proPackageName);
for (String spn : asList) {
try {
Set<Class<?>> doScan = ClassUtil.scanPackage(spn);
for (Class clazz : doScan) {
handlerClass(clazz);
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}
// handlerClass(RedisMessageListenerContainer.class);
});
}
}
}
private void handlerClass(Class clazz) {
if (clazz.equals(ClassReflectConfig.class)) {
// 跳过自己,避免形成循环
return;
}
executorService.submit(() -> {
try {
System.err.println("反射注入:" + clazz.getName());
// 生成所有的构造器
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
// 找到无参构造器然后实例化
Constructor declaredConstructor = clazz.getDeclaredConstructor();
declaredConstructor.setAccessible(true);
Object newInstance = declaredConstructor.newInstance();
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
try {
// 实例化成功,那么调用一下
method.setAccessible(true);
// graalvm必须需要声明方法
method.invoke(newInstance);
} catch (Throwable e) {
}
}
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
try {
field.setAccessible(true);
field.getType();
String name = field.getName();
field.get(newInstance);
} catch (Throwable e) {
}
}
System.err.println("反射注入完成:" + clazz.getName());
} catch (Throwable e) {
}
});
}
}

View File

@@ -1,11 +1,15 @@
package com.bamanker.dailylove.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
/**
* @descriptions
* @author bamanker
* @date 2026/1/8 12:12
* @return
*/
@Component
@RefreshScope
public class DailyLoveConfigure {
// public static String Access_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
// public static String Send_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={0}";
@@ -27,6 +31,7 @@ public class DailyLoveConfigure {
public static String Color_bbir;
public static String Color_cbir;
public static String Color_loveDay;
public static String Color_weddingDay;
public static String Color_remark;
@Value("${wechat.color.tomorrow:null}")
@@ -114,6 +119,11 @@ public class DailyLoveConfigure {
Color_loveDay = color_loveDay;
}
@Value("${wechat.color.weddingDay:null}")
public void setColor_weddingDay(String color_weddingDay) {
Color_loveDay = color_weddingDay;
}
@Value("${wechat.color.remark:null}")
public void setColor_remark(String color_remark) {
Color_remark = color_remark;
@@ -183,28 +193,35 @@ public class DailyLoveConfigure {
public static String Boy_Birthday;
@Value("${DL.boy-birthday}")
public void setBoyBirthday(String BoyBirthday) {
Boy_Birthday = BoyBirthday;
public void setBoyBirthday(String boyBirthday) {
Boy_Birthday = boyBirthday;
}
public static String Girl_Birthday;
@Value("${DL.girl-birthday}")
public void setGirlBirthday(String GirlBirthday) {
Girl_Birthday = GirlBirthday;
public void setGirlBirthday(String girlBirthday) {
Girl_Birthday = girlBirthday;
}
public static String Cat_Birthday;
@Value("${DL.cat-birthday}")
public void setCatBirthday(String CatBirthday) {
Cat_Birthday = CatBirthday;
public void setCatBirthday(String catBirthday) {
Cat_Birthday = catBirthday;
}
public static String Love_Day;
@Value("${DL.love-day}")
public void setLoveDay(String LoveDay) {
Love_Day = LoveDay;
public void setLoveDay(String loveDay) {
Love_Day = loveDay;
}
public static String Wedding_Day;
@Value("${DL.wedding-day}")
public void setWeddingDay(String weddingDay) {
Wedding_Day = weddingDay;
}
}

View File

@@ -1,15 +0,0 @@
package com.bamanker.dailylove.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig
{
@Bean
Logger.Level feignLoggerLevel()
{
return Logger.Level.FULL;
}
}

View File

@@ -1,16 +1,18 @@
package com.bamanker.dailylove.config;
import com.bamanker.dailylove.controller.PushDailyController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
//@Component
public class PushTask {
@Autowired
final
PushDailyController pushDailyController;
public PushTask(PushDailyController pushDailyController) {
this.pushDailyController = pushDailyController;
}
//每日 早上7.30,晚上22点 定时推送
@Scheduled(cron = "0 30 7 * * ?")
public void scheduledPushMorning(){

View File

@@ -0,0 +1,57 @@
package com.bamanker.dailylove.config;
import io.netty.handler.logging.LogLevel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import reactor.netty.transport.logging.AdvancedByteBufFormat;
/**
* @author bamanker
* @descriptions webclent 配置类
* @date 2026/1/12 17:33
* @return
*/
@Configuration
@Slf4j
public class WebClientConfig {
HttpClient httpClient = HttpClient.create().wiretap("reactor.netty.http.client.HttpClient",
LogLevel.DEBUG,
AdvancedByteBufFormat.TEXTUAL);
/**
* 创建WebClient Bean
*/
@Bean
public WebClient wechatWebClient() {
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.filter((request, next) -> {
log.info("wechatRequest: {}", request.url());
return next.exchange(request);
})
.baseUrl("https://api.weixin.qq.com/cgi-bin") // 基础URL
.defaultHeader("User-Agent", "WebFlux-Client") // 默认请求头
.build();
}
@Bean
public WebClient dateRemoteClient() {
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.filter((request, next) -> {
log.info("tianxingRequest: {}", request.url());
return next.exchange(request);
})
.baseUrl("https://apis.tianapi.com")
.defaultHeader("User-Agent", "WebFlux-Client")
.build();
}
}

View File

@@ -2,29 +2,50 @@ package com.bamanker.dailylove.controller;
import cn.hutool.core.date.ChineseDate;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson2.JSONObject;
import com.bamanker.dailylove.config.DailyLoveConfigure;
import com.bamanker.dailylove.domain.*;
import com.bamanker.dailylove.service.DataRemoteClient;
import com.bamanker.dailylove.service.WechatRequestClient;
import com.bamanker.dailylove.service.DataRemoteService;
import com.bamanker.dailylove.service.WechatRequestService;
import com.bamanker.dailylove.utils.DataUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aot.hint.annotation.RegisterReflectionForBinding;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import reactor.util.function.Tuple5;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.json.JsonMapper;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Date;
import java.util.function.Function;
/**
* @author bamanker
* @descriptions
* @date 2026/1/8 12:04
* @return
*/
@Slf4j
@RestController
public class PushDailyController {
@Resource
DataRemoteClient dataRemoteClient;
final
JsonMapper mapper;
final
DataRemoteService dataRemoteService;
final
WechatRequestService wechatRequestService;
public PushDailyController(JsonMapper mapper, DataRemoteService dataRemoteService, WechatRequestService wechatRequestService) {
this.mapper = mapper;
this.dataRemoteService = dataRemoteService;
this.wechatRequestService = wechatRequestService;
}
@Resource
WechatRequestClient wechatRequestClient;
/**
* 推送晚安
@@ -32,7 +53,8 @@ public class PushDailyController {
* @return
*/
@GetMapping("/pushNight")
public String pushNight() {
@RegisterReflectionForBinding(Weather.class)
public Mono<String> pushNight() {
ResultVo resultVo = ResultVo.initializeResultVo(DailyLoveConfigure.Open_ID,
DailyLoveConfigure.Template_ID_Night,
@@ -42,40 +64,70 @@ public class PushDailyController {
param1.setKey(DailyLoveConfigure.TianXin_Key);
param1.setCity(DailyLoveConfigure.City_ID);
param1.setType("7");
String weatherResp = dataRemoteClient.getWeather(param1);
JSONObject weatherJson = JSONObject.parseObject(weatherResp).getJSONArray("result").getJSONObject(0).getJSONArray("list").getJSONObject(1);
String city = JSONObject.parseObject(weatherResp).getJSONArray("result").getJSONObject(0).getString("area");
Weather weather = weatherJson.toJavaObject(Weather.class);
resultVo.setAttribute("tomorrow", new DataItem(weather.getDate() + " " + weather.getWeek(), DailyLoveConfigure.Color_tomorrow));
resultVo.setAttribute("city", new DataItem(city, DailyLoveConfigure.Color_city));
resultVo.setAttribute("weather", new DataItem(weather.getWeather(), DailyLoveConfigure.Color_weather));
resultVo.setAttribute("min_temperature", new DataItem(weather.getLowest(), DailyLoveConfigure.Color_minTem));
resultVo.setAttribute("max_temperature", new DataItem(weather.getHighest(), DailyLoveConfigure.Color_maxTem));
resultVo.setAttribute("quality", new DataItem(weather.getVis(), DailyLoveConfigure.Color_quality));
Mono<String> weatherRespMono = dataRemoteService.getWeather(param1.getKey(), param1.getCity(), param1.getType());
Mono<ResultVo> resultVoMono1 = weatherRespMono
.map(respJson -> mapper.readTree(respJson)
.get("result")
.get("area")
.toString())
.flatMap(city -> {
resultVo.setAttribute("city", new DataItem(city, DailyLoveConfigure.Color_city));
return Mono.just(resultVo);
});
Mono<ResultVo> resultVoMono2 = weatherRespMono
.map(respJson -> mapper.readTree(respJson)
.get("result")
.get("list")
.get(1))
.map(respJson -> mapper.treeToValue(respJson, Weather.class))
.flatMap(weather -> {
resultVo.setAttribute("tomorrow", new DataItem(weather.getDate() + " " + weather.getWeek(), DailyLoveConfigure.Color_tomorrow));
resultVo.setAttribute("weather", new DataItem(weather.getWeather(), DailyLoveConfigure.Color_weather));
resultVo.setAttribute("min_temperature", new DataItem(weather.getLowest(), DailyLoveConfigure.Color_minTem));
resultVo.setAttribute("max_temperature", new DataItem(weather.getHighest(), DailyLoveConfigure.Color_maxTem));
resultVo.setAttribute("quality", new DataItem(weather.getVis(), DailyLoveConfigure.Color_quality));
return Mono.just(resultVo);
});
// Mono<Tuple2<ResultVo, ResultVo>> zip = Mono.zip(resultVoMono1, resultVoMono);
TianXinReqParam param2 = new TianXinReqParam();
param2.setKey(DailyLoveConfigure.TianXin_Key);
String tipsResp = dataRemoteClient.getTips(param2);
String tips = JSONObject.parseObject(tipsResp).getJSONArray("result").getJSONObject(0).getString("content");
resultVo.setAttribute("tips", new DataItem(tips, DailyLoveConfigure.Color_tips));
Mono<ResultVo> resultVoMono3 = dataRemoteService.getTips(param2.getKey(), param2.getCity(), param2.getType())
.map(respJson -> mapper.readTree(respJson)
.get("result")
.get("content").asString())
.flatMap(tips -> {
resultVo.setAttribute("tips", new DataItem(tips, DailyLoveConfigure.Color_tips));
return Mono.just(resultVo);
});
Mono<ResultVo> resultVoMono4 = dataRemoteService.getNight(param2.getKey(), param2.getCity(), param2.getType())
.map(respJson -> mapper.readTree(respJson)
.get("result")
.get("content").asString())
.flatMap(night -> {
resultVo.setAttribute("night", new DataItem(night, DailyLoveConfigure.Color_night));
return Mono.just(resultVo);
});
Mono<ResultVo> resultVoMono5 = dataRemoteService.getRainbow(param2.getKey(), param2.getCity(), param2.getType())
.map(respJson -> mapper.readTree(respJson)
.get("result")
.get("content").asString())
.flatMap(rainbow -> {
resultVo.setAttribute("rainbow", new DataItem(rainbow, DailyLoveConfigure.Color_dailyCn));
return Mono.just(resultVo);
});
String nightResp = dataRemoteClient.getNight(param2);
String night = JSONObject.parseObject(nightResp).getJSONArray("result").getJSONObject(0).getString("content");
resultVo.setAttribute("night", new DataItem(night, DailyLoveConfigure.Color_night));
Mono<ResultVo> resultVoMono = Mono.zip(resultVoMono1, resultVoMono2, resultVoMono3, resultVoMono4, resultVoMono5)
.flatMap(new Function<Tuple5<ResultVo, ResultVo, ResultVo, ResultVo, ResultVo>, Mono<? extends ResultVo>>() {
@Override
public Mono<? extends ResultVo> apply(Tuple5<ResultVo, ResultVo, ResultVo, ResultVo, ResultVo> tuple) {
return Mono.just(tuple.getT1());
}
});
String rainbowResp = dataRemoteClient.getRainbow(param2);
String rainbow = JSONObject.parseObject(rainbowResp).getJSONArray("result").getJSONObject(0).getString("content");
resultVo.setAttribute("rainbow", new DataItem(rainbow, DailyLoveConfigure.Color_dailyCn));
// String englishResp = dataRemoteClient.getDailyEnglish(param2);
// String english = JSONObject.parseObject(englishResp).getJSONArray("result").getJSONObject(0).getString("en");
// resultVo.setAttribute("daily_english_en", new DataItem(english, DailyLoveConfigure.Color_dailyEn));
ChineseDate chineseDate = new ChineseDate(DateUtil.parseDate(weather.getDate()));
ChineseDate chineseDate = new ChineseDate(DateUtil.parseDate(LocalDate.now().toString()));
String festival = chineseDate.getFestivals();
String term = chineseDate.getTerm();
resultVo.setAttribute("lunar", new DataItem(chineseDate.toString(), DailyLoveConfigure.Color_chineseDate));
@@ -83,47 +135,60 @@ public class PushDailyController {
int girlBirthdays = DataUtils.getBirthdays(DailyLoveConfigure.Girl_Birthday);
log.debug("gbir_day:{}", girlBirthdays);
log.info("gbir_days:{}", girlBirthdays);
resultVo.setAttribute("gbir_day", new DataItem(girlBirthdays - 1 + "", DailyLoveConfigure.Color_gbir));
int boyBirthdays = DataUtils.getChineseBirthdays(DailyLoveConfigure.Boy_Birthday);
log.debug("bbir_day:{}", boyBirthdays);
log.info("bbir_days:{}", boyBirthdays);
resultVo.setAttribute("bbir_day", new DataItem(boyBirthdays - 1 + "", DailyLoveConfigure.Color_bbir));
int catBirthdays = DataUtils.getBirthdays(DailyLoveConfigure.Cat_Birthday);
log.debug("cbir_day:{}", catBirthdays);
log.info("cbir_days:{}", catBirthdays);
resultVo.setAttribute("cbir_day", new DataItem(catBirthdays - 1 + "", DailyLoveConfigure.Color_cbir));
String words = "普通的一天";
if (DataUtils.getBirthdays(DailyLoveConfigure.Love_Day) == 1) {
words = "明天是恋爱周年纪念日!永远爱你~mua";
} else if ((DataUtils.getLoveDays(DailyLoveConfigure.Love_Day)) % 100 == 1) {
} else if ((DataUtils.getDayDiff(DailyLoveConfigure.Love_Day)) % 100 == 99) {
words = "明天是恋爱百日纪念日!提前庆祝哦~";
} else if (DataUtils.getBirthdays(DailyLoveConfigure.Wedding_Day) == 1) {
words = "明天是结婚周年纪念日!提前庆祝哦~";
} else if (girlBirthdays == 1) {
words = "明天是lili大宝贝的生日啦";
} else if (boyBirthdays == 1) {
words = "明天是ss的生日!别忘了哦~";
words = "明天是菘菘的生日!别忘了哦~";
} else if (catBirthdays == 1) {
words = "明天是小离谱的生日!别忘了小鱼干!";
}
resultVo.setAttribute("words", new DataItem(words, DailyLoveConfigure.Color_remark));
int loveDays = DataUtils.getLoveDays(DailyLoveConfigure.Love_Day);
log.debug("love_day:{}", loveDays);
int loveDays = DataUtils.getDayDiff(DailyLoveConfigure.Love_Day);
log.info("love_days:{}", loveDays);
resultVo.setAttribute("love_day", new DataItem(loveDays + 1 + "", DailyLoveConfigure.Color_loveDay));
log.debug("resultVo:{}", resultVo);
WechatTokenParam wechatTokenParam = new WechatTokenParam();
wechatTokenParam.setAppid(DailyLoveConfigure.App_ID);
wechatTokenParam.setSecret(DailyLoveConfigure.App_Secret);
int weddingDays = DataUtils.getDayDiff(DailyLoveConfigure.Wedding_Day);
log.info("wedding_days:{}", weddingDays);
resultVo.setAttribute("wedding_day", new DataItem(weddingDays + 1 + "", DailyLoveConfigure.Color_weddingDay));
String accessTokenResp = wechatRequestClient.getAccessToken(wechatTokenParam);
log.debug("accessTokenJson:{}", accessTokenResp);
String token = JSONObject.parseObject(accessTokenResp).getString("access_token");
String responseStr = wechatRequestClient.sendMsg(resultVo, token);
return responseStr;
resultVoMono.flatMap(new Function<ResultVo, Mono<?>>() {
@Override
public Mono<?> apply(ResultVo resultVo) {
return Mono.just(resultVo);
}
}).log().block();
WechatTokenParam param3 = new WechatTokenParam();
param3.setAppid(DailyLoveConfigure.App_ID);
param3.setSecret(DailyLoveConfigure.App_Secret);
String accessToken = wechatRequestService.getAccessToken(param3.getGrant_type(), param3.getAppid(), param3.getSecret())
.map(respJson -> {
return mapper.readTree(respJson)
.get("access_token").asString();
}).log().block();
return wechatRequestService.sendMsg(accessToken, resultVo).log();
}
@@ -131,52 +196,86 @@ public class PushDailyController {
* 推送早安
*/
@GetMapping("/pushMorning")
public String pushMorning() {
TianXinReqParam param1 = new TianXinReqParam();
param1.setKey(DailyLoveConfigure.TianXin_Key);
param1.setCity(DailyLoveConfigure.City_ID);
param1.setType("1");
String weatherResp = dataRemoteClient.getWeather(param1);
Weather weather = JSONObject.parseObject(weatherResp).getJSONArray("result").getJSONObject(0).toJavaObject(Weather.class);
@RegisterReflectionForBinding(Weather.class)
public Mono<String> pushMorning() {
ResultVo resultVo = ResultVo.initializeResultVo(DailyLoveConfigure.Open_ID,
DailyLoveConfigure.Template_ID_Morning,
DailyLoveConfigure.Color_Top);
resultVo.setAttribute("now", new DataItem(weather.getDate() + " " + weather.getWeek(), DailyLoveConfigure.Color_Now));
resultVo.setAttribute("city", new DataItem(weather.getArea(), DailyLoveConfigure.Color_city));
resultVo.setAttribute("weather", new DataItem(weather.getWeather(), DailyLoveConfigure.Color_weather));
resultVo.setAttribute("min_temperature", new DataItem(weather.getLowest(), DailyLoveConfigure.Color_minTem));
resultVo.setAttribute("max_temperature", new DataItem(weather.getHighest(), DailyLoveConfigure.Color_maxTem));
resultVo.setAttribute("quality", new DataItem(weather.getQuality(), DailyLoveConfigure.Color_quality));
TianXinReqParam param1 = new TianXinReqParam();
param1.setKey(DailyLoveConfigure.TianXin_Key);
param1.setCity(DailyLoveConfigure.City_ID);
param1.setType("7");
Mono<String> weatherRespMono = dataRemoteService.getWeather(param1.getKey(), param1.getCity(), param1.getType());
Mono<ResultVo> resultVoMono1 = weatherRespMono
.map(respJson -> mapper.readTree(respJson)
.get("result")
.get("area")
.toString())
.flatMap(city -> {
resultVo.setAttribute("city", new DataItem(city, DailyLoveConfigure.Color_city));
return Mono.just(resultVo);
});
Mono<ResultVo> resultVoMono2 = weatherRespMono
.map(respJson -> mapper.readTree(respJson)
.get("result")
.get("list")
.get(0))
.map(respJson -> mapper.treeToValue(respJson, Weather.class))
.flatMap(weather -> {
resultVo.setAttribute("now", new DataItem(weather.getDate() + " " + weather.getWeek(), DailyLoveConfigure.Color_Now));
resultVo.setAttribute("weather", new DataItem(weather.getWeather(), DailyLoveConfigure.Color_weather));
resultVo.setAttribute("min_temperature", new DataItem(weather.getLowest(), DailyLoveConfigure.Color_minTem));
resultVo.setAttribute("max_temperature", new DataItem(weather.getHighest(), DailyLoveConfigure.Color_maxTem));
resultVo.setAttribute("quality", new DataItem(weather.getVis(), DailyLoveConfigure.Color_quality));
return Mono.just(resultVo);
});
// Mono<Tuple2<ResultVo, ResultVo>> zip = Mono.zip(resultVoMono1, resultVoMono);
TianXinReqParam param2 = new TianXinReqParam();
param2.setKey(DailyLoveConfigure.TianXin_Key);
// String tipsResp = dataRemoteClient.getTips(param2);
// String tips = JSONObject.parseObject(tipsResp).getJSONArray("result").getJSONObject(0).getString("content");
// resultVo.setAttribute("tips", new DataItem(tips, DailyLoveConfigure.Color_tips));
Mono<ResultVo> resultVoMono3 = dataRemoteService.getTips(param2.getKey(), param2.getCity(), param2.getType())
.map(respJson -> mapper.readTree(respJson)
.get("result")
.get("content").asString())
.flatMap(tips -> {
resultVo.setAttribute("tips", new DataItem(tips, DailyLoveConfigure.Color_tips));
return Mono.just(resultVo);
});
Mono<ResultVo> resultVoMono4 = dataRemoteService.getMorning(param2.getKey(), param2.getCity(), param2.getType())
.map(respJson -> mapper.readTree(respJson)
.get("result")
.get("content").asString())
.flatMap(morning -> {
resultVo.setAttribute("morning", new DataItem(morning, DailyLoveConfigure.Color_morning));
return Mono.just(resultVo);
});
Mono<ResultVo> resultVoMono5 = dataRemoteService.getRainbow(param2.getKey(), param2.getCity(), param2.getType())
.map(respJson -> mapper.readTree(respJson)
.get("result")
.get("content").asString())
.flatMap(rainbow -> {
resultVo.setAttribute("rainbow", new DataItem(rainbow, DailyLoveConfigure.Color_dailyCn));
return Mono.just(resultVo);
});
String morningResp = dataRemoteClient.getMorning(param2);
String morning = JSONObject.parseObject(morningResp).getJSONArray("result").getJSONObject(0).getString("content");
resultVo.setAttribute("morning", new DataItem(morning, DailyLoveConfigure.Color_morning));
Mono<ResultVo> resultVoMono = Mono.zip(resultVoMono1, resultVoMono2, resultVoMono3, resultVoMono4, resultVoMono5)
.flatMap(new Function<Tuple5<ResultVo, ResultVo, ResultVo, ResultVo, ResultVo>, Mono<? extends ResultVo>>() {
@Override
public Mono<? extends ResultVo> apply(Tuple5<ResultVo, ResultVo, ResultVo, ResultVo, ResultVo> tuple) {
return Mono.just(tuple.getT1());
}
});
String rainbowResp = dataRemoteClient.getRainbow(param2);
String rainbow = JSONObject.parseObject(rainbowResp).getJSONArray("result").getJSONObject(0).getString("content");
resultVo.setAttribute("rainbow", new DataItem(rainbow, DailyLoveConfigure.Color_dailyCn));
// String englishResp = dataRemoteClient.getDailyEnglish(param2);
// String english = JSONObject.parseObject(englishResp).getJSONArray("result").getJSONObject(0).getString("en");
// resultVo.setAttribute("daily_english_en", new DataItem(english, DailyLoveConfigure.Color_dailyEn));
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
String currentTime = dateFormat.format(date);
ChineseDate chineseDate = new ChineseDate(DateUtil.parseDate(currentTime));
ChineseDate chineseDate = new ChineseDate(DateUtil.parseDate(LocalDate.now().toString()));
String festival = chineseDate.getFestivals();
String term = chineseDate.getTerm();
resultVo.setAttribute("lunar", new DataItem(chineseDate.toString(), DailyLoveConfigure.Color_chineseDate));
@@ -184,47 +283,60 @@ public class PushDailyController {
int girlBirthdays = DataUtils.getBirthdays(DailyLoveConfigure.Girl_Birthday);
log.debug("gbir_day:{}", girlBirthdays);
log.info("gbir_days:{}", girlBirthdays);
resultVo.setAttribute("gbir_day", new DataItem(girlBirthdays + "", DailyLoveConfigure.Color_gbir));
int boyBirthdays = DataUtils.getChineseBirthdays(DailyLoveConfigure.Boy_Birthday);
log.debug("bbir_day:{}", boyBirthdays);
log.info("bbir_days:{}", boyBirthdays);
resultVo.setAttribute("bbir_day", new DataItem(boyBirthdays + "", DailyLoveConfigure.Color_bbir));
int catBirthdays = DataUtils.getBirthdays(DailyLoveConfigure.Cat_Birthday);
log.debug("cbir_day:{}", catBirthdays);
log.info("cbir_days:{}", catBirthdays);
resultVo.setAttribute("cbir_day", new DataItem(catBirthdays + "", DailyLoveConfigure.Color_cbir));
String words = "普通的一天";
if (DataUtils.getBirthdays(DailyLoveConfigure.Love_Day) == 0) {
words = "今天是恋爱周年纪念日!永远爱你~mua";
} else if ((DataUtils.getLoveDays(DailyLoveConfigure.Love_Day)) % 100 == 0) {
} else if ((DataUtils.getDayDiff(DailyLoveConfigure.Love_Day)) % 100 == 0) {
words = "今天是恋爱百日纪念日!永远爱你~";
} else if (DataUtils.getBirthdays(DailyLoveConfigure.Wedding_Day) == 0) {
words = "今天是结婚周年纪念日!永远爱你~";
} else if (girlBirthdays == 0) {
words = "今天是lili宝贝的生日生日快乐哟~";
} else if (boyBirthdays == 0) {
words = "今天是ss的生日!别忘了好好爱他~";
words = "今天是菘菘的生日!别忘了好好爱他~";
} else if (catBirthdays == 0) {
words = "今天是小离谱的生日!别忘了小鱼干!";
}
resultVo.setAttribute("words", new DataItem(words, DailyLoveConfigure.Color_remark));
int loveDays = DataUtils.getLoveDays(DailyLoveConfigure.Love_Day);
log.debug("love_day:{}", loveDays);
int loveDays = DataUtils.getDayDiff(DailyLoveConfigure.Love_Day);
log.info("love_days:{}", loveDays);
resultVo.setAttribute("love_day", new DataItem(loveDays + "", DailyLoveConfigure.Color_loveDay));
int weddingDays = DataUtils.getDayDiff(DailyLoveConfigure.Wedding_Day);
log.info("wedding_days:{}", weddingDays);
resultVo.setAttribute("wedding_day", new DataItem(weddingDays + "", DailyLoveConfigure.Color_weddingDay));
log.debug("resultVo:{}", resultVo);
WechatTokenParam wechatTokenParam = new WechatTokenParam();
wechatTokenParam.setAppid(DailyLoveConfigure.App_ID);
wechatTokenParam.setSecret(DailyLoveConfigure.App_Secret);
String accessTokenResp = wechatRequestClient.getAccessToken(wechatTokenParam);
log.debug("accessTokenJson:{}", accessTokenResp);
String token = JSONObject.parseObject(accessTokenResp).getString("access_token");
String responseStr = wechatRequestClient.sendMsg(resultVo, token);
return responseStr;
resultVoMono.flatMap((Function<ResultVo, Mono<?>>) resultVo1 -> Mono.just(resultVo1)).log().block();
WechatTokenParam param3 = new WechatTokenParam();
param3.setAppid(DailyLoveConfigure.App_ID);
param3.setSecret(DailyLoveConfigure.App_Secret);
String accessToken = wechatRequestService.getAccessToken(param3.getGrant_type(), param3.getAppid(), param3.getSecret())
.map(respJson -> {
return mapper.readTree(respJson)
.get("access_token").asString();
}).log().block();
return wechatRequestService.sendMsg(accessToken, resultVo).log();
}
@@ -234,12 +346,14 @@ public class PushDailyController {
* @param responseStr
*/
private void printPushLog(String responseStr) {
JSONObject jsonObject = JSONObject.parseObject(responseStr);
String msgCode = jsonObject.getString("errcode");
String msgContent = jsonObject.getString("errmsg");
JsonNode jsonNode = mapper.readTree(responseStr);
String msgCode = jsonNode.get("errcode").asString();
String msgContent = jsonNode.get("errmsg").asString();
// JSONObject jsonObject = JSONObject.parseObject(responseStr);
// String msgCode1 = jsonObject.getString("errcode");
// String msgContent1 = jsonObject.getString("errmsg");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("[ " + dateFormat.format(new Date()) + " ] : messageCode=" + msgCode + ",messageContent=" + msgContent);
}
}

View File

@@ -0,0 +1,27 @@
package com.bamanker.dailylove.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author bamanker
*/
@Slf4j
@RestController
public class TestController {
/**
* 处理GET请求的测试方法。
*
* @return 返回一个字符串,内容为"test ok!!!!!!!!",用于验证功能的正常运行。
*/
@GetMapping("/test")
public String test(){
return "test ok!!!!!!!!";
}
}

View File

@@ -4,6 +4,9 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author bamanker
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@@ -11,4 +14,8 @@ public class DataItem {
private String value;
private String color;
}

View File

@@ -0,0 +1,10 @@
package com.bamanker.dailylove.domain;
import lombok.Data;
@Data
public class ErrorResponse {
private Integer code;
private String message;
}

View File

@@ -0,0 +1,34 @@
package com.bamanker.dailylove.exception;
import com.bamanker.dailylove.domain.ErrorResponse;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import reactor.core.publisher.Mono;
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理运行时异常
*/
@ExceptionHandler(RuntimeException.class)
public Mono<ResponseEntity<ErrorResponse>> handleRuntimeException(RuntimeException e) {
ErrorResponse error = new ErrorResponse();
error.setCode(500);
error.setMessage(e.getMessage());
return Mono.just(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error));
}
/**
* 处理参数异常
*/
@ExceptionHandler(IllegalArgumentException.class)
public Mono<ResponseEntity<ErrorResponse>> handleIllegalArgumentException(IllegalArgumentException e) {
ErrorResponse error = new ErrorResponse();
error.setCode(400);
error.setMessage("参数错误: " + e.getMessage());
return Mono.just(ResponseEntity.status(HttpStatus.BAD_REQUEST).body(error));
}
}

View File

@@ -1,44 +0,0 @@
package com.bamanker.dailylove.service;
import com.bamanker.dailylove.domain.TianXinReqParam;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
/**
* 天行数据第三方接口
* @author baman
*/
@Component
@FeignClient(value = "TianXinDataRemoteClient",url = "${tianxin.server}")
public interface DataRemoteClient {
@GetMapping(value = "/tianqi/index",
consumes = {MediaType.APPLICATION_JSON_VALUE},
produces = {MediaType.APPLICATION_JSON_VALUE})
String getWeather(@SpringQueryMap TianXinReqParam param);
@GetMapping(value = "/caihongpi/index",
consumes = {MediaType.APPLICATION_JSON_VALUE},
produces = {MediaType.APPLICATION_JSON_VALUE})
String getRainbow(@SpringQueryMap TianXinReqParam param);
@GetMapping(value = "/ensentence/index",
consumes = {MediaType.APPLICATION_JSON_VALUE},
produces = {MediaType.APPLICATION_JSON_VALUE})
String getDailyEnglish(@SpringQueryMap TianXinReqParam param);
@GetMapping(value = "/qiaomen/index",
consumes = {MediaType.APPLICATION_JSON_VALUE},
produces = {MediaType.APPLICATION_JSON_VALUE})
String getTips(@SpringQueryMap TianXinReqParam param);
@GetMapping(value = "/zaoan/index",
consumes = {MediaType.APPLICATION_JSON_VALUE},
produces = {MediaType.APPLICATION_JSON_VALUE})
String getMorning(@SpringQueryMap TianXinReqParam param);
@GetMapping(value = "/wanan/index",
consumes = {MediaType.APPLICATION_JSON_VALUE},
produces = {MediaType.APPLICATION_JSON_VALUE})
String getNight(@SpringQueryMap TianXinReqParam param);
}

View File

@@ -0,0 +1,89 @@
package com.bamanker.dailylove.service;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Service
public class DataRemoteService {
final
WebClient webClient;
public DataRemoteService(@Qualifier("dateRemoteClient") WebClient dataRemoteService) {
this.webClient = dataRemoteService;
}
public Mono<String> getWeather(String key, String city, String type) {
return webClient.get()
.uri(uriBuilder -> uriBuilder
.path("/tianqi/index")
.queryParam("key", key)
.queryParam("city", city)
.queryParam("type", type)
.build())
.retrieve()
.bodyToMono(String.class);
}
public Mono<String> getRainbow(String key, String city, String type) {
return webClient.get()
.uri(uriBuilder -> uriBuilder
.path("/caihongpi/index")
.queryParam("key", key)
.queryParam("city", city)
.queryParam("type", type)
.build())
.retrieve()
.bodyToMono(String.class);
}
public Mono<String> getDailyEnglish(String key, String city, String type) {
return webClient.get()
.uri(uriBuilder -> uriBuilder
.path("/ensentence/index")
.queryParam("key", key)
.queryParam("city", city)
.queryParam("type", type)
.build())
.retrieve()
.bodyToMono(String.class);
}
public Mono<String> getTips(String key, String city, String type) {
return webClient.get()
.uri(uriBuilder -> uriBuilder
.path("/qiaomen/index")
.queryParam("key", key)
.queryParam("city", city)
.queryParam("type", type)
.build())
.retrieve()
.bodyToMono(String.class);
}
public Mono<String> getMorning(String key, String city, String type) {
return webClient.get()
.uri(uriBuilder -> uriBuilder
.path("/zaoan/index")
.queryParam("key", key)
.queryParam("city", city)
.queryParam("type", type)
.build())
.retrieve()
.bodyToMono(String.class);
}
public Mono<String> getNight(String key, String city, String type) {
return webClient.get()
.uri(uriBuilder -> uriBuilder
.path("/wanan/index")
.queryParam("key", key)
.queryParam("city", city)
.queryParam("type", type)
.build())
.retrieve()
.bodyToMono(String.class);
}
}

View File

@@ -1,21 +0,0 @@
package com.bamanker.dailylove.service;
import com.bamanker.dailylove.domain.ResultVo;
import com.bamanker.dailylove.domain.WechatTokenParam;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Component
@FeignClient(value = "WechatRequestClient", url = "https://api.weixin.qq.com/cgi-bin")
public interface WechatRequestClient {
@GetMapping("/token")
String getAccessToken(@SpringQueryMap WechatTokenParam param);
@PostMapping("/message/template/send?access_token={token}")
String sendMsg(ResultVo resultVo, @RequestParam("token") String token);
}

View File

@@ -0,0 +1,39 @@
package com.bamanker.dailylove.service;
import com.bamanker.dailylove.domain.ResultVo;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Service
public class WechatRequestService {
final
WebClient webClient;
public WechatRequestService(@Qualifier("wechatWebClient") WebClient dateRemoteWebClient) {
this.webClient = dateRemoteWebClient;
}
public Mono<String> getAccessToken(String grant_type,String appid,String secret){
return webClient.get()
.uri(uriBuilder -> uriBuilder
.path("/token")
.queryParam("grant_type", grant_type)
.queryParam("appid", appid)
.queryParam("secret", secret)
.build())
.retrieve()
.bodyToMono(String.class);
}
public Mono<String> sendMsg(String token, ResultVo resultVo){
return webClient.post()
.uri("/message/template/send?access_token={token}", token)
.bodyValue(resultVo)
.retrieve()
.bodyToMono(String.class);
}
}

View File

@@ -5,10 +5,11 @@ import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.bamanker.dailylove.config.DailyLoveConfigure;
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.util.Strings;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;
@@ -28,14 +29,14 @@ public class DataUtils {
ChineseDate chineseBir = new ChineseDate(DateUtil.parseDate(DailyLoveConfigure.Boy_Birthday));
log.info("生日的农历日期是:{}", chineseBir);
//截取日、月
String[] strings = Strings.split(boyBirthday, '-');
// String[] strings = Strings.split(boyBirthday, '-');
int chineseMonth = chineseBir.getMonth();
int chineseDay = chineseBir.getDay();
//获取当前日期的年
Calendar dateToday = Calendar.getInstance();
int todayYear = dateToday.get(Calendar.YEAR);
//把生日的年改为今年,方便计算
ChineseDate chineseDate = new ChineseDate(todayYear, chineseMonth, chineseDay,false);
ChineseDate chineseDate = new ChineseDate(todayYear, chineseMonth, chineseDay, false);
//农历日期对应的阳历日期
int gregorianDay = chineseDate.getGregorianDay();
//计算时间差
@@ -121,22 +122,36 @@ public class DataUtils {
return days;
}
/**
* 计算恋爱天数 days
*
* @param loveday
* @return
*/
public static int getLoveDays(String loveday) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
int days = 0;
try {
long time = System.currentTimeMillis() - dateFormat.parse(loveday).getTime();
days = (int) (time / (24 * 60 * 60 * 1000));
// /**
// * 计算恋爱天数 days
// *
// * @param loveDay
// * @return
// */
// public static int getLoveDays(String loveDay) {
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
// int days = 0;
// try {
// long time = System.currentTimeMillis() - dateFormat.parse(loveDay).getTime();
// days = (int) (time / (24 * 60 * 60 * 1000));
//
// } catch (ParseException e) {
// e.printStackTrace();
// }
// return days;
// }
} catch (ParseException e) {
e.printStackTrace();
}
return days;
/**
* @param startDay
* @return int
* @descriptions 计算日期茶 days
* @author bamanker
* @date 2026/1/8 12:38
*/
public static int getDayDiff(String startDay) {
LocalDate dateNow = LocalDate.now();
LocalDate dateStart = LocalDate.parse(startDay);
return (int) ChronoUnit.DAYS.between(dateStart, dateNow);
}
}

View File

@@ -0,0 +1,79 @@
server:
port: 13145
spring:
application:
name: dailyLove
cloud:
refresh:
enabled: false
DL:
tianxin-key: 72fbbb9e75e338ea6a240e83972f287c
city-id: 101270106
girl-birthday: 1995-06-28
boy-birthday: 1995-3-30
love-day: 2022-07-16
cat-birthday: 2022-10-23
wedding-day: 2025-10-08
wechat:
app-id: wxba68702957f8b93e
app-secret: 834078bb149409bfca4fe693ea7c4c1c
# ME: oo5bL6bK_4TC0tb-Wa5oiugTPVeQ
#LILI: oo5bL6QafHJa9zQNYKS0fIhFC0zM
open-id: oo5bL6bK_4TC0tb-Wa5oiugTPVeQ
template-id-morning: dWNAL-ZOzpBhnByFoTamt9DlJQYLB5z3ldKLvQstyU4
template-id-night: oraLiXC-8740stYc1a7mpzUFHiAIRaM3JikqibZ2grE
color:
now: '#99CCCC'
tomorrow: '#99CCCC'
chineseDate: '#99CC66'
top: '#FF0000'
weather: '#66CCCC'
minTem: '#0066CC'
maxTem: '#FF0033'
dailyCn: '#993366'
dailyEn: '#CC99CC'
gbir: '#FF3399'
bbir: '#FF3399'
cbir: '#FF3399'
loveDay: '#FF3399'
weddingDay: '#FF3399'
remark: '#FF6666'
city: ""
tips: ""
quality: '#99CC66'
festival: '#FF6666'
morning: '#FFFF99'
night: '#006699'
tianxin:
server: https://apis.tianapi.com
logging:
level:
reactor.netty.http.client: debug
scanclass: false
# Actuator 配置
management:
# 端点配置
endpoints:
web:
exposure:
# 暴露健康端点,生产环境要慎重,别把敏感信息暴露了
include: health,info
# 健康端点配置
endpoint:
health:
# 显示详细的健康信息,方便调试
# 生产环境建议设为 when-authorized需要认证才能看详情
show-details: always
# 开启探针支持,这个必须设置
probes:
enabled: true
# 在主端口上也暴露探针路径
# 这样 K8s 探针可以直接访问应用端口,不用单独配置 management 端口
add-additional-paths: true

View File

@@ -1,68 +0,0 @@
server:
port: 13145
spring:
profiles:
active: prob
application:
name: dailyLove
cloud:
nacos:
config:
server-addr: ${url.nacos} # nacos地址配置中心
file-extension: yaml
group: Group1
discovery:
#持久化实例 ture为临时实例 false为持久化实例 临时实例发生异常直接剔除, 而持久化实例等待恢复
ephemeral: true
#注册中心地址
server-addr: ${url.nacos}
url:
nacos: 127.0.0.1:8848
DL:
tianxin-key: 72fbbb9e75e338ea6a240e83972f287c
city-id: 101270106
girl-birthday: 1995-06-28
boy-birthday: 1995-3-30
love-day: 2022-07-16
cat-birthday: 2022-10-23
wechat:
app-id: wxba68702957f8b93e
app-secret: 834078bb149409bfca4fe693ea7c4c1c
#ME: oo5bL6bK_4TC0tb-Wa5oiugTPVeQ
#LILI: oo5bL6QafHJa9zQNYKS0fIhFC0zM
open-id: oo5bL6QafHJa9zQNYKS0fIhFC0zM
template-id-morning: 1yx1fahCs923nOmMh0_KLWN0nXGKd8_pHQrfpdMblrQ
template-id-night: QG-5NBX-jip46ulGVsaE3Uhl30GUxvNmtKOxwMHFkx0
color:
now: '#99CCCC'
tomorrow: '#99CCCC'
chineseDate: '#99CC66'
top: '#FF0000'
weather: '#66CCCC'
minTem: '#0066CC'
maxTem: '#FF0033'
dailyCn: '#993366'
dailyEn: '#CC99CC'
gbir: '#FF3399'
bbir: '#FF3399'
cbir: '#FF3399'
loveDay: '#FF3399'
remark: '#FF6666'
city: ""
tips: ""
quality: '#99CC66'
festival: '#FF6666'
morning: '#FFFF99'
night: '#006699'
tianxin:
server: https://apis.tianapi.com
logging:
level:
com.bamanker.dailylove.service: debug #指定openfeign日志以什么级别监控哪个接口可多个

View File

@@ -1,150 +1,316 @@
package com.bamanker.dailylove;
import cn.hutool.core.date.ChineseDate;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson2.JSONObject;
import com.bamanker.dailylove.config.DailyLoveConfigure;
import com.bamanker.dailylove.domain.TianXinReqParam;
import com.bamanker.dailylove.domain.Weather;
import com.bamanker.dailylove.service.DataRemoteClient;
import com.bamanker.dailylove.service.DataRemoteService;
import com.bamanker.dailylove.service.WechatRequestService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.util.Strings;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import tools.jackson.databind.json.JsonMapper;
@SpringBootTest
@Slf4j
class DailyLoveApplicationTests {
//
// @Resource
// DataRemoteClient dataRemoteClient;
@Resource
DataRemoteClient dataRemoteClient;
DataRemoteService dataRemoteService;
String remark = "";
@Resource
WechatRequestService wechatRequestService;
@Test
void test4(){
log.info("mark: {}",205%100);
}
@Test
void test3() {
@Autowired
JsonMapper mapper;
//获取输入的生日
String boyBirthday = DailyLoveConfigure.Boy_Birthday;
//获取农历生日
ChineseDate chineseBir = new ChineseDate(DateUtil.parseDate(DailyLoveConfigure.Boy_Birthday));
log.info("生日的农历日期是:{}", chineseBir);
//截取日、月
String[] strings = Strings.split(boyBirthday, '-');
int chineseMonth = chineseBir.getMonth();
int chineseDay = chineseBir.getDay();
//获取当前日期的年
Calendar dateToday = Calendar.getInstance();
int todayYear = dateToday.get(Calendar.YEAR);
//把生日的年改为今年,方便计算
ChineseDate chineseDate = new ChineseDate(todayYear, chineseMonth, chineseDay,false);
//农历日期对应的阳历日期
int gregorianDay = chineseDate.getGregorianDay();
//计算时间差
long days = haveThisDay(chineseMonth, chineseDay, dateToday, todayYear, chineseDate, gregorianDay);
log.info("days:{}", days);
}
/**
* 需要递归计算日期差
*
* @param chineseMonth 农历月
* @param chineseDay 农历日
* @param dateToday 今天的日期类
* @param todayYear 当前的年
* @param chineseDate 组装的待计算的新日期
* @param gregorianDay 判断是否存在农历日期的参数,-1代表今年不存在这个农历日期
* @return 计算好的天数
*/
private static long haveThisDay(int chineseMonth, int chineseDay, Calendar dateToday, int todayYear, ChineseDate chineseDate, int gregorianDay) {
//判断当前年份是否存在农历日对应的阳历日
while (gregorianDay == -1) {
//不存在,计算明年
todayYear += 1;
chineseDate = new ChineseDate(todayYear, chineseMonth, chineseDay, false);
gregorianDay = chineseDate.getGregorianDay();
}
//存在
//将农历日期改为阳历日期
Calendar gregorianbir = chineseDate.getGregorianCalendar();
//判断这个日期是否和今年是同一年
if (todayYear == dateToday.get(Calendar.YEAR)) {
//是同一年,判断这一天过了没
if (gregorianbir.get(Calendar.DAY_OF_YEAR) < dateToday.get(Calendar.DAY_OF_YEAR)) {
//这一天过了,计算明年
todayYear += 1;
chineseDate = new ChineseDate(todayYear, chineseMonth, chineseDay, false);
gregorianDay = chineseDate.getGregorianDay();
//递归计算下一年是否存在对应的阳历日
return haveThisDay(chineseMonth, chineseDay, dateToday, todayYear, chineseDate, gregorianDay);
}
//没有过,直接计算
}
//不是同一年,直接计算
Date time = dateToday.getTime();
log.info("当前的日期是:{}", time);
Date time1 = gregorianbir.getTime();
log.info("下一个生日的日期:{}", time1);
return DateUtil.between(dateToday.getTime(), gregorianbir.getTime(), DateUnit.DAY);
}
@Test
void test2() {
TianXinReqParam param1 = new TianXinReqParam();
param1.setKey(DailyLoveConfigure.TianXin_Key);
param1.setCity(DailyLoveConfigure.City_ID);
param1.setType("7");
String weatherJson = dataRemoteClient.getWeather(param1);
log.info("weather:{}", weatherJson);
JSONObject resWeather = JSONObject.parseObject(weatherJson);
JSONObject result = resWeather.getJSONArray("result").getJSONObject(0).getJSONArray("list").getJSONObject(2);
log.info("----result----:{}", result);
Weather weather = result.toJavaObject(Weather.class);
log.info("weather:{}", weather);
ChineseDate chineseDate = new ChineseDate(DateUtil.parseDate(weather.getDate()));
System.out.println("--------------55555----------"+weather.getDate());
System.out.println("------------------------"+chineseDate);
//
// String remark = "❤";
//
// @Test
// void test4(){
// log.info("mark: {}",205%100);
//
// }
// @Test
// void test3() {
//
//
// //获取输入的生日
// String boyBirthday = DailyLoveConfigure.Boy_Birthday;
// //获取农历生日
// ChineseDate chineseBir = new ChineseDate(DateUtil.parseDate(DailyLoveConfigure.Boy_Birthday));
// log.info("生日的农历日期是:{}", chineseBir);
// //截取日、月
// String[] strings = Strings.split(boyBirthday, '-');
// int chineseMonth = chineseBir.getMonth();
// int chineseDay = chineseBir.getDay();
// //获取当前日期的年
// Calendar dateToday = Calendar.getInstance();
// int todayYear = dateToday.get(Calendar.YEAR);
// //把生日的年改为今年,方便计算
// ChineseDate chineseDate = new ChineseDate(todayYear, chineseMonth, chineseDay,false);
// //农历日期对应的阳历日期
// int gregorianDay = chineseDate.getGregorianDay();
// //计算时间差
// long days = haveThisDay(chineseMonth, chineseDay, dateToday, todayYear, chineseDate, gregorianDay);
// log.info("days:{}", days);
//
// }
//
// /**
// * 需要递归计算日期差
// *
// * @param chineseMonth 农历月
// * @param chineseDay 农历日
// * @param dateToday 今天的日期类
// * @param todayYear 当前的年
// * @param chineseDate 组装的待计算的新日期
// * @param gregorianDay 判断是否存在农历日期的参数,-1代表今年不存在这个农历日期
// * @return 计算好的天数
// */
// private static long haveThisDay(int chineseMonth, int chineseDay, Calendar dateToday, int todayYear, ChineseDate chineseDate, int gregorianDay) {
// //判断当前年份是否存在农历日对应的阳历日
// while (gregorianDay == -1) {
// //不存在,计算明年
// todayYear += 1;
// chineseDate = new ChineseDate(todayYear, chineseMonth, chineseDay, false);
// gregorianDay = chineseDate.getGregorianDay();
// }
// //存在
// //将农历日期改为阳历日期
// Calendar gregorianbir = chineseDate.getGregorianCalendar();
// //判断这个日期是否和今年是同一年
// if (todayYear == dateToday.get(Calendar.YEAR)) {
// //是同一年,判断这一天过了没
// if (gregorianbir.get(Calendar.DAY_OF_YEAR) < dateToday.get(Calendar.DAY_OF_YEAR)) {
// //这一天过了,计算明年
// todayYear += 1;
// chineseDate = new ChineseDate(todayYear, chineseMonth, chineseDay, false);
// gregorianDay = chineseDate.getGregorianDay();
// //递归计算下一年是否存在对应的阳历日
// return haveThisDay(chineseMonth, chineseDay, dateToday, todayYear, chineseDate, gregorianDay);
// }
// //没有过,直接计算
// }
// //不是同一年,直接计算
// Date time = dateToday.getTime();
// log.info("当前的日期是:{}", time);
// Date time1 = gregorianbir.getTime();
// log.info("下一个生日的日期:{}", time1);
// return DateUtil.between(dateToday.getTime(), gregorianbir.getTime(), DateUnit.DAY);
// }
//
// @Test
// void test2() {
//
// ResultVo resultVo = ResultVo.initializeResultVo(DailyLoveConfigure.Open_ID,
// DailyLoveConfigure.Template_ID_Night,
// DailyLoveConfigure.Color_Top);
//
// TianXinReqParam param1 = new TianXinReqParam();
// param1.setKey(DailyLoveConfigure.TianXin_Key);
// param1.setCity(DailyLoveConfigure.City_ID);
// param1.setType("7");
// Mono<String> weatherRespMono = dataRemoteService.getWeather(param1.getKey(), param1.getCity(), param1.getType());
// Mono<ResultVo> resultVoMono1 = weatherRespMono
// .map(respJson -> mapper.readTree(respJson)
// .get("result")
// .get("area")
// .toString())
// .flatMap(city -> {
// resultVo.setAttribute("city", new DataItem(city, DailyLoveConfigure.Color_city));
// return Mono.just(resultVo);
// });
// Mono<ResultVo> resultVoMono2 = weatherRespMono
// .map(respJson -> mapper.readTree(respJson)
// .get("result")
// .get("list")
// .get(1))
// .map(respJson -> mapper.treeToValue(respJson, Weather.class))
// .flatMap(weather -> {
// resultVo.setAttribute("tomorrow", new DataItem(weather.getDate() + " " + weather.getWeek(), DailyLoveConfigure.Color_tomorrow));
// resultVo.setAttribute("weather", new DataItem(weather.getWeather(), DailyLoveConfigure.Color_weather));
// resultVo.setAttribute("min_temperature", new DataItem(weather.getLowest(), DailyLoveConfigure.Color_minTem));
// resultVo.setAttribute("max_temperature", new DataItem(weather.getHighest(), DailyLoveConfigure.Color_maxTem));
// resultVo.setAttribute("quality", new DataItem(weather.getVis(), DailyLoveConfigure.Color_quality));
// return Mono.just(resultVo);
// });
//// Mono<Tuple2<ResultVo, ResultVo>> zip = Mono.zip(resultVoMono1, resultVoMono);
//
//
// TianXinReqParam param2 = new TianXinReqParam();
// param2.setKey(DailyLoveConfigure.TianXin_Key);
//
// Mono<ResultVo> resultVoMono3 = dataRemoteService.getTips(param2.getKey(), param2.getCity(), param2.getType())
// .map(respJson -> mapper.readTree(respJson)
// .get("result")
// .get("content").asString())
// .flatMap(tips -> {
// resultVo.setAttribute("tips", new DataItem(tips, DailyLoveConfigure.Color_tips));
// return Mono.just(resultVo);
// });
// Mono<ResultVo> resultVoMono4 = dataRemoteService.getNight(param2.getKey(), param2.getCity(), param2.getType())
// .map(respJson -> mapper.readTree(respJson)
// .get("result")
// .get("content").asString())
// .flatMap(night -> {
// resultVo.setAttribute("night", new DataItem(night, DailyLoveConfigure.Color_night));
// return Mono.just(resultVo);
// });
// Mono<ResultVo> resultVoMono5 = dataRemoteService.getRainbow(param2.getKey(), param2.getCity(), param2.getType())
// .map(respJson -> mapper.readTree(respJson)
// .get("result")
// .get("content").asString())
// .flatMap(rainbow -> {
// resultVo.setAttribute("rainbow", new DataItem(rainbow, DailyLoveConfigure.Color_dailyCn));
// return Mono.just(resultVo);
// });
//
// Mono<ResultVo> resultVoMono = Mono.zip(resultVoMono1, resultVoMono2, resultVoMono3, resultVoMono4, resultVoMono5)
// .flatMap(new Function<Tuple5<ResultVo, ResultVo, ResultVo, ResultVo, ResultVo>, Mono<? extends ResultVo>>() {
// @Override
// public Mono<? extends ResultVo> apply(Tuple5<ResultVo, ResultVo, ResultVo, ResultVo, ResultVo> tuple) {
// return Mono.just(tuple.getT1());
// }
// });
//
// ChineseDate chineseDate = new ChineseDate(DateUtil.parseDate(LocalDate.now().toString()));
// String festival = chineseDate.getFestivals();
// String term = chineseDate.getTerm();
// resultVo.setAttribute("lunar", new DataItem(chineseDate.toString(), DailyLoveConfigure.Color_chineseDate));
// resultVo.setAttribute("festival", new DataItem(festival + " " + term, DailyLoveConfigure.Color_festival));
//
//
// int girlBirthdays = DataUtils.getBirthdays(DailyLoveConfigure.Girl_Birthday);
// log.info("gbir_days:{}", girlBirthdays);
// resultVo.setAttribute("gbir_day", new DataItem(girlBirthdays - 1 + "", DailyLoveConfigure.Color_gbir));
//
// int boyBirthdays = DataUtils.getChineseBirthdays(DailyLoveConfigure.Boy_Birthday);
// log.info("bbir_days:{}", boyBirthdays);
// resultVo.setAttribute("bbir_day", new DataItem(boyBirthdays - 1 + "", DailyLoveConfigure.Color_bbir));
//
// int catBirthdays = DataUtils.getBirthdays(DailyLoveConfigure.Cat_Birthday);
// log.info("cbir_days:{}", catBirthdays);
// resultVo.setAttribute("cbir_day", new DataItem(catBirthdays - 1 + "", DailyLoveConfigure.Color_cbir));
//
// String words = "普通的一天";
//
// if (DataUtils.getBirthdays(DailyLoveConfigure.Love_Day) == 1) {
// words = "明天是恋爱周年纪念日!永远爱你~mua";
// } else if ((DataUtils.getDayDiff(DailyLoveConfigure.Love_Day)) % 100 == 99) {
// words = "明天是恋爱百日纪念日!提前庆祝哦~";
// } else if (DataUtils.getBirthdays(DailyLoveConfigure.Wedding_Day) == 1) {
// words = "明天是结婚周年纪念日!提前庆祝哦~";
// } else if (girlBirthdays == 1) {
// words = "明天是lili大宝贝的生日啦";
// } else if (boyBirthdays == 1) {
// words = "明天是菘菘的生日!别忘了哦~";
// } else if (catBirthdays == 1) {
// words = "明天是小离谱的生日!别忘了小鱼干!";
// }
//
// resultVo.setAttribute("words", new DataItem(words, DailyLoveConfigure.Color_remark));
//
// int loveDays = DataUtils.getDayDiff(DailyLoveConfigure.Love_Day);
// log.info("love_days:{}", loveDays);
// resultVo.setAttribute("love_day", new DataItem(loveDays + 1 + "", DailyLoveConfigure.Color_loveDay));
//
// int weddingDays = DataUtils.getDayDiff(DailyLoveConfigure.Wedding_Day);
// log.info("wedding_days:{}", weddingDays);
// resultVo.setAttribute("wedding_day", new DataItem(weddingDays + 1 + "", DailyLoveConfigure.Color_weddingDay));
//
// resultVoMono.flatMap(new Function<ResultVo, Mono<?>>() {
// @Override
// public Mono<?> apply(ResultVo resultVo) {
// return Mono.just(resultVo);
// }
// }).log().block();
//
// WechatTokenParam param3 = new WechatTokenParam();
// param3.setAppid(DailyLoveConfigure.App_ID);
// param3.setSecret(DailyLoveConfigure.App_Secret);
//
// String accessToken = wechatRequestService.getAccessToken(param3.getGrant_type(), param3.getAppid(), param3.getSecret())
// .map(respJson -> {
// return mapper.readTree(respJson)
// .get("access_token").asString();
// }).log().block();
// wechatRequestService.sendMsg(accessToken, resultVo).log().block();
}
// String tips = mapper.readTree(tipsResp).get("result").get("content").asString();
@Test
void test1() {
int loveDays = getLoveDays("2021-07-16");
log.info("-------------------------------{}", loveDays);
}
// log.info("weather:{}", weatherResp);
// JsonNode weatherJson = mapper.readTree(weatherResp).get("result").get("list").get(1);
// System.out.println("-----------------------------");
// System.out.println(weatherJson);
// String city = mapper.readTree(weatherResp).get("result").get("area").asString();
// System.out.println("-----------------------------");
// System.out.println(city);
// Weather weather = mapper.treeToValue(weatherJson, Weather.class);
// System.out.println("-----------------------------");
// System.out.println(weather);
//
// resultVo.setAttribute("tomorrow", new DataItem(weather.getDate() + " " + weather.getWeek(), DailyLoveConfigure.Color_tomorrow));
// resultVo.setAttribute("city", new DataItem(city, DailyLoveConfigure.Color_city));
// resultVo.setAttribute("weather", new DataItem(weather.getWeather(), DailyLoveConfigure.Color_weather));
// resultVo.setAttribute("min_temperature", new DataItem(weather.getLowest(), DailyLoveConfigure.Color_minTem));
// resultVo.setAttribute("max_temperature", new DataItem(weather.getHighest(), DailyLoveConfigure.Color_maxTem));
// resultVo.setAttribute("quality", new DataItem(weather.getVis(), DailyLoveConfigure.Color_quality));
//
// System.out.println("-----------------------------");
// System.out.println(resultVo);
public static int getLoveDays(String loveday) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
int days = 0;
try {
long time = System.currentTimeMillis() - dateFormat.parse(loveday).getTime();
days = (int) (time / (24 * 60 * 60 * 1000));
// TianXinReqParam param2 = new TianXinReqParam();
// param2.setKey(DailyLoveConfigure.TianXin_Key);
//
// String tipsResp = dataRemoteClient.getTips(param2);
// String tips = mapper.readTree(tipsResp).get("result").get("content").asString();
//
// System.out.println("-----------------------------");
// System.out.println(tips);
//
// TianXinReqParam param1 = new TianXinReqParam();
// param1.setKey(DailyLoveConfigure.TianXin_Key);
// param1.setCity(DailyLoveConfigure.City_ID);
// param1.setType("1");
// String weatherResp = dataRemoteClient.getWeather(param1);
// JsonNode weatherJson = mapper.readTree(weatherResp).get("result");
// Weather weather = mapper.treeToValue(weatherJson, Weather.class);
//
// System.out.println("-----------------------------");
// System.out.println(weather);
} catch (ParseException e) {
e.printStackTrace();
}
return days;
}
// log.info("----result----:{}", result);
@Test
void contextLoads() {
//}
//
//
// @Test
// void test1() {
// int weddingDays = DataUtils.getWeddingDays("2025-10-08");
// log.info("wedding_days:{}", weddingDays);
// }
//
// public static int getLoveDays(String loveday) {
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
// int days = 0;
// try {
// long time = System.currentTimeMillis() - dateFormat.parse(loveday).getTime();
// days = (int) (time / (24 * 60 * 60 * 1000));
//
// } catch (ParseException e) {
// e.printStackTrace();
// }
// return days;
// }
//
// @Test
// void contextLoads() {
// TianXinReqParam param1 = new TianXinReqParam();
// param1.setKey(DailyLoveConfigure.TianXin_Key);
// param1.setCity(DailyLoveConfigure.City_ID);
@@ -201,6 +367,6 @@ class DailyLoveApplicationTests {
// log.info("resultVo:{}", resultVo);
}
}
//}