From eced63e5c09a0fd1b52878aa26f8ef5093f85f60 Mon Sep 17 00:00:00 2001 From: imalasong <2879499479@qq.com> Date: Sat, 1 Jul 2023 23:58:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=8C=BF=E5=90=8D?= =?UTF-8?q?=E7=BE=A4=E8=81=8A=E7=9B=B8=E5=85=B3bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/db/db.sql | 6 +- .../muchat/common/log/aop/ApiLogAspect.java | 2 +- im-server/pom.xml | 18 ++++++ .../muchat/server/common/entity/Group.java | 2 + .../muchat/server/common/enums/GroupEnum.java | 24 +++++++ .../controller/ChatSessionController.java | 3 + .../controller/GroupMessageController.java | 1 + .../server/mapper/GroupMessageMapper.java | 8 +++ .../server/service/IGroupMemberService.java | 5 ++ .../muchat/server/service/IGroupService.java | 3 + .../service/impl/ChatSessionServiceImpl.java | 62 ++++++++++++++++++- .../service/impl/GroupMemberServiceImpl.java | 29 +++++++++ .../service/impl/GroupMessageServiceImpl.java | 21 +++---- .../server/service/impl/GroupServiceImpl.java | 11 ++++ .../server/service/impl/UserServiceImpl.java | 24 +++---- .../src/main/resources/application-dev.yml | 4 +- .../resources/mappers/GroupMessageMapper.xml | 18 ++++++ 17 files changed, 213 insertions(+), 28 deletions(-) create mode 100644 im-server/src/main/java/io/pisceshub/muchat/server/common/enums/GroupEnum.java create mode 100644 im-server/src/main/resources/mappers/GroupMessageMapper.xml diff --git a/docs/db/db.sql b/docs/db/db.sql index 6226001..2374e4f 100644 --- a/docs/db/db.sql +++ b/docs/db/db.sql @@ -83,4 +83,8 @@ ALTER TABLE `im_user` ADD COLUMN `account_type` int NULL DEFAULT 0 COMMENT '账号类型:0正常,1匿名' AFTER `oauth_src`, ADD COLUMN `anonymou_id` varchar(255) NULL COMMENT '匿名id' AFTER `account_type`; -INSERT INTO `im_group` (`id`, `name`, `owner_id`, `head_image`, `head_image_thumb`, `notice`, `remark`, `deleted`, `created_time`) VALUES (0, '万人大群聊', 1, '', '', '', '', 0, '2023-06-17 11:43:40'); \ No newline at end of file +ALTER TABLE `im_group` +ADD COLUMN `group_type` int NULL DEFAULT 0 COMMENT '群类型:0正常,1匿名群'; + +INSERT INTO `im_group` (`id`, `name`, `owner_id`, `head_image`, `head_image_thumb`, `notice`, `remark`, `deleted`, `created_time`,`group_type`) VALUES (0, '万人大群聊', 1, '', '', '', '', 0, '2023-06-17 11:43:40',1); + diff --git a/im-commom/im-common-log/src/main/java/io/pisceshub/muchat/common/log/aop/ApiLogAspect.java b/im-commom/im-common-log/src/main/java/io/pisceshub/muchat/common/log/aop/ApiLogAspect.java index f7931d7..0b0449c 100644 --- a/im-commom/im-common-log/src/main/java/io/pisceshub/muchat/common/log/aop/ApiLogAspect.java +++ b/im-commom/im-common-log/src/main/java/io/pisceshub/muchat/common/log/aop/ApiLogAspect.java @@ -94,7 +94,7 @@ private TPair buildApiInfo(ProceedingJoinPoint joinPoint) throws Method targetMethod = joinPoint.getTarget().getClass().getDeclaredMethod(methodSignature.getName(), methodSignature.getMethod().getParameterTypes()); ApiOperation apiOperation = targetMethod.getAnnotation(ApiOperation.class); - if(apiAnnotation!=null){ + if(apiOperation!=null){ apiName = apiOperation.value(); } return new TPair<>(moduleName,apiName); diff --git a/im-server/pom.xml b/im-server/pom.xml index 232c506..fd3fe1f 100644 --- a/im-server/pom.xml +++ b/im-server/pom.xml @@ -150,6 +150,24 @@ ${project.artifactId} + + + src/main/java + + **/*.yml + + + false + + + src/main/resources + + **/*.* + + + false + + org.springframework.boot diff --git a/im-server/src/main/java/io/pisceshub/muchat/server/common/entity/Group.java b/im-server/src/main/java/io/pisceshub/muchat/server/common/entity/Group.java index 4ba5ffc..b46bc92 100644 --- a/im-server/src/main/java/io/pisceshub/muchat/server/common/entity/Group.java +++ b/im-server/src/main/java/io/pisceshub/muchat/server/common/entity/Group.java @@ -71,6 +71,8 @@ public class Group extends Model { @TableField("created_time") private Date createdTime; + @TableField("group_type") + private Integer groupType; @Override protected Serializable pkVal() { diff --git a/im-server/src/main/java/io/pisceshub/muchat/server/common/enums/GroupEnum.java b/im-server/src/main/java/io/pisceshub/muchat/server/common/enums/GroupEnum.java new file mode 100644 index 0000000..fe163bc --- /dev/null +++ b/im-server/src/main/java/io/pisceshub/muchat/server/common/enums/GroupEnum.java @@ -0,0 +1,24 @@ +package io.pisceshub.muchat.server.common.enums; + +import lombok.Getter; + + +public interface GroupEnum { + + @Getter + enum GroupType{ + Plain(0,"正常"), + Anonymous(1,"匿名"), + ; + private Integer code; + + private String msg; + + GroupType(Integer code,String msg){ + this.code = code; + this.msg = msg; + } + + } + +} diff --git a/im-server/src/main/java/io/pisceshub/muchat/server/controller/ChatSessionController.java b/im-server/src/main/java/io/pisceshub/muchat/server/controller/ChatSessionController.java index ddc4c53..65b7594 100644 --- a/im-server/src/main/java/io/pisceshub/muchat/server/controller/ChatSessionController.java +++ b/im-server/src/main/java/io/pisceshub/muchat/server/controller/ChatSessionController.java @@ -1,5 +1,6 @@ package io.pisceshub.muchat.server.controller; +import io.pisceshub.muchat.common.log.annotation.ApiLog; import io.pisceshub.muchat.server.aop.annotation.AnonymousUserCheck; import io.pisceshub.muchat.server.common.vo.user.ChatSessionInfoResp; import io.pisceshub.muchat.server.util.SessionContext; @@ -42,6 +43,7 @@ public Result save(@RequestBody @Valid ChatSessionAddReq vo){ * 查询聊天会话 * @return */ + @ApiLog @GetMapping("/list") public Result> pages(){ return iChatSessionService.list(); @@ -53,6 +55,7 @@ public Result> pages(){ * @param vo * @return */ + @AnonymousUserCheck @DeleteMapping("/del") public Result del(@RequestBody @Valid ChatSessionAddReq vo){ diff --git a/im-server/src/main/java/io/pisceshub/muchat/server/controller/GroupMessageController.java b/im-server/src/main/java/io/pisceshub/muchat/server/controller/GroupMessageController.java index 4250a0e..9bb81f2 100644 --- a/im-server/src/main/java/io/pisceshub/muchat/server/controller/GroupMessageController.java +++ b/im-server/src/main/java/io/pisceshub/muchat/server/controller/GroupMessageController.java @@ -47,6 +47,7 @@ public Result pullUnreadMessage(){ return ResultUtils.success(); } + @ApiLog @GetMapping("/history") @ApiOperation(value = "查询聊天记录",notes="查询聊天记录") public Result> recallMessage(@NotNull(message = "群聊id不能为空") @RequestParam Long groupId, diff --git a/im-server/src/main/java/io/pisceshub/muchat/server/mapper/GroupMessageMapper.java b/im-server/src/main/java/io/pisceshub/muchat/server/mapper/GroupMessageMapper.java index 9f70c87..13b4e10 100644 --- a/im-server/src/main/java/io/pisceshub/muchat/server/mapper/GroupMessageMapper.java +++ b/im-server/src/main/java/io/pisceshub/muchat/server/mapper/GroupMessageMapper.java @@ -2,8 +2,16 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import io.pisceshub.muchat.server.common.entity.GroupMessage; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; public interface GroupMessageMapper extends BaseMapper { + List findHistoryMessage(@Param("groupId") Long groupId, + @Param("startTime") Date startTime, + @Param("beforeMessageId") Long beforeMessageId, + @Param("count") Integer count); } diff --git a/im-server/src/main/java/io/pisceshub/muchat/server/service/IGroupMemberService.java b/im-server/src/main/java/io/pisceshub/muchat/server/service/IGroupMemberService.java index a130267..ebb735f 100644 --- a/im-server/src/main/java/io/pisceshub/muchat/server/service/IGroupMemberService.java +++ b/im-server/src/main/java/io/pisceshub/muchat/server/service/IGroupMemberService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import io.pisceshub.muchat.server.common.entity.GroupMember; +import io.pisceshub.muchat.server.common.entity.User; import java.util.List; @@ -25,4 +26,8 @@ public interface IGroupMemberService extends IService { void removeByGroupId(Long groupId); void removeByGroupAndUserId(Long groupId,Long userId); + + boolean joinGroup(Long groupId, User user); + + boolean memberExsit(Long userId, Long targetId); } diff --git a/im-server/src/main/java/io/pisceshub/muchat/server/service/IGroupService.java b/im-server/src/main/java/io/pisceshub/muchat/server/service/IGroupService.java index a369a4e..18005aa 100644 --- a/im-server/src/main/java/io/pisceshub/muchat/server/service/IGroupService.java +++ b/im-server/src/main/java/io/pisceshub/muchat/server/service/IGroupService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import io.pisceshub.muchat.server.common.entity.Group; +import io.pisceshub.muchat.server.common.entity.GroupMember; import io.pisceshub.muchat.server.common.vo.user.GroupInviteReq; import io.pisceshub.muchat.server.common.vo.user.GroupMemberResp; import io.pisceshub.muchat.server.common.vo.user.GroupVO; @@ -31,4 +32,6 @@ public interface IGroupService extends IService { GroupVO findById(Long groupId); List findGroupMembers(Long groupId); + + List findByGroupType(Integer code); } diff --git a/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/ChatSessionServiceImpl.java b/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/ChatSessionServiceImpl.java index 5f5f0f4..93d6894 100644 --- a/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/ChatSessionServiceImpl.java +++ b/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/ChatSessionServiceImpl.java @@ -2,17 +2,23 @@ import cn.hutool.core.collection.CollUtil; import io.pisceshub.muchat.common.core.enums.ChatType; +import io.pisceshub.muchat.common.core.enums.ResultCode; import io.pisceshub.muchat.common.core.model.CommonMessageInfo; import io.pisceshub.muchat.common.core.model.GroupMessageInfo; import io.pisceshub.muchat.common.core.model.PrivateMessageInfo; import io.pisceshub.muchat.common.core.utils.Result; import io.pisceshub.muchat.common.core.utils.ResultUtils; import io.pisceshub.muchat.server.common.dto.ChatSessionInfoDto; +import io.pisceshub.muchat.server.common.entity.Group; +import io.pisceshub.muchat.server.common.entity.User; +import io.pisceshub.muchat.server.common.enums.GroupEnum; +import io.pisceshub.muchat.server.common.enums.UserEnum; import io.pisceshub.muchat.server.common.vo.common.PageReq; import io.pisceshub.muchat.server.common.vo.common.PageResp; import io.pisceshub.muchat.server.common.vo.user.ChatSessionInfoResp; import io.pisceshub.muchat.server.common.vo.user.GroupVO; import io.pisceshub.muchat.server.common.vo.user.UserVO; +import io.pisceshub.muchat.server.exception.BusinessException; import io.pisceshub.muchat.server.exception.GlobalException; import io.pisceshub.muchat.server.exception.NotJoinGroupException; import io.pisceshub.muchat.server.service.*; @@ -24,6 +30,7 @@ import org.springframework.stereotype.Service; import java.util.*; +import java.util.stream.Collectors; /** * @author xiaochangbai @@ -47,6 +54,9 @@ public class ChatSessionServiceImpl implements IChatSessionService { @Autowired private IPrivateMessageService iPrivateMessageService; + @Autowired + private IGroupMemberService iGroupMemberService; + @Override public boolean save(Long userId,ChatSessionAddReq vo) { @@ -56,9 +66,59 @@ public boolean save(Long userId,ChatSessionAddReq vo) { return chatSessionSave.add(userId,dto); } + + private Result> annoySessionList(Long userId){ + List groupList = iGroupService.findByGroupType(GroupEnum.GroupType.Anonymous.getCode()); + Set list = groupList.stream().map(e->{ + ChatSessionInfoResp chatSessionInfoResp = new ChatSessionInfoResp(); + chatSessionInfoResp.setChatType(ChatType.GROUP); + chatSessionInfoResp.setTargetId(e.getId()); + chatSessionInfoResp.setName(e.getName()); + chatSessionInfoResp.setHeadImage(e.getHeadImage()); + chatSessionInfoResp.setUnReadCount(0L); + chatSessionInfoResp.setGroupMessages(Collections.emptyList()); + chatSessionInfoResp.setLastSendTime(e.getCreatedTime().getTime()); + return chatSessionInfoResp; + }).collect(Collectors.toSet()); + if(CollUtil.isEmpty(list)){ + return ResultUtils.success(Collections.emptySet()); + } + + User user = null; + for(ChatSessionInfoResp resp:list){ + if(!iGroupMemberService.memberExsit(userId,resp.getTargetId())){ + //加入群聊 + if(user==null){ + user = iUserService.getById(userId); + if(user==null){ + throw new BusinessException(ResultCode.INVALID_TOKEN); + } + } + iGroupMemberService.joinGroup(resp.getTargetId(),user); + }else{ + //已经加入过,查询历史消息 + List historyMessage = iGroupMessageService.findHistoryMessage(resp.getTargetId(), null); + if(CollUtil.isNotEmpty(historyMessage)){ + resp.setLastSendTime(historyMessage.get(0).getSendTime().getTime()); + resp.setLastContent(historyMessage.get(0).getContent()); + resp.setGroupMessages(historyMessage); + } + } + + + } + return ResultUtils.success(list); + } + @Override public Result> list() { - Set list = chatSessionSave.list(SessionContext.getUserId()); + SessionContext.UserSessionInfo session = SessionContext.getSession(); + Set list = null; + if(UserEnum.AccountType.Anonymous.getCode().equals(session.getAccountType())){ + return this.annoySessionList(session.getId()); + }else{ + list = chatSessionSave.list(SessionContext.getUserId()); + } if(CollUtil.isEmpty(list)){ return ResultUtils.success(Collections.emptySet()); } diff --git a/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/GroupMemberServiceImpl.java b/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/GroupMemberServiceImpl.java index 8ff3da1..4bdb396 100644 --- a/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/GroupMemberServiceImpl.java +++ b/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/GroupMemberServiceImpl.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import io.pisceshub.muchat.server.common.contant.RedisKey; import io.pisceshub.muchat.server.common.entity.GroupMember; +import io.pisceshub.muchat.server.common.entity.User; import io.pisceshub.muchat.server.mapper.GroupMemberMapper; import io.pisceshub.muchat.server.service.IGroupMemberService; import org.springframework.cache.annotation.CacheConfig; @@ -12,6 +13,7 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -140,4 +142,31 @@ public void removeByGroupAndUserId(Long groupId, Long userId) { .set(GroupMember::getQuit,true); this.update(wrapper); } + + + @Override + public boolean joinGroup(Long groupId, User user){ + GroupMember groupMember = new GroupMember(); + groupMember.setGroupId(groupId); + groupMember.setUserId(user.getId()); + groupMember.setAliasName(user.getNickName()); + groupMember.setRemark("匿名"); + groupMember.setHeadImage(user.getHeadImage()); + groupMember.setCreatedTime(new Date()); + groupMember.setQuit(false); + //查询是否已经加入过 + Integer count = lambdaQuery().eq(GroupMember::getGroupId, groupId) + .eq(GroupMember::getUserId, groupMember.getUserId()).count(); + if(count>0){ + return true; + } + + return this.save(groupMember); + } + + @Override + public boolean memberExsit(Long userId, Long groupId) { + return lambdaQuery().eq(GroupMember::getGroupId,groupId) + .eq(GroupMember::getUserId,userId).count()>0; + } } diff --git a/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/GroupMessageServiceImpl.java b/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/GroupMessageServiceImpl.java index e0786bc..4a42a5f 100644 --- a/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/GroupMessageServiceImpl.java +++ b/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/GroupMessageServiceImpl.java @@ -50,6 +50,14 @@ public class GroupMessageServiceImpl extends ServiceImpl findHistoryMessage(Long groupId, Long lastMessageI if (member == null || member.getQuit()) { throw new GlobalException(ResultCode.PROGRAM_ERROR, "您已不在群聊中"); } + List messages = groupMessageMapper.findHistoryMessage(groupId,member.getCreatedTime(),lastMessageId,defaultQueryMessageCount); // 查询聊天记录,只查询加入群聊时间之后的消息 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(GroupMessage::getGroupId, groupId) - .gt(GroupMessage::getSendTime, member.getCreatedTime()) - .ne(GroupMessage::getStatus, MessageStatus.RECALL.code()); - - if (lastMessageId != null) { - queryWrapper.lt(GroupMessage::getId, lastMessageId); - } - queryWrapper.orderByDesc(GroupMessage::getId) - .last("limit 15"); - List messages = this.list(queryWrapper); List messageInfos = messages.stream().map(m -> { GroupMessageInfo info = BeanUtils.copyProperties(m, GroupMessageInfo.class); return info; }).collect(Collectors.toList()); - log.info("拉取群聊记录,用户id:{},群聊id:{},数量:{}", userId, groupId, messageInfos.size()); return messageInfos; } diff --git a/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/GroupServiceImpl.java b/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/GroupServiceImpl.java index fae37c8..b0baec1 100644 --- a/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/GroupServiceImpl.java +++ b/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/GroupServiceImpl.java @@ -8,6 +8,8 @@ import io.pisceshub.muchat.server.common.entity.Group; import io.pisceshub.muchat.server.common.entity.GroupMember; import io.pisceshub.muchat.server.common.entity.User; +import io.pisceshub.muchat.server.common.enums.GroupEnum; +import io.pisceshub.muchat.server.exception.BusinessException; import io.pisceshub.muchat.server.exception.GlobalException; import io.pisceshub.muchat.server.exception.NotJoinGroupException; import io.pisceshub.muchat.server.mapper.GroupMapper; @@ -256,6 +258,9 @@ public void invite(GroupInviteReq vo) { if(group == null){ throw new GlobalException(ResultCode.PROGRAM_ERROR, "群聊不存在"); } + if(GroupEnum.GroupType.Anonymous.getCode().equals(group.getGroupType())){ + throw new BusinessException("不允许加入"); + } // 群聊人数校验 List members = groupMemberService.findByGroupId(vo.getGroupId()); long size = members.stream().filter(m->!m.getQuit()).count(); @@ -324,4 +329,10 @@ public List findGroupMembers(Long groupId) { return vos; } + @Override + public List findByGroupType(Integer code) { + return lambdaQuery().eq(Group::getGroupType,code).orderByAsc(Group::getCreatedTime).list(); + } + + } diff --git a/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/UserServiceImpl.java b/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/UserServiceImpl.java index 2109f69..91033ba 100644 --- a/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/UserServiceImpl.java +++ b/im-server/src/main/java/io/pisceshub/muchat/server/service/impl/UserServiceImpl.java @@ -1,5 +1,6 @@ package io.pisceshub.muchat.server.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; @@ -11,8 +12,10 @@ import io.pisceshub.muchat.common.core.enums.ChatType; import io.pisceshub.muchat.server.common.contant.Constant; import io.pisceshub.muchat.server.common.entity.Friend; +import io.pisceshub.muchat.server.common.entity.Group; import io.pisceshub.muchat.server.common.entity.GroupMember; import io.pisceshub.muchat.server.common.entity.User; +import io.pisceshub.muchat.server.common.enums.GroupEnum; import io.pisceshub.muchat.server.common.enums.UserEnum; import io.pisceshub.muchat.server.common.vo.user.*; import io.pisceshub.muchat.server.exception.BusinessException; @@ -59,7 +62,7 @@ public class UserServiceImpl extends ServiceImpl implements IU private IGroupService iGroupService; @Autowired - private IChatSessionService iChatSessionService; + private IGroupMemberService iGroupMemberService; /** * 用户登录 @@ -325,16 +328,15 @@ public LoginResp anonymousLogin(AnonymousLoginReq req) { } private void anonyUserInit(User user) { - //加入默认群聊 - GroupInviteReq inviteReq = - GroupInviteReq.builder().groupId(-1L).friendIds(Arrays.asList(user.getId())).build(); - iGroupService.invite(inviteReq); - - //会话列表 - ChatSessionAddReq sessionAddReq = new ChatSessionAddReq(); - sessionAddReq.setChatType(ChatType.GROUP); - sessionAddReq.setTargetId(-1L); - iChatSessionService.save(user.getId(),sessionAddReq); + //查询出所有匿名群聊 + List groupList = iGroupService.findByGroupType(GroupEnum.GroupType.Anonymous.getCode()); + if(CollUtil.isEmpty(groupList)){ + return; + } + for(Group g:groupList){ + iGroupMemberService.joinGroup(g.getId(),user); + } + } diff --git a/im-server/src/main/resources/application-dev.yml b/im-server/src/main/resources/application-dev.yml index c95b654..bc7c197 100644 --- a/im-server/src/main/resources/application-dev.yml +++ b/im-server/src/main/resources/application-dev.yml @@ -26,12 +26,12 @@ spring: mybatis-plus: configuration: # 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射 - map-underscore-to-camel-case: false + map-underscore-to-camel-case: true #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # mapper mapper-locations: # *.xml的具体路径 - - classpath*:mapper/*.xml + - classpath:mappers/*.xml minio: endpoint: http://127.0.0.1:9000 #内网地址 public: http://127.0.0.1:9000 #外网访问地址 diff --git a/im-server/src/main/resources/mappers/GroupMessageMapper.xml b/im-server/src/main/resources/mappers/GroupMessageMapper.xml new file mode 100644 index 0000000..5dd8411 --- /dev/null +++ b/im-server/src/main/resources/mappers/GroupMessageMapper.xml @@ -0,0 +1,18 @@ + + + + + + +