From 1deeb61cb985b59df9e2e013692781eea6c61efa Mon Sep 17 00:00:00 2001 From: "xie.bx" Date: Sun, 6 Nov 2022 20:50:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=B3=A8=E9=87=8A,=E6=95=B4?= =?UTF-8?q?=E7=90=86=E4=BB=A3=E7=A0=81,1.0=E7=89=88=E6=9C=AC=E5=87=86?= =?UTF-8?q?=E5=A4=87=E4=B8=8A=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/bx/common/result/ResultUtils.java | 13 ---- .../implatform/config/MinIoClientConfig.java | 7 +- .../com/bx/implatform/config/RedisConfig.java | 18 +---- .../bx/implatform/config/SwaggerConfig.java | 4 +- .../implatform/config/WebSecurityConfg.java | 35 +++++----- .../implatform/controller/FileController.java | 8 +-- .../controller/FriendController.java | 2 +- .../controller/GroupController.java | 4 +- .../controller/GroupMessageController.java | 6 +- .../controller/PrivateMessageController.java | 2 +- .../controller/RegisterController.java | 2 +- .../implatform/controller/UserController.java | 2 +- .../java/com/bx/implatform/entity/Friend.java | 2 +- .../java/com/bx/implatform/entity/Group.java | 15 ++--- .../com/bx/implatform/entity/GroupMember.java | 15 ++--- .../bx/implatform/entity/GroupMessage.java | 15 ++--- .../java/com/bx/implatform/entity/User.java | 2 +- .../bx/implatform/mapper/FriendMapper.java | 9 +-- .../com/bx/implatform/mapper/GroupMapper.java | 11 +--- .../implatform/mapper/GroupMemberMapper.java | 11 +--- .../implatform/mapper/GroupMessageMapper.java | 11 +--- .../mapper/PrivateMessageMapper.java | 9 +-- .../com/bx/implatform/mapper/UserMapper.java | 9 +-- .../bx/implatform/service/IFriendService.java | 11 +--- .../service/IGroupMemberService.java | 11 +--- .../service/IGroupMessageService.java | 4 +- .../bx/implatform/service/IGroupService.java | 13 +--- .../service/IPrivateMessageService.java | 2 +- .../bx/implatform/service/IUserService.java | 11 +--- .../service/impl/FriendServiceImpl.java | 66 ++++++++++++++++--- .../service/impl/GroupMemberServiceImpl.java | 6 +- .../service/impl/GroupMessageServiceImpl.java | 22 ++++--- .../service/impl/GroupServiceImpl.java | 17 ++--- .../impl/PrivateMessageServiceImpl.java | 8 +-- .../impl/SecurityUserDetailsServiceImpl.java | 8 ++- .../service/impl/UserServiceImpl.java | 54 ++++++++++----- .../service/thirdparty/FileService.java | 2 +- .../task/PullAlreadyReadMessageTask.java | 4 +- .../java/com/bx/implatform/vo/GroupVO.java | 4 -- .../src/main/resources/application.yml | 4 +- .../com/bx/imserver/config/RedisConfig.java | 1 - .../task/PullUnreadGroupMessageTask.java | 2 +- .../task/PullUnreadPrivateMessageTask.java | 5 +- .../imserver/websocket/WebSocketHandler.java | 33 ++++++---- ...er.java => WebsocketChannelCtxHolder.java} | 10 +-- .../imserver/websocket/WebsocketServer.java | 10 +-- .../processor/GroupMessageProcessor.java | 6 +- .../websocket/processor/LoginProcessor.java | 7 +- .../processor/PrivateMessageProcessor.java | 6 +- 49 files changed, 256 insertions(+), 283 deletions(-) rename im-server/src/main/java/com/bx/imserver/websocket/{WebsocketChannelCtxHloder.java => WebsocketChannelCtxHolder.java} (84%) diff --git a/commom/src/main/java/com/bx/common/result/ResultUtils.java b/commom/src/main/java/com/bx/common/result/ResultUtils.java index 35a7988..0accdca 100644 --- a/commom/src/main/java/com/bx/common/result/ResultUtils.java +++ b/commom/src/main/java/com/bx/common/result/ResultUtils.java @@ -3,13 +3,8 @@ package com.bx.common.result; import com.bx.common.enums.ResultCode; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - public class ResultUtils { - - public static final Result success(){ Result result=new Result(); result.setCode(ResultCode.SUCCESS.getCode()); @@ -18,14 +13,6 @@ public class ResultUtils { } public static final Result success(T data){ - ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); - cachedThreadPool.submit(new Runnable() { - - @Override - public void run() { - System.out.println("当前线程"+Thread.currentThread().getName()); - } - }); Result result=new Result(); result.setCode(ResultCode.SUCCESS.getCode()); result.setMessage(ResultCode.SUCCESS.getMsg()); diff --git a/im-platform/src/main/java/com/bx/implatform/config/MinIoClientConfig.java b/im-platform/src/main/java/com/bx/implatform/config/MinIoClientConfig.java index 837ee8c..43503af 100644 --- a/im-platform/src/main/java/com/bx/implatform/config/MinIoClientConfig.java +++ b/im-platform/src/main/java/com/bx/implatform/config/MinIoClientConfig.java @@ -15,13 +15,10 @@ public class MinIoClientConfig { @Value("${minio.secretKey}") private String secretKey; - /** - * 注入minio 客户端 - * @return - */ + @Bean public MinioClient minioClient(){ - + // 注入minio 客户端 MinioClient client = MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) diff --git a/im-platform/src/main/java/com/bx/implatform/config/RedisConfig.java b/im-platform/src/main/java/com/bx/implatform/config/RedisConfig.java index 8687cfc..1dec3cc 100644 --- a/im-platform/src/main/java/com/bx/implatform/config/RedisConfig.java +++ b/im-platform/src/main/java/com/bx/implatform/config/RedisConfig.java @@ -27,10 +27,7 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; import javax.annotation.Resource; import java.time.Duration; -/** - * redis配置 - * @author zsq - */ + @EnableCaching @Configuration public class RedisConfig extends CachingConfigurerSupport { @@ -38,17 +35,6 @@ public class RedisConfig extends CachingConfigurerSupport { @Resource private RedisConnectionFactory factory; - - /** - * 重写Redis序列化方式,使用Json方式: - * 当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的。RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer。 - * Spring Data JPA为我们提供了下面的Serializer: - * GenericToStringSerializer、Jackson2JsonRedisSerializer、JacksonJsonRedisSerializer、JdkSerializationRedisSerializer、OxmSerializer、StringRedisSerializer。 - * 在此我们将自己配置RedisTemplate并定义Serializer。 - * - * @param redisConnectionFactory - * @return - */ @Primary @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { @@ -95,12 +81,12 @@ public class RedisConfig extends CachingConfigurerSupport { @Bean @Override public CacheManager cacheManager() { + // 设置redis缓存管理器 RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() .disableCachingNullValues() .entryTtl(Duration.ofMinutes(10)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer())); return RedisCacheManager.builder(factory).cacheDefaults(cacheConfiguration).build(); - } } diff --git a/im-platform/src/main/java/com/bx/implatform/config/SwaggerConfig.java b/im-platform/src/main/java/com/bx/implatform/config/SwaggerConfig.java index 39e37b6..f5557db 100644 --- a/im-platform/src/main/java/com/bx/implatform/config/SwaggerConfig.java +++ b/im-platform/src/main/java/com/bx/implatform/config/SwaggerConfig.java @@ -33,8 +33,8 @@ public class SwaggerConfig { private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("IM Platform doc") - .description("蓝星IM API文档") - .termsOfServiceUrl("http://XXX/") + .description("盒子IM API文档") + .termsOfServiceUrl("http://8.134.92.70/") .version("1.0") .build(); } diff --git a/im-platform/src/main/java/com/bx/implatform/config/WebSecurityConfg.java b/im-platform/src/main/java/com/bx/implatform/config/WebSecurityConfg.java index a71dc3e..9a3a218 100644 --- a/im-platform/src/main/java/com/bx/implatform/config/WebSecurityConfg.java +++ b/im-platform/src/main/java/com/bx/implatform/config/WebSecurityConfg.java @@ -1,16 +1,15 @@ package com.bx.implatform.config; import com.alibaba.fastjson.JSON; -import com.bx.implatform.service.IUserService; -import com.bx.implatform.session.UserSession; -import com.fasterxml.jackson.databind.ObjectMapper; import com.bx.common.enums.ResultCode; import com.bx.common.result.Result; import com.bx.common.result.ResultUtils; +import com.bx.implatform.service.IUserService; +import com.bx.implatform.session.UserSession; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.*; @@ -32,6 +31,7 @@ import java.io.PrintWriter; /* * SpringSecurity安全框架配置 + * * @Author Blue * @Date 2022/10/21 */ @@ -58,7 +58,7 @@ public class WebSecurityConfg extends WebSecurityConfigurerAdapter { .anyRequest() //任何其它请求 .authenticated() //都需要身份认证 .and() - //2、登录配置表单认证方式 + // 登录配置表单认证方式 .formLogin() .usernameParameter("username")//设置登录账号参数,与表单参数一致 .passwordParameter("password")//设置登录密码参数,与表单参数一致 @@ -66,16 +66,16 @@ public class WebSecurityConfg extends WebSecurityConfigurerAdapter { .successHandler(successHandler()) .failureHandler(failureHandler()) .and() - //3、注销 + // 注销 .logout() .logoutUrl("/logout") .logoutSuccessHandler(logoutHandler()) .permitAll() .and() - //4、session管理 + // session管理 .sessionManagement() .and() - //5、禁用跨站csrf攻击防御 + // 禁用跨站csrf攻击防御 .csrf() .disable() .exceptionHandling() @@ -83,8 +83,6 @@ public class WebSecurityConfg extends WebSecurityConfigurerAdapter { } - - @Bean AuthenticationFailureHandler failureHandler(){ return (request, response, exception) -> { @@ -111,6 +109,10 @@ public class WebSecurityConfg extends WebSecurityConfigurerAdapter { @Bean AuthenticationSuccessHandler successHandler(){ return (request, response, authentication) -> { + User useDetail = (User)authentication.getPrincipal(); + String strJson = useDetail.getUsername(); + UserSession userSession = JSON.parseObject(strJson,UserSession.class); + log.info("用户 '{}' 登录,id:{},昵称:{}",userSession.getUserName(),userSession.getId(),userSession.getNickName()); // 响应 response.setContentType("application/json;charset=utf-8"); PrintWriter out = response.getWriter(); @@ -118,6 +120,7 @@ public class WebSecurityConfg extends WebSecurityConfigurerAdapter { out.write(new ObjectMapper().writeValueAsString(result)); out.flush(); out.close(); + }; } @@ -125,12 +128,10 @@ public class WebSecurityConfg extends WebSecurityConfigurerAdapter { @Bean LogoutSuccessHandler logoutHandler(){ return (request, response, authentication) -> { - User useDetail = (User)authentication.getPrincipal(); String strJson = useDetail.getUsername(); UserSession userSession = JSON.parseObject(strJson,UserSession.class); - log.info("{}退出", userSession.getUserName()); - + log.info("用户 '{}' 退出,id:{},昵称:{}",userSession.getUserName(),userSession.getId(),userSession.getNickName()); // 响应 response.setContentType("application/json;charset=utf-8"); PrintWriter out = response.getWriter(); @@ -145,7 +146,6 @@ public class WebSecurityConfg extends WebSecurityConfigurerAdapter { AuthenticationEntryPoint entryPoint(){ return (request, response, exception) -> { response.setContentType("application/json;charset=utf-8"); - log.info(request.getRequestURI()); PrintWriter out = response.getWriter(); Result result = ResultUtils.error(ResultCode.NO_LOGIN); out.write(new ObjectMapper().writeValueAsString(result)); @@ -156,18 +156,13 @@ public class WebSecurityConfg extends WebSecurityConfigurerAdapter { - @Bean public PasswordEncoder passwordEncoder(){ // 使用BCrypt加密密码 return new BCryptPasswordEncoder(); } - /** - * 密码加密 - * @param auth - * @throws Exception - */ + @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); 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 83ff9e3..901083f 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 @@ -2,8 +2,8 @@ package com.bx.implatform.controller; import com.bx.common.result.Result; import com.bx.common.result.ResultUtils; -import com.bx.implatform.vo.UploadImageVO; 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.extern.slf4j.Slf4j; @@ -12,11 +12,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -/* - * 文件上传 - * @Author Blue - * @Date 2022/10/28 - */ + @Slf4j @RestController @Api(tags = "文件上传") 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 0ab0140..e1d718e 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 @@ -3,10 +3,10 @@ package com.bx.implatform.controller; import com.bx.common.result.Result; import com.bx.common.result.ResultUtils; -import com.bx.implatform.vo.FriendVO; import com.bx.implatform.entity.Friend; import com.bx.implatform.service.IFriendService; import com.bx.implatform.session.SessionContext; +import com.bx.implatform.vo.FriendVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; 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 e274afb..0d7a62b 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 @@ -3,10 +3,11 @@ package com.bx.implatform.controller; import com.bx.common.result.Result; import com.bx.common.result.ResultUtils; +import com.bx.implatform.service.IGroupService; import com.bx.implatform.vo.GroupInviteVO; import com.bx.implatform.vo.GroupMemberVO; import com.bx.implatform.vo.GroupVO; -import com.bx.implatform.service.IGroupService; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -17,6 +18,7 @@ import javax.validation.constraints.NotNull; import java.util.List; +@Api(tags = "群聊") @RestController @RequestMapping("/group") public class GroupController { 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 ca09878..8151303 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 @@ -3,19 +3,21 @@ package com.bx.implatform.controller; import com.bx.common.result.Result; import com.bx.common.result.ResultUtils; -import com.bx.implatform.vo.GroupMessageVO; import com.bx.implatform.service.IGroupMessageService; +import com.bx.implatform.vo.GroupMessageVO; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; - import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; + +@Api(tags = "群聊消息") @RestController @RequestMapping("/message/group") public class GroupMessageController { 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 c0446e9..67f0487 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 @@ -3,8 +3,8 @@ package com.bx.implatform.controller; import com.bx.common.result.Result; import com.bx.common.result.ResultUtils; -import com.bx.implatform.vo.PrivateMessageVO; import com.bx.implatform.service.IPrivateMessageService; +import com.bx.implatform.vo.PrivateMessageVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; diff --git a/im-platform/src/main/java/com/bx/implatform/controller/RegisterController.java b/im-platform/src/main/java/com/bx/implatform/controller/RegisterController.java index df0faf1..9a3e044 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/RegisterController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/RegisterController.java @@ -3,8 +3,8 @@ package com.bx.implatform.controller; import com.bx.common.result.Result; import com.bx.common.result.ResultUtils; -import com.bx.implatform.vo.RegisterVO; import com.bx.implatform.service.IUserService; +import com.bx.implatform.vo.RegisterVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; 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 8c016f4..603c8ef 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 @@ -4,11 +4,11 @@ package com.bx.implatform.controller; import com.bx.common.result.Result; import com.bx.common.result.ResultUtils; import com.bx.common.util.BeanUtils; -import com.bx.implatform.vo.UserVO; import com.bx.implatform.entity.User; import com.bx.implatform.service.IUserService; import com.bx.implatform.session.SessionContext; import com.bx.implatform.session.UserSession; +import com.bx.implatform.vo.UserVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; diff --git a/im-platform/src/main/java/com/bx/implatform/entity/Friend.java b/im-platform/src/main/java/com/bx/implatform/entity/Friend.java index ac8a5e2..364ffe1 100644 --- a/im-platform/src/main/java/com/bx/implatform/entity/Friend.java +++ b/im-platform/src/main/java/com/bx/implatform/entity/Friend.java @@ -13,7 +13,7 @@ import java.util.Date; /** *

- * + * 好友 *

* * @author blue diff --git a/im-platform/src/main/java/com/bx/implatform/entity/Group.java b/im-platform/src/main/java/com/bx/implatform/entity/Group.java index feec161..f81e91f 100644 --- a/im-platform/src/main/java/com/bx/implatform/entity/Group.java +++ b/im-platform/src/main/java/com/bx/implatform/entity/Group.java @@ -1,19 +1,16 @@ package com.bx.implatform.entity; -import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.extension.activerecord.Model; - -import java.util.Date; - -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableField; - -import java.io.Serializable; - +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; import lombok.Data; import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; + /** * 群 * @author blue diff --git a/im-platform/src/main/java/com/bx/implatform/entity/GroupMember.java b/im-platform/src/main/java/com/bx/implatform/entity/GroupMember.java index f5aac30..992d8ef 100644 --- a/im-platform/src/main/java/com/bx/implatform/entity/GroupMember.java +++ b/im-platform/src/main/java/com/bx/implatform/entity/GroupMember.java @@ -1,19 +1,16 @@ package com.bx.implatform.entity; -import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.extension.activerecord.Model; - -import java.util.Date; - -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableField; - -import java.io.Serializable; - +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; import lombok.Data; import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; + /** *

* 群成员 diff --git a/im-platform/src/main/java/com/bx/implatform/entity/GroupMessage.java b/im-platform/src/main/java/com/bx/implatform/entity/GroupMessage.java index 59e876d..2734aab 100644 --- a/im-platform/src/main/java/com/bx/implatform/entity/GroupMessage.java +++ b/im-platform/src/main/java/com/bx/implatform/entity/GroupMessage.java @@ -1,19 +1,16 @@ package com.bx.implatform.entity; -import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.extension.activerecord.Model; - -import java.util.Date; - -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableField; - -import java.io.Serializable; - +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; import lombok.Data; import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.util.Date; + /** *

* 群消息 diff --git a/im-platform/src/main/java/com/bx/implatform/entity/User.java b/im-platform/src/main/java/com/bx/implatform/entity/User.java index 83a638d..1fa5ddd 100644 --- a/im-platform/src/main/java/com/bx/implatform/entity/User.java +++ b/im-platform/src/main/java/com/bx/implatform/entity/User.java @@ -13,7 +13,7 @@ import java.util.Date; /** *

- * + * 用户 *

* * @author blue diff --git a/im-platform/src/main/java/com/bx/implatform/mapper/FriendMapper.java b/im-platform/src/main/java/com/bx/implatform/mapper/FriendMapper.java index 18114f3..2a7f1b1 100644 --- a/im-platform/src/main/java/com/bx/implatform/mapper/FriendMapper.java +++ b/im-platform/src/main/java/com/bx/implatform/mapper/FriendMapper.java @@ -3,14 +3,7 @@ package com.bx.implatform.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.bx.implatform.entity.Friend; -/** - *

- * Mapper 接口 - *

- * - * @author blue - * @since 2022-10-22 - */ + public interface FriendMapper extends BaseMapper { } diff --git a/im-platform/src/main/java/com/bx/implatform/mapper/GroupMapper.java b/im-platform/src/main/java/com/bx/implatform/mapper/GroupMapper.java index e0ce5cd..4ba8951 100644 --- a/im-platform/src/main/java/com/bx/implatform/mapper/GroupMapper.java +++ b/im-platform/src/main/java/com/bx/implatform/mapper/GroupMapper.java @@ -1,16 +1,9 @@ package com.bx.implatform.mapper; -import com.bx.implatform.entity.Group; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bx.implatform.entity.Group; + -/** - *

- * 群 Mapper 接口 - *

- * - * @author blue - * @since 2022-10-31 - */ public interface GroupMapper extends BaseMapper { } diff --git a/im-platform/src/main/java/com/bx/implatform/mapper/GroupMemberMapper.java b/im-platform/src/main/java/com/bx/implatform/mapper/GroupMemberMapper.java index 22e2dc2..ba63d87 100644 --- a/im-platform/src/main/java/com/bx/implatform/mapper/GroupMemberMapper.java +++ b/im-platform/src/main/java/com/bx/implatform/mapper/GroupMemberMapper.java @@ -1,16 +1,9 @@ package com.bx.implatform.mapper; -import com.bx.implatform.entity.GroupMember; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bx.implatform.entity.GroupMember; + -/** - *

- * 群成员 Mapper 接口 - *

- * - * @author blue - * @since 2022-10-31 - */ public interface GroupMemberMapper extends BaseMapper { } diff --git a/im-platform/src/main/java/com/bx/implatform/mapper/GroupMessageMapper.java b/im-platform/src/main/java/com/bx/implatform/mapper/GroupMessageMapper.java index 8d9a976..2519cf1 100644 --- a/im-platform/src/main/java/com/bx/implatform/mapper/GroupMessageMapper.java +++ b/im-platform/src/main/java/com/bx/implatform/mapper/GroupMessageMapper.java @@ -1,16 +1,9 @@ package com.bx.implatform.mapper; -import com.bx.implatform.entity.GroupMessage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bx.implatform.entity.GroupMessage; + -/** - *

- * 群消息 Mapper 接口 - *

- * - * @author blue - * @since 2022-10-31 - */ public interface GroupMessageMapper extends BaseMapper { } diff --git a/im-platform/src/main/java/com/bx/implatform/mapper/PrivateMessageMapper.java b/im-platform/src/main/java/com/bx/implatform/mapper/PrivateMessageMapper.java index dd264a0..15ff92d 100644 --- a/im-platform/src/main/java/com/bx/implatform/mapper/PrivateMessageMapper.java +++ b/im-platform/src/main/java/com/bx/implatform/mapper/PrivateMessageMapper.java @@ -3,14 +3,7 @@ package com.bx.implatform.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.bx.implatform.entity.PrivateMessage; -/** - *

- * Mapper 接口 - *

- * - * @author blue - * @since 2022-10-01 - */ + public interface PrivateMessageMapper extends BaseMapper { } diff --git a/im-platform/src/main/java/com/bx/implatform/mapper/UserMapper.java b/im-platform/src/main/java/com/bx/implatform/mapper/UserMapper.java index bd3cb70..9984cd9 100644 --- a/im-platform/src/main/java/com/bx/implatform/mapper/UserMapper.java +++ b/im-platform/src/main/java/com/bx/implatform/mapper/UserMapper.java @@ -3,14 +3,7 @@ package com.bx.implatform.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.bx.implatform.entity.User; -/** - *

- * Mapper 接口 - *

- * - * @author blue - * @since 2022-10-01 - */ + public interface UserMapper extends BaseMapper { } 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 583cba9..ec5b339 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 @@ -1,19 +1,12 @@ package com.bx.implatform.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.bx.implatform.vo.FriendVO; import com.bx.implatform.entity.Friend; +import com.bx.implatform.vo.FriendVO; import java.util.List; -/** - *

- * 服务类 - *

- * - * @author blue - * @since 2022-10-22 - */ + public interface IFriendService extends IService { Boolean isFriend(Long userId1, Long userId2); 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 4ca8526..f5a58c8 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 @@ -1,18 +1,11 @@ package com.bx.implatform.service; -import com.bx.implatform.entity.GroupMember; import com.baomidou.mybatisplus.extension.service.IService; +import com.bx.implatform.entity.GroupMember; import java.util.List; -/** - *

- * 群成员 服务类 - *

- * - * @author blue - * @since 2022-10-31 - */ + public interface IGroupMemberService extends IService { 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 5cfee30..435d693 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,8 +1,8 @@ package com.bx.implatform.service; -import com.bx.implatform.vo.GroupMessageVO; -import com.bx.implatform.entity.GroupMessage; import com.baomidou.mybatisplus.extension.service.IService; +import com.bx.implatform.entity.GroupMessage; +import com.bx.implatform.vo.GroupMessageVO; public interface IGroupMessageService extends IService { 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 be611fc..eeae9d5 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 @@ -1,21 +1,14 @@ package com.bx.implatform.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bx.implatform.entity.Group; import com.bx.implatform.vo.GroupInviteVO; import com.bx.implatform.vo.GroupMemberVO; import com.bx.implatform.vo.GroupVO; -import com.bx.implatform.entity.Group; -import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; -/** - *

- * 群 服务类 - *

- * - * @author blue - * @since 2022-10-31 - */ + public interface IGroupService extends IService { 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 d4630fb..691b530 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,8 +1,8 @@ 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.vo.PrivateMessageVO; public interface IPrivateMessageService extends IService { 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 f5b3388..b45d43f 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,20 +1,13 @@ package com.bx.implatform.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.bx.implatform.entity.User; import com.bx.implatform.vo.RegisterVO; import com.bx.implatform.vo.UserVO; -import com.bx.implatform.entity.User; import java.util.List; -/** - *

- * 用户服务类 - *

- * - * @author blue - * @since 2022-10-01 - */ + public interface IUserService extends IService { void register(RegisterVO registerDTO); 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 903022d..89faeca 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 @@ -4,15 +4,15 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bx.common.contant.RedisKey; import com.bx.common.enums.ResultCode; -import com.bx.implatform.exception.GlobalException; -import com.bx.implatform.vo.FriendVO; import com.bx.implatform.entity.Friend; import com.bx.implatform.entity.User; +import com.bx.implatform.exception.GlobalException; import com.bx.implatform.mapper.FriendMapper; 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 org.springframework.aop.framework.AopContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; @@ -23,14 +23,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; -/** - *

- * 好友服务实现类 - *

- * - * @author blue - * @since 2022-10-22 - */ + @CacheConfig(cacheNames= RedisKey.IM_CACHE_FRIEND) @Service public class FriendServiceImpl extends ServiceImpl implements IFriendService { @@ -38,6 +31,12 @@ public class FriendServiceImpl extends ServiceImpl impleme @Autowired private IUserService userService; + /** + * 查询用户的所有好友 + * + * @param UserId 用户id + * @return + */ @Override public List findFriendByUserId(Long UserId) { QueryWrapper queryWrapper = new QueryWrapper(); @@ -47,6 +46,12 @@ public class FriendServiceImpl extends ServiceImpl impleme } + /** + * 添加好友,互相建立好友关系 + * + * @param friendId 好友的用户id + * @return + */ @Transactional @Override public void addFriend(Long friendId) { @@ -61,6 +66,12 @@ public class FriendServiceImpl extends ServiceImpl impleme } + /** + * 删除好友,双方都会解除好友关系 + * + * @param friendId 好友的用户id + * @return + */ @Transactional @Override public void delFriend(Long friendId) { @@ -72,6 +83,13 @@ public class FriendServiceImpl extends ServiceImpl impleme } + /** + * 判断用户2是否用户1的好友 + * + * @param userId1 用户1的id + * @param userId2 用户2的id + * @return + */ @Cacheable(key="#userId1+':'+#userId2") @Override public Boolean isFriend(Long userId1, Long userId2) { @@ -83,6 +101,12 @@ public class FriendServiceImpl extends ServiceImpl impleme } + /** + * 更新好友信息,主要是头像和昵称 + * + * @param vo 好友vo + * @return + */ @Override public void update(FriendVO vo) { long userId = SessionContext.getSession().getId(); @@ -101,6 +125,14 @@ public class FriendServiceImpl extends ServiceImpl impleme this.updateById(f); } + + /** + * 单向绑定好友关系 + * + * @param userId 用户id + * @param friendId 好友的用户id + * @return + */ @CacheEvict(key="#userId+':'+#friendId") public void bindFriend(Long userId, Long friendId) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -118,6 +150,14 @@ public class FriendServiceImpl extends ServiceImpl impleme } } + + /** + * 单向解除好友关系 + * + * @param userId 用户id + * @param friendId 好友的用户id + * @return + */ @CacheEvict(key="#userId+':'+#friendId") public void unbindFriend(Long userId, Long friendId) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -131,6 +171,12 @@ 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 852e58b..69616b1 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 @@ -2,11 +2,11 @@ package com.bx.implatform.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bx.common.contant.RedisKey; import com.bx.implatform.entity.GroupMember; import com.bx.implatform.mapper.GroupMemberMapper; import com.bx.implatform.service.IGroupMemberService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; @@ -62,6 +62,7 @@ public class GroupMemberServiceImpl extends ServiceImpl userIds = groupMemberService.findUserIdsByGroupId(group.getId()); + if(!userIds.contains(userId)){ + throw new GlobalException(ResultCode.PROGRAM_ERROR,"您已不在群聊里面,无法发送消息"); } // 保存消息 GroupMessage msg = BeanUtils.copyProperties(vo, GroupMessage.class); @@ -58,13 +66,7 @@ public class GroupMessageServiceImpl extends ServiceImpl> serverMap = new ConcurrentHashMap<>(); - List userIds = groupMemberService.findUserIdsByGroupId(group.getId()); - if(!userIds.contains(userId)){ - throw new GlobalException(ResultCode.PROGRAM_ERROR,"您已不在群聊里面,无法发送消息"); - } - userIds.parallelStream().forEach(id->{ - String key = RedisKey.IM_USER_SERVER_ID + id; Integer serverId = (Integer)redisTemplate.opsForValue().get(key); if(serverId != null){ 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 26d6d1b..c5b9ceb 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 @@ -1,26 +1,26 @@ package com.bx.implatform.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bx.common.contant.Constant; import com.bx.common.contant.RedisKey; import com.bx.common.enums.ResultCode; import com.bx.common.util.BeanUtils; -import com.bx.implatform.exception.GlobalException; -import com.bx.implatform.vo.GroupInviteVO; -import com.bx.implatform.vo.GroupMemberVO; -import com.bx.implatform.vo.GroupVO; import com.bx.implatform.entity.Friend; import com.bx.implatform.entity.Group; import com.bx.implatform.entity.GroupMember; import com.bx.implatform.entity.User; +import com.bx.implatform.exception.GlobalException; import com.bx.implatform.mapper.GroupMapper; import com.bx.implatform.service.IFriendService; import com.bx.implatform.service.IGroupMemberService; import com.bx.implatform.service.IGroupService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bx.implatform.service.IUserService; import com.bx.implatform.session.SessionContext; import com.bx.implatform.session.UserSession; +import com.bx.implatform.vo.GroupInviteVO; +import com.bx.implatform.vo.GroupMemberVO; +import com.bx.implatform.vo.GroupVO; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; @@ -28,6 +28,7 @@ import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; + import java.util.Collections; import java.util.List; import java.util.Optional; @@ -51,8 +52,8 @@ public class GroupServiceImpl extends ServiceImpl implements /** * 创建新群聊 * - * @return GroupVO * @Param groupName 群聊名称 + * @return **/ @Transactional @Override @@ -85,7 +86,7 @@ public class GroupServiceImpl extends ServiceImpl implements * 修改群聊信息 * * @Param GroupVO 群聊信息 - * @return GroupVO + * @return **/ @CacheEvict(value = "#vo.getId()") @Transactional @@ -209,7 +210,7 @@ public class GroupServiceImpl extends ServiceImpl implements /** * 查询当前用户的所有群聊 * - * @return List + * @return **/ @Override public List findGroups() { 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 8c4a663..cac357a 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 @@ -7,13 +7,13 @@ import com.bx.common.enums.MessageStatusEnum; import com.bx.common.enums.ResultCode; import com.bx.common.model.im.PrivateMessageInfo; import com.bx.common.util.BeanUtils; +import com.bx.implatform.entity.PrivateMessage; import com.bx.implatform.exception.GlobalException; +import com.bx.implatform.mapper.PrivateMessageMapper; +import com.bx.implatform.service.IFriendService; import com.bx.implatform.service.IPrivateMessageService; import com.bx.implatform.session.SessionContext; import com.bx.implatform.vo.PrivateMessageVO; -import com.bx.implatform.entity.PrivateMessage; -import com.bx.implatform.mapper.PrivateMessageMapper; -import com.bx.implatform.service.IFriendService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @@ -34,7 +34,7 @@ public class PrivateMessageServiceImpl extends ServiceImpl - * 用户服务实现类 - *

- * - * @author blue - * @since 2022-10-01 - */ + @Service public class UserServiceImpl extends ServiceImpl implements IUserService { @@ -50,6 +43,12 @@ public class UserServiceImpl extends ServiceImpl implements IU @Autowired private IFriendService friendService; + /** + * 用户注册 + * + * @param vo 注册vo + * @return + */ @Override public void register(RegisterVO vo) { User user = findUserByName(vo.getUserName()); @@ -61,6 +60,12 @@ public class UserServiceImpl extends ServiceImpl implements IU this.save(user); } + /** + * 根据用户名查询用户 + * + * @param username 用户名 + * @return + */ @Override public User findUserByName(String username) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -68,6 +73,12 @@ public class UserServiceImpl extends ServiceImpl implements IU return this.getOne(queryWrapper); } + /** + * 更新用户信息,好友昵称和群聊昵称等冗余信息也会更新 + * + * @param vo 用户信息vo + * @return + */ @Transactional @Override public void update(UserVO vo) { @@ -107,12 +118,19 @@ public class UserServiceImpl extends ServiceImpl implements IU this.updateById(user); } + + /** + * 根据用户昵称查询用户,最多返回20条数据 + * + * @param nickname 用户昵称 + * @return + */ @Override public List findUserByNickName(String nickname) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda() .like(User::getNickName,nickname) - .last("limit 10"); + .last("limit 20"); List users = this.list(queryWrapper); List vos = users.stream().map(u-> { UserVO vo = BeanUtils.copyProperties(u,UserVO.class); @@ -123,6 +141,12 @@ public class UserServiceImpl extends ServiceImpl implements IU } + /** + * 判断用户是否在线,返回在线的用户id列表 + * + * @param userIds 用户id,多个用‘,’分割 + * @return + */ @Override public List checkOnline(String userIds) { String[] idArr = userIds.split(","); 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 ecf2114..ee503ed 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 @@ -4,10 +4,10 @@ import com.bx.common.contant.Constant; import com.bx.common.enums.FileTypeEnum; import com.bx.common.enums.ResultCode; import com.bx.implatform.exception.GlobalException; -import com.bx.implatform.vo.UploadImageVO; 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.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; diff --git a/im-platform/src/main/java/com/bx/implatform/task/PullAlreadyReadMessageTask.java b/im-platform/src/main/java/com/bx/implatform/task/PullAlreadyReadMessageTask.java index 9bd022d..c6118da 100644 --- a/im-platform/src/main/java/com/bx/implatform/task/PullAlreadyReadMessageTask.java +++ b/im-platform/src/main/java/com/bx/implatform/task/PullAlreadyReadMessageTask.java @@ -64,7 +64,9 @@ public class PullAlreadyReadMessageTask { Thread.sleep(200); }finally { // 下一次循环 - executorService.submit(this); + if(executorService.isShutdown()){ + executorService.submit(this); + } } } } 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 a211039..9378fd1 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 @@ -1,8 +1,5 @@ package com.bx.implatform.vo; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -10,7 +7,6 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -import java.util.Date; @Data @ApiModel("群信息VO") diff --git a/im-platform/src/main/resources/application.yml b/im-platform/src/main/resources/application.yml index cb3dc6d..7237f51 100644 --- a/im-platform/src/main/resources/application.yml +++ b/im-platform/src/main/resources/application.yml @@ -5,7 +5,7 @@ server: spring: datasource: driver-class-name: com.mysql.jdbc.Driver - url: jdbc:mysql://localhost:3306/box-im?useUnicode=true&characterEncoding=utf-8 + url: jdbc:mysql://localhost:3306/box-im?useSSL=false&useUnicode=true&characterEncoding=utf-8 username: root password: root @@ -23,7 +23,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/config/RedisConfig.java b/im-server/src/main/java/com/bx/imserver/config/RedisConfig.java index bc3cc33..d2f946f 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 @@ -26,7 +26,6 @@ public class RedisConfig { public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(redisConnectionFactory); - // 设置值(value)的序列化采用jackson2JsonRedisSerializer redisTemplate.setValueSerializer(jackson2JsonRedisSerializer()); redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer()); diff --git a/im-server/src/main/java/com/bx/imserver/task/PullUnreadGroupMessageTask.java b/im-server/src/main/java/com/bx/imserver/task/PullUnreadGroupMessageTask.java index ad29429..241cbb2 100644 --- a/im-server/src/main/java/com/bx/imserver/task/PullUnreadGroupMessageTask.java +++ b/im-server/src/main/java/com/bx/imserver/task/PullUnreadGroupMessageTask.java @@ -34,7 +34,7 @@ public class PullUnreadGroupMessageTask extends AbstractPullMessageTask { redisTemplate.opsForList().leftPop(key); GroupMessageInfo messageInfo = (GroupMessageInfo)o; MessageProcessor processor = ProcessorFactory.createProcessor(WSCmdEnum.GROUP_MESSAGE); - processor.process(null,messageInfo); + processor.process(messageInfo); } } diff --git a/im-server/src/main/java/com/bx/imserver/task/PullUnreadPrivateMessageTask.java b/im-server/src/main/java/com/bx/imserver/task/PullUnreadPrivateMessageTask.java index 914c18c..bf515ef 100644 --- a/im-server/src/main/java/com/bx/imserver/task/PullUnreadPrivateMessageTask.java +++ b/im-server/src/main/java/com/bx/imserver/task/PullUnreadPrivateMessageTask.java @@ -33,9 +33,8 @@ public class PullUnreadPrivateMessageTask extends AbstractPullMessageTask { for(Object o: messageInfos){ redisTemplate.opsForList().leftPop(key); PrivateMessageInfo messageInfo = (PrivateMessageInfo)o; - - MessageProcessor processor = ProcessorFactory.createProcessor(WSCmdEnum.PRIVATE_MESSAGE); - processor.process(null,messageInfo); + MessageProcessor processor = ProcessorFactory.createProcessor(WSCmdEnum.PRIVATE_MESSAGE); + processor.process(messageInfo); } } diff --git a/im-server/src/main/java/com/bx/imserver/websocket/WebSocketHandler.java b/im-server/src/main/java/com/bx/imserver/websocket/WebSocketHandler.java index e068883..8e8e9f6 100644 --- a/im-server/src/main/java/com/bx/imserver/websocket/WebSocketHandler.java +++ b/im-server/src/main/java/com/bx/imserver/websocket/WebSocketHandler.java @@ -23,9 +23,15 @@ import org.springframework.data.redis.core.RedisTemplate; @Slf4j public class WebSocketHandler extends SimpleChannelInboundHandler { - + /** + * 读取到消息后进行处理 + * + * @param ctx + * @param sendInfo + * @throws Exception + */ @Override - protected void channelRead0(ChannelHandlerContext ctx, SendInfo sendInfo) throws Exception { + protected void channelRead0(ChannelHandlerContext ctx, SendInfo sendInfo) throws Exception { // 创建处理器进行处理 MessageProcessor processor = ProcessorFactory.createProcessor(WSCmdEnum.fromCode(sendInfo.getCmd())); processor.process(ctx,processor.transForm(sendInfo.getData())); @@ -34,12 +40,12 @@ public class WebSocketHandler extends SimpleChannelInboundHandler { /** * 出现异常的处理 打印报错日志 * - * @param ctx the ctx - * @param cause the cause - * @throws Exception the Exception + * @param ctx + * @param cause + * @throws Exception */ @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { log.error(cause.getMessage()); //关闭上下文 //ctx.close(); @@ -48,23 +54,23 @@ public class WebSocketHandler extends SimpleChannelInboundHandler { /** * 监控浏览器上线 * - * @param ctx the ctx - * @throws Exception the Exception + * @param ctx + * @throws Exception */ @Override - public void handlerAdded(ChannelHandlerContext ctx) throws Exception { + public void handlerAdded(ChannelHandlerContext ctx) throws Exception { log.info(ctx.channel().id().asLongText() + "连接"); } @Override - public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { + public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { AttributeKey attr = AttributeKey.valueOf("USER_ID"); Long userId = ctx.channel().attr(attr).get(); - ChannelHandlerContext context = WebsocketChannelCtxHloder.getChannelCtx(userId); + ChannelHandlerContext context = WebsocketChannelCtxHolder.getChannelCtx(userId); // 判断一下,避免异地登录导致的误删 if(context != null && ctx.channel().id().equals(context.channel().id())){ // 移除channel - WebsocketChannelCtxHloder.removeChannelCtx(userId); + WebsocketChannelCtxHolder.removeChannelCtx(userId); // 用户下线 RedisTemplate redisTemplate = SpringContextHolder.getBean("redisTemplate"); String key = RedisKey.IM_USER_SERVER_ID + userId; @@ -79,6 +85,9 @@ public class WebSocketHandler extends SimpleChannelInboundHandler { IdleState state = ((IdleStateEvent) evt).state(); if (state == IdleState.READER_IDLE) { // 在规定时间内没有收到客户端的上行数据, 主动断开连接 + AttributeKey attr = AttributeKey.valueOf("USER_ID"); + Long userId = ctx.channel().attr(attr).get(); + log.info("心跳超时,即将断开连接,用户id:{} ",userId); ctx.channel().close(); } } else { diff --git a/im-server/src/main/java/com/bx/imserver/websocket/WebsocketChannelCtxHloder.java b/im-server/src/main/java/com/bx/imserver/websocket/WebsocketChannelCtxHolder.java similarity index 84% rename from im-server/src/main/java/com/bx/imserver/websocket/WebsocketChannelCtxHloder.java rename to im-server/src/main/java/com/bx/imserver/websocket/WebsocketChannelCtxHolder.java index 4ba41ab..2a87103 100644 --- a/im-server/src/main/java/com/bx/imserver/websocket/WebsocketChannelCtxHloder.java +++ b/im-server/src/main/java/com/bx/imserver/websocket/WebsocketChannelCtxHolder.java @@ -5,10 +5,13 @@ import io.netty.channel.ChannelHandlerContext; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -public class WebsocketChannelCtxHloder { - private static Map channelMap = new ConcurrentHashMap(); +public class WebsocketChannelCtxHolder { + /* + * 维护userId和ctx的关联关系,格式:Map + */ + private static Map channelMap = new ConcurrentHashMap(); public static void addChannelCtx(Long userId,ChannelHandlerContext ctx){ channelMap.put(userId,ctx); @@ -18,9 +21,6 @@ public class WebsocketChannelCtxHloder { channelMap.remove(userId); } - - - public static ChannelHandlerContext getChannelCtx(Long userId){ return channelMap.get(userId); } diff --git a/im-server/src/main/java/com/bx/imserver/websocket/WebsocketServer.java b/im-server/src/main/java/com/bx/imserver/websocket/WebsocketServer.java index 0b0d34f..831d1eb 100644 --- a/im-server/src/main/java/com/bx/imserver/websocket/WebsocketServer.java +++ b/im-server/src/main/java/com/bx/imserver/websocket/WebsocketServer.java @@ -12,6 +12,7 @@ import io.netty.handler.codec.http.HttpServerCodec; import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; import io.netty.handler.stream.ChunkedWriteHandler; import io.netty.handler.timeout.IdleStateHandler; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; @@ -19,6 +20,7 @@ import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.util.concurrent.TimeUnit; +@Slf4j @Component public class WebsocketServer { @@ -62,7 +64,6 @@ public class WebsocketServer { protected void initChannel(Channel ch) throws Exception { // 获取职责链 ChannelPipeline pipeline = ch.pipeline(); - // pipeline.addLast(new IdleStateHandler(15, 0, 0, TimeUnit.SECONDS)); pipeline.addLast("http-codec", new HttpServerCodec()); pipeline.addLast("aggregator", new HttpObjectAggregator(65535)); @@ -79,12 +80,13 @@ public class WebsocketServer { .option(ChannelOption.SO_BACKLOG, 5) // 表示连接保活,相当于心跳机制,默认为7200s .childOption(ChannelOption.SO_KEEPALIVE, true); - // 就绪标志 - this.ready = true; + try { // 绑定端口,启动select线程,轮询监听channel事件,监听到事件之后就会交给从线程池处理 Channel channel = bootstrap.bind(port).sync().channel(); - + // 就绪标志 + this.ready = true; + log.info("websocket server 初始化完成...."); // 等待服务端口关闭 channel.closeFuture().sync(); } catch (InterruptedException e) { diff --git a/im-server/src/main/java/com/bx/imserver/websocket/processor/GroupMessageProcessor.java b/im-server/src/main/java/com/bx/imserver/websocket/processor/GroupMessageProcessor.java index ad3c79f..d7f8359 100644 --- a/im-server/src/main/java/com/bx/imserver/websocket/processor/GroupMessageProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/websocket/processor/GroupMessageProcessor.java @@ -4,7 +4,7 @@ import com.bx.common.contant.RedisKey; import com.bx.common.enums.WSCmdEnum; import com.bx.common.model.im.GroupMessageInfo; import com.bx.common.model.im.SendInfo; -import com.bx.imserver.websocket.WebsocketChannelCtxHloder; +import com.bx.imserver.websocket.WebsocketChannelCtxHolder; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -23,13 +23,13 @@ public class GroupMessageProcessor extends MessageProcessor { @Async @Override - public void process(ChannelHandlerContext ctx, GroupMessageInfo data) { + public void process(GroupMessageInfo data) { log.info("接收到群消息,发送者:{},群id:{},接收id:{},内容:{}",data.getSendId(),data.getGroupId(),data.getRecvIds(),data.getContent()); List recvIds = data.getRecvIds(); // 接收者id列表不需要传输,节省带宽 data.setRecvIds(null); for(Long recvId:recvIds){ - ChannelHandlerContext channelCtx = WebsocketChannelCtxHloder.getChannelCtx(recvId); + ChannelHandlerContext channelCtx = WebsocketChannelCtxHolder.getChannelCtx(recvId); if(channelCtx != null){ // 自己发的消息不用推送 if(recvId != data.getSendId()){ diff --git a/im-server/src/main/java/com/bx/imserver/websocket/processor/LoginProcessor.java b/im-server/src/main/java/com/bx/imserver/websocket/processor/LoginProcessor.java index 1d71334..a5225f8 100644 --- a/im-server/src/main/java/com/bx/imserver/websocket/processor/LoginProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/websocket/processor/LoginProcessor.java @@ -5,7 +5,7 @@ import com.bx.common.contant.RedisKey; import com.bx.common.enums.WSCmdEnum; import com.bx.common.model.im.LoginInfo; import com.bx.common.model.im.SendInfo; -import com.bx.imserver.websocket.WebsocketChannelCtxHloder; +import com.bx.imserver.websocket.WebsocketChannelCtxHolder; import com.bx.imserver.websocket.WebsocketServer; import io.netty.channel.ChannelHandlerContext; import io.netty.util.AttributeKey; @@ -30,16 +30,15 @@ public class LoginProcessor extends MessageProcessor { @Override synchronized public void process(ChannelHandlerContext ctx, LoginInfo loginInfo) { log.info("用户登录,userId:{}",loginInfo.getUserId()); - ChannelHandlerContext context = WebsocketChannelCtxHloder.getChannelCtx(loginInfo.getUserId()); + ChannelHandlerContext context = WebsocketChannelCtxHolder.getChannelCtx(loginInfo.getUserId()); if(context != null){ // 不允许多地登录,强制下线 SendInfo sendInfo = new SendInfo(); sendInfo.setCmd(WSCmdEnum.FORCE_LOGUT.getCode()); context.channel().writeAndFlush(sendInfo); } - // 绑定用户和channel - WebsocketChannelCtxHloder.addChannelCtx(loginInfo.getUserId(),ctx); + WebsocketChannelCtxHolder.addChannelCtx(loginInfo.getUserId(),ctx); // 设置属性 AttributeKey attr = AttributeKey.valueOf("USER_ID"); ctx.channel().attr(attr).set(loginInfo.getUserId()); diff --git a/im-server/src/main/java/com/bx/imserver/websocket/processor/PrivateMessageProcessor.java b/im-server/src/main/java/com/bx/imserver/websocket/processor/PrivateMessageProcessor.java index 03efa5f..427ae29 100644 --- a/im-server/src/main/java/com/bx/imserver/websocket/processor/PrivateMessageProcessor.java +++ b/im-server/src/main/java/com/bx/imserver/websocket/processor/PrivateMessageProcessor.java @@ -4,7 +4,7 @@ import com.bx.common.contant.RedisKey; import com.bx.common.enums.WSCmdEnum; import com.bx.common.model.im.SendInfo; import com.bx.common.model.im.PrivateMessageInfo; -import com.bx.imserver.websocket.WebsocketChannelCtxHloder; +import com.bx.imserver.websocket.WebsocketChannelCtxHolder; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -19,10 +19,10 @@ public class PrivateMessageProcessor extends MessageProcessor redisTemplate; @Override - public void process(ChannelHandlerContext ctx, PrivateMessageInfo data) { + public void process(PrivateMessageInfo data) { log.info("接收到消息,发送者:{},接收者:{},内容:{}",data.getSendId(),data.getRecvId(),data.getContent()); // 一个用户可以同时登陆,所以有多个channel - ChannelHandlerContext channelCtx = WebsocketChannelCtxHloder.getChannelCtx(data.getRecvId()); + ChannelHandlerContext channelCtx = WebsocketChannelCtxHolder.getChannelCtx(data.getRecvId()); if(channelCtx != null ){ // 推送消息到用户 SendInfo sendInfo = new SendInfo();