Browse Source

2.0上线

master
xsx 2 years ago
parent
commit
fbe3363bbc
  1. 89
      README.md
  2. 4
      im-client/pom.xml
  3. 4
      im-client/src/main/java/com/bx/imclient/IMClient.java
  4. 4
      im-client/src/main/java/com/bx/imclient/sender/IMSender.java
  5. 2
      im-commom/pom.xml
  6. 4
      im-platform/pom.xml
  7. 18
      im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java
  8. 4
      im-server/pom.xml
  9. 2
      pom.xml
  10. BIN
      截图/mp-好友列表.jpg
  11. BIN
      截图/mp-私聊.jpg
  12. BIN
      截图/mp-群聊.jpg
  13. BIN
      截图/mp-群聊信息.jpg
  14. 21
      打包/一键打包.bat

89
README.md

@ -8,7 +8,7 @@
#### 近期更新 #### 近期更新
即将发布2.0版本,本次更新主要是加入了uniapp版本,支持移动端和web端同时在线 发布2.0版本,本次更新主要是加入了uniapp版本,支持移动端和web端同时在线
感兴趣的小伙伴,可在下方扫码抢先体验微信小程序 感兴趣的小伙伴,可在下方扫码抢先体验微信小程序
@ -65,18 +65,24 @@ java -jar ./im-platform/target/im-platform.jar
java -jar ./im-server/target/im-server.jar java -jar ./im-server/target/im-server.jar
``` ```
3.启动前端ui 3.启动前端web
``` ```
cd im-ui cd im-ui
npm install npm install
npm run serve npm run serve
``` ```
访问 http://localhost:8080
4.启动uniapp-h5
将im-uniapp目录导入HBuilder X,点击菜单"运行"->"开发环境-h5"
访问 http://localhost:5173
4.访问localhost:8080
#### 快速接入 #### 快速接入
消息推送的请求代码已经封装在im-client包中,对于需要接入im-server的小伙伴,可以按照下面的教程快速的将IM功能集成到自己的项目中。 消息推送的请求代码已经封装在im-client包中,对于需要接入im-server的小伙伴,可以按照下面的教程快速的将IM功能集成到自己的项目中。
注意服务器端和网页端都需要接入,服务器端发送消息,网页端接收消息。 注意服务器端和前端都需要接入,服务器端发送消息,前端接收消息。
4.1 服务器端接入 4.1 服务器端接入
@ -85,7 +91,7 @@ npm run serve
<dependency> <dependency>
<groupId>com.bx</groupId> <groupId>com.bx</groupId>
<artifactId>im-client</artifactId> <artifactId>im-client</artifactId>
<version>1.1.0</version> <version>2.0.0</version>
</dependency> </dependency>
``` ```
内容使用了redis进行通信,所以要配置redis地址: 内容使用了redis进行通信,所以要配置redis地址:
@ -104,20 +110,16 @@ public class IMClient {
/** /**
* 发送私聊消息 * 发送私聊消息
* *
* @param recvId 接收用户id * @param message 私有消息
* @param messageInfo 消息体,将转成json发送到客户端
*/ */
void sendPrivateMessage(Long recvId, PrivateMessageInfo... messageInfo); public<T> void sendPrivateMessage(IMPrivateMessage<T> message);
/** /**
* 发送群聊消息 * 发送群聊消息(发送结果通过MessageListener接收)
* *
* @param recvIds 群聊用户id列表 * @param message 群聊消息
* @param messageInfo 消息体,将转成json发送到客户端
*/ */
void sendGroupMessage(List<Long> recvIds, GroupMessageInfo... messageInfo); public<T> void sendGroupMessage(IMGroupMessage<T> message);
} }
``` ```
@ -127,38 +129,43 @@ public class IMClient {
private IMClient imClient; private IMClient imClient;
public void sendMessage(){ public void sendMessage(){
PrivateMessageInfo messageInfo = new PrivateMessageInfo(); IMPrivateMessage<PrivateMessageVO> sendMessage = new IMPrivateMessage<>();
Long recvId = 1L; // 发送方的id和终端类型
messageInfo.setId(123L); sendMessage.setSender(new IMUserInfo(1L, IMTerminalType.APP.code()));
messageInfo.setContent("你好呀"); // 对方的id
messageInfo.setType(MessageType.TEXT.getCode()); sendMessage.setRecvId(2L);
messageInfo.setSendId(userId); // 推送给对方所有终端
messageInfo.setRecvId(recvId); sendMessage.setRecvTerminals(IMTerminalType.codes());
messageInfo.setSendTime(new Date()); // 同时推送给自己的其他类型终端
imClient.sendPrivateMessage(recvId,messageInfo); sendMessage.setSendToSelf(true);
// 需要回推发送结果,将在IMListener接收发送结果
sendMessage.setSendResult(true);
// 推送的内容
sendMessage.setData(msgInfo);
// 推送消息
imClient.sendPrivateMessage(sendMessage);
} }
``` ```
监听发送结果:
如果需要对消息发送的结果进行监听的话,实现MessageListener,并加上@IMListener即可 1.编写消息监听类,实现MessageListener,并加上@IMListener
2.发送消息时指定sendResult为true
``` ```
@Slf4j @Slf4j
@IMListener(type = IMListenerType.ALL) @IMListener(type = IMListenerType.ALL)
public class PrivateMessageListener implements MessageListener { public class PrivateMessageListener implements MessageListener {
@Override @Override
public void process(SendResult result){ public void process(IMSendResult<PrivateMessageVO> result){
PrivateMessageInfo messageInfo = (PrivateMessageInfo) result.getMessageInfo(); PrivateMessageVO messageInfo = result.getData();
if(result.getStatus().equals(IMSendStatus.SUCCESS)){ if(result.getCode().equals(IMSendCode.SUCCESS.code())){
// 消息发送成功 log.info("消息发送成功,消息id:{},发送者:{},接收者:{},终端:{}",messageInfo.getId(),result.getSender().getId(),result.getReceiver().getId(),result.getReceiver().getTerminal());
log.info("消息已读,消息id:{},发送者:{},接收者:{}",messageInfo.getId(),messageInfo.getSendId(),messageInfo.getRecvId());
} }
} }
} }
``` ```
4.2 网页端接入 4.2 端接入
首先将im-ui/src/api/wssocket.js拷贝到自己的项目。 首先将im-ui/src/api/wssocket.js拷贝到自己的项目。
接入代码如下: 接入代码如下:
@ -167,23 +174,23 @@ import * as wsApi from './api/wssocket';
let wsUrl = 'ws://localhost:8878/im' let wsUrl = 'ws://localhost:8878/im'
let userId = 1; let userId = 1;
wsApi.createWebSocket(wsUrl , userId); let token = "您的token";
wsApi.createWebSocket(wsUrl , userId,token);
wsApi.onopen(() => { wsApi.onopen(() => {
// 连接打开 // 连接打开
console.log("连接成功"); console.log("连接成功");
}); });
wsApi.onmessage((cmd,messageInfo) => { wsApi.onmessage((cmd,msgInfo) => {
if (cmd == 2) { if (cmd == 2) {
// 异地登录,强制下线 // 异地登录,强制下线
console.log("您已在其他地方登陆,将被强制下线"); console.log("您已在其他地方登陆,将被强制下线");
} else if (cmd == 3) { } else if (cmd == 3) {
// 私聊消息 // 私聊消息
console.log(messageInfo); console.log(msgInfo);
} else if (cmd == 4) { } else if (cmd == 4) {
// 群聊消息 // 群聊消息
console.log(messageInfo); console.log(msgInfo);
} }
}) })
``` ```
@ -207,14 +214,18 @@ wsApi.onmessage((cmd,messageInfo) => {
群聊列表: 群聊列表:
![输入图片说明](%E6%88%AA%E5%9B%BE/%E7%BE%A4%E8%81%8A%E5%88%97%E8%A1%A8.jpg) ![输入图片说明](%E6%88%AA%E5%9B%BE/%E7%BE%A4%E8%81%8A%E5%88%97%E8%A1%A8.jpg)
小程序:
![mp-群聊信息.jpg](%BD%D8%CD%BC%2Fmp-%C8%BA%C1%C4%D0%C5%CF%A2.jpg)
#### QQ交流群 #### QQ交流群
![输入图片说明](%E6%88%AA%E5%9B%BE/%E4%BA%A4%E6%B5%81%E7%BE%A4.png) ![输入图片说明](%E6%88%AA%E5%9B%BE/%E4%BA%A4%E6%B5%81%E7%BE%A4.png)
有任何问题,欢迎star后加群交流~ 欢迎进群与小伙们一起交流,加群前记得要先star哦,加群时请备注您的gitee账号
#### 点下star吧 #### 点下star吧
喜欢的朋友麻烦点个star,鼓励一下作者吧! 如果项目对您有帮助,帮忙点亮star,支持一下作者吧!

4
im-client/pom.xml

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>box-im</artifactId> <artifactId>box-im</artifactId>
<groupId>com.bx</groupId> <groupId>com.bx</groupId>
<version>1.1.0</version> <version>2.0.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -15,7 +15,7 @@
<dependency> <dependency>
<groupId>com.bx</groupId> <groupId>com.bx</groupId>
<artifactId>im-commom</artifactId> <artifactId>im-commom</artifactId>
<version>1.1.0</version> <version>2.0.0</version>
</dependency> </dependency>
<!-- 引入redis --> <!-- 引入redis -->
<dependency> <dependency>

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

@ -28,7 +28,7 @@ public class IMClient {
* *
* @param message 私有消息 * @param message 私有消息
*/ */
public void sendPrivateMessage(IMPrivateMessage<?> message){ public<T> void sendPrivateMessage(IMPrivateMessage<T> message){
imSender.sendPrivateMessage(message); imSender.sendPrivateMessage(message);
} }
@ -37,7 +37,7 @@ public class IMClient {
* *
* @param message 群聊消息 * @param message 群聊消息
*/ */
public void sendGroupMessage(IMGroupMessage<?> message){ public<T> void sendGroupMessage(IMGroupMessage<T> message){
imSender.sendGroupMessage(message); imSender.sendGroupMessage(message);
} }

4
im-client/src/main/java/com/bx/imclient/sender/IMSender.java

@ -28,7 +28,7 @@ public class IMSender {
@Autowired @Autowired
private MessageListenerMulticaster listenerMulticaster; private MessageListenerMulticaster listenerMulticaster;
public void sendPrivateMessage(IMPrivateMessage<?> message) { public<T> void sendPrivateMessage(IMPrivateMessage<T> message) {
for (Integer terminal : message.getRecvTerminals()) { for (Integer terminal : message.getRecvTerminals()) {
// 获取对方连接的channelId // 获取对方连接的channelId
String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, message.getRecvId().toString(), terminal.toString()); String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, message.getRecvId().toString(), terminal.toString());
@ -79,7 +79,7 @@ public class IMSender {
} }
public void sendGroupMessage(IMGroupMessage<?> message) { public<T> void sendGroupMessage(IMGroupMessage<T> message) {
// 根据群聊每个成员所连的IM-server,进行分组 // 根据群聊每个成员所连的IM-server,进行分组
List<IMUserInfo> offLineUsers = Collections.synchronizedList(new LinkedList<>()); List<IMUserInfo> offLineUsers = Collections.synchronizedList(new LinkedList<>());
// 格式:map<服务器id,list<接收方>> // 格式:map<服务器id,list<接收方>>

2
im-commom/pom.xml

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>box-im</artifactId> <artifactId>box-im</artifactId>
<groupId>com.bx</groupId> <groupId>com.bx</groupId>
<version>1.1.0</version> <version>2.0.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>im-commom</artifactId> <artifactId>im-commom</artifactId>

4
im-platform/pom.xml

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>box-im</artifactId> <artifactId>box-im</artifactId>
<groupId>com.bx</groupId> <groupId>com.bx</groupId>
<version>1.1.0</version> <version>2.0.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -16,7 +16,7 @@
<dependency> <dependency>
<groupId>com.bx</groupId> <groupId>com.bx</groupId>
<artifactId>im-client</artifactId> <artifactId>im-client</artifactId>
<version>1.1.0</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

18
im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bx.imclient.IMClient; import com.bx.imclient.IMClient;
import com.bx.imcommon.contant.IMConstant; import com.bx.imcommon.contant.IMConstant;
import com.bx.imcommon.enums.IMTerminalType;
import com.bx.imcommon.model.IMPrivateMessage; import com.bx.imcommon.model.IMPrivateMessage;
import com.bx.imcommon.model.IMUserInfo; import com.bx.imcommon.model.IMUserInfo;
import com.bx.implatform.vo.PrivateMessageVO; import com.bx.implatform.vo.PrivateMessageVO;
@ -60,12 +61,25 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper,
this.save(msg); this.save(msg);
// 推送消息 // 推送消息
PrivateMessageVO msgInfo = BeanUtils.copyProperties(msg, PrivateMessageVO.class); PrivateMessageVO msgInfo = BeanUtils.copyProperties(msg, PrivateMessageVO.class);
IMPrivateMessage<PrivateMessageVO> sendMessage = new IMPrivateMessage<>(); IMPrivateMessage<PrivateMessageVO> sendMessage = new IMPrivateMessage<>();
sendMessage.setSender(new IMUserInfo(session.getUserId(),session.getTerminal())); // 发送方的id和终端类型
sendMessage.setRecvId(msgInfo.getRecvId()); sendMessage.setSender(new IMUserInfo(1L, IMTerminalType.APP.code()));
// 对方的id
sendMessage.setRecvId(2L);
// 推送给对方所有终端
sendMessage.setRecvTerminals(IMTerminalType.codes());
// 同时推送给自己的其他类型终端
sendMessage.setSendToSelf(true); sendMessage.setSendToSelf(true);
// 需要回推发送结果,将在IMListener接收发送结果
sendMessage.setSendResult(true);
// 推送的消息体
sendMessage.setData(msgInfo); sendMessage.setData(msgInfo);
// 推送消息
imClient.sendPrivateMessage(sendMessage); imClient.sendPrivateMessage(sendMessage);
log.info("发送私聊消息,发送id:{},接收id:{},内容:{}", session.getUserId(), dto.getRecvId(), dto.getContent()); log.info("发送私聊消息,发送id:{},接收id:{},内容:{}", session.getUserId(), dto.getRecvId(), dto.getContent());
return msg.getId(); return msg.getId();
} }

4
im-server/pom.xml

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>box-im</artifactId> <artifactId>box-im</artifactId>
<groupId>com.bx</groupId> <groupId>com.bx</groupId>
<version>1.1.0</version> <version>2.0.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -16,7 +16,7 @@
<dependency> <dependency>
<groupId>com.bx</groupId> <groupId>com.bx</groupId>
<artifactId>im-commom</artifactId> <artifactId>im-commom</artifactId>
<version>1.1.0</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

2
pom.xml

@ -7,7 +7,7 @@
<artifactId>box-im</artifactId> <artifactId>box-im</artifactId>
<groupId>com.bx</groupId> <groupId>com.bx</groupId>
<packaging>pom</packaging> <packaging>pom</packaging>
<version>1.1.0</version> <version>2.0.0</version>
<modules> <modules>
<module>im-platform</module> <module>im-platform</module>

BIN
截图/mp-好友列表.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

BIN
截图/mp-私聊.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 KiB

BIN
截图/mp-群聊.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

BIN
截图/mp-群聊信息.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 KiB

21
打包/一键打包.bat

@ -1,21 +0,0 @@
rem 删除旧文件
del /f /s /q ".\im-platform.jar"
del /f /s /q ".\im-server.jar"
del /f /s /q ".\im-ui.zip"
rd /s /q ".\im-ui"
rem 编译java项目
call mvn clean package -f ../pom.xml
rem 拷贝jar包
copy "..\im-platform\target\im-platform.jar" ".\"
copy "..\im-server\target\im-server.jar" ".\"
rem 打包前端资源
call npm run build --prefix ..\im-ui\
md im-ui
xcopy "..\im-ui\dist" ".\im-ui" /e /y
echo 打包完成..........
pause
Loading…
Cancel
Save