diff --git a/TempSSH.txt b/TempSSH.txt deleted file mode 100644 index 1b421a0..0000000 --- a/TempSSH.txt +++ /dev/null @@ -1,2 +0,0 @@ -cd /app/ -sh start.sh restart diff --git a/pnkx-admin/pom.xml b/pnkx-admin/pom.xml index e3f40fb..1d880eb 100644 --- a/pnkx-admin/pom.xml +++ b/pnkx-admin/pom.xml @@ -140,6 +140,11 @@ jdk15 + + junit + junit + test + diff --git a/pnkx-admin/src/main/docker/Dockerfile b/pnkx-admin/src/main/docker/Dockerfile deleted file mode 100644 index 5742307..0000000 --- a/pnkx-admin/src/main/docker/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -# 指定是基于哪个基础镜像 -FROM openjdk:8 - -# 作者信息 -MAINTAINER PNKX - -# 挂载点声明 -VOLUME /tmp - -# 将本地的一个文件或目录,拷贝到容器的文件或目录里 -ADD pnkx-admin.jar pnkx-admin.jar - -# 将容器的8000端口暴露,给外部访问。 -EXPOSE 8068 - -# 当容器运行起来时执行使用运行jar的指令 -ENTRYPOINT ["java", "-jar", "pnkx-admin.jar"] diff --git a/pnkx-admin/src/main/resources/application.yml b/pnkx-admin/src/main/resources/application.yml index f82948b..c8c742f 100644 --- a/pnkx-admin/src/main/resources/application.yml +++ b/pnkx-admin/src/main/resources/application.yml @@ -106,3 +106,8 @@ xss: excludes: /system/notice/* # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* + +feishu: + # 飞书机器人的webhook地址 + webhook: + url: https://open.feishu.cn/open-apis/bot/v2/hook/ae03114d-aa0d-4348-b12e-9bd7e2911399 diff --git a/pnkx-admin/src/test/java/NotifyTest.java b/pnkx-admin/src/test/java/NotifyTest.java new file mode 100644 index 0000000..0dc9107 --- /dev/null +++ b/pnkx-admin/src/test/java/NotifyTest.java @@ -0,0 +1,24 @@ +import com.pnkx.framework.notify.NotifyContext; +import com.pnkx.framework.notify.impl.EmailNotifyStrategy; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.javamail.JavaMailSender; + +import javax.annotation.Resource; + +/** + * NotifyTest + * + * @author 裴浩宇 + * @version 1.0 + * @date 2024/4/30 17:21 + * @description 通知测试类 + */ +public class NotifyTest { + + @Test + public void notifyTest() throws Exception { + NotifyContext notifyContext = new NotifyContext(new EmailNotifyStrategy()); + notifyContext.send("617594538@qq.com", "测试通知"); + } +} diff --git a/pnkx-common/src/main/java/com/pnkx/common/utils/email/EmailUtils.java b/pnkx-common/src/main/java/com/pnkx/common/utils/email/EmailUtils.java new file mode 100644 index 0000000..b6558d6 --- /dev/null +++ b/pnkx-common/src/main/java/com/pnkx/common/utils/email/EmailUtils.java @@ -0,0 +1,39 @@ +package com.pnkx.common.utils.email; + +import com.pnkx.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.mail.internet.MimeMessage; +import javax.validation.constraints.Email; +import java.util.Arrays; +import java.util.Objects; +import java.util.regex.Pattern; + +/** + * EmailUtils + * + * @author 裴浩宇 + * @version 1.0 + * @date 2024/4/30 17:36 + * @description 邮件工具类 + */ +public class EmailUtils { + public static String[] validEmail(String emails) { + if (StringUtils.isNotBlank(emails)) { + return Arrays.stream(emails.split(",")) + .filter(email -> isEmail(email.trim())) + .distinct() + .toArray(String[]::new); + } + return null; + } + + public static Boolean isEmail(String email) { + String regEx1 = "^([a-z0-9A-Z]+[-|.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; + return Pattern.compile(regEx1).matcher(email.trim()).matches(); + } +} diff --git a/pnkx-framework/src/main/java/com/pnkx/framework/notify/NotifyContext.java b/pnkx-framework/src/main/java/com/pnkx/framework/notify/NotifyContext.java new file mode 100644 index 0000000..6751112 --- /dev/null +++ b/pnkx-framework/src/main/java/com/pnkx/framework/notify/NotifyContext.java @@ -0,0 +1,21 @@ +package com.pnkx.framework.notify; + +/** + * NotifyContext + * + * @author 裴浩宇 + * @version 1.0 + * @date 2024/4/30 17:09 + * @description 通知策略上下文 + */ +public class NotifyContext { + private final NotifyStrategy strategy; + + public NotifyContext(NotifyStrategy strategy) { + this.strategy = strategy; + } + + public void send(String recipient, String message) throws Exception { + strategy.sendNotification(recipient, message); + } +} diff --git a/pnkx-framework/src/main/java/com/pnkx/framework/notify/NotifyStrategy.java b/pnkx-framework/src/main/java/com/pnkx/framework/notify/NotifyStrategy.java new file mode 100644 index 0000000..52e3b14 --- /dev/null +++ b/pnkx-framework/src/main/java/com/pnkx/framework/notify/NotifyStrategy.java @@ -0,0 +1,18 @@ +package com.pnkx.framework.notify; + +/** + * NotifyStrategy + * + * @author 裴浩宇 + * @version 1.0 + * @date 2024/4/30 16:50 + * @description 通知接口 + */ +public interface NotifyStrategy { + /** + * 发送通知 + * @param recipient 接收者 + * @param message 消息内容 + */ + void sendNotification(String recipient, String message) throws Exception; +} diff --git a/pnkx-framework/src/main/java/com/pnkx/framework/notify/impl/EmailNotifyStrategy.java b/pnkx-framework/src/main/java/com/pnkx/framework/notify/impl/EmailNotifyStrategy.java new file mode 100644 index 0000000..b14e71a --- /dev/null +++ b/pnkx-framework/src/main/java/com/pnkx/framework/notify/impl/EmailNotifyStrategy.java @@ -0,0 +1,36 @@ +package com.pnkx.framework.notify.impl; + +import com.pnkx.common.exception.ServiceException; +import com.pnkx.common.utils.StringUtils; +import com.pnkx.common.utils.email.EmailUtils; +import com.pnkx.framework.notify.NotifyStrategy; +import com.pnkx.system.domain.SysEmail; +import com.pnkx.system.service.ISysEmailService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import javax.mail.internet.MimeMessage; +import java.util.Arrays; +import java.util.Objects; +import java.util.regex.Pattern; + +/** + * EmailNotifyStrategy + * + * @author 裴浩宇 + * @version 1.0 + * @date 2024/4/30 16:56 + * @description 邮箱方式 + */ +@Component +public class EmailNotifyStrategy implements NotifyStrategy { + + @Override + public void sendNotification(String recipient, String message) throws Exception { + + } +} diff --git a/pnkx-framework/src/main/java/com/pnkx/framework/notify/impl/FeishuNotifyStrategy.java b/pnkx-framework/src/main/java/com/pnkx/framework/notify/impl/FeishuNotifyStrategy.java new file mode 100644 index 0000000..210fcb5 --- /dev/null +++ b/pnkx-framework/src/main/java/com/pnkx/framework/notify/impl/FeishuNotifyStrategy.java @@ -0,0 +1,71 @@ +package com.pnkx.framework.notify.impl; + +import com.pnkx.common.core.controller.BaseController; +import com.pnkx.framework.notify.NotifyStrategy; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; + +/** + * FeishuNotifyStrategy + * + * @author 裴浩宇 + * @version 1.0 + * @date 2024/4/30 17:04 + * @description 飞书通知 + */ +@Component +public class FeishuNotifyStrategy implements NotifyStrategy { + + protected final Logger logger = LoggerFactory.getLogger(FeishuNotifyStrategy.class); + + @Value("${feishu.webhook.url}") + private String webhookUrl; + + @Override + public void sendNotification(String recipient, String message) { + try { + URL url = new URL(webhookUrl); + HttpURLConnection connection = getHttpURLConnection(message, url); + + int responseCode = connection.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + logger.info("飞书通知成功"); + } else { + logger.error("飞书通知失败,响应码:{}", responseCode); + } + + } catch (Exception e) { + logger.error("发送飞书通知时发生错误:{}", e.getMessage()); + } + } + + /** + * 获取HttpURLConnection + * @param message 通知内容 + * @param url webhook地址 + * @return HttpURLConnection + * @throws IOException 异常 + */ + private static HttpURLConnection getHttpURLConnection(String message, URL url) throws IOException { + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json; charset=utf-8"); + connection.setDoOutput(true); + + String jsonInputString = "{\"msg_type\":\"text\",\"content\":{\"text\":\"" + message + "\"}}"; + + try (OutputStream os = connection.getOutputStream()) { + byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8); + os.write(input, 0, input.length); + } + return connection; + } +} diff --git a/pnkx-system/src/main/java/com/pnkx/system/service/impl/SysEmailServiceImpl.java b/pnkx-system/src/main/java/com/pnkx/system/service/impl/SysEmailServiceImpl.java index 11de820..76b601b 100644 --- a/pnkx-system/src/main/java/com/pnkx/system/service/impl/SysEmailServiceImpl.java +++ b/pnkx-system/src/main/java/com/pnkx/system/service/impl/SysEmailServiceImpl.java @@ -2,6 +2,7 @@ package com.pnkx.system.service.impl; import com.pnkx.common.utils.DateUtils; import com.pnkx.common.utils.StringUtils; +import com.pnkx.common.utils.email.EmailUtils; import com.pnkx.system.domain.SysEmail; import com.pnkx.system.mapper.SysEmailMapper; import com.pnkx.system.service.ISysEmailService; @@ -100,61 +101,18 @@ public class SysEmailServiceImpl implements ISysEmailService { @Transactional public void sendMail(SysEmail email) throws MessagingException { sysEmailMapper.insertSysEmail(email); - String[] to = validEmail(email.getReceiverEmail()); + String[] to = EmailUtils.validEmail(email.getReceiverEmail()); if (to != null && to.length > 0) { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(from); helper.setTo(to); if (StringUtils.isNotEmpty(email.getCcEmail())) { - helper.setCc(Objects.requireNonNull(validEmail(email.getCcEmail()))); + helper.setCc(Objects.requireNonNull(EmailUtils.validEmail(email.getCcEmail()))); } helper.setSubject(email.getSubject()); helper.setText(email.getContent(), true); javaMailSender.send(message); } } - - private String[] validEmail(String emails) { - if (StringUtils.isNotBlank(emails)) { - return Arrays.stream(emails.split(",")) - .filter(this::isEmail) - .distinct() - .toArray(String[]::new); - } - return null; - } - - private Boolean isEmail(String email) { - String regEx1 = "^([a-z0-9A-Z]+[-|.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; - return Pattern.compile(regEx1).matcher(email.trim()).matches(); - } - - private static String getInvalidAddresses(Throwable e) { - if (e == null) { - return null; - } - if (e instanceof MailSendException) { - for (Exception exception : ((MailSendException) e).getMessageExceptions()) { - if (exception instanceof SendFailedException) { - return getStringAddress(((SendFailedException) exception).getInvalidAddresses()); - } - } - } - if (e instanceof SendFailedException) { - return getStringAddress(((SendFailedException) e).getInvalidAddresses()); - } - return null; - } - - private static String getStringAddress(Address[] address) { - List invalid = new ArrayList<>(); - for (Address a : address) { - String aa = ((InternetAddress) a).getAddress(); - if (!StringUtils.isEmpty(aa)) { - invalid.add(aa); - } - } - return invalid.stream().distinct().collect(Collectors.joining(",")); - } }