diff --git a/im-client/src/main/java/com/bx/imclient/config/RedisConfig.java b/im-client/src/main/java/com/bx/imclient/config/RedisConfig.java index 23fac7c..a9799f8 100644 --- a/im-client/src/main/java/com/bx/imclient/config/RedisConfig.java +++ b/im-client/src/main/java/com/bx/imclient/config/RedisConfig.java @@ -1,5 +1,6 @@ package com.bx.imclient.config; +import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.PropertyAccessor; @@ -9,6 +10,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @@ -17,16 +19,13 @@ import javax.annotation.Resource; @Configuration("IMRedisConfig") public class RedisConfig { - @Resource - private RedisConnectionFactory factory; - @Bean("IMRedisTemplate") public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(redisConnectionFactory); - // 设置值(value)的序列化采用jackson2JsonRedisSerializer - redisTemplate.setValueSerializer(jackson2JsonRedisSerializer()); - redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer()); + // 设置值(value)的序列化采用FastJsonRedisSerializer + redisTemplate.setValueSerializer(fastJsonRedisSerializer()); + redisTemplate.setHashValueSerializer(fastJsonRedisSerializer()); // 设置键(key)的序列化采用StringRedisSerializer。 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); @@ -34,16 +33,9 @@ public class RedisConfig { return redisTemplate; } - @Bean - public Jackson2JsonRedisSerializer jackson2JsonRedisSerializer(){ - Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); - ObjectMapper om = new ObjectMapper(); - om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - // 解决jackson2无法反序列化LocalDateTime的问题 - om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); - jackson2JsonRedisSerializer.setObjectMapper(om); - return jackson2JsonRedisSerializer; + public FastJsonRedisSerializer fastJsonRedisSerializer(){ + FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); + return fastJsonRedisSerializer; } } diff --git a/im-client/src/main/java/com/bx/imclient/listener/MessageListener.java b/im-client/src/main/java/com/bx/imclient/listener/MessageListener.java index 95ae871..26636dd 100644 --- a/im-client/src/main/java/com/bx/imclient/listener/MessageListener.java +++ b/im-client/src/main/java/com/bx/imclient/listener/MessageListener.java @@ -1,10 +1,10 @@ package com.bx.imclient.listener; -import com.bx.imcommon.model.SendResult; +import com.bx.imcommon.model.IMSendResult; -public interface MessageListener { +public interface MessageListener { - void process(SendResult result); + void process(IMSendResult result); } diff --git a/im-client/src/main/java/com/bx/imclient/listener/MessageListenerMulticaster.java b/im-client/src/main/java/com/bx/imclient/listener/MessageListenerMulticaster.java index 8d91a3c..05eb5b4 100644 --- a/im-client/src/main/java/com/bx/imclient/listener/MessageListenerMulticaster.java +++ b/im-client/src/main/java/com/bx/imclient/listener/MessageListenerMulticaster.java @@ -1,12 +1,15 @@ package com.bx.imclient.listener; +import com.alibaba.fastjson.JSONObject; import com.bx.imclient.annotation.IMListener; import com.bx.imcommon.enums.IMListenerType; -import com.bx.imcommon.model.SendResult; +import com.bx.imcommon.model.IMSendResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.Collections; import java.util.List; @@ -16,12 +19,22 @@ public class MessageListenerMulticaster { @Autowired(required = false) private List messageListeners = Collections.emptyList(); - public void multicast(IMListenerType type, SendResult result){ + public void multicast(IMListenerType listenerType, IMSendResult result){ for(MessageListener listener:messageListeners){ IMListener annotation = listener.getClass().getAnnotation(IMListener.class); - if(annotation!=null && (annotation.type().equals(IMListenerType.ALL) || annotation.type().equals(type))){ + if(annotation!=null && (annotation.type().equals(IMListenerType.ALL) || annotation.type().equals(listenerType))){ + // 将data转回对象类型 + if(result.getData() instanceof JSONObject){ + Type superClass = listener.getClass().getGenericInterfaces()[0]; + Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0]; + JSONObject data = (JSONObject)result.getData(); + result.setData(data.toJavaObject(type)); + } + // 回调到调用方处理 listener.process(result); } } } + + } diff --git a/im-client/src/main/java/com/bx/imclient/sender/IMSender.java b/im-client/src/main/java/com/bx/imclient/sender/IMSender.java index 785df96..035f936 100644 --- a/im-client/src/main/java/com/bx/imclient/sender/IMSender.java +++ b/im-client/src/main/java/com/bx/imclient/sender/IMSender.java @@ -1,10 +1,11 @@ package com.bx.imclient.sender; import com.bx.imclient.listener.MessageListenerMulticaster; -import com.bx.imcommon.contant.RedisKey; +import com.bx.imcommon.contant.IMRedisKey; import com.bx.imcommon.enums.IMCmdType; import com.bx.imcommon.enums.IMListenerType; import com.bx.imcommon.enums.IMSendCode; +import com.bx.imcommon.enums.IMTerminalType; import com.bx.imcommon.model.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -30,57 +31,52 @@ public class IMSender { public void sendPrivateMessage(IMPrivateMessage message) { for (Integer terminal : message.getRecvTerminals()) { // 获取对方连接的channelId - String key = String.join(":",RedisKey.IM_USER_SERVER_ID, message.getRecvId().toString(), terminal.toString()); - Integer serverId = (Integer) redisTemplate.opsForValue().get(key); + String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, message.getRecvId().toString(), terminal.toString()); + Integer serverId = (Integer)redisTemplate.opsForValue().get(key); // 如果对方在线,将数据存储至redis,等待拉取推送 if (serverId != null) { - IMRecvInfo[] recvInfos = new IMRecvInfo[message.getDatas().size()]; - String sendKey = String.join(":",RedisKey.IM_UNREAD_PRIVATE_QUEUE,serverId.toString()); - for (int i = 0; i < message.getDatas().size(); i++) { + String sendKey = String.join(":", IMRedisKey.IM_UNREAD_PRIVATE_QUEUE, serverId.toString()); + IMRecvInfo recvInfo = new IMRecvInfo(); + recvInfo.setCmd(IMCmdType.PRIVATE_MESSAGE.code()); + recvInfo.setSendResult(message.getSendResult()); + recvInfo.setSender(message.getSender()); + recvInfo.setReceivers(Collections.singletonList(new IMUserInfo(message.getRecvId(), terminal))); + recvInfo.setData(message.getData()); + redisTemplate.opsForList().rightPush(sendKey, recvInfo); + } else if (message.getSendResult()) { + // 回复消息状态 + IMSendResult result = new IMSendResult(); + result.setSender(message.getSender()); + result.setReceiver(new IMUserInfo(message.getRecvId(), terminal)); + result.setCode(IMSendCode.NOT_ONLINE.code()); + result.setData(message.getData()); + listenerMulticaster.multicast(IMListenerType.PRIVATE_MESSAGE, result); + } + } + // 推送给自己的其他终端 + if(message.getSendToSelf()){ + for (Integer terminal : IMTerminalType.codes()) { + if (message.getSender().getTerminal().equals(terminal)) { + continue; + } + // 获取终端连接的channelId + String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, message.getSender().getId().toString(), terminal.toString()); + Integer serverId = (Integer)redisTemplate.opsForValue().get(key); + // 如果终端在线,将数据存储至redis,等待拉取推送 + if (serverId != null) { + String sendKey = String.join(":", IMRedisKey.IM_UNREAD_PRIVATE_QUEUE, serverId.toString()); IMRecvInfo recvInfo = new IMRecvInfo(); + // 自己的消息不需要回推消息结果 + recvInfo.setSendResult(false); recvInfo.setCmd(IMCmdType.PRIVATE_MESSAGE.code()); - recvInfo.setSendResult(message.getSendResult()); recvInfo.setSender(message.getSender()); - recvInfo.setReceivers(Collections.singletonList(new IMUserInfo(message.getRecvId(), terminal))); - recvInfo.setData(message.getDatas().get(i)); - recvInfos[i]=recvInfo; - } - redisTemplate.opsForList().rightPushAll(sendKey, recvInfos); - } else if(message.getSendResult()){ - // 回复消息状态 - for (int i = 0; i < message.getDatas().size(); i++) { - SendResult result = new SendResult(); - result.setSender(message.getSender()); - result.setReceiver(new IMUserInfo(message.getRecvId(), terminal)); - result.setCode(IMSendCode.NOT_ONLINE.code()); - result.setData(message.getDatas().get(i)); - listenerMulticaster.multicast(IMListenerType.PRIVATE_MESSAGE, result); + recvInfo.setReceivers(Collections.singletonList(new IMUserInfo(message.getSender().getId(), terminal))); + recvInfo.setData(message.getData()); + redisTemplate.opsForList().rightPush(sendKey, recvInfo); } - } - // 推送给自己的其他终端 - if (message.getSendToSelf() && !message.getSender().getTerminal().equals(terminal)) { - // 获取终端连接的channelId - key = String.join(":",RedisKey.IM_USER_SERVER_ID, message.getSender().getId().toString(), terminal.toString()); - serverId = (Integer) redisTemplate.opsForValue().get(key); - // 如果终端在线,将数据存储至redis,等待拉取推送 - if (serverId != null) { - String sendKey = String.join(":",RedisKey.IM_UNREAD_PRIVATE_QUEUE, serverId.toString()); - IMRecvInfo[] recvInfos = new IMRecvInfo[message.getDatas().size()]; - for (int i = 0; i < message.getDatas().size(); i++) { - IMRecvInfo recvInfo = new IMRecvInfo(); - // 自己的消息不需要回推消息结果 - recvInfo.setSendResult(false); - recvInfo.setCmd(IMCmdType.PRIVATE_MESSAGE.code()); - recvInfo.setSender(message.getSender()); - recvInfo.setReceivers(Collections.singletonList(new IMUserInfo(message.getSender().getId(),terminal))); - recvInfo.setData(message.getDatas().get(i)); - recvInfos[i]=recvInfo; - } - redisTemplate.opsForList().rightPushAll(sendKey, recvInfos); - } - } } + } public void sendGroupMessage(IMGroupMessage message) { @@ -90,14 +86,14 @@ public class IMSender { Map> serverMap = new ConcurrentHashMap<>(); for (Integer terminal : message.getRecvTerminals()) { message.getRecvIds().parallelStream().forEach(id -> { - String key = String.join(":",RedisKey.IM_USER_SERVER_ID, id.toString(),terminal.toString()); + String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, id.toString(), terminal.toString()); Integer serverId = (Integer)redisTemplate.opsForValue().get(key); if (serverId != null) { - List list = serverMap.computeIfAbsent(serverId,o->Collections.synchronizedList(new LinkedList<>())); - list.add(new IMUserInfo(id,terminal)); + List list = serverMap.computeIfAbsent(serverId, o -> Collections.synchronizedList(new LinkedList<>())); + list.add(new IMUserInfo(id, terminal)); } else { // 加入离线列表 - offLineUsers.add(new IMUserInfo(id,terminal)); + offLineUsers.add(new IMUserInfo(id, terminal)); } }); } @@ -110,13 +106,13 @@ public class IMSender { recvInfo.setSendResult(message.getSendResult()); recvInfo.setData(message.getData()); // 推送至队列 - String key = String.join(":",RedisKey.IM_UNREAD_GROUP_QUEUE,entry.getKey().toString()); + String key = String.join(":", IMRedisKey.IM_UNREAD_GROUP_QUEUE, entry.getKey().toString()); redisTemplate.opsForList().rightPush(key, recvInfo); } // 对离线用户回复消息状态 - if(message.getSendResult()){ + if (message.getSendResult()) { for (IMUserInfo offLineUser : offLineUsers) { - SendResult result = new SendResult(); + IMSendResult result = new IMSendResult(); result.setSender(message.getSender()); result.setReceiver(offLineUser); result.setCode(IMSendCode.NOT_ONLINE.code()); @@ -124,26 +120,25 @@ public class IMSender { listenerMulticaster.multicast(IMListenerType.GROUP_MESSAGE, result); } } - // 推送给自己的其他终端 if (message.getSendToSelf()) { - for (Integer terminal : message.getRecvTerminals()) { - if(terminal.equals(message.getSender().getTerminal())){ + for (Integer terminal : IMTerminalType.codes()) { + if (terminal.equals(message.getSender().getTerminal())) { continue; } // 获取终端连接的channelId - String key = String.join(":",RedisKey.IM_USER_SERVER_ID, message.getSender().getId().toString(), terminal.toString()); - Integer serverId = (Integer) redisTemplate.opsForValue().get(key); + String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, message.getSender().getId().toString(), terminal.toString()); + Integer serverId = (Integer)redisTemplate.opsForValue().get(key); // 如果终端在线,将数据存储至redis,等待拉取推送 if (serverId != null) { IMRecvInfo recvInfo = new IMRecvInfo(); recvInfo.setCmd(IMCmdType.GROUP_MESSAGE.code()); recvInfo.setSender(message.getSender()); - recvInfo.setReceivers(Collections.singletonList(new IMUserInfo(message.getSender().getId(),terminal))); + recvInfo.setReceivers(Collections.singletonList(new IMUserInfo(message.getSender().getId(), terminal))); // 自己的消息不需要回推消息结果 recvInfo.setSendResult(false); recvInfo.setData(message.getData()); - String sendKey = String.join(":",RedisKey.IM_UNREAD_GROUP_QUEUE,serverId.toString()); + String sendKey = String.join(":", IMRedisKey.IM_UNREAD_GROUP_QUEUE, serverId.toString()); redisTemplate.opsForList().rightPush(sendKey, recvInfo); } } @@ -151,7 +146,7 @@ public class IMSender { } public Boolean isOnline(Long userId) { - String key = String.join(":",RedisKey.IM_USER_SERVER_ID,userId.toString(),"*"); + String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, userId.toString(), "*"); return !redisTemplate.keys(key).isEmpty(); } } diff --git a/im-client/src/main/java/com/bx/imclient/task/PullSendResultGroupMessageTask.java b/im-client/src/main/java/com/bx/imclient/task/PullSendResultGroupMessageTask.java index 3de0494..2fa6e62 100644 --- a/im-client/src/main/java/com/bx/imclient/task/PullSendResultGroupMessageTask.java +++ b/im-client/src/main/java/com/bx/imclient/task/PullSendResultGroupMessageTask.java @@ -1,9 +1,10 @@ package com.bx.imclient.task; +import com.alibaba.fastjson.JSONObject; import com.bx.imclient.listener.MessageListenerMulticaster; -import com.bx.imcommon.contant.RedisKey; +import com.bx.imcommon.contant.IMRedisKey; import com.bx.imcommon.enums.IMListenerType; -import com.bx.imcommon.model.SendResult; +import com.bx.imcommon.model.IMSendResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; @@ -23,9 +24,10 @@ public class PullSendResultGroupMessageTask extends AbstractPullMessageTask{ @Override public void pullMessage() { - String key = RedisKey.IM_RESULT_GROUP_QUEUE; - SendResult result = (SendResult)redisTemplate.opsForList().leftPop(key,10, TimeUnit.SECONDS); - if(result != null) { + String key = IMRedisKey.IM_RESULT_GROUP_QUEUE; + JSONObject jsonObject = (JSONObject)redisTemplate.opsForList().leftPop(key,10, TimeUnit.SECONDS); + if(jsonObject != null) { + IMSendResult result = jsonObject.toJavaObject(IMSendResult.class); listenerMulticaster.multicast(IMListenerType.GROUP_MESSAGE,result); } } diff --git a/im-client/src/main/java/com/bx/imclient/task/PullSendResultPrivateMessageTask.java b/im-client/src/main/java/com/bx/imclient/task/PullSendResultPrivateMessageTask.java index e634493..a800c63 100644 --- a/im-client/src/main/java/com/bx/imclient/task/PullSendResultPrivateMessageTask.java +++ b/im-client/src/main/java/com/bx/imclient/task/PullSendResultPrivateMessageTask.java @@ -1,9 +1,10 @@ package com.bx.imclient.task; +import com.alibaba.fastjson.JSONObject; import com.bx.imclient.listener.MessageListenerMulticaster; -import com.bx.imcommon.contant.RedisKey; +import com.bx.imcommon.contant.IMRedisKey; import com.bx.imcommon.enums.IMListenerType; -import com.bx.imcommon.model.SendResult; +import com.bx.imcommon.model.IMSendResult; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -28,9 +29,11 @@ public class PullSendResultPrivateMessageTask extends AbstractPullMessageTask{ @Override public void pullMessage() { - String key = RedisKey.IM_RESULT_PRIVATE_QUEUE; - SendResult result = (SendResult)redisTemplate.opsForList().leftPop(key,10, TimeUnit.SECONDS); - if(result != null) { + String key = IMRedisKey.IM_RESULT_PRIVATE_QUEUE; + JSONObject jsonObject = (JSONObject)redisTemplate.opsForList().leftPop(key,10, TimeUnit.SECONDS); + + if(jsonObject != null) { + IMSendResult result = jsonObject.toJavaObject(IMSendResult.class); listenerMulticaster.multicast(IMListenerType.PRIVATE_MESSAGE, result); } } diff --git a/im-commom/src/main/java/com/bx/imcommon/contant/Constant.java b/im-commom/src/main/java/com/bx/imcommon/contant/IMConstant.java similarity index 89% rename from im-commom/src/main/java/com/bx/imcommon/contant/Constant.java rename to im-commom/src/main/java/com/bx/imcommon/contant/IMConstant.java index 4284a5d..7f833d0 100644 --- a/im-commom/src/main/java/com/bx/imcommon/contant/Constant.java +++ b/im-commom/src/main/java/com/bx/imcommon/contant/IMConstant.java @@ -1,7 +1,7 @@ package com.bx.imcommon.contant; -public class Constant { +public class IMConstant { // 在线状态过期时间 600s public static final long ONLINE_TIMEOUT_SECOND = 600; @@ -9,5 +9,4 @@ public class Constant { public static final long ALLOW_RECALL_SECOND = 300; - } diff --git a/im-commom/src/main/java/com/bx/imcommon/contant/RedisKey.java b/im-commom/src/main/java/com/bx/imcommon/contant/IMRedisKey.java similarity index 96% rename from im-commom/src/main/java/com/bx/imcommon/contant/RedisKey.java rename to im-commom/src/main/java/com/bx/imcommon/contant/IMRedisKey.java index 1e02da4..a3d7ad4 100644 --- a/im-commom/src/main/java/com/bx/imcommon/contant/RedisKey.java +++ b/im-commom/src/main/java/com/bx/imcommon/contant/IMRedisKey.java @@ -1,6 +1,6 @@ package com.bx.imcommon.contant; -public class RedisKey { +public class IMRedisKey { // im-server最大id,从0开始递增 public final static String IM_MAX_SERVER_ID = "im:max_server_id"; diff --git a/im-commom/src/main/java/com/bx/imcommon/model/GroupMessageInfo.java b/im-commom/src/main/java/com/bx/imcommon/model/GroupMessageInfo.java deleted file mode 100644 index 7706868..0000000 --- a/im-commom/src/main/java/com/bx/imcommon/model/GroupMessageInfo.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.bx.imcommon.model; - -import com.bx.imcommon.serializer.DateToLongSerializer; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import lombok.Data; - -import java.util.Date; - -@Data -public class GroupMessageInfo { - - /* - * 消息id - */ - private Long id; - - /* - * 群聊id - */ - private Long groupId; - - /* - * 发送者id - */ - private Long sendId; - - /* - * 消息内容 - */ - private String content; - - /* - * 消息内容类型 具体枚举值由应用层定义 - */ - private Integer type; - - /** - * 发送时间 - */ - @JsonSerialize(using = DateToLongSerializer.class) - private Date sendTime; -} diff --git a/im-commom/src/main/java/com/bx/imcommon/model/HeartbeatInfo.java b/im-commom/src/main/java/com/bx/imcommon/model/IMHeartbeatInfo.java similarity index 66% rename from im-commom/src/main/java/com/bx/imcommon/model/HeartbeatInfo.java rename to im-commom/src/main/java/com/bx/imcommon/model/IMHeartbeatInfo.java index d05f305..4b50271 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/HeartbeatInfo.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/IMHeartbeatInfo.java @@ -3,5 +3,5 @@ package com.bx.imcommon.model; import lombok.Data; @Data -public class HeartbeatInfo { +public class IMHeartbeatInfo { } diff --git a/im-commom/src/main/java/com/bx/imcommon/model/LoginInfo.java b/im-commom/src/main/java/com/bx/imcommon/model/IMLoginInfo.java similarity index 77% rename from im-commom/src/main/java/com/bx/imcommon/model/LoginInfo.java rename to im-commom/src/main/java/com/bx/imcommon/model/IMLoginInfo.java index f4a365f..afccfca 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/LoginInfo.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/IMLoginInfo.java @@ -3,7 +3,7 @@ package com.bx.imcommon.model; import lombok.Data; @Data -public class LoginInfo { +public class IMLoginInfo { private String accessToken; } diff --git a/im-commom/src/main/java/com/bx/imcommon/model/IMPrivateMessage.java b/im-commom/src/main/java/com/bx/imcommon/model/IMPrivateMessage.java index f2b373e..63d3689 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/IMPrivateMessage.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/IMPrivateMessage.java @@ -38,7 +38,7 @@ public class IMPrivateMessage { /** * 消息内容 */ - private List datas; + private T data; } diff --git a/im-commom/src/main/java/com/bx/imcommon/model/SendResult.java b/im-commom/src/main/java/com/bx/imcommon/model/IMSendResult.java similarity index 85% rename from im-commom/src/main/java/com/bx/imcommon/model/SendResult.java rename to im-commom/src/main/java/com/bx/imcommon/model/IMSendResult.java index e303512..15d1b43 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/SendResult.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/IMSendResult.java @@ -3,7 +3,7 @@ package com.bx.imcommon.model; import lombok.Data; @Data -public class SendResult { +public class IMSendResult { /** * 发送方 @@ -23,6 +23,6 @@ public class SendResult { /* * 消息内容 */ - private Object data; + private T data; } diff --git a/im-commom/src/main/java/com/bx/imcommon/model/PrivateMessageInfo.java b/im-commom/src/main/java/com/bx/imcommon/model/PrivateMessageInfo.java deleted file mode 100644 index be5c753..0000000 --- a/im-commom/src/main/java/com/bx/imcommon/model/PrivateMessageInfo.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.bx.imcommon.model; - -import com.bx.imcommon.serializer.DateToLongSerializer; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import lombok.Data; - -import java.util.Date; - -@Data -public class PrivateMessageInfo { - - /* - * 消息id - */ - private long id; - - /* - * 发送者id - */ - private Long sendId; - - /* - * 接收者id - */ - private Long recvId; - - /* - * 发送内容 - */ - private String content; - - /* - * 消息内容类型 具体枚举值由应用层定义 - */ - private Integer type; - - /** - * 发送时间 - */ - @JsonSerialize(using = DateToLongSerializer.class) - private Date sendTime; -} diff --git a/im-platform/src/main/java/com/bx/implatform/config/MinIoClientConfig.java b/im-platform/src/main/java/com/bx/implatform/config/MinIoClientConfig.java index 8144a56..9462aef 100644 --- a/im-platform/src/main/java/com/bx/implatform/config/MinIoClientConfig.java +++ b/im-platform/src/main/java/com/bx/implatform/config/MinIoClientConfig.java @@ -20,10 +20,9 @@ public class MinIoClientConfig { @Bean public MinioClient minioClient(){ // 注入minio 客户端 - MinioClient client = MinioClient.builder() + return MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); - return client; } } \ No newline at end of file diff --git a/im-platform/src/main/java/com/bx/implatform/config/RedisConfig.java b/im-platform/src/main/java/com/bx/implatform/config/RedisConfig.java index 1dec3cc..54bffe8 100644 --- a/im-platform/src/main/java/com/bx/implatform/config/RedisConfig.java +++ b/im-platform/src/main/java/com/bx/implatform/config/RedisConfig.java @@ -38,7 +38,7 @@ public class RedisConfig extends CachingConfigurerSupport { @Primary @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { - RedisTemplate redisTemplate = new RedisTemplate(); + RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); // 设置值(value)的序列化采用jackson2JsonRedisSerializer @@ -52,8 +52,8 @@ public class RedisConfig extends CachingConfigurerSupport { } @Bean - public Jackson2JsonRedisSerializer jackson2JsonRedisSerializer(){ - Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + public Jackson2JsonRedisSerializer jackson2JsonRedisSerializer(){ + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 解决jackson2无法反序列化LocalDateTime的问题 diff --git a/im-platform/src/main/java/com/bx/implatform/contant/Constant.java b/im-platform/src/main/java/com/bx/implatform/contant/Constant.java index 0f764c3..19daa41 100644 --- a/im-platform/src/main/java/com/bx/implatform/contant/Constant.java +++ b/im-platform/src/main/java/com/bx/implatform/contant/Constant.java @@ -8,13 +8,5 @@ public class Constant { public static final long MAX_FILE_SIZE = 10*1024*1024; // 群聊最大人数 public static final long MAX_GROUP_MEMBER = 500; - // accessToken 过期时间(半小时) - public static final Integer ACCESS_TOKEN_EXPIRE = 30 * 60; - // refreshToken 过期时间(7天) - public static final Integer REFRESH_TOKEN_EXPIRE = 7 * 24 * 60 * 60 ; - // accessToken 加密秘钥 - // refreshToken 加密秘钥 - public static final String ACCESS_TOKEN_SECRET = "MIIBIjANBgkq"; - public static final String REFRESH_TOKEN_SECRET = "IKDiqVmn0VFU"; - + } diff --git a/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java b/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java index 48d0665..8d57a81 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java @@ -1,11 +1,11 @@ package com.bx.implatform.controller; -import com.bx.imcommon.model.GroupMessageInfo; +import com.bx.implatform.vo.GroupMessageVO; import com.bx.implatform.result.Result; import com.bx.implatform.result.ResultUtils; import com.bx.implatform.service.IGroupMessageService; -import com.bx.implatform.vo.GroupMessageVO; +import com.bx.implatform.dto.GroupMessageDTO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +27,7 @@ public class GroupMessageController { @PostMapping("/send") @ApiOperation(value = "发送群聊消息",notes="发送群聊消息") - public Result sendMessage(@Valid @RequestBody GroupMessageVO vo){ + public Result sendMessage(@Valid @RequestBody GroupMessageDTO vo){ return ResultUtils.success(groupMessageService.sendMessage(vo)); } @@ -47,7 +47,7 @@ public class GroupMessageController { @GetMapping("/history") @ApiOperation(value = "查询聊天记录",notes="查询聊天记录") - public Result> recallMessage(@NotNull(message = "群聊id不能为空") @RequestParam Long groupId, + public Result> recallMessage(@NotNull(message = "群聊id不能为空") @RequestParam Long groupId, @NotNull(message = "页码不能为空") @RequestParam Long page, @NotNull(message = "size不能为空") @RequestParam Long size){ return ResultUtils.success( groupMessageService.findHistoryMessage(groupId,page,size)); diff --git a/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java b/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java index 1b9a338..cde3c38 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java @@ -1,11 +1,11 @@ package com.bx.implatform.controller; -import com.bx.imcommon.model.PrivateMessageInfo; +import com.bx.implatform.vo.PrivateMessageVO; import com.bx.implatform.result.Result; import com.bx.implatform.result.ResultUtils; import com.bx.implatform.service.IPrivateMessageService; -import com.bx.implatform.vo.PrivateMessageVO; +import com.bx.implatform.dto.PrivateMessageDTO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -25,7 +25,7 @@ public class PrivateMessageController { @PostMapping("/send") @ApiOperation(value = "发送消息",notes="发送私聊消息") - public Result sendMessage(@Valid @RequestBody PrivateMessageVO vo){ + public Result sendMessage(@Valid @RequestBody PrivateMessageDTO vo){ return ResultUtils.success(privateMessageService.sendMessage(vo)); } @@ -48,7 +48,7 @@ public class PrivateMessageController { @GetMapping("/history") @ApiOperation(value = "查询聊天记录",notes="查询聊天记录") - public Result> recallMessage(@NotNull(message = "好友id不能为空") @RequestParam Long friendId, + public Result> recallMessage(@NotNull(message = "好友id不能为空") @RequestParam Long friendId, @NotNull(message = "页码不能为空") @RequestParam Long page, @NotNull(message = "size不能为空") @RequestParam Long size){ return ResultUtils.success( privateMessageService.findHistoryMessage(friendId,page,size)); diff --git a/im-platform/src/main/java/com/bx/implatform/dto/GroupMessageDTO.java b/im-platform/src/main/java/com/bx/implatform/dto/GroupMessageDTO.java new file mode 100644 index 0000000..6227eb1 --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/dto/GroupMessageDTO.java @@ -0,0 +1,28 @@ +package com.bx.implatform.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Data +@ApiModel("群聊消息VO") +public class GroupMessageDTO { + + @NotNull(message="群聊id不可为空") + @ApiModelProperty(value = "群聊id") + private Long groupId; + + + @Length(max=1024,message = "内容长度不得大于1024") + @NotEmpty(message="发送内容不可为空") + @ApiModelProperty(value = "发送内容") + private String content; + + @NotNull(message="消息类型不可为空") + @ApiModelProperty(value = "消息类型") + private Integer type; +} diff --git a/im-platform/src/main/java/com/bx/implatform/dto/PrivateMessageDTO.java b/im-platform/src/main/java/com/bx/implatform/dto/PrivateMessageDTO.java new file mode 100644 index 0000000..bc74399 --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/dto/PrivateMessageDTO.java @@ -0,0 +1,31 @@ +package com.bx.implatform.dto; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Data +@ApiModel("私聊消息VO") +public class PrivateMessageDTO { + + + @NotNull(message="接收用户id不可为空") + @ApiModelProperty(value = "接收用户id") + private Long recvId; + + + @Length(max=1024,message = "内容长度不得大于1024") + @NotEmpty(message="发送内容不可为空") + @ApiModelProperty(value = "发送内容") + private String content; + + @NotNull(message="消息类型不可为空") + @ApiModelProperty(value = "消息类型") + private Integer type; + +} diff --git a/im-platform/src/main/java/com/bx/implatform/enums/FileType.java b/im-platform/src/main/java/com/bx/implatform/enums/FileType.java index 2e628e5..dc2071f 100644 --- a/im-platform/src/main/java/com/bx/implatform/enums/FileType.java +++ b/im-platform/src/main/java/com/bx/implatform/enums/FileType.java @@ -9,24 +9,15 @@ public enum FileType { - private Integer code; + private final Integer code; - private String desc; + private final String desc; FileType(Integer index, String desc) { this.code =index; this.desc=desc; } - public static FileType fromCode(Integer code){ - for (FileType typeEnum:values()) { - if (typeEnum.code.equals(code)) { - return typeEnum; - } - } - return null; - } - public String description() { return desc; diff --git a/im-platform/src/main/java/com/bx/implatform/enums/MessageStatus.java b/im-platform/src/main/java/com/bx/implatform/enums/MessageStatus.java index 212c3eb..8a7968e 100644 --- a/im-platform/src/main/java/com/bx/implatform/enums/MessageStatus.java +++ b/im-platform/src/main/java/com/bx/implatform/enums/MessageStatus.java @@ -7,25 +7,15 @@ public enum MessageStatus { ALREADY_READ(1,"已读"), RECALL(2,"已撤回"); - private Integer code; + private final Integer code; - private String desc; + private final String desc; MessageStatus(Integer index, String desc) { this.code =index; this.desc=desc; } - public static MessageStatus fromCode(Integer code){ - for (MessageStatus typeEnum:values()) { - if (typeEnum.code.equals(code)) { - return typeEnum; - } - } - return null; - } - - public String description() { return desc; } diff --git a/im-platform/src/main/java/com/bx/implatform/enums/MessageType.java b/im-platform/src/main/java/com/bx/implatform/enums/MessageType.java index 0b44028..04f30f9 100644 --- a/im-platform/src/main/java/com/bx/implatform/enums/MessageType.java +++ b/im-platform/src/main/java/com/bx/implatform/enums/MessageType.java @@ -6,8 +6,9 @@ public enum MessageType { TEXT(0,"文字"), FILE(1,"文件"), IMAGE(2,"图片"), - VIDEO(3,"视频"), - TIP(10,"系统提示"), + AUDIO(3,"音频"), + VIDEO(4,"视频"), + RECALL(10,"撤回"), RTC_CALL(101,"呼叫"), RTC_ACCEPT(102,"接受"), @@ -17,25 +18,15 @@ public enum MessageType { RTC_HANDUP(106,"挂断"), RTC_CANDIDATE(107,"同步candidate"); - private Integer code; + private final Integer code; - private String desc; + private final String desc; MessageType(Integer index, String desc) { this.code =index; this.desc=desc; } - public static MessageType fromCode(Integer code){ - for (MessageType typeEnum:values()) { - if (typeEnum.code.equals(code)) { - return typeEnum; - } - } - return null; - } - - public String description() { return desc; } diff --git a/im-platform/src/main/java/com/bx/implatform/enums/ResultCode.java b/im-platform/src/main/java/com/bx/implatform/enums/ResultCode.java index 4af3527..8b8a4b0 100644 --- a/im-platform/src/main/java/com/bx/implatform/enums/ResultCode.java +++ b/im-platform/src/main/java/com/bx/implatform/enums/ResultCode.java @@ -21,7 +21,6 @@ public enum ResultCode { private int code; private String msg; - // 构造方法 ResultCode(int code, String msg) { this.code = code; this.msg = msg; diff --git a/im-platform/src/main/java/com/bx/implatform/exception/GlobalExceptionHandler.java b/im-platform/src/main/java/com/bx/implatform/exception/GlobalExceptionHandler.java index 0c44af8..b7091a5 100644 --- a/im-platform/src/main/java/com/bx/implatform/exception/GlobalExceptionHandler.java +++ b/im-platform/src/main/java/com/bx/implatform/exception/GlobalExceptionHandler.java @@ -71,7 +71,7 @@ public class GlobalExceptionHandler { public Result handleValidationExceptionHandler(MethodArgumentNotValidException exception) { BindingResult bindResult = exception.getBindingResult(); String msg; - if (bindResult != null && bindResult.hasErrors()) { + if (bindResult.hasErrors()) { msg = bindResult.getAllErrors().get(0).getDefaultMessage(); if (msg.contains("NumberFormatException")) { msg = "参数类型错误!"; diff --git a/im-platform/src/main/java/com/bx/implatform/filter/CacheFilter.java b/im-platform/src/main/java/com/bx/implatform/filter/CacheFilter.java index 9353e0f..e7ff61d 100644 --- a/im-platform/src/main/java/com/bx/implatform/filter/CacheFilter.java +++ b/im-platform/src/main/java/com/bx/implatform/filter/CacheFilter.java @@ -7,7 +7,6 @@ import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import java.io.IOException; -import java.util.List; @Component @ServletComponentScan diff --git a/im-platform/src/main/java/com/bx/implatform/filter/CacheHttpServletRequestWrapper.java b/im-platform/src/main/java/com/bx/implatform/filter/CacheHttpServletRequestWrapper.java index 761c743..9101015 100644 --- a/im-platform/src/main/java/com/bx/implatform/filter/CacheHttpServletRequestWrapper.java +++ b/im-platform/src/main/java/com/bx/implatform/filter/CacheHttpServletRequestWrapper.java @@ -10,9 +10,9 @@ import java.io.*; public class CacheHttpServletRequestWrapper extends HttpServletRequestWrapper { private byte[] requestBody; - private HttpServletRequest request; + private final HttpServletRequest request; - public CacheHttpServletRequestWrapper(HttpServletRequest request) throws IOException { + public CacheHttpServletRequestWrapper(HttpServletRequest request) { super(request); this.request = request; } @@ -48,10 +48,6 @@ public class CacheHttpServletRequestWrapper extends HttpServletRequestWrapper { }; } - public byte[] getRequestBody() { - return requestBody; - } - @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(this.getInputStream())); diff --git a/im-platform/src/main/java/com/bx/implatform/interceptor/AuthInterceptor.java b/im-platform/src/main/java/com/bx/implatform/interceptor/AuthInterceptor.java index c11e7e3..92fbd7e 100644 --- a/im-platform/src/main/java/com/bx/implatform/interceptor/AuthInterceptor.java +++ b/im-platform/src/main/java/com/bx/implatform/interceptor/AuthInterceptor.java @@ -14,7 +14,6 @@ import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -; @Slf4j public class AuthInterceptor implements HandlerInterceptor { diff --git a/im-platform/src/main/java/com/bx/implatform/interceptor/XssInterceptor.java b/im-platform/src/main/java/com/bx/implatform/interceptor/XssInterceptor.java index fd384e1..96278fa 100644 --- a/im-platform/src/main/java/com/bx/implatform/interceptor/XssInterceptor.java +++ b/im-platform/src/main/java/com/bx/implatform/interceptor/XssInterceptor.java @@ -17,7 +17,7 @@ public class XssInterceptor implements HandlerInterceptor { @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { // 检查参数 Map paramMap = request.getParameterMap(); for(String[] values:paramMap.values()){ diff --git a/im-platform/src/main/java/com/bx/implatform/listener/GroupMessageListener.java b/im-platform/src/main/java/com/bx/implatform/listener/GroupMessageListener.java index 43202ae..a99522c 100644 --- a/im-platform/src/main/java/com/bx/implatform/listener/GroupMessageListener.java +++ b/im-platform/src/main/java/com/bx/implatform/listener/GroupMessageListener.java @@ -4,10 +4,9 @@ import com.bx.imclient.annotation.IMListener; import com.bx.imclient.listener.MessageListener; import com.bx.imcommon.enums.IMListenerType; import com.bx.imcommon.enums.IMSendCode; -import com.bx.imcommon.model.GroupMessageInfo; -import com.bx.imcommon.model.SendResult; +import com.bx.implatform.vo.GroupMessageVO; +import com.bx.imcommon.model.IMSendResult; import com.bx.implatform.contant.RedisKey; -import com.bx.implatform.enums.MessageType; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; @@ -15,14 +14,14 @@ import org.springframework.data.redis.core.RedisTemplate; @Slf4j @IMListener(type = IMListenerType.GROUP_MESSAGE) -public class GroupMessageListener implements MessageListener { +public class GroupMessageListener implements MessageListener { @Autowired private RedisTemplate redisTemplate; @Override - public void process(SendResult result){ - GroupMessageInfo messageInfo = (GroupMessageInfo) result.getData(); + public void process(IMSendResult result){ + GroupMessageVO messageInfo = result.getData(); // 保存该用户已拉取的最大消息id if(result.getCode().equals(IMSendCode.SUCCESS.code())) { String key = String.join(":",RedisKey.IM_GROUP_READED_POSITION,messageInfo.getGroupId().toString(),result.getReceiver().getId().toString()); diff --git a/im-platform/src/main/java/com/bx/implatform/listener/PrivateMessageListener.java b/im-platform/src/main/java/com/bx/implatform/listener/PrivateMessageListener.java index e8f9eed..68a6f2b 100644 --- a/im-platform/src/main/java/com/bx/implatform/listener/PrivateMessageListener.java +++ b/im-platform/src/main/java/com/bx/implatform/listener/PrivateMessageListener.java @@ -1,42 +1,32 @@ package com.bx.implatform.listener; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; -import com.bx.imclient.IMClient; import com.bx.imclient.annotation.IMListener; import com.bx.imclient.listener.MessageListener; -import com.bx.imcommon.enums.IMCmdType; import com.bx.imcommon.enums.IMListenerType; import com.bx.imcommon.enums.IMSendCode; -import com.bx.imcommon.model.IMPrivateMessage; -import com.bx.imcommon.model.PrivateMessageInfo; -import com.bx.imcommon.model.SendResult; +import com.bx.implatform.vo.PrivateMessageVO; +import com.bx.imcommon.model.IMSendResult; import com.bx.implatform.entity.PrivateMessage; import com.bx.implatform.enums.MessageStatus; -import com.bx.implatform.enums.MessageType; import com.bx.implatform.service.IPrivateMessageService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import java.util.Arrays; -import java.util.Date; - @Slf4j @IMListener(type = IMListenerType.PRIVATE_MESSAGE) -public class PrivateMessageListener implements MessageListener { +public class PrivateMessageListener implements MessageListener { @Autowired private IPrivateMessageService privateMessageService; - @Autowired - private IMClient imClient; @Override - public void process(SendResult result){ - PrivateMessageInfo messageInfo = (PrivateMessageInfo) result.getData(); - IMSendCode resultCode = IMSendCode.fromCode(result.getCode()); + public void process(IMSendResult result){ + PrivateMessageVO messageInfo = result.getData(); // 更新消息状态,这里只处理成功消息,失败的消息继续保持未读状态 - if(resultCode.equals(IMSendCode.SUCCESS)){ + if(result.getCode().equals(IMSendCode.SUCCESS.code())){ UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.lambda().eq(PrivateMessage::getId,messageInfo.getId()) .eq(PrivateMessage::getStatus, MessageStatus.UNREAD.code()) diff --git a/im-platform/src/main/java/com/bx/implatform/service/IGroupMessageService.java b/im-platform/src/main/java/com/bx/implatform/service/IGroupMessageService.java index 78a07ac..a003afe 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/IGroupMessageService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/IGroupMessageService.java @@ -1,9 +1,9 @@ package com.bx.implatform.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.bx.imcommon.model.GroupMessageInfo; -import com.bx.implatform.entity.GroupMessage; import com.bx.implatform.vo.GroupMessageVO; +import com.bx.implatform.entity.GroupMessage; +import com.bx.implatform.dto.GroupMessageDTO; import java.util.List; @@ -11,11 +11,11 @@ import java.util.List; public interface IGroupMessageService extends IService { - Long sendMessage(GroupMessageVO vo); + Long sendMessage(GroupMessageDTO vo); void recallMessage(Long id); void pullUnreadMessage(); - List findHistoryMessage(Long groupId, Long page, Long size); + List findHistoryMessage(Long groupId, Long page, Long size); } diff --git a/im-platform/src/main/java/com/bx/implatform/service/IPrivateMessageService.java b/im-platform/src/main/java/com/bx/implatform/service/IPrivateMessageService.java index be629d2..0b42d21 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/IPrivateMessageService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/IPrivateMessageService.java @@ -1,20 +1,20 @@ package com.bx.implatform.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.bx.imcommon.model.PrivateMessageInfo; -import com.bx.implatform.entity.PrivateMessage; import com.bx.implatform.vo.PrivateMessageVO; +import com.bx.implatform.entity.PrivateMessage; +import com.bx.implatform.dto.PrivateMessageDTO; import java.util.List; public interface IPrivateMessageService extends IService { - Long sendMessage(PrivateMessageVO vo); + Long sendMessage(PrivateMessageDTO vo); void recallMessage(Long id); - List findHistoryMessage(Long friendId, Long page,Long size); + List findHistoryMessage(Long friendId, Long page,Long size); void pullUnreadMessage(); diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java index e62de44..eefebfe 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java @@ -1,7 +1,9 @@ package com.bx.implatform.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bx.implatform.contant.RedisKey; import com.bx.implatform.entity.GroupMember; @@ -71,8 +73,8 @@ public class GroupMemberServiceImpl extends ServiceImpl findByUserId(Long userId) { - QueryWrapper memberWrapper = new QueryWrapper(); - memberWrapper.lambda().eq(GroupMember::getUserId, userId) + LambdaQueryWrapper memberWrapper = Wrappers.lambdaQuery(); + memberWrapper.eq(GroupMember::getUserId, userId) .eq(GroupMember::getQuit,false); return this.list(memberWrapper); } @@ -86,8 +88,8 @@ public class GroupMemberServiceImpl extends ServiceImpl findByGroupId(Long groupId) { - QueryWrapper memberWrapper = new QueryWrapper(); - memberWrapper.lambda().eq(GroupMember::getGroupId, groupId); + LambdaQueryWrapper memberWrapper = Wrappers.lambdaQuery(); + memberWrapper.eq(GroupMember::getGroupId, groupId); return this.list(memberWrapper); } @@ -101,11 +103,11 @@ public class GroupMemberServiceImpl extends ServiceImpl findUserIdsByGroupId(Long groupId) { - QueryWrapper memberWrapper = new QueryWrapper(); - memberWrapper.lambda().eq(GroupMember::getGroupId, groupId) + LambdaQueryWrapper memberWrapper = Wrappers.lambdaQuery(); + memberWrapper.eq(GroupMember::getGroupId, groupId) .eq(GroupMember::getQuit,false); List members = this.list(memberWrapper); - return members.stream().map(m->m.getUserId()).collect(Collectors.toList()); + return members.stream().map(GroupMember::getUserId).collect(Collectors.toList()); } @@ -118,8 +120,8 @@ public class GroupMemberServiceImpl extends ServiceImpl wrapper = new UpdateWrapper(); - wrapper.lambda().eq(GroupMember::getGroupId,groupId) + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.eq(GroupMember::getGroupId,groupId) .set(GroupMember::getQuit,true); this.update(wrapper); } @@ -134,8 +136,8 @@ public class GroupMemberServiceImpl extends ServiceImpl wrapper = new UpdateWrapper<>(); - wrapper.lambda().eq(GroupMember::getGroupId,groupId) + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.eq(GroupMember::getGroupId,groupId) .eq(GroupMember::getUserId,userId) .set(GroupMember::getQuit,true); this.update(wrapper); diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java index 71886b2..c2f992a 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java @@ -1,10 +1,12 @@ package com.bx.implatform.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bx.imclient.IMClient; -import com.bx.imcommon.contant.Constant; -import com.bx.imcommon.model.GroupMessageInfo; +import com.bx.imcommon.contant.IMConstant; +import com.bx.implatform.vo.GroupMessageVO; import com.bx.imcommon.model.IMGroupMessage; import com.bx.imcommon.model.IMUserInfo; import com.bx.implatform.contant.RedisKey; @@ -22,7 +24,7 @@ import com.bx.implatform.service.IGroupService; import com.bx.implatform.session.SessionContext; import com.bx.implatform.session.UserSession; import com.bx.implatform.util.BeanUtils; -import com.bx.implatform.vo.GroupMessageVO; +import com.bx.implatform.dto.GroupMessageDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; @@ -30,37 +32,31 @@ import org.springframework.stereotype.Service; import java.util.Collections; import java.util.Date; -import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; @Slf4j @Service public class GroupMessageServiceImpl extends ServiceImpl implements IGroupMessageService { - - @Autowired private IGroupService groupService; - @Autowired private IGroupMemberService groupMemberService; - @Autowired private RedisTemplate redisTemplate; - @Autowired private IMClient imClient; /** * 发送群聊消息(与mysql所有交换都要进行缓存) * - * @param vo + * @param dto 群聊消息 * @return 群聊id */ @Override - public Long sendMessage(GroupMessageVO vo) { + public Long sendMessage(GroupMessageDTO dto) { UserSession session = SessionContext.getSession(); - Group group = groupService.getById(vo.getGroupId()); + Group group = groupService.getById(dto.getGroupId()); if(group == null){ throw new GlobalException(ResultCode.PROGRAM_ERROR,"群聊不存在"); } @@ -73,20 +69,20 @@ public class GroupMessageServiceImpl extends ServiceImpl!session.getUserId().equals(id)).collect(Collectors.toList()); // 群发 - GroupMessageInfo msgInfo = BeanUtils.copyProperties(msg, GroupMessageInfo.class); - IMGroupMessage sendMessage = new IMGroupMessage(); + GroupMessageVO msgInfo = BeanUtils.copyProperties(msg, GroupMessageVO.class); + IMGroupMessage sendMessage = new IMGroupMessage<>(); sendMessage.setSender(new IMUserInfo(session.getUserId(),session.getTerminal())); sendMessage.setRecvIds(userIds); sendMessage.setData(msgInfo); imClient.sendGroupMessage(sendMessage); - log.info("发送群聊消息,发送id:{},群聊id:{},内容:{}",session.getUserId(),vo.getGroupId(),vo.getContent()); + log.info("发送群聊消息,发送id:{},群聊id:{},内容:{}",session.getUserId(),dto.getGroupId(),dto.getContent()); return msg.getId(); } @@ -108,7 +104,7 @@ public class GroupMessageServiceImpl extends ServiceImpl Constant.ALLOW_RECALL_SECOND * 1000){ + if(System.currentTimeMillis() - msg.getSendTime().getTime() > IMConstant.ALLOW_RECALL_SECOND * 1000){ throw new GlobalException(ResultCode.PROGRAM_ERROR,"消息已发送超过5分钟,无法撤回"); } // 判断是否在群里 @@ -123,17 +119,25 @@ public class GroupMessageServiceImpl extends ServiceImpl userIds = groupMemberService.findUserIdsByGroupId(msg.getGroupId()); // 不用发给自己 userIds = userIds.stream().filter(uid->!session.getUserId().equals(uid)).collect(Collectors.toList()); - GroupMessageInfo msgInfo = BeanUtils.copyProperties(msg, GroupMessageInfo.class); - msgInfo.setType(MessageType.TIP.code()); + GroupMessageVO msgInfo = BeanUtils.copyProperties(msg, GroupMessageVO.class); + msgInfo.setType(MessageType.RECALL.code()); String content = String.format("'%s'撤回了一条消息",member.getAliasName()); msgInfo.setContent(content); msgInfo.setSendTime(new Date()); - IMGroupMessage sendMessage = new IMGroupMessage(); + IMGroupMessage sendMessage = new IMGroupMessage<>(); sendMessage.setSender(new IMUserInfo(session.getUserId(),session.getTerminal())); sendMessage.setRecvIds(userIds); sendMessage.setData(msgInfo); sendMessage.setSendResult(false); + sendMessage.setSendToSelf(false); + imClient.sendGroupMessage(sendMessage); + + // 推给自己其他终端 + msgInfo.setContent("你撤回了一条消息"); + sendMessage.setSendToSelf(true); + sendMessage.setRecvIds(Collections.emptyList()); + sendMessage.setRecvTerminals(Collections.emptyList()); imClient.sendGroupMessage(sendMessage); log.info("撤回群聊消息,发送id:{},群聊id:{},内容:{}",session.getUserId(),msg.getGroupId(),msg.getContent()); } @@ -142,7 +146,6 @@ public class GroupMessageServiceImpl extends ServiceImpl wrapper = new QueryWrapper(); - wrapper.lambda().eq(GroupMessage::getGroupId,member.getGroupId()) + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(GroupMessage::getGroupId,member.getGroupId()) .gt(GroupMessage::getSendTime,member.getCreatedTime()) .ne(GroupMessage::getSendId, session.getUserId()) .ne(GroupMessage::getStatus, MessageStatus.RECALL.code()); if(maxReadedId!=null){ - wrapper.lambda().gt(GroupMessage::getId,maxReadedId); + wrapper.gt(GroupMessage::getId,maxReadedId); } wrapper.last("limit 100"); List messages = this.list(wrapper); @@ -167,8 +170,8 @@ public class GroupMessageServiceImpl extends ServiceImpl sendMessage = new IMGroupMessage<>(); sendMessage.setSender(new IMUserInfo(session.getUserId(),session.getTerminal())); // 只推给自己当前终端 sendMessage.setRecvIds(Collections.singletonList(session.getUserId())); @@ -191,11 +194,11 @@ public class GroupMessageServiceImpl extends ServiceImpl findHistoryMessage(Long groupId, Long page, Long size) { + public List findHistoryMessage(Long groupId, Long page, Long size) { page = page > 0 ? page:1; size = size > 0 ? size:10; Long userId = SessionContext.getSession().getUserId(); - Long stIdx = (page-1)* size; + long stIdx = (page-1)* size; // 群聊成员信息 GroupMember member = groupMemberService.findByGroupAndUserId(groupId,userId); if(member == null || member.getQuit()){ @@ -210,10 +213,7 @@ public class GroupMessageServiceImpl extends ServiceImpl messages = this.list(wrapper); - List messageInfos = messages.stream().map(m->{ - GroupMessageInfo info = BeanUtils.copyProperties(m, GroupMessageInfo.class); - return info; - }).collect(Collectors.toList()); + List messageInfos = messages.stream().map(m->BeanUtils.copyProperties(m, GroupMessageVO.class)).collect(Collectors.toList()); log.info("拉取群聊记录,用户id:{},群聊id:{},数量:{}",userId,groupId,messageInfos.size()); return messageInfos; } diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java index 65e26ab..dc53781 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java @@ -1,6 +1,7 @@ package com.bx.implatform.service.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bx.implatform.contant.Constant; import com.bx.implatform.contant.RedisKey; @@ -30,8 +31,8 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Collections; import java.util.Date; +import java.util.LinkedList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -55,8 +56,8 @@ public class GroupServiceImpl extends ServiceImpl implements /** * 创建新群聊 * - * @Param groupName 群聊名称 - * @return + * @param groupName 群聊名称 + * @return 群聊信息 **/ @Transactional @Override @@ -89,8 +90,8 @@ public class GroupServiceImpl extends ServiceImpl implements /** * 修改群聊信息 * - * @Param GroupVO 群聊信息 - * @return + * @param vo 群聊信息 + * @return 群聊信息 **/ @CacheEvict(value = "#vo.getId()") @Transactional @@ -120,8 +121,7 @@ public class GroupServiceImpl extends ServiceImpl implements /** * 删除群聊 * - * @Param groupId 群聊id - * @return + * @param groupId 群聊id **/ @Transactional @CacheEvict(value = "#groupId") @@ -145,7 +145,6 @@ public class GroupServiceImpl extends ServiceImpl implements * 退出群聊 * * @param groupId 群聊id - * @return */ @Override public void quitGroup(Long groupId) { @@ -165,7 +164,6 @@ public class GroupServiceImpl extends ServiceImpl implements * * @param groupId 群聊id * @param userId 用户id - * @return */ @Override public void kickGroup(Long groupId, Long userId) { @@ -200,7 +198,7 @@ public class GroupServiceImpl extends ServiceImpl implements * 根据id查找群聊,并进行缓存 * * @param groupId 群聊id - * @return + * @return 群聊实体 */ @Cacheable(value = "#groupId") @Override @@ -220,7 +218,7 @@ public class GroupServiceImpl extends ServiceImpl implements /** * 查询当前用户的所有群聊 * - * @return + * @return 群聊信息列表 **/ @Override public List findGroups() { @@ -228,29 +226,27 @@ public class GroupServiceImpl extends ServiceImpl implements // 查询当前用户的群id列表 List groupMembers = groupMemberService.findByUserId(session.getUserId()); if(groupMembers.isEmpty()){ - return Collections.EMPTY_LIST; + return new LinkedList<>(); } // 拉取群列表 - List ids = groupMembers.stream().map((gm -> gm.getGroupId())).collect(Collectors.toList()); - QueryWrapper groupWrapper = new QueryWrapper(); - groupWrapper.lambda().in(Group::getId, ids); + List ids = groupMembers.stream().map((GroupMember::getGroupId)).collect(Collectors.toList()); + LambdaQueryWrapper groupWrapper = Wrappers.lambdaQuery(); + groupWrapper.in(Group::getId, ids); List groups = this.list(groupWrapper); // 转vo - List vos = groups.stream().map(g -> { + return groups.stream().map(g -> { GroupVO vo = BeanUtils.copyProperties(g, GroupVO.class); GroupMember member = groupMembers.stream().filter(m -> g.getId().equals(m.getGroupId())).findFirst().get(); vo.setAliasName(member.getAliasName()); vo.setRemark(member.getRemark()); return vo; }).collect(Collectors.toList()); - return vos; } /** * 邀请好友进群 * * @Param GroupInviteVO 群id、好友id列表 - * @return **/ @Override public void invite(GroupInviteVO vo) { @@ -265,7 +261,6 @@ public class GroupServiceImpl extends ServiceImpl implements if(vo.getFriendIds().size() + size > Constant.MAX_GROUP_MEMBER){ throw new GlobalException(ResultCode.PROGRAM_ERROR, "群聊人数不能大于"+Constant.MAX_GROUP_MEMBER+"人"); } - // 找出好友信息 List friends = friendsService.findFriendByUserId(session.getUserId()); List friendsList = vo.getFriendIds().stream().map(id -> @@ -275,18 +270,18 @@ public class GroupServiceImpl extends ServiceImpl implements } // 批量保存成员数据 List groupMembers = friendsList.stream() - .map(f -> { - Optional optional = members.stream().filter(m->m.getUserId().equals(f.getFriendId())).findFirst(); - GroupMember groupMember = optional.isPresent()? optional.get():new GroupMember(); - groupMember.setGroupId(vo.getGroupId()); - groupMember.setUserId(f.getFriendId()); - groupMember.setAliasName(f.getFriendNickName()); - groupMember.setRemark(group.getName()); - groupMember.setHeadImage(f.getFriendHeadImage()); - groupMember.setCreatedTime(new Date()); - groupMember.setQuit(false); - return groupMember; - }).collect(Collectors.toList()); + .map(f -> { + Optional optional = members.stream().filter(m->m.getUserId().equals(f.getFriendId())).findFirst(); + GroupMember groupMember = optional.orElseGet(GroupMember::new); + groupMember.setGroupId(vo.getGroupId()); + groupMember.setUserId(f.getFriendId()); + groupMember.setAliasName(f.getFriendNickName()); + groupMember.setRemark(group.getName()); + groupMember.setHeadImage(f.getFriendHeadImage()); + groupMember.setCreatedTime(new Date()); + groupMember.setQuit(false); + return groupMember; + }).collect(Collectors.toList()); if(!groupMembers.isEmpty()) { groupMemberService.saveOrUpdateBatch(group.getId(),groupMembers); } @@ -302,11 +297,7 @@ public class GroupServiceImpl extends ServiceImpl implements @Override public List findGroupMembers(Long groupId) { List members = groupMemberService.findByGroupId(groupId); - List vos = members.stream().map(m->{ - GroupMemberVO vo = BeanUtils.copyProperties(m,GroupMemberVO.class); - return vo; - }).collect(Collectors.toList()); - return vos; + return members.stream().map(m->BeanUtils.copyProperties(m,GroupMemberVO.class)).collect(Collectors.toList()); } } diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java index 1109368..9fbbf6e 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java @@ -1,12 +1,14 @@ package com.bx.implatform.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bx.imclient.IMClient; -import com.bx.imcommon.contant.Constant; +import com.bx.imcommon.contant.IMConstant; import com.bx.imcommon.model.IMPrivateMessage; import com.bx.imcommon.model.IMUserInfo; -import com.bx.imcommon.model.PrivateMessageInfo; +import com.bx.implatform.vo.PrivateMessageVO; import com.bx.implatform.entity.PrivateMessage; import com.bx.implatform.enums.MessageStatus; import com.bx.implatform.enums.MessageType; @@ -18,7 +20,7 @@ import com.bx.implatform.service.IPrivateMessageService; import com.bx.implatform.session.SessionContext; import com.bx.implatform.session.UserSession; import com.bx.implatform.util.BeanUtils; -import com.bx.implatform.vo.PrivateMessageVO; +import com.bx.implatform.dto.PrivateMessageDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -40,31 +42,31 @@ public class PrivateMessageServiceImpl extends ServiceImpl sendMessage = new IMPrivateMessage<>(); + PrivateMessageVO msgInfo = BeanUtils.copyProperties(msg, PrivateMessageVO.class); + IMPrivateMessage sendMessage = new IMPrivateMessage<>(); sendMessage.setSender(new IMUserInfo(session.getUserId(),session.getTerminal())); sendMessage.setRecvId(msgInfo.getRecvId()); sendMessage.setSendToSelf(true); - sendMessage.setDatas(Collections.singletonList(msgInfo)); + sendMessage.setData(msgInfo); imClient.sendPrivateMessage(sendMessage); - log.info("发送私聊消息,发送id:{},接收id:{},内容:{}", session.getUserId(), vo.getRecvId(), vo.getContent()); + log.info("发送私聊消息,发送id:{},接收id:{},内容:{}", session.getUserId(), dto.getRecvId(), dto.getContent()); return msg.getId(); } @@ -83,23 +85,30 @@ public class PrivateMessageServiceImpl extends ServiceImpl Constant.ALLOW_RECALL_SECOND * 1000) { + if (System.currentTimeMillis() - msg.getSendTime().getTime() > IMConstant.ALLOW_RECALL_SECOND * 1000) { throw new GlobalException(ResultCode.PROGRAM_ERROR, "消息已发送超过5分钟,无法撤回"); } // 修改消息状态 msg.setStatus(MessageStatus.RECALL.code()); this.updateById(msg); // 推送消息 - PrivateMessageInfo msgInfo = BeanUtils.copyProperties(msg, PrivateMessageInfo.class); - msgInfo.setType(MessageType.TIP.code()); + PrivateMessageVO msgInfo = BeanUtils.copyProperties(msg, PrivateMessageVO.class); + msgInfo.setType(MessageType.RECALL.code()); msgInfo.setSendTime(new Date()); msgInfo.setContent("对方撤回了一条消息"); - IMPrivateMessage sendMessage = new IMPrivateMessage<>(); + IMPrivateMessage sendMessage = new IMPrivateMessage<>(); sendMessage.setSender(new IMUserInfo(session.getUserId(),session.getTerminal())); sendMessage.setRecvId(msgInfo.getRecvId()); + sendMessage.setSendToSelf(false); + sendMessage.setData(msgInfo); + sendMessage.setSendResult(false); + imClient.sendPrivateMessage(sendMessage); + + // 推给自己其他终端 + msgInfo.setContent("你撤回了一条消息"); sendMessage.setSendToSelf(true); - sendMessage.setDatas(Collections.singletonList(msgInfo)); + sendMessage.setRecvTerminals(Collections.emptyList()); imClient.sendPrivateMessage(sendMessage); log.info("撤回私聊消息,发送id:{},接收id:{},内容:{}", msg.getSendId(), msg.getRecvId(), msg.getContent()); } @@ -114,7 +123,7 @@ public class PrivateMessageServiceImpl extends ServiceImpl findHistoryMessage(Long friendId, Long page, Long size) { + public List findHistoryMessage(Long friendId, Long page, Long size) { page = page > 0 ? page : 1; size = size > 0 ? size : 10; Long userId = SessionContext.getSession().getUserId(); @@ -130,7 +139,7 @@ public class PrivateMessageServiceImpl extends ServiceImpl messages = this.list(wrapper); - List messageInfos = messages.stream().map(m -> BeanUtils.copyProperties(m, PrivateMessageInfo.class)).collect(Collectors.toList()); + List messageInfos = messages.stream().map(m -> BeanUtils.copyProperties(m, PrivateMessageVO.class)).collect(Collectors.toList()); log.info("拉取聊天记录,用户id:{},好友id:{},数量:{}", userId, friendId, messageInfos.size()); return messageInfos; } @@ -147,22 +156,23 @@ public class PrivateMessageServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); - queryWrapper.lambda().eq(PrivateMessage::getRecvId, session.getUserId()) + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(PrivateMessage::getRecvId, session.getUserId()) .eq(PrivateMessage::getStatus, MessageStatus.UNREAD); List messages = this.list(queryWrapper); // 上传至redis,等待推送 - if (!messages.isEmpty()) { - List messageInfos = messages.stream().map(m -> BeanUtils.copyProperties(m, PrivateMessageInfo.class)).collect(Collectors.toList()); + for(PrivateMessage message:messages){ + PrivateMessageVO msgInfo = BeanUtils.copyProperties(message, PrivateMessageVO.class); // 推送消息 - IMPrivateMessage sendMessage = new IMPrivateMessage<>(); + IMPrivateMessage sendMessage = new IMPrivateMessage<>(); sendMessage.setSender(new IMUserInfo(session.getUserId(),session.getTerminal())); sendMessage.setRecvId(session.getUserId()); sendMessage.setRecvTerminals(Collections.singletonList(session.getTerminal())); sendMessage.setSendToSelf(false); - sendMessage.setDatas(messageInfos); + sendMessage.setData(msgInfo); imClient.sendPrivateMessage(sendMessage); - log.info("拉取未读私聊消息,用户id:{},数量:{}", session.getUserId(), messageInfos.size()); } + log.info("拉取未读私聊消息,用户id:{},数量:{}", session.getUserId(), messages.size()); + } } diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java index 33cfd59..33205cc 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java @@ -1,7 +1,9 @@ package com.bx.implatform.service.impl; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bx.imclient.IMClient; import com.bx.implatform.config.JwtProperties; @@ -114,7 +116,6 @@ public class UserServiceImpl extends ServiceImpl implements IU * 用户注册 * * @param dto 注册dto - * @return */ @Override public void register(RegisterDTO dto) { @@ -136,8 +137,8 @@ public class UserServiceImpl extends ServiceImpl implements IU */ @Override public User findUserByName(String username) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.lambda().eq(User::getUserName,username); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(User::getUserName,username); return this.getOne(queryWrapper); } @@ -145,7 +146,6 @@ public class UserServiceImpl extends ServiceImpl implements IU * 更新用户信息,好友昵称和群聊昵称等冗余信息也会更新 * * @param vo 用户信息vo - * @return */ @Transactional @Override @@ -184,7 +184,7 @@ public class UserServiceImpl extends ServiceImpl implements IU user.setHeadImage(vo.getHeadImage()); user.setHeadImageThumb(vo.getHeadImageThumb()); this.updateById(user); - log.info("用户信息更新,用户:{}}",user.toString()); + log.info("用户信息更新,用户:{}}", user); } @@ -196,17 +196,14 @@ public class UserServiceImpl extends ServiceImpl implements IU */ @Override public List findUserByNickName(String nickname) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.lambda() - .like(User::getNickName,nickname) - .last("limit 20"); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.like(User::getNickName,nickname).last("limit 20"); List users = this.list(queryWrapper); - List vos = users.stream().map(u-> { + return users.stream().map(u-> { UserVO vo = BeanUtils.copyProperties(u,UserVO.class); vo.setOnline(imClient.isOnline(u.getId())); return vo; }).collect(Collectors.toList()); - return vos; } diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcServiceImpl.java index 910c097..64177c2 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcServiceImpl.java @@ -3,7 +3,7 @@ package com.bx.implatform.service.impl; import com.bx.imclient.IMClient; import com.bx.imcommon.model.IMPrivateMessage; import com.bx.imcommon.model.IMUserInfo; -import com.bx.imcommon.model.PrivateMessageInfo; +import com.bx.implatform.vo.PrivateMessageVO; import com.bx.implatform.config.ICEServer; import com.bx.implatform.config.ICEServerConfig; import com.bx.implatform.contant.RedisKey; @@ -13,7 +13,6 @@ import com.bx.implatform.service.IWebrtcService; import com.bx.implatform.session.SessionContext; import com.bx.implatform.session.UserSession; import com.bx.implatform.session.WebrtcSession; -import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; @@ -48,18 +47,18 @@ public class WebrtcServiceImpl implements IWebrtcService { String key = getSessionKey(session.getUserId(), uid); redisTemplate.opsForValue().set(key, webrtcSession, 12, TimeUnit.HOURS); // 向对方所有终端发起呼叫 - PrivateMessageInfo messageInfo = new PrivateMessageInfo(); + PrivateMessageVO messageInfo = new PrivateMessageVO(); messageInfo.setType(MessageType.RTC_CALL.code()); messageInfo.setRecvId(uid); messageInfo.setSendId(session.getUserId()); messageInfo.setContent(offer); - IMPrivateMessage sendMessage = new IMPrivateMessage<>(); + IMPrivateMessage sendMessage = new IMPrivateMessage<>(); sendMessage.setSender(new IMUserInfo(session.getUserId(),session.getTerminal())); sendMessage.setRecvId(uid); sendMessage.setSendToSelf(false); sendMessage.setSendResult(false); - sendMessage.setDatas(Collections.singletonList(messageInfo)); + sendMessage.setData(messageInfo); imClient.sendPrivateMessage(sendMessage); } @@ -75,20 +74,20 @@ public class WebrtcServiceImpl implements IWebrtcService { String key = getSessionKey(session.getUserId(), uid); redisTemplate.opsForValue().set(key, webrtcSession, 12, TimeUnit.HOURS); // 向发起人推送接受通话信令 - PrivateMessageInfo messageInfo = new PrivateMessageInfo(); + PrivateMessageVO messageInfo = new PrivateMessageVO(); messageInfo.setType(MessageType.RTC_ACCEPT.code()); messageInfo.setRecvId(uid); messageInfo.setSendId(session.getUserId()); messageInfo.setContent(answer); - IMPrivateMessage sendMessage = new IMPrivateMessage<>(); + IMPrivateMessage sendMessage = new IMPrivateMessage<>(); sendMessage.setSender(new IMUserInfo(session.getUserId(),session.getTerminal())); sendMessage.setRecvId(uid); // 告知其他终端已经接受会话,中止呼叫 sendMessage.setSendToSelf(true); sendMessage.setSendResult(false); sendMessage.setRecvTerminals((Collections.singletonList(webrtcSession.getCallerTerminal()))); - sendMessage.setDatas(Collections.singletonList(messageInfo)); + sendMessage.setData(messageInfo); imClient.sendPrivateMessage(sendMessage); } @@ -100,19 +99,19 @@ public class WebrtcServiceImpl implements IWebrtcService { // 删除会话信息 removeWebrtcSession(uid, session.getUserId()); // 向发起人推送拒绝通话信令 - PrivateMessageInfo messageInfo = new PrivateMessageInfo(); + PrivateMessageVO messageInfo = new PrivateMessageVO(); messageInfo.setType(MessageType.RTC_REJECT.code()); messageInfo.setRecvId(uid); messageInfo.setSendId(session.getUserId()); - IMPrivateMessage sendMessage = new IMPrivateMessage<>(); + IMPrivateMessage sendMessage = new IMPrivateMessage<>(); sendMessage.setSender(new IMUserInfo(session.getUserId(),session.getTerminal())); sendMessage.setRecvId(uid); // 告知其他终端已经拒绝会话,中止呼叫 sendMessage.setSendToSelf(true); sendMessage.setSendResult(false); sendMessage.setRecvTerminals(Collections.singletonList(webrtcSession.getCallerTerminal())); - sendMessage.setDatas(Collections.singletonList(messageInfo)); + sendMessage.setData(messageInfo); imClient.sendPrivateMessage(sendMessage); } @@ -122,17 +121,17 @@ public class WebrtcServiceImpl implements IWebrtcService { // 删除会话信息 removeWebrtcSession(session.getUserId(), uid); // 向对方所有终端推送取消通话信令 - PrivateMessageInfo messageInfo = new PrivateMessageInfo(); + PrivateMessageVO messageInfo = new PrivateMessageVO(); messageInfo.setType(MessageType.RTC_ACCEPT.code()); messageInfo.setRecvId(uid); messageInfo.setSendId(session.getUserId()); - IMPrivateMessage sendMessage = new IMPrivateMessage<>(); + IMPrivateMessage sendMessage = new IMPrivateMessage<>(); sendMessage.setSender(new IMUserInfo(session.getUserId(),session.getTerminal())); sendMessage.setRecvId(uid); sendMessage.setSendToSelf(false); sendMessage.setSendResult(false); - sendMessage.setDatas(Collections.singletonList(messageInfo)); + sendMessage.setData(messageInfo); // 通知对方取消会话 imClient.sendPrivateMessage(sendMessage); } @@ -145,19 +144,19 @@ public class WebrtcServiceImpl implements IWebrtcService { // 删除会话信息 removeWebrtcSession(uid, session.getUserId()); // 向发起方推送通话失败信令 - PrivateMessageInfo messageInfo = new PrivateMessageInfo(); + PrivateMessageVO messageInfo = new PrivateMessageVO(); messageInfo.setType(MessageType.RTC_FAILED.code()); messageInfo.setRecvId(uid); messageInfo.setSendId(session.getUserId()); - IMPrivateMessage sendMessage = new IMPrivateMessage<>(); + IMPrivateMessage sendMessage = new IMPrivateMessage<>(); sendMessage.setSender(new IMUserInfo(session.getUserId(),session.getTerminal())); sendMessage.setRecvId(uid); // 告知其他终端已经会话失败,中止呼叫 sendMessage.setSendToSelf(true); sendMessage.setSendResult(false); sendMessage.setRecvTerminals(Collections.singletonList(webrtcSession.getCallerTerminal())); - sendMessage.setDatas(Collections.singletonList(messageInfo)); + sendMessage.setData(messageInfo); // 通知对方取消会话 imClient.sendPrivateMessage(sendMessage); @@ -171,19 +170,19 @@ public class WebrtcServiceImpl implements IWebrtcService { // 删除会话信息 removeWebrtcSession(uid, session.getUserId()); // 向对方推送挂断通话信令 - PrivateMessageInfo messageInfo = new PrivateMessageInfo(); + PrivateMessageVO messageInfo = new PrivateMessageVO(); messageInfo.setType(MessageType.RTC_HANDUP.code()); messageInfo.setRecvId(uid); messageInfo.setSendId(session.getUserId()); - IMPrivateMessage sendMessage = new IMPrivateMessage<>(); + IMPrivateMessage sendMessage = new IMPrivateMessage<>(); sendMessage.setSender(new IMUserInfo(session.getUserId(),session.getTerminal())); sendMessage.setRecvId(uid); sendMessage.setSendToSelf(false); sendMessage.setSendResult(false); Integer terminal = getTerminalType(uid, webrtcSession); sendMessage.setRecvTerminals(Collections.singletonList(terminal)); - sendMessage.setDatas(Collections.singletonList(messageInfo)); + sendMessage.setData(messageInfo); // 通知对方取消会话 imClient.sendPrivateMessage(sendMessage); } @@ -194,20 +193,20 @@ public class WebrtcServiceImpl implements IWebrtcService { // 查询webrtc会话 WebrtcSession webrtcSession = getWebrtcSession(session.getUserId(), uid); // 向发起方推送同步candidate信令 - PrivateMessageInfo messageInfo = new PrivateMessageInfo(); + PrivateMessageVO messageInfo = new PrivateMessageVO(); messageInfo.setType(MessageType.RTC_CANDIDATE.code()); messageInfo.setRecvId(uid); messageInfo.setSendId(session.getUserId()); messageInfo.setContent(candidate); - IMPrivateMessage sendMessage = new IMPrivateMessage<>(); + IMPrivateMessage sendMessage = new IMPrivateMessage<>(); sendMessage.setSender(new IMUserInfo(session.getUserId(),session.getTerminal())); sendMessage.setRecvId(uid); sendMessage.setSendToSelf(false); sendMessage.setSendResult(false); Integer terminal = getTerminalType(uid, webrtcSession); sendMessage.setRecvTerminals(Collections.singletonList(terminal)); - sendMessage.setDatas(Collections.singletonList(messageInfo)); + sendMessage.setData(messageInfo); imClient.sendPrivateMessage(sendMessage); } diff --git a/im-platform/src/main/java/com/bx/implatform/vo/GroupMessageVO.java b/im-platform/src/main/java/com/bx/implatform/vo/GroupMessageVO.java index ebfe425..72480e8 100644 --- a/im-platform/src/main/java/com/bx/implatform/vo/GroupMessageVO.java +++ b/im-platform/src/main/java/com/bx/implatform/vo/GroupMessageVO.java @@ -1,28 +1,42 @@ package com.bx.implatform.vo; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; +import com.bx.imcommon.serializer.DateToLongSerializer; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.Data; -import org.hibernate.validator.constraints.Length; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; +import java.util.Date; @Data -@ApiModel("群聊消息VO") public class GroupMessageVO { - @NotNull(message="群聊id不可为空") - @ApiModelProperty(value = "群聊id") + /* + * 消息id + */ + private Long id; + + /* + * 群聊id + */ private Long groupId; + /* + * 发送者id + */ + private Long sendId; - @Length(max=1024,message = "内容长度不得大于1024") - @NotEmpty(message="发送内容不可为空") - @ApiModelProperty(value = "发送内容") + /* + * 消息内容 + */ private String content; - @NotNull(message="消息类型不可为空") - @ApiModelProperty(value = "消息类型") + /* + * 消息内容类型 具体枚举值由应用层定义 + */ private Integer type; + + /** + * 发送时间 + */ + @JsonSerialize(using = DateToLongSerializer.class) + private Date sendTime; } diff --git a/im-platform/src/main/java/com/bx/implatform/vo/PrivateMessageVO.java b/im-platform/src/main/java/com/bx/implatform/vo/PrivateMessageVO.java index 7efdcc4..1b7c41a 100644 --- a/im-platform/src/main/java/com/bx/implatform/vo/PrivateMessageVO.java +++ b/im-platform/src/main/java/com/bx/implatform/vo/PrivateMessageVO.java @@ -1,31 +1,42 @@ package com.bx.implatform.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; +import com.bx.imcommon.serializer.DateToLongSerializer; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.Data; -import org.hibernate.validator.constraints.Length; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; +import java.util.Date; @Data -@ApiModel("私聊消息VO") public class PrivateMessageVO { + /* + * 消息id + */ + private long id; - @NotNull(message="接收用户id不可为空") - @ApiModelProperty(value = "接收用户id") - private Long recvId; + /* + * 发送者id + */ + private Long sendId; + /* + * 接收者id + */ + private Long recvId; - @Length(max=1024,message = "内容长度不得大于1024") - @NotEmpty(message="发送内容不可为空") - @ApiModelProperty(value = "发送内容") + /* + * 发送内容 + */ private String content; - @NotNull(message="消息类型不可为空") - @ApiModelProperty(value = "消息类型") + /* + * 消息内容类型 IMCmdType + */ private Integer type; + /** + * 发送时间 + */ + @JsonSerialize(using = DateToLongSerializer.class) + private Date sendTime; } diff --git a/im-server/src/main/java/com/bx/imserver/config/RedisConfig.java b/im-server/src/main/java/com/bx/imserver/config/RedisConfig.java index d2f946f..5ae1fbd 100644 --- a/im-server/src/main/java/com/bx/imserver/config/RedisConfig.java +++ b/im-server/src/main/java/com/bx/imserver/config/RedisConfig.java @@ -1,5 +1,6 @@ package com.bx.imserver.config; +import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.PropertyAccessor; @@ -26,9 +27,9 @@ public class RedisConfig { public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(redisConnectionFactory); - // 设置值(value)的序列化采用jackson2JsonRedisSerializer - redisTemplate.setValueSerializer(jackson2JsonRedisSerializer()); - redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer()); + // 设置值(value)的序列化采用FastJsonRedisSerializer + redisTemplate.setValueSerializer(fastJsonRedisSerializer()); + redisTemplate.setHashValueSerializer(fastJsonRedisSerializer()); // 设置键(key)的序列化采用StringRedisSerializer。 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); @@ -36,17 +37,11 @@ public class RedisConfig { return redisTemplate; } - @Bean - public Jackson2JsonRedisSerializer jackson2JsonRedisSerializer(){ - Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); - ObjectMapper om = new ObjectMapper(); - om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - // 解决jackson2无法反序列化LocalDateTime的问题 - om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - om.registerModule(new JavaTimeModule()); - om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); - jackson2JsonRedisSerializer.setObjectMapper(om); - return jackson2JsonRedisSerializer; + + public FastJsonRedisSerializer fastJsonRedisSerializer(){ + FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); + return fastJsonRedisSerializer; } + } diff --git a/im-server/src/main/java/com/bx/imserver/netty/IMChannelHandler.java b/im-server/src/main/java/com/bx/imserver/netty/IMChannelHandler.java index 43c7174..babd2a0 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/IMChannelHandler.java +++ b/im-server/src/main/java/com/bx/imserver/netty/IMChannelHandler.java @@ -1,6 +1,6 @@ package com.bx.imserver.netty; -import com.bx.imcommon.contant.RedisKey; +import com.bx.imcommon.contant.IMRedisKey; import com.bx.imcommon.enums.IMCmdType; import com.bx.imcommon.model.IMSendInfo; import com.bx.imserver.constant.ChannelAttrKey; @@ -76,7 +76,7 @@ public class IMChannelHandler extends SimpleChannelInboundHandler { UserChannelCtxMap.removeChannelCtx(userId,terminal); // 用户下线 RedisTemplate redisTemplate = SpringContextHolder.getBean("redisTemplate"); - String key = String.join(":",RedisKey.IM_USER_SERVER_ID,userId.toString(), terminal.toString()); + String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID,userId.toString(), terminal.toString()); redisTemplate.delete(key); log.info("断开连接,userId:{},终端类型:{}",userId,terminal); } diff --git a/im-server/src/main/java/com/bx/imserver/netty/IMServerGroup.java b/im-server/src/main/java/com/bx/imserver/netty/IMServerGroup.java index 60c640e..619d770 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/IMServerGroup.java +++ b/im-server/src/main/java/com/bx/imserver/netty/IMServerGroup.java @@ -1,6 +1,6 @@ package com.bx.imserver.netty; -import com.bx.imcommon.contant.RedisKey; +import com.bx.imcommon.contant.IMRedisKey; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; @@ -39,7 +39,7 @@ public class IMServerGroup implements CommandLineRunner { @Override public void run(String... args) throws Exception { // 初始化SERVER_ID - String key = RedisKey.IM_MAX_SERVER_ID; + String key = IMRedisKey.IM_MAX_SERVER_ID; serverId = redisTemplate.opsForValue().increment(key,1); // 启动服务 for(IMServer imServer:imServers){ diff --git a/im-server/src/main/java/com/bx/imserver/netty/processor/GroupMessageProcessor.java b/im-server/src/main/java/com/bx/imserver/netty/processor/GroupMessageProcessor.java index fc63f87..0446f05 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/processor/GroupMessageProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/netty/processor/GroupMessageProcessor.java @@ -1,12 +1,12 @@ package com.bx.imserver.netty.processor; -import com.bx.imcommon.contant.RedisKey; +import com.bx.imcommon.contant.IMRedisKey; import com.bx.imcommon.enums.IMCmdType; import com.bx.imcommon.enums.IMSendCode; import com.bx.imcommon.model.IMRecvInfo; import com.bx.imcommon.model.IMSendInfo; import com.bx.imcommon.model.IMUserInfo; -import com.bx.imcommon.model.SendResult; +import com.bx.imcommon.model.IMSendResult; import com.bx.imserver.netty.UserChannelCtxMap; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; @@ -58,13 +58,13 @@ public class GroupMessageProcessor extends AbstractMessageProcessor private void sendResult(IMRecvInfo recvInfo,IMUserInfo receiver,IMSendCode sendCode){ if(recvInfo.getSendResult()) { - SendResult result = new SendResult(); + IMSendResult result = new IMSendResult(); result.setSender(recvInfo.getSender()); result.setReceiver(receiver); result.setCode(sendCode.code()); result.setData(recvInfo.getData()); // 推送到结果队列 - String key = RedisKey.IM_RESULT_GROUP_QUEUE; + String key = IMRedisKey.IM_RESULT_GROUP_QUEUE; redisTemplate.opsForList().rightPush(key, result); } } diff --git a/im-server/src/main/java/com/bx/imserver/netty/processor/HeartbeatProcessor.java b/im-server/src/main/java/com/bx/imserver/netty/processor/HeartbeatProcessor.java index 6a2a181..b72bccd 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/processor/HeartbeatProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/netty/processor/HeartbeatProcessor.java @@ -1,10 +1,10 @@ package com.bx.imserver.netty.processor; import cn.hutool.core.bean.BeanUtil; -import com.bx.imcommon.contant.Constant; -import com.bx.imcommon.contant.RedisKey; +import com.bx.imcommon.contant.IMConstant; +import com.bx.imcommon.contant.IMRedisKey; import com.bx.imcommon.enums.IMCmdType; -import com.bx.imcommon.model.HeartbeatInfo; +import com.bx.imcommon.model.IMHeartbeatInfo; import com.bx.imcommon.model.IMSendInfo; import com.bx.imserver.constant.ChannelAttrKey; import com.bx.imserver.netty.ws.WebSocketServer; @@ -20,7 +20,7 @@ import java.util.concurrent.TimeUnit; @Slf4j @Component -public class HeartbeatProcessor extends AbstractMessageProcessor { +public class HeartbeatProcessor extends AbstractMessageProcessor { @Autowired @@ -30,7 +30,7 @@ public class HeartbeatProcessor extends AbstractMessageProcessor RedisTemplate redisTemplate; @Override - public void process(ChannelHandlerContext ctx, HeartbeatInfo beatInfo) { + public void process(ChannelHandlerContext ctx, IMHeartbeatInfo beatInfo) { // 响应ws IMSendInfo sendInfo = new IMSendInfo(); sendInfo.setCmd(IMCmdType.HEART_BEAT.code()); @@ -46,16 +46,16 @@ public class HeartbeatProcessor extends AbstractMessageProcessor Long userId = ctx.channel().attr(userIdAttr).get(); AttributeKey terminalAttr = AttributeKey.valueOf(ChannelAttrKey.TERMINAL_TYPE); Integer ternimal = ctx.channel().attr(terminalAttr).get(); - String key = String.join(":",RedisKey.IM_USER_SERVER_ID,userId.toString(),ternimal.toString()); - redisTemplate.expire(key, Constant.ONLINE_TIMEOUT_SECOND, TimeUnit.SECONDS); + String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID,userId.toString(),ternimal.toString()); + redisTemplate.expire(key, IMConstant.ONLINE_TIMEOUT_SECOND, TimeUnit.SECONDS); } } @Override - public HeartbeatInfo transForm(Object o) { + public IMHeartbeatInfo transForm(Object o) { HashMap map = (HashMap)o; - HeartbeatInfo heartbeatInfo = BeanUtil.fillBeanWithMap(map, new HeartbeatInfo(), false); + IMHeartbeatInfo heartbeatInfo = BeanUtil.fillBeanWithMap(map, new IMHeartbeatInfo(), false); return heartbeatInfo; } } diff --git a/im-server/src/main/java/com/bx/imserver/netty/processor/LoginProcessor.java b/im-server/src/main/java/com/bx/imserver/netty/processor/LoginProcessor.java index 1fd570b..fd3d3f9 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/processor/LoginProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/netty/processor/LoginProcessor.java @@ -2,17 +2,16 @@ package com.bx.imserver.netty.processor; import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson.JSON; -import com.bx.imcommon.contant.Constant; -import com.bx.imcommon.contant.RedisKey; +import com.bx.imcommon.contant.IMConstant; +import com.bx.imcommon.contant.IMRedisKey; import com.bx.imcommon.enums.IMCmdType; import com.bx.imcommon.model.IMSendInfo; import com.bx.imcommon.model.IMSessionInfo; -import com.bx.imcommon.model.LoginInfo; +import com.bx.imcommon.model.IMLoginInfo; import com.bx.imcommon.util.JwtUtil; import com.bx.imserver.constant.ChannelAttrKey; import com.bx.imserver.netty.IMServerGroup; import com.bx.imserver.netty.UserChannelCtxMap; -import com.bx.imserver.netty.ws.WebSocketServer; import io.netty.channel.ChannelHandlerContext; import io.netty.util.AttributeKey; import lombok.extern.slf4j.Slf4j; @@ -26,7 +25,7 @@ import java.util.concurrent.TimeUnit; @Slf4j @Component -public class LoginProcessor extends AbstractMessageProcessor { +public class LoginProcessor extends AbstractMessageProcessor { @Autowired RedisTemplate redisTemplate; @@ -35,7 +34,7 @@ public class LoginProcessor extends AbstractMessageProcessor { private String accessTokenSecret; @Override - synchronized public void process(ChannelHandlerContext ctx, LoginInfo loginInfo) { + synchronized public void process(ChannelHandlerContext ctx, IMLoginInfo loginInfo) { if(!JwtUtil.checkSign(loginInfo.getAccessToken(),accessTokenSecret)){ ctx.channel().close(); log.warn("用户token校验不通过,强制下线,token:{}",loginInfo.getAccessToken()); @@ -66,8 +65,8 @@ public class LoginProcessor extends AbstractMessageProcessor { AttributeKey heartBeatAttr = AttributeKey.valueOf("HEARTBEAt_TIMES"); ctx.channel().attr(heartBeatAttr).set(0L); // 在redis上记录每个user的channelId,15秒没有心跳,则自动过期 - String key = String.join(":",RedisKey.IM_USER_SERVER_ID,userId.toString(), terminal.toString()); - redisTemplate.opsForValue().set(key, IMServerGroup.serverId, Constant.ONLINE_TIMEOUT_SECOND, TimeUnit.SECONDS); + String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID,userId.toString(), terminal.toString()); + redisTemplate.opsForValue().set(key, IMServerGroup.serverId, IMConstant.ONLINE_TIMEOUT_SECOND, TimeUnit.SECONDS); // 响应ws IMSendInfo sendInfo = new IMSendInfo(); sendInfo.setCmd(IMCmdType.LOGIN.code()); @@ -76,9 +75,9 @@ public class LoginProcessor extends AbstractMessageProcessor { @Override - public LoginInfo transForm(Object o) { + public IMLoginInfo transForm(Object o) { HashMap map = (HashMap)o; - LoginInfo loginInfo = BeanUtil.fillBeanWithMap(map, new LoginInfo(), false); + IMLoginInfo loginInfo = BeanUtil.fillBeanWithMap(map, new IMLoginInfo(), false); return loginInfo; } } diff --git a/im-server/src/main/java/com/bx/imserver/netty/processor/PrivateMessageProcessor.java b/im-server/src/main/java/com/bx/imserver/netty/processor/PrivateMessageProcessor.java index 78044a1..f65a635 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/processor/PrivateMessageProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/netty/processor/PrivateMessageProcessor.java @@ -1,12 +1,12 @@ package com.bx.imserver.netty.processor; -import com.bx.imcommon.contant.RedisKey; +import com.bx.imcommon.contant.IMRedisKey; import com.bx.imcommon.enums.IMCmdType; import com.bx.imcommon.enums.IMSendCode; import com.bx.imcommon.model.IMRecvInfo; import com.bx.imcommon.model.IMSendInfo; import com.bx.imcommon.model.IMUserInfo; -import com.bx.imcommon.model.SendResult; +import com.bx.imcommon.model.IMSendResult; import com.bx.imserver.netty.UserChannelCtxMap; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; @@ -51,13 +51,13 @@ public class PrivateMessageProcessor extends AbstractMessageProcessor
-
{{msgInfo.content}}
-
+
{{msgInfo.content}}
+
@@ -11,14 +11,14 @@
- -
+ +
-
+
{{data.name}} @@ -30,7 +30,7 @@
-
+