From 026a91aecb9f9731b7e85f728102fa5b243e30ec Mon Sep 17 00:00:00 2001 From: wxl <727869402@qq.com> Date: Wed, 1 Jan 2025 14:49:30 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90websocket=20=E6=9C=AA?= =?UTF-8?q?=E8=AF=BB=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dd/admin/business/api/AuthApi.java | 21 +++++++++++++++++++ .../dd/admin/business/chat/domain/ChatVo.java | 1 + .../business/chat/mapper/xml/ChatMapper.xml | 15 +++++++++++-- .../business/chat/service/ChatService.java | 2 ++ .../chat/service/impl/ChatServiceImpl.java | 20 ++++++++++++++++++ .../webSocket/handler/P2PMessageHandler.java | 2 +- 6 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/dd/admin/business/api/AuthApi.java b/src/main/java/com/dd/admin/business/api/AuthApi.java index 1c05e12..35186b6 100644 --- a/src/main/java/com/dd/admin/business/api/AuthApi.java +++ b/src/main/java/com/dd/admin/business/api/AuthApi.java @@ -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); + }; } diff --git a/src/main/java/com/dd/admin/business/chat/domain/ChatVo.java b/src/main/java/com/dd/admin/business/chat/domain/ChatVo.java index dab4898..65b932d 100644 --- a/src/main/java/com/dd/admin/business/chat/domain/ChatVo.java +++ b/src/main/java/com/dd/admin/business/chat/domain/ChatVo.java @@ -78,4 +78,5 @@ public class ChatVo { private String authorId; private String authorName; private String authorAvatar; + private String unReadCount; } diff --git a/src/main/java/com/dd/admin/business/chat/mapper/xml/ChatMapper.xml b/src/main/java/com/dd/admin/business/chat/mapper/xml/ChatMapper.xml index 8cfd0c2..3759ae3 100644 --- a/src/main/java/com/dd/admin/business/chat/mapper/xml/ChatMapper.xml +++ b/src/main/java/com/dd/admin/business/chat/mapper/xml/ChatMapper.xml @@ -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 diff --git a/src/main/java/com/dd/admin/business/chat/service/ChatService.java b/src/main/java/com/dd/admin/business/chat/service/ChatService.java index 714653d..0fa37f7 100644 --- a/src/main/java/com/dd/admin/business/chat/service/ChatService.java +++ b/src/main/java/com/dd/admin/business/chat/service/ChatService.java @@ -26,4 +26,6 @@ public interface ChatService extends IService { List selectChatDetail(ChatDto chatDto); List selectChatList(String authorId); + void readMessage(String authorId,String loginId); + Integer selectUnReadCount(String authorId); } diff --git a/src/main/java/com/dd/admin/business/chat/service/impl/ChatServiceImpl.java b/src/main/java/com/dd/admin/business/chat/service/impl/ChatServiceImpl.java index f174042..6b5e8ba 100644 --- a/src/main/java/com/dd/admin/business/chat/service/impl/ChatServiceImpl.java +++ b/src/main/java/com/dd/admin/business/chat/service/impl/ChatServiceImpl.java @@ -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 implements Ch public List selectChatList(String authorId) { return baseMapper.selectChatList(authorId); } + + @Override + public void readMessage(String authorId, String loginId) { + LambdaUpdateWrapper 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 queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(Chat::getToId,authorId); + queryWrapper.eq(Chat::getMessageStatus,0); + return baseMapper.selectCount(queryWrapper); + } } diff --git a/src/main/java/com/dd/admin/business/webSocket/handler/P2PMessageHandler.java b/src/main/java/com/dd/admin/business/webSocket/handler/P2PMessageHandler.java index 6269756..fa4b12e 100644 --- a/src/main/java/com/dd/admin/business/webSocket/handler/P2PMessageHandler.java +++ b/src/main/java/com/dd/admin/business/webSocket/handler/P2PMessageHandler.java @@ -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 contexts = Tio.getChannelContextsByUserid(context.getGroupContext(), chat.getToId()); //用户在线 if(contexts!=null && contexts.size() > 0) { Set contextList = contexts.getObj(); //t-io支持多点登录,获取的是一个集合,向集合发送聊天信息 for (ChannelContext con : contextList) { chat.setMessageStatus(1); TioUtil.sendMessage(con, "5", chatVo); } } //也要给我自己发用于数据回显 //t-io支持多点登录,获取的是一个集合,因为此账号可能存在多个连接哦 SetWithLock contexts1 = Tio.getChannelContextsByUserid(context.getGroupContext(), chat.getFromId()); //用户在线 if(contexts1!=null && contexts1.size() > 0) { Set contextList = contexts1.getObj(); //t-io支持多点登录,获取的是一个集合,向集合发送聊天信息 for (ChannelContext con : contextList) { TioUtil.sendMessage(con, "5", chatVo); } } return null; }} \ No newline at end of file +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 contexts = Tio.getChannelContextsByUserid(context.getGroupContext(), chat.getToId()); //用户在线 if(contexts!=null && contexts.size() > 0) { Set contextList = contexts.getObj(); //t-io支持多点登录,获取的是一个集合,向集合发送聊天信息 for (ChannelContext con : contextList) { TioUtil.sendMessage(con, "5", chatVo); } } //也要给我自己发用于数据回显 //t-io支持多点登录,获取的是一个集合,因为此账号可能存在多个连接哦 SetWithLock contexts1 = Tio.getChannelContextsByUserid(context.getGroupContext(), chat.getFromId()); //用户在线 if(contexts1!=null && contexts1.size() > 0) { Set contextList = contexts1.getObj(); //t-io支持多点登录,获取的是一个集合,向集合发送聊天信息 for (ChannelContext con : contextList) { TioUtil.sendMessage(con, "5", chatVo); } } return null; }} \ No newline at end of file