From 9a2d1a2defc040036597a3274e6e75d80d8a3a5f Mon Sep 17 00:00:00 2001 From: xsx <825657193@qq.com> Date: Sun, 22 Oct 2023 11:53:50 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=94=A8=E6=88=B7=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E4=BD=BF=E7=94=A8=E6=89=B9=E9=87=8F=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=EF=BC=8C=E5=87=8F=E5=B0=91io=E5=BC=80=E9=94=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/bx/imclient/IMClient.java | 14 ++++- .../java/com/bx/imclient/sender/IMSender.java | 29 ++++++++- .../implatform/controller/UserController.java | 11 +--- .../bx/implatform/service/IUserService.java | 2 - .../service/impl/UserServiceImpl.java | 48 ++++----------- im-ui/src/components/friend/AddFriend.vue | 59 ++++++++++++------- im-ui/src/view/Home.vue | 2 +- 7 files changed, 94 insertions(+), 71 deletions(-) diff --git a/im-client/src/main/java/com/bx/imclient/IMClient.java b/im-client/src/main/java/com/bx/imclient/IMClient.java index 52e1e16..a1e12ec 100644 --- a/im-client/src/main/java/com/bx/imclient/IMClient.java +++ b/im-client/src/main/java/com/bx/imclient/IMClient.java @@ -6,7 +6,9 @@ import com.bx.imcommon.model.IMPrivateMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; - +import java.util.Collection; +import java.util.Collections; +import java.util.List; @Configuration public class IMClient { @@ -23,6 +25,16 @@ public class IMClient { return imSender.isOnline(userId); } + /** + * 判断多个用户是否在线 + * + * @param userIds 用户id列表 + * @return 在线的用户列表 + */ + public List isOnline(List userIds){ + return imSender.isOnline(userIds); + } + /** * 发送私聊消息(发送结果通过MessageListener接收) * diff --git a/im-client/src/main/java/com/bx/imclient/sender/IMSender.java b/im-client/src/main/java/com/bx/imclient/sender/IMSender.java index 139351e..c92a990 100644 --- a/im-client/src/main/java/com/bx/imclient/sender/IMSender.java +++ b/im-client/src/main/java/com/bx/imclient/sender/IMSender.java @@ -1,5 +1,6 @@ package com.bx.imclient.sender; +import cn.hutool.core.collection.CollectionUtil; import com.bx.imclient.listener.MessageListenerMulticaster; import com.bx.imcommon.contant.IMRedisKey; import com.bx.imcommon.enums.IMCmdType; @@ -13,7 +14,7 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; @Service public class IMSender { @@ -153,4 +154,30 @@ public class IMSender { String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, userId.toString(), "*"); return !redisTemplate.keys(key).isEmpty(); } + + public List isOnline(List userIds){ + if(CollectionUtil.isEmpty(userIds)){ + return Collections.emptyList(); + } + // 把所有用户的key都存起来 + Map keyMap = new HashMap<>(); + for(Long id:userIds){ + for (Integer terminal : IMTerminalType.codes()) { + String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, id.toString(), terminal.toString()); + keyMap.put(key,id); + } + } + // 批量拉取 + List serverIds = redisTemplate.opsForValue().multiGet(keyMap.keySet()); + int idx = 0; + List onlineIds = new LinkedList<>(); + for (Map.Entry entry : keyMap.entrySet()) { + // serverid有值表示用户在线 + if(serverIds.get(idx++) != null){ + onlineIds.add(entry.getValue()); + } + } + // 去重并返回 + return onlineIds.stream().distinct().collect(Collectors.toList()); + } } diff --git a/im-platform/src/main/java/com/bx/implatform/controller/UserController.java b/im-platform/src/main/java/com/bx/implatform/controller/UserController.java index 8dc7bb6..63efcd8 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/UserController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/UserController.java @@ -1,6 +1,5 @@ package com.bx.implatform.controller; -import com.bx.implatform.dto.ModifyPwdDTO; import com.bx.implatform.entity.User; import com.bx.implatform.result.Result; import com.bx.implatform.result.ResultUtils; @@ -60,17 +59,9 @@ public class UserController { return ResultUtils.success(); } - - - @GetMapping("/findByNickName") - @ApiOperation(value = "查找用户",notes="根据昵称查找用户") - public Result> findByNickName(@NotEmpty(message = "用户昵称不可为空") @RequestParam("nickName") String nickName){ - return ResultUtils.success( userService.findUserByNickName(nickName)); - } - @GetMapping("/findByName") @ApiOperation(value = "查找用户",notes="根据用户名或昵称查找用户") - public Result> findByName(@NotEmpty(message = "用户名称不可为空") @RequestParam("name") String name){ + public Result> findByName(@RequestParam("name") String name){ return ResultUtils.success( userService.findUserByName(name)); } } diff --git a/im-platform/src/main/java/com/bx/implatform/service/IUserService.java b/im-platform/src/main/java/com/bx/implatform/service/IUserService.java index d960165..107d51e 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/IUserService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/IUserService.java @@ -25,8 +25,6 @@ public interface IUserService extends IService { void update(UserVO vo); - List findUserByNickName(String nickname); - List findUserByName(String name); List checkOnline(String userIds); diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java index 03e718f..0d43247 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java @@ -6,8 +6,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bx.imclient.IMClient; +import com.bx.imcommon.util.JwtUtil; import com.bx.implatform.config.JwtProperties; +import com.bx.implatform.dto.LoginDTO; import com.bx.implatform.dto.ModifyPwdDTO; +import com.bx.implatform.dto.RegisterDTO; import com.bx.implatform.entity.Friend; import com.bx.implatform.entity.GroupMember; import com.bx.implatform.entity.User; @@ -20,9 +23,6 @@ import com.bx.implatform.service.IUserService; import com.bx.implatform.session.SessionContext; import com.bx.implatform.session.UserSession; import com.bx.implatform.util.BeanUtils; -import com.bx.imcommon.util.JwtUtil; -import com.bx.implatform.dto.LoginDTO; -import com.bx.implatform.dto.RegisterDTO; import com.bx.implatform.vo.LoginVO; import com.bx.implatform.vo.UserVO; import lombok.extern.slf4j.Slf4j; @@ -32,7 +32,7 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.LinkedList; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -62,7 +62,7 @@ public class UserServiceImpl extends ServiceImpl implements IU * 用户登录 * * @param dto 登录dto - * @return + * @return 登录token */ @Override @@ -96,7 +96,7 @@ public class UserServiceImpl extends ServiceImpl implements IU * 用refreshToken换取新 token * * @param refreshToken - * @return + * @return 登录token */ @Override public LoginVO refreshToken(String refreshToken) { @@ -206,24 +206,6 @@ public class UserServiceImpl extends ServiceImpl implements IU } - /** - * 根据用户昵称查询用户,最多返回20条数据 - * - * @param nickname 用户昵称 - * @return - */ - @Override - public List findUserByNickName(String nickname) { - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - queryWrapper.like(User::getNickName,nickname).last("limit 20"); - List users = this.list(queryWrapper); - return users.stream().map(u-> { - UserVO vo = BeanUtils.copyProperties(u,UserVO.class); - vo.setOnline(imClient.isOnline(u.getId())); - return vo; - }).collect(Collectors.toList()); - } - /** * 根据用户昵称查询用户,最多返回20条数据 * @@ -238,9 +220,11 @@ public class UserServiceImpl extends ServiceImpl implements IU .like(User::getNickName,name) .last("limit 20"); List users = this.list(queryWrapper); + List userIds = users.stream().map(User::getId).collect(Collectors.toList()); + List onlineUserIds = imClient.isOnline(userIds); return users.stream().map(u-> { UserVO vo = BeanUtils.copyProperties(u,UserVO.class); - vo.setOnline(imClient.isOnline(u.getId())); + vo.setOnline(onlineUserIds.contains(u.getId())); return vo; }).collect(Collectors.toList()); } @@ -249,19 +233,13 @@ public class UserServiceImpl extends ServiceImpl implements IU * 判断用户是否在线,返回在线的用户id列表 * * @param userIds 用户id,多个用‘,’分割 - * @return + * @return 在线用户id列表 */ @Override public List checkOnline(String userIds) { - String[] idArr = userIds.split(","); - List onlineIds = new LinkedList<>(); - for(String userId:idArr){ - if(imClient.isOnline(Long.parseLong(userId))){ - onlineIds.add(Long.parseLong(userId)); - } - } - return onlineIds; + List userIdList = Arrays.stream(userIds.split(",")) + .map(Long::parseLong).collect(Collectors.toList()); + return imClient.isOnline(userIdList); } - } diff --git a/im-ui/src/components/friend/AddFriend.vue b/im-ui/src/components/friend/AddFriend.vue index 752cdb3..dbe4c5a 100644 --- a/im-ui/src/components/friend/AddFriend.vue +++ b/im-ui/src/components/friend/AddFriend.vue @@ -1,6 +1,6 @@