Browse Source

!103 合并到master

Merge pull request !103 from blue/v_3.0.0
master
blue 2 years ago
committed by Gitee
parent
commit
fefcb2eaf4
No known key found for this signature in database GPG Key ID: 173E9B9CA92EEF8F
  1. 2
      im-client/src/main/java/com/bx/imclient/IMAutoConfiguration.java
  2. 13
      im-platform/Dockerfile
  3. 2
      im-platform/src/main/java/com/bx/implatform/controller/WebrtcGroupController.java
  4. 4
      im-platform/src/main/java/com/bx/implatform/controller/WebrtcPrivateController.java
  5. 8
      im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcGroupServiceImpl.java
  6. 10
      im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcPrivateServiceImpl.java
  7. 2
      im-platform/src/main/java/com/bx/implatform/vo/PrivateMessageVO.java
  8. 13
      im-server/Dockerfile
  9. 2
      im-server/src/main/java/com/bx/imserver/constant/ChannelAttrKey.java
  10. 2
      im-server/src/main/java/com/bx/imserver/netty/processor/LoginProcessor.java
  11. 4
      im-uniapp/common/messageType.js
  12. 2
      im-uniapp/store/chatStore.js
  13. 4
      im-web/src/api/messageType.js
  14. 4
      im-web/src/components/chat/ChatBox.vue
  15. 5
      im-web/src/store/chatStore.js

2
im-client/src/main/java/com/bx/imclient/IMAutoConfiguration.java

@ -7,7 +7,7 @@ import org.springframework.context.annotation.Configuration;
@Slf4j @Slf4j
@Configuration @Configuration
@ComponentScan(basePackages = "com.bx.imclient,com.bx.imcommon") @ComponentScan(basePackages = {"com.bx.imclient", "com.bx.imcommon"})
public class IMAutoConfiguration { public class IMAutoConfiguration {
} }

13
im-platform/Dockerfile

@ -1,13 +0,0 @@
FROM openjdk:8-jdk-alpine
ENV APP_FILE im-platform.jar
ENV APP_HOME /data/boxim
WORKDIR $APP_HOME
COPY ./dist/$APP_FILE $APP_HOME/
EXPOSE 8888
EXPOSE 9001
CMD java -jar $APP_HOME/$APP_FILE --spring.profiles.active=prod

2
im-platform/src/main/java/com/bx/implatform/controller/WebrtcGroupController.java

@ -114,7 +114,7 @@ public class WebrtcGroupController {
return ResultUtils.success(webrtcGroupService.info(groupId)); return ResultUtils.success(webrtcGroupService.info(groupId));
} }
@Operation(summary = "获取通话信息") @Operation(summary = "心跳")
@PostMapping("/heartbeat") @PostMapping("/heartbeat")
public Result heartbeat(@RequestParam("groupId") Long groupId) { public Result heartbeat(@RequestParam("groupId") Long groupId) {
webrtcGroupService.heartbeat(groupId); webrtcGroupService.heartbeat(groupId);

4
im-platform/src/main/java/com/bx/implatform/controller/WebrtcPrivateController.java

@ -17,7 +17,7 @@ public class WebrtcPrivateController {
private final WebrtcPrivateService webrtcPrivateService; private final WebrtcPrivateService webrtcPrivateService;
@OnlineCheck
@Operation(summary = "呼叫视频通话") @Operation(summary = "呼叫视频通话")
@PostMapping("/call") @PostMapping("/call")
public Result call(@RequestParam Long uid, @RequestParam(defaultValue = "video") String mode, public Result call(@RequestParam Long uid, @RequestParam(defaultValue = "video") String mode,
@ -68,7 +68,7 @@ public class WebrtcPrivateController {
return ResultUtils.success(); return ResultUtils.success();
} }
@Operation(summary = "获取通话信息") @Operation(summary = "心跳")
@PostMapping("/heartbeat") @PostMapping("/heartbeat")
public Result heartbeat(@RequestParam Long uid) { public Result heartbeat(@RequestParam Long uid) {
webrtcPrivateService.heartbeat(uid); webrtcPrivateService.heartbeat(uid);

8
im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcGroupServiceImpl.java

@ -323,7 +323,7 @@ public class WebrtcGroupServiceImpl implements WebrtcGroupService {
sendRtcMessage1(MessageType.RTC_GROUP_CANCEL, groupId, recvIds, "", false); sendRtcMessage1(MessageType.RTC_GROUP_CANCEL, groupId, recvIds, "", false);
// 发送文字提示信息 // 发送文字提示信息
sendTipMessage(groupId, "通话结束"); sendTipMessage(groupId, "通话结束");
log.info("发起人取消群通话,userId:{},groupId:{}", userSession.getUserId(), groupId); log.info("取消群通话,userId:{},groupId:{}", userSession.getUserId(), groupId);
} }
@RedisLock(prefixKey = RedisKey.IM_LOCK_RTC_GROUP, key = "#groupId") @RedisLock(prefixKey = RedisKey.IM_LOCK_RTC_GROUP, key = "#groupId")
@ -372,7 +372,7 @@ public class WebrtcGroupServiceImpl implements WebrtcGroupService {
WebrtcGroupSession webrtcSession = getWebrtcSession(dto.getGroupId()); WebrtcGroupSession webrtcSession = getWebrtcSession(dto.getGroupId());
IMUserInfo userInfo = findInChatUser(webrtcSession, dto.getUserId()); IMUserInfo userInfo = findInChatUser(webrtcSession, dto.getUserId());
if (Objects.isNull(userInfo)) { if (Objects.isNull(userInfo)) {
log.info("对方未加入群通话,userId:{},对方id:{},groupId:{}", userSession.getUserId(), dto.getUserId(), log.warn("对方未加入群通话,userId:{},对方id:{},groupId:{}", userSession.getUserId(), dto.getUserId(),
dto.getGroupId()); dto.getGroupId());
return; return;
} }
@ -389,7 +389,7 @@ public class WebrtcGroupServiceImpl implements WebrtcGroupService {
IMUserInfo userInfo = findInChatUser(webrtcSession, dto.getUserId()); IMUserInfo userInfo = findInChatUser(webrtcSession, dto.getUserId());
if (Objects.isNull(userInfo)) { if (Objects.isNull(userInfo)) {
// 对方未加入群通话 // 对方未加入群通话
log.info("对方未加入群通话,userId:{},对方id:{},groupId:{}", userSession.getUserId(), dto.getUserId(), log.warn("对方未加入群通话,userId:{},对方id:{},groupId:{}", userSession.getUserId(), dto.getUserId(),
dto.getGroupId()); dto.getGroupId());
return; return;
} }
@ -406,7 +406,7 @@ public class WebrtcGroupServiceImpl implements WebrtcGroupService {
IMUserInfo userInfo = findInChatUser(webrtcSession, dto.getUserId()); IMUserInfo userInfo = findInChatUser(webrtcSession, dto.getUserId());
if (Objects.isNull(userInfo)) { if (Objects.isNull(userInfo)) {
// 对方未加入群通话 // 对方未加入群通话
log.info("对方未加入群通话,无法同步candidate,userId:{},remoteUserId:{},groupId:{}", userSession.getUserId(), log.warn("对方未加入群通话,无法同步candidate,userId:{},remoteUserId:{},groupId:{}", userSession.getUserId(),
dto.getUserId(), dto.getGroupId()); dto.getUserId(), dto.getGroupId());
return; return;
} }

10
im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcPrivateServiceImpl.java

@ -3,6 +3,7 @@ package com.bx.implatform.service.impl;
import com.bx.imclient.IMClient; import com.bx.imclient.IMClient;
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.annotation.OnlineCheck;
import com.bx.implatform.contant.RedisKey; import com.bx.implatform.contant.RedisKey;
import com.bx.implatform.entity.PrivateMessage; import com.bx.implatform.entity.PrivateMessage;
import com.bx.implatform.enums.MessageStatus; import com.bx.implatform.enums.MessageStatus;
@ -37,9 +38,11 @@ public class WebrtcPrivateServiceImpl implements WebrtcPrivateService {
private final PrivateMessageService privateMessageService; private final PrivateMessageService privateMessageService;
private final UserStateUtils userStateUtils; private final UserStateUtils userStateUtils;
@OnlineCheck
@Override @Override
public void call(Long uid, String mode, String offer) { public void call(Long uid, String mode, String offer) {
UserSession session = SessionContext.getSession(); UserSession session = SessionContext.getSession();
log.info("发起呼叫,sid:{},uid:{}", session.getUserId(), uid);
// 创建webrtc会话 // 创建webrtc会话
WebrtcPrivateSession webrtcSession = new WebrtcPrivateSession(); WebrtcPrivateSession webrtcSession = new WebrtcPrivateSession();
webrtcSession.setCallerId(session.getUserId()); webrtcSession.setCallerId(session.getUserId());
@ -49,10 +52,12 @@ public class WebrtcPrivateServiceImpl implements WebrtcPrivateService {
// 校验 // 校验
if (!imClient.isOnline(uid)) { if (!imClient.isOnline(uid)) {
this.sendActMessage(webrtcSession, MessageStatus.UNSEND, "未接通"); this.sendActMessage(webrtcSession, MessageStatus.UNSEND, "未接通");
log.info("对方不在线,uid:{}", uid);
throw new GlobalException("对方目前不在线"); throw new GlobalException("对方目前不在线");
} }
if (userStateUtils.isBusy(uid)) { if (userStateUtils.isBusy(uid)) {
this.sendActMessage(webrtcSession, MessageStatus.UNSEND, "未接通"); this.sendActMessage(webrtcSession, MessageStatus.UNSEND, "未接通");
log.info("对方正忙,uid:{}", uid);
throw new GlobalException("对方正忙"); throw new GlobalException("对方正忙");
} }
// 保存rtc session // 保存rtc session
@ -83,6 +88,7 @@ public class WebrtcPrivateServiceImpl implements WebrtcPrivateService {
@Override @Override
public void accept(Long uid, @RequestBody String answer) { public void accept(Long uid, @RequestBody String answer) {
UserSession session = SessionContext.getSession(); UserSession session = SessionContext.getSession();
log.info("接受通话,sid:{},uid:{}", session.getUserId(), uid);
// 查询webrtc会话 // 查询webrtc会话
WebrtcPrivateSession webrtcSession = getWebrtcSession(session.getUserId(), uid); WebrtcPrivateSession webrtcSession = getWebrtcSession(session.getUserId(), uid);
// 更新接受者信息 // 更新接受者信息
@ -112,6 +118,7 @@ public class WebrtcPrivateServiceImpl implements WebrtcPrivateService {
@Override @Override
public void reject(Long uid) { public void reject(Long uid) {
UserSession session = SessionContext.getSession(); UserSession session = SessionContext.getSession();
log.info("拒绝通话,sid:{},uid:{}", session.getUserId(), uid);
// 查询webrtc会话 // 查询webrtc会话
WebrtcPrivateSession webrtcSession = getWebrtcSession(session.getUserId(), uid); WebrtcPrivateSession webrtcSession = getWebrtcSession(session.getUserId(), uid);
// 删除会话信息 // 删除会话信息
@ -141,6 +148,7 @@ public class WebrtcPrivateServiceImpl implements WebrtcPrivateService {
@Override @Override
public void cancel(Long uid) { public void cancel(Long uid) {
UserSession session = SessionContext.getSession(); UserSession session = SessionContext.getSession();
log.info("取消通话,sid:{},uid:{}", session.getUserId(), uid);
// 查询webrtc会话 // 查询webrtc会话
WebrtcPrivateSession webrtcSession = getWebrtcSession(session.getUserId(), uid); WebrtcPrivateSession webrtcSession = getWebrtcSession(session.getUserId(), uid);
// 删除会话信息 // 删除会话信息
@ -169,6 +177,7 @@ public class WebrtcPrivateServiceImpl implements WebrtcPrivateService {
@Override @Override
public void failed(Long uid, String reason) { public void failed(Long uid, String reason) {
UserSession session = SessionContext.getSession(); UserSession session = SessionContext.getSession();
log.info("通话失败,sid:{},uid:{},reason:{}", session.getUserId(), uid, reason);
// 查询webrtc会话 // 查询webrtc会话
WebrtcPrivateSession webrtcSession = getWebrtcSession(session.getUserId(), uid); WebrtcPrivateSession webrtcSession = getWebrtcSession(session.getUserId(), uid);
// 删除会话信息 // 删除会话信息
@ -199,6 +208,7 @@ public class WebrtcPrivateServiceImpl implements WebrtcPrivateService {
@Override @Override
public void handup(Long uid) { public void handup(Long uid) {
UserSession session = SessionContext.getSession(); UserSession session = SessionContext.getSession();
log.info("挂断通话,sid:{},uid:{}", session.getUserId(), uid);
// 查询webrtc会话 // 查询webrtc会话
WebrtcPrivateSession webrtcSession = getWebrtcSession(session.getUserId(), uid); WebrtcPrivateSession webrtcSession = getWebrtcSession(session.getUserId(), uid);
// 删除会话信息 // 删除会话信息

2
im-platform/src/main/java/com/bx/implatform/vo/PrivateMessageVO.java

@ -23,7 +23,7 @@ public class PrivateMessageVO {
@Schema(description = " 发送内容") @Schema(description = " 发送内容")
private String content; private String content;
@Schema(description = "消息内容类型 IMCmdType") @Schema(description = "消息内容类型 MessageType")
private Integer type; private Integer type;
@Schema(description = " 状态") @Schema(description = " 状态")

13
im-server/Dockerfile

@ -1,13 +0,0 @@
FROM openjdk:8-jdk-alpine
ENV APP_FILE im-server.jar
ENV APP_HOME /data/boxim
WORKDIR $APP_HOME
COPY ./dist/$APP_FILE $APP_HOME/
EXPOSE 8877
EXPOSE 8878
CMD java -jar $APP_HOME/$APP_FILE --spring.profiles.active=prod

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

@ -16,6 +16,6 @@ public final class ChannelAttrKey {
/** /**
* 心跳次数 * 心跳次数
*/ */
public static final String HEARTBEAT_TIMES = "HEARTBEAt_TIMES"; public static final String HEARTBEAT_TIMES = "HEARTBEAT_TIMES";
} }

2
im-server/src/main/java/com/bx/imserver/netty/processor/LoginProcessor.java

@ -62,7 +62,7 @@ public class LoginProcessor extends AbstractMessageProcessor<IMLoginInfo> {
AttributeKey<Integer> terminalAttr = AttributeKey.valueOf(ChannelAttrKey.TERMINAL_TYPE); AttributeKey<Integer> terminalAttr = AttributeKey.valueOf(ChannelAttrKey.TERMINAL_TYPE);
ctx.channel().attr(terminalAttr).set(terminal); ctx.channel().attr(terminalAttr).set(terminal);
// 初始化心跳次数 // 初始化心跳次数
AttributeKey<Long> heartBeatAttr = AttributeKey.valueOf("HEARTBEAt_TIMES"); AttributeKey<Long> heartBeatAttr = AttributeKey.valueOf(ChannelAttrKey.HEARTBEAT_TIMES);
ctx.channel().attr(heartBeatAttr).set(0L); ctx.channel().attr(heartBeatAttr).set(0L);
// 在redis上记录每个user的channelId,15秒没有心跳,则自动过期 // 在redis上记录每个user的channelId,15秒没有心跳,则自动过期
String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, userId.toString(), terminal.toString()); String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, userId.toString(), terminal.toString());

4
im-uniapp/common/messageType.js

@ -21,12 +21,12 @@ let isAction = function(type){
// 单人通话信令 // 单人通话信令
let isRtcPrivate = function(type){ let isRtcPrivate = function(type){
return type>=100 && type < 300; return type>=100 && type < 200;
} }
// 多人通话信令 // 多人通话信令
let isRtcGroup = function(type){ let isRtcGroup = function(type){
return type>=200 && type < 400; return type>=200 && type < 300;
} }

2
im-uniapp/store/chatStore.js

@ -335,6 +335,8 @@ export default defineStore('chatStore', {
chatKeys: chatKeys chatKeys: chatKeys
} }
uni.setStorageSync(key, chatsData) uni.setStorageSync(key, chatsData)
// 清理已删除的会话
this.chats = this.chats.filter(chat => !chat.delete)
}, },
clear(state) { clear(state) {
cacheChats = []; cacheChats = [];

4
im-web/src/api/messageType.js

@ -21,12 +21,12 @@ let isAction = function(type){
// 单人通话信令 // 单人通话信令
let isRtcPrivate = function(type){ let isRtcPrivate = function(type){
return type>=100 && type < 300; return type>=100 && type < 200;
} }
// 多人通话信令 // 多人通话信令
let isRtcGroup = function(type){ let isRtcGroup = function(type){
return type>=200 && type < 400; return type>=200 && type < 300;
} }

4
im-web/src/components/chat/ChatBox.vue

@ -156,9 +156,9 @@
let msgInfo = JSON.parse(JSON.stringify(file.msgInfo)); let msgInfo = JSON.parse(JSON.stringify(file.msgInfo));
msgInfo.content = JSON.stringify(data); msgInfo.content = JSON.stringify(data);
msgInfo.receipt = this.isReceipt; msgInfo.receipt = this.isReceipt;
this.sendMessageRequest(msgInfo).then((id) => { this.sendMessageRequest(msgInfo).then((m) => {
msgInfo.loadStatus = 'ok'; msgInfo.loadStatus = 'ok';
msgInfo.id = id; msgInfo.id = m.id;
this.isReceipt = false; this.isReceipt = false;
this.$store.commit("insertMessage", msgInfo); this.$store.commit("insertMessage", msgInfo);
}) })

5
im-web/src/store/chatStore.js

@ -322,6 +322,8 @@ export default {
chatKeys: chatKeys chatKeys: chatKeys
} }
localForage.setItem(key, chatsData) localForage.setItem(key, chatsData)
// 清理已删除的会话
state.chats = state.chats.filter(chat => !chat.delete)
}, },
clear(state) { clear(state) {
cacheChats = [] cacheChats = []
@ -337,8 +339,7 @@ export default {
localForage.getItem(key).then((chatsData) => { localForage.getItem(key).then((chatsData) => {
if (!chatsData) { if (!chatsData) {
resolve(); resolve();
} } else if (chatsData.chats) {
else if(chatsData.chats){
// 兼容旧版本 // 兼容旧版本
context.commit("initChats", chatsData); context.commit("initChats", chatsData);
resolve(); resolve();

Loading…
Cancel
Save