2 Commits

Author SHA1 Message Date
bamanker
12bbeaa39f add LICENSE.
Signed-off-by: bamanker <27054792@qq.com>
2023-11-13 15:18:59 +00:00
bamanker
f297aa823a update README.md.
Signed-off-by: bamanker <27054792@qq.com>
2023-11-13 15:17:09 +00:00
18 changed files with 224 additions and 783 deletions

View File

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

View File

@@ -1,170 +0,0 @@
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
View File

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

View File

@@ -1,5 +0,0 @@
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 Normal file
View File

@@ -0,0 +1,12 @@
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,7 +1,6 @@
# dailyLove
#### 介绍
公众号每日问候推送
#### 软件架构
软件架构说明

View File

@@ -1,70 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: $APP_NAME
version: $APP_TAG
name: $APP_NAME
namespace: default #一定要写名称空间
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 2
selector:
matchLabels:
app: $APP_NAME
strategy:
rollingUpdate:
maxSurge: 50%
maxUnavailable: 50%
type: RollingUpdate
template:
metadata:
labels:
app: $APP_NAME
version: $APP_TAG
spec:
imagePullSecrets:
- name: dockerhub-id #提前在项目下配置访问阿里云的账号密码
containers:
- image: $REGISTRY/$IMAGE_NAMESPACE/$IMAGE_NAME:$APP_TAG
name: $APP_NAME
imagePullPolicy: Always
livenessProbe: # 存活探针:失败意味着应用彻底挂了,需要重启来恢复
httpGet:
path: /test
port: 13145
initialDelaySeconds: 10 # 延迟xx秒开始执行
periodSeconds: 15 # 每隔15秒执行一次
timeoutSeconds: 10 # 10秒未返回结果则超时
failureThreshold: 10 # 探测失败后的重试次数,当达到这个次数后就判定结果为失败
# successThreshold: 5
ports:
- containerPort: 13145
protocol: TCP
resources:
limits:
cpu: 99m
memory: 65Mi
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

154
pom.xml
View File

@@ -5,38 +5,22 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.1</version>
<version>2.4.3</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>v2.4.0-native</version>
<name>dailylove</name>
<description>dailylove-forK8S</description>
<artifactId>dailyLove</artifactId>
<version>0.1.3</version>
<name>dailyLove</name>
<description>dailyLove</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<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>-->
<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>
</properties>
<dependencies>
<dependency>
@@ -44,128 +28,62 @@
<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-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
<artifactId>spring-boot-starter</artifactId>
</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>
<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>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>
</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>-->
<arg->-H:+ReportExceptionStackTraces</arg->
<!--开启JFR-->
<arg>--enable-monitoring=jfr</arg>
<!-- <arg>&#45;&#45;gc=G1</arg>-->
<!-- <arg>&#45;&#45;pgo</arg>-->
<arg>-Ob</arg>
<!-- <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

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

View File

@@ -1,139 +0,0 @@
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

@@ -5,6 +5,7 @@ import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
@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}";

View File

@@ -8,13 +8,9 @@ import org.springframework.stereotype.Component;
@Component
public class PushTask {
final
@Autowired
PushDailyController pushDailyController;
public PushTask(PushDailyController pushDailyController) {
this.pushDailyController = pushDailyController;
}
//每日 早上7.30,晚上22点 定时推送
@Scheduled(cron = "0 30 7 * * ?")
public void scheduledPushMorning(){

View File

@@ -2,6 +2,7 @@ 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;
@@ -11,9 +12,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.ObjectMapper;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -21,22 +20,12 @@ import java.util.Date;
@RestController
public class PushDailyController {
final
ObjectMapper mapper;
final
@Resource
DataRemoteClient dataRemoteClient;
final
@Resource
WechatRequestClient wechatRequestClient;
public PushDailyController(DataRemoteClient dataRemoteClient, WechatRequestClient wechatRequestClient, ObjectMapper mapper) {
this.dataRemoteClient = dataRemoteClient;
this.wechatRequestClient = wechatRequestClient;
this.mapper = mapper;
}
/**
* 推送晚安
*
@@ -54,11 +43,9 @@ public class PushDailyController {
param1.setCity(DailyLoveConfigure.City_ID);
param1.setType("7");
String weatherResp = dataRemoteClient.getWeather(param1);
JsonNode weatherJson = mapper.readTree(weatherResp).get("result").get("list").get(1);
String city = mapper.readTree(weatherResp).get("result").get("area").asString();
// JSONObject weatherJson1 = JSONObject.parseObject(weatherResp).getJSONArray("result").getJSONObject(0).getJSONArray("list").getJSONObject(1);
// String city1 = JSONObject.parseObject(weatherResp).getJSONArray("result").getJSONObject(0).getString("area");
Weather weather = mapper.treeToValue(weatherJson, Weather.class);
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));
@@ -72,18 +59,15 @@ public class PushDailyController {
param2.setKey(DailyLoveConfigure.TianXin_Key);
String tipsResp = dataRemoteClient.getTips(param2);
String tips = mapper.readTree(tipsResp).get("result").get("content").asString();
// String tips1 = JSONObject.parseObject(tipsResp).getJSONArray("result").getJSONObject(0).getString("content");
String tips = JSONObject.parseObject(tipsResp).getJSONArray("result").getJSONObject(0).getString("content");
resultVo.setAttribute("tips", new DataItem(tips, DailyLoveConfigure.Color_tips));
String nightResp = dataRemoteClient.getNight(param2);
String night = mapper.readTree(nightResp).get("result").get("content").asString();
// String night1 = JSONObject.parseObject(nightResp).getJSONArray("result").getJSONObject(0).getString("content");
String night = JSONObject.parseObject(nightResp).getJSONArray("result").getJSONObject(0).getString("content");
resultVo.setAttribute("night", new DataItem(night, DailyLoveConfigure.Color_night));
String rainbowResp = dataRemoteClient.getRainbow(param2);
String rainbow = mapper.readTree(rainbowResp).get("result").get("content").asString();
// String rainbow1 = JSONObject.parseObject(rainbowResp).getJSONArray("result").getJSONObject(0).getString("content");
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);
@@ -114,7 +98,7 @@ public class PushDailyController {
if (DataUtils.getBirthdays(DailyLoveConfigure.Love_Day) == 1) {
words = "明天是恋爱周年纪念日!永远爱你~mua";
} else if ((DataUtils.getLoveDays(DailyLoveConfigure.Love_Day)) % 100 == 99) {
} else if ((DataUtils.getLoveDays(DailyLoveConfigure.Love_Day)) % 100 == 1) {
words = "明天是恋爱百日纪念日!提前庆祝哦~";
} else if (girlBirthdays == 1) {
words = "明天是lili大宝贝的生日啦";
@@ -137,9 +121,9 @@ public class PushDailyController {
String accessTokenResp = wechatRequestClient.getAccessToken(wechatTokenParam);
log.debug("accessTokenJson:{}", accessTokenResp);
String token = mapper.readTree(accessTokenResp).get("access_token").asString();
// String token1 = JSONObject.parseObject(accessTokenResp).getString("access_token");
return wechatRequestClient.sendMsg(resultVo, token);
String token = JSONObject.parseObject(accessTokenResp).getString("access_token");
String responseStr = wechatRequestClient.sendMsg(resultVo, token);
return responseStr;
}
@@ -154,10 +138,9 @@ public class PushDailyController {
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);
// Weather weather1 = JSONObject.parseObject(weatherResp).getJSONArray("result").getJSONObject(0).toJavaObject(Weather.class);
Weather weather = JSONObject.parseObject(weatherResp).getJSONArray("result").getJSONObject(0).toJavaObject(Weather.class);
ResultVo resultVo = ResultVo.initializeResultVo(DailyLoveConfigure.Open_ID,
DailyLoveConfigure.Template_ID_Morning,
@@ -179,13 +162,11 @@ public class PushDailyController {
// resultVo.setAttribute("tips", new DataItem(tips, DailyLoveConfigure.Color_tips));
String morningResp = dataRemoteClient.getMorning(param2);
String morning = mapper.readTree(morningResp).get("result").get("content").asString();
// String morning1 = JSONObject.parseObject(morningResp).getJSONArray("result").getJSONObject(0).getString("content");
String morning = JSONObject.parseObject(morningResp).getJSONArray("result").getJSONObject(0).getString("content");
resultVo.setAttribute("morning", new DataItem(morning, DailyLoveConfigure.Color_morning));
String rainbowResp = dataRemoteClient.getRainbow(param2);
String rainbow = mapper.readTree(rainbowResp).get("result").get("content").asString();
// String rainbow1 = JSONObject.parseObject(rainbowResp).getJSONArray("result").getJSONObject(0).getString("content");
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);
@@ -241,9 +222,9 @@ public class PushDailyController {
String accessTokenResp = wechatRequestClient.getAccessToken(wechatTokenParam);
log.debug("accessTokenJson:{}", accessTokenResp);
String token = mapper.readTree(accessTokenResp).get("access_token").asString();
// String token1 = JSONObject.parseObject(accessTokenResp).getString("access_token");
return wechatRequestClient.sendMsg(resultVo, token);
String token = JSONObject.parseObject(accessTokenResp).getString("access_token");
String responseStr = wechatRequestClient.sendMsg(resultVo, token);
return responseStr;
}
@@ -253,12 +234,9 @@ public class PushDailyController {
* @param responseStr
*/
private void printPushLog(String responseStr) {
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");
JSONObject jsonObject = JSONObject.parseObject(responseStr);
String msgCode = jsonObject.getString("errcode");
String msgContent = 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

@@ -1,27 +0,0 @@
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,9 +4,6 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author bamanker
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@@ -14,8 +11,4 @@ public class DataItem {
private String value;
private String color;
}

View File

@@ -2,11 +2,24 @@ server:
port: 13145
spring:
profiles:
active: prob
application:
name: dailyLove
cloud:
refresh:
enabled: false
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
@@ -19,11 +32,11 @@ DL:
wechat:
app-id: wxba68702957f8b93e
app-secret: 834078bb149409bfca4fe693ea7c4c1c
# ME: oo5bL6bK_4TC0tb-Wa5oiugTPVeQ
#ME: oo5bL6bK_4TC0tb-Wa5oiugTPVeQ
#LILI: oo5bL6QafHJa9zQNYKS0fIhFC0zM
open-id: oo5bL6QafHJa9zQNYKS0fIhFC0zM
template-id-morning: E7eBkU0uzBFDwC9MiqPtHNlSlByDafw4BIqZvfOtTOs
template-id-night: 5ExwX0ID1ccueXNb7v-dqTcDH-lYtHatg0Mqt4FDIaY
template-id-morning: 1yx1fahCs923nOmMh0_KLWN0nXGKd8_pHQrfpdMblrQ
template-id-night: QG-5NBX-jip46ulGVsaE3Uhl30GUxvNmtKOxwMHFkx0
color:
now: '#99CCCC'
@@ -52,6 +65,4 @@ tianxin:
logging:
level:
com.bamanker.dailylove.service: debug #指定openfeign日志以什么级别监控哪个接口可多个
scanclass: false
com.bamanker.dailylove.service: debug #指定openfeign日志以什么级别监控哪个接口可多个

View File

@@ -1,186 +1,150 @@
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.DataItem;
import com.bamanker.dailylove.domain.TianXinReqParam;
import com.bamanker.dailylove.domain.Weather;
import com.bamanker.dailylove.service.DataRemoteClient;
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 tools.jackson.databind.JsonNode;
import tools.jackson.databind.ObjectMapper;
import com.bamanker.dailylove.domain.*;
import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
@SpringBootTest
@Slf4j
class DailyLoveApplicationTests {
// @Resource
// DataRemoteClient dataRemoteClient;
//
// @Autowired
// ObjectMapper mapper;
@Resource
DataRemoteClient dataRemoteClient;
//
// 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() {
String remark = "";
// 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");
// String weatherResp = dataRemoteClient.getWeather(param1);
//// 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);
@Test
void test4(){
log.info("mark: {}",205%100);
// 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);
// log.info("----result----:{}", result);
}
@Test
void test3() {
//}
//
//
// @Test
// void test1() {
// int loveDays = getBirthdays("2023-05-14");
// log.info("-------------------------------{}", loveDays);
// }
//
// 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() {
//获取输入的生日
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);
}
@Test
void test1() {
int loveDays = getLoveDays("2021-07-16");
log.info("-------------------------------{}", loveDays);
}
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);
@@ -237,6 +201,6 @@ class DailyLoveApplicationTests {
// log.info("resultVo:{}", resultVo);
// }
}
}