From d29b43d4c0c2f23fe86facaa0bf6a6b4845abfcb Mon Sep 17 00:00:00 2001 From: Kkuil <3024067144@qq.com> Date: Tue, 17 Oct 2023 21:10:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=BE=A4=E4=B8=BB=E5=92=8C=E7=AE=A1=E7=90=86=E5=91=98=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/chat/dao/GroupMemberDao.java | 21 ++++++++++ .../domain/vo/response/ws/ChatMemberResp.java | 8 ++++ .../resources/application-test.properties | 18 ++++---- .../src/main/resources/application.yml | 2 +- mallchat-custom-server/pom.xml | 4 +- .../custom/chat/service/ChatService.java | 2 +- .../chat/service/adapter/MemberAdapter.java | 6 +-- .../chat/service/impl/ChatServiceImpl.java | 41 +++++++++++-------- .../mallchat/custom/ac/CreateTokenTest.java | 4 +- 9 files changed, 70 insertions(+), 36 deletions(-) diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/chat/dao/GroupMemberDao.java b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/dao/GroupMemberDao.java index 3511855..307521f 100644 --- a/mallchat-common/src/main/java/com/abin/mallchat/common/chat/dao/GroupMemberDao.java +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/chat/dao/GroupMemberDao.java @@ -5,10 +5,14 @@ import com.abin.mallchat.common.chat.domain.enums.GroupRoleEnum; import com.abin.mallchat.common.chat.mapper.GroupMemberMapper; import com.abin.mallchat.common.chat.service.cache.GroupMemberCache; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import io.swagger.models.auth.In; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -23,6 +27,7 @@ import java.util.stream.Collectors; public class GroupMemberDao extends ServiceImpl { @Autowired + @Lazy private GroupMemberCache groupMemberCache; public List getMemberUidList(Long groupId) { @@ -42,6 +47,22 @@ public class GroupMemberDao extends ServiceImpl return list.stream().map(GroupMember::getUid).collect(Collectors.toList()); } + /** + * 批量获取成员群角色 + * + * @param groupId 群ID + * @param uidList 用户列表 + * @return 成员群角色列表 + */ + public Map getMemberMapRole(Long groupId, List uidList) { + List list = lambdaQuery() + .eq(GroupMember::getGroupId, groupId) + .in(GroupMember::getUid, uidList) + .select(GroupMember::getUid, GroupMember::getRole) + .list(); + return list.stream().collect(Collectors.toMap(GroupMember::getUid, GroupMember::getRole)); + } + public GroupMember getMember(Long groupId, Long uid) { return lambdaQuery() .eq(GroupMember::getGroupId, groupId) diff --git a/mallchat-common/src/main/java/com/abin/mallchat/common/user/domain/vo/response/ws/ChatMemberResp.java b/mallchat-common/src/main/java/com/abin/mallchat/common/user/domain/vo/response/ws/ChatMemberResp.java index 25aa117..3e54cad 100644 --- a/mallchat-common/src/main/java/com/abin/mallchat/common/user/domain/vo/response/ws/ChatMemberResp.java +++ b/mallchat-common/src/main/java/com/abin/mallchat/common/user/domain/vo/response/ws/ChatMemberResp.java @@ -1,5 +1,6 @@ package com.abin.mallchat.common.user.domain.vo.response.ws; +import com.fasterxml.jackson.annotation.JsonInclude; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; @@ -17,6 +18,7 @@ import java.util.Date; @Builder @AllArgsConstructor @NoArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) public class ChatMemberResp { @ApiModelProperty("uid") private Long uid; @@ -25,6 +27,12 @@ public class ChatMemberResp { */ @ApiModelProperty("在线状态 1在线 2离线") private Integer activeStatus; + + /** + * 角色ID + */ + private Integer roleId; + @ApiModelProperty("最后一次上下线时间") private Date lastOptTime; } diff --git a/mallchat-common/src/main/resources/application-test.properties b/mallchat-common/src/main/resources/application-test.properties index d35be3a..88a485c 100644 --- a/mallchat-common/src/main/resources/application-test.properties +++ b/mallchat-common/src/main/resources/application-test.properties @@ -1,25 +1,25 @@ -#todo 记得把这些配置信息补充了 -##################mysql配置################## +#todo ???????????? +##################mysql??################## mallchat.mysql.ip=127.0.0.1 mallchat.mysql.port=3306 mallchat.mysql.db=mallchat mallchat.mysql.username=root mallchat.mysql.password=123456 -##################redis配置################## +##################redis??################## mallchat.redis.host=127.0.0.1 mallchat.redis.port=6379 mallchat.redis.password=123456 ##################jwt################## mallchat.jwt.secret=dsfsdfsdfsdfsd -##################微信公众号信息################## +##################???????################## mallchat.wx.callback=http://limeng-test.nat300.top/ mallchat.wx.appId=wx6cb0974bff30cce0 mallchat.wx.secret=072c615d9704d2e9bf0a048407928258 -# 接口配置里的Token值 +# ??????Token? mallchat.wx.token=sdfsf -# 接口配置里的EncodingAESKey值 +# ??????EncodingAESKey? mallchat.wx.aesKey=sha1 -##################OSS配置################## +##################OSS??################## oss.enabled=true oss.type=minio oss.endpoint=http://localhost:9000 @@ -30,11 +30,11 @@ oss.bucketName=default rocketmq.name-server=127.0.0.1:9876 rocketmq.access-key=root rocketmq.secret-key=123456 -##################gpt配置################## +##################gpt??################## mallchat.chatgpt.use=false mallchat.chatgpt.uid=10001 mallchat.chatgpt.key=sk-wvWM0xGcxFfsddfsgxixbXK5tHovM mallchat.chatgpt.proxyUrl=https://123.cc mallchat.chatglm2.use=false mallchat.chatglm2.url=http://v32134.cc -mallchat.chatglm2.uid=10002 \ No newline at end of file +mallchat.chatglm2.uid=10002 diff --git a/mallchat-common/src/main/resources/application.yml b/mallchat-common/src/main/resources/application.yml index ee78bd5..5b59c70 100644 --- a/mallchat-common/src/main/resources/application.yml +++ b/mallchat-common/src/main/resources/application.yml @@ -11,7 +11,7 @@ mybatis-plus: spring: profiles: #运行的环境 - active: my-prod + active: test application: name: mallchat datasource: diff --git a/mallchat-custom-server/pom.xml b/mallchat-custom-server/pom.xml index f47902c..ed62ab8 100644 --- a/mallchat-custom-server/pom.xml +++ b/mallchat-custom-server/pom.xml @@ -42,7 +42,7 @@ org.springframework.boot spring-boot-maven-plugin - + org.apache.maven.pluginsmaven-compiler-plugin88 - \ No newline at end of file + diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/ChatService.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/ChatService.java index 5f9e973..35b111e 100644 --- a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/ChatService.java +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/ChatService.java @@ -54,7 +54,7 @@ public interface ChatService { * @param request * @return */ - CursorPageBaseResp getMemberPage(List memberUidList, CursorPageBaseReq request); + CursorPageBaseResp getMemberPage(List memberUidList, MemberReq request); /** * 获取消息列表 diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/adapter/MemberAdapter.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/adapter/MemberAdapter.java index 88c4dbd..50c884e 100644 --- a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/adapter/MemberAdapter.java +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/adapter/MemberAdapter.java @@ -1,7 +1,9 @@ package com.abin.mallchat.custom.chat.service.adapter; +import com.abin.mallchat.common.chat.dao.GroupMemberDao; import com.abin.mallchat.common.chat.domain.entity.GroupMember; import com.abin.mallchat.common.chat.domain.enums.GroupRoleEnum; +import com.abin.mallchat.common.chat.service.cache.GroupMemberCache; import com.abin.mallchat.common.user.domain.entity.User; import com.abin.mallchat.common.user.domain.entity.UserFriend; import com.abin.mallchat.common.user.domain.enums.WSBaseResp; @@ -32,10 +34,8 @@ import static com.abin.mallchat.common.user.domain.vo.response.ws.WSMemberChange @Component @Slf4j public class MemberAdapter { - @Autowired - private UserCache userCache; - public static List buildMember(List list) { + public static List buildMember(Long roomId, List list) { return list.stream().map(a -> { ChatMemberResp resp = new ChatMemberResp(); resp.setActiveStatus(a.getActiveStatus()); diff --git a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/impl/ChatServiceImpl.java b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/impl/ChatServiceImpl.java index bd1780e..d25861e 100644 --- a/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/impl/ChatServiceImpl.java +++ b/mallchat-custom-server/src/main/java/com/abin/mallchat/custom/chat/service/impl/ChatServiceImpl.java @@ -95,7 +95,7 @@ public class ChatServiceImpl implements ChatService { @Autowired private RoomGroupCache roomGroupCache; @Autowired - private MQProducer mqProducer; + private RoomGroupDao roomGroupDao; /** * 发送消息 @@ -104,20 +104,20 @@ public class ChatServiceImpl implements ChatService { @Transactional public Long sendMsg(ChatMessageReq request, Long uid) { check(request, uid); - AbstractMsgHandler msgHandler = MsgHandlerFactory.getStrategyNoNull(request.getMsgType());//todo 这里先不扩展,后续再改 + AbstractMsgHandler msgHandler = MsgHandlerFactory.getStrategyNoNull(request.getMsgType());// todo 这里先不扩展,后续再改 msgHandler.checkMsg(request, uid); - //同步获取消息的跳转链接标题 + // 同步获取消息的跳转链接标题 Message insert = MessageAdapter.buildMsgSave(request, uid); messageDao.save(insert); msgHandler.saveMsg(insert, request); - //发布消息发送事件 + // 发布消息发送事件 applicationEventPublisher.publishEvent(new MessageSendEvent(this, insert.getId())); return insert.getId(); } private void check(ChatMessageReq request, Long uid) { Room room = roomCache.get(request.getRoomId()); - if (room.isHotRoom()) {//全员群跳过校验 + if (room.isHotRoom()) {// 全员群跳过校验 return; } if (room.isRoomFriend()) { @@ -145,36 +145,41 @@ public class ChatServiceImpl implements ChatService { } @Override - public CursorPageBaseResp getMemberPage(List memberUidList, CursorPageBaseReq request) { + public CursorPageBaseResp getMemberPage(List memberUidList, MemberReq request) { Pair pair = ChatMemberHelper.getCursorPair(request.getCursor()); ChatActiveStatusEnum activeStatusEnum = pair.getKey(); String timeCursor = pair.getValue(); - List resultList = new ArrayList<>();//最终列表 + List resultList = new ArrayList<>();// 最终列表 Boolean isLast = Boolean.FALSE; if (activeStatusEnum == ChatActiveStatusEnum.ONLINE) {//在线列表 CursorPageBaseResp cursorPage = userDao.getCursorPage(memberUidList, new CursorPageBaseReq(request.getPageSize(), timeCursor), ChatActiveStatusEnum.ONLINE); - resultList.addAll(MemberAdapter.buildMember(cursorPage.getList()));//添加在线列表 + resultList.addAll(MemberAdapter.buildMember(request.getRoomId(), cursorPage.getList()));//添加在线列表 if (cursorPage.getIsLast()) {//如果是最后一页,从离线列表再补点数据 activeStatusEnum = ChatActiveStatusEnum.OFFLINE; Integer leftSize = request.getPageSize() - cursorPage.getList().size(); cursorPage = userDao.getCursorPage(memberUidList, new CursorPageBaseReq(leftSize, null), ChatActiveStatusEnum.OFFLINE); - resultList.addAll(MemberAdapter.buildMember(cursorPage.getList()));//添加离线线列表 + resultList.addAll(MemberAdapter.buildMember(request.getRoomId(), cursorPage.getList()));//添加离线线列表 } timeCursor = cursorPage.getCursor(); isLast = cursorPage.getIsLast(); } else if (activeStatusEnum == ChatActiveStatusEnum.OFFLINE) {//离线列表 CursorPageBaseResp cursorPage = userDao.getCursorPage(memberUidList, new CursorPageBaseReq(request.getPageSize(), timeCursor), ChatActiveStatusEnum.OFFLINE); - resultList.addAll(MemberAdapter.buildMember(cursorPage.getList()));//添加离线线列表 + resultList.addAll(MemberAdapter.buildMember(request.getRoomId(), cursorPage.getList()));//添加离线线列表 timeCursor = cursorPage.getCursor(); isLast = cursorPage.getIsLast(); } - //组装结果 + // 获取群成员角色ID + List uidList = resultList.stream().map(ChatMemberResp::getUid).collect(Collectors.toList()); + RoomGroup roomGroup = roomGroupDao.getByRoomId(request.getRoomId()); + Map uidMapRole = groupMemberDao.getMemberMapRole(roomGroup.getId(), uidList); + resultList.forEach(member -> member.setRoleId(uidMapRole.get(member.getUid()))); + // 组装结果 return new CursorPageBaseResp<>(ChatMemberHelper.generateCursor(activeStatusEnum, timeCursor), isLast, resultList); } @Override public CursorPageBaseResp getMsgPage(ChatMessagePageReq request, Long receiveUid) { - //用最后一条消息id,来限制被踢出的人能看见的最大一条消息 + // 用最后一条消息id,来限制被踢出的人能看见的最大一条消息 Long lastMsgId = getLastMsgId(request.getRoomId(), receiveUid); CursorPageBaseResp cursorPage = messageDao.getCursorPage(request.getRoomId(), request, lastMsgId); if (cursorPage.isEmpty()) { @@ -222,16 +227,16 @@ public class ChatServiceImpl implements ChatService { @Override public void recallMsg(Long uid, ChatMessageBaseReq request) { Message message = messageDao.getById(request.getMsgId()); - //校验能不能执行撤回 + // 校验能不能执行撤回 checkRecall(uid, message); - //执行消息撤回 + // 执行消息撤回 recallMsgHandler.recall(uid, message); } @Override @Cacheable(cacheNames = "member", key = "'memberList.'+#req.roomId") public List getMemberList(ChatMessageMemberReq req) { - if (Objects.equals(1L, req.getRoomId())) {//大群聊可看见所有人 + if (Objects.equals(1L, req.getRoomId())) {// 大群聊可看见所有人 return userDao.getMemberList() .stream() .map(a -> { @@ -259,7 +264,7 @@ public class ChatServiceImpl implements ChatService { AssertUtil.isNotEmpty(message, "消息id有误"); AssertUtil.equal(uid, message.getFromUid(), "只能查看自己的消息"); CursorPageBaseResp page; - if (request.getSearchType() == 1) {//已读 + if (request.getSearchType() == 1) {// 已读 page = contactDao.getReadPage(message, request); } else { page = contactDao.getUnReadPage(message, request); @@ -306,12 +311,12 @@ public class ChatServiceImpl implements ChatService { return new ArrayList<>(); } Map replyMap = new HashMap<>(); - //批量查出回复的消息 + // 批量查出回复的消息 List replyIds = messages.stream().map(Message::getReplyMsgId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(replyIds)) { replyMap = messageDao.listByIds(replyIds).stream().collect(Collectors.toMap(Message::getId, Function.identity())); } - //查询消息标志 + // 查询消息标志 List msgMark = messageMarkDao.getValidMarkByMsgIdBatch(messages.stream().map(Message::getId).collect(Collectors.toList())); return MessageAdapter.buildMsgResp(messages, replyMap, msgMark, receiveUid); } diff --git a/mallchat-custom-server/src/test/java/com/abin/mallchat/custom/ac/CreateTokenTest.java b/mallchat-custom-server/src/test/java/com/abin/mallchat/custom/ac/CreateTokenTest.java index 2acb222..aace46f 100644 --- a/mallchat-custom-server/src/test/java/com/abin/mallchat/custom/ac/CreateTokenTest.java +++ b/mallchat-custom-server/src/test/java/com/abin/mallchat/custom/ac/CreateTokenTest.java @@ -17,14 +17,14 @@ public class CreateTokenTest { @Test public void create(){ String token = JWT.create() - .withClaim("uid", 10004L) // 只存一个uid信息,其他的自己去redis查 + .withClaim("uid", 10276L) // 只存一个uid信息,其他的自己去redis查 .withClaim("createTime", new Date()) .sign(Algorithm.HMAC256("dsfsdfsdfsdfsd")); // signature log.info("生成的token为 {}",token); try { - JWTVerifier verifier = JWT.require(Algorithm.HMAC256("dsfsdfsdfsdfsc")).build(); + JWTVerifier verifier = JWT.require(Algorithm.HMAC256("dsfsdfsdfsdfsd")).build(); DecodedJWT jwt = verifier.verify(token); log.info(jwt.getClaims().toString()); } catch (Exception e) {