From 78af8b199e4dcf44a81aee70e8c9d3cab0cb62b7 Mon Sep 17 00:00:00 2001 From: "xie.bx" Date: Mon, 13 Nov 2023 23:12:25 +0800 Subject: [PATCH 01/13] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=A2=AB@=E5=90=8E?= =?UTF-8?q?=E4=B8=80=E7=9B=B4=E7=82=B9=E4=B8=8D=E6=8E=89=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-ui/src/store/chatStore.js | 3 ++- im-uniapp/store/chatStore.js | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/im-ui/src/store/chatStore.js b/im-ui/src/store/chatStore.js index 9ad646b..bf204fa 100644 --- a/im-ui/src/store/chatStore.js +++ b/im-ui/src/store/chatStore.js @@ -151,7 +151,8 @@ export default { chat.unreadCount++; } // 是否有人@我 - if(!msgInfo.selfSend && chat.type=="GROUP" && msgInfo.atUserIds){ + if(!msgInfo.selfSend && chat.type=="GROUP" && msgInfo.atUserIds + && msgInfo.status != MESSAGE_STATUS.READED){ let userId = userStore.state.userInfo.id; if(msgInfo.atUserIds.indexOf(userId)>=0){ chat.atMe = true; diff --git a/im-uniapp/store/chatStore.js b/im-uniapp/store/chatStore.js index 67a2bf3..333bd97 100644 --- a/im-uniapp/store/chatStore.js +++ b/im-uniapp/store/chatStore.js @@ -143,13 +143,13 @@ export default { chat.lastSendTime = msgInfo.sendTime; chat.sendNickName = msgInfo.sendNickName; } - // 未读加1 if (!msgInfo.selfSend && msgInfo.status != MESSAGE_STATUS.READED) { chat.unreadCount++; } // 是否有人@我 - if(!msgInfo.selfSend && chat.type=="GROUP" && msgInfo.atUserIds){ + if(!msgInfo.selfSend && chat.type=="GROUP" && msgInfo.atUserIds + && msgInfo.status != MESSAGE_STATUS.READED){ let userId = userStore.state.userInfo.id; if(msgInfo.atUserIds.indexOf(userId)>=0){ chat.atMe = true; From 3e1cdd903283876585b6fd413dd148987e0d34a0 Mon Sep 17 00:00:00 2001 From: "xie.bx" Date: Tue, 14 Nov 2023 23:12:43 +0800 Subject: [PATCH 02/13] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9B=B4=E6=8D=A2?= =?UTF-8?q?=E5=A4=B4=E5=83=8F=E5=A4=B1=E8=B4=A5=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-ui/.env.development | 2 +- im-ui/src/components/common/HeadImage.vue | 1 - im-ui/src/components/setting/Setting.vue | 9 +- im-ui/src/view/Group.vue | 6 +- im-ui/src/view/Login.vue | 226 ++++++++++-------- im-ui/src/view/Register.vue | 6 +- .../chat-message-item/chat-message-item.vue | 2 +- 7 files changed, 133 insertions(+), 119 deletions(-) diff --git a/im-ui/.env.development b/im-ui/.env.development index 4eee0c7..9762bd8 100644 --- a/im-ui/.env.development +++ b/im-ui/.env.development @@ -2,7 +2,7 @@ ENV = 'development' # app名称 VUE_APP_NAME = "盒子IM" -// 接口请求地址 +# 接口请求地址 VUE_APP_BASE_API = '/api' # ws地址 VUE_APP_WS_URL = 'ws://localhost:8878/im' \ No newline at end of file diff --git a/im-ui/src/components/common/HeadImage.vue b/im-ui/src/components/common/HeadImage.vue index 72ea6e0..084ab50 100644 --- a/im-ui/src/components/common/HeadImage.vue +++ b/im-ui/src/components/common/HeadImage.vue @@ -41,7 +41,6 @@ }, methods:{ showUserInfo(e){ - console.log(this.id) if(this.id && this.id>0){ this.$http({ url: `/user/find/${this.id}`, diff --git a/im-ui/src/components/setting/Setting.vue b/im-ui/src/components/setting/Setting.vue index beff208..366d7c6 100644 --- a/im-ui/src/components/setting/Setting.vue +++ b/im-ui/src/components/setting/Setting.vue @@ -7,7 +7,6 @@ :showLoading="true" :maxSize="maxSize" @success="onUploadSuccess" - :fileTypes="['image/jpeg', 'image/png', 'image/jpg','image/webp']"> @@ -38,13 +37,11 @@ + + \ No newline at end of file From b514078e98c78a8b4d39f9330c5b75a9e554a1f4 Mon Sep 17 00:00:00 2001 From: "xie.bx" Date: Tue, 14 Nov 2023 23:18:48 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E5=A4=87=E6=A1=88logo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-ui/src/assets/image/icp_logo.png | Bin 0 -> 11143 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 im-ui/src/assets/image/icp_logo.png diff --git a/im-ui/src/assets/image/icp_logo.png b/im-ui/src/assets/image/icp_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6fe667f73fa1ae8c37d33b5bece6f602a861f7bf GIT binary patch literal 11143 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 literal 0 HcmV?d00001 From efce916335a6da9a55446833d4022534a49ada56 Mon Sep 17 00:00:00 2001 From: "xie.bx" Date: Tue, 14 Nov 2023 23:23:53 +0800 Subject: [PATCH 05/13] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E7=BE=A4=E8=81=8A=E5=90=8E=E6=B2=A1=E6=9C=89=E5=A4=B4=E5=83=8F?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/bx/implatform/service/impl/GroupServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java index d8597d3..eecff2c 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java @@ -74,6 +74,7 @@ public class GroupServiceImpl extends ServiceImpl implements GroupMember groupMember = new GroupMember(); groupMember.setGroupId(group.getId()); groupMember.setUserId(user.getId()); + groupMember.setHeadImage(user.getHeadImageThumb()); groupMember.setAliasName(StringUtils.isEmpty(vo.getAliasName())?session.getNickName():vo.getAliasName()); groupMember.setRemark(StringUtils.isEmpty(vo.getRemark())?group.getName():vo.getRemark()); groupMemberService.save(groupMember); @@ -87,7 +88,7 @@ public class GroupServiceImpl extends ServiceImpl implements /** * 修改群聊信息 - * + * * @param vo 群聊信息 * @return 群聊信息 **/ From f21092674236efc03571703d3659e868d63c236a Mon Sep 17 00:00:00 2001 From: xsx <825657193@qq.com> Date: Wed, 15 Nov 2023 18:47:33 +0800 Subject: [PATCH 06/13] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FriendServiceImpl.java | 39 ++++++++----------- .../service/impl/GroupMemberServiceImpl.java | 16 ++++---- .../service/impl/GroupMessageServiceImpl.java | 20 ++++------ .../service/impl/GroupServiceImpl.java | 19 +++------ .../impl/PrivateMessageServiceImpl.java | 8 ++-- .../service/impl/UserServiceImpl.java | 22 +++-------- .../service/impl/WebrtcServiceImpl.java | 6 +-- 7 files changed, 47 insertions(+), 83 deletions(-) diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/FriendServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/FriendServiceImpl.java index 3d450a8..01f65fd 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/FriendServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/FriendServiceImpl.java @@ -1,6 +1,8 @@ package com.bx.implatform.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.implatform.contant.RedisKey; import com.bx.implatform.entity.Friend; @@ -8,14 +10,14 @@ import com.bx.implatform.entity.User; import com.bx.implatform.enums.ResultCode; import com.bx.implatform.exception.GlobalException; import com.bx.implatform.mapper.FriendMapper; +import com.bx.implatform.mapper.UserMapper; import com.bx.implatform.service.IFriendService; -import com.bx.implatform.service.IUserService; import com.bx.implatform.session.SessionContext; import com.bx.implatform.session.UserSession; import com.bx.implatform.vo.FriendVO; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.aop.framework.AopContext; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; @@ -26,25 +28,24 @@ import java.util.List; @Slf4j -@CacheConfig(cacheNames= RedisKey.IM_CACHE_FRIEND) @Service +@AllArgsConstructor +@CacheConfig(cacheNames= RedisKey.IM_CACHE_FRIEND) public class FriendServiceImpl extends ServiceImpl implements IFriendService { - @Autowired - private IUserService userService; + private final UserMapper userMapper; /** * 查询用户的所有好友 * * @param userId 用户id - * @return + * @return 好友列表 */ @Override public List findFriendByUserId(Long userId) { - QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.lambda().eq(Friend::getUserId,userId); - List friends = this.list(queryWrapper); - return friends; + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(Friend::getUserId,userId); + return this.list(queryWrapper); } @@ -52,9 +53,8 @@ public class FriendServiceImpl extends ServiceImpl impleme * 添加好友,互相建立好友关系 * * @param friendId 好友的用户id - * @return */ - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void addFriend(Long friendId) { long userId = SessionContext.getSession().getUserId(); @@ -73,9 +73,8 @@ public class FriendServiceImpl extends ServiceImpl impleme * 删除好友,双方都会解除好友关系 * * @param friendId 好友的用户id - * @return */ - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void delFriend(Long friendId) { long userId = SessionContext.getSession().getUserId(); @@ -92,7 +91,6 @@ public class FriendServiceImpl extends ServiceImpl impleme * * @param userId1 用户1的id * @param userId2 用户2的id - * @return */ @Cacheable(key="#userId1+':'+#userId2") @Override @@ -109,7 +107,6 @@ public class FriendServiceImpl extends ServiceImpl impleme * 更新好友信息,主要是头像和昵称 * * @param vo 好友vo - * @return */ @Override public void update(FriendVO vo) { @@ -135,7 +132,6 @@ public class FriendServiceImpl extends ServiceImpl impleme * * @param userId 用户id * @param friendId 好友的用户id - * @return */ @CacheEvict(key="#userId+':'+#friendId") public void bindFriend(Long userId, Long friendId) { @@ -147,7 +143,7 @@ public class FriendServiceImpl extends ServiceImpl impleme Friend friend = new Friend(); friend.setUserId(userId); friend.setFriendId(friendId); - User friendInfo = userService.getById(friendId); + User friendInfo = userMapper.selectById(friendId); friend.setFriendHeadImage(friendInfo.getHeadImage()); friend.setFriendNickName(friendInfo.getNickName()); this.save(friend); @@ -160,7 +156,6 @@ public class FriendServiceImpl extends ServiceImpl impleme * * @param userId 用户id * @param friendId 好友的用户id - * @return */ @CacheEvict(key="#userId+':'+#friendId") public void unbindFriend(Long userId, Long friendId) { @@ -169,9 +164,7 @@ public class FriendServiceImpl extends ServiceImpl impleme .eq(Friend::getUserId,userId) .eq(Friend::getFriendId,friendId); List friends = this.list(queryWrapper); - friends.stream().forEach(friend -> { - this.removeById(friend.getId()); - }); + friends.forEach(friend -> this.removeById(friend.getId())); } @@ -179,7 +172,7 @@ public class FriendServiceImpl extends ServiceImpl impleme * 查询指定的某个好友信息 * * @param friendId 好友的用户id - * @return + * @return 好友信息 */ @Override public FriendVO findFriend(Long friendId) { diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java index ec70f53..135c282 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java @@ -18,8 +18,8 @@ import java.util.List; import java.util.stream.Collectors; -@CacheConfig(cacheNames = RedisKey.IM_CACHE_GROUP_MEMBER_ID) @Service +@CacheConfig(cacheNames = RedisKey.IM_CACHE_GROUP_MEMBER_ID) public class GroupMemberServiceImpl extends ServiceImpl implements IGroupMemberService { @@ -27,7 +27,7 @@ public class GroupMemberServiceImpl extends ServiceImpl findByUserId(Long userId) { @@ -84,7 +84,7 @@ public class GroupMemberServiceImpl extends ServiceImpl findByGroupId(Long groupId) { @@ -98,7 +98,7 @@ public class GroupMemberServiceImpl extends ServiceImpl implements IGroupMessageService { - @Autowired private IGroupService groupService; - @Autowired private IGroupMemberService groupMemberService; - @Autowired private RedisTemplate redisTemplate; - @Autowired private IMClient imClient; /** @@ -105,7 +101,7 @@ public class GroupMessageServiceImpl extends ServiceImpl members = groupMemberService.findByUserId(session.getUserId()); List ids = members.stream().map(GroupMember::getGroupId).collect(Collectors.toList()); if(CollectionUtil.isEmpty(ids)){ - return Collections.EMPTY_LIST; + return new ArrayList<>(); } // 只能拉取最近1个月的 Date minDate = DateTimeUtils.addMonths(new Date(), -1); @@ -221,7 +217,7 @@ public class GroupMessageServiceImpl extends ServiceImpl atIds = Arrays.asList(StrUtil.split(m.getAtUserIds(),",")); - vo.setAtUserIds(atIds.stream().map(id->Long.parseLong(id)).collect(Collectors.toList())); + vo.setAtUserIds(atIds.stream().map(Long::parseLong).collect(Collectors.toList())); return vo; }).collect(Collectors.toList()); // 消息状态,数据库没有存群聊的消息状态,需要从redis取 diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java index d8597d3..42c290e 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java @@ -23,9 +23,9 @@ import com.bx.implatform.util.BeanUtils; import com.bx.implatform.vo.GroupInviteVO; import com.bx.implatform.vo.GroupMemberVO; import com.bx.implatform.vo.GroupVO; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; @@ -42,18 +42,11 @@ import java.util.stream.Collectors; @Slf4j @CacheConfig(cacheNames = RedisKey.IM_CACHE_GROUP) @Service +@AllArgsConstructor public class GroupServiceImpl extends ServiceImpl implements IGroupService { - - @Autowired private IUserService userService; - - @Autowired private IGroupMemberService groupMemberService; - - @Autowired private IFriendService friendsService; - - @Autowired private IMClient imClient; /** @@ -92,7 +85,7 @@ public class GroupServiceImpl extends ServiceImpl implements * @return 群聊信息 **/ @CacheEvict(value = "#vo.getId()") - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public GroupVO modifyGroup(GroupVO vo) { UserSession session = SessionContext.getSession(); @@ -121,7 +114,7 @@ public class GroupServiceImpl extends ServiceImpl implements * * @param groupId 群聊id **/ - @Transactional + @Transactional(rollbackFor = Exception.class) @CacheEvict(value = "#groupId") @Override public void deleteGroup(Long groupId) { @@ -301,9 +294,7 @@ public class GroupServiceImpl extends ServiceImpl implements GroupMemberVO vo = BeanUtils.copyProperties(m,GroupMemberVO.class); vo.setOnline(onlineUserIds.contains(m.getUserId())); return vo; - }).sorted((m1,m2)->{ - return m2.getOnline().compareTo(m1.getOnline()); - }).collect(Collectors.toList()); + }).sorted((m1,m2)-> m2.getOnline().compareTo(m1.getOnline())).collect(Collectors.toList()); } } diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java index 88f34b5..d707be8 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java @@ -24,11 +24,12 @@ import com.bx.implatform.session.SessionContext; import com.bx.implatform.session.UserSession; import com.bx.implatform.util.BeanUtils; import com.bx.implatform.dto.PrivateMessageDTO; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; @@ -36,12 +37,11 @@ import java.util.stream.Collectors; @Slf4j @Service +@AllArgsConstructor public class PrivateMessageServiceImpl extends ServiceImpl implements IPrivateMessageService { - @Autowired private IFriendService friendService; - @Autowired private IMClient imClient; /** @@ -199,7 +199,7 @@ public class PrivateMessageServiceImpl extends ServiceImpl friends = friendService.findFriendByUserId(session.getUserId()); if (friends.isEmpty()) { - return Collections.EMPTY_LIST; + return new ArrayList<>(); } List friendIds = friends.stream().map(Friend::getFriendId).collect(Collectors.toList()); // 获取当前用户的消息 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 8e905dc..9518a3c 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 @@ -27,41 +27,29 @@ import com.bx.implatform.util.BeanUtils; import com.bx.implatform.vo.LoginVO; import com.bx.implatform.vo.OnlineTerminalVO; import com.bx.implatform.vo.UserVO; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @Slf4j @Service +@AllArgsConstructor public class UserServiceImpl extends ServiceImpl implements IUserService { - @Autowired RedisTemplate redisTemplate; - - @Autowired private PasswordEncoder passwordEncoder; - - @Autowired private IGroupMemberService groupMemberService; - - @Autowired private IFriendService friendService; - - @Autowired private JwtProperties jwtProperties; - - @Autowired private IMClient imClient; + /** * 用户登录 * @@ -177,7 +165,7 @@ public class UserServiceImpl extends ServiceImpl implements IU throw new GlobalException(ResultCode.PROGRAM_ERROR,"不允许修改其他用户的信息!"); } User user = this.getById(vo.getId()); - if(null == user){ + if(Objects.isNull(user)){ throw new GlobalException(ResultCode.PROGRAM_ERROR,"用户不存在"); } // 更新好友昵称和头像 diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcServiceImpl.java index 64177c2..c80c3c8 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcServiceImpl.java @@ -13,8 +13,8 @@ import com.bx.implatform.service.IWebrtcService; import com.bx.implatform.session.SessionContext; import com.bx.implatform.session.UserSession; import com.bx.implatform.session.WebrtcSession; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestBody; @@ -25,13 +25,11 @@ import java.util.concurrent.TimeUnit; @Slf4j @Service +@AllArgsConstructor public class WebrtcServiceImpl implements IWebrtcService { - @Autowired private IMClient imClient; - @Autowired private RedisTemplate redisTemplate; - @Autowired private ICEServerConfig iceServerConfig; @Override From 4f9d302fcfe5f71e40daea0627c29b206afd580d Mon Sep 17 00:00:00 2001 From: "xie.bx" Date: Wed, 15 Nov 2023 21:45:04 +0800 Subject: [PATCH 07/13] =?UTF-8?q?springboot=20=E7=89=88=E6=9C=AC=E5=8D=87?= =?UTF-8?q?=E8=87=B32.7.17?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/bx/imclient/task/AbstractPullMessageTask.java | 10 ++++++---- im-platform/pom.xml | 4 ++++ .../com/bx/implatform/config/GlobalCorsConfig.java | 2 +- .../src/main/java/com/bx/implatform/dto/LoginDTO.java | 1 - im-platform/src/main/resources/application.yml | 7 ++++++- .../com/bx/imserver/task/AbstractPullMessageTask.java | 8 +++++--- pom.xml | 8 +++++++- 7 files changed, 29 insertions(+), 11 deletions(-) diff --git a/im-client/src/main/java/com/bx/imclient/task/AbstractPullMessageTask.java b/im-client/src/main/java/com/bx/imclient/task/AbstractPullMessageTask.java index a77c45f..a21fe14 100644 --- a/im-client/src/main/java/com/bx/imclient/task/AbstractPullMessageTask.java +++ b/im-client/src/main/java/com/bx/imclient/task/AbstractPullMessageTask.java @@ -2,20 +2,21 @@ package com.bx.imclient.task; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.CommandLineRunner; -import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.util.concurrent.*; @Slf4j -public abstract class AbstractPullMessageTask { +public abstract class AbstractPullMessageTask implements CommandLineRunner { private int threadNum = 8; private ExecutorService executorService = Executors.newFixedThreadPool(threadNum); - @PostConstruct - public void init(){ + + @Override + public void run(String... args) throws Exception { // 初始化定时器 for(int i=0;iorg.springframework.session spring-session-data-redis + + org.springframework.boot + spring-boot-starter-validation + io.minio diff --git a/im-platform/src/main/java/com/bx/implatform/config/GlobalCorsConfig.java b/im-platform/src/main/java/com/bx/implatform/config/GlobalCorsConfig.java index 04b24f7..4ee8955 100644 --- a/im-platform/src/main/java/com/bx/implatform/config/GlobalCorsConfig.java +++ b/im-platform/src/main/java/com/bx/implatform/config/GlobalCorsConfig.java @@ -10,7 +10,7 @@ import org.springframework.web.filter.CorsFilter; import java.util.Arrays; -@Configuration +//@Configuration public class GlobalCorsConfig { @Bean diff --git a/im-platform/src/main/java/com/bx/implatform/dto/LoginDTO.java b/im-platform/src/main/java/com/bx/implatform/dto/LoginDTO.java index 0f16599..5bdfb44 100644 --- a/im-platform/src/main/java/com/bx/implatform/dto/LoginDTO.java +++ b/im-platform/src/main/java/com/bx/implatform/dto/LoginDTO.java @@ -3,7 +3,6 @@ package com.bx.implatform.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import org.hibernate.validator.constraints.Length; import javax.validation.constraints.Max; import javax.validation.constraints.Min; diff --git a/im-platform/src/main/resources/application.yml b/im-platform/src/main/resources/application.yml index 6c77e0b..2e84bff 100644 --- a/im-platform/src/main/resources/application.yml +++ b/im-platform/src/main/resources/application.yml @@ -3,6 +3,11 @@ server: port: 8888 #配置项目的数据源 spring: + main: + allow-circular-references: true + mvc: + pathmatch: + matching-strategy: ant_path_matcher datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/box-im?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true @@ -23,7 +28,7 @@ mybatis-plus: configuration: # 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射 map-underscore-to-camel-case: false - #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # mapper mapper-locations: # *.xml的具体路径 diff --git a/im-server/src/main/java/com/bx/imserver/task/AbstractPullMessageTask.java b/im-server/src/main/java/com/bx/imserver/task/AbstractPullMessageTask.java index 8b1acdc..9559315 100644 --- a/im-server/src/main/java/com/bx/imserver/task/AbstractPullMessageTask.java +++ b/im-server/src/main/java/com/bx/imserver/task/AbstractPullMessageTask.java @@ -4,13 +4,14 @@ import com.bx.imserver.netty.IMServerGroup; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.util.concurrent.*; @Slf4j -public abstract class AbstractPullMessageTask { +public abstract class AbstractPullMessageTask implements CommandLineRunner { private int threadNum = 1; private ExecutorService executorService; @@ -26,8 +27,9 @@ public abstract class AbstractPullMessageTask { this.threadNum = threadNum; } - @PostConstruct - public void init() { + + @Override + public void run(String... args) { // 初始化定时器 executorService = Executors.newFixedThreadPool(threadNum); diff --git a/pom.xml b/pom.xml index e369a1e..61fdd8c 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,7 @@ 3.3.3 3.8.1 1.18.16 + 5.1.46 @@ -43,7 +44,7 @@ org.springframework.boot spring-boot-dependencies - 2.0.3.RELEASE + 2.7.17 pom import @@ -92,6 +93,11 @@ hutool-all ${hutool.version} + + mysql + mysql-connector-java + ${mysql.version} + org.apache.poi poi-ooxml From 3b1d16e2d207b04d1067702cc07823b693dcd405 Mon Sep 17 00:00:00 2001 From: "xie.bx" Date: Wed, 15 Nov 2023 23:02:55 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC?= =?UTF-8?q?=E4=BC=98=E5=8C=96(=E9=98=BF=E9=87=8C=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=A7=84=E7=BA=A6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/bx/imclient/IMClient.java | 3 +- .../java/com/bx/imclient/sender/IMSender.java | 3 +- ...sk.java => AbstractMessageResultTask.java} | 2 +- ...java => GroupMessageResultResultTask.java} | 9 +-- ...va => PrivateMessageResultResultTask.java} | 9 +-- .../implatform/controller/FileController.java | 4 +- .../controller/FriendController.java | 3 +- .../controller/GroupController.java | 3 +- .../controller/GroupMessageController.java | 3 +- .../controller/LoginController.java | 3 +- .../controller/PrivateMessageController.java | 5 +- .../implatform/controller/UserController.java | 3 +- .../controller/WebrtcController.java | 3 +- .../interceptor/AuthInterceptor.java | 1 + .../listener/GroupMessageListener.java | 5 +- .../listener/PrivateMessageListener.java | 4 +- .../bx/implatform/service/IFriendService.java | 35 +++++++++++ .../service/IGroupMemberService.java | 44 +++++++++++++- .../service/IGroupMessageService.java | 39 +++++++++++- .../bx/implatform/service/IGroupService.java | 57 +++++++++++++++++- .../service/IPrivateMessageService.java | 38 +++++++++++- .../bx/implatform/service/IUserService.java | 51 ++++++++++++++++ .../service/impl/FriendServiceImpl.java | 38 ++---------- .../service/impl/GroupMemberServiceImpl.java | 56 +----------------- .../service/impl/GroupMessageServiceImpl.java | 37 ++---------- .../service/impl/GroupServiceImpl.java | 59 +++---------------- .../impl/PrivateMessageServiceImpl.java | 40 ++----------- .../service/impl/UserServiceImpl.java | 57 ++---------------- .../bx/implatform/vo/PrivateMessageVO.java | 2 +- .../src/main/resources/application.yml | 2 - .../com/bx/imserver/config/RedisConfig.java | 4 -- .../com/bx/imserver/netty/IMServerGroup.java | 4 +- .../processor/GroupMessageProcessor.java | 5 +- .../netty/processor/HeartbeatProcessor.java | 7 +-- .../netty/processor/LoginProcessor.java | 6 +- .../processor/PrivateMessageProcessor.java | 3 +- ...ageTask.java => PullGroupMessageTask.java} | 2 +- ...eTask.java => PullPrivateMessageTask.java} | 2 +- 38 files changed, 345 insertions(+), 306 deletions(-) rename im-client/src/main/java/com/bx/imclient/task/{AbstractPullMessageTask.java => AbstractMessageResultTask.java} (94%) rename im-client/src/main/java/com/bx/imclient/task/{PullSendResultGroupMessageTask.java => GroupMessageResultResultTask.java} (84%) rename im-client/src/main/java/com/bx/imclient/task/{PullSendResultPrivateMessageTask.java => PrivateMessageResultResultTask.java} (84%) rename im-server/src/main/java/com/bx/imserver/task/{PullUnreadGroupMessageTask.java => PullGroupMessageTask.java} (94%) rename im-server/src/main/java/com/bx/imserver/task/{PullUnreadPrivateMessageTask.java => PullPrivateMessageTask.java} (94%) 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 4b3e6e7..fcaafcd 100644 --- a/im-client/src/main/java/com/bx/imclient/IMClient.java +++ b/im-client/src/main/java/com/bx/imclient/IMClient.java @@ -4,6 +4,7 @@ import com.bx.imclient.sender.IMSender; import com.bx.imcommon.enums.IMTerminalType; import com.bx.imcommon.model.IMGroupMessage; import com.bx.imcommon.model.IMPrivateMessage; +import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -11,9 +12,9 @@ import java.util.List; import java.util.Map; @Configuration +@AllArgsConstructor public class IMClient { - @Autowired private IMSender imSender; /** 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 f4d0b83..b090051 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 @@ -8,6 +8,7 @@ import com.bx.imcommon.enums.IMListenerType; import com.bx.imcommon.enums.IMSendCode; import com.bx.imcommon.enums.IMTerminalType; import com.bx.imcommon.model.*; +import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; @@ -16,13 +17,13 @@ import org.springframework.stereotype.Service; import java.util.*; @Service +@AllArgsConstructor public class IMSender { @Autowired @Qualifier("IMRedisTemplate") private RedisTemplate redisTemplate; - @Autowired private MessageListenerMulticaster listenerMulticaster; public void sendPrivateMessage(IMPrivateMessage message) { diff --git a/im-client/src/main/java/com/bx/imclient/task/AbstractPullMessageTask.java b/im-client/src/main/java/com/bx/imclient/task/AbstractMessageResultTask.java similarity index 94% rename from im-client/src/main/java/com/bx/imclient/task/AbstractPullMessageTask.java rename to im-client/src/main/java/com/bx/imclient/task/AbstractMessageResultTask.java index a21fe14..52f437b 100644 --- a/im-client/src/main/java/com/bx/imclient/task/AbstractPullMessageTask.java +++ b/im-client/src/main/java/com/bx/imclient/task/AbstractMessageResultTask.java @@ -8,7 +8,7 @@ import javax.annotation.PreDestroy; import java.util.concurrent.*; @Slf4j -public abstract class AbstractPullMessageTask implements CommandLineRunner { +public abstract class AbstractMessageResultTask implements CommandLineRunner { private int threadNum = 8; diff --git a/im-client/src/main/java/com/bx/imclient/task/PullSendResultGroupMessageTask.java b/im-client/src/main/java/com/bx/imclient/task/GroupMessageResultResultTask.java similarity index 84% rename from im-client/src/main/java/com/bx/imclient/task/PullSendResultGroupMessageTask.java rename to im-client/src/main/java/com/bx/imclient/task/GroupMessageResultResultTask.java index 2fa6e62..67cfd8b 100644 --- a/im-client/src/main/java/com/bx/imclient/task/PullSendResultGroupMessageTask.java +++ b/im-client/src/main/java/com/bx/imclient/task/GroupMessageResultResultTask.java @@ -5,21 +5,22 @@ import com.bx.imclient.listener.MessageListenerMulticaster; import com.bx.imcommon.contant.IMRedisKey; import com.bx.imcommon.enums.IMListenerType; import com.bx.imcommon.model.IMSendResult; +import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.concurrent.TimeUnit; @Component -public class PullSendResultGroupMessageTask extends AbstractPullMessageTask{ +@AllArgsConstructor +public class GroupMessageResultResultTask extends AbstractMessageResultTask { - @Qualifier("IMRedisTemplate") - @Autowired + @Resource(name = "IMRedisTemplate") private RedisTemplate redisTemplate; - @Autowired private MessageListenerMulticaster listenerMulticaster; @Override diff --git a/im-client/src/main/java/com/bx/imclient/task/PullSendResultPrivateMessageTask.java b/im-client/src/main/java/com/bx/imclient/task/PrivateMessageResultResultTask.java similarity index 84% rename from im-client/src/main/java/com/bx/imclient/task/PullSendResultPrivateMessageTask.java rename to im-client/src/main/java/com/bx/imclient/task/PrivateMessageResultResultTask.java index c0fa2bb..39ee51c 100644 --- a/im-client/src/main/java/com/bx/imclient/task/PullSendResultPrivateMessageTask.java +++ b/im-client/src/main/java/com/bx/imclient/task/PrivateMessageResultResultTask.java @@ -5,26 +5,27 @@ import com.bx.imclient.listener.MessageListenerMulticaster; import com.bx.imcommon.contant.IMRedisKey; import com.bx.imcommon.enums.IMListenerType; import com.bx.imcommon.model.IMSendResult; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.concurrent.TimeUnit; ; @Slf4j @Component -public class PullSendResultPrivateMessageTask extends AbstractPullMessageTask{ +@AllArgsConstructor +public class PrivateMessageResultResultTask extends AbstractMessageResultTask { - @Qualifier("IMRedisTemplate") - @Autowired + @Resource(name = "IMRedisTemplate") private RedisTemplate redisTemplate; - @Autowired private MessageListenerMulticaster listenerMulticaster; @Override diff --git a/im-platform/src/main/java/com/bx/implatform/controller/FileController.java b/im-platform/src/main/java/com/bx/implatform/controller/FileController.java index 0d50738..55b29b3 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/FileController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/FileController.java @@ -6,6 +6,7 @@ import com.bx.implatform.service.thirdparty.FileService; import com.bx.implatform.vo.UploadImageVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; @@ -16,10 +17,9 @@ import org.springframework.web.multipart.MultipartFile; @Slf4j @RestController @Api(tags = "文件上传") +@AllArgsConstructor public class FileController { - - @Autowired private FileService fileService; @ApiOperation(value = "上传图片",notes="上传图片,上传后返回原图和缩略图的url") diff --git a/im-platform/src/main/java/com/bx/implatform/controller/FriendController.java b/im-platform/src/main/java/com/bx/implatform/controller/FriendController.java index fc4d568..e889eaa 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/FriendController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/FriendController.java @@ -8,6 +8,7 @@ import com.bx.implatform.session.SessionContext; import com.bx.implatform.vo.FriendVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -19,9 +20,9 @@ import java.util.stream.Collectors; @Api(tags = "好友") @RestController @RequestMapping("/friend") +@AllArgsConstructor public class FriendController { - @Autowired private IFriendService friendService; @GetMapping("/list") diff --git a/im-platform/src/main/java/com/bx/implatform/controller/GroupController.java b/im-platform/src/main/java/com/bx/implatform/controller/GroupController.java index 709397a..2bd9c46 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/GroupController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/GroupController.java @@ -9,6 +9,7 @@ import com.bx.implatform.vo.GroupMemberVO; import com.bx.implatform.vo.GroupVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -21,9 +22,9 @@ import java.util.List; @Api(tags = "群聊") @RestController @RequestMapping("/group") +@AllArgsConstructor public class GroupController { - @Autowired private IGroupService groupService; @ApiOperation(value = "创建群聊",notes="创建群聊") diff --git a/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java b/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java index 73abf24..38a54f1 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java @@ -9,6 +9,7 @@ import com.bx.implatform.dto.GroupMessageDTO; import com.bx.implatform.vo.PrivateMessageVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -20,9 +21,9 @@ import java.util.List; @Api(tags = "群聊消息") @RestController @RequestMapping("/message/group") +@AllArgsConstructor public class GroupMessageController { - @Autowired private IGroupMessageService groupMessageService; diff --git a/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java b/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java index 3a09fed..7bcf0df 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java @@ -10,6 +10,7 @@ import com.bx.implatform.dto.RegisterDTO; import com.bx.implatform.vo.LoginVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -19,9 +20,9 @@ import javax.validation.Valid; @Api(tags = "用户登录和注册") @RestController +@AllArgsConstructor public class LoginController { - @Autowired private IUserService userService; @PostMapping("/login") diff --git a/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java b/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java index ea55123..625d58b 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java @@ -8,6 +8,7 @@ import com.bx.implatform.service.IPrivateMessageService; import com.bx.implatform.dto.PrivateMessageDTO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -18,9 +19,9 @@ import java.util.List; @Api(tags = "私聊消息") @RestController @RequestMapping("/message/private") +@AllArgsConstructor public class PrivateMessageController { - - @Autowired + private IPrivateMessageService privateMessageService; @PostMapping("/send") 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 1c7cf09..c5ad0c1 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 @@ -11,6 +11,7 @@ import com.bx.implatform.vo.OnlineTerminalVO; import com.bx.implatform.vo.UserVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -22,9 +23,9 @@ import java.util.List; @Api(tags = "用户") @RestController @RequestMapping("/user") +@AllArgsConstructor public class UserController { - @Autowired private IUserService userService; diff --git a/im-platform/src/main/java/com/bx/implatform/controller/WebrtcController.java b/im-platform/src/main/java/com/bx/implatform/controller/WebrtcController.java index 9fca97c..cb98ef9 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/WebrtcController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/WebrtcController.java @@ -6,6 +6,7 @@ import com.bx.implatform.result.ResultUtils; import com.bx.implatform.service.IWebrtcService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -14,9 +15,9 @@ import java.util.List; @Api(tags = "webrtc视频单人通话") @RestController @RequestMapping("/webrtc/private") +@AllArgsConstructor public class WebrtcController { - @Autowired private IWebrtcService webrtcService; @ApiOperation(httpMethod = "POST", value = "呼叫视频通话") diff --git a/im-platform/src/main/java/com/bx/implatform/interceptor/AuthInterceptor.java b/im-platform/src/main/java/com/bx/implatform/interceptor/AuthInterceptor.java index 92fbd7e..2201159 100644 --- a/im-platform/src/main/java/com/bx/implatform/interceptor/AuthInterceptor.java +++ b/im-platform/src/main/java/com/bx/implatform/interceptor/AuthInterceptor.java @@ -8,6 +8,7 @@ import com.bx.implatform.enums.ResultCode; import com.bx.implatform.exception.GlobalException; import com.bx.implatform.session.UserSession; import com.bx.imcommon.util.JwtUtil; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.method.HandlerMethod; diff --git a/im-platform/src/main/java/com/bx/implatform/listener/GroupMessageListener.java b/im-platform/src/main/java/com/bx/implatform/listener/GroupMessageListener.java index 0648a13..3527998 100644 --- a/im-platform/src/main/java/com/bx/implatform/listener/GroupMessageListener.java +++ b/im-platform/src/main/java/com/bx/implatform/listener/GroupMessageListener.java @@ -7,6 +7,7 @@ import com.bx.imcommon.enums.IMSendCode; import com.bx.implatform.vo.GroupMessageVO; import com.bx.imcommon.model.IMSendResult; import com.bx.implatform.contant.RedisKey; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; @@ -14,9 +15,9 @@ import org.springframework.data.redis.core.RedisTemplate; @Slf4j @IMListener(type = IMListenerType.GROUP_MESSAGE) +@AllArgsConstructor public class GroupMessageListener implements MessageListener { - - @Autowired + private RedisTemplate redisTemplate; @Override diff --git a/im-platform/src/main/java/com/bx/implatform/listener/PrivateMessageListener.java b/im-platform/src/main/java/com/bx/implatform/listener/PrivateMessageListener.java index fe82817..13a58ee 100644 --- a/im-platform/src/main/java/com/bx/implatform/listener/PrivateMessageListener.java +++ b/im-platform/src/main/java/com/bx/implatform/listener/PrivateMessageListener.java @@ -10,18 +10,20 @@ import com.bx.imcommon.model.IMSendResult; import com.bx.implatform.entity.PrivateMessage; import com.bx.implatform.enums.MessageStatus; import com.bx.implatform.service.IPrivateMessageService; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; @Slf4j @IMListener(type = IMListenerType.PRIVATE_MESSAGE) public class PrivateMessageListener implements MessageListener { + @Lazy @Autowired private IPrivateMessageService privateMessageService; - @Override public void process(IMSendResult result){ PrivateMessageVO messageInfo = result.getData(); diff --git a/im-platform/src/main/java/com/bx/implatform/service/IFriendService.java b/im-platform/src/main/java/com/bx/implatform/service/IFriendService.java index cfde61c..207e744 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/IFriendService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/IFriendService.java @@ -9,15 +9,50 @@ import java.util.List; public interface IFriendService extends IService { + /** + * 判断用户2是否用户1的好友 + * + * @param userId1 用户1的id + * @param userId2 用户2的id + * @return true/false + */ Boolean isFriend(Long userId1, Long userId2); + + /** + * 查询用户的所有好友 + * + * @param userId 用户id + * @return 好友列表 + */ List findFriendByUserId(Long userId); + /** + * 添加好友,互相建立好友关系 + * + * @param friendId 好友的用户id + */ void addFriend(Long friendId); + /** + * 删除好友,双方都会解除好友关系 + * + * @param friendId 好友的用户id + */ void delFriend(Long friendId); + /** + * 更新好友信息,主要是头像和昵称 + * + * @param vo 好友vo + */ void update(FriendVO vo); + /** + * 查询指定的某个好友信息 + * + * @param friendId 好友的用户id + * @return 好友信息 + */ FriendVO findFriend(Long friendId); } diff --git a/im-platform/src/main/java/com/bx/implatform/service/IGroupMemberService.java b/im-platform/src/main/java/com/bx/implatform/service/IGroupMemberService.java index a4966c0..30e14f4 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/IGroupMemberService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/IGroupMemberService.java @@ -9,18 +9,60 @@ import java.util.List; public interface IGroupMemberService extends IService { - + /** + * 根据群聊id和用户id查询群聊成员 + * + * @param groupId 群聊id + * @param userId 用户id + * @return 群聊成员信息 + */ GroupMember findByGroupAndUserId(Long groupId,Long userId); + /** + * 根据用户id查询群聊成员 + * + * @param userId 用户id + * @return 成员列表 + */ List findByUserId(Long userId); + /** + * 根据群聊id查询群聊成员(包括已退出) + * + * @param groupId 群聊id + * @return 群聊成员列表 + */ List findByGroupId(Long groupId); + /** + * 根据群聊id查询没有退出的群聊成员id + * + * @param groupId 群聊id + * @return 群聊成员id列表 + */ List findUserIdsByGroupId(Long groupId); + /** + * 批量添加成员 + * + * @param groupId 群聊id + * @param members 成员列表 + * @return 成功或失败 + */ boolean saveOrUpdateBatch(Long groupId,List members); + /** + * 根据群聊id删除移除成员 + * + * @param groupId 群聊id + */ void removeByGroupId(Long groupId); + /** + *根据群聊id和用户id移除成员 + * + * @param groupId 群聊id + * @param userId 用户id + */ void removeByGroupAndUserId(Long groupId,Long userId); } diff --git a/im-platform/src/main/java/com/bx/implatform/service/IGroupMessageService.java b/im-platform/src/main/java/com/bx/implatform/service/IGroupMessageService.java index 304a00c..b92ba78 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/IGroupMessageService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/IGroupMessageService.java @@ -10,16 +10,49 @@ import java.util.List; public interface IGroupMessageService extends IService { - - Long sendMessage(GroupMessageDTO vo); - + /** + * 发送群聊消息(高并发接口,查询mysql接口都要进行缓存) + * + * @param dto 群聊消息 + * @return 群聊id + */ + Long sendMessage(GroupMessageDTO dto); + + /** + * 撤回消息 + * + * @param id 消息id + */ void recallMessage(Long id); + /** + * + * 异步拉取群聊消息,通过websocket异步推送 + */ void pullUnreadMessage(); + /** + * 拉取消息,只能拉取最近1个月的消息,一次拉取100条 + * + * @param minId 消息起始id + * @return 聊天消息列表 + */ List loadMessage(Long minId); + /** + * 消息已读,同步其他终端,清空未读数量 + * + * @param groupId 群聊 + */ void readedMessage(Long groupId); + /** + * 拉取历史聊天记录 + * + * @param groupId 群聊id + * @param page 页码 + * @param size 页码大小 + * @return 聊天记录列表 + */ List findHistoryMessage(Long groupId, Long page, Long size); } diff --git a/im-platform/src/main/java/com/bx/implatform/service/IGroupService.java b/im-platform/src/main/java/com/bx/implatform/service/IGroupService.java index 40fb3c3..e82ebb9 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/IGroupService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/IGroupService.java @@ -11,24 +11,79 @@ import java.util.List; public interface IGroupService extends IService { - + /** + * 创建新群聊 + * + * @param vo 群聊信息 + * @return 群聊信息 + **/ GroupVO createGroup(GroupVO vo); + /** + * 修改群聊信息 + * + * @param vo 群聊信息 + * @return 群聊信息 + **/ GroupVO modifyGroup(GroupVO vo); + /** + * 删除群聊 + * + * @param groupId 群聊id + **/ void deleteGroup(Long groupId); + /** + * 退出群聊 + * + * @param groupId 群聊id + */ void quitGroup(Long groupId); + /** + * 将用户踢出群聊 + * + * @param groupId 群聊id + * @param userId 用户id + */ void kickGroup(Long groupId,Long userId); + /** + * 查询当前用户的所有群聊 + * + * @return 群聊信息列表 + **/ List findGroups(); + /** + * 邀请好友进群 + * + * @param vo 群id、好友id列表 + **/ void invite(GroupInviteVO vo); + /** + * 根据id查找群聊,并进行缓存 + * + * @param groupId 群聊id + * @return 群聊实体 + */ Group getById(Long groupId); + /** + * 根据id查找群聊 + * + * @param groupId 群聊id + * @return 群聊vo + */ GroupVO findById(Long groupId); + /** + * 查询群成员 + * + * @param groupId 群聊id + * @return List + **/ List findGroupMembers(Long groupId); } diff --git a/im-platform/src/main/java/com/bx/implatform/service/IPrivateMessageService.java b/im-platform/src/main/java/com/bx/implatform/service/IPrivateMessageService.java index f0036e0..9cfeaca 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/IPrivateMessageService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/IPrivateMessageService.java @@ -10,15 +10,49 @@ import java.util.List; public interface IPrivateMessageService extends IService { - Long sendMessage(PrivateMessageDTO vo); - + /** + * 发送私聊消息(高并发接口,查询mysql接口都要进行缓存) + * + * @param dto 私聊消息 + * @return 消息id + */ + Long sendMessage(PrivateMessageDTO dto); + + + /** + * 撤回消息 + * + * @param id 消息id + */ void recallMessage(Long id); + /** + * 拉取历史聊天记录 + * + * @param friendId 好友id + * @param page 页码 + * @param size 页码大小 + * @return 聊天记录列表 + */ List findHistoryMessage(Long friendId, Long page,Long size); + /** + * 异步拉取私聊消息,通过websocket异步推送 + */ void pullUnreadMessage(); + /** + * 拉取消息,只能拉取最近1个月的消息,一次拉取100条 + * + * @param minId 消息起始id + * @return 聊天消息列表 + */ List loadMessage(Long minId); + /** + * 消息已读,将整个会话的消息都置为已读状态 + * + * @param friendId 好友id + */ void readedMessage(Long friendId); } 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 af22b5c..8a1c2d1 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 @@ -14,22 +14,73 @@ import java.util.List; public interface IUserService extends IService { + /** + * 用户登录 + * + * @param dto 登录dto + * @return 登录token + */ LoginVO login(LoginDTO dto); + /** + * 修改用户密码 + * + * @param dto 修改密码dto + */ void modifyPassword(ModifyPwdDTO dto); + /** + * 用refreshToken换取新 token + * + * @param refreshToken 刷新token + * @return 登录token + */ LoginVO refreshToken(String refreshToken); + /** + * 用户注册 + * + * @param dto 注册dto + */ void register(RegisterDTO dto); + /** + * 根据用户名查询用户 + * + * @param username 用户名 + * @return 用户信息 + */ User findUserByUserName(String username); + /** + * 更新用户信息,好友昵称和群聊昵称等冗余信息也会更新 + * + * @param vo 用户信息vo + */ void update(UserVO vo); + /** + * 根据用户昵id查询用户以及在线状态 + * + * @param id 用户id + * @return 用户信息 + */ UserVO findUserById(Long id); + /** + * 根据用户昵称查询用户,最多返回20条数据 + * + * @param name 用户名或昵称 + * @return 用户列表 + */ List findUserByName(String name); + /** + * 获取用户在线的终端类型 + * + * @param userIds 用户id,多个用‘,’分割 + * @return 在线用户终端 + */ List getOnlineTerminals(String userIds); diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/FriendServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/FriendServiceImpl.java index 01f65fd..27c9aa8 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/FriendServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/FriendServiceImpl.java @@ -35,12 +35,6 @@ public class FriendServiceImpl extends ServiceImpl impleme private final UserMapper userMapper; - /** - * 查询用户的所有好友 - * - * @param userId 用户id - * @return 好友列表 - */ @Override public List findFriendByUserId(Long userId) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); @@ -49,11 +43,7 @@ public class FriendServiceImpl extends ServiceImpl impleme } - /** - * 添加好友,互相建立好友关系 - * - * @param friendId 好友的用户id - */ + @Transactional(rollbackFor = Exception.class) @Override public void addFriend(Long friendId) { @@ -69,11 +59,7 @@ public class FriendServiceImpl extends ServiceImpl impleme } - /** - * 删除好友,双方都会解除好友关系 - * - * @param friendId 好友的用户id - */ + @Transactional(rollbackFor = Exception.class) @Override public void delFriend(Long friendId) { @@ -86,12 +72,7 @@ public class FriendServiceImpl extends ServiceImpl impleme } - /** - * 判断用户2是否用户1的好友 - * - * @param userId1 用户1的id - * @param userId2 用户2的id - */ + @Cacheable(key="#userId1+':'+#userId2") @Override public Boolean isFriend(Long userId1, Long userId2) { @@ -103,11 +84,7 @@ public class FriendServiceImpl extends ServiceImpl impleme } - /** - * 更新好友信息,主要是头像和昵称 - * - * @param vo 好友vo - */ + @Override public void update(FriendVO vo) { long userId = SessionContext.getSession().getUserId(); @@ -168,12 +145,7 @@ public class FriendServiceImpl extends ServiceImpl impleme } - /** - * 查询指定的某个好友信息 - * - * @param friendId 好友的用户id - * @return 好友信息 - */ + @Override public FriendVO findFriend(Long friendId) { UserSession session = SessionContext.getSession(); diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java index 135c282..7edda3d 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java @@ -23,12 +23,7 @@ import java.util.stream.Collectors; public class GroupMemberServiceImpl extends ServiceImpl implements IGroupMemberService { - /** - * 添加群聊成员 - * - * @param member 成员 - * @return 成功或失败 - */ + @CacheEvict(key="#member.getGroupId()") @Override public boolean save(GroupMember member) { @@ -36,26 +31,14 @@ public class GroupMemberServiceImpl extends ServiceImpl members) { return super.saveOrUpdateBatch(members); } - /** - * 根据群聊id和用户id查询群聊成员 - * - * @param groupId 群聊id - * @param userId 用户id - * @return 群聊成员信息 - */ + @Override public GroupMember findByGroupAndUserId(Long groupId, Long userId) { QueryWrapper wrapper = new QueryWrapper<>(); @@ -64,13 +47,6 @@ public class GroupMemberServiceImpl extends ServiceImpl findByUserId(Long userId) { LambdaQueryWrapper memberWrapper = Wrappers.lambdaQuery(); @@ -79,13 +55,6 @@ public class GroupMemberServiceImpl extends ServiceImpl findByGroupId(Long groupId) { LambdaQueryWrapper memberWrapper = Wrappers.lambdaQuery(); @@ -93,13 +62,6 @@ public class GroupMemberServiceImpl extends ServiceImpl findUserIdsByGroupId(Long groupId) { @@ -110,12 +72,6 @@ public class GroupMemberServiceImpl extends ServiceImpl redisTemplate; private IMClient imClient; - /** - * 发送群聊消息(高并发接口,查询mysql接口都要进行缓存) - * - * @param dto 群聊消息 - * @return 群聊id - */ + @Override public Long sendMessage(GroupMessageDTO dto) { UserSession session = SessionContext.getSession(); @@ -92,11 +87,6 @@ public class GroupMessageServiceImpl extends ServiceImpl loadMessage(Long minId) { UserSession session = SessionContext.getSession(); @@ -243,11 +225,7 @@ public class GroupMessageServiceImpl extends ServiceImpl findHistoryMessage(Long groupId, Long page, Long size) { page = page > 0 ? page : 1; diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java index 5f05e10..7cd737b 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java @@ -49,12 +49,7 @@ public class GroupServiceImpl extends ServiceImpl implements private IFriendService friendsService; private IMClient imClient; - /** - * 创建新群聊 - * - * @param vo 群聊信息 - * @return 群聊信息 - **/ + @Override public GroupVO createGroup(GroupVO vo) { UserSession session = SessionContext.getSession(); @@ -79,12 +74,7 @@ public class GroupServiceImpl extends ServiceImpl implements return vo; } - /** - * 修改群聊信息 - * - * @param vo 群聊信息 - * @return 群聊信息 - **/ + @CacheEvict(value = "#vo.getId()") @Transactional(rollbackFor = Exception.class) @Override @@ -110,11 +100,7 @@ public class GroupServiceImpl extends ServiceImpl implements } - /** - * 删除群聊 - * - * @param groupId 群聊id - **/ + @Transactional(rollbackFor = Exception.class) @CacheEvict(value = "#groupId") @Override @@ -133,11 +119,7 @@ public class GroupServiceImpl extends ServiceImpl implements } - /** - * 退出群聊 - * - * @param groupId 群聊id - */ + @Override public void quitGroup(Long groupId) { Long userId = SessionContext.getSession().getUserId(); @@ -151,12 +133,7 @@ public class GroupServiceImpl extends ServiceImpl implements } - /** - * 将用户踢出群聊 - * - * @param groupId 群聊id - * @param userId 用户id - */ + @Override public void kickGroup(Long groupId, Long userId) { UserSession session = SessionContext.getSession(); @@ -186,12 +163,7 @@ public class GroupServiceImpl extends ServiceImpl implements return vo; } - /** - * 根据id查找群聊,并进行缓存 - * - * @param groupId 群聊id - * @return 群聊实体 - */ + @Cacheable(value = "#groupId") @Override public Group getById(Long groupId){ @@ -207,11 +179,7 @@ public class GroupServiceImpl extends ServiceImpl implements - /** - * 查询当前用户的所有群聊 - * - * @return 群聊信息列表 - **/ + @Override public List findGroups() { UserSession session = SessionContext.getSession(); @@ -235,11 +203,7 @@ public class GroupServiceImpl extends ServiceImpl implements }).collect(Collectors.toList()); } - /** - * 邀请好友进群 - * - * @Param GroupInviteVO 群id、好友id列表 - **/ + @Override public void invite(GroupInviteVO vo) { UserSession session = SessionContext.getSession(); @@ -280,12 +244,7 @@ public class GroupServiceImpl extends ServiceImpl implements log.info("邀请进入群聊,群聊id:{},群聊名称:{},被邀请用户id:{}",group.getId(),group.getName(),vo.getFriendIds()); } - /** - * 查询群成员 - * - * @Param groupId 群聊id - * @return List - **/ + @Override public List findGroupMembers(Long groupId) { List members = groupMemberService.findByGroupId(groupId); diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java index d707be8..55ea18b 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java @@ -44,12 +44,7 @@ public class PrivateMessageServiceImpl extends ServiceImpl findHistoryMessage(Long friendId, Long page, Long size) { page = page > 0 ? page : 1; @@ -149,9 +132,7 @@ public class PrivateMessageServiceImpl extends ServiceImpl loadMessage(Long minId) { UserSession session = SessionContext.getSession(); @@ -234,12 +210,8 @@ public class PrivateMessageServiceImpl extends ServiceImpl implements IU private JwtProperties jwtProperties; private IMClient imClient; - /** - * 用户登录 - * - * @param dto 登录dto - * @return 登录token - */ @Override public LoginVO login(LoginDTO dto) { @@ -81,15 +75,6 @@ public class UserServiceImpl extends ServiceImpl implements IU return vo; } - - - - /** - * 用refreshToken换取新 token - * - * @param refreshToken 刷新token - * @return 登录token - */ @Override public LoginVO refreshToken(String refreshToken) { //验证 token @@ -108,11 +93,7 @@ public class UserServiceImpl extends ServiceImpl implements IU return vo; } - /** - * 用户注册 - * - * @param dto 注册dto - */ + @Override public void register(RegisterDTO dto) { User user = this.findUserByUserName(dto.getUserName()); @@ -138,12 +119,7 @@ public class UserServiceImpl extends ServiceImpl implements IU log.info("用户修改密码,用户id:{},用户名:{},昵称:{}",user.getId(),user.getUserName(),user.getNickName()); } - /** - * 根据用户名查询用户 - * - * @param username 用户名 - * @return 用户信息 - */ + @Override public User findUserByUserName(String username) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); @@ -152,12 +128,8 @@ public class UserServiceImpl extends ServiceImpl implements IU } - /** - * 更新用户信息,好友昵称和群聊昵称等冗余信息也会更新 - * - * @param vo 用户信息vo - */ - @Transactional + + @Transactional(rollbackFor = Exception.class) @Override public void update(UserVO vo) { UserSession session = SessionContext.getSession(); @@ -197,12 +169,7 @@ public class UserServiceImpl extends ServiceImpl implements IU log.info("用户信息更新,用户:{}}", user); } - /** - * 根据用户昵id查询用户以及在线状态 - * - * @param id 用户id - * @return 用户信息 - */ + @Override public UserVO findUserById(Long id) { User user = this.getById(id); @@ -211,12 +178,7 @@ public class UserServiceImpl extends ServiceImpl implements IU return vo; } - /** - * 根据用户昵称查询用户,最多返回20条数据 - * - * @param name 用户名或昵称 - * @return 用户列表 - */ + @Override public List findUserByName(String name) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); @@ -235,13 +197,6 @@ public class UserServiceImpl extends ServiceImpl implements IU } - - /** - * 获取用户在线的终端类型 - * - * @param userIds 用户id,多个用‘,’分割 - * @return 在线用户终端 - */ @Override public List getOnlineTerminals(String userIds) { List userIdList = Arrays.stream(userIds.split(",")) diff --git a/im-platform/src/main/java/com/bx/implatform/vo/PrivateMessageVO.java b/im-platform/src/main/java/com/bx/implatform/vo/PrivateMessageVO.java index 431dc9a..c8ea8a5 100644 --- a/im-platform/src/main/java/com/bx/implatform/vo/PrivateMessageVO.java +++ b/im-platform/src/main/java/com/bx/implatform/vo/PrivateMessageVO.java @@ -13,7 +13,7 @@ import java.util.Date; public class PrivateMessageVO { @ApiModelProperty(value = " 消息id") - private long id; + private Long id; @ApiModelProperty(value = " 发送者id") private Long sendId; diff --git a/im-platform/src/main/resources/application.yml b/im-platform/src/main/resources/application.yml index 2e84bff..49acc51 100644 --- a/im-platform/src/main/resources/application.yml +++ b/im-platform/src/main/resources/application.yml @@ -3,8 +3,6 @@ server: port: 8888 #配置项目的数据源 spring: - main: - allow-circular-references: true mvc: pathmatch: matching-strategy: ant_path_matcher diff --git a/im-server/src/main/java/com/bx/imserver/config/RedisConfig.java b/im-server/src/main/java/com/bx/imserver/config/RedisConfig.java index 5ae1fbd..35c044c 100644 --- a/im-server/src/main/java/com/bx/imserver/config/RedisConfig.java +++ b/im-server/src/main/java/com/bx/imserver/config/RedisConfig.java @@ -19,10 +19,6 @@ import javax.annotation.Resource; @Configuration public class RedisConfig { - @Resource - private RedisConnectionFactory factory; - - @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate(); diff --git a/im-server/src/main/java/com/bx/imserver/netty/IMServerGroup.java b/im-server/src/main/java/com/bx/imserver/netty/IMServerGroup.java index 619d770..3983239 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/IMServerGroup.java +++ b/im-server/src/main/java/com/bx/imserver/netty/IMServerGroup.java @@ -1,6 +1,7 @@ package com.bx.imserver.netty; import com.bx.imcommon.contant.IMRedisKey; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; @@ -12,14 +13,13 @@ import java.util.List; @Slf4j @Component +@AllArgsConstructor public class IMServerGroup implements CommandLineRunner { public static volatile long serverId = 0; - @Autowired RedisTemplate redisTemplate; - @Autowired private List imServers; /*** diff --git a/im-server/src/main/java/com/bx/imserver/netty/processor/GroupMessageProcessor.java b/im-server/src/main/java/com/bx/imserver/netty/processor/GroupMessageProcessor.java index 0446f05..2e26e1b 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/processor/GroupMessageProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/netty/processor/GroupMessageProcessor.java @@ -9,6 +9,7 @@ import com.bx.imcommon.model.IMUserInfo; import com.bx.imcommon.model.IMSendResult; import com.bx.imserver.netty.UserChannelCtxMap; import io.netty.channel.ChannelHandlerContext; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; @@ -19,9 +20,9 @@ import java.util.List; @Slf4j @Component +@AllArgsConstructor public class GroupMessageProcessor extends AbstractMessageProcessor { - - @Autowired + private RedisTemplate redisTemplate; @Async diff --git a/im-server/src/main/java/com/bx/imserver/netty/processor/HeartbeatProcessor.java b/im-server/src/main/java/com/bx/imserver/netty/processor/HeartbeatProcessor.java index f24f848..b84f5d0 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/processor/HeartbeatProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/netty/processor/HeartbeatProcessor.java @@ -10,6 +10,7 @@ import com.bx.imserver.constant.ChannelAttrKey; import com.bx.imserver.netty.ws.WebSocketServer; import io.netty.channel.ChannelHandlerContext; import io.netty.util.AttributeKey; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; @@ -20,13 +21,9 @@ import java.util.concurrent.TimeUnit; @Slf4j @Component +@AllArgsConstructor public class HeartbeatProcessor extends AbstractMessageProcessor { - - @Autowired - private WebSocketServer wsServer; - - @Autowired RedisTemplate redisTemplate; @Override diff --git a/im-server/src/main/java/com/bx/imserver/netty/processor/LoginProcessor.java b/im-server/src/main/java/com/bx/imserver/netty/processor/LoginProcessor.java index fd3d3f9..e37b2ea 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/processor/LoginProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/netty/processor/LoginProcessor.java @@ -14,6 +14,8 @@ import com.bx.imserver.netty.IMServerGroup; import com.bx.imserver.netty.UserChannelCtxMap; import io.netty.channel.ChannelHandlerContext; import io.netty.util.AttributeKey; +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -25,10 +27,10 @@ import java.util.concurrent.TimeUnit; @Slf4j @Component +@RequiredArgsConstructor public class LoginProcessor extends AbstractMessageProcessor { - @Autowired - RedisTemplate redisTemplate; + private final RedisTemplate redisTemplate; @Value("${jwt.accessToken.secret}") private String accessTokenSecret; diff --git a/im-server/src/main/java/com/bx/imserver/netty/processor/PrivateMessageProcessor.java b/im-server/src/main/java/com/bx/imserver/netty/processor/PrivateMessageProcessor.java index f65a635..6778714 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/processor/PrivateMessageProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/netty/processor/PrivateMessageProcessor.java @@ -9,6 +9,7 @@ import com.bx.imcommon.model.IMUserInfo; import com.bx.imcommon.model.IMSendResult; import com.bx.imserver.netty.UserChannelCtxMap; import io.netty.channel.ChannelHandlerContext; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; @@ -16,9 +17,9 @@ import org.springframework.stereotype.Component; @Slf4j @Component +@AllArgsConstructor public class PrivateMessageProcessor extends AbstractMessageProcessor { - @Autowired private RedisTemplate redisTemplate; @Override diff --git a/im-server/src/main/java/com/bx/imserver/task/PullUnreadGroupMessageTask.java b/im-server/src/main/java/com/bx/imserver/task/PullGroupMessageTask.java similarity index 94% rename from im-server/src/main/java/com/bx/imserver/task/PullUnreadGroupMessageTask.java rename to im-server/src/main/java/com/bx/imserver/task/PullGroupMessageTask.java index 1787b59..ef177f7 100644 --- a/im-server/src/main/java/com/bx/imserver/task/PullUnreadGroupMessageTask.java +++ b/im-server/src/main/java/com/bx/imserver/task/PullGroupMessageTask.java @@ -15,7 +15,7 @@ import java.util.concurrent.TimeUnit; @Slf4j @Component -public class PullUnreadGroupMessageTask extends AbstractPullMessageTask { +public class PullGroupMessageTask extends AbstractPullMessageTask { @Autowired private RedisTemplate redisTemplate; diff --git a/im-server/src/main/java/com/bx/imserver/task/PullUnreadPrivateMessageTask.java b/im-server/src/main/java/com/bx/imserver/task/PullPrivateMessageTask.java similarity index 94% rename from im-server/src/main/java/com/bx/imserver/task/PullUnreadPrivateMessageTask.java rename to im-server/src/main/java/com/bx/imserver/task/PullPrivateMessageTask.java index 4b70ee6..1ebe771 100644 --- a/im-server/src/main/java/com/bx/imserver/task/PullUnreadPrivateMessageTask.java +++ b/im-server/src/main/java/com/bx/imserver/task/PullPrivateMessageTask.java @@ -16,7 +16,7 @@ import java.util.concurrent.TimeUnit; @Slf4j @Component -public class PullUnreadPrivateMessageTask extends AbstractPullMessageTask { +public class PullPrivateMessageTask extends AbstractPullMessageTask { @Autowired From cf09ab1b079e7dacda4ce2834f1e301b8029067a Mon Sep 17 00:00:00 2001 From: xsx <825657193@qq.com> Date: Wed, 15 Nov 2023 23:47:50 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC?= =?UTF-8?q?=E4=BC=98=E5=8C=96(=E9=98=BF=E9=87=8C=E8=A7=84=E7=BA=A6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/bx/imclient/IMClient.java | 1 - .../com/bx/imclient/config/RedisConfig.java | 9 -- .../java/com/bx/imclient/sender/IMSender.java | 12 +- .../task/AbstractMessageResultTask.java | 3 +- .../task/GroupMessageResultResultTask.java | 2 - .../task/PrivateMessageResultResultTask.java | 2 - .../java/com/bx/imcommon/enums/IMCmdType.java | 4 +- .../com/bx/imcommon/enums/IMListenerType.java | 4 +- .../com/bx/imcommon/enums/IMSendCode.java | 17 +- .../com/bx/imcommon/enums/IMTerminalType.java | 4 +- .../com/bx/imcommon/model/IMGroupMessage.java | 3 +- .../com/bx/imcommon/model/IMRecvInfo.java | 10 +- .../com/bx/imcommon/model/IMSendInfo.java | 4 +- .../com/bx/imcommon/model/IMSendResult.java | 4 +- .../com/bx/imcommon/model/IMSessionInfo.java | 5 +- .../com/bx/imcommon/model/IMUserInfo.java | 2 - .../java/com/bx/imcommon/util/JwtUtil.java | 28 ++-- .../implatform/config/GlobalCorsConfig.java | 1 - .../com/bx/implatform/config/ICEServer.java | 6 - .../com/bx/implatform/config/MvcConfig.java | 19 +-- .../implatform/controller/FileController.java | 1 - .../controller/FriendController.java | 1 - .../controller/GroupController.java | 3 - .../controller/GroupMessageController.java | 7 +- .../controller/LoginController.java | 6 +- .../controller/PrivateMessageController.java | 6 +- .../implatform/controller/UserController.java | 1 - .../controller/WebrtcController.java | 1 - .../interceptor/AuthInterceptor.java | 11 +- .../interceptor/XssInterceptor.java | 3 +- .../listener/GroupMessageListener.java | 3 +- .../listener/PrivateMessageListener.java | 3 +- .../com/bx/implatform/result/ResultUtils.java | 36 ++--- .../service/IGroupMessageService.java | 4 +- .../service/IPrivateMessageService.java | 4 +- .../bx/implatform/service/IUserService.java | 4 +- .../bx/implatform/service/IWebrtcService.java | 1 + .../service/impl/GroupMemberServiceImpl.java | 5 - .../service/impl/GroupMessageServiceImpl.java | 69 +++------ .../service/impl/GroupServiceImpl.java | 146 ++++++++---------- .../impl/PrivateMessageServiceImpl.java | 12 +- .../service/impl/UserServiceImpl.java | 100 ++++++------ .../service/impl/WebrtcServiceImpl.java | 8 +- .../service/thirdparty/FileService.java | 21 ++- .../bx/implatform/session/WebrtcSession.java | 2 - .../com/bx/implatform/util/BeanUtils.java | 133 +--------------- .../com/bx/implatform/util/DateTimeUtils.java | 18 +-- .../java/com/bx/implatform/util/FileUtil.java | 3 +- .../com/bx/implatform/util/MinioUtil.java | 58 ++----- .../java/com/bx/implatform/util/XssUtil.java | 4 +- .../java/com/bx/implatform/vo/GroupVO.java | 1 - .../com/bx/imserver/config/RedisConfig.java | 14 +- .../bx/imserver/netty/IMChannelHandler.java | 23 ++- .../com/bx/imserver/netty/IMServerGroup.java | 1 - .../bx/imserver/netty/UserChannelCtxMap.java | 1 - .../processor/GroupMessageProcessor.java | 5 +- .../netty/processor/HeartbeatProcessor.java | 11 +- .../netty/processor/LoginProcessor.java | 11 +- .../processor/PrivateMessageProcessor.java | 9 +- .../netty/processor/ProcessorFactory.java | 8 +- .../bx/imserver/netty/ws/WebSocketServer.java | 7 +- .../ws/endecode/MessageProtocolEncoder.java | 1 - .../task/AbstractPullMessageTask.java | 4 +- .../imserver/task/PullGroupMessageTask.java | 7 +- .../imserver/task/PullPrivateMessageTask.java | 9 +- 65 files changed, 304 insertions(+), 622 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 fcaafcd..a17f6a9 100644 --- a/im-client/src/main/java/com/bx/imclient/IMClient.java +++ b/im-client/src/main/java/com/bx/imclient/IMClient.java @@ -5,7 +5,6 @@ import com.bx.imcommon.enums.IMTerminalType; import com.bx.imcommon.model.IMGroupMessage; import com.bx.imcommon.model.IMPrivateMessage; import lombok.AllArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import java.util.List; diff --git a/im-client/src/main/java/com/bx/imclient/config/RedisConfig.java b/im-client/src/main/java/com/bx/imclient/config/RedisConfig.java index a9799f8..d2312c0 100644 --- a/im-client/src/main/java/com/bx/imclient/config/RedisConfig.java +++ b/im-client/src/main/java/com/bx/imclient/config/RedisConfig.java @@ -1,21 +1,12 @@ package com.bx.imclient.config; import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer; -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.annotation.PropertyAccessor; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; -import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; -import javax.annotation.Resource; - @Configuration("IMRedisConfig") public class RedisConfig { 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 b090051..79c31c1 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 @@ -8,23 +8,21 @@ import com.bx.imcommon.enums.IMListenerType; import com.bx.imcommon.enums.IMSendCode; import com.bx.imcommon.enums.IMTerminalType; import com.bx.imcommon.model.*; -import lombok.AllArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; +import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.*; @Service -@AllArgsConstructor +@RequiredArgsConstructor public class IMSender { - @Autowired - @Qualifier("IMRedisTemplate") + @Resource(name="IMRedisTemplate") private RedisTemplate redisTemplate; - private MessageListenerMulticaster listenerMulticaster; + private final MessageListenerMulticaster listenerMulticaster; public void sendPrivateMessage(IMPrivateMessage message) { for (Integer terminal : message.getRecvTerminals()) { diff --git a/im-client/src/main/java/com/bx/imclient/task/AbstractMessageResultTask.java b/im-client/src/main/java/com/bx/imclient/task/AbstractMessageResultTask.java index 52f437b..b7615a6 100644 --- a/im-client/src/main/java/com/bx/imclient/task/AbstractMessageResultTask.java +++ b/im-client/src/main/java/com/bx/imclient/task/AbstractMessageResultTask.java @@ -5,7 +5,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.boot.CommandLineRunner; import javax.annotation.PreDestroy; -import java.util.concurrent.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; @Slf4j public abstract class AbstractMessageResultTask implements CommandLineRunner { diff --git a/im-client/src/main/java/com/bx/imclient/task/GroupMessageResultResultTask.java b/im-client/src/main/java/com/bx/imclient/task/GroupMessageResultResultTask.java index 67cfd8b..3fa8d12 100644 --- a/im-client/src/main/java/com/bx/imclient/task/GroupMessageResultResultTask.java +++ b/im-client/src/main/java/com/bx/imclient/task/GroupMessageResultResultTask.java @@ -6,8 +6,6 @@ import com.bx.imcommon.contant.IMRedisKey; import com.bx.imcommon.enums.IMListenerType; import com.bx.imcommon.model.IMSendResult; import lombok.AllArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; diff --git a/im-client/src/main/java/com/bx/imclient/task/PrivateMessageResultResultTask.java b/im-client/src/main/java/com/bx/imclient/task/PrivateMessageResultResultTask.java index 39ee51c..92fa7e0 100644 --- a/im-client/src/main/java/com/bx/imclient/task/PrivateMessageResultResultTask.java +++ b/im-client/src/main/java/com/bx/imclient/task/PrivateMessageResultResultTask.java @@ -7,8 +7,6 @@ import com.bx.imcommon.enums.IMListenerType; import com.bx.imcommon.model.IMSendResult; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; diff --git a/im-commom/src/main/java/com/bx/imcommon/enums/IMCmdType.java b/im-commom/src/main/java/com/bx/imcommon/enums/IMCmdType.java index 2311468..4503340 100644 --- a/im-commom/src/main/java/com/bx/imcommon/enums/IMCmdType.java +++ b/im-commom/src/main/java/com/bx/imcommon/enums/IMCmdType.java @@ -13,9 +13,9 @@ public enum IMCmdType { GROUP_MESSAGE(4,"群发消息"); - private Integer code; + private final Integer code; - private String desc; + private final String desc; public static IMCmdType fromCode(Integer code){ diff --git a/im-commom/src/main/java/com/bx/imcommon/enums/IMListenerType.java b/im-commom/src/main/java/com/bx/imcommon/enums/IMListenerType.java index c0de103..21da1e9 100644 --- a/im-commom/src/main/java/com/bx/imcommon/enums/IMListenerType.java +++ b/im-commom/src/main/java/com/bx/imcommon/enums/IMListenerType.java @@ -8,9 +8,9 @@ public enum IMListenerType{ PRIVATE_MESSAGE(1,"私聊消息"), GROUP_MESSAGE(2,"群聊消息"); - private Integer code; + private final Integer code; - private String desc; + private final String desc; diff --git a/im-commom/src/main/java/com/bx/imcommon/enums/IMSendCode.java b/im-commom/src/main/java/com/bx/imcommon/enums/IMSendCode.java index 5189a2f..a633a1a 100644 --- a/im-commom/src/main/java/com/bx/imcommon/enums/IMSendCode.java +++ b/im-commom/src/main/java/com/bx/imcommon/enums/IMSendCode.java @@ -10,21 +10,8 @@ public enum IMSendCode { NOT_FIND_CHANNEL(2,"未找到对方的channel"), UNKONW_ERROR(9999,"未知异常"); - private Integer code; - private String desc; - - - public static IMSendCode fromCode(Integer code){ - for (IMSendCode typeEnum:values()) { - if (typeEnum.code.equals(code)) { - return typeEnum; - } - } - return null; - } - - - + private final Integer code; + private final String desc; public Integer code(){ return this.code; diff --git a/im-commom/src/main/java/com/bx/imcommon/enums/IMTerminalType.java b/im-commom/src/main/java/com/bx/imcommon/enums/IMTerminalType.java index d0f4b81..db118da 100644 --- a/im-commom/src/main/java/com/bx/imcommon/enums/IMTerminalType.java +++ b/im-commom/src/main/java/com/bx/imcommon/enums/IMTerminalType.java @@ -12,9 +12,9 @@ public enum IMTerminalType { WEB(0,"web"), APP(1,"app"); - private Integer code; + private final Integer code; - private String desc; + private final String desc; public static IMTerminalType fromCode(Integer code){ diff --git a/im-commom/src/main/java/com/bx/imcommon/model/IMGroupMessage.java b/im-commom/src/main/java/com/bx/imcommon/model/IMGroupMessage.java index 2c298ca..b9f97aa 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/IMGroupMessage.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/IMGroupMessage.java @@ -3,7 +3,6 @@ package com.bx.imcommon.model; import com.bx.imcommon.enums.IMTerminalType; import lombok.Data; -import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -18,7 +17,7 @@ public class IMGroupMessage { /** * 接收者id列表(群成员列表,为空则不会推送) */ - private List recvIds = Collections.EMPTY_LIST; + private List recvIds = new LinkedList<>(); /** diff --git a/im-commom/src/main/java/com/bx/imcommon/model/IMRecvInfo.java b/im-commom/src/main/java/com/bx/imcommon/model/IMRecvInfo.java index b0939aa..bbd085c 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/IMRecvInfo.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/IMRecvInfo.java @@ -7,27 +7,27 @@ import java.util.List; @Data public class IMRecvInfo { - /* + /** * 命令类型 IMCmdType */ private Integer cmd; - /* + /** * 发送方 */ private IMUserInfo sender; - /* + /** * 接收方用户列表 */ List receivers; - /* + /** * 是否需要回调发送结果 */ private Boolean sendResult; - /* + /** * 推送消息体 */ private Object data; diff --git a/im-commom/src/main/java/com/bx/imcommon/model/IMSendInfo.java b/im-commom/src/main/java/com/bx/imcommon/model/IMSendInfo.java index 769851b..7bf7e68 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/IMSendInfo.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/IMSendInfo.java @@ -5,12 +5,12 @@ import lombok.Data; @Data public class IMSendInfo { - /* + /** * 命令 */ private Integer cmd; - /* + /** * 推送消息体 */ private T data; diff --git a/im-commom/src/main/java/com/bx/imcommon/model/IMSendResult.java b/im-commom/src/main/java/com/bx/imcommon/model/IMSendResult.java index 15d1b43..97ea07e 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/IMSendResult.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/IMSendResult.java @@ -15,12 +15,12 @@ public class IMSendResult { */ private IMUserInfo receiver; - /* + /** * 发送状态 IMCmdType */ private Integer code; - /* + /** * 消息内容 */ private T data; diff --git a/im-commom/src/main/java/com/bx/imcommon/model/IMSessionInfo.java b/im-commom/src/main/java/com/bx/imcommon/model/IMSessionInfo.java index d97256e..ee7122e 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/IMSessionInfo.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/IMSessionInfo.java @@ -1,16 +1,15 @@ package com.bx.imcommon.model; -import com.bx.imcommon.enums.IMTerminalType; import lombok.Data; @Data public class IMSessionInfo { - /* + /** * 用户id */ private Long userId; - /* + /** * 终端类型 */ private Integer terminal; diff --git a/im-commom/src/main/java/com/bx/imcommon/model/IMUserInfo.java b/im-commom/src/main/java/com/bx/imcommon/model/IMUserInfo.java index 72007ea..a25cd0f 100644 --- a/im-commom/src/main/java/com/bx/imcommon/model/IMUserInfo.java +++ b/im-commom/src/main/java/com/bx/imcommon/model/IMUserInfo.java @@ -4,8 +4,6 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; - /** * @author: 谢绍许 * @date: 2023-09-24 09:23:11 diff --git a/im-commom/src/main/java/com/bx/imcommon/util/JwtUtil.java b/im-commom/src/main/java/com/bx/imcommon/util/JwtUtil.java index 72f6b43..9259253 100644 --- a/im-commom/src/main/java/com/bx/imcommon/util/JwtUtil.java +++ b/im-commom/src/main/java/com/bx/imcommon/util/JwtUtil.java @@ -12,11 +12,11 @@ public class JwtUtil { /** * 生成jwt字符串 JWT(json web token) - * @param userId - * @param info - * @param expireIn - * @param secret - * @return + * @param userId 用户id + * @param info 用户细腻系 + * @param expireIn 过期时间 + * @param secret 秘钥 + * @return token * */ public static String sign(Long userId, String info,long expireIn,String secret) { try { @@ -38,8 +38,8 @@ public class JwtUtil { /** * 根据token获取userId - * @param token - * @return + * @param token 登录token + * @return 用户id * */ public static Long getUserId(String token) { try { @@ -51,9 +51,9 @@ public class JwtUtil { } /** - * 根据token获取自定义数据info - * @param token - * @return + * 根据token获取用户数据 + * @param token 用户登录token + * @return 用户数据 * */ public static String getInfo(String token) { try { @@ -65,11 +65,11 @@ public class JwtUtil { /** * 校验token - * @param token - * @param secret - * @return + * @param token 用户登录token + * @param secret 秘钥 + * @return true/false * */ - public static boolean checkSign(String token,String secret) { + public static Boolean checkSign(String token,String secret) { try{ Algorithm algorithm = Algorithm.HMAC256(secret); JWTVerifier verifier = JWT.require(algorithm).build(); diff --git a/im-platform/src/main/java/com/bx/implatform/config/GlobalCorsConfig.java b/im-platform/src/main/java/com/bx/implatform/config/GlobalCorsConfig.java index 4ee8955..113a221 100644 --- a/im-platform/src/main/java/com/bx/implatform/config/GlobalCorsConfig.java +++ b/im-platform/src/main/java/com/bx/implatform/config/GlobalCorsConfig.java @@ -2,7 +2,6 @@ package com.bx.implatform.config; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; diff --git a/im-platform/src/main/java/com/bx/implatform/config/ICEServer.java b/im-platform/src/main/java/com/bx/implatform/config/ICEServer.java index d29c182..cdd4ad0 100644 --- a/im-platform/src/main/java/com/bx/implatform/config/ICEServer.java +++ b/im-platform/src/main/java/com/bx/implatform/config/ICEServer.java @@ -6,14 +6,8 @@ import lombok.Data; @Data public class ICEServer { - - private String urls; - - private String username; - - private String credential; } diff --git a/im-platform/src/main/java/com/bx/implatform/config/MvcConfig.java b/im-platform/src/main/java/com/bx/implatform/config/MvcConfig.java index 4ebff3c..095fd26 100644 --- a/im-platform/src/main/java/com/bx/implatform/config/MvcConfig.java +++ b/im-platform/src/main/java/com/bx/implatform/config/MvcConfig.java @@ -2,6 +2,7 @@ package com.bx.implatform.config; import com.bx.implatform.interceptor.AuthInterceptor; import com.bx.implatform.interceptor.XssInterceptor; +import lombok.AllArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -11,30 +12,22 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration +@AllArgsConstructor public class MvcConfig implements WebMvcConfigurer { + private final AuthInterceptor authInterceptor; + private final XssInterceptor xssInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(xssInterceptor()) + registry.addInterceptor(xssInterceptor) .addPathPatterns("/**"); - registry.addInterceptor(authInterceptor()) + registry.addInterceptor(authInterceptor) .addPathPatterns("/**") .excludePathPatterns("/login","/logout","/register","/refreshToken", "/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**"); } - @Bean - public AuthInterceptor authInterceptor() { - return new AuthInterceptor(); - } - - @Bean - public XssInterceptor xssInterceptor() { - return new XssInterceptor(); - } - - @Bean public PasswordEncoder passwordEncoder(){ // 使用BCrypt加密密码 diff --git a/im-platform/src/main/java/com/bx/implatform/controller/FileController.java b/im-platform/src/main/java/com/bx/implatform/controller/FileController.java index 55b29b3..795caf4 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/FileController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/FileController.java @@ -8,7 +8,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; diff --git a/im-platform/src/main/java/com/bx/implatform/controller/FriendController.java b/im-platform/src/main/java/com/bx/implatform/controller/FriendController.java index e889eaa..4e55180 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/FriendController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/FriendController.java @@ -9,7 +9,6 @@ import com.bx.implatform.vo.FriendVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; diff --git a/im-platform/src/main/java/com/bx/implatform/controller/GroupController.java b/im-platform/src/main/java/com/bx/implatform/controller/GroupController.java index 2bd9c46..fb73e5c 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/GroupController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/GroupController.java @@ -1,6 +1,5 @@ package com.bx.implatform.controller; - import com.bx.implatform.result.Result; import com.bx.implatform.result.ResultUtils; import com.bx.implatform.service.IGroupService; @@ -10,11 +9,9 @@ import com.bx.implatform.vo.GroupVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; -import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.List; diff --git a/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java b/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java index 38a54f1..55432c1 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java @@ -1,16 +1,13 @@ package com.bx.implatform.controller; - -import com.bx.implatform.vo.GroupMessageVO; +import com.bx.implatform.dto.GroupMessageDTO; import com.bx.implatform.result.Result; import com.bx.implatform.result.ResultUtils; import com.bx.implatform.service.IGroupMessageService; -import com.bx.implatform.dto.GroupMessageDTO; -import com.bx.implatform.vo.PrivateMessageVO; +import com.bx.implatform.vo.GroupMessageVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; diff --git a/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java b/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java index 7bcf0df..8394a8f 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java @@ -1,17 +1,15 @@ package com.bx.implatform.controller; - +import com.bx.implatform.dto.LoginDTO; import com.bx.implatform.dto.ModifyPwdDTO; +import com.bx.implatform.dto.RegisterDTO; import com.bx.implatform.result.Result; import com.bx.implatform.result.ResultUtils; import com.bx.implatform.service.IUserService; -import com.bx.implatform.dto.LoginDTO; -import com.bx.implatform.dto.RegisterDTO; import com.bx.implatform.vo.LoginVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; diff --git a/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java b/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java index 625d58b..7c502b1 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java @@ -1,15 +1,13 @@ package com.bx.implatform.controller; - -import com.bx.implatform.vo.PrivateMessageVO; +import com.bx.implatform.dto.PrivateMessageDTO; import com.bx.implatform.result.Result; import com.bx.implatform.result.ResultUtils; import com.bx.implatform.service.IPrivateMessageService; -import com.bx.implatform.dto.PrivateMessageDTO; +import com.bx.implatform.vo.PrivateMessageVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; 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 c5ad0c1..1037aef 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 @@ -12,7 +12,6 @@ import com.bx.implatform.vo.UserVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; diff --git a/im-platform/src/main/java/com/bx/implatform/controller/WebrtcController.java b/im-platform/src/main/java/com/bx/implatform/controller/WebrtcController.java index cb98ef9..ef12c0e 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/WebrtcController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/WebrtcController.java @@ -7,7 +7,6 @@ import com.bx.implatform.service.IWebrtcService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; diff --git a/im-platform/src/main/java/com/bx/implatform/interceptor/AuthInterceptor.java b/im-platform/src/main/java/com/bx/implatform/interceptor/AuthInterceptor.java index 2201159..0337bbd 100644 --- a/im-platform/src/main/java/com/bx/implatform/interceptor/AuthInterceptor.java +++ b/im-platform/src/main/java/com/bx/implatform/interceptor/AuthInterceptor.java @@ -1,26 +1,27 @@ package com.bx.implatform.interceptor; - import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; +import com.bx.imcommon.util.JwtUtil; import com.bx.implatform.config.JwtProperties; import com.bx.implatform.enums.ResultCode; import com.bx.implatform.exception.GlobalException; import com.bx.implatform.session.UserSession; -import com.bx.imcommon.util.JwtUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Slf4j +@Component +@AllArgsConstructor public class AuthInterceptor implements HandlerInterceptor { - @Autowired - private JwtProperties jwtProperties; + private final JwtProperties jwtProperties; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { diff --git a/im-platform/src/main/java/com/bx/implatform/interceptor/XssInterceptor.java b/im-platform/src/main/java/com/bx/implatform/interceptor/XssInterceptor.java index 96278fa..1137a39 100644 --- a/im-platform/src/main/java/com/bx/implatform/interceptor/XssInterceptor.java +++ b/im-platform/src/main/java/com/bx/implatform/interceptor/XssInterceptor.java @@ -5,6 +5,7 @@ import com.bx.implatform.exception.GlobalException; import com.bx.implatform.util.XssUtil; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; @@ -13,9 +14,9 @@ import java.io.BufferedReader; import java.util.Map; @Slf4j +@Component public class XssInterceptor implements HandlerInterceptor { - @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { // 检查参数 diff --git a/im-platform/src/main/java/com/bx/implatform/listener/GroupMessageListener.java b/im-platform/src/main/java/com/bx/implatform/listener/GroupMessageListener.java index 3527998..024aa7b 100644 --- a/im-platform/src/main/java/com/bx/implatform/listener/GroupMessageListener.java +++ b/im-platform/src/main/java/com/bx/implatform/listener/GroupMessageListener.java @@ -4,12 +4,11 @@ import com.bx.imclient.annotation.IMListener; import com.bx.imclient.listener.MessageListener; import com.bx.imcommon.enums.IMListenerType; import com.bx.imcommon.enums.IMSendCode; -import com.bx.implatform.vo.GroupMessageVO; import com.bx.imcommon.model.IMSendResult; import com.bx.implatform.contant.RedisKey; +import com.bx.implatform.vo.GroupMessageVO; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; diff --git a/im-platform/src/main/java/com/bx/implatform/listener/PrivateMessageListener.java b/im-platform/src/main/java/com/bx/implatform/listener/PrivateMessageListener.java index 13a58ee..6e98e44 100644 --- a/im-platform/src/main/java/com/bx/implatform/listener/PrivateMessageListener.java +++ b/im-platform/src/main/java/com/bx/implatform/listener/PrivateMessageListener.java @@ -5,12 +5,11 @@ import com.bx.imclient.annotation.IMListener; import com.bx.imclient.listener.MessageListener; import com.bx.imcommon.enums.IMListenerType; import com.bx.imcommon.enums.IMSendCode; -import com.bx.implatform.vo.PrivateMessageVO; import com.bx.imcommon.model.IMSendResult; import com.bx.implatform.entity.PrivateMessage; import com.bx.implatform.enums.MessageStatus; import com.bx.implatform.service.IPrivateMessageService; -import lombok.AllArgsConstructor; +import com.bx.implatform.vo.PrivateMessageVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; diff --git a/im-platform/src/main/java/com/bx/implatform/result/ResultUtils.java b/im-platform/src/main/java/com/bx/implatform/result/ResultUtils.java index 50326fd..88e3883 100644 --- a/im-platform/src/main/java/com/bx/implatform/result/ResultUtils.java +++ b/im-platform/src/main/java/com/bx/implatform/result/ResultUtils.java @@ -5,61 +5,53 @@ import com.bx.implatform.enums.ResultCode; public class ResultUtils { - public static final Result success(){ - Result result=new Result(); + public static Result success(){ + Result result=new Result<>(); result.setCode(ResultCode.SUCCESS.getCode()); result.setMessage(ResultCode.SUCCESS.getMsg()); return result; } - public static final Result success(T data){ - Result result=new Result(); + public static Result success(T data){ + Result result=new Result<>(); result.setCode(ResultCode.SUCCESS.getCode()); result.setMessage(ResultCode.SUCCESS.getMsg()); result.setData(data); return result; } - public static final Result success(T data, String messsage){ - Result result=new Result(); + public static Result success(T data, String messsage){ + Result result=new Result<>(); result.setCode(ResultCode.SUCCESS.getCode()); result.setMessage(messsage); result.setData(data); return result; } - public static final Result success(String messsage){ - Result result=new Result(); + public static Result success(String messsage){ + Result result=new Result<>(); result.setCode(ResultCode.SUCCESS.getCode()); result.setMessage(messsage); return result; } - public static final Result error(Integer code, String messsage){ - Result result=new Result(); + public static Result error(Integer code, String messsage){ + Result result=new Result<>(); result.setCode(code); result.setMessage(messsage); return result; } - public static final Result error(ResultCode resultCode, String messsage){ - Result result=new Result(); + public static Result error(ResultCode resultCode, String messsage){ + Result result=new Result<>(); result.setCode(resultCode.getCode()); result.setMessage(messsage); return result; } - public static final Result error(ResultCode resultCode, String messsage, T data){ - Result result=new Result(); - result.setCode(resultCode.getCode()); - result.setMessage(messsage); - result.setData(data); - return result; - } - - public static final Result error(ResultCode resultCode){ - Result result=new Result(); + public static Result error(ResultCode resultCode){ + Result result=new Result<>(); result.setCode(resultCode.getCode()); result.setMessage(resultCode.getMsg()); return result; diff --git a/im-platform/src/main/java/com/bx/implatform/service/IGroupMessageService.java b/im-platform/src/main/java/com/bx/implatform/service/IGroupMessageService.java index b92ba78..610925c 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/IGroupMessageService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/IGroupMessageService.java @@ -1,9 +1,9 @@ package com.bx.implatform.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.bx.implatform.vo.GroupMessageVO; -import com.bx.implatform.entity.GroupMessage; import com.bx.implatform.dto.GroupMessageDTO; +import com.bx.implatform.entity.GroupMessage; +import com.bx.implatform.vo.GroupMessageVO; import java.util.List; diff --git a/im-platform/src/main/java/com/bx/implatform/service/IPrivateMessageService.java b/im-platform/src/main/java/com/bx/implatform/service/IPrivateMessageService.java index 9cfeaca..750f1d7 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/IPrivateMessageService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/IPrivateMessageService.java @@ -1,9 +1,9 @@ package com.bx.implatform.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.bx.implatform.vo.PrivateMessageVO; -import com.bx.implatform.entity.PrivateMessage; import com.bx.implatform.dto.PrivateMessageDTO; +import com.bx.implatform.entity.PrivateMessage; +import com.bx.implatform.vo.PrivateMessageVO; import java.util.List; 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 8a1c2d1..f24fb2b 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 @@ -1,10 +1,10 @@ package com.bx.implatform.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.bx.implatform.dto.ModifyPwdDTO; -import com.bx.implatform.entity.User; import com.bx.implatform.dto.LoginDTO; +import com.bx.implatform.dto.ModifyPwdDTO; import com.bx.implatform.dto.RegisterDTO; +import com.bx.implatform.entity.User; import com.bx.implatform.vo.LoginVO; import com.bx.implatform.vo.OnlineTerminalVO; import com.bx.implatform.vo.UserVO; diff --git a/im-platform/src/main/java/com/bx/implatform/service/IWebrtcService.java b/im-platform/src/main/java/com/bx/implatform/service/IWebrtcService.java index 0b2e345..4a52746 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/IWebrtcService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/IWebrtcService.java @@ -2,6 +2,7 @@ package com.bx.implatform.service; import com.bx.implatform.config.ICEServer; import org.springframework.web.bind.annotation.RequestBody; + import java.util.List; diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java index 7edda3d..8f0181e 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java @@ -21,17 +21,12 @@ import java.util.stream.Collectors; @Service @CacheConfig(cacheNames = RedisKey.IM_CACHE_GROUP_MEMBER_ID) public class GroupMemberServiceImpl extends ServiceImpl implements IGroupMemberService { - - - @CacheEvict(key="#member.getGroupId()") @Override public boolean save(GroupMember member) { return super.save(member); } - - @CacheEvict(key="#groupId") @Override public boolean saveOrUpdateBatch(Long groupId,List members) { diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java index dd0cc79..7599c56 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java @@ -40,11 +40,10 @@ import java.util.stream.Collectors; @Service @AllArgsConstructor public class GroupMessageServiceImpl extends ServiceImpl implements IGroupMessageService { - private IGroupService groupService; - private IGroupMemberService groupMemberService; - private RedisTemplate redisTemplate; - private IMClient imClient; - + private final IGroupService groupService; + private final IGroupMemberService groupMemberService; + private final RedisTemplate redisTemplate; + private final IMClient imClient; @Override public Long sendMessage(GroupMessageDTO dto) { @@ -58,7 +57,7 @@ public class GroupMessageServiceImpl extends ServiceImpl wrapper = Wrappers.lambdaQuery(); - wrapper.eq(GroupMessage::getGroupId, member.getGroupId()) - .gt(GroupMessage::getSendTime, member.getCreatedTime()) - .ne(GroupMessage::getSendId, session.getUserId()) - .ne(GroupMessage::getStatus, MessageStatus.RECALL.code()); + wrapper.eq(GroupMessage::getGroupId, member.getGroupId()).gt(GroupMessage::getSendTime, member.getCreatedTime()) + .ne(GroupMessage::getSendId, session.getUserId()).ne(GroupMessage::getStatus, MessageStatus.RECALL.code()); if (maxReadedId != null) { wrapper.gt(GroupMessage::getId, maxReadedId); } @@ -174,43 +169,37 @@ public class GroupMessageServiceImpl extends ServiceImpl loadMessage(Long minId) { UserSession session = SessionContext.getSession(); List members = groupMemberService.findByUserId(session.getUserId()); List ids = members.stream().map(GroupMember::getGroupId).collect(Collectors.toList()); - if(CollectionUtil.isEmpty(ids)){ + if (CollectionUtil.isEmpty(ids)) { return new ArrayList<>(); } // 只能拉取最近1个月的 Date minDate = DateTimeUtils.addMonths(new Date(), -1); LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.gt(GroupMessage::getId, minId) - .gt(GroupMessage::getSendTime, minDate) - .in(GroupMessage::getGroupId, ids) - .ne(GroupMessage::getStatus, MessageStatus.RECALL.code()) - .orderByAsc(GroupMessage::getId) - .last("limit 100"); + wrapper.gt(GroupMessage::getId, minId).gt(GroupMessage::getSendTime, minDate).in(GroupMessage::getGroupId, ids) + .ne(GroupMessage::getStatus, MessageStatus.RECALL.code()).orderByAsc(GroupMessage::getId).last("limit 100"); List messages = this.list(wrapper); // 转成vo List vos = messages.stream().map(m -> { GroupMessageVO vo = BeanUtils.copyProperties(m, GroupMessageVO.class); // 被@用户列表 - List atIds = Arrays.asList(StrUtil.split(m.getAtUserIds(),",")); + List atIds = Arrays.asList(StrUtil.split(m.getAtUserIds(), ",")); vo.setAtUserIds(atIds.stream().map(Long::parseLong).collect(Collectors.toList())); return vo; }).collect(Collectors.toList()); // 消息状态,数据库没有存群聊的消息状态,需要从redis取 - List keys = ids.stream() - .map(id -> String.join(":", RedisKey.IM_GROUP_READED_POSITION, id.toString(), session.getUserId().toString())) - .collect(Collectors.toList()); + List keys = ids.stream().map(id -> String.join(":", RedisKey.IM_GROUP_READED_POSITION, id.toString(), session.getUserId().toString())) + .collect(Collectors.toList()); List sendPos = redisTemplate.opsForValue().multiGet(keys); int idx = 0; for (Long id : ids) { Object o = sendPos.get(idx); - Integer sendMaxId = Objects.isNull(o) ? -1 : (Integer) o; + Integer sendMaxId = Objects.isNull(o) ? -1 : (Integer)o; vos.stream().filter(vo -> vo.getGroupId().equals(id)).forEach(vo -> { if (vo.getId() <= sendMaxId) { // 已读 @@ -225,18 +214,14 @@ public class GroupMessageServiceImpl extends ServiceImpl wrapper = Wrappers.lambdaQuery(); - wrapper.eq(GroupMessage::getGroupId, groupId) - .orderByDesc(GroupMessage::getId) - .last("limit 1") - .select(GroupMessage::getId); + wrapper.eq(GroupMessage::getGroupId, groupId).orderByDesc(GroupMessage::getId).last("limit 1").select(GroupMessage::getId); GroupMessage message = this.getOne(wrapper); - if(Objects.isNull(message)){ + if (Objects.isNull(message)) { return; } // 推送消息给自己的其他终端 @@ -252,12 +237,11 @@ public class GroupMessageServiceImpl extends ServiceImpl findHistoryMessage(Long groupId, Long page, Long size) { page = page > 0 ? page : 1; @@ -271,17 +255,14 @@ public class GroupMessageServiceImpl extends ServiceImpl wrapper = new QueryWrapper<>(); - wrapper.lambda().eq(GroupMessage::getGroupId, groupId) - .gt(GroupMessage::getSendTime, member.getCreatedTime()) - .ne(GroupMessage::getStatus, MessageStatus.RECALL.code()) - .orderByDesc(GroupMessage::getId) - .last("limit " + stIdx + "," + size); + wrapper.lambda().eq(GroupMessage::getGroupId, groupId).gt(GroupMessage::getSendTime, member.getCreatedTime()) + .ne(GroupMessage::getStatus, MessageStatus.RECALL.code()).orderByDesc(GroupMessage::getId).last("limit " + stIdx + "," + size); List messages = this.list(wrapper); - List messageInfos = messages.stream().map(m -> BeanUtils.copyProperties(m, GroupMessageVO.class)).collect(Collectors.toList()); + List messageInfos = + messages.stream().map(m -> BeanUtils.copyProperties(m, GroupMessageVO.class)).collect(Collectors.toList()); log.info("拉取群聊记录,用户id:{},群聊id:{},数量:{}", userId, groupId, messageInfos.size()); return messageInfos; } - } diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java index 7cd737b..080b72c 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java @@ -38,24 +38,22 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; - @Slf4j @CacheConfig(cacheNames = RedisKey.IM_CACHE_GROUP) @Service @AllArgsConstructor public class GroupServiceImpl extends ServiceImpl implements IGroupService { - private IUserService userService; - private IGroupMemberService groupMemberService; - private IFriendService friendsService; - private IMClient imClient; - + private final IUserService userService; + private final IGroupMemberService groupMemberService; + private final IFriendService friendsService; + private final IMClient imClient; @Override public GroupVO createGroup(GroupVO vo) { UserSession session = SessionContext.getSession(); User user = userService.getById(session.getUserId()); // 保存群组数据 - Group group = BeanUtils.copyProperties(vo,Group.class); + Group group = BeanUtils.copyProperties(vo, Group.class); group.setOwnerId(user.getId()); this.save(group); // 把群主加入群 @@ -63,18 +61,17 @@ public class GroupServiceImpl extends ServiceImpl implements groupMember.setGroupId(group.getId()); groupMember.setUserId(user.getId()); groupMember.setHeadImage(user.getHeadImageThumb()); - groupMember.setAliasName(StringUtils.isEmpty(vo.getAliasName())?session.getNickName():vo.getAliasName()); - groupMember.setRemark(StringUtils.isEmpty(vo.getRemark())?group.getName():vo.getRemark()); + groupMember.setAliasName(StringUtils.isEmpty(vo.getAliasName()) ? session.getNickName() : vo.getAliasName()); + groupMember.setRemark(StringUtils.isEmpty(vo.getRemark()) ? group.getName() : vo.getRemark()); groupMemberService.save(groupMember); vo.setId(group.getId()); vo.setAliasName(groupMember.getAliasName()); vo.setRemark(groupMember.getRemark()); - log.info("创建群聊,群聊id:{},群聊名称:{}",group.getId(),group.getName()); + log.info("创建群聊,群聊id:{},群聊名称:{}", group.getId(), group.getName()); return vo; } - @CacheEvict(value = "#vo.getId()") @Transactional(rollbackFor = Exception.class) @Override @@ -83,109 +80,99 @@ public class GroupServiceImpl extends ServiceImpl implements // 校验是不是群主,只有群主能改信息 Group group = this.getById(vo.getId()); // 群主有权修改群基本信息 - if(group.getOwnerId().equals(session.getUserId()) ){ - group = BeanUtils.copyProperties(vo,Group.class); + if (group.getOwnerId().equals(session.getUserId())) { + group = BeanUtils.copyProperties(vo, Group.class); this.updateById(group); } // 更新成员信息 - GroupMember member = groupMemberService.findByGroupAndUserId(vo.getId(),session.getUserId()); - if(member == null){ - throw new GlobalException(ResultCode.PROGRAM_ERROR,"您不是群聊的成员"); + GroupMember member = groupMemberService.findByGroupAndUserId(vo.getId(), session.getUserId()); + if (member == null) { + throw new GlobalException(ResultCode.PROGRAM_ERROR, "您不是群聊的成员"); } - member.setAliasName(StringUtils.isEmpty(vo.getAliasName())?session.getNickName():vo.getAliasName()); - member.setRemark(StringUtils.isEmpty(vo.getRemark())?group.getName():vo.getRemark()); + member.setAliasName(StringUtils.isEmpty(vo.getAliasName()) ? session.getNickName() : vo.getAliasName()); + member.setRemark(StringUtils.isEmpty(vo.getRemark()) ? group.getName() : vo.getRemark()); groupMemberService.updateById(member); - log.info("修改群聊,群聊id:{},群聊名称:{}",group.getId(),group.getName()); + log.info("修改群聊,群聊id:{},群聊名称:{}", group.getId(), group.getName()); return vo; } - - @Transactional(rollbackFor = Exception.class) @CacheEvict(value = "#groupId") @Override public void deleteGroup(Long groupId) { UserSession session = SessionContext.getSession(); Group group = this.getById(groupId); - if(!group.getOwnerId().equals(session.getUserId())){ - throw new GlobalException(ResultCode.PROGRAM_ERROR,"只有群主才有权限解除群聊"); + if (!group.getOwnerId().equals(session.getUserId())) { + throw new GlobalException(ResultCode.PROGRAM_ERROR, "只有群主才有权限解除群聊"); } // 逻辑删除群数据 group.setDeleted(true); this.updateById(group); // 删除成员数据 groupMemberService.removeByGroupId(groupId); - log.info("删除群聊,群聊id:{},群聊名称:{}",group.getId(),group.getName()); + log.info("删除群聊,群聊id:{},群聊名称:{}", group.getId(), group.getName()); } - - @Override public void quitGroup(Long groupId) { Long userId = SessionContext.getSession().getUserId(); Group group = this.getById(groupId); - if(group.getOwnerId().equals(userId)){ - throw new GlobalException(ResultCode.PROGRAM_ERROR,"您是群主,不可退出群聊"); + if (group.getOwnerId().equals(userId)) { + throw new GlobalException(ResultCode.PROGRAM_ERROR, "您是群主,不可退出群聊"); } // 删除群聊成员 - groupMemberService.removeByGroupAndUserId(groupId,userId); - log.info("退出群聊,群聊id:{},群聊名称:{},用户id:{}",group.getId(),group.getName(),userId); + groupMemberService.removeByGroupAndUserId(groupId, userId); + log.info("退出群聊,群聊id:{},群聊名称:{},用户id:{}", group.getId(), group.getName(), userId); } - - @Override public void kickGroup(Long groupId, Long userId) { UserSession session = SessionContext.getSession(); Group group = this.getById(groupId); - if(!group.getOwnerId().equals(session.getUserId()) ){ - throw new GlobalException(ResultCode.PROGRAM_ERROR,"您不是群主,没有权限踢人"); + if (!group.getOwnerId().equals(session.getUserId())) { + throw new GlobalException(ResultCode.PROGRAM_ERROR, "您不是群主,没有权限踢人"); } - if(userId.equals(session.getUserId())){ - throw new GlobalException(ResultCode.PROGRAM_ERROR,"亲,不能自己踢自己哟"); + if (userId.equals(session.getUserId())) { + throw new GlobalException(ResultCode.PROGRAM_ERROR, "亲,不能自己踢自己哟"); } // 删除群聊成员 - groupMemberService.removeByGroupAndUserId(groupId,userId); - log.info("踢出群聊,群聊id:{},群聊名称:{},用户id:{}",group.getId(),group.getName(),userId); + groupMemberService.removeByGroupAndUserId(groupId, userId); + log.info("踢出群聊,群聊id:{},群聊名称:{},用户id:{}", group.getId(), group.getName(), userId); } @Override public GroupVO findById(Long groupId) { UserSession session = SessionContext.getSession(); Group group = this.getById(groupId); - GroupMember member = groupMemberService.findByGroupAndUserId(groupId,session.getUserId()); - if(member == null){ - throw new GlobalException(ResultCode.PROGRAM_ERROR,"您未加入群聊"); + GroupMember member = groupMemberService.findByGroupAndUserId(groupId, session.getUserId()); + if (member == null) { + throw new GlobalException(ResultCode.PROGRAM_ERROR, "您未加入群聊"); } - GroupVO vo = BeanUtils.copyProperties(group,GroupVO.class); + GroupVO vo = BeanUtils.copyProperties(group, GroupVO.class); vo.setAliasName(member.getAliasName()); vo.setRemark(member.getRemark()); - return vo; + return vo; } - @Cacheable(value = "#groupId") @Override - public Group getById(Long groupId){ + public Group getById(Long groupId) { Group group = super.getById(groupId); - if(group == null){ - throw new GlobalException(ResultCode.PROGRAM_ERROR,"群组不存在"); + if (group == null) { + throw new GlobalException(ResultCode.PROGRAM_ERROR, "群组不存在"); } - if(group.getDeleted()){ - throw new GlobalException(ResultCode.PROGRAM_ERROR,"群组'"+group.getName()+"'已解散"); + if (group.getDeleted()) { + throw new GlobalException(ResultCode.PROGRAM_ERROR, "群组'" + group.getName() + "'已解散"); } return group; } - - - @Override public List findGroups() { UserSession session = SessionContext.getSession(); // 查询当前用户的群id列表 List groupMembers = groupMemberService.findByUserId(session.getUserId()); - if(groupMembers.isEmpty()){ + if (groupMembers.isEmpty()) { return new LinkedList<>(); } // 拉取群列表 @@ -203,58 +190,55 @@ public class GroupServiceImpl extends ServiceImpl implements }).collect(Collectors.toList()); } - @Override public void invite(GroupInviteVO vo) { UserSession session = SessionContext.getSession(); Group group = this.getById(vo.getGroupId()); - if(group == null){ + if (group == null) { throw new GlobalException(ResultCode.PROGRAM_ERROR, "群聊不存在"); } // 群聊人数校验 List members = groupMemberService.findByGroupId(vo.getGroupId()); - long size = members.stream().filter(m->!m.getQuit()).count(); - if(vo.getFriendIds().size() + size > Constant.MAX_GROUP_MEMBER){ - throw new GlobalException(ResultCode.PROGRAM_ERROR, "群聊人数不能大于"+Constant.MAX_GROUP_MEMBER+"人"); + long size = members.stream().filter(m -> !m.getQuit()).count(); + if (vo.getFriendIds().size() + size > Constant.MAX_GROUP_MEMBER) { + throw new GlobalException(ResultCode.PROGRAM_ERROR, "群聊人数不能大于" + Constant.MAX_GROUP_MEMBER + "人"); } // 找出好友信息 List friends = friendsService.findFriendByUserId(session.getUserId()); - List friendsList = vo.getFriendIds().stream().map(id -> - friends.stream().filter(f -> f.getFriendId().equals(id)).findFirst().get()).collect(Collectors.toList()); + List friendsList = vo.getFriendIds().stream().map(id -> friends.stream().filter(f -> f.getFriendId().equals(id)).findFirst().get()) + .collect(Collectors.toList()); if (friendsList.size() != vo.getFriendIds().size()) { throw new GlobalException(ResultCode.PROGRAM_ERROR, "部分用户不是您的好友,邀请失败"); } // 批量保存成员数据 - List groupMembers = friendsList.stream() - .map(f -> { - Optional optional = members.stream().filter(m->m.getUserId().equals(f.getFriendId())).findFirst(); - GroupMember groupMember = optional.orElseGet(GroupMember::new); - groupMember.setGroupId(vo.getGroupId()); - groupMember.setUserId(f.getFriendId()); - groupMember.setAliasName(f.getFriendNickName()); - groupMember.setRemark(group.getName()); - groupMember.setHeadImage(f.getFriendHeadImage()); - groupMember.setCreatedTime(new Date()); - groupMember.setQuit(false); - return groupMember; - }).collect(Collectors.toList()); - if(!groupMembers.isEmpty()) { - groupMemberService.saveOrUpdateBatch(group.getId(),groupMembers); + List groupMembers = friendsList.stream().map(f -> { + Optional optional = members.stream().filter(m -> m.getUserId().equals(f.getFriendId())).findFirst(); + GroupMember groupMember = optional.orElseGet(GroupMember::new); + groupMember.setGroupId(vo.getGroupId()); + groupMember.setUserId(f.getFriendId()); + groupMember.setAliasName(f.getFriendNickName()); + groupMember.setRemark(group.getName()); + groupMember.setHeadImage(f.getFriendHeadImage()); + groupMember.setCreatedTime(new Date()); + groupMember.setQuit(false); + return groupMember; + }).collect(Collectors.toList()); + if (!groupMembers.isEmpty()) { + groupMemberService.saveOrUpdateBatch(group.getId(), groupMembers); } - log.info("邀请进入群聊,群聊id:{},群聊名称:{},被邀请用户id:{}",group.getId(),group.getName(),vo.getFriendIds()); + log.info("邀请进入群聊,群聊id:{},群聊名称:{},被邀请用户id:{}", group.getId(), group.getName(), vo.getFriendIds()); } - @Override public List findGroupMembers(Long groupId) { List members = groupMemberService.findByGroupId(groupId); - List userIds = members.stream().map(GroupMember::getUserId).collect(Collectors.toList()); + List userIds = members.stream().map(GroupMember::getUserId).collect(Collectors.toList()); List onlineUserIds = imClient.getOnlineUser(userIds); - return members.stream().map(m->{ - GroupMemberVO vo = BeanUtils.copyProperties(m,GroupMemberVO.class); + return members.stream().map(m -> { + GroupMemberVO vo = BeanUtils.copyProperties(m, GroupMemberVO.class); vo.setOnline(onlineUserIds.contains(m.getUserId())); return vo; - }).sorted((m1,m2)-> m2.getOnline().compareTo(m1.getOnline())).collect(Collectors.toList()); + }).sorted((m1, m2) -> m2.getOnline().compareTo(m1.getOnline())).collect(Collectors.toList()); } } diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java index 55ea18b..dd14355 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java @@ -9,9 +9,8 @@ import com.bx.imclient.IMClient; import com.bx.imcommon.contant.IMConstant; import com.bx.imcommon.model.IMPrivateMessage; import com.bx.imcommon.model.IMUserInfo; +import com.bx.implatform.dto.PrivateMessageDTO; import com.bx.implatform.entity.Friend; -import com.bx.implatform.util.DateTimeUtils; -import com.bx.implatform.vo.PrivateMessageVO; import com.bx.implatform.entity.PrivateMessage; import com.bx.implatform.enums.MessageStatus; import com.bx.implatform.enums.MessageType; @@ -23,7 +22,8 @@ import com.bx.implatform.service.IPrivateMessageService; import com.bx.implatform.session.SessionContext; import com.bx.implatform.session.UserSession; import com.bx.implatform.util.BeanUtils; -import com.bx.implatform.dto.PrivateMessageDTO; +import com.bx.implatform.util.DateTimeUtils; +import com.bx.implatform.vo.PrivateMessageVO; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -40,10 +40,8 @@ import java.util.stream.Collectors; @AllArgsConstructor public class PrivateMessageServiceImpl extends ServiceImpl implements IPrivateMessageService { - private IFriendService friendService; - - private IMClient imClient; - + private final IFriendService friendService; + private final IMClient imClient; @Override public Long sendMessage(PrivateMessageDTO dto) { 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 4a90a32..39dcdf5 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 @@ -37,36 +37,34 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; - @Slf4j @Service @AllArgsConstructor public class UserServiceImpl extends ServiceImpl implements IUserService { - RedisTemplate redisTemplate; - private PasswordEncoder passwordEncoder; - private IGroupMemberService groupMemberService; - private IFriendService friendService; - private JwtProperties jwtProperties; - private IMClient imClient; - + private final RedisTemplate redisTemplate; + private final PasswordEncoder passwordEncoder; + private final IGroupMemberService groupMemberService; + private final IFriendService friendService; + private final JwtProperties jwtProperties; + private final IMClient imClient; @Override public LoginVO login(LoginDTO dto) { User user = this.findUserByUserName(dto.getUserName()); - if(null == user){ - throw new GlobalException(ResultCode.PROGRAM_ERROR,"用户不存在"); + if (null == user) { + throw new GlobalException(ResultCode.PROGRAM_ERROR, "用户不存在"); } - if(!passwordEncoder.matches(dto.getPassword(),user.getPassword())){ - throw new GlobalException(ResultCode.PASSWOR_ERROR); + if (!passwordEncoder.matches(dto.getPassword(), user.getPassword())) { + throw new GlobalException(ResultCode.PASSWOR_ERROR); } // 生成token - UserSession session = BeanUtils.copyProperties(user,UserSession.class); + UserSession session = BeanUtils.copyProperties(user, UserSession.class); session.setUserId(user.getId()); session.setTerminal(dto.getTerminal()); String strJson = JSON.toJSONString(session); - String accessToken = JwtUtil.sign(user.getId(),strJson,jwtProperties.getAccessTokenExpireIn(),jwtProperties.getAccessTokenSecret()); - String refreshToken = JwtUtil.sign(user.getId(),strJson,jwtProperties.getRefreshTokenExpireIn(),jwtProperties.getRefreshTokenSecret()); + String accessToken = JwtUtil.sign(user.getId(), strJson, jwtProperties.getAccessTokenExpireIn(), jwtProperties.getAccessTokenSecret()); + String refreshToken = JwtUtil.sign(user.getId(), strJson, jwtProperties.getRefreshTokenExpireIn(), jwtProperties.getRefreshTokenSecret()); LoginVO vo = new LoginVO(); vo.setAccessToken(accessToken); vo.setAccessTokenExpiresIn(jwtProperties.getAccessTokenExpireIn()); @@ -78,14 +76,14 @@ public class UserServiceImpl extends ServiceImpl implements IU @Override public LoginVO refreshToken(String refreshToken) { //验证 token - if(!JwtUtil.checkSign(refreshToken, jwtProperties.getRefreshTokenSecret())){ + if (!JwtUtil.checkSign(refreshToken, jwtProperties.getRefreshTokenSecret())) { throw new GlobalException("refreshToken无效或已过期"); } String strJson = JwtUtil.getInfo(refreshToken); Long userId = JwtUtil.getUserId(refreshToken); - String accessToken = JwtUtil.sign(userId,strJson,jwtProperties.getAccessTokenExpireIn(),jwtProperties.getAccessTokenSecret()); - String newRefreshToken = JwtUtil.sign(userId,strJson,jwtProperties.getRefreshTokenExpireIn(),jwtProperties.getRefreshTokenSecret()); - LoginVO vo =new LoginVO(); + String accessToken = JwtUtil.sign(userId, strJson, jwtProperties.getAccessTokenExpireIn(), jwtProperties.getAccessTokenSecret()); + String newRefreshToken = JwtUtil.sign(userId, strJson, jwtProperties.getRefreshTokenExpireIn(), jwtProperties.getRefreshTokenSecret()); + LoginVO vo = new LoginVO(); vo.setAccessToken(accessToken); vo.setAccessTokenExpiresIn(jwtProperties.getAccessTokenExpireIn()); vo.setRefreshToken(newRefreshToken); @@ -93,68 +91,63 @@ public class UserServiceImpl extends ServiceImpl implements IU return vo; } - @Override public void register(RegisterDTO dto) { User user = this.findUserByUserName(dto.getUserName()); - if(null != user){ - throw new GlobalException(ResultCode.USERNAME_ALREADY_REGISTER); + if (null != user) { + throw new GlobalException(ResultCode.USERNAME_ALREADY_REGISTER); } - user = BeanUtils.copyProperties(dto,User.class); + user = BeanUtils.copyProperties(dto, User.class); user.setPassword(passwordEncoder.encode(user.getPassword())); this.save(user); - log.info("注册用户,用户id:{},用户名:{},昵称:{}",user.getId(),dto.getUserName(),dto.getNickName()); + log.info("注册用户,用户id:{},用户名:{},昵称:{}", user.getId(), dto.getUserName(), dto.getNickName()); } - @Override public void modifyPassword(ModifyPwdDTO dto) { UserSession session = SessionContext.getSession(); User user = this.getById(session.getUserId()); - if(!passwordEncoder.matches(dto.getOldPassword(),user.getPassword())){ - throw new GlobalException("旧密码不正确"); + if (!passwordEncoder.matches(dto.getOldPassword(), user.getPassword())) { + throw new GlobalException("旧密码不正确"); } user.setPassword(passwordEncoder.encode(dto.getNewPassword())); this.updateById(user); - log.info("用户修改密码,用户id:{},用户名:{},昵称:{}",user.getId(),user.getUserName(),user.getNickName()); + log.info("用户修改密码,用户id:{},用户名:{},昵称:{}", user.getId(), user.getUserName(), user.getNickName()); } - @Override public User findUserByUserName(String username) { - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - queryWrapper.eq(User::getUserName,username); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(User::getUserName, username); return this.getOne(queryWrapper); } - - @Transactional(rollbackFor = Exception.class) @Override public void update(UserVO vo) { UserSession session = SessionContext.getSession(); - if(!session.getUserId().equals(vo.getId()) ){ - throw new GlobalException(ResultCode.PROGRAM_ERROR,"不允许修改其他用户的信息!"); + if (!session.getUserId().equals(vo.getId())) { + throw new GlobalException(ResultCode.PROGRAM_ERROR, "不允许修改其他用户的信息!"); } User user = this.getById(vo.getId()); - if(Objects.isNull(user)){ - throw new GlobalException(ResultCode.PROGRAM_ERROR,"用户不存在"); + if (Objects.isNull(user)) { + throw new GlobalException(ResultCode.PROGRAM_ERROR, "用户不存在"); } // 更新好友昵称和头像 - if(!user.getNickName().equals(vo.getNickName()) || !user.getHeadImageThumb().equals(vo.getHeadImageThumb())){ + if (!user.getNickName().equals(vo.getNickName()) || !user.getHeadImageThumb().equals(vo.getHeadImageThumb())) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.lambda().eq(Friend::getFriendId,session.getUserId()); + queryWrapper.lambda().eq(Friend::getFriendId, session.getUserId()); List friends = friendService.list(queryWrapper); - for(Friend friend: friends){ + for (Friend friend : friends) { friend.setFriendNickName(vo.getNickName()); friend.setFriendHeadImage(vo.getHeadImageThumb()); } friendService.updateBatchById(friends); } // 更新群聊中的头像 - if(!user.getHeadImageThumb().equals(vo.getHeadImageThumb())){ + if (!user.getHeadImageThumb().equals(vo.getHeadImageThumb())) { List members = groupMemberService.findByUserId(session.getUserId()); - for(GroupMember member:members){ + for (GroupMember member : members) { member.setHeadImage(vo.getHeadImageThumb()); } groupMemberService.updateBatchById(members); @@ -169,45 +162,38 @@ public class UserServiceImpl extends ServiceImpl implements IU log.info("用户信息更新,用户:{}}", user); } - @Override public UserVO findUserById(Long id) { User user = this.getById(id); - UserVO vo = BeanUtils.copyProperties(user,UserVO.class); + UserVO vo = BeanUtils.copyProperties(user, UserVO.class); vo.setOnline(imClient.isOnline(id)); return vo; } - @Override public List findUserByName(String name) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - queryWrapper.like(User::getUserName,name) - .or() - .like(User::getNickName,name) - .last("limit 20"); + queryWrapper.like(User::getUserName, name).or().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.getOnlineUser(userIds); - return users.stream().map(u-> { - UserVO vo = BeanUtils.copyProperties(u,UserVO.class); + return users.stream().map(u -> { + UserVO vo = BeanUtils.copyProperties(u, UserVO.class); vo.setOnline(onlineUserIds.contains(u.getId())); return vo; }).collect(Collectors.toList()); } - @Override public List getOnlineTerminals(String userIds) { - List userIdList = Arrays.stream(userIds.split(",")) - .map(Long::parseLong).collect(Collectors.toList()); + List userIdList = Arrays.stream(userIds.split(",")).map(Long::parseLong).collect(Collectors.toList()); // 查询在线的终端 - Map> terminalMap = imClient.getOnlineTerminal(userIdList); + Map> terminalMap = imClient.getOnlineTerminal(userIdList); // 组装vo List vos = new LinkedList<>(); - terminalMap.forEach((userId,types)->{ + terminalMap.forEach((userId, types) -> { List terminals = types.stream().map(IMTerminalType::code).collect(Collectors.toList()); - vos.add(new OnlineTerminalVO(userId,terminals)); + vos.add(new OnlineTerminalVO(userId, terminals)); }); return vos; } diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcServiceImpl.java index c80c3c8..b8a2e71 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/WebrtcServiceImpl.java @@ -3,7 +3,6 @@ package com.bx.implatform.service.impl; import com.bx.imclient.IMClient; import com.bx.imcommon.model.IMPrivateMessage; import com.bx.imcommon.model.IMUserInfo; -import com.bx.implatform.vo.PrivateMessageVO; import com.bx.implatform.config.ICEServer; import com.bx.implatform.config.ICEServerConfig; import com.bx.implatform.contant.RedisKey; @@ -13,6 +12,7 @@ import com.bx.implatform.service.IWebrtcService; import com.bx.implatform.session.SessionContext; import com.bx.implatform.session.UserSession; import com.bx.implatform.session.WebrtcSession; +import com.bx.implatform.vo.PrivateMessageVO; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; @@ -28,9 +28,9 @@ import java.util.concurrent.TimeUnit; @AllArgsConstructor public class WebrtcServiceImpl implements IWebrtcService { - private IMClient imClient; - private RedisTemplate redisTemplate; - private ICEServerConfig iceServerConfig; + private final IMClient imClient; + private final RedisTemplate redisTemplate; + private final ICEServerConfig iceServerConfig; @Override public void call(Long uid, String offer) { diff --git a/im-platform/src/main/java/com/bx/implatform/service/thirdparty/FileService.java b/im-platform/src/main/java/com/bx/implatform/service/thirdparty/FileService.java index c3541a7..6f2fbd2 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/thirdparty/FileService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/thirdparty/FileService.java @@ -9,9 +9,9 @@ import com.bx.implatform.util.FileUtil; import com.bx.implatform.util.ImageUtil; import com.bx.implatform.util.MinioUtil; import com.bx.implatform.vo.UploadImageVO; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -22,28 +22,25 @@ import java.io.IOException; /** * todo 通过校验文件MD5实现重复文件秒传 * 文件上传服务 - * @Author Blue - * @Date 2022/10/28 + * @author Blue + * @date 2022/10/28 * */ @Slf4j @Service +@RequiredArgsConstructor public class FileService { - - @Autowired - private MinioUtil minioUtil; - + private final MinioUtil minioUtil; @Value("${minio.public}") - private String minIOServer; + private String minIoServer; @Value("${minio.bucketName}") private String bucketName; - @Value("${minio.imagePath}") private String imagePath; - @Value("${minio.filePath}") private String filePath; + @PostConstruct public void init(){ if(!minioUtil.bucketExists(bucketName)){ @@ -108,7 +105,7 @@ public class FileService { public String generUrl(FileType fileTypeEnum, String fileName){ - String url = minIOServer+"/"+bucketName; + String url = minIoServer +"/"+bucketName; switch (fileTypeEnum){ case FILE: url += "/file/"; @@ -119,6 +116,8 @@ public class FileService { case VIDEO: url += "/video/"; break; + default: + break; } url += fileName; return url; diff --git a/im-platform/src/main/java/com/bx/implatform/session/WebrtcSession.java b/im-platform/src/main/java/com/bx/implatform/session/WebrtcSession.java index fe4e08f..a26f298 100644 --- a/im-platform/src/main/java/com/bx/implatform/session/WebrtcSession.java +++ b/im-platform/src/main/java/com/bx/implatform/session/WebrtcSession.java @@ -1,7 +1,5 @@ package com.bx.implatform.session; -import com.bx.imcommon.enums.IMTerminalType; -import io.swagger.models.auth.In; import lombok.Data; /* diff --git a/im-platform/src/main/java/com/bx/implatform/util/BeanUtils.java b/im-platform/src/main/java/com/bx/implatform/util/BeanUtils.java index 9bc74be..224362d 100644 --- a/im-platform/src/main/java/com/bx/implatform/util/BeanUtils.java +++ b/im-platform/src/main/java/com/bx/implatform/util/BeanUtils.java @@ -1,13 +1,6 @@ package com.bx.implatform.util; - -import org.springframework.beans.BeanWrapper; -import org.springframework.beans.BeanWrapperImpl; import org.springframework.util.ReflectionUtils; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; public class BeanUtils { @@ -17,63 +10,19 @@ public class BeanUtils { } - - public static List copyProperties(List sourceList, Class clazz) { - - if(sourceList == null || sourceList.size() <= 0) { - return new ArrayList<>(); - } - - List result = new ArrayList<>(); - for (T source : sourceList) { - result.add(copyProperties(source, clazz)); - } - - return result; - } /** - * 如果source , 为空返回空对象 - * @param sourceList - * @param clazz - * @return - */ - public static List copyPropertiesList(List sourceList, Class clazz) { - - if(sourceList == null || sourceList.size() <= 0) { - return new ArrayList(); - } - - List result = new ArrayList<>(); - U target = null; - for (T source : sourceList) { - try { - target = clazz.newInstance(); - copyProperties(source, target); - }catch(Exception e) { - handleReflectionException(e); - return new ArrayList<>(); - } - result.add(target); - } - - return result; - } - - /** - * source空为null - * @param orig - * @param destClass - * @param - * @return + * 属性拷贝 + * @param orig 源对象 + * @param destClass 目标 + * @return T */ public static T copyProperties(Object orig, Class destClass) { - try { Object target = destClass.newInstance(); if(orig == null) { return null; } - copyProperties(orig, (Object)target); + copyProperties(orig, target); return (T) target; }catch(Exception e) { handleReflectionException(e); @@ -81,78 +30,6 @@ public class BeanUtils { } } - /** - * source 为null 返回 空对象 - * @param orig - * @param destClass - * @param - * @return - */ - public static T copyProperty(Object orig, Class destClass) { - - try { - Object target = destClass.newInstance(); - if(orig == null) { - return (T)target; - } - - copyProperties(orig, (Object)target); - return (T) target; - }catch(Exception e) { - handleReflectionException(e); - Object o1 = new Object(); - try { - o1 = destClass.newInstance(); - }catch(Exception ex) { - handleReflectionException(e); - } - return (T)o1; - } - } - - public static List copyProperties(List sourceList, Class clazz, String... ignoreProperties) { - - if(sourceList == null || sourceList.size() <= 0) { - return new ArrayList(); - } - - List result = new ArrayList<>(); - for (T source : sourceList) { - result.add(copyProperties(source, clazz, ignoreProperties)); - } - - return result; - } - - public static T copyProperties(Object orig, Class destClass, String... ignoreProperties) { - - if(orig == null) { - return null; - } - - try { - Object target = destClass.newInstance(); - org.springframework.beans.BeanUtils.copyProperties(orig, (Object)target, ignoreProperties); - return (T)target; - }catch(Exception e) { - return null; - } - } - - public static String[] getNullPropertyNames(Object source) { - final BeanWrapper beanWrapper = new BeanWrapperImpl(source); - java.beans.PropertyDescriptor[] propDesc = beanWrapper.getPropertyDescriptors(); - - Set emptynames = new HashSet(); - - for(java.beans.PropertyDescriptor pd : propDesc) { - Object srcValue = beanWrapper.getPropertyValue(pd.getName()); - if (srcValue == null) {emptynames.add(pd.getName());} - } - - String[] result = new String[emptynames.size()]; - return emptynames.toArray(result); - } public static void copyProperties(Object orig, Object dest) { try { diff --git a/im-platform/src/main/java/com/bx/implatform/util/DateTimeUtils.java b/im-platform/src/main/java/com/bx/implatform/util/DateTimeUtils.java index 83c36a5..a265b8f 100644 --- a/im-platform/src/main/java/com/bx/implatform/util/DateTimeUtils.java +++ b/im-platform/src/main/java/com/bx/implatform/util/DateTimeUtils.java @@ -1,21 +1,10 @@ package com.bx.implatform.util; -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; -import java.sql.Timestamp; -import java.text.DateFormat; -import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.format.DateTimeFormatter; -import java.util.*; +import java.util.Date; /** * 日期处理工具类 @@ -25,7 +14,6 @@ import java.util.*; public class DateTimeUtils extends DateUtils { public static final String FULL_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; - public static final String PART_DATE_FORMAT = "yyyy-MM-dd"; public static final String PARTDATEFORMAT = "yyyyMMdd"; @@ -34,11 +22,11 @@ public class DateTimeUtils extends DateUtils { * * @param date 日期 * @param xFormat 格式 - * @return + * @return 日期 */ public static String getFormatDate(Date date, String xFormat) { date = date == null ? new Date() : date; - xFormat = StringUtils.isNotEmpty(xFormat) == true ? xFormat : FULL_DATE_FORMAT; + xFormat = StringUtils.isNotEmpty(xFormat) ? xFormat : FULL_DATE_FORMAT; SimpleDateFormat sdf = new SimpleDateFormat(xFormat); return sdf.format(date); } diff --git a/im-platform/src/main/java/com/bx/implatform/util/FileUtil.java b/im-platform/src/main/java/com/bx/implatform/util/FileUtil.java index 8e7347a..32688d3 100644 --- a/im-platform/src/main/java/com/bx/implatform/util/FileUtil.java +++ b/im-platform/src/main/java/com/bx/implatform/util/FileUtil.java @@ -9,8 +9,7 @@ public class FileUtil { * @return boolean */ public static String getFileExtension(String fileName) { - String extension = fileName.substring(fileName.lastIndexOf(".") + 1); - return extension; + return fileName.substring(fileName.lastIndexOf(".") + 1); } /** diff --git a/im-platform/src/main/java/com/bx/implatform/util/MinioUtil.java b/im-platform/src/main/java/com/bx/implatform/util/MinioUtil.java index 911d940..298b630 100644 --- a/im-platform/src/main/java/com/bx/implatform/util/MinioUtil.java +++ b/im-platform/src/main/java/com/bx/implatform/util/MinioUtil.java @@ -2,9 +2,9 @@ package com.bx.implatform.util; import io.minio.*; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -14,11 +14,10 @@ import java.util.Date; @Slf4j @Component +@AllArgsConstructor public class MinioUtil { - - @Autowired - private MinioClient minioClient; + private final MinioClient minioClient; /** * 查看存储bucket是否存在 @@ -35,25 +34,21 @@ public class MinioUtil { /** * 创建存储bucket - * @return Boolean */ - public Boolean makeBucket(String bucketName) { + public void makeBucket(String bucketName) { try { minioClient.makeBucket(MakeBucketArgs.builder() .bucket(bucketName) .build()); } catch (Exception e) { log.error("创建bucket失败,",e); - return false; } - return true; } /** - * 设置bucket权限为public - * @return Boolean + * 设置bucket权限为public */ - public Boolean setBucketPublic(String bucketName) { + public void setBucketPublic(String bucketName) { try { // 设置公开 String sb = "{\"Version\":\"2012-10-17\"," + @@ -70,34 +65,13 @@ public class MinioUtil { .build()); } catch (Exception e) { log.error("创建bucket失败,",e); - return false; } - return true; - } - - /** - * 删除存储bucket - * @return Boolean - */ - public Boolean removeBucket(String bucketName) { - try { - minioClient.removeBucket(RemoveBucketArgs.builder() - .bucket(bucketName) - .build()); - } catch (Exception e) { - log.error("删除bucket失败,",e); - return false; - } - return true; - } - - /** * 文件上传 - * @bucketName bucket名称 - * @path 路径 + * @param bucketName bucket名称 + * @param path 路径 * @param file 文件 * @return Boolean */ @@ -129,8 +103,8 @@ public class MinioUtil { * @param path 路径 * @param name 文件名 * @param fileByte 文件内容 - * @param contentType - * @return Boolean + * @param contentType contentType + * @return objectName */ public String upload(String bucketName,String path,String name,byte[] fileByte,String contentType) { @@ -142,9 +116,8 @@ public class MinioUtil { .stream(stream, fileByte.length, -1).contentType(contentType).build(); //文件名称相同会覆盖 minioClient.putObject(objectArgs); - } catch (Exception e) { - log.error("上传图片失败,",e); + log.error("上传文件失败,",e); return null; } return objectName; @@ -154,16 +127,15 @@ public class MinioUtil { /** * 删除 * @param bucketName bucket名称 - * @path path - * @param fileName - * @return - * @throws Exception + * @param path 路径 + * @param fileName 文件名 + * @return true/false */ public boolean remove(String bucketName,String path,String fileName){ try { minioClient.removeObject( RemoveObjectArgs.builder().bucket(bucketName).object(path+fileName).build()); }catch (Exception e){ - log.error("删除图片失败,",e); + log.error("删除文件失败,",e); return false; } return true; diff --git a/im-platform/src/main/java/com/bx/implatform/util/XssUtil.java b/im-platform/src/main/java/com/bx/implatform/util/XssUtil.java index 15461a3..72b3e71 100644 --- a/im-platform/src/main/java/com/bx/implatform/util/XssUtil.java +++ b/im-platform/src/main/java/com/bx/implatform/util/XssUtil.java @@ -11,9 +11,7 @@ public class XssUtil { public static boolean checkXss(String inputString) { if (inputString!=null) { Matcher matcher = PATTERN.matcher(inputString); - if (matcher.find()) { - return true; - } + return matcher.find(); } return false; } diff --git a/im-platform/src/main/java/com/bx/implatform/vo/GroupVO.java b/im-platform/src/main/java/com/bx/implatform/vo/GroupVO.java index 3f98bed..7b07b46 100644 --- a/im-platform/src/main/java/com/bx/implatform/vo/GroupVO.java +++ b/im-platform/src/main/java/com/bx/implatform/vo/GroupVO.java @@ -6,7 +6,6 @@ import lombok.Data; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; @Data @ApiModel("群信息VO") diff --git a/im-server/src/main/java/com/bx/imserver/config/RedisConfig.java b/im-server/src/main/java/com/bx/imserver/config/RedisConfig.java index 35c044c..8e17105 100644 --- a/im-server/src/main/java/com/bx/imserver/config/RedisConfig.java +++ b/im-server/src/main/java/com/bx/imserver/config/RedisConfig.java @@ -1,27 +1,18 @@ package com.bx.imserver.config; import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer; -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.annotation.PropertyAccessor; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; -import javax.annotation.Resource; - @Configuration public class RedisConfig { @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { - RedisTemplate redisTemplate = new RedisTemplate(); + RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); // 设置值(value)的序列化采用FastJsonRedisSerializer redisTemplate.setValueSerializer(fastJsonRedisSerializer()); @@ -35,8 +26,7 @@ public class RedisConfig { public FastJsonRedisSerializer fastJsonRedisSerializer(){ - FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); - return fastJsonRedisSerializer; + return new FastJsonRedisSerializer<>(Object.class); } diff --git a/im-server/src/main/java/com/bx/imserver/netty/IMChannelHandler.java b/im-server/src/main/java/com/bx/imserver/netty/IMChannelHandler.java index d748d6e..d01e47e 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/IMChannelHandler.java +++ b/im-server/src/main/java/com/bx/imserver/netty/IMChannelHandler.java @@ -27,12 +27,11 @@ public class IMChannelHandler extends SimpleChannelInboundHandler { /** * 读取到消息后进行处理 * - * @param ctx - * @param sendInfo - * @throws Exception + * @param ctx channel上下文 + * @param sendInfo 发送消息 */ @Override - protected void channelRead0(ChannelHandlerContext ctx, IMSendInfo sendInfo) throws Exception { + protected void channelRead0(ChannelHandlerContext ctx, IMSendInfo sendInfo) { // 创建处理器进行处理 AbstractMessageProcessor processor = ProcessorFactory.createProcessor(IMCmdType.fromCode(sendInfo.getCmd())); processor.process(ctx,processor.transForm(sendInfo.getData())); @@ -41,12 +40,11 @@ public class IMChannelHandler extends SimpleChannelInboundHandler { /** * 出现异常的处理 打印报错日志 * - * @param ctx - * @param cause - * @throws Exception + * @param ctx channel上下文 + * @param cause 异常信息 */ @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { log.error(cause.getMessage()); //关闭上下文 //ctx.close(); @@ -55,16 +53,15 @@ public class IMChannelHandler extends SimpleChannelInboundHandler { /** * 监控浏览器上线 * - * @param ctx - * @throws Exception + * @param ctx channel上下文 */ @Override - public void handlerAdded(ChannelHandlerContext ctx) throws Exception { + public void handlerAdded(ChannelHandlerContext ctx) { log.info(ctx.channel().id().asLongText() + "连接"); } @Override - public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { + public void handlerRemoved(ChannelHandlerContext ctx) { AttributeKey userIdAttr = AttributeKey.valueOf(ChannelAttrKey.USER_ID); Long userId = ctx.channel().attr(userIdAttr).get(); AttributeKey terminalAttr = AttributeKey.valueOf(ChannelAttrKey.TERMINAL_TYPE); @@ -75,7 +72,7 @@ public class IMChannelHandler extends SimpleChannelInboundHandler { // 移除channel UserChannelCtxMap.removeChannelCtx(userId,terminal); // 用户下线 - RedisTemplate redisTemplate = SpringContextHolder.getBean("redisTemplate"); + RedisTemplate redisTemplate = SpringContextHolder.getBean("redisTemplate"); String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID,userId.toString(), terminal.toString()); redisTemplate.delete(key); log.info("断开连接,userId:{},终端类型:{}",userId,terminal); diff --git a/im-server/src/main/java/com/bx/imserver/netty/IMServerGroup.java b/im-server/src/main/java/com/bx/imserver/netty/IMServerGroup.java index 3983239..24d6c42 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/IMServerGroup.java +++ b/im-server/src/main/java/com/bx/imserver/netty/IMServerGroup.java @@ -3,7 +3,6 @@ package com.bx.imserver.netty; import com.bx.imcommon.contant.IMRedisKey; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; diff --git a/im-server/src/main/java/com/bx/imserver/netty/UserChannelCtxMap.java b/im-server/src/main/java/com/bx/imserver/netty/UserChannelCtxMap.java index 7bd3fcc..281af5a 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/UserChannelCtxMap.java +++ b/im-server/src/main/java/com/bx/imserver/netty/UserChannelCtxMap.java @@ -2,7 +2,6 @@ package com.bx.imserver.netty; import io.netty.channel.ChannelHandlerContext; -import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/im-server/src/main/java/com/bx/imserver/netty/processor/GroupMessageProcessor.java b/im-server/src/main/java/com/bx/imserver/netty/processor/GroupMessageProcessor.java index 2e26e1b..4cfe144 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/processor/GroupMessageProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/netty/processor/GroupMessageProcessor.java @@ -5,13 +5,12 @@ import com.bx.imcommon.enums.IMCmdType; import com.bx.imcommon.enums.IMSendCode; import com.bx.imcommon.model.IMRecvInfo; import com.bx.imcommon.model.IMSendInfo; -import com.bx.imcommon.model.IMUserInfo; import com.bx.imcommon.model.IMSendResult; +import com.bx.imcommon.model.IMUserInfo; import com.bx.imserver.netty.UserChannelCtxMap; import io.netty.channel.ChannelHandlerContext; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; @@ -23,7 +22,7 @@ import java.util.List; @AllArgsConstructor public class GroupMessageProcessor extends AbstractMessageProcessor { - private RedisTemplate redisTemplate; + private final RedisTemplate redisTemplate; @Async @Override diff --git a/im-server/src/main/java/com/bx/imserver/netty/processor/HeartbeatProcessor.java b/im-server/src/main/java/com/bx/imserver/netty/processor/HeartbeatProcessor.java index b84f5d0..3200a2d 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/processor/HeartbeatProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/netty/processor/HeartbeatProcessor.java @@ -7,12 +7,10 @@ import com.bx.imcommon.enums.IMCmdType; import com.bx.imcommon.model.IMHeartbeatInfo; import com.bx.imcommon.model.IMSendInfo; import com.bx.imserver.constant.ChannelAttrKey; -import com.bx.imserver.netty.ws.WebSocketServer; import io.netty.channel.ChannelHandlerContext; import io.netty.util.AttributeKey; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; @@ -24,7 +22,7 @@ import java.util.concurrent.TimeUnit; @AllArgsConstructor public class HeartbeatProcessor extends AbstractMessageProcessor { - RedisTemplate redisTemplate; + private final RedisTemplate redisTemplate; @Override public void process(ChannelHandlerContext ctx, IMHeartbeatInfo beatInfo) { @@ -37,22 +35,21 @@ public class HeartbeatProcessor extends AbstractMessageProcessor heartBeatAttr = AttributeKey.valueOf(ChannelAttrKey.HEARTBEAT_TIMES); Long heartbeatTimes = ctx.channel().attr(heartBeatAttr).get(); ctx.channel().attr(heartBeatAttr).set(++heartbeatTimes); - if(heartbeatTimes%10 == 0){ + if (heartbeatTimes % 10 == 0) { // 每心跳10次,用户在线状态续一次命 AttributeKey userIdAttr = AttributeKey.valueOf(ChannelAttrKey.USER_ID); Long userId = ctx.channel().attr(userIdAttr).get(); AttributeKey terminalAttr = AttributeKey.valueOf(ChannelAttrKey.TERMINAL_TYPE); Integer terminal = ctx.channel().attr(terminalAttr).get(); - String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID,userId.toString(),terminal.toString()); + String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, userId.toString(), terminal.toString()); redisTemplate.expire(key, IMConstant.ONLINE_TIMEOUT_SECOND, TimeUnit.SECONDS); } } - @Override public IMHeartbeatInfo transForm(Object o) { HashMap map = (HashMap)o; IMHeartbeatInfo heartbeatInfo = BeanUtil.fillBeanWithMap(map, new IMHeartbeatInfo(), false); - return heartbeatInfo; + return heartbeatInfo; } } diff --git a/im-server/src/main/java/com/bx/imserver/netty/processor/LoginProcessor.java b/im-server/src/main/java/com/bx/imserver/netty/processor/LoginProcessor.java index e37b2ea..c1b50d3 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/processor/LoginProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/netty/processor/LoginProcessor.java @@ -5,19 +5,17 @@ import com.alibaba.fastjson.JSON; import com.bx.imcommon.contant.IMConstant; import com.bx.imcommon.contant.IMRedisKey; import com.bx.imcommon.enums.IMCmdType; +import com.bx.imcommon.model.IMLoginInfo; import com.bx.imcommon.model.IMSendInfo; import com.bx.imcommon.model.IMSessionInfo; -import com.bx.imcommon.model.IMLoginInfo; import com.bx.imcommon.util.JwtUtil; import com.bx.imserver.constant.ChannelAttrKey; import com.bx.imserver.netty.IMServerGroup; import com.bx.imserver.netty.UserChannelCtxMap; import io.netty.channel.ChannelHandlerContext; import io.netty.util.AttributeKey; -import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; @@ -49,7 +47,7 @@ public class LoginProcessor extends AbstractMessageProcessor { ChannelHandlerContext context = UserChannelCtxMap.getChannelCtx(userId,terminal); if(context != null && !ctx.channel().id().equals(context.channel().id())){ // 不允许多地登录,强制下线 - IMSendInfo sendInfo = new IMSendInfo(); + IMSendInfo sendInfo = new IMSendInfo<>(); sendInfo.setCmd(IMCmdType.FORCE_LOGUT.code()); sendInfo.setData("您已在其他地方登陆,将被强制下线"); context.channel().writeAndFlush(sendInfo); @@ -70,7 +68,7 @@ public class LoginProcessor extends AbstractMessageProcessor { String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID,userId.toString(), terminal.toString()); redisTemplate.opsForValue().set(key, IMServerGroup.serverId, IMConstant.ONLINE_TIMEOUT_SECOND, TimeUnit.SECONDS); // 响应ws - IMSendInfo sendInfo = new IMSendInfo(); + IMSendInfo sendInfo = new IMSendInfo<>(); sendInfo.setCmd(IMCmdType.LOGIN.code()); ctx.channel().writeAndFlush(sendInfo); } @@ -79,7 +77,6 @@ public class LoginProcessor extends AbstractMessageProcessor { @Override public IMLoginInfo transForm(Object o) { HashMap map = (HashMap)o; - IMLoginInfo loginInfo = BeanUtil.fillBeanWithMap(map, new IMLoginInfo(), false); - return loginInfo; + return BeanUtil.fillBeanWithMap(map, new IMLoginInfo(), false); } } diff --git a/im-server/src/main/java/com/bx/imserver/netty/processor/PrivateMessageProcessor.java b/im-server/src/main/java/com/bx/imserver/netty/processor/PrivateMessageProcessor.java index 6778714..b04727b 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/processor/PrivateMessageProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/netty/processor/PrivateMessageProcessor.java @@ -5,13 +5,12 @@ import com.bx.imcommon.enums.IMCmdType; import com.bx.imcommon.enums.IMSendCode; import com.bx.imcommon.model.IMRecvInfo; import com.bx.imcommon.model.IMSendInfo; -import com.bx.imcommon.model.IMUserInfo; import com.bx.imcommon.model.IMSendResult; +import com.bx.imcommon.model.IMUserInfo; import com.bx.imserver.netty.UserChannelCtxMap; import io.netty.channel.ChannelHandlerContext; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; @@ -20,7 +19,7 @@ import org.springframework.stereotype.Component; @AllArgsConstructor public class PrivateMessageProcessor extends AbstractMessageProcessor { - private RedisTemplate redisTemplate; + private final RedisTemplate redisTemplate; @Override public void process(IMRecvInfo recvInfo) { @@ -31,7 +30,7 @@ public class PrivateMessageProcessor extends AbstractMessageProcessor sendInfo = new IMSendInfo<>(); sendInfo.setCmd(IMCmdType.PRIVATE_MESSAGE.code()); sendInfo.setData(recvInfo.getData()); channelCtx.channel().writeAndFlush(sendInfo); @@ -52,7 +51,7 @@ public class PrivateMessageProcessor extends AbstractMessageProcessor result = new IMSendResult<>(); result.setSender(recvInfo.getSender()); result.setReceiver(recvInfo.getReceivers().get(0)); result.setCode(sendCode.code()); diff --git a/im-server/src/main/java/com/bx/imserver/netty/processor/ProcessorFactory.java b/im-server/src/main/java/com/bx/imserver/netty/processor/ProcessorFactory.java index b3c71d1..ef87892 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/processor/ProcessorFactory.java +++ b/im-server/src/main/java/com/bx/imserver/netty/processor/ProcessorFactory.java @@ -9,16 +9,16 @@ public class ProcessorFactory { AbstractMessageProcessor processor = null; switch (cmd){ case LOGIN: - processor = (AbstractMessageProcessor) SpringContextHolder.getApplicationContext().getBean(LoginProcessor.class); + processor = SpringContextHolder.getApplicationContext().getBean(LoginProcessor.class); break; case HEART_BEAT: - processor = (AbstractMessageProcessor) SpringContextHolder.getApplicationContext().getBean(HeartbeatProcessor.class); + processor = SpringContextHolder.getApplicationContext().getBean(HeartbeatProcessor.class); break; case PRIVATE_MESSAGE: - processor = (AbstractMessageProcessor)SpringContextHolder.getApplicationContext().getBean(PrivateMessageProcessor.class); + processor = SpringContextHolder.getApplicationContext().getBean(PrivateMessageProcessor.class); break; case GROUP_MESSAGE: - processor = (AbstractMessageProcessor)SpringContextHolder.getApplicationContext().getBean(GroupMessageProcessor.class); + processor = SpringContextHolder.getApplicationContext().getBean(GroupMessageProcessor.class); break; default: break; diff --git a/im-server/src/main/java/com/bx/imserver/netty/ws/WebSocketServer.java b/im-server/src/main/java/com/bx/imserver/netty/ws/WebSocketServer.java index 3a0fe93..52bf1bd 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/ws/WebSocketServer.java +++ b/im-server/src/main/java/com/bx/imserver/netty/ws/WebSocketServer.java @@ -37,7 +37,6 @@ public class WebSocketServer implements IMServer { private volatile boolean ready = false; - private ServerBootstrap bootstrap; private EventLoopGroup bossGroup; private EventLoopGroup workGroup; @@ -49,7 +48,7 @@ public class WebSocketServer implements IMServer { @Override public void start() { - bootstrap = new ServerBootstrap(); + ServerBootstrap bootstrap = new ServerBootstrap(); bossGroup = new NioEventLoopGroup(); workGroup = new NioEventLoopGroup(); // 设置为主从线程模型 @@ -60,7 +59,7 @@ public class WebSocketServer implements IMServer { .childHandler(new ChannelInitializer() { // 添加处理的Handler,通常包括消息编解码、业务处理,也可以是日志、权限、过滤等 @Override - protected void initChannel(Channel ch) throws Exception { + protected void initChannel(Channel ch) { // 获取职责链 ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new IdleStateHandler(120, 0, 0, TimeUnit.SECONDS)); @@ -82,7 +81,7 @@ public class WebSocketServer implements IMServer { try { // 绑定端口,启动select线程,轮询监听channel事件,监听到事件之后就会交给从线程池处理 - Channel channel = bootstrap.bind(port).sync().channel(); + bootstrap.bind(port).sync().channel(); // 就绪标志 this.ready = true; log.info("websocket server 初始化完成,端口:{}",port); diff --git a/im-server/src/main/java/com/bx/imserver/netty/ws/endecode/MessageProtocolEncoder.java b/im-server/src/main/java/com/bx/imserver/netty/ws/endecode/MessageProtocolEncoder.java index 967e39a..3c1a3ba 100644 --- a/im-server/src/main/java/com/bx/imserver/netty/ws/endecode/MessageProtocolEncoder.java +++ b/im-server/src/main/java/com/bx/imserver/netty/ws/endecode/MessageProtocolEncoder.java @@ -14,7 +14,6 @@ public class MessageProtocolEncoder extends MessageToMessageEncoder protected void encode(ChannelHandlerContext channelHandlerContext, IMSendInfo sendInfo, List list) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); String text = objectMapper.writeValueAsString(sendInfo); - TextWebSocketFrame frame = new TextWebSocketFrame(text); list.add(frame); } diff --git a/im-server/src/main/java/com/bx/imserver/task/AbstractPullMessageTask.java b/im-server/src/main/java/com/bx/imserver/task/AbstractPullMessageTask.java index 9559315..3605de8 100644 --- a/im-server/src/main/java/com/bx/imserver/task/AbstractPullMessageTask.java +++ b/im-server/src/main/java/com/bx/imserver/task/AbstractPullMessageTask.java @@ -6,9 +6,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; -import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; -import java.util.concurrent.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; @Slf4j public abstract class AbstractPullMessageTask implements CommandLineRunner { diff --git a/im-server/src/main/java/com/bx/imserver/task/PullGroupMessageTask.java b/im-server/src/main/java/com/bx/imserver/task/PullGroupMessageTask.java index ef177f7..ec6c8ce 100644 --- a/im-server/src/main/java/com/bx/imserver/task/PullGroupMessageTask.java +++ b/im-server/src/main/java/com/bx/imserver/task/PullGroupMessageTask.java @@ -7,18 +7,19 @@ import com.bx.imcommon.model.IMRecvInfo; import com.bx.imserver.netty.IMServerGroup; import com.bx.imserver.netty.processor.AbstractMessageProcessor; import com.bx.imserver.netty.processor.ProcessorFactory; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; + import java.util.concurrent.TimeUnit; @Slf4j @Component +@AllArgsConstructor public class PullGroupMessageTask extends AbstractPullMessageTask { - @Autowired - private RedisTemplate redisTemplate; + private final RedisTemplate redisTemplate; @Override public void pullMessage() { diff --git a/im-server/src/main/java/com/bx/imserver/task/PullPrivateMessageTask.java b/im-server/src/main/java/com/bx/imserver/task/PullPrivateMessageTask.java index 1ebe771..30cd37d 100644 --- a/im-server/src/main/java/com/bx/imserver/task/PullPrivateMessageTask.java +++ b/im-server/src/main/java/com/bx/imserver/task/PullPrivateMessageTask.java @@ -1,6 +1,5 @@ package com.bx.imserver.task; - import com.alibaba.fastjson.JSONObject; import com.bx.imcommon.contant.IMRedisKey; import com.bx.imcommon.enums.IMCmdType; @@ -8,19 +7,19 @@ import com.bx.imcommon.model.IMRecvInfo; import com.bx.imserver.netty.IMServerGroup; import com.bx.imserver.netty.processor.AbstractMessageProcessor; import com.bx.imserver.netty.processor.ProcessorFactory; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; + import java.util.concurrent.TimeUnit; @Slf4j @Component +@AllArgsConstructor public class PullPrivateMessageTask extends AbstractPullMessageTask { - - @Autowired - private RedisTemplate redisTemplate; + private final RedisTemplate redisTemplate; @Override public void pullMessage() { From 84ad493bb7febd5d90ff5fe03f43f6873278d23e Mon Sep 17 00:00:00 2001 From: "xie.bx" Date: Fri, 17 Nov 2023 23:17:12 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dtoken=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 8 +-- im-ui/src/api/httpRequest.js | 4 +- im-ui/src/components/chat/ChatBox.vue | 25 +++----- im-ui/src/components/common/FileUpload.vue | 60 +++++++++++-------- im-ui/src/components/setting/Setting.vue | 2 +- im-ui/src/view/Group.vue | 2 +- 6 files changed, 52 insertions(+), 49 deletions(-) diff --git a/im-platform/src/main/resources/application.yml b/im-platform/src/main/resources/application.yml index 49acc51..59192d6 100644 --- a/im-platform/src/main/resources/application.yml +++ b/im-platform/src/main/resources/application.yml @@ -32,11 +32,11 @@ mybatis-plus: # *.xml的具体路径 - classpath*:mapper/*.xml minio: - endpoint: http://42.194.187.243:9001 #内网地址 - public: http://42.194.187.243:9001 #外网访问地址 + endpoint: http://127.0.0.1:9001 #内网地址 + public: http://127.0.0.1:9001 #外网访问地址 accessKey: admin - secretKey: admin123456 - bucketName: box-im2 + secretKey: 12345678 + bucketName: box-im imagePath: image filePath: file diff --git a/im-ui/src/api/httpRequest.js b/im-ui/src/api/httpRequest.js index aacc0a5..d3d0dd5 100644 --- a/im-ui/src/api/httpRequest.js +++ b/im-ui/src/api/httpRequest.js @@ -54,7 +54,9 @@ http.interceptors.response.use(async response => { sessionStorage.setItem("accessToken", data.accessToken); sessionStorage.setItem("refreshToken", data.refreshToken); // 这里需要把headers清掉,否则请求时会报错,原因暂不详... - response.config.headers=undefined; + if(typeof response.config.data != 'object'){ + response.config.headers=undefined; + } // 重新发送刚才的请求 return http(response.config) } else { diff --git a/im-ui/src/components/chat/ChatBox.vue b/im-ui/src/components/chat/ChatBox.vue index 82744db..20f4cce 100644 --- a/im-ui/src/components/chat/ChatBox.vue +++ b/im-ui/src/components/chat/ChatBox.vue @@ -27,14 +27,14 @@ @click.stop="showEmotionBox()">
-
- @@ -264,7 +264,7 @@ this.sendImageFile = null; }, onImageSuccess(data, file) { - let msgInfo = JSON.parse(JSON.stringify(file.msgInfo || file.raw.msgInfo)); + let msgInfo = JSON.parse(JSON.stringify(file.msgInfo)); msgInfo.content = JSON.stringify(data); this.$http({ url: this.messageAction, @@ -277,7 +277,7 @@ }) }, onImageFail(e, file) { - let msgInfo = JSON.parse(JSON.stringify(file.msgInfo || file.raw.msgInfo)); + let msgInfo = JSON.parse(JSON.stringify(file.msgInfo)); msgInfo.loadStatus = 'fail'; this.$store.commit("insertMessage", msgInfo); }, @@ -313,7 +313,7 @@ size: file.size, url: url } - let msgInfo = JSON.parse(JSON.stringify(file.raw.msgInfo)); + let msgInfo = JSON.parse(JSON.stringify(file.msgInfo)); msgInfo.content = JSON.stringify(data); this.$http({ url: this.messageAction, @@ -326,7 +326,7 @@ }) }, onFileFail(e, file) { - let msgInfo = JSON.parse(JSON.stringify(file.raw.msgInfo)); + let msgInfo = JSON.parse(JSON.stringify(file.msgInfo)); msgInfo.loadStatus = 'fail'; this.$store.commit("insertMessage", msgInfo); }, @@ -462,7 +462,7 @@ let file = this.sendImageFile; this.onImageBefore(this.sendImageFile); let formData = new FormData() - formData.append('file', file.raw || file) + formData.append('file', file) this.$http.post("/image/upload", formData, { headers: { 'Content-Type': 'multipart/form-data' @@ -546,6 +546,7 @@ if(this.chat.unreadCount==0){ return; } + this.$store.commit("resetUnreadCount", this.chat) if (this.chat.type == "GROUP") { var url = `/message/group/readed?groupId=${this.chat.targetId}` } else { @@ -554,9 +555,7 @@ this.$http({ url: url, method: 'put' - }).then(() => { - this.$store.commit("resetUnreadCount", this.chat) - }) + }).then(() => {}) }, loadGroup(groupId) { this.$http({ @@ -631,12 +630,6 @@ } return title; }, - imageAction() { - return `${process.env.VUE_APP_BASE_API}/image/upload`; - }, - fileAction() { - return `${process.env.VUE_APP_BASE_API}/file/upload`; - }, messageAction() { return `/message/${this.chat.type.toLowerCase()}/send`; }, diff --git a/im-ui/src/components/common/FileUpload.vue b/im-ui/src/components/common/FileUpload.vue index 480038c..e66c0c9 100644 --- a/im-ui/src/components/common/FileUpload.vue +++ b/im-ui/src/components/common/FileUpload.vue @@ -1,6 +1,6 @@ @@ -11,13 +11,15 @@ data() { return { loading: null, - uploadHeaders: {"accessToken":sessionStorage.getItem('accessToken')} + uploadHeaders: { + "accessToken": sessionStorage.getItem('accessToken') + } } }, props: { action: { type: String, - required: true + required: false }, fileTypes: { type: Array, @@ -37,17 +39,33 @@ } }, methods: { - onSuccess(res, file) { - this.loading && this.loading.close(); - if (res.code == 200) { - this.$emit("success", res.data, file); - } else { - this.$message.error(res.message); - this.$emit("fail", res, file); + onFileUpload(file) { + // 展示加载条 + if (this.showLoading) { + this.loading = this.$loading({ + lock: true, + text: '正在上传...', + spinner: 'el-icon-loading', + background: 'rgba(0, 0, 0, 0.7)' + }); } - }, - onError(err, file) { - this.$emit("fail", err, file); + + let formData = new FormData() + formData.append('file', file.file) + this.$http({ + url: this.action, + data: formData, + method: 'post', + headers: { + 'Content-Type': 'multipart/form-data' + } + }).then((data) => { + this.$emit("success", data, file.file); + }).catch((e) => { + this.$emit("fail", e, file.file); + }).finally(() => { + this.loading && this.loading.close(); + }) }, beforeUpload(file) { // 校验文件类型 @@ -64,20 +82,10 @@ this.$message.error(`文件大小不能超过 ${this.fileSizeStr}!`); return false; } - // 展示加载条 - if (this.showLoading) { - this.loading = this.$loading({ - lock: true, - text: '正在上传...', - spinner: 'el-icon-loading', - background: 'rgba(0, 0, 0, 0.7)' - }); - } + this.$emit("before", file); return true; } - - }, computed: { fileSizeStr() { @@ -94,4 +102,4 @@ + \ No newline at end of file diff --git a/im-ui/src/components/setting/Setting.vue b/im-ui/src/components/setting/Setting.vue index 366d7c6..e1c46dd 100644 --- a/im-ui/src/components/setting/Setting.vue +++ b/im-ui/src/components/setting/Setting.vue @@ -93,7 +93,7 @@ }, computed:{ imageAction(){ - return `${process.env.VUE_APP_BASE_API}/image/upload`; + return `/image/upload`; } }, watch: { diff --git a/im-ui/src/view/Group.vue b/im-ui/src/view/Group.vue index 83d78c0..c86513e 100644 --- a/im-ui/src/view/Group.vue +++ b/im-ui/src/view/Group.vue @@ -267,7 +267,7 @@ return this.activeGroup.ownerId == this.$store.state.userStore.userInfo.id; }, imageAction() { - return `${process.env.VUE_APP_BASE_API}/image/upload`; + return `/image/upload`; } }, mounted() { From 5009eebf4b6a79ea5d3de3164a5aa4fbf9fd4539 Mon Sep 17 00:00:00 2001 From: "xie.bx" Date: Sat, 18 Nov 2023 14:10:18 +0800 Subject: [PATCH 11/13] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-ui/src/App.vue | 4 ++ .../src/components/chat/ChatPrivateVideo.vue | 2 +- im-ui/src/components/common/RightMenu.vue | 3 +- im-ui/src/components/group/AddGroupMember.vue | 43 +++++++----- im-ui/src/store/chatStore.js | 68 ++++++++++--------- im-ui/src/store/friendStore.js | 27 +++----- im-ui/src/store/groupStore.js | 19 +++--- im-ui/src/view/Chat.vue | 19 +----- im-ui/src/view/Friend.vue | 23 +++---- im-ui/src/view/Group.vue | 11 +-- im-ui/src/view/Register.vue | 1 - 11 files changed, 101 insertions(+), 119 deletions(-) diff --git a/im-ui/src/App.vue b/im-ui/src/App.vue index cf15607..11f715d 100644 --- a/im-ui/src/App.vue +++ b/im-ui/src/App.vue @@ -26,4 +26,8 @@ export default { height: 100%; width: 100%; } + +.el-message { + z-index: 99999999 !important; +} diff --git a/im-ui/src/components/chat/ChatPrivateVideo.vue b/im-ui/src/components/chat/ChatPrivateVideo.vue index 524814c..19dc951 100644 --- a/im-ui/src/components/chat/ChatPrivateVideo.vue +++ b/im-ui/src/components/chat/ChatPrivateVideo.vue @@ -67,7 +67,7 @@ methods: { init() { if (!this.hasUserMedia() || !this.hasRTCPeerConnection()) { - this.$message.error("您的浏览器不支持WebRTC"); + this.$message.error("初始化失败,原因可能是: 1.未部署ssl证书 2.您的浏览器不支持WebRTC"); if (!this.master) { this.sendFailed("对方浏览器不支持WebRTC") } diff --git a/im-ui/src/components/common/RightMenu.vue b/im-ui/src/components/common/RightMenu.vue index e7107f8..c2f4062 100644 --- a/im-ui/src/components/common/RightMenu.vue +++ b/im-ui/src/components/common/RightMenu.vue @@ -3,7 +3,7 @@
+ @click.native.stop="onSelectMenu(item)"> {{item.name}} @@ -33,6 +33,7 @@ }, onSelectMenu(item) { this.$emit("select", item); + this.close(); } } } diff --git a/im-ui/src/components/group/AddGroupMember.vue b/im-ui/src/components/group/AddGroupMember.vue index bcf21ee..5518181 100644 --- a/im-ui/src/components/group/AddGroupMember.vue +++ b/im-ui/src/components/group/AddGroupMember.vue @@ -1,27 +1,29 @@ @@ -57,21 +57,6 @@ chatStore() { return this.$store.state.chatStore; }, - activeChat() { - let index = this.chatStore.activeIndex; - let chats = this.chatStore.chats - if (index >= 0 && chats.length > 0) { - return chats[index]; - } - // 当没有激活任何会话时,创建一个空会话,不然控制台会有很多报错 - let emptyChat = { - targetId: -1, - showName: "", - headImage: "", - messages: [] - } - return emptyChat; - }, loading(){ return this.chatStore.loadingGroupMsg || this.chatStore.loadingPrivateMsg } diff --git a/im-ui/src/view/Friend.vue b/im-ui/src/view/Friend.vue index b7efdaf..3f32c50 100644 --- a/im-ui/src/view/Friend.vue +++ b/im-ui/src/view/Friend.vue @@ -15,7 +15,7 @@
@@ -46,7 +46,7 @@
发送消息 加为好友 - 删除好友 + 删除好友
@@ -74,6 +74,7 @@ return { searchText: "", showAddFriend: false, + activeIdx: -1, userInfo: {} } }, @@ -84,11 +85,12 @@ onCloseAddFriend() { this.showAddFriend = false; }, - onActiveItem(friend, index) { - this.$store.commit("activeFriend", index); - this.loadUserInfo(friend, index); + onActiveItem(friend, idx) { + this.$store.commit("activeFriend", idx); + this.activeIdx = idx + this.loadUserInfo(friend, idx); }, - onDelItem(friend, index) { + onDelItem(friend, idx) { this.$confirm(`确认要解除与 '${friend.nickName}'的好友关系吗?`, '确认解除?', { confirmButtonText: '确定', cancelButtonText: '取消', @@ -99,7 +101,7 @@ method: 'delete' }).then((data) => { this.$message.success("删除好友成功"); - this.$store.commit("removeFriend", index); + this.$store.commit("removeFriend", idx); this.$store.commit("removePrivateChat", friend.id); }) }) @@ -173,14 +175,7 @@ isFriend(){ return this.friendStore.friends.find((f)=>f.id==this.userInfo.id); } - }, - mounted() { - if (this.friendStore.activeIndex >= 0) { - let friend = this.friendStore.friends[this.friendStore.activeIndex]; - this.loadUserInfo(friend, this.friendStore.activeIndex); - } } - } diff --git a/im-ui/src/view/Group.vue b/im-ui/src/view/Group.vue index c86513e..f843df8 100644 --- a/im-ui/src/view/Group.vue +++ b/im-ui/src/view/Group.vue @@ -13,7 +13,7 @@
+ :active="group === groupStore.activeGroup" @click.native="onActiveItem(group,index)">
@@ -269,15 +269,6 @@ imageAction() { return `/image/upload`; } - }, - mounted() { - if (this.groupStore.activeIndex >= 0) { - let activeGroup = this.groupStore.groups[this.groupStore.activeIndex]; - // store数据不能直接修改,所以深拷贝一份内存 - this.activeGroup = JSON.parse(JSON.stringify(activeGroup)); - // 加载群成员 - this.loadGroupMembers(); - } } } diff --git a/im-ui/src/view/Register.vue b/im-ui/src/view/Register.vue index 9b10f74..1c2c6e8 100644 --- a/im-ui/src/view/Register.vue +++ b/im-ui/src/view/Register.vue @@ -56,7 +56,6 @@ }; var checkConfirmPassword = (rule, value, callback) => { - console.log("checkConfirmPassword"); if (value === '') { return callback(new Error('请输入密码')); } From 6d04cdbd66f9534dfbb0a4c175f34df8eb81573c Mon Sep 17 00:00:00 2001 From: "xie.bx" Date: Sat, 18 Nov 2023 20:46:32 +0800 Subject: [PATCH 12/13] =?UTF-8?q?uniapp=20=E8=BE=93=E5=85=A5@=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E9=80=89=E6=8B=A9=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-uniapp/App.vue | 2 -- im-uniapp/pages/chat/chat-box.vue | 50 ++++++++++++++++++++----------- im-uniapp/store/chatStore.js | 39 ++++++++++++++---------- 3 files changed, 55 insertions(+), 36 deletions(-) diff --git a/im-uniapp/App.vue b/im-uniapp/App.vue index 2bcdacc..0e05e6c 100644 --- a/im-uniapp/App.vue +++ b/im-uniapp/App.vue @@ -73,7 +73,6 @@ this.insertPrivateMessage(friend,msgInfo); } }) - store.commit("refreshChats"); if (msgInfos.length == 100) { // 继续拉取 this.loadPrivateMessage(msgInfos[99].id); @@ -96,7 +95,6 @@ this.insertGroupMessage(group,msgInfo); } }) - store.commit("refreshChats"); if (msgInfos.length == 100) { // 继续拉取 this.loadGroupMessage(msgInfos[99].id); diff --git a/im-uniapp/pages/chat/chat-box.vue b/im-uniapp/pages/chat/chat-box.vue index 57bd607..dd6a8c6 100644 --- a/im-uniapp/pages/chat/chat-box.vue +++ b/im-uniapp/pages/chat/chat-box.vue @@ -11,8 +11,8 @@ + @longPressHead="onLongPressHead(msgInfo)" @download="onDownloadFile" :id="'chat-item-'+idx" + :msgInfo="msgInfo"> @@ -31,14 +31,14 @@ + @input="onTextInput" confirm-type="send" confirm-hold :hold-keyboard="true"> - + @@ -119,8 +119,8 @@ onAtComplete(atUserIds) { this.atUserIds = atUserIds; }, - onLongPressHead(msgInfo){ - if(!msgInfo.selfSend && this.chat.type=="GROUP" && this.atUserIds.indexOf(msgInfo.sendId)<0){ + onLongPressHead(msgInfo) { + if (!msgInfo.selfSend && this.chat.type == "GROUP" && this.atUserIds.indexOf(msgInfo.sendId) < 0) { this.atUserIds.push(msgInfo.sendId); } }, @@ -141,12 +141,12 @@ } }, sendTextMessage() { - if (!this.sendText.trim() && this.atUserIds.length==0) { + if (!this.sendText.trim() && this.atUserIds.length == 0) { return uni.showToast({ title: "不能发送空白信息", icon: "none" }); - + } let atText = this.createAtText() let msgInfo = { @@ -179,10 +179,10 @@ createAtText() { let atText = ""; this.atUserIds.forEach((id) => { - if(id==-1){ + if (id == -1) { atText += ` @全体成员`; - }else{ - let member = this.groupMembers.find((m)=>m.userId==id); + } else { + let member = this.groupMembers.find((m) => m.userId == id); if (member) { atText += ` @${member.aliasName}`; } @@ -414,6 +414,16 @@ }) } }, + onTextInput(e) { + let idx = e.detail.cursor - 1; + if (this.chat.type == 'GROUP' && e.detail.value[idx] == '@') { + this.openAtBox(); + let sendText = e.detail.value.replace("@", ''); + this.$nextTick(() => { + this.sendText = sendText; + }) + } + }, readedMessage() { if (this.chat.type == "GROUP") { var url = `/message/group/readed?groupId=${this.chat.targetId}` @@ -491,15 +501,18 @@ unreadCount() { return this.chat.unreadCount; }, - atUserItems(){ + atUserItems() { let atUsers = []; - this.atUserIds.forEach((id)=>{ - if(id==-1){ - atUsers.push({id:-1,aliasName:"全体成员"}) + this.atUserIds.forEach((id) => { + if (id == -1) { + atUsers.push({ + id: -1, + aliasName: "全体成员" + }) return; } - let member = this.groupMembers.find((m)=>m.userId==id); - if(member){ + let member = this.groupMembers.find((m) => m.userId == id); + if (member) { atUsers.push(member); } }) @@ -612,6 +625,7 @@ .chat-at-scroll-box { flex: 1; width: 80%; + .chat-at-items { display: flex; align-items: center; diff --git a/im-uniapp/store/chatStore.js b/im-uniapp/store/chatStore.js index 333bd97..8d1adcc 100644 --- a/im-uniapp/store/chatStore.js +++ b/im-uniapp/store/chatStore.js @@ -31,15 +31,12 @@ export default { }, openChat(state, chatInfo) { let chat = null; - for (let i in state.chats) { - if (state.chats[i].type == chatInfo.type && - state.chats[i].targetId === chatInfo.targetId) { - chat = state.chats[i]; - // 放置头部(这个操作非常耗资源,正在加载消息时不执行) - if(!state.loadingPrivateMsg && !state.loadingPrivateMsg){ - state.chats.splice(i, 1); - state.chats.unshift(chat); - } + for (let idx in state.chats) { + if (state.chats[idx].type == chatInfo.type && + state.chats[idx].targetId === chatInfo.targetId) { + chat = state.chats[idx]; + // 放置头部 + this.commit("moveTop",idx) break; } } @@ -110,22 +107,27 @@ export default { } }, moveTop(state, idx) { - let chat = state.chats[idx]; - // 放置头部 - state.chats.splice(idx, 1); - state.chats.unshift(chat); + // 加载中不移动,很耗性能 + if(state.loadingPrivateMsg || state.loadingGroupMsg){ + return ; + } + if (idx > 0) { + let chat = state.chats[idx]; + state.chats.splice(idx, 1); + state.chats.unshift(chat); + this.commit("saveToStorage"); + } }, insertMessage(state, msgInfo) { // 获取对方id或群id let type = msgInfo.groupId ? 'GROUP' : 'PRIVATE'; let targetId = msgInfo.groupId ? msgInfo.groupId : msgInfo.selfSend ? msgInfo.recvId : msgInfo.sendId; let chat = null; - let chatIdx = -1; for (let idx in state.chats) { if (state.chats[idx].type == type && state.chats[idx].targetId === targetId) { chat = state.chats[idx]; - chatIdx = idx; + this.commit("moveTop", idx) break; } } @@ -158,7 +160,6 @@ export default { chat.atAll = true; } } - // 记录消息的最大id if (msgInfo.id && type == "PRIVATE" && msgInfo.id > state.privateMsgMaxId) { state.privateMsgMaxId = msgInfo.id; @@ -246,9 +247,15 @@ export default { }, loadingPrivateMsg(state, loadding) { state.loadingPrivateMsg = loadding; + if(!state.loadingPrivateMsg && !state.loadingGroupMsg){ + this.commit("refreshChats") + } }, loadingGroupMsg(state, loadding) { state.loadingGroupMsg = loadding; + if(!state.loadingPrivateMsg && !state.loadingGroupMsg){ + this.commit("refreshChats") + } }, refreshChats(state){ state.chats.forEach((chat)=>{ From 19b0fce29e7f2b70aa9cb395ec8dc320be30fd08 Mon Sep 17 00:00:00 2001 From: "xie.bx" Date: Sat, 18 Nov 2023 21:52:07 +0800 Subject: [PATCH 13/13] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=A2=AB@=E5=90=8E?= =?UTF-8?q?=E7=82=B9=E4=B8=8D=E6=8E=89=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-platform/src/main/resources/application.yml | 7 +++++-- im-ui/src/store/chatStore.js | 2 ++ im-uniapp/store/chatStore.js | 2 ++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/im-platform/src/main/resources/application.yml b/im-platform/src/main/resources/application.yml index 59192d6..41e22c6 100644 --- a/im-platform/src/main/resources/application.yml +++ b/im-platform/src/main/resources/application.yml @@ -26,7 +26,7 @@ mybatis-plus: configuration: # 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射 map-underscore-to-camel-case: false - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # mapper mapper-locations: # *.xml的具体路径 @@ -50,4 +50,7 @@ jwt: secret: MIIBIjANBgkq refreshToken: expireIn: 604800 #7天 - secret: IKDiqVmn0VFU \ No newline at end of file + secret: IKDiqVmn0VFU + +logging: + config: classpath:logback-prod.xml diff --git a/im-ui/src/store/chatStore.js b/im-ui/src/store/chatStore.js index d417bc1..4bb1fd0 100644 --- a/im-ui/src/store/chatStore.js +++ b/im-ui/src/store/chatStore.js @@ -50,6 +50,8 @@ export default { lastSendTime: new Date().getTime(), unreadCount: 0, messages: [], + atMe: false, + atAll: false }; state.chats.unshift(chat); } diff --git a/im-uniapp/store/chatStore.js b/im-uniapp/store/chatStore.js index 8d1adcc..2149da2 100644 --- a/im-uniapp/store/chatStore.js +++ b/im-uniapp/store/chatStore.js @@ -51,6 +51,8 @@ export default { lastSendTime: new Date().getTime(), unreadCount: 0, messages: [], + atMe: false, + atAll: false }; state.chats.unshift(chat); }