diff --git a/src/main/java/com/zsc/edu/gateway/exception/EmptyIdsException.java b/src/main/java/com/zsc/edu/gateway/exception/EmptyIdsException.java new file mode 100644 index 0000000..e939a59 --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/exception/EmptyIdsException.java @@ -0,0 +1,10 @@ +package com.zsc.edu.gateway.exception; + +/** + * @author zhuang + */ +public class EmptyIdsException extends RuntimeException { + public EmptyIdsException(String message) { + super(message); + } +} diff --git a/src/main/java/com/zsc/edu/gateway/exception/PublishFailedException.java b/src/main/java/com/zsc/edu/gateway/exception/PublishFailedException.java new file mode 100644 index 0000000..f927bf4 --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/exception/PublishFailedException.java @@ -0,0 +1,13 @@ +package com.zsc.edu.gateway.exception; + +/** + * @author zhuang + */ +public class PublishFailedException extends RuntimeException { + + public PublishFailedException(String message) { + super(message); + } + +} + diff --git a/src/main/java/com/zsc/edu/gateway/framework/AppConfig.java b/src/main/java/com/zsc/edu/gateway/framework/AppConfig.java new file mode 100644 index 0000000..b73a09b --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/framework/AppConfig.java @@ -0,0 +1,17 @@ +package com.zsc.edu.gateway.framework; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestClient; + +/** + * @author zhuang + */ +@Configuration +public class AppConfig { + + @Bean + public RestClient restClient() { + return RestClient.builder().build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/zsc/edu/gateway/framework/message/email/EmailProperties.java b/src/main/java/com/zsc/edu/gateway/framework/message/email/EmailProperties.java new file mode 100644 index 0000000..f1ac490 --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/framework/message/email/EmailProperties.java @@ -0,0 +1,15 @@ +package com.zsc.edu.gateway.framework.message.email; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @author harry_yao + */ +@Data +@ConfigurationProperties("spring.mail") +@Configuration +public class EmailProperties { + public String username; +} diff --git a/src/main/java/com/zsc/edu/gateway/framework/message/email/EmailSender.java b/src/main/java/com/zsc/edu/gateway/framework/message/email/EmailSender.java new file mode 100644 index 0000000..f891b71 --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/framework/message/email/EmailSender.java @@ -0,0 +1,108 @@ +package com.zsc.edu.gateway.framework.message.email; + + +import com.zsc.edu.gateway.modules.attachment.entity.Attachment; +import com.zsc.edu.gateway.modules.attachment.service.AttachmentService; +import com.zsc.edu.gateway.modules.notice.entity.Message; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import jakarta.annotation.Resource; +import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import jakarta.mail.MessagingException; +import jakarta.mail.internet.AddressException; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeMessage; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.Objects; +import java.util.Set; + + +/** + * @author pegnzheng + */ +@AllArgsConstructor +@Component +public class EmailSender { + + private final static String TEMPLATE = "message.ftl"; + + private final EmailProperties config; + private final Configuration freemarkerConfig; + @Resource + private final JavaMailSender sender; + private final AttachmentService attachmentService; + + @Async + public void send(String email, Message message) { + if (StringUtils.hasText(email)) { + return; + } + InternetAddress to; + try { + to = new InternetAddress(email); + to.validate(); + } catch (AddressException e) { + return; + } + send(new InternetAddress[]{to}, message); + } + + @Async + public void send(Set emails, Message message) { + InternetAddress[] to = emails.stream().filter(Objects::nonNull).map(email -> + { + try { + return new InternetAddress(email); + } catch (AddressException e) { + return null; + } + }).filter(Objects::nonNull).filter(internetAddress -> { + try { + internetAddress.validate(); + } catch (AddressException e) { + return false; + } + return true; + }).toArray(InternetAddress[]::new); + if (to.length == 0) { + return; + } + send(to, message); + } + + private void send(InternetAddress[] to, Message message) { + try { + MimeMessage mimeMessage = sender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); + helper.setTo(to); + helper.setFrom(config.username); + helper.setSubject(message.getTitle()); + if (message.html) { + StringWriter sw = new StringWriter(); + Template tp = freemarkerConfig.getTemplate(TEMPLATE, "UTF-8"); + tp.process(message, sw); + helper.setText(sw.toString(), true); + } else { + helper.setText(message.content); + } + if (Objects.nonNull(message.attachments)) { + for (Attachment attachment : message.attachments) { + helper.addAttachment(attachment.fileName, attachmentService.loadAsResource(attachment.id), attachment.mimeType); + } + } + sender.send(mimeMessage); + } catch (MessagingException | IOException | TemplateException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/zsc/edu/gateway/framework/message/sms/SmsProperties.java b/src/main/java/com/zsc/edu/gateway/framework/message/sms/SmsProperties.java new file mode 100644 index 0000000..0855eb9 --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/framework/message/sms/SmsProperties.java @@ -0,0 +1,17 @@ +package com.zsc.edu.gateway.framework.message.sms; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @author harry_yao + */ +@Data +@ConfigurationProperties("sms") +@Configuration +public class SmsProperties { + public String apiKey = "4d8de516324886549d0ba3ddc4bf6f47"; + public String singleSendUrl = "https://sms.yunpian.com/v2/sms/single_send.json"; + public String batchSendUrl = "https://sms.yunpian.com/v2/sms/batch_send.json"; +} diff --git a/src/main/java/com/zsc/edu/gateway/framework/message/sms/SmsSender.java b/src/main/java/com/zsc/edu/gateway/framework/message/sms/SmsSender.java new file mode 100644 index 0000000..8c79e38 --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/framework/message/sms/SmsSender.java @@ -0,0 +1,47 @@ +package com.zsc.edu.gateway.framework.message.sms; + + +import jakarta.annotation.Resource; +import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; +import org.springframework.web.client.RestClient; + +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author pegnzheng + */ +@AllArgsConstructor +@Component +public class SmsSender { + + private final SmsProperties properties; + @Resource + private final RestClient restClient; + + @Async + public void send(String mobile, String text) { + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("apikey", properties.apiKey); + params.add("mobile", mobile); + params.add("text", text); + restClient.post().uri(properties.singleSendUrl).body(params); + } + + @Async + public void send(Set mobiles, String text) { + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("apikey", properties.apiKey); + params.add("mobile", mobiles.stream().filter(StringUtils::hasText).collect(Collectors.joining(","))); + params.add("text", text); + restClient.post().uri(properties.batchSendUrl).body(params); + } + +} diff --git a/src/main/java/com/zsc/edu/gateway/modules/notice/dto/PageDto.java b/src/main/java/com/zsc/edu/gateway/modules/notice/dto/PageDto.java new file mode 100644 index 0000000..d61194a --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/modules/notice/dto/PageDto.java @@ -0,0 +1,24 @@ +package com.zsc.edu.gateway.modules.notice.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author zhuang + */ +@Data +public class PageDto { + /** + * 总条数 + */ + private Long total; + /** + * 总页数 + */ + private Integer pages; + /** + * 集合 + */ + private List list; +} \ No newline at end of file diff --git a/src/main/java/com/zsc/edu/gateway/modules/notice/entity/MessageAttachment.java b/src/main/java/com/zsc/edu/gateway/modules/notice/entity/MessageAttachment.java new file mode 100644 index 0000000..f7edee5 --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/modules/notice/entity/MessageAttachment.java @@ -0,0 +1,22 @@ +package com.zsc.edu.gateway.modules.notice.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @author zhuang + */ +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +@TableName("sys_message_attachment") +public class MessageAttachment { + + private Long messageId; + + private String attachmentId; +} diff --git a/src/main/java/com/zsc/edu/gateway/modules/notice/vo/BulletinVo.java b/src/main/java/com/zsc/edu/gateway/modules/notice/vo/BulletinVo.java new file mode 100644 index 0000000..1fb721c --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/modules/notice/vo/BulletinVo.java @@ -0,0 +1,44 @@ +package com.zsc.edu.gateway.modules.notice.vo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.zsc.edu.gateway.modules.notice.entity.Bulletin; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author zhuang + */ +@Data +public class BulletinVo { + private Long id; + private String title; + private Bulletin.State state = Bulletin.State.edit; + private Boolean top; + private Long editUserId; + private String editUsername; + private LocalDateTime editTime; + private Long publishUserId; + private String publishUsername; + private LocalDateTime publishTime; + private Long closeUserId; + private String closeUsername; + private LocalDateTime closeTime; + private String content; + private Boolean isRead; + private String fileName; + private String mimeType; + private LocalDateTime uploadTime; + private String url; + private String remark; + @TableField(value = "create_time", fill = FieldFill.INSERT) + private LocalDateTime createTime; + @TableField(value = "create_by", fill = FieldFill.INSERT) + private String createBy; + @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) + private String updateBy; + +} diff --git a/src/main/java/com/zsc/edu/gateway/modules/notice/vo/UserMessageVo.java b/src/main/java/com/zsc/edu/gateway/modules/notice/vo/UserMessageVo.java new file mode 100644 index 0000000..5b4f9cc --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/modules/notice/vo/UserMessageVo.java @@ -0,0 +1,51 @@ +package com.zsc.edu.gateway.modules.notice.vo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.zsc.edu.gateway.modules.attachment.entity.Attachment; +import com.zsc.edu.gateway.modules.notice.entity.Message; +import com.zsc.edu.gateway.modules.notice.entity.MessageType; +import com.zsc.edu.gateway.modules.system.entity.User; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author zhuang + */ +@Data +public class UserMessageVo { + private Long id; + public Long userId; + public User user; + public Long messageId; + public Message message; + public Boolean isRead; + public LocalDateTime readTime; + + public String username; + public String name; + public String avatar; + public String address; + + public MessageType type = MessageType.other; + public Boolean system; + public Boolean email; + public Boolean sms; + public Boolean html; + public String title; + public String content; + private String remark; + @TableField(value = "create_time", fill = FieldFill.INSERT) + private LocalDateTime createTime; + @TableField(value = "create_by", fill = FieldFill.INSERT) + private String createBy; + @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) + private String updateBy; + + public List attachments; +} diff --git a/src/main/resources/mappers/noticeMappers/MessageMapper.xml b/src/main/resources/mappers/noticeMappers/MessageMapper.xml new file mode 100644 index 0000000..e5d85d6 --- /dev/null +++ b/src/main/resources/mappers/noticeMappers/MessageMapper.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/mappers/noticeMappers/UserMessageMapper.xml b/src/main/resources/mappers/noticeMappers/UserMessageMapper.xml new file mode 100644 index 0000000..64c3234 --- /dev/null +++ b/src/main/resources/mappers/noticeMappers/UserMessageMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file