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();