update 完成消息盒子功能前后端联动(已读未读在前端浏览器存储)

This commit is contained in:
疯狂的狮子Li
2026-03-27 14:34:37 +08:00
parent 66c23b1dc4
commit 60b6862c9e
25 changed files with 837 additions and 51 deletions

View File

@@ -14,11 +14,16 @@ import java.io.Serializable;
* @author Lion Li
*/
@Data
public class PushPayload implements Serializable {
public class PushPayloadDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 消息记录ID
*/
private Long messageId;
/**
* 消息类型
*/
@@ -49,8 +54,8 @@ public class PushPayload implements Serializable {
*/
private Long timestamp;
public static PushPayload of(String type, String source, String message, Object data) {
PushPayload payload = new PushPayload();
public static PushPayloadDTO of(String type, String source, String message, Object data) {
PushPayloadDTO payload = new PushPayloadDTO();
payload.setType(StringUtils.defaultIfBlank(type, PushTypeEnum.MESSAGE.getType()));
payload.setSource(StringUtils.defaultIfBlank(source, PushSourceEnum.BACKEND.getSource()));
payload.setMessage(message);
@@ -59,7 +64,7 @@ public class PushPayload implements Serializable {
return payload;
}
public static PushPayload of(PushTypeEnum type, PushSourceEnum source, String message, Object data) {
public static PushPayloadDTO of(PushTypeEnum type, PushSourceEnum source, String message, Object data) {
return of(
type == null ? null : type.getType(),
source == null ? null : source.getSource(),
@@ -68,8 +73,8 @@ public class PushPayload implements Serializable {
);
}
public static PushPayload of(PushTypeEnum type, PushSourceEnum source, String message, Object data, String path) {
PushPayload payload = of(type, source, message, data);
public static PushPayloadDTO of(PushTypeEnum type, PushSourceEnum source, String message, Object data, String path) {
PushPayloadDTO payload = of(type, source, message, data);
payload.setPath(path);
return payload;
}

View File

@@ -0,0 +1,27 @@
package org.dromara.common.core.service;
import org.dromara.common.core.domain.dto.PushPayloadDTO;
import java.util.List;
/**
* 通用 消息服务
*
* @author Lion Li
*/
public interface MessageService {
void sendMessage(Long userId, String message);
void sendMessage(String message);
void sendMessage(Long userId, PushPayloadDTO payload);
void sendMessage(PushPayloadDTO payload);
void publishMessage(List<Long> userIds, PushPayloadDTO payload);
void publishAll(String message);
void publishAll(PushPayloadDTO payload);
}

View File

@@ -63,7 +63,7 @@ public class SseController implements DisposableBean {
// public R<Void> send(Long userId, String msg) {
// PushDTO dto = new PushDTO();
// dto.setUserIds(List.of(userId));
// dto.setPayload(PushPayload.of("message", "backend", msg, null));
// dto.setPayload(PushPayloadDTO.of("message", "backend", msg, null));
// sessionManager.publishMessage(dto);
// return R.ok();
// }

View File

@@ -1,6 +1,6 @@
package org.dromara.common.push.core;
import org.dromara.common.core.domain.dto.PushPayload;
import org.dromara.common.core.domain.dto.PushPayloadDTO;
import org.dromara.common.push.dto.PushDTO;
import java.util.function.Consumer;
@@ -14,11 +14,11 @@ public interface PushSessionManager {
void subscribeMessage(Consumer<PushDTO> consumer);
void sendMessage(Long userId, PushPayload payload);
void sendMessage(Long userId, PushPayloadDTO payload);
void sendMessage(PushPayload payload);
void sendMessage(PushPayloadDTO payload);
void publishMessage(PushDTO pushDTO);
void publishAll(PushPayload payload);
void publishAll(PushPayloadDTO payload);
}

View File

@@ -3,7 +3,7 @@ package org.dromara.common.push.core;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.dto.PushPayload;
import org.dromara.common.core.domain.dto.PushPayloadDTO;
import org.dromara.common.push.constant.MessageConstants;
import org.dromara.common.push.dto.PushDTO;
import org.dromara.common.core.utils.SpringUtils;
@@ -194,7 +194,7 @@ public class SseEmitterSessionManager implements PushSessionManager {
* @param payload 要发送的消息体
*/
@Override
public void sendMessage(Long userId, PushPayload payload) {
public void sendMessage(Long userId, PushPayloadDTO payload) {
sendMessage(userId, JsonUtils.toJsonString(payload));
}
@@ -228,7 +228,7 @@ public class SseEmitterSessionManager implements PushSessionManager {
* @param payload 要发送的消息体
*/
@Override
public void sendMessage(PushPayload payload) {
public void sendMessage(PushPayloadDTO payload) {
sendMessage(JsonUtils.toJsonString(payload));
}
@@ -253,7 +253,7 @@ public class SseEmitterSessionManager implements PushSessionManager {
* @param message 要发布的消息内容
*/
public void publishAll(String message) {
publishAll(PushPayload.of("message", "backend", message, null));
publishAll(PushPayloadDTO.of("message", "backend", message, null));
}
/**
@@ -262,7 +262,7 @@ public class SseEmitterSessionManager implements PushSessionManager {
* @param payload 要发布的消息体
*/
@Override
public void publishAll(PushPayload payload) {
public void publishAll(PushPayloadDTO payload) {
PushDTO dto = new PushDTO();
dto.setPayload(payload);
RedisUtils.publish(MessageConstants.MESSAGE_TOPIC, dto, consumer -> {

View File

@@ -3,7 +3,7 @@ package org.dromara.common.push.core;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.dto.PushPayload;
import org.dromara.common.core.domain.dto.PushPayloadDTO;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.push.dto.PushDTO;
@@ -90,7 +90,7 @@ public class WebSocketSessionManager implements PushSessionManager {
}
@Override
public void sendMessage(Long userId, PushPayload payload) {
public void sendMessage(Long userId, PushPayloadDTO payload) {
if (payload == null) {
return;
}
@@ -113,7 +113,7 @@ public class WebSocketSessionManager implements PushSessionManager {
}
@Override
public void sendMessage(PushPayload payload) {
public void sendMessage(PushPayloadDTO payload) {
USER_TOKEN_SESSIONS.keySet().forEach(userId -> sendMessage(userId, payload));
}
@@ -128,7 +128,7 @@ public class WebSocketSessionManager implements PushSessionManager {
}
@Override
public void publishAll(PushPayload payload) {
public void publishAll(PushPayloadDTO payload) {
PushDTO dto = new PushDTO();
dto.setPayload(payload);
publishMessage(dto);

View File

@@ -1,7 +1,7 @@
package org.dromara.common.push.dto;
import lombok.Data;
import org.dromara.common.core.domain.dto.PushPayload;
import org.dromara.common.core.domain.dto.PushPayloadDTO;
import java.io.Serial;
import java.io.Serializable;
@@ -26,5 +26,5 @@ public class PushDTO implements Serializable {
/**
* 推送消息体。
*/
private PushPayload payload;
private PushPayloadDTO payload;
}

View File

@@ -3,7 +3,7 @@ package org.dromara.common.push.handler;
import cn.hutool.core.util.ObjectUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.dto.PushPayload;
import org.dromara.common.core.domain.dto.PushPayloadDTO;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.enums.PushSourceEnum;
import org.dromara.common.core.enums.PushTypeEnum;
@@ -61,7 +61,7 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
}
PushDTO dto = new PushDTO();
dto.setUserIds(List.of(loginUser.getUserId()));
dto.setPayload(PushPayload.of(
dto.setPayload(PushPayloadDTO.of(
PushTypeEnum.CUSTOM,
PushSourceEnum.CLIENT,
message.getPayload(),

View File

@@ -2,7 +2,7 @@ package org.dromara.common.push.helper;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.common.core.domain.dto.PushPayload;
import org.dromara.common.core.domain.dto.PushPayloadDTO;
import org.dromara.common.core.enums.PushSourceEnum;
import org.dromara.common.core.enums.PushTypeEnum;
import org.dromara.common.core.utils.SpringUtils;
@@ -27,21 +27,21 @@ public class PushHelper {
sendMessage(buildMessage(message));
}
public static void sendMessage(Long userId, PushPayload payload) {
public static void sendMessage(Long userId, PushPayloadDTO payload) {
if (!isEnabled()) {
return;
}
getSessionManager().sendMessage(userId, payload);
}
public static void sendMessage(PushPayload payload) {
public static void sendMessage(PushPayloadDTO payload) {
if (!isEnabled()) {
return;
}
getSessionManager().sendMessage(payload);
}
public static void publishMessage(List<Long> userIds, PushPayload payload) {
public static void publishMessage(List<Long> userIds, PushPayloadDTO payload) {
PushDTO dto = new PushDTO();
dto.setUserIds(userIds);
dto.setPayload(payload);
@@ -59,7 +59,7 @@ public class PushHelper {
publishAll(buildMessage(message));
}
public static void publishAll(PushPayload payload) {
public static void publishAll(PushPayloadDTO payload) {
if (!isEnabled()) {
return;
}
@@ -74,7 +74,7 @@ public class PushHelper {
return SpringUtils.getBean(PushSessionManager.class);
}
private static PushPayload buildMessage(String message) {
return PushPayload.of(PushTypeEnum.MESSAGE, PushSourceEnum.BACKEND, message, null);
private static PushPayloadDTO buildMessage(String message) {
return PushPayloadDTO.of(PushTypeEnum.MESSAGE, PushSourceEnum.BACKEND, message, null);
}
}