Browse Source

代码规范

master
xie.bx 3 years ago
parent
commit
3d77aefa21
  1. 21
      im-client/src/main/java/com/bx/imclient/IMClient.java
  2. 3
      im-client/src/main/java/com/bx/imclient/listener/MessageListenerMulticaster.java
  3. 6
      im-commom/src/main/java/com/bx/imcommon/enums/IMListenerType.java
  4. 18
      im-commom/src/main/java/com/bx/imcommon/model/GroupMessageInfo.java
  5. 9
      im-commom/src/main/java/com/bx/imcommon/model/IMRecvInfo.java
  6. 7
      im-commom/src/main/java/com/bx/imcommon/model/IMSendInfo.java
  7. 18
      im-commom/src/main/java/com/bx/imcommon/model/PrivateMessageInfo.java
  8. 12
      im-commom/src/main/java/com/bx/imcommon/model/SendResult.java
  9. 2
      im-server/src/main/java/com/bx/imserver/IMServerApp.java
  10. 6
      im-server/src/main/java/com/bx/imserver/processor/GroupMessageProcessor.java
  11. 4
      im-server/src/main/java/com/bx/imserver/processor/HeartbeatProcessor.java
  12. 10
      im-server/src/main/java/com/bx/imserver/processor/LoginProcessor.java
  13. 2
      im-server/src/main/java/com/bx/imserver/processor/MessageProcessor.java
  14. 6
      im-server/src/main/java/com/bx/imserver/processor/PrivateMessageProcessor.java
  15. 2
      im-server/src/main/java/com/bx/imserver/processor/ProcessorFactory.java
  16. 2
      im-server/src/main/java/com/bx/imserver/task/AbstractPullMessageTask.java
  17. 6
      im-server/src/main/java/com/bx/imserver/task/PullUnreadGroupMessageTask.java
  18. 6
      im-server/src/main/java/com/bx/imserver/task/PullUnreadPrivateMessageTask.java
  19. 4
      im-server/src/main/java/com/bx/imserver/util/UserChannelCtxHolder.java
  20. 11
      im-server/src/main/java/com/bx/imserver/ws/WebSocketHandler.java
  21. 6
      im-server/src/main/java/com/bx/imserver/ws/WebsocketServer.java
  22. 2
      im-server/src/main/java/com/bx/imserver/ws/endecode/MessageProtocolDecoder.java
  23. 2
      im-server/src/main/java/com/bx/imserver/ws/endecode/MessageProtocolEncoder.java
  24. 12
      im-ui/src/api/wssocket.js
  25. 2
      im-ui/src/view/Home.vue

21
im-client/src/main/java/com/bx/imclient/IMClient.java

@ -14,16 +14,27 @@ public class IMClient {
@Autowired
private MessageListenerMulticaster listenerMulticaster;
@Autowired
private IMSender imSender;
public void sendPrivateMessage(Long userId, PrivateMessageInfo... messageInfo){
imSender.sendPrivateMessage(userId,messageInfo);
/**
* 发送私聊消息
*
* @param recvId 接收用户id
* @param messageInfo 消息体将转成json发送到客户端
*/
public void sendPrivateMessage(Long recvId, PrivateMessageInfo... messageInfo){
imSender.sendPrivateMessage(recvId,messageInfo);
}
public void sendGroupMessage(List<Long> userTokens, GroupMessageInfo... messageInfo){
imSender.sendGroupMessage(userTokens,messageInfo);
/**
* 发送群聊消息
*
* @param recvIds 群聊用户id列表
* @param messageInfo 消息体将转成json发送到客户端
*/
public void sendGroupMessage(List<Long> recvIds, GroupMessageInfo... messageInfo){
imSender.sendGroupMessage(recvIds,messageInfo);
}

3
im-client/src/main/java/com/bx/imclient/listener/MessageListenerMulticaster.java

@ -13,14 +13,13 @@ import java.util.List;
@Component
public class MessageListenerMulticaster {
@Autowired(required = false)
private List<MessageListener> messageListeners = Collections.emptyList();
public void multicast(IMListenerType type, SendResult result){
for(MessageListener listener:messageListeners){
IMListener annotation = listener.getClass().getAnnotation(IMListener.class);
if(annotation.type().equals(type)){
if(annotation!=null && (annotation.type().equals(IMListenerType.ALL) || annotation.type().equals(type))){
listener.process(result);
}
}

6
im-commom/src/main/java/com/bx/imcommon/enums/IMListenerType.java

@ -1,9 +1,9 @@
package com.bx.imcommon.enums;
public enum IMListenerType {
PRIVATE_MESSAGE(0,"私聊消息"),
GROUP_MESSAGE(1,"群聊消息");
ALL(0,"全部消息"),
PRIVATE_MESSAGE(1,"私聊消息"),
GROUP_MESSAGE(2,"群聊消息");
private Integer code;

18
im-commom/src/main/java/com/bx/imcommon/model/GroupMessageInfo.java

@ -9,16 +9,34 @@ 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;
}

9
im-commom/src/main/java/com/bx/imcommon/model/IMRecvInfo.java

@ -7,10 +7,19 @@ import java.util.List;
@Data
public class IMRecvInfo<T> {
/*
* 命令类型
*/
private Integer cmd;
/*
* 接收者id列表
*/
private List<Long> recvIds;
/*
* 推送消息体
*/
private T data;
}

7
im-commom/src/main/java/com/bx/imcommon/model/IMSendInfo.java

@ -5,7 +5,14 @@ import lombok.Data;
@Data
public class IMSendInfo<T> {
/*
* 命令
*/
private Integer cmd;
/*
* 推送消息体
*/
private T data;
}

18
im-commom/src/main/java/com/bx/imcommon/model/PrivateMessageInfo.java

@ -9,16 +9,34 @@ 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;
}

12
im-commom/src/main/java/com/bx/imcommon/model/SendResult.java

@ -6,12 +6,24 @@ import lombok.Data;
@Data
public class SendResult<T> {
/*
* 接收者id
*/
private Long recvId;
/*
* 发送状态
*/
private IMSendStatus status;
/*
* 失败原因
*/
private String failReason="";
/*
* 消息体(透传)
*/
private T messageInfo;
}

2
im-server/src/main/java/com/bx/imserver/IMServerApp.java

@ -1,7 +1,7 @@
package com.bx.imserver;
import com.bx.imserver.websocket.WebsocketServer;
import com.bx.imserver.ws.WebsocketServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;

6
im-server/src/main/java/com/bx/imserver/websocket/processor/GroupMessageProcessor.java → im-server/src/main/java/com/bx/imserver/processor/GroupMessageProcessor.java

@ -1,4 +1,4 @@
package com.bx.imserver.websocket.processor;
package com.bx.imserver.processor;
import com.bx.imcommon.contant.RedisKey;
import com.bx.imcommon.enums.IMCmdType;
@ -7,7 +7,7 @@ import com.bx.imcommon.model.GroupMessageInfo;
import com.bx.imcommon.model.IMRecvInfo;
import com.bx.imcommon.model.IMSendInfo;
import com.bx.imcommon.model.SendResult;
import com.bx.imserver.websocket.WebsocketChannelCtxHolder;
import com.bx.imserver.util.UserChannelCtxHolder;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -32,7 +32,7 @@ public class GroupMessageProcessor extends MessageProcessor<IMRecvInfo<GroupMes
log.info("接收到群消息,发送者:{},群id:{},接收id:{},内容:{}",messageInfo.getSendId(),messageInfo.getGroupId(),recvIds,messageInfo.getContent());
for(Long recvId:recvIds){
try {
ChannelHandlerContext channelCtx = WebsocketChannelCtxHolder.getChannelCtx(recvId);
ChannelHandlerContext channelCtx = UserChannelCtxHolder.getChannelCtx(recvId);
if(channelCtx != null){
// 自己发的消息不用推送
if(recvId != messageInfo.getSendId()){

4
im-server/src/main/java/com/bx/imserver/websocket/processor/HeartbeatProcessor.java → im-server/src/main/java/com/bx/imserver/processor/HeartbeatProcessor.java

@ -1,4 +1,4 @@
package com.bx.imserver.websocket.processor;
package com.bx.imserver.processor;
import cn.hutool.core.bean.BeanUtil;
import com.bx.imcommon.contant.Constant;
@ -6,7 +6,7 @@ import com.bx.imcommon.contant.RedisKey;
import com.bx.imcommon.enums.IMCmdType;
import com.bx.imcommon.model.HeartbeatInfo;
import com.bx.imcommon.model.IMSendInfo;
import com.bx.imserver.websocket.WebsocketServer;
import com.bx.imserver.ws.WebsocketServer;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.AttributeKey;
import lombok.extern.slf4j.Slf4j;

10
im-server/src/main/java/com/bx/imserver/websocket/processor/LoginProcessor.java → im-server/src/main/java/com/bx/imserver/processor/LoginProcessor.java

@ -1,4 +1,4 @@
package com.bx.imserver.websocket.processor;
package com.bx.imserver.processor;
import cn.hutool.core.bean.BeanUtil;
import com.bx.imcommon.contant.Constant;
@ -6,8 +6,8 @@ import com.bx.imcommon.contant.RedisKey;
import com.bx.imcommon.enums.IMCmdType;
import com.bx.imcommon.model.IMSendInfo;
import com.bx.imcommon.model.LoginInfo;
import com.bx.imserver.websocket.WebsocketChannelCtxHolder;
import com.bx.imserver.websocket.WebsocketServer;
import com.bx.imserver.util.UserChannelCtxHolder;
import com.bx.imserver.ws.WebsocketServer;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.AttributeKey;
import lombok.extern.slf4j.Slf4j;
@ -32,7 +32,7 @@ public class LoginProcessor extends MessageProcessor<LoginInfo> {
@Override
synchronized public void process(ChannelHandlerContext ctx, LoginInfo loginInfo) {
log.info("用户登录,userId:{}",loginInfo.getUserId());
ChannelHandlerContext context = WebsocketChannelCtxHolder.getChannelCtx(loginInfo.getUserId());
ChannelHandlerContext context = UserChannelCtxHolder.getChannelCtx(loginInfo.getUserId());
if(context != null){
// 不允许多地登录,强制下线
IMSendInfo sendInfo = new IMSendInfo();
@ -40,7 +40,7 @@ public class LoginProcessor extends MessageProcessor<LoginInfo> {
context.channel().writeAndFlush(sendInfo);
}
// 绑定用户和channel
WebsocketChannelCtxHolder.addChannelCtx(loginInfo.getUserId(),ctx);
UserChannelCtxHolder.addChannelCtx(loginInfo.getUserId(),ctx);
// 设置用户id属性
AttributeKey<Long> attr = AttributeKey.valueOf("USER_ID");
ctx.channel().attr(attr).set(loginInfo.getUserId());

2
im-server/src/main/java/com/bx/imserver/websocket/processor/MessageProcessor.java → im-server/src/main/java/com/bx/imserver/processor/MessageProcessor.java

@ -1,4 +1,4 @@
package com.bx.imserver.websocket.processor;
package com.bx.imserver.processor;
import io.netty.channel.ChannelHandlerContext;

6
im-server/src/main/java/com/bx/imserver/websocket/processor/PrivateMessageProcessor.java → im-server/src/main/java/com/bx/imserver/processor/PrivateMessageProcessor.java

@ -1,4 +1,4 @@
package com.bx.imserver.websocket.processor;
package com.bx.imserver.processor;
import com.bx.imcommon.contant.RedisKey;
import com.bx.imcommon.enums.IMCmdType;
@ -7,7 +7,7 @@ import com.bx.imcommon.model.IMRecvInfo;
import com.bx.imcommon.model.IMSendInfo;
import com.bx.imcommon.model.PrivateMessageInfo;
import com.bx.imcommon.model.SendResult;
import com.bx.imserver.websocket.WebsocketChannelCtxHolder;
import com.bx.imserver.util.UserChannelCtxHolder;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -27,7 +27,7 @@ public class PrivateMessageProcessor extends MessageProcessor<IMRecvInfo<Privat
Long recvId = recvInfo.getRecvIds().get(0);
log.info("接收到消息,发送者:{},接收者:{},内容:{}",messageInfo.getSendId(),recvId,messageInfo.getContent());
try{
ChannelHandlerContext channelCtx = WebsocketChannelCtxHolder.getChannelCtx(recvId);
ChannelHandlerContext channelCtx = UserChannelCtxHolder.getChannelCtx(recvId);
if(channelCtx != null ){
// 推送消息到用户
IMSendInfo sendInfo = new IMSendInfo();

2
im-server/src/main/java/com/bx/imserver/websocket/processor/ProcessorFactory.java → im-server/src/main/java/com/bx/imserver/processor/ProcessorFactory.java

@ -1,4 +1,4 @@
package com.bx.imserver.websocket.processor;
package com.bx.imserver.processor;
import com.bx.imcommon.enums.IMCmdType;
import com.bx.imserver.util.SpringContextHolder;

2
im-server/src/main/java/com/bx/imserver/task/AbstractPullMessageTask.java

@ -1,6 +1,6 @@
package com.bx.imserver.task;
import com.bx.imserver.websocket.WebsocketServer;
import com.bx.imserver.ws.WebsocketServer;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

6
im-server/src/main/java/com/bx/imserver/task/PullUnreadGroupMessageTask.java

@ -4,9 +4,9 @@ import com.bx.imcommon.contant.RedisKey;
import com.bx.imcommon.enums.IMCmdType;
import com.bx.imcommon.model.GroupMessageInfo;
import com.bx.imcommon.model.IMRecvInfo;
import com.bx.imserver.websocket.WebsocketServer;
import com.bx.imserver.websocket.processor.MessageProcessor;
import com.bx.imserver.websocket.processor.ProcessorFactory;
import com.bx.imserver.ws.WebsocketServer;
import com.bx.imserver.processor.MessageProcessor;
import com.bx.imserver.processor.ProcessorFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;

6
im-server/src/main/java/com/bx/imserver/task/PullUnreadPrivateMessageTask.java

@ -5,9 +5,9 @@ import com.bx.imcommon.contant.RedisKey;
import com.bx.imcommon.enums.IMCmdType;
import com.bx.imcommon.model.IMRecvInfo;
import com.bx.imcommon.model.PrivateMessageInfo;
import com.bx.imserver.websocket.WebsocketServer;
import com.bx.imserver.websocket.processor.MessageProcessor;
import com.bx.imserver.websocket.processor.ProcessorFactory;
import com.bx.imserver.ws.WebsocketServer;
import com.bx.imserver.processor.MessageProcessor;
import com.bx.imserver.processor.ProcessorFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;

4
im-server/src/main/java/com/bx/imserver/websocket/WebsocketChannelCtxHolder.java → im-server/src/main/java/com/bx/imserver/util/UserChannelCtxHolder.java

@ -1,4 +1,4 @@
package com.bx.imserver.websocket;
package com.bx.imserver.util;
import io.netty.channel.ChannelHandlerContext;
@ -6,7 +6,7 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class WebsocketChannelCtxHolder {
public class UserChannelCtxHolder {
/*
* 维护userId和ctx的关联关系格式:Map<userId,ctx>

11
im-server/src/main/java/com/bx/imserver/websocket/WebSocketHandler.java → im-server/src/main/java/com/bx/imserver/ws/WebSocketHandler.java

@ -1,11 +1,12 @@
package com.bx.imserver.websocket;
package com.bx.imserver.ws;
import com.bx.imcommon.contant.RedisKey;
import com.bx.imcommon.enums.IMCmdType;
import com.bx.imcommon.model.IMSendInfo;
import com.bx.imserver.processor.MessageProcessor;
import com.bx.imserver.processor.ProcessorFactory;
import com.bx.imserver.util.SpringContextHolder;
import com.bx.imserver.websocket.processor.MessageProcessor;
import com.bx.imserver.websocket.processor.ProcessorFactory;
import com.bx.imserver.util.UserChannelCtxHolder;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.timeout.IdleState;
@ -66,11 +67,11 @@ public class WebSocketHandler extends SimpleChannelInboundHandler<IMSendInfo> {
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
AttributeKey<Long> attr = AttributeKey.valueOf("USER_ID");
Long userId = ctx.channel().attr(attr).get();
ChannelHandlerContext context = WebsocketChannelCtxHolder.getChannelCtx(userId);
ChannelHandlerContext context = UserChannelCtxHolder.getChannelCtx(userId);
// 判断一下,避免异地登录导致的误删
if(context != null && ctx.channel().id().equals(context.channel().id())){
// 移除channel
WebsocketChannelCtxHolder.removeChannelCtx(userId);
UserChannelCtxHolder.removeChannelCtx(userId);
// 用户下线
RedisTemplate redisTemplate = SpringContextHolder.getBean("redisTemplate");
String key = RedisKey.IM_USER_SERVER_ID + userId;

6
im-server/src/main/java/com/bx/imserver/websocket/WebsocketServer.java → im-server/src/main/java/com/bx/imserver/ws/WebsocketServer.java

@ -1,8 +1,8 @@
package com.bx.imserver.websocket;
package com.bx.imserver.ws;
import com.bx.imcommon.contant.RedisKey;
import com.bx.imserver.websocket.endecode.MessageProtocolDecoder;
import com.bx.imserver.websocket.endecode.MessageProtocolEncoder;
import com.bx.imserver.ws.endecode.MessageProtocolDecoder;
import com.bx.imserver.ws.endecode.MessageProtocolEncoder;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;

2
im-server/src/main/java/com/bx/imserver/websocket/endecode/MessageProtocolDecoder.java → im-server/src/main/java/com/bx/imserver/ws/endecode/MessageProtocolDecoder.java

@ -1,4 +1,4 @@
package com.bx.imserver.websocket.endecode;
package com.bx.imserver.ws.endecode;
import com.bx.imcommon.model.IMSendInfo;
import com.fasterxml.jackson.databind.ObjectMapper;

2
im-server/src/main/java/com/bx/imserver/websocket/endecode/MessageProtocolEncoder.java → im-server/src/main/java/com/bx/imserver/ws/endecode/MessageProtocolEncoder.java

@ -1,4 +1,4 @@
package com.bx.imserver.websocket.endecode;
package com.bx.imserver.ws.endecode;
import com.bx.imcommon.model.IMSendInfo;
import com.fasterxml.jackson.databind.ObjectMapper;

12
im-ui/src/api/wssocket.js

@ -2,14 +2,14 @@ var websock = null;
let rec; //断线重连后,延迟5秒重新创建WebSocket连接 rec用来存储延迟请求的代码
let isConnect = false; //连接标识 避免重复连接
let wsurl = "";
let $store = null;
let userId = null;
let messageCallBack = null;
let openCallBack = null;
let hasLogin = false;
let createWebSocket = (url, store) => {
$store = store;
let createWebSocket = (url, id) => {
wsurl = url;
userId = id;
initWebSocket();
};
@ -45,7 +45,7 @@ let initWebSocket = () => {
// 发送登录命令
let loginInfo = {
cmd: 0,
data: {userId: $store.state.userStore.userInfo.id}
data: {userId: userId}
};
websock.send(JSON.stringify(loginInfo));
@ -88,7 +88,7 @@ var heartCheck = {
let heartBeat = {
cmd: 1,
data: {
userId: $store.state.userStore.userInfo.id
userId: userId
}
};
websock.send(JSON.stringify(heartBeat))
@ -139,8 +139,6 @@ function onopen(callback) {
}
// 将方法暴露出去
export {
createWebSocket,

2
im-ui/src/view/Home.vue

@ -63,7 +63,7 @@
init(userInfo) {
this.$store.commit("setUserInfo", userInfo);
this.$store.commit("initStore");
this.$wsApi.createWebSocket(process.env.VUE_APP_WS_URL, this.$store);
this.$wsApi.createWebSocket(process.env.VUE_APP_WS_URL, userInfo.id);
this.$wsApi.onopen(() => {
this.pullUnreadMessage();
});

Loading…
Cancel
Save