feat: 通知公告临时提交

通知公告临时提交
This commit is contained in:
胡少翔
2024-09-06 18:02:07 +08:00
parent 6f662dcde9
commit 3dae203dad
13 changed files with 81 additions and 48 deletions

View File

@@ -1,19 +0,0 @@
package com.youlai.boot.common.enums;
/**
* 消息类型枚举
* @author Theo
* @since 2024-9-2 14:32:58
*/
public enum MessageTypeEnum {
WEBSOCKET("webScoket", "websocket消息");
private String value;
private String label;
MessageTypeEnum(String value, String label) {
this.value = value;
this.label = label;
}
}

View File

@@ -6,7 +6,7 @@ import lombok.RequiredArgsConstructor;
/** /**
* 通知类型枚举 * 通知类型枚举
* 1-系统通知 0-系统消息 * 0-系统消息
* *
* @since 2024-9-1 17:33:06 * @since 2024-9-1 17:33:06
* @author Theo * @author Theo
@@ -15,7 +15,9 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor @RequiredArgsConstructor
public enum NoticeTypeEnum implements IBaseEnum<Integer> { public enum NoticeTypeEnum implements IBaseEnum<Integer> {
SYSTEM_NOTICE(1, "系统通知"), /**
* 通知类型
*/
SYSTEM_MESSAGE(0, "系统消息"); SYSTEM_MESSAGE(0, "系统消息");
@Getter @Getter

View File

@@ -0,0 +1,28 @@
package com.youlai.boot.common.enums;
import com.youlai.boot.common.base.IBaseEnum;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* 通知方式枚举
* @author Theo
* @since 2024-9-2 14:32:58
*/
@Getter
@RequiredArgsConstructor
public enum NoticeWayEnum implements IBaseEnum<Integer> {
/**
* 通知方式
*/
WEBSOCKET("webSocket", "发送websocket消息");
private String value;
private String label;
NoticeWayEnum(String value, String label) {
this.value = value;
this.label = label;
}
}

View File

@@ -1,5 +1,6 @@
package com.youlai.boot.platform.websocket.controller; package com.youlai.boot.platform.websocket.controller;
import com.youlai.boot.common.enums.NoticeTypeEnum;
import com.youlai.boot.system.model.dto.ChatMessage; import com.youlai.boot.system.model.dto.ChatMessage;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -56,7 +57,7 @@ public class WebsocketController {
log.info("发送人:{}; 接收人:{}", sender, receiver); log.info("发送人:{}; 接收人:{}", sender, receiver);
// 发送消息给指定用户,拼接后路径 /user/{receiver}/queue/greeting // 发送消息给指定用户,拼接后路径 /user/{receiver}/queue/greeting
messagingTemplate.convertAndSendToUser(receiver, "/queue/greeting", new ChatMessage(sender, message)); messagingTemplate.convertAndSendToUser(receiver, "/queue/greeting", new ChatMessage(sender, message, NoticeTypeEnum.SYSTEM_MESSAGE));
} }
} }

View File

@@ -1,6 +1,6 @@
package com.youlai.boot.platform.websocket.service; package com.youlai.boot.platform.websocket.service;
import com.youlai.boot.common.enums.MessageTypeEnum; import com.youlai.boot.common.enums.NoticeWayEnum;
import com.youlai.boot.system.model.dto.MessageDTO; import com.youlai.boot.system.model.dto.MessageDTO;
/** /**
@@ -18,7 +18,7 @@ public interface MessageService {
* @param messageType 消息类型 * @param messageType 消息类型
* @return 是否支持 * @return 是否支持
*/ */
boolean check(MessageTypeEnum messageType); boolean check(NoticeWayEnum messageType);
/** /**
* 发送消息 * 发送消息

View File

@@ -1,16 +1,13 @@
package com.youlai.boot.platform.websocket.service.impl; package com.youlai.boot.platform.websocket.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.youlai.boot.common.enums.NoticeWayEnum;
import com.youlai.boot.common.enums.MessageTypeEnum; import com.youlai.boot.common.enums.NoticeTypeEnum;
import com.youlai.boot.platform.websocket.service.MessageService; import com.youlai.boot.platform.websocket.service.MessageService;
import com.youlai.boot.system.event.UserConnectionEvent; import com.youlai.boot.system.event.UserConnectionEvent;
import com.youlai.boot.system.model.dto.ChatMessage; import com.youlai.boot.system.model.dto.ChatMessage;
import com.youlai.boot.system.model.dto.MessageDTO; import com.youlai.boot.system.model.dto.MessageDTO;
import com.youlai.boot.system.model.entity.User;
import com.youlai.boot.system.service.UserService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.security.SecurityUtil;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
@@ -61,6 +58,7 @@ public class WebsocketServiceImpl implements MessageService {
*/ */
@Scheduled(fixedRate = 5000) @Scheduled(fixedRate = 5000)
public void sendOnlineUserCount() { public void sendOnlineUserCount() {
log.info("Send online user count: {}", onlineUsers.size());
messagingTemplate.convertAndSend("/topic/onlineUserCount", onlineUsers.size()); messagingTemplate.convertAndSend("/topic/onlineUserCount", onlineUsers.size());
} }
@@ -68,12 +66,12 @@ public class WebsocketServiceImpl implements MessageService {
/** /**
* 策略模式检查 * 策略模式检查
* *
* @param messageType 消息类型 * @param noticeWayEnum 通知方式
* @return boolean * @return boolean 是否支持
*/ */
@Override @Override
public boolean check(MessageTypeEnum messageType) { public boolean check(NoticeWayEnum noticeWayEnum) {
return messageType.equals(MessageTypeEnum.WEBSOCKET); return noticeWayEnum.equals(NoticeWayEnum.WEBSOCKET);
} }
/** /**
@@ -91,7 +89,7 @@ public class WebsocketServiceImpl implements MessageService {
users = message.getReceiver().stream().filter(onlineUsers::contains).collect(Collectors.toList()); users = message.getReceiver().stream().filter(onlineUsers::contains).collect(Collectors.toList());
} }
//获取当前用户 //获取当前用户
ChatMessage chatMessage = new ChatMessage(message.getSender(), message.getContent()); ChatMessage chatMessage = new ChatMessage(message.getSender(), message.getContent(), NoticeTypeEnum.SYSTEM_MESSAGE);
users.forEach(receiver -> { users.forEach(receiver -> {
messagingTemplate.convertAndSendToUser(receiver, "/queue/message", chatMessage); messagingTemplate.convertAndSendToUser(receiver, "/queue/message", chatMessage);
}); });

View File

@@ -33,7 +33,7 @@ public interface NoticeConverter{
Page<NoticeVO> toPageVo(Page<NoticeBO> noticePage); Page<NoticeVO> toPageVo(Page<NoticeBO> noticePage);
@Mappings({ @Mappings({
@Mapping(target = "noticeTypeLabel", expression = "java(com.youlai.boot.common.base.IBaseEnum.getLabelByValue(bo.getNoticeType(), com.youlai.boot.common.enums.NoticeTypeEnum.class))") @Mapping(target = "noticeTypeLabel", expression = "java(com.youlai.boot.common.base.IBaseEnum.getLabelByValue(bo.getNoticeType(), com.youlai.boot.common.enums.NoticeWayEnum.class))")
}) })
NoticeVO toPageVo(NoticeBO bo); NoticeVO toPageVo(NoticeBO bo);

View File

@@ -22,12 +22,12 @@ public class MessageHandler {
/** /**
* 发送消息 * 发送消息
* * 如果后面有多种消息发送方式可以设置MessageDTO中的noticeWay调用不同的消息发送方式实现消息多种发送方式
* @param messageDTO 消息载体 * @param messageDTO 消息载体
*/ */
public void sendMessage(MessageDTO messageDTO) { public void sendMessage(MessageDTO messageDTO) {
messageServices.forEach(messageService -> { messageServices.forEach(messageService -> {
if (messageService.check(messageDTO.getMessageType())) { if (messageService.check(messageDTO.getNoticeWay())) {
messageService.sendMessage(messageDTO); messageService.sendMessage(messageDTO);
} }
}); });

View File

@@ -1,11 +1,12 @@
package com.youlai.boot.system.model.dto; package com.youlai.boot.system.model.dto;
import com.youlai.boot.common.enums.NoticeTypeEnum;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
/** /**
* WebSocket 消息体 * 系统消息体
*/ */
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@@ -22,4 +23,9 @@ public class ChatMessage {
*/ */
private String content; private String content;
/**
* 消息类型
*/
private NoticeTypeEnum noticeType;
} }

View File

@@ -1,6 +1,6 @@
package com.youlai.boot.system.model.dto; package com.youlai.boot.system.model.dto;
import com.youlai.boot.common.enums.MessageTypeEnum; import com.youlai.boot.common.enums.NoticeWayEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@@ -25,6 +25,6 @@ public class MessageDTO {
@Schema(description = "接收者") @Schema(description = "接收者")
private List<String> receiver; private List<String> receiver;
@Schema(description = "消息类型") @Schema(description = "通知方式")
private MessageTypeEnum messageType; private NoticeWayEnum noticeWay;
} }

View File

@@ -1,10 +1,22 @@
package com.youlai.boot.system.model.vo; package com.youlai.boot.system.model.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/** /**
* 用户公告状态VO * 用户公告状态VO
* *
* @auther Theo * @author Theo
* @since 2024-08-28 16:56 * @since 2024-08-28 16:56
*/ */
@Data
@Schema(description = "用户公告状态VO")
public class NoticeStatusVO { public class NoticeStatusVO {
@Schema(description = "公告ID")
private Long noticeId;
@Schema(description = "是否已读")
private Boolean read;
} }

View File

@@ -8,8 +8,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.boot.common.constant.SymbolConstant; import com.youlai.boot.common.constant.SymbolConstant;
import com.youlai.boot.common.enums.MessageTypeEnum; import com.youlai.boot.common.enums.NoticeWayEnum;
import com.youlai.boot.common.util.CommonUtil;
import com.youlai.boot.core.security.util.SecurityUtils; import com.youlai.boot.core.security.util.SecurityUtils;
import com.youlai.boot.system.converter.NoticeConverter; import com.youlai.boot.system.converter.NoticeConverter;
import com.youlai.boot.system.handler.MessageHandler; import com.youlai.boot.system.handler.MessageHandler;
@@ -180,7 +179,7 @@ public class NoticeServiceImpl extends ServiceImpl<NoticeMapper, Notice> impleme
usernameList = userList.stream().map(User::getUsername).collect(Collectors.toList()); usernameList = userList.stream().map(User::getUsername).collect(Collectors.toList());
} }
MessageDTO message = new MessageDTO(); MessageDTO message = new MessageDTO();
message.setMessageType(MessageTypeEnum.WEBSOCKET); message.setNoticeWay(NoticeWayEnum.WEBSOCKET);
message.setReceiver(usernameList); message.setReceiver(usernameList);
message.setContent(getNoticeContent(notice)); message.setContent(getNoticeContent(notice));
message.setSender(SecurityUtils.getUsername()); message.setSender(SecurityUtils.getUsername());

View File

@@ -1,10 +1,12 @@
package com.youlai.boot.system.service.impl; package com.youlai.boot.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.boot.common.result.Result; import com.youlai.boot.common.result.Result;
import com.youlai.boot.system.mapper.NoticeStatusMapper; import com.youlai.boot.system.mapper.NoticeStatusMapper;
import com.youlai.boot.system.model.entity.NoticeStatus; import com.youlai.boot.system.model.entity.NoticeStatus;
import com.youlai.boot.system.model.vo.NoticeStatusVO; import com.youlai.boot.system.model.vo.NoticeStatusVO;
import com.youlai.boot.system.service.NoticeService;
import com.youlai.boot.system.service.NoticeStatusService; import com.youlai.boot.system.service.NoticeStatusService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -21,9 +23,13 @@ import java.util.List;
@RequiredArgsConstructor @RequiredArgsConstructor
public class NoticeStatusServiceImpl extends ServiceImpl<NoticeStatusMapper, NoticeStatus> implements NoticeStatusService { public class NoticeStatusServiceImpl extends ServiceImpl<NoticeStatusMapper, NoticeStatus> implements NoticeStatusService {
private final NoticeService noticeService;
@Override @Override
public List<NoticeStatusVO> listNotices(Integer count) { public List<NoticeStatusVO> listNotices(Integer count) {
LambdaQueryWrapper<NoticeStatus> queryWrapper = new LambdaQueryWrapper<>();
//获取当前用户
queryWrapper.eq(NoticeStatus::getUserId, 1L);
return null; return null;
} }
} }