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