集成websocket 未读提示

This commit is contained in:
wxl 2025-01-01 14:49:30 +08:00
parent a116c6276c
commit 026a91aecb
6 changed files with 58 additions and 3 deletions

View File

@ -8,6 +8,7 @@ import com.dd.admin.business.author.entity.Author;
import com.dd.admin.business.author.service.AuthorService;
import com.dd.admin.business.chat.domain.ChatDto;
import com.dd.admin.business.chat.domain.ChatVo;
import com.dd.admin.business.chat.entity.Chat;
import com.dd.admin.business.chat.service.ChatService;
import com.dd.admin.business.file.entity.File;
import com.dd.admin.business.file.service.FileService;
@ -641,4 +642,24 @@ public class AuthApi {
return ResultBean.success(chatVos);
}
@ApiOperation(value = "读取消息")
@ApiOperationSupport(order = 1)
@PostMapping("/api/auth/readAuthorMessage")
@OperLog(operModule = "读取消息",operType = OperType.OTHER,operDesc = "读取消息")
public ResultBean readAuthorMessage(String authorId) {
String loginId = String.valueOf(request.getAttribute("authorId"));
chatService.readMessage(authorId,loginId);
return ResultBean.success(loginId);
};
@ApiOperation(value = "查询我的未读消息数量")
@ApiOperationSupport(order = 1)
@GetMapping("/api/auth/getUnReadCount")
@OperLog(operModule = "查询我的未读消息数量",operType = OperType.OTHER,operDesc = "查询我的未读消息数量")
public ResultBean getUnReadCount() {
String loginId = String.valueOf(request.getAttribute("authorId"));
Integer unReadCount = chatService.selectUnReadCount(loginId);
return ResultBean.success(unReadCount);
};
}

View File

@ -78,4 +78,5 @@ public class ChatVo {
private String authorId;
private String authorName;
private String authorAvatar;
private String unReadCount;
}

View File

@ -66,7 +66,17 @@
a.FROM_NAME AS authorName,
b.AVATAR_URL AS authorAvatar,
a.content,
a.create_time
a.create_time,
(
SELECT
count(1)
FROM
business_chat ca
WHERE
ca.FROM_ID = a.FROM_ID
AND ca.to_id = #{authorId}
and ca.MESSAGE_STATUS = 0
) as unReadCount
FROM
business_chat a
LEFT JOIN
@ -79,7 +89,8 @@
a.TO_NAME AS authorName,
b.AVATAR_URL AS authorAvatar,
a.content,
a.create_time
a.create_time,
0 as unReadCount
FROM
business_chat a
LEFT JOIN

View File

@ -26,4 +26,6 @@ public interface ChatService extends IService<Chat> {
List<ChatVo> selectChatDetail(ChatDto chatDto);
List<ChatVo> selectChatList(String authorId);
void readMessage(String authorId,String loginId);
Integer selectUnReadCount(String authorId);
}

View File

@ -1,5 +1,8 @@
package com.dd.admin.business.chat.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dd.admin.common.model.PageFactory;
@ -43,4 +46,21 @@ public class ChatServiceImpl extends ServiceImpl<ChatMapper, Chat> implements Ch
public List<ChatVo> selectChatList(String authorId) {
return baseMapper.selectChatList(authorId);
}
@Override
public void readMessage(String authorId, String loginId) {
LambdaUpdateWrapper<Chat> queryWrapper = new LambdaUpdateWrapper();
queryWrapper.eq(Chat::getFromId,authorId);
queryWrapper.eq(Chat::getToId,loginId);
queryWrapper.set(Chat::getMessageStatus,1);
this.update(queryWrapper);
}
@Override
public Integer selectUnReadCount(String authorId) {
LambdaQueryWrapper<Chat> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(Chat::getToId,authorId);
queryWrapper.eq(Chat::getMessageStatus,0);
return baseMapper.selectCount(queryWrapper);
}
}

View File

@ -1 +1 @@
package com.dd.admin.business.webSocket.handler; import cn.hutool.core.bean.BeanUtil; import com.dd.admin.business.chat.domain.ChatVo; import com.dd.admin.business.chat.entity.Chat; import com.dd.admin.business.chat.service.ChatService; import com.dd.admin.business.webSocket.MsgHandlerInterface; import com.dd.admin.business.webSocket.util.TioUtil; import com.dd.admin.common.utils.AddressUtils; import com.dd.admin.common.utils.HttpContext; import com.dd.admin.common.utils.IPUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.tio.core.ChannelContext; import org.tio.core.Tio; import org.tio.http.common.HttpRequest; import org.tio.utils.lock.SetWithLock; import javax.annotation.PostConstruct; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Date; import java.util.Map; import java.util.Set; @Component @Slf4j @Service("5") public class P2PMessageHandler implements MsgHandlerInterface { public static P2PMessageHandler handler; @Autowired ChatService chatService; @Override public Object handler(Map map, ChannelContext context ){ Chat chat = BeanUtil.toBean(map, Chat.class); chat.setIpAddress(context.getClientNode().getIp()); chat.setIpRealAddress(AddressUtils.getRealAddress(chat.getIpAddress())); //ip真实地址 chatService.save(chat); ChatVo chatVo = chatService.selectChat(chat.getChatId()); //t-io支持多点登录,获取的是一个集合,因为此账号可能存在多个连接哦 SetWithLock<ChannelContext> contexts = Tio.getChannelContextsByUserid(context.getGroupContext(), chat.getToId()); //用户在线 if(contexts!=null && contexts.size() > 0) { Set<ChannelContext> contextList = contexts.getObj(); //t-io支持多点登录,获取的是一个集合,向集合发送聊天信息 for (ChannelContext con : contextList) { chat.setMessageStatus(1); TioUtil.sendMessage(con, "5", chatVo); } } //也要给我自己发用于数据回显 //t-io支持多点登录,获取的是一个集合,因为此账号可能存在多个连接哦 SetWithLock<ChannelContext> contexts1 = Tio.getChannelContextsByUserid(context.getGroupContext(), chat.getFromId()); //用户在线 if(contexts1!=null && contexts1.size() > 0) { Set<ChannelContext> contextList = contexts1.getObj(); //t-io支持多点登录,获取的是一个集合,向集合发送聊天信息 for (ChannelContext con : contextList) { TioUtil.sendMessage(con, "5", chatVo); } } return null; }}
package com.dd.admin.business.webSocket.handler; import cn.hutool.core.bean.BeanUtil; import com.dd.admin.business.chat.domain.ChatVo; import com.dd.admin.business.chat.entity.Chat; import com.dd.admin.business.chat.service.ChatService; import com.dd.admin.business.webSocket.MsgHandlerInterface; import com.dd.admin.business.webSocket.util.TioUtil; import com.dd.admin.common.utils.AddressUtils; import com.dd.admin.common.utils.HttpContext; import com.dd.admin.common.utils.IPUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.tio.core.ChannelContext; import org.tio.core.Tio; import org.tio.http.common.HttpRequest; import org.tio.utils.lock.SetWithLock; import javax.annotation.PostConstruct; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Date; import java.util.Map; import java.util.Set; @Component @Slf4j @Service("5") public class P2PMessageHandler implements MsgHandlerInterface { public static P2PMessageHandler handler; @Autowired ChatService chatService; @Override public Object handler(Map map, ChannelContext context ){ Chat chat = BeanUtil.toBean(map, Chat.class); chat.setIpAddress(context.getClientNode().getIp()); chat.setIpRealAddress(AddressUtils.getRealAddress(chat.getIpAddress())); //ip真实地址 chatService.save(chat); ChatVo chatVo = chatService.selectChat(chat.getChatId()); //t-io支持多点登录,获取的是一个集合,因为此账号可能存在多个连接哦 SetWithLock<ChannelContext> contexts = Tio.getChannelContextsByUserid(context.getGroupContext(), chat.getToId()); //用户在线 if(contexts!=null && contexts.size() > 0) { Set<ChannelContext> contextList = contexts.getObj(); //t-io支持多点登录,获取的是一个集合,向集合发送聊天信息 for (ChannelContext con : contextList) { TioUtil.sendMessage(con, "5", chatVo); } } //也要给我自己发用于数据回显 //t-io支持多点登录,获取的是一个集合,因为此账号可能存在多个连接哦 SetWithLock<ChannelContext> contexts1 = Tio.getChannelContextsByUserid(context.getGroupContext(), chat.getFromId()); //用户在线 if(contexts1!=null && contexts1.size() > 0) { Set<ChannelContext> contextList = contexts1.getObj(); //t-io支持多点登录,获取的是一个集合,向集合发送聊天信息 for (ChannelContext con : contextList) { TioUtil.sendMessage(con, "5", chatVo); } } return null; }}