Browse Source

框架版本升级至: springboot3.3、jdk17

master
xsx 2 years ago
parent
commit
ebb2f116c5
  1. 7
      im-commom/pom.xml
  2. 1
      im-commom/src/main/java/com/bx/imcommon/mq/RedisMQConfig.java
  3. 8
      im-commom/src/main/java/com/bx/imcommon/mq/RedisMQPullTask.java
  4. 1
      im-commom/src/main/java/com/bx/imcommon/mq/RedisMQTemplate.java
  5. 3
      im-commom/src/main/java/com/bx/imcommon/util/ThreadPoolExecutorFactory.java
  6. 67
      im-platform/pom.xml
  7. 3
      im-platform/src/main/java/com/bx/implatform/IMPlatformApp.java
  8. 1
      im-platform/src/main/java/com/bx/implatform/annotation/OnlineCheck.java
  9. 7
      im-platform/src/main/java/com/bx/implatform/aspect/OnlineCheckAspect.java
  10. 2
      im-platform/src/main/java/com/bx/implatform/aspect/RedisLockAspect.java
  11. 54
      im-platform/src/main/java/com/bx/implatform/config/RedisConfig.java
  12. 9
      im-platform/src/main/java/com/bx/implatform/config/RedissonConfig.java
  13. 51
      im-platform/src/main/java/com/bx/implatform/config/SwaggerConfig.java
  14. 15
      im-platform/src/main/java/com/bx/implatform/controller/FileController.java
  15. 26
      im-platform/src/main/java/com/bx/implatform/controller/FriendController.java
  16. 39
      im-platform/src/main/java/com/bx/implatform/controller/GroupController.java
  17. 33
      im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java
  18. 19
      im-platform/src/main/java/com/bx/implatform/controller/LoginController.java
  19. 38
      im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java
  20. 13
      im-platform/src/main/java/com/bx/implatform/controller/SystemController.java
  21. 24
      im-platform/src/main/java/com/bx/implatform/controller/UserController.java
  22. 54
      im-platform/src/main/java/com/bx/implatform/controller/WebrtcGroupController.java
  23. 44
      im-platform/src/main/java/com/bx/implatform/controller/WebrtcPrivateController.java
  24. 10
      im-platform/src/main/java/com/bx/implatform/dto/GroupBanDTO.java
  25. 21
      im-platform/src/main/java/com/bx/implatform/dto/GroupMessageDTO.java
  26. 7
      im-platform/src/main/java/com/bx/implatform/dto/GroupUnbanDTO.java
  27. 20
      im-platform/src/main/java/com/bx/implatform/dto/LoginDTO.java
  28. 12
      im-platform/src/main/java/com/bx/implatform/dto/ModifyPwdDTO.java
  29. 16
      im-platform/src/main/java/com/bx/implatform/dto/PrivateMessageDTO.java
  30. 14
      im-platform/src/main/java/com/bx/implatform/dto/RegisterDTO.java
  31. 9
      im-platform/src/main/java/com/bx/implatform/dto/UserBanDTO.java
  32. 16
      im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupAnswerDTO.java
  33. 17
      im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupCandidateDTO.java
  34. 15
      im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupDeviceDTO.java
  35. 12
      im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupFailedDTO.java
  36. 13
      im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupInviteDTO.java
  37. 11
      im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupJoinDTO.java
  38. 16
      im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupOfferDTO.java
  39. 13
      im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupSetupDTO.java
  40. 22
      im-platform/src/main/java/com/bx/implatform/entity/Friend.java
  41. 41
      im-platform/src/main/java/com/bx/implatform/entity/Group.java
  42. 35
      im-platform/src/main/java/com/bx/implatform/entity/GroupMember.java
  43. 30
      im-platform/src/main/java/com/bx/implatform/entity/GroupMessage.java
  44. 25
      im-platform/src/main/java/com/bx/implatform/entity/PrivateMessage.java
  45. 64
      im-platform/src/main/java/com/bx/implatform/entity/User.java
  46. 6
      im-platform/src/main/java/com/bx/implatform/filter/CacheFilter.java
  47. 8
      im-platform/src/main/java/com/bx/implatform/filter/CacheHttpServletRequestWrapper.java
  48. 192
      im-platform/src/main/java/com/bx/implatform/generator/CodeGenerator.java
  49. 5
      im-platform/src/main/java/com/bx/implatform/interceptor/AuthInterceptor.java
  50. 4
      im-platform/src/main/java/com/bx/implatform/interceptor/XssInterceptor.java
  51. 2
      im-platform/src/main/java/com/bx/implatform/listener/GroupMessageListener.java
  52. 10
      im-platform/src/main/java/com/bx/implatform/listener/SystemMessageListener.java
  53. 1
      im-platform/src/main/java/com/bx/implatform/service/IWebrtcGroupService.java
  54. 4
      im-platform/src/main/java/com/bx/implatform/service/IWebrtcPrivateService.java
  55. 7
      im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java
  56. 2
      im-platform/src/main/java/com/bx/implatform/service/thirdparty/FileService.java
  57. 3
      im-platform/src/main/java/com/bx/implatform/session/SessionContext.java
  58. 15
      im-platform/src/main/java/com/bx/implatform/session/WebrtcUserInfo.java
  59. 1
      im-platform/src/main/java/com/bx/implatform/task/UserBannedConsumerTask.java
  60. 2
      im-platform/src/main/java/com/bx/implatform/util/SensitiveFilterUtil.java
  61. 14
      im-platform/src/main/java/com/bx/implatform/vo/FriendVO.java
  62. 13
      im-platform/src/main/java/com/bx/implatform/vo/GroupInviteVO.java
  63. 17
      im-platform/src/main/java/com/bx/implatform/vo/GroupMemberVO.java
  64. 27
      im-platform/src/main/java/com/bx/implatform/vo/GroupMessageVO.java
  65. 29
      im-platform/src/main/java/com/bx/implatform/vo/GroupVO.java
  66. 13
      im-platform/src/main/java/com/bx/implatform/vo/LoginVO.java
  67. 6
      im-platform/src/main/java/com/bx/implatform/vo/OnlineTerminalVO.java
  68. 19
      im-platform/src/main/java/com/bx/implatform/vo/PrivateMessageVO.java
  69. 7
      im-platform/src/main/java/com/bx/implatform/vo/SystemConfigVO.java
  70. 13
      im-platform/src/main/java/com/bx/implatform/vo/SystemMessageVO.java
  71. 9
      im-platform/src/main/java/com/bx/implatform/vo/UploadImageVO.java
  72. 28
      im-platform/src/main/java/com/bx/implatform/vo/UserVO.java
  73. 9
      im-platform/src/main/java/com/bx/implatform/vo/WebrtcGroupFailedVO.java
  74. 11
      im-platform/src/main/java/com/bx/implatform/vo/WebrtcGroupInfoVO.java
  75. 11
      im-platform/src/main/resources/application.yml
  76. 6
      im-server/pom.xml
  77. 33
      im-server/src/main/java/com/bx/imserver/config/RedisConfig.java
  78. 6
      im-server/src/main/java/com/bx/imserver/netty/IMServerGroup.java
  79. 53
      pom.xml

7
im-commom/pom.xml

@ -39,15 +39,9 @@
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>${velocity.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>2.9.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
@ -63,7 +57,6 @@
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<!-- 引入redis -->
<dependency>

1
im-commom/src/main/java/com/bx/imcommon/mq/RedisMQConfig.java

@ -4,7 +4,6 @@ import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
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.StringRedisSerializer;

8
im-commom/src/main/java/com/bx/imcommon/mq/RedisMQPullTask.java

@ -2,14 +2,18 @@ package com.bx.imcommon.mq;
import com.alibaba.fastjson.JSONObject;
import com.bx.imcommon.util.ThreadPoolExecutorFactory;
import jakarta.annotation.PreDestroy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import javax.annotation.PreDestroy;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

1
im-commom/src/main/java/com/bx/imcommon/mq/RedisMQTemplate.java

@ -1,6 +1,5 @@
package com.bx.imcommon.mq;
import cn.hutool.core.util.StrUtil;
import org.apache.logging.log4j.util.Strings;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;

3
im-commom/src/main/java/com/bx/imcommon/util/ThreadPoolExecutorFactory.java

@ -2,7 +2,8 @@ package com.bx.imcommon.util;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.*;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 创建单例线程池

67
im-platform/pom.xml

@ -18,10 +18,6 @@
<artifactId>im-client</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
@ -29,29 +25,30 @@
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
@ -62,8 +59,9 @@
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
<version>6.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
@ -77,27 +75,7 @@
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.3</version>
<exclusions>
<exclusion>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</exclusion>
<exclusion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.3.70</version>
<version>${minio.version}</version>
</dependency>
<!--thumbnailator图片处理-->
<dependency>
@ -112,8 +90,13 @@
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.17.3</version>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>${redisson.version}</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
</dependencies>
@ -123,7 +106,7 @@
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.3.RELEASE</version>
<version>3.3.1</version>
<executions>
<execution>
<goals>

3
im-platform/src/main/java/com/bx/implatform/IMPlatformApp.java

@ -4,7 +4,6 @@ import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@ -14,7 +13,7 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy;
@EnableAspectJAutoProxy(exposeProxy = true)
@ComponentScan(basePackages = {"com.bx"})
@MapperScan(basePackages = {"com.bx.implatform.mapper"})
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})// 禁用secrity
@SpringBootApplication
public class IMPlatformApp {
public static void main(String[] args) {

1
im-platform/src/main/java/com/bx/implatform/annotation/OnlineCheck.java

@ -4,7 +4,6 @@ import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;
/**
* 在线校验标注此注解的接口用户必须保持长连接否则将抛异常

7
im-platform/src/main/java/com/bx/implatform/aspect/OnlineCheckAspect.java

@ -1,8 +1,6 @@
package com.bx.implatform.aspect;
import cn.hutool.core.util.StrUtil;
import com.bx.imclient.IMClient;
import com.bx.implatform.annotation.RedisLock;
import com.bx.implatform.exception.GlobalException;
import com.bx.implatform.session.SessionContext;
import com.bx.implatform.session.UserSession;
@ -11,13 +9,8 @@ import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.redisson.api.RLock;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* @author: blue
* @date: 2024-06-16

2
im-platform/src/main/java/com/bx/implatform/aspect/RedisLockAspect.java

@ -8,8 +8,6 @@ import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.redisson.Redisson;
import org.redisson.RedissonLock;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.core.DefaultParameterNameDiscoverer;

54
im-platform/src/main/java/com/bx/implatform/config/RedisConfig.java

@ -1,18 +1,17 @@
package com.bx.implatform.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import jakarta.annotation.Resource;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.CacheErrorHandler;
import org.springframework.cache.interceptor.CacheResolver;
import org.springframework.cache.interceptor.SimpleCacheErrorHandler;
import org.springframework.cache.interceptor.SimpleCacheResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@ -24,9 +23,7 @@ import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import javax.annotation.Resource;
import java.time.Duration;
import java.util.Objects;
@EnableCaching
@Configuration
@ -40,7 +37,6 @@ public class RedisConfig extends CachingConfigurerSupport {
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置值(value)的序列化采用jackson2JsonRedisSerializer
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer());
@ -51,42 +47,28 @@ public class RedisConfig extends CachingConfigurerSupport {
return redisTemplate;
}
@Bean
public CacheManager cacheManager() {
// 设置redis缓存管理器
RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(600))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer()));
return RedisCacheManager.builder(factory).cacheDefaults(cacheConfiguration).build();
}
@Bean
public Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 解决jackson2无法反序列化LocalDateTime的问题
om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
om.registerModule(new JavaTimeModule());
om.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 忽略空值
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(om);
return jackson2JsonRedisSerializer;
}
@Bean
@Override
public CacheResolver cacheResolver() {
return new SimpleCacheResolver(Objects.requireNonNull(cacheManager()));
}
@Bean
@Override
public CacheErrorHandler errorHandler() {
// 用于捕获从Cache中进行CRUD时的异常的回调处理器。
return new SimpleCacheErrorHandler();
}
@Bean
@Override
public CacheManager cacheManager() {
// 设置redis缓存管理器
RedisCacheConfiguration cacheConfiguration =
RedisCacheConfiguration.defaultCacheConfig()
.disableCachingNullValues()
.entryTtl(Duration.ofMinutes(10))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer()));
return RedisCacheManager.builder(factory).cacheDefaults(cacheConfiguration).build();
//忽略无效字段
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return new Jackson2JsonRedisSerializer<>(om, Object.class);
}
}

9
im-platform/src/main/java/com/bx/implatform/config/RedissonConfig.java

@ -6,11 +6,8 @@ import org.redisson.api.RedissonClient;
import org.redisson.client.codec.StringCodec;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author: Blue
@ -18,9 +15,9 @@ import org.springframework.context.annotation.Configuration;
* @version: 1.0
*/
@Configuration
@ConditionalOnClass(Config.class)
@EnableConfigurationProperties(RedisProperties.class)
//@Configuration
//@ConditionalOnClass(Config.class)
//@EnableConfigurationProperties(RedisProperties.class)
public class RedissonConfig {
@Bean

51
im-platform/src/main/java/com/bx/implatform/config/SwaggerConfig.java

@ -1,41 +1,38 @@
package com.bx.implatform.config;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//这里采用包含注解的方式来确定要显示的接口
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//这里采用包扫描的方式来确定要显示的接口
.paths(PathSelectors.any())
.build();
public GroupedOpenApi userApi() {
String[] paths = {"/**"};
String[] packagedToMatch = {"com.bx"};
return GroupedOpenApi.builder().group("BoxIM")
.pathsToMatch(paths)
.packagesToScan(packagedToMatch).build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("IM Platform doc")
.description("盒子IM API文档")
.termsOfServiceUrl("http://8.134.92.70/")
.version("1.0")
.build();
@Bean
public OpenAPI customOpenAPI() {
Contact contact = new Contact();
contact.setName("Blue");
return new OpenAPI().info(new Info()
.title("Box-IM")
.description("盒子IM")
.contact(contact)
.version("3.0")
.termsOfService("https://www.boxim.online")
.license(new License().name("MIT")
.url("https://www.boxim.online")));
}
}

15
im-platform/src/main/java/com/bx/implatform/controller/FileController.java

@ -4,33 +4,34 @@ import com.bx.implatform.result.Result;
import com.bx.implatform.result.ResultUtils;
import com.bx.implatform.service.thirdparty.FileService;
import com.bx.implatform.vo.UploadImageVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@Slf4j
@RestController
@Api(tags = "文件上传")
@Tag(name = "文件上传")
@RequiredArgsConstructor
public class FileController {
private final FileService fileService;
@ApiOperation(value = "上传图片", notes = "上传图片,上传后返回原图和缩略图的url")
@Operation(summary = "上传图片", description = "上传图片,上传后返回原图和缩略图的url")
@PostMapping("/image/upload")
public Result<UploadImageVO> uploadImage(MultipartFile file) {
public Result<UploadImageVO> uploadImage(@RequestParam("file") MultipartFile file) {
return ResultUtils.success(fileService.uploadImage(file));
}
@CrossOrigin
@ApiOperation(value = "上传文件", notes = "上传文件,上传后返回文件url")
@Operation(summary = "上传文件", description = "上传文件,上传后返回文件url")
@PostMapping("/file/upload")
public Result<String> uploadFile(MultipartFile file) {
public Result<String> uploadFile(@RequestParam("file") MultipartFile file) {
return ResultUtils.success(fileService.uploadFile(file), "");
}

26
im-platform/src/main/java/com/bx/implatform/controller/FriendController.java

@ -6,17 +6,17 @@ import com.bx.implatform.result.ResultUtils;
import com.bx.implatform.service.IFriendService;
import com.bx.implatform.session.SessionContext;
import com.bx.implatform.vo.FriendVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import java.util.List;
import java.util.stream.Collectors;
@Api(tags = "好友")
@Tag(name = "好友")
@RestController
@RequestMapping("/friend")
@RequiredArgsConstructor
@ -25,7 +25,7 @@ public class FriendController {
private final IFriendService friendService;
@GetMapping("/list")
@ApiOperation(value = "好友列表", notes = "获取好友列表")
@Operation(summary = "好友列表", description = "获取好友列表")
public Result<List<FriendVO>> findFriends() {
List<Friend> friends = friendService.findFriendByUserId(SessionContext.getSession().getUserId());
List<FriendVO> vos = friends.stream().map(f -> {
@ -40,28 +40,28 @@ public class FriendController {
@PostMapping("/add")
@ApiOperation(value = "添加好友", notes = "双方建立好友关系")
public Result addFriend(@NotEmpty(message = "好友id不可为空") @RequestParam("friendId") Long friendId) {
@Operation(summary = "添加好友", description = "双方建立好友关系")
public Result addFriend(@NotNull(message = "好友id不可为空") @RequestParam("friendId") Long friendId) {
friendService.addFriend(friendId);
return ResultUtils.success();
}
@GetMapping("/find/{friendId}")
@ApiOperation(value = "查找好友信息", notes = "查找好友信息")
public Result<FriendVO> findFriend(@NotEmpty(message = "好友id不可为空") @PathVariable("friendId") Long friendId) {
@Operation(summary = "查找好友信息", description = "查找好友信息")
public Result<FriendVO> findFriend(@NotNull(message = "好友id不可为空") @PathVariable("friendId") Long friendId) {
return ResultUtils.success(friendService.findFriend(friendId));
}
@DeleteMapping("/delete/{friendId}")
@ApiOperation(value = "删除好友", notes = "解除好友关系")
public Result delFriend(@NotEmpty(message = "好友id不可为空") @PathVariable("friendId") Long friendId) {
@Operation(summary = "删除好友", description = "解除好友关系")
public Result delFriend(@NotNull(message = "好友id不可为空") @PathVariable("friendId") Long friendId) {
friendService.delFriend(friendId);
return ResultUtils.success();
}
@PutMapping("/update")
@ApiOperation(value = "更新好友信息", notes = "更新好友头像或昵称")
@Operation(summary = "更新好友信息", description = "更新好友头像或昵称")
public Result modifyFriend(@Valid @RequestBody FriendVO vo) {
friendService.update(vo);
return ResultUtils.success();

39
im-platform/src/main/java/com/bx/implatform/controller/GroupController.java

@ -6,16 +6,16 @@ import com.bx.implatform.service.IGroupService;
import com.bx.implatform.vo.GroupInviteVO;
import com.bx.implatform.vo.GroupMemberVO;
import com.bx.implatform.vo.GroupVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
@Api(tags = "群聊")
@Tag(name = "群聊")
@RestController
@RequestMapping("/group")
@RequiredArgsConstructor
@ -23,60 +23,61 @@ public class GroupController {
private final IGroupService groupService;
@ApiOperation(value = "创建群聊", notes = "创建群聊")
@Operation(summary = "创建群聊", description = "创建群聊")
@PostMapping("/create")
public Result<GroupVO> createGroup(@Valid @RequestBody GroupVO vo) {
return ResultUtils.success(groupService.createGroup(vo));
}
@ApiOperation(value = "修改群聊信息", notes = "修改群聊信息")
@Operation(summary = "修改群聊信息", description = "修改群聊信息")
@PutMapping("/modify")
public Result<GroupVO> modifyGroup(@Valid @RequestBody GroupVO vo) {
return ResultUtils.success(groupService.modifyGroup(vo));
}
@ApiOperation(value = "解散群聊", notes = "解散群聊")
@Operation(summary = "解散群聊", description = "解散群聊")
@DeleteMapping("/delete/{groupId}")
public Result deleteGroup(@NotNull(message = "群聊id不能为空") @PathVariable Long groupId) {
public Result deleteGroup(@NotNull(message = "群聊id不能为空") @PathVariable("groupId") Long groupId) {
groupService.deleteGroup(groupId);
return ResultUtils.success();
}
@ApiOperation(value = "查询群聊", notes = "查询单个群聊信息")
@Operation(summary = "查询群聊", description = "查询单个群聊信息")
@GetMapping("/find/{groupId}")
public Result<GroupVO> findGroup(@NotNull(message = "群聊id不能为空") @PathVariable Long groupId) {
public Result<GroupVO> findGroup(@NotNull(message = "群聊id不能为空") @PathVariable("groupId") Long groupId) {
return ResultUtils.success(groupService.findById(groupId));
}
@ApiOperation(value = "查询群聊列表", notes = "查询群聊列表")
@Operation(summary = "查询群聊列表", description = "查询群聊列表")
@GetMapping("/list")
public Result<List<GroupVO>> findGroups() {
return ResultUtils.success(groupService.findGroups());
}
@ApiOperation(value = "邀请进群", notes = "邀请好友进群")
@Operation(summary = "邀请进群", description = "邀请好友进群")
@PostMapping("/invite")
public Result invite(@Valid @RequestBody GroupInviteVO vo) {
groupService.invite(vo);
return ResultUtils.success();
}
@ApiOperation(value = "查询群聊成员", notes = "查询群聊成员")
@Operation(summary = "查询群聊成员", description = "查询群聊成员")
@GetMapping("/members/{groupId}")
public Result<List<GroupMemberVO>> findGroupMembers(@NotNull(message = "群聊id不能为空") @PathVariable Long groupId) {
public Result<List<GroupMemberVO>> findGroupMembers(
@NotNull(message = "群聊id不能为空") @PathVariable("groupId") Long groupId) {
return ResultUtils.success(groupService.findGroupMembers(groupId));
}
@ApiOperation(value = "退出群聊", notes = "退出群聊")
@Operation(summary = "退出群聊", description = "退出群聊")
@DeleteMapping("/quit/{groupId}")
public Result quitGroup(@NotNull(message = "群聊id不能为空") @PathVariable Long groupId) {
public Result quitGroup(@NotNull(message = "群聊id不能为空") @PathVariable("groupId") Long groupId) {
groupService.quitGroup(groupId);
return ResultUtils.success();
}
@ApiOperation(value = "踢出群聊", notes = "将用户踢出群聊")
@Operation(summary = "踢出群聊", description = "将用户踢出群聊")
@DeleteMapping("/kick/{groupId}")
public Result kickGroup(@NotNull(message = "群聊id不能为空") @PathVariable Long groupId,
public Result kickGroup(@NotNull(message = "群聊id不能为空") @PathVariable("groupId") Long groupId,
@NotNull(message = "用户id不能为空") @RequestParam Long userId) {
groupService.kickGroup(groupId, userId);
return ResultUtils.success();

33
im-platform/src/main/java/com/bx/implatform/controller/GroupMessageController.java

@ -5,16 +5,16 @@ import com.bx.implatform.result.Result;
import com.bx.implatform.result.ResultUtils;
import com.bx.implatform.service.IGroupMessageService;
import com.bx.implatform.vo.GroupMessageVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
@Api(tags = "群聊消息")
@Tag(name = "群聊消息")
@RestController
@RequestMapping("/message/group")
@RequiredArgsConstructor
@ -23,40 +23,41 @@ public class GroupMessageController {
private final IGroupMessageService groupMessageService;
@PostMapping("/send")
@ApiOperation(value = "发送群聊消息", notes = "发送群聊消息")
@Operation(summary = "发送群聊消息", description = "发送群聊消息")
public Result<Long> sendMessage(@Valid @RequestBody GroupMessageDTO vo) {
return ResultUtils.success(groupMessageService.sendMessage(vo));
}
@DeleteMapping("/recall/{id}")
@ApiOperation(value = "撤回消息", notes = "撤回群聊消息")
public Result<Long> recallMessage(@NotNull(message = "消息id不能为空") @PathVariable Long id) {
@Operation(summary = "撤回消息", description = "撤回群聊消息")
public Result<Long> recallMessage(@NotNull(message = "消息id不能为空") @PathVariable("id") Long id) {
groupMessageService.recallMessage(id);
return ResultUtils.success();
}
@GetMapping("/pullOfflineMessage")
@ApiOperation(value = "拉取离线消息", notes = "拉取离线消息,消息将通过webscoket异步推送")
public Result pullOfflineMessage(@RequestParam Long minId) {
@Operation(summary = "拉取离线消息", description = "拉取离线消息,消息将通过webscoket异步推送")
public Result pullOfflineMessage(@RequestParam("minId") Long minId) {
groupMessageService.pullOfflineMessage(minId);
return ResultUtils.success();
}
@PutMapping("/readed")
@ApiOperation(value = "消息已读", notes = "将群聊中的消息状态置为已读")
public Result readedMessage(@RequestParam Long groupId) {
@Operation(summary = "消息已读", description = "将群聊中的消息状态置为已读")
public Result readedMessage(@RequestParam("groupId") Long groupId) {
groupMessageService.readedMessage(groupId);
return ResultUtils.success();
}
@GetMapping("/findReadedUsers")
@ApiOperation(value = "获取已读用户id", notes = "获取消息已读用户列表")
public Result<List<Long>> findReadedUsers(@RequestParam Long groupId,@RequestParam Long messageId) {
return ResultUtils.success(groupMessageService.findReadedUsers(groupId,messageId));
@Operation(summary = "获取已读用户id", description = "获取消息已读用户列表")
public Result<List<Long>> findReadedUsers(@RequestParam("groupId") Long groupId,
@RequestParam("messageId") Long messageId) {
return ResultUtils.success(groupMessageService.findReadedUsers(groupId, messageId));
}
@GetMapping("/history")
@ApiOperation(value = "查询聊天记录", notes = "查询聊天记录")
@Operation(summary = "查询聊天记录", description = "查询聊天记录")
public Result<List<GroupMessageVO>> recallMessage(@NotNull(message = "群聊id不能为空") @RequestParam Long groupId,
@NotNull(message = "页码不能为空") @RequestParam Long page,
@NotNull(message = "size不能为空") @RequestParam Long size) {

19
im-platform/src/main/java/com/bx/implatform/controller/LoginController.java

@ -7,14 +7,13 @@ import com.bx.implatform.result.Result;
import com.bx.implatform.result.ResultUtils;
import com.bx.implatform.service.IUserService;
import com.bx.implatform.vo.LoginVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@Api(tags = "用户登录和注册")
@Tag(name = "用户登录和注册")
@RestController
@RequiredArgsConstructor
public class LoginController {
@ -22,30 +21,28 @@ public class LoginController {
private final IUserService userService;
@PostMapping("/login")
@ApiOperation(value = "用户登陆", notes = "用户登陆")
@Operation(summary = "用户登陆", description = "用户登陆")
public Result login(@Valid @RequestBody LoginDTO dto) {
LoginVO vo = userService.login(dto);
return ResultUtils.success(vo);
}
@PutMapping("/refreshToken")
@ApiOperation(value = "刷新token", notes = "用refreshtoken换取新的token")
@Operation(summary = "刷新token", description = "用refreshtoken换取新的token")
public Result refreshToken(@RequestHeader("refreshToken") String refreshToken) {
LoginVO vo = userService.refreshToken(refreshToken);
return ResultUtils.success(vo);
}
@PostMapping("/register")
@ApiOperation(value = "用户注册", notes = "用户注册")
@Operation(summary = "用户注册", description = "用户注册")
public Result register(@Valid @RequestBody RegisterDTO dto) {
userService.register(dto);
return ResultUtils.success();
}
@PutMapping("/modifyPwd")
@ApiOperation(value = "修改密码", notes = "修改用户密码")
@Operation(summary = "修改密码", description = "修改用户密码")
public Result modifyPassword(@Valid @RequestBody ModifyPwdDTO dto) {
userService.modifyPassword(dto);
return ResultUtils.success();

38
im-platform/src/main/java/com/bx/implatform/controller/PrivateMessageController.java

@ -5,16 +5,16 @@ import com.bx.implatform.result.Result;
import com.bx.implatform.result.ResultUtils;
import com.bx.implatform.service.IPrivateMessageService;
import com.bx.implatform.vo.PrivateMessageVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
@Api(tags = "私聊消息")
@Tag(name = "私聊消息")
@RestController
@RequestMapping("/message/private")
@RequiredArgsConstructor
@ -23,44 +23,44 @@ public class PrivateMessageController {
private final IPrivateMessageService privateMessageService;
@PostMapping("/send")
@ApiOperation(value = "发送消息", notes = "发送私聊消息")
@Operation(summary = "发送消息", description = "发送私聊消息")
public Result<Long> sendMessage(@Valid @RequestBody PrivateMessageDTO vo) {
return ResultUtils.success(privateMessageService.sendMessage(vo));
}
@DeleteMapping("/recall/{id}")
@ApiOperation(value = "撤回消息", notes = "撤回私聊消息")
public Result<Long> recallMessage(@NotNull(message = "消息id不能为空") @PathVariable Long id) {
@Operation(summary = "撤回消息", description = "撤回私聊消息")
public Result<Long> recallMessage(@NotNull(message = "消息id不能为空") @PathVariable("id") Long id) {
privateMessageService.recallMessage(id);
return ResultUtils.success();
}
@GetMapping("/pullOfflineMessage")
@ApiOperation(value = "拉取离线消息", notes = "拉取离线消息,消息将通过webscoket异步推送")
public Result pullOfflineMessage(@RequestParam Long minId) {
@Operation(summary = "拉取离线消息", description = "拉取离线消息,消息将通过webscoket异步推送")
public Result pullOfflineMessage(@RequestParam("minId") Long minId) {
privateMessageService.pullOfflineMessage(minId);
return ResultUtils.success();
}
@PutMapping("/readed")
@ApiOperation(value = "消息已读", notes = "将会话中接收的消息状态置为已读")
public Result readedMessage(@RequestParam Long friendId) {
@Operation(summary = "消息已读", description = "将会话中接收的消息状态置为已读")
public Result readedMessage(@RequestParam("friendId") Long friendId) {
privateMessageService.readedMessage(friendId);
return ResultUtils.success();
}
@GetMapping("/maxReadedId")
@ApiOperation(value = "获取最大已读消息的id",notes="获取某个会话中已读消息的最大id")
public Result<Long> getMaxReadedId(@RequestParam Long friendId){
@Operation(summary = "获取最大已读消息的id", description = "获取某个会话中已读消息的最大id")
public Result<Long> getMaxReadedId(@RequestParam("friendId") Long friendId) {
return ResultUtils.success(privateMessageService.getMaxReadedId(friendId));
}
@GetMapping("/history")
@ApiOperation(value = "查询聊天记录", notes = "查询聊天记录")
public Result<List<PrivateMessageVO>> recallMessage(@NotNull(message = "好友id不能为空") @RequestParam Long friendId,
@NotNull(message = "页码不能为空") @RequestParam Long page,
@NotNull(message = "size不能为空") @RequestParam Long size) {
@Operation(summary = "查询聊天记录", description = "查询聊天记录")
public Result<List<PrivateMessageVO>> recallMessage(
@NotNull(message = "好友id不能为空") @RequestParam("friendId") Long friendId,
@NotNull(message = "页码不能为空") @RequestParam("page") Long page,
@NotNull(message = "size不能为空") @RequestParam("size") Long size) {
return ResultUtils.success(privateMessageService.findHistoryMessage(friendId, page, size));
}

13
im-platform/src/main/java/com/bx/implatform/controller/SystemController.java

@ -1,14 +1,15 @@
package com.bx.implatform.controller;
import com.bx.implatform.config.WebrtcConfig;
import com.bx.implatform.dto.PrivateMessageDTO;
import com.bx.implatform.result.Result;
import com.bx.implatform.result.ResultUtils;
import com.bx.implatform.vo.SystemConfigVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -17,7 +18,7 @@ import org.springframework.web.bind.annotation.*;
* @date: 2024-06-10
* @version: 1.0
*/
@Api(tags = "系统相关")
@Tag(name = "系统相关")
@RestController
@RequestMapping("/system")
@RequiredArgsConstructor
@ -26,7 +27,7 @@ public class SystemController {
private final WebrtcConfig webrtcConfig;
@GetMapping("/config")
@ApiOperation(value = "加载系统配置", notes = "加载系统配置")
@Operation(summary = "加载系统配置", description = "加载系统配置")
public Result<SystemConfigVO> loadConfig() {
return ResultUtils.success(new SystemConfigVO(webrtcConfig));
}

24
im-platform/src/main/java/com/bx/implatform/controller/UserController.java

@ -9,16 +9,16 @@ import com.bx.implatform.session.UserSession;
import com.bx.implatform.util.BeanUtils;
import com.bx.implatform.vo.OnlineTerminalVO;
import com.bx.implatform.vo.UserVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import java.util.List;
@Api(tags = "用户")
@Tag(name = "用户")
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
@ -27,14 +27,14 @@ public class UserController {
private final IUserService userService;
@GetMapping("/terminal/online")
@ApiOperation(value = "判断用户哪个终端在线", notes = "返回在线的用户id的终端集合")
public Result<List<OnlineTerminalVO>> getOnlineTerminal(@NotEmpty @RequestParam("userIds") String userIds) {
@Operation(summary = "判断用户哪个终端在线", description = "返回在线的用户id的终端集合")
public Result<List<OnlineTerminalVO>> getOnlineTerminal(@NotNull @RequestParam("userIds") String userIds) {
return ResultUtils.success(userService.getOnlineTerminals(userIds));
}
@GetMapping("/self")
@ApiOperation(value = "获取当前用户信息", notes = "获取当前用户信息")
@Operation(summary = "获取当前用户信息", description = "获取当前用户信息")
public Result<UserVO> findSelfInfo() {
UserSession session = SessionContext.getSession();
User user = userService.getById(session.getUserId());
@ -44,20 +44,20 @@ public class UserController {
@GetMapping("/find/{id}")
@ApiOperation(value = "查找用户", notes = "根据id查找用户")
public Result<UserVO> findById(@NotEmpty @PathVariable("id") Long id) {
@Operation(summary = "查找用户", description = "根据id查找用户")
public Result<UserVO> findById(@NotNull @PathVariable("id") Long id) {
return ResultUtils.success(userService.findUserById(id));
}
@PutMapping("/update")
@ApiOperation(value = "修改用户信息", notes = "修改用户信息,仅允许修改登录用户信息")
@Operation(summary = "修改用户信息", description = "修改用户信息,仅允许修改登录用户信息")
public Result update(@Valid @RequestBody UserVO vo) {
userService.update(vo);
return ResultUtils.success();
}
@GetMapping("/findByName")
@ApiOperation(value = "查找用户", notes = "根据用户名或昵称查找用户")
@Operation(summary = "查找用户", description = "根据用户名或昵称查找用户")
public Result<List<UserVO>> findByName(@RequestParam("name") String name) {
return ResultUtils.success(userService.findUserByName(name));
}

54
im-platform/src/main/java/com/bx/implatform/controller/WebrtcGroupController.java

@ -1,24 +1,22 @@
package com.bx.implatform.controller;
import com.bx.implatform.config.WebrtcConfig;
import com.bx.implatform.dto.*;
import com.bx.implatform.result.Result;
import com.bx.implatform.result.ResultUtils;
import com.bx.implatform.service.IWebrtcGroupService;
import com.bx.implatform.vo.WebrtcGroupInfoVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
* @author: Blue
* @date: 2024-06-01
* @version: 1.0
*/
@Api(tags = "webrtc视频多人通话")
@Tag(name = "webrtc视频多人通话")
@RestController
@RequestMapping("/webrtc/group")
@RequiredArgsConstructor
@ -26,101 +24,101 @@ public class WebrtcGroupController {
private final IWebrtcGroupService webrtcGroupService;
@ApiOperation(httpMethod = "POST", value = "发起群视频通话")
@Operation(summary = "发起群视频通话")
@PostMapping("/setup")
public Result setup(@Valid @RequestBody WebrtcGroupSetupDTO dto) {
webrtcGroupService.setup(dto);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "接受通话")
@Operation(summary = "接受通话")
@PostMapping("/accept")
public Result accept(@RequestParam Long groupId) {
public Result accept(@RequestParam("groupId") Long groupId) {
webrtcGroupService.accept(groupId);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "拒绝通话")
@Operation(summary = "拒绝通话")
@PostMapping("/reject")
public Result reject(@RequestParam Long groupId) {
public Result reject(@RequestParam("groupId") Long groupId) {
webrtcGroupService.reject(groupId);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "通话失败")
@Operation(summary = "通话失败")
@PostMapping("/failed")
public Result failed(@Valid @RequestBody WebrtcGroupFailedDTO dto) {
webrtcGroupService.failed(dto);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "进入视频通话")
@Operation(summary = "进入视频通话")
@PostMapping("/join")
public Result join(@RequestParam Long groupId) {
public Result join(@RequestParam("groupId") Long groupId) {
webrtcGroupService.join(groupId);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "取消通话")
@Operation(summary = "取消通话")
@PostMapping("/cancel")
public Result cancel(@RequestParam Long groupId) {
public Result cancel(@RequestParam("groupId") Long groupId) {
webrtcGroupService.cancel(groupId);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "离开视频通话")
@Operation(summary = "离开视频通话")
@PostMapping("/quit")
public Result quit(@RequestParam Long groupId) {
public Result quit(@RequestParam("groupId") Long groupId) {
webrtcGroupService.quit(groupId);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "推送offer信息")
@Operation(summary = "推送offer信息")
@PostMapping("/offer")
public Result offer(@Valid @RequestBody WebrtcGroupOfferDTO dto) {
webrtcGroupService.offer(dto);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "推送answer信息")
@Operation(summary = "推送answer信息")
@PostMapping("/answer")
public Result answer(@Valid @RequestBody WebrtcGroupAnswerDTO dto) {
webrtcGroupService.answer(dto);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "邀请用户进入视频通话")
@Operation(summary = "邀请用户进入视频通话")
@PostMapping("/invite")
public Result invite(@Valid @RequestBody WebrtcGroupInviteDTO dto) {
webrtcGroupService.invite(dto);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "同步candidate")
@Operation(summary = "同步candidate")
@PostMapping("/candidate")
public Result candidate(@Valid @RequestBody WebrtcGroupCandidateDTO dto) {
webrtcGroupService.candidate(dto);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "设备操作")
@Operation(summary = "设备操作")
@PostMapping("/device")
public Result device(@Valid @RequestBody WebrtcGroupDeviceDTO dto) {
webrtcGroupService.device(dto);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "GET", value = "获取通话信息")
@Operation(summary = "获取通话信息")
@GetMapping("/info")
public Result<WebrtcGroupInfoVO> info(@RequestParam Long groupId) {
public Result<WebrtcGroupInfoVO> info(@RequestParam("groupId") Long groupId) {
return ResultUtils.success(webrtcGroupService.info(groupId));
}
@ApiOperation(httpMethod = "POST", value = "获取通话信息")
@Operation(summary = "获取通话信息")
@PostMapping("/heartbeat")
public Result heartbeat(@RequestParam Long groupId) {
public Result heartbeat(@RequestParam("groupId") Long groupId) {
webrtcGroupService.heartbeat(groupId);
return ResultUtils.success();
}
}
}

44
im-platform/src/main/java/com/bx/implatform/controller/WebrtcPrivateController.java

@ -1,18 +1,15 @@
package com.bx.implatform.controller;
import com.bx.implatform.annotation.OnlineCheck;
import com.bx.implatform.config.ICEServer;
import com.bx.implatform.result.Result;
import com.bx.implatform.result.ResultUtils;
import com.bx.implatform.service.IWebrtcPrivateService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Api(tags = "webrtc视频单人通话")
@Tag(name = "webrtc视频单人通话")
@RestController
@RequestMapping("/webrtc/private")
@RequiredArgsConstructor
@ -21,60 +18,59 @@ public class WebrtcPrivateController {
private final IWebrtcPrivateService webrtcPrivateService;
@OnlineCheck
@ApiOperation(httpMethod = "POST", value = "呼叫视频通话")
@Operation(summary = "呼叫视频通话")
@PostMapping("/call")
public Result call(@RequestParam Long uid, @RequestParam(defaultValue = "video") String mode, @RequestBody String offer) {
public Result call(@RequestParam("uid") Long uid, @RequestParam(name = "mode", defaultValue = "video") String mode,
@RequestBody String offer) {
webrtcPrivateService.call(uid, mode, offer);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "接受视频通话")
@Operation(summary = "接受视频通话")
@PostMapping("/accept")
public Result accept(@RequestParam Long uid, @RequestBody String answer) {
public Result accept(@RequestParam("uid") Long uid, @RequestBody String answer) {
webrtcPrivateService.accept(uid, answer);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "拒绝视频通话")
@Operation(summary = "拒绝视频通话")
@PostMapping("/reject")
public Result reject(@RequestParam Long uid) {
public Result reject(@RequestParam("uid") Long uid) {
webrtcPrivateService.reject(uid);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "取消呼叫")
@Operation(summary = "取消呼叫")
@PostMapping("/cancel")
public Result cancel(@RequestParam Long uid) {
public Result cancel(@RequestParam("uid") Long uid) {
webrtcPrivateService.cancel(uid);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "呼叫失败")
@Operation(summary = "呼叫失败")
@PostMapping("/failed")
public Result failed(@RequestParam Long uid, @RequestParam String reason) {
public Result failed(@RequestParam("uid") Long uid, @RequestParam String reason) {
webrtcPrivateService.failed(uid, reason);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "挂断")
@Operation(summary = "挂断")
@PostMapping("/handup")
public Result handup(@RequestParam Long uid) {
public Result handup(@RequestParam("uid") Long uid) {
webrtcPrivateService.handup(uid);
return ResultUtils.success();
}
@PostMapping("/candidate")
@ApiOperation(httpMethod = "POST", value = "同步candidate")
public Result candidate(@RequestParam Long uid, @RequestBody String candidate) {
@Operation(summary = "同步candidate")
public Result candidate(@RequestParam("uid") Long uid, @RequestBody String candidate) {
webrtcPrivateService.candidate(uid, candidate);
return ResultUtils.success();
}
@ApiOperation(httpMethod = "POST", value = "获取通话信息")
@Operation(summary = "获取通话信息")
@PostMapping("/heartbeat")
public Result heartbeat(@RequestParam Long uid) {
public Result heartbeat(@RequestParam("uid") Long uid) {
webrtcPrivateService.heartbeat(uid);
return ResultUtils.success();
}

10
im-platform/src/main/java/com/bx/implatform/dto/GroupBanDTO.java

@ -1,7 +1,7 @@
package com.bx.implatform.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
@ -10,12 +10,12 @@ import lombok.Data;
* @version: 1.0
*/
@Data
@ApiModel(description = "群组封禁")
@Schema(description = "群组封禁")
public class GroupBanDTO {
@ApiModelProperty(value = "群组id")
@Schema(description = "群组id")
private Long id;
@ApiModelProperty(value = "封禁原因")
@Schema(description = "封禁原因")
private String reason;
}

21
im-platform/src/main/java/com/bx/implatform/dto/GroupMessageDTO.java

@ -1,36 +1,35 @@
package com.bx.implatform.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;
@Data
@ApiModel("群聊消息DTO")
@Schema(description = "群聊消息DTO")
public class GroupMessageDTO {
@NotNull(message = "群聊id不可为空")
@ApiModelProperty(value = "群聊id")
@Schema(description = "群聊id")
private Long groupId;
@Length(max = 1024, message = "发送内容长度不得大于1024")
@NotEmpty(message = "发送内容不可为空")
@ApiModelProperty(value = "发送内容")
@Schema(description = "发送内容")
private String content;
@NotNull(message = "消息类型不可为空")
@ApiModelProperty(value = "消息类型")
@Schema(description = "消息类型")
private Integer type;
@ApiModelProperty(value = "是否回执消息")
@Schema(description = "是否回执消息")
private Boolean receipt = false;
@Size(max = 20, message = "一次最多只能@20个小伙伴哦")
@ApiModelProperty(value = "被@用户列表")
@Schema(description = "被@用户列表")
private List<Long> atUserIds;
}

7
im-platform/src/main/java/com/bx/implatform/dto/GroupUnbanDTO.java

@ -1,7 +1,6 @@
package com.bx.implatform.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
@ -10,10 +9,10 @@ import lombok.Data;
* @version: 1.0
*/
@Data
@ApiModel(description = "群组解锁")
@Schema(description = "群组解锁")
public class GroupUnbanDTO {
@ApiModelProperty(value = "群组id")
@Schema(description = "群组id")
private Long id;
}

20
im-platform/src/main/java/com/bx/implatform/dto/LoginDTO.java

@ -1,30 +1,28 @@
package com.bx.implatform.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data
@ApiModel("用户登录DTO")
@Schema(description = "用户登录DTO")
public class LoginDTO {
@Max(value = 2, message = "登录终端类型取值范围:0,2")
@Min(value = 0, message = "登录终端类型取值范围:0,2")
@NotNull(message = "登录终端类型不可为空")
@ApiModelProperty(value = "登录终端 0:web 1:app 2:pc")
@Schema(description = "登录终端 0:web 1:app 2:pc")
private Integer terminal;
@NotEmpty(message = "用户名不可为空")
@ApiModelProperty(value = "用户名")
@Schema(description = "用户名")
private String userName;
@NotEmpty(message = "用户密码不可为空")
@ApiModelProperty(value = "用户密码")
@Schema(description = "用户密码")
private String password;
}

12
im-platform/src/main/java/com/bx/implatform/dto/ModifyPwdDTO.java

@ -1,21 +1,19 @@
package com.bx.implatform.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
@Data
@ApiModel("修改密码DTO")
@Schema(description = "修改密码DTO")
public class ModifyPwdDTO {
@NotEmpty(message = "旧用户密码不可为空")
@ApiModelProperty(value = "旧用户密码")
@Schema(description = "旧用户密码")
private String oldPassword;
@NotEmpty(message = "新用户密码不可为空")
@ApiModelProperty(value = "新用户密码")
@Schema(description = "新用户密码")
private String newPassword;
}

16
im-platform/src/main/java/com/bx/implatform/dto/PrivateMessageDTO.java

@ -1,29 +1,27 @@
package com.bx.implatform.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data
@ApiModel("私聊消息DTO")
@Schema(description = "私聊消息DTO")
public class PrivateMessageDTO {
@NotNull(message = "接收用户id不可为空")
@ApiModelProperty(value = "接收用户id")
@Schema(description = "接收用户id")
private Long recvId;
@Length(max = 1024, message = "内容长度不得大于1024")
@NotEmpty(message = "发送内容不可为空")
@ApiModelProperty(value = "发送内容")
@Schema(description = "发送内容")
private String content;
@NotNull(message = "消息类型不可为空")
@ApiModelProperty(value = "消息类型")
@Schema(description = "消息类型")
private Integer type;
}

14
im-platform/src/main/java/com/bx/implatform/dto/RegisterDTO.java

@ -1,29 +1,27 @@
package com.bx.implatform.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
@Data
@ApiModel("用户注册DTO")
@Schema(description = "用户注册DTO")
public class RegisterDTO {
@Length(max = 64, message = "用户名不能大于64字符")
@NotEmpty(message = "用户名不可为空")
@ApiModelProperty(value = "用户名")
@Schema(description = "用户名")
private String userName;
@Length(min = 5, max = 20, message = "密码长度必须在5-20个字符之间")
@NotEmpty(message = "用户密码不可为空")
@ApiModelProperty(value = "用户密码")
@Schema(description = "用户密码")
private String password;
@Length(max = 64, message = "昵称不能大于64字符")
@NotEmpty(message = "用户昵称不可为空")
@ApiModelProperty(value = "用户昵称")
@Schema(description = "用户昵称")
private String nickName;

9
im-platform/src/main/java/com/bx/implatform/dto/UserBanDTO.java

@ -1,7 +1,6 @@
package com.bx.implatform.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
@ -10,13 +9,13 @@ import lombok.Data;
* @version: 1.0
*/
@Data
@ApiModel("用户锁定DTO")
@Schema(description = "用户锁定DTO")
public class UserBanDTO {
@ApiModelProperty(value = "用户id")
@Schema(description = "用户id")
private Long id;
@ApiModelProperty(value = "锁定原因")
@Schema(description = "锁定原因")
private String reason;
}

16
im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupAnswerDTO.java

@ -1,31 +1,29 @@
package com.bx.implatform.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* @author: Blue
* @date: 2024-06-01
* @version: 1.0
*/
@Data
@ApiModel("回复用户连接请求DTO")
@Schema(description = "回复用户连接请求DTO")
public class WebrtcGroupAnswerDTO {
@NotNull(message = "群聊id不可为空")
@ApiModelProperty(value = "群聊id")
@Schema(description = "群聊id")
private Long groupId;
@NotNull(message = "用户id不可为空")
@ApiModelProperty(value = "用户id,代表回复谁的连接请求")
@Schema(description = "用户id,代表回复谁的连接请求")
private Long userId;
@NotEmpty(message = "anwer不可为空")
@ApiModelProperty(value = "用户本地anwer信息")
@Schema(description = "用户本地anwer信息")
private String answer;
}

17
im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupCandidateDTO.java

@ -1,32 +1,29 @@
package com.bx.implatform.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* @author: Blue
* @date: 2024-06-01
* @version: 1.0
*/
@Data
@ApiModel("发起群视频通话DTO")
@Schema(description = "发起群视频通话DTO")
public class WebrtcGroupCandidateDTO {
@NotNull(message = "群聊id不可为空")
@ApiModelProperty(value = "群聊id")
@Schema(description = "群聊id")
private Long groupId;
@NotNull(message = "用户id不可为空")
@ApiModelProperty(value = "用户id")
@Schema(description = "用户id")
private Long userId;
@NotEmpty(message = "candidate信息不可为空")
@ApiModelProperty(value = "candidate信息")
@Schema(description = "candidate信息")
private String candidate;
}

15
im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupDeviceDTO.java

@ -1,29 +1,26 @@
package com.bx.implatform.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* @author: Blue
* @date: 2024-06-01
* @version: 1.0
*/
@Data
@ApiModel("用户设备操作DTO")
@Schema(description = "用户设备操作DTO")
public class WebrtcGroupDeviceDTO {
@NotNull(message = "群聊id不可为空")
@ApiModelProperty(value = "群聊id")
@Schema(description = "群聊id")
private Long groupId;
@ApiModelProperty(value = "是否开启摄像头")
@Schema(description = "是否开启摄像头")
private Boolean isCamera;
@ApiModelProperty(value = "是否开启麦克风")
@Schema(description = "是否开启麦克风")
private Boolean isMicroPhone;
}

12
im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupFailedDTO.java

@ -1,25 +1,23 @@
package com.bx.implatform.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @author: Blue
* @date: 2024-06-01
* @version: 1.0
*/
@Data
@ApiModel("用户通话失败DTO")
@Schema(description = "用户通话失败DTO")
public class WebrtcGroupFailedDTO {
@NotNull(message = "群聊id不可为空")
@ApiModelProperty(value = "群聊id")
@Schema(description = "群聊id")
private Long groupId;
@ApiModelProperty(value = "失败原因")
@Schema(description = "失败原因")
private String reason;
}

13
im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupInviteDTO.java

@ -1,12 +1,11 @@
package com.bx.implatform.dto;
import com.bx.implatform.session.WebrtcUserInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
@ -15,15 +14,15 @@ import java.util.List;
* @version: 1.0
*/
@Data
@ApiModel("邀请用户进入群视频通话DTO")
@Schema(description = "邀请用户进入群视频通话DTO")
public class WebrtcGroupInviteDTO {
@NotNull(message = "群聊id不可为空")
@ApiModelProperty(value = "群聊id")
@Schema(description = "群聊id")
private Long groupId;
@NotEmpty(message = "参与用户信息不可为空")
@ApiModelProperty(value = "参与用户信息")
@Schema(description = "参与用户信息")
private List<WebrtcUserInfo> userInfos;
}

11
im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupJoinDTO.java

@ -1,23 +1,20 @@
package com.bx.implatform.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* @author: Blue
* @date: 2024-06-01
* @version: 1.0
*/
@Data
@ApiModel("进入群视频通话DTO")
@Schema(description = "进入群视频通话DTO")
public class WebrtcGroupJoinDTO {
@NotNull(message = "群聊id不可为空")
@ApiModelProperty(value = "群聊id")
@Schema(description = "群聊id")
private Long groupId;
}

16
im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupOfferDTO.java

@ -1,31 +1,29 @@
package com.bx.implatform.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* @author: Blue
* @date: 2024-06-01
* @version: 1.0
*/
@Data
@ApiModel("回复用户连接请求DTO")
@Schema(description = "回复用户连接请求DTO")
public class WebrtcGroupOfferDTO {
@NotNull(message = "群聊id不可为空")
@ApiModelProperty(value = "群聊id")
@Schema(description = "群聊id")
private Long groupId;
@NotNull(message = "用户id不可为空")
@ApiModelProperty(value = "用户id,代表回复谁的连接请求")
@Schema(description = "用户id,代表回复谁的连接请求")
private Long userId;
@NotEmpty(message = "offer不可为空")
@ApiModelProperty(value = "用户offer信息")
@Schema(description = "用户offer信息")
private String offer;
}

13
im-platform/src/main/java/com/bx/implatform/dto/WebrtcGroupSetupDTO.java

@ -1,12 +1,11 @@
package com.bx.implatform.dto;
import com.bx.implatform.session.WebrtcUserInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
@ -15,15 +14,15 @@ import java.util.List;
* @version: 1.0
*/
@Data
@ApiModel("发起群视频通话DTO")
@Schema(description = "发起群视频通话DTO")
public class WebrtcGroupSetupDTO {
@NotNull(message = "群聊id不可为空")
@ApiModelProperty(value = "群聊id")
@Schema(description = "群聊id")
private Long groupId;
@NotEmpty(message = "参与用户信息不可为空")
@ApiModelProperty(value = "参与用户信息")
@Schema(description = "参与用户信息")
private List<WebrtcUserInfo> userInfos;
}

22
im-platform/src/main/java/com/bx/implatform/entity/Friend.java

@ -1,14 +1,9 @@
package com.bx.implatform.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
@ -20,52 +15,39 @@ import java.util.Date;
* @since 2022-10-22
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("im_friend")
public class Friend extends Model<Friend> {
public class Friend{
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id", type = IdType.AUTO)
@TableId
private Long id;
/**
* 用户id
*/
@TableField("user_id")
private Long userId;
/**
* 好友id
*/
@TableField("friend_id")
private Long friendId;
/**
* 用户昵称
*/
@TableField("friend_nick_name")
private String friendNickName;
/**
* 用户头像
*/
@TableField("friend_head_image")
private String friendHeadImage;
/**
* 创建时间
*/
@TableField("created_time")
private Date createdTime;
@Override
protected Serializable pkVal() {
return this.id;
}
}

41
im-platform/src/main/java/com/bx/implatform/entity/Group.java

@ -1,14 +1,9 @@
package com.bx.implatform.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
@ -18,64 +13,60 @@ import java.util.Date;
* @since 2022-10-31
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("im_group")
public class Group extends Model<Group> {
private static final long serialVersionUID = 1L;
public class Group {
/**
* id
*/
@TableId(value = "id", type = IdType.AUTO)
@TableId
private Long id;
/**
* 群名字
*/
@TableField("name")
private String name;
/**
* 群主id
*/
@TableField("owner_id")
private Long ownerId;
/**
* 头像
* 头像
*/
@TableField("head_image")
private String headImage;
/**
* 头像缩略图
* 头像缩略图
*/
@TableField("head_image_thumb")
private String headImageThumb;
/**
* 群公告
*/
@TableField("notice")
private String notice;
/**
* 是否已删除
* 是否被封禁
*/
@TableField("deleted")
private Boolean deleted;
private Boolean isBanned;
/**
* 被封禁原因
*/
private String reason;
/**
* 创建时间
*/
@TableField("created_time")
private Date createdTime;
/**
* 是否已删除
*/
private Boolean deleted;
@Override
protected Serializable pkVal() {
return this.id;
}
}

35
im-platform/src/main/java/com/bx/implatform/entity/GroupMember.java

@ -1,14 +1,11 @@
package com.bx.implatform.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
@ -24,67 +21,51 @@ import java.util.Date;
@TableName("im_group_member")
public class GroupMember extends Model<GroupMember> {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id", type = IdType.AUTO)
@TableId
private Long id;
/**
* 群id
*/
@TableField("group_id")
private Long groupId;
/**
* 用户id
*/
@TableField("user_id")
private Long userId;
/**
* 内显示名称
* 内显示名称
*/
@TableField("alias_name")
private String aliasName;
/**
* 头像
* 用户头像
*/
@TableField("head_image")
private String headImage;
/**
* 备注
*/
@TableField("remark")
private String remark;
/**
* 是否已离开群聊
* 是否已退出
*/
@TableField("quit")
private Boolean quit;
/**
* 退群时间
*/
@TableField("quit_time")
private Date quitTime;
/**
* 创建时间
*/
@TableField("created_time")
private Date createdTime;
/**
* 退出时间
*/
private Date quitTime;
@Override
protected Serializable pkVal() {
return this.id;
}
}

30
im-platform/src/main/java/com/bx/implatform/entity/GroupMessage.java

@ -1,14 +1,9 @@
package com.bx.implatform.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
@ -20,87 +15,68 @@ import java.util.Date;
* @since 2022-10-31
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("im_group_message")
public class GroupMessage extends Model<GroupMessage> {
private static final long serialVersionUID = 1L;
@TableName("im_group_message")
public class GroupMessage {
/**
* id
*/
@TableId(value = "id", type = IdType.AUTO)
@TableId
private Long id;
/**
* 群id
*/
@TableField("group_id")
private Long groupId;
/**
* 发送用户id
*/
@TableField("send_id")
private Long sendId;
/**
* 发送用户昵称
*/
@TableField("send_nick_name")
private String sendNickName;
/**
* 接受用户id,为空表示全体发送
*/
@TableField("recv_ids")
private String recvIds;
/**
* @用户列表
*/
@TableField("at_user_ids")
private String atUserIds;
/**
* 发送内容
*/
@TableField("content")
private String content;
/**
* 消息类型 MessageType
*/
@TableField("type")
private Integer type;
/**
* 是否回执消息
*/
@TableField("receipt")
private Boolean receipt;
/**
* 回执消息是否完成
*/
@TableField("receipt_ok")
private Boolean receiptOk;
/**
* 状态 MessageStatus
*/
@TableField("status")
private Integer status;
/**
* 发送时间
*/
@TableField("send_time")
private Date sendTime;
@Override
protected Serializable pkVal() {
return this.id;
}
}

25
im-platform/src/main/java/com/bx/implatform/entity/PrivateMessage.java

@ -1,14 +1,8 @@
package com.bx.implatform.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
@ -20,59 +14,44 @@ import java.util.Date;
* @since 2022-10-01
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("im_private_message")
public class PrivateMessage extends Model<PrivateMessage> {
private static final long serialVersionUID = 1L;
public class PrivateMessage {
/**
* id
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 发送用户id
*/
@TableField("send_id")
private Long sendId;
/**
* 接收用户id
*/
@TableField("recv_id")
private Long recvId;
/**
* 发送内容
*/
@TableField("content")
private String content;
/**
* 消息类型 0:文字 1:图片 2:文件 3:语音 10:撤回消息
* 消息类型 MessageType
*/
@TableField("type")
private Integer type;
/**
* 状态
*/
@TableField("status")
private Integer status;
/**
* 发送时间
*/
@TableField("send_time")
private Date sendTime;
@Override
protected Serializable pkVal() {
return this.id;
}
}

64
im-platform/src/main/java/com/bx/implatform/entity/User.java

@ -1,14 +1,9 @@
package com.bx.implatform.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
@ -20,93 +15,78 @@ import java.util.Date;
* @since 2022-10-01
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("im_user")
public class User extends Model<User> {
private static final long serialVersionUID = 1L;
public class User {
/**
* id
*/
@TableId(value = "id", type = IdType.AUTO)
@TableId
private Long id;
/**
* 用户名
*/
@TableField("user_name")
private String userName;
/**
* 用户
* 用户昵称
*/
@TableField("nick_name")
private String nickName;
/**
* 性别
* 用户头像
*/
@TableField("sex")
private Integer sex;
private String headImage;
/**
* 头像
* 用户头像缩略图
*/
@TableField("head_image")
private String headImage;
private String headImageThumb;
/**
* 头像缩略图
* 密码(明文)
*/
@TableField("head_image_thumb")
private String headImageThumb;
private String password;
/**
* 用户类型 1:普通用户 2:审核专用账户
* 性别 0: 1::
*/
@TableField("type")
private Integer type;
private Integer sex;
/**
* 个性签名
*/
@TableField("signature")
private String signature;
/**
* 密码
*/
@TableField("password")
private String password;
/**
* 是否被封禁
* 账号是否被封禁
*/
@TableField("is_banned")
private Boolean isBanned;
/**
* 被封禁原因
* 账号被封禁原因
*/
@TableField("reason")
private String reason;
/**
* 最后登录时间
*/
@TableField("last_login_time")
private Date lastLoginTime;
/**
* 创建时间
* 创建时间(注册时间)
*/
@TableField("created_time")
private Date createdTime;
/**
* 账号类型 1:普通用户 2:wx小程序审核账户
*/
private Integer type;
@Override
protected Serializable pkVal() {
return this.id;
}
/**
* 客户端id,用于uni-push推送
*/
private String cid;
}

6
im-platform/src/main/java/com/bx/implatform/filter/CacheFilter.java

@ -1,11 +1,11 @@
package com.bx.implatform.filter;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Component

8
im-platform/src/main/java/com/bx/implatform/filter/CacheHttpServletRequestWrapper.java

@ -1,11 +1,11 @@
package com.bx.implatform.filter;
import jakarta.servlet.ReadListener;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.compress.utils.IOUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
public class CacheHttpServletRequestWrapper extends HttpServletRequestWrapper {

192
im-platform/src/main/java/com/bx/implatform/generator/CodeGenerator.java

@ -1,102 +1,102 @@
package com.bx.implatform.generator;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import java.util.ArrayList;
import java.util.List;
//import com.baomidou.mybatisplus.annotation.IdType;
//import com.baomidou.mybatisplus.core.toolkit.StringPool;
//import com.baomidou.mybatisplus.generator.AutoGenerator;
//import com.baomidou.mybatisplus.generator.InjectionConfig;
//import com.baomidou.mybatisplus.generator.config.*;
//import com.baomidou.mybatisplus.generator.config.po.TableInfo;
//import com.baomidou.mybatisplus.generator.config.rules.DateType;
//import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
//import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
//
//import java.util.ArrayList;
//import java.util.List;
public class CodeGenerator {
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
//生成的代码输出路径,自己根据需要修改
String projectPath = "d:\\work\\project\\code";
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("blue");
gc.setOpen(false);
gc.setFileOverride(true);
gc.setActiveRecord(true);
gc.setBaseColumnList(true);
gc.setBaseResultMap(true);
gc.setIdType(IdType.AUTO);
gc.setDateType(DateType.ONLY_DATE);
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/box-im?useUnicode=true&characterEncoding=utf-8");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("");
pc.setParent("com.bx");
mpg.setPackageInfo(pc);
// 如果模板引擎是 velocity
String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/src/main/resources/mapper/"
+ tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
// 下划线转驼峰
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityTableFieldAnnotationEnable(true);
strategy.setVersionFieldName("version");
//逻辑删除的字段
strategy.setLogicDeleteFieldName("deleted");
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
//多张表的时候直接在代码中写表名
strategy.setInclude("friends");
strategy.setTablePrefix("");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new VelocityTemplateEngine());
mpg.execute();
}
// public static void main(String[] args) {
// // 代码生成器
// AutoGenerator mpg = new AutoGenerator();
//
// // 全局配置
// GlobalConfig gc = new GlobalConfig();
// //生成的代码输出路径,自己根据需要修改
// String projectPath = "d:\\work\\project\\code";
// gc.setOutputDir(projectPath + "/src/main/java");
// gc.setAuthor("blue");
// gc.setOpen(false);
// gc.setFileOverride(true);
// gc.setActiveRecord(true);
// gc.setBaseColumnList(true);
// gc.setBaseResultMap(true);
// gc.setIdType(IdType.AUTO);
// gc.setDateType(DateType.ONLY_DATE);
// mpg.setGlobalConfig(gc);
//
// // 数据源配置
// DataSourceConfig dsc = new DataSourceConfig();
// dsc.setUrl("jdbc:mysql://localhost:3306/box-im?useUnicode=true&characterEncoding=utf-8");
// dsc.setDriverName("com.mysql.jdbc.Driver");
// dsc.setUsername("root");
// dsc.setPassword("root");
// mpg.setDataSource(dsc);
//
// // 包配置
// PackageConfig pc = new PackageConfig();
// pc.setModuleName("");
// pc.setParent("com.bx");
// mpg.setPackageInfo(pc);
//
// // 如果模板引擎是 velocity
// String templatePath = "/templates/mapper.xml.vm";
//
// // 自定义输出配置
// List<FileOutConfig> focList = new ArrayList<>();
// // 自定义配置会被优先输出
// focList.add(new FileOutConfig(templatePath) {
// @Override
// public String outputFile(TableInfo tableInfo) {
// // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
// return projectPath + "/src/main/resources/mapper/"
// + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
// }
// });
//
// // 自定义配置
// InjectionConfig cfg = new InjectionConfig() {
// @Override
// public void initMap() {
// // to do nothing
// }
// };
// cfg.setFileOutConfigList(focList);
// mpg.setCfg(cfg);
//
// // 配置模板
// TemplateConfig templateConfig = new TemplateConfig();
// templateConfig.setXml(null);
// mpg.setTemplate(templateConfig);
//
// // 策略配置
// StrategyConfig strategy = new StrategyConfig();
// // 下划线转驼峰
// strategy.setNaming(NamingStrategy.underline_to_camel);
// strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// strategy.setEntityTableFieldAnnotationEnable(true);
// strategy.setVersionFieldName("version");
// //逻辑删除的字段
// strategy.setLogicDeleteFieldName("deleted");
// strategy.setEntityLombokModel(true);
// strategy.setRestControllerStyle(true);
//
//
// //多张表的时候直接在代码中写表名
// strategy.setInclude("friends");
// strategy.setTablePrefix("");
// mpg.setStrategy(strategy);
//
// mpg.setTemplateEngine(new VelocityTemplateEngine());
// mpg.execute();
// }
}

5
im-platform/src/main/java/com/bx/implatform/interceptor/AuthInterceptor.java

@ -7,6 +7,8 @@ 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 jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
@ -14,9 +16,6 @@ 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

4
im-platform/src/main/java/com/bx/implatform/interceptor/XssInterceptor.java

@ -3,14 +3,14 @@ package com.bx.implatform.interceptor;
import com.bx.implatform.enums.ResultCode;
import com.bx.implatform.exception.GlobalException;
import com.bx.implatform.util.XssUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.util.Map;

2
im-platform/src/main/java/com/bx/implatform/listener/GroupMessageListener.java

@ -5,9 +5,7 @@ import com.bx.imclient.listener.MessageListener;
import com.bx.imcommon.enums.IMListenerType;
import com.bx.imcommon.enums.IMSendCode;
import com.bx.imcommon.model.IMSendResult;
import com.bx.implatform.contant.RedisKey;
import com.bx.implatform.vo.GroupMessageVO;
import com.bx.implatform.vo.PrivateMessageVO;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;

10
im-platform/src/main/java/com/bx/implatform/listener/SystemMessageListener.java

@ -1,24 +1,14 @@
package com.bx.implatform.listener;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
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.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 com.bx.implatform.vo.SystemMessageVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Slf4j
@IMListener(type = IMListenerType.SYSTEM_MESSAGE)

1
im-platform/src/main/java/com/bx/implatform/service/IWebrtcGroupService.java

@ -1,6 +1,5 @@
package com.bx.implatform.service;
import com.bx.implatform.config.WebrtcConfig;
import com.bx.implatform.dto.*;
import com.bx.implatform.vo.WebrtcGroupInfoVO;

4
im-platform/src/main/java/com/bx/implatform/service/IWebrtcPrivateService.java

@ -1,9 +1,5 @@
package com.bx.implatform.service;
import com.bx.implatform.config.ICEServer;
import java.util.List;
/**
* webrtc 通信服务
*

7
im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java

@ -18,7 +18,10 @@ import com.bx.implatform.enums.ResultCode;
import com.bx.implatform.exception.GlobalException;
import com.bx.implatform.mapper.GroupMapper;
import com.bx.implatform.mapper.GroupMessageMapper;
import com.bx.implatform.service.*;
import com.bx.implatform.service.IFriendService;
import com.bx.implatform.service.IGroupMemberService;
import com.bx.implatform.service.IGroupService;
import com.bx.implatform.service.IUserService;
import com.bx.implatform.session.SessionContext;
import com.bx.implatform.session.UserSession;
import com.bx.implatform.util.BeanUtils;
@ -40,7 +43,7 @@ import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@CacheConfig(cacheNames = RedisKey.IM_CACHE_GROUP)
@CacheConfig(cacheManager = "cacheManager",cacheNames = RedisKey.IM_CACHE_GROUP)
@Service
@RequiredArgsConstructor
public class GroupServiceImpl extends ServiceImpl<GroupMapper, Group> implements IGroupService {

2
im-platform/src/main/java/com/bx/implatform/service/thirdparty/FileService.java

@ -9,6 +9,7 @@ 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 jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@ -16,7 +17,6 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.util.Objects;

3
im-platform/src/main/java/com/bx/implatform/session/SessionContext.java

@ -1,10 +1,9 @@
package com.bx.implatform.session;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/*
* @Description
* @Author Blue

15
im-platform/src/main/java/com/bx/implatform/session/WebrtcUserInfo.java

@ -1,7 +1,6 @@
package com.bx.implatform.session;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
@ -10,20 +9,20 @@ import lombok.Data;
* @version: 1.0
*/
@Data
@ApiModel("用户信息")
@Schema(description = "用户信息")
public class WebrtcUserInfo {
@ApiModelProperty(value = "用户id")
@Schema(description = "用户id")
private Long id;
@ApiModelProperty(value = "用户昵称")
@Schema(description = "用户昵称")
private String nickName;
@ApiModelProperty(value = "用户头像")
@Schema(description = "用户头像")
private String headImage;
@ApiModelProperty(value = "是否开启摄像头")
@Schema(description = "是否开启摄像头")
private Boolean isCamera;
@ApiModelProperty(value = "是否开启麦克风")
@Schema(description = "是否开启麦克风")
private Boolean isMicroPhone;
}

1
im-platform/src/main/java/com/bx/implatform/task/UserBannedConsumerTask.java

@ -11,6 +11,7 @@ import com.bx.implatform.vo.SystemMessageVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Collections;
/**

2
im-platform/src/main/java/com/bx/implatform/util/SensitiveFilterUtil.java

@ -1,12 +1,12 @@
package com.bx.implatform.util;
import jakarta.annotation.PostConstruct;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.CharUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;

14
im-platform/src/main/java/com/bx/implatform/vo/FriendVO.java

@ -1,24 +1,22 @@
package com.bx.implatform.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
@ApiModel("好友信息VO")
@Schema(description = "好友信息VO")
public class FriendVO {
@NotNull(message = "好友id不可为空")
@ApiModelProperty(value = "好友id")
@Schema(description = "好友id")
private Long id;
@NotNull(message = "好友昵称不可为空")
@ApiModelProperty(value = "好友昵称")
@Schema(description = "好友昵称")
private String nickName;
@ApiModelProperty(value = "好友头像")
@Schema(description = "好友头像")
private String headImage;
}

13
im-platform/src/main/java/com/bx/implatform/vo/GroupInviteVO.java

@ -1,22 +1,21 @@
package com.bx.implatform.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@ApiModel("邀请好友进群请求VO")
@Schema(description = "邀请好友进群请求VO")
public class GroupInviteVO {
@NotNull(message = "群id不可为空")
@ApiModelProperty(value = "群id")
@Schema(description = "群id")
private Long groupId;
@NotEmpty(message = "群id不可为空")
@ApiModelProperty(value = "好友id列表不可为空")
@Schema(description = "好友id列表不可为空")
private List<Long> friendIds;
}

17
im-platform/src/main/java/com/bx/implatform/vo/GroupMemberVO.java

@ -1,29 +1,28 @@
package com.bx.implatform.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@ApiModel("群成员信息VO")
@Schema(description = "群成员信息VO")
public class GroupMemberVO {
@ApiModelProperty("用户id")
@Schema(description = "用户id")
private Long userId;
@ApiModelProperty("群内显示名称")
@Schema(description = "群内显示名称")
private String aliasName;
@ApiModelProperty("头像")
@Schema(description = "头像")
private String headImage;
@ApiModelProperty("是否已退出")
@Schema(description = "是否已退出")
private Boolean quit;
@ApiModelProperty(value = "是否在线")
@Schema(description = "是否在线")
private Boolean online;
@ApiModelProperty("备注")
@Schema(description = "备注")
private String remark;
}

27
im-platform/src/main/java/com/bx/implatform/vo/GroupMessageVO.java

@ -2,8 +2,7 @@ package com.bx.implatform.vo;
import com.bx.imcommon.serializer.DateToLongSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
@ -12,40 +11,40 @@ import java.util.List;
@Data
public class GroupMessageVO {
@ApiModelProperty(value = "消息id")
@Schema(description = "消息id")
private Long id;
@ApiModelProperty(value = "群聊id")
@Schema(description = "群聊id")
private Long groupId;
@ApiModelProperty(value = " 发送者id")
@Schema(description = " 发送者id")
private Long sendId;
@ApiModelProperty(value = " 发送者昵称")
@Schema(description = " 发送者昵称")
private String sendNickName;
@ApiModelProperty(value = "消息内容")
@Schema(description = "消息内容")
private String content;
@ApiModelProperty(value = "消息内容类型 具体枚举值由应用层定义")
@Schema(description = "消息内容类型 具体枚举值由应用层定义")
private Integer type;
@ApiModelProperty(value = "是否回执消息")
@Schema(description = "是否回执消息")
private Boolean receipt;
@ApiModelProperty(value = "回执消息是否完成")
@Schema(description = "回执消息是否完成")
private Boolean receiptOk;
@ApiModelProperty(value = "已读消息数量")
@Schema(description = "已读消息数量")
private Integer readedCount = 0;
@ApiModelProperty(value = "@用户列表")
@Schema(description = "@用户列表")
private List<Long> atUserIds;
@ApiModelProperty(value = " 状态")
@Schema(description = " 状态")
private Integer status;
@ApiModelProperty(value = "发送时间")
@Schema(description = "发送时间")
@JsonSerialize(using = DateToLongSerializer.class)
private Date sendTime;
}

29
im-platform/src/main/java/com/bx/implatform/vo/GroupVO.java

@ -1,50 +1,47 @@
package com.bx.implatform.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
@Data
@ApiModel("群信息VO")
@Schema(description = "群信息VO")
public class GroupVO {
@ApiModelProperty(value = "群id")
@Schema(description = "群id")
private Long id;
@Length(max = 20, message = "群名称长度不能大于20")
@NotEmpty(message = "群名称不可为空")
@ApiModelProperty(value = "群名称")
@Schema(description = "群名称")
private String name;
@ApiModelProperty(value = "群主id")
@Schema(description = "群主id")
private Long ownerId;
@ApiModelProperty(value = "头像")
@Schema(description = "头像")
private String headImage;
@ApiModelProperty(value = "头像缩略图")
@Schema(description = "头像缩略图")
private String headImageThumb;
@Length(max = 1024, message = "群聊显示长度不能大于1024")
@ApiModelProperty(value = "群公告")
@Schema(description = "群公告")
private String notice;
@Length(max = 20, message = "群聊显示长度不能大于20")
@ApiModelProperty(value = "用户在群显示昵称")
@Schema(description = "用户在群显示昵称")
private String aliasName;
@Length(max = 20, message = "群聊显示长度不能大于20")
@ApiModelProperty(value = "群聊显示备注")
@Schema(description = "群聊显示备注")
private String remark;
@ApiModelProperty(value = "是否已删除")
@Schema(description = "是否已删除")
private Boolean deleted;
@ApiModelProperty(value = "是否已退出")
@Schema(description = "是否已退出")
private Boolean quit;

13
im-platform/src/main/java/com/bx/implatform/vo/LoginVO.java

@ -1,23 +1,22 @@
package com.bx.implatform.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@ApiModel("用户登录VO")
@Schema(description = "用户登录VO")
public class LoginVO {
@ApiModelProperty(value = "每次请求都必须在header中携带accessToken")
@Schema(description = "每次请求都必须在header中携带accessToken")
private String accessToken;
@ApiModelProperty(value = "accessToken过期时间(秒)")
@Schema(description = "accessToken过期时间(秒)")
private Integer accessTokenExpiresIn;
@ApiModelProperty(value = "accessToken过期后,通过refreshToken换取新的token")
@Schema(description = "accessToken过期后,通过refreshToken换取新的token")
private String refreshToken;
@ApiModelProperty(value = "refreshToken过期时间(秒)")
@Schema(description = "refreshToken过期时间(秒)")
private Integer refreshTokenExpiresIn;
}

6
im-platform/src/main/java/com/bx/implatform/vo/OnlineTerminalVO.java

@ -1,6 +1,6 @@
package com.bx.implatform.vo;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
@ -15,10 +15,10 @@ import java.util.List;
@AllArgsConstructor
public class OnlineTerminalVO {
@ApiModelProperty(value = "用户id")
@Schema(description = "用户id")
private Long userId;
@ApiModelProperty(value = "在线终端类型")
@Schema(description = "在线终端类型")
private List<Integer> terminals;
}

19
im-platform/src/main/java/com/bx/implatform/vo/PrivateMessageVO.java

@ -2,35 +2,34 @@ package com.bx.implatform.vo;
import com.bx.imcommon.serializer.DateToLongSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
@Data
@ApiModel("私聊消息VO")
@Schema(description = "私聊消息VO")
public class PrivateMessageVO {
@ApiModelProperty(value = " 消息id")
@Schema(description = " 消息id")
private Long id;
@ApiModelProperty(value = " 发送者id")
@Schema(description = " 发送者id")
private Long sendId;
@ApiModelProperty(value = " 接收者id")
@Schema(description = " 接收者id")
private Long recvId;
@ApiModelProperty(value = " 发送内容")
@Schema(description = " 发送内容")
private String content;
@ApiModelProperty(value = "消息内容类型 IMCmdType")
@Schema(description = "消息内容类型 IMCmdType")
private Integer type;
@ApiModelProperty(value = " 状态")
@Schema(description = " 状态")
private Integer status;
@ApiModelProperty(value = " 发送时间")
@Schema(description = " 发送时间")
@JsonSerialize(using = DateToLongSerializer.class)
private Date sendTime;
}

7
im-platform/src/main/java/com/bx/implatform/vo/SystemConfigVO.java

@ -1,8 +1,7 @@
package com.bx.implatform.vo;
import com.bx.implatform.config.WebrtcConfig;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
@ -12,11 +11,11 @@ import lombok.Data;
* @version: 1.0
*/
@Data
@ApiModel("系统配置VO")
@Schema(description = "系统配置VO")
@AllArgsConstructor
public class SystemConfigVO {
@ApiModelProperty(value = "webrtc配置")
@Schema(description = "webrtc配置")
private WebrtcConfig webrtc;
}

13
im-platform/src/main/java/com/bx/implatform/vo/SystemMessageVO.java

@ -2,26 +2,25 @@ package com.bx.implatform.vo;
import com.bx.imcommon.serializer.DateToLongSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
@Data
@ApiModel("系统消息VO")
@Schema(description = "系统消息VO")
public class SystemMessageVO {
@ApiModelProperty(value = " 消息id")
@Schema(description = " 消息id")
private Long id;
@ApiModelProperty(value = " 发送内容")
@Schema(description = " 发送内容")
private String content;
@ApiModelProperty(value = "消息内容类型 MessageType")
@Schema(description = "消息内容类型 MessageType")
private Integer type;
@ApiModelProperty(value = " 发送时间")
@Schema(description = " 发送时间")
@JsonSerialize(using = DateToLongSerializer.class)
private Date sendTime;
}

9
im-platform/src/main/java/com/bx/implatform/vo/UploadImageVO.java

@ -1,16 +1,15 @@
package com.bx.implatform.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@ApiModel("图片上传VO")
@Schema(description = "图片上传VO")
public class UploadImageVO {
@ApiModelProperty(value = "原图")
@Schema(description = "原图")
private String originUrl;
@ApiModelProperty(value = "缩略图")
@Schema(description = "缩略图")
private String thumbUrl;
}

28
im-platform/src/main/java/com/bx/implatform/vo/UserVO.java

@ -1,48 +1,46 @@
package com.bx.implatform.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data
@ApiModel("用户信息VO")
@Schema(description = "用户信息VO")
public class UserVO {
@NotNull(message = "用户id不能为空")
@ApiModelProperty(value = "id")
@Schema(description = "id")
private Long id;
@NotEmpty(message = "用户名不能为空")
@Length(max = 64, message = "用户名不能大于64字符")
@ApiModelProperty(value = "用户名")
@Schema(description = "用户名")
private String userName;
@NotEmpty(message = "用户昵称不能为空")
@Length(max = 64, message = "昵称不能大于64字符")
@ApiModelProperty(value = "用户昵称")
@Schema(description = "用户昵称")
private String nickName;
@ApiModelProperty(value = "性别")
@Schema(description = "性别")
private Integer sex;
@ApiModelProperty(value = "用户类型 1:普通用户 2:审核账户")
@Schema(description = "用户类型 1:普通用户 2:审核账户")
private Integer type;
@Length(max = 1024, message = "个性签名不能大于1024个字符")
@ApiModelProperty(value = "个性签名")
@Schema(description = "个性签名")
private String signature;
@ApiModelProperty(value = "头像")
@Schema(description = "头像")
private String headImage;
@ApiModelProperty(value = "头像缩略图")
@Schema(description = "头像缩略图")
private String headImageThumb;
@ApiModelProperty(value = "是否在线")
@Schema(description = "是否在线")
private Boolean online;
}

9
im-platform/src/main/java/com/bx/implatform/vo/WebrtcGroupFailedVO.java

@ -1,7 +1,6 @@
package com.bx.implatform.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@ -12,12 +11,12 @@ import java.util.List;
* @version: 1.0
*/
@Data
@ApiModel("用户加入群通话失败VO")
@Schema(description = "用户加入群通话失败VO")
public class WebrtcGroupFailedVO {
@ApiModelProperty(value = "失败用户列表")
@Schema(description = "失败用户列表")
private List<Long> userIds;
@ApiModelProperty(value = "失败原因")
@Schema(description = "失败原因")
private String reason;
}

11
im-platform/src/main/java/com/bx/implatform/vo/WebrtcGroupInfoVO.java

@ -1,8 +1,7 @@
package com.bx.implatform.vo;
import com.bx.implatform.session.WebrtcUserInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@ -13,16 +12,16 @@ import java.util.List;
* @version: 1.0
*/
@Data
@ApiModel("群通话信息VO")
@Schema(description = "群通话信息VO")
public class WebrtcGroupInfoVO {
@ApiModelProperty(value = "是否在通话中")
@Schema(description = "是否在通话中")
private Boolean isChating;
@ApiModelProperty(value = "通话发起人")
@Schema(description = "通话发起人")
WebrtcUserInfo host;
@ApiModelProperty(value = "通话用户列表")
@Schema(description = "通话用户列表")
private List<WebrtcUserInfo> userInfos;
}

11
im-platform/src/main/resources/application.yml

@ -7,7 +7,7 @@ spring:
pathmatch:
matching-strategy: ant_path_matcher
datasource:
driver-class-name: com.mysql.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/box-im?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true
username: root
password: root
@ -22,12 +22,13 @@ spring:
max-request-size: 50MB
mybatis-plus:
global-config:
db-config:
id-type: AUTO # ID自增
configuration:
# 是否开启自动驼峰命名规则
map-underscore-to-camel-case: false
map-underscore-to-camel-case: true #开启自动驼峰命名规则
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations:
- classpath*:mapper/*.xml
minio:
endpoint: http://127.0.0.1:9001 #内网地址
public: http://127.0.0.1:9001 #外网访问地址

6
im-server/pom.xml

@ -18,10 +18,6 @@
<artifactId>im-commom</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
@ -40,7 +36,7 @@
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.3.RELEASE</version>
<version>3.3.1</version>
<executions>
<execution>
<goals>

33
im-server/src/main/java/com/bx/imserver/config/RedisConfig.java

@ -1,33 +0,0 @@
package com.bx.imserver.config;
import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
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.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置值(value)的序列化采用FastJsonRedisSerializer
redisTemplate.setValueSerializer(fastJsonRedisSerializer());
redisTemplate.setHashValueSerializer(fastJsonRedisSerializer());
// 设置键(key)的序列化采用StringRedisSerializer。
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
public FastJsonRedisSerializer fastJsonRedisSerializer() {
return new FastJsonRedisSerializer<>(Object.class);
}
}

6
im-server/src/main/java/com/bx/imserver/netty/IMServerGroup.java

@ -1,13 +1,13 @@
package com.bx.imserver.netty;
import com.bx.imcommon.contant.IMRedisKey;
import jakarta.annotation.PreDestroy;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.PreDestroy;
import java.util.List;
@Slf4j
@ -17,7 +17,7 @@ public class IMServerGroup implements CommandLineRunner {
public static volatile long serverId = 0;
RedisTemplate<String, Object> redisTemplate;
private final RedisTemplate<String, Object> redisTemplate;
private final List<IMServer> imServers;
@ -36,7 +36,7 @@ public class IMServerGroup implements CommandLineRunner {
}
@Override
public void run(String... args) throws Exception {
public void run(String... args) {
// 初始化SERVER_ID
String key = IMRedisKey.IM_MAX_SERVER_ID;
serverId = redisTemplate.opsForValue().increment(key, 1);

53
pom.xml

@ -8,6 +8,11 @@
<groupId>com.bx</groupId>
<packaging>pom</packaging>
<version>2.0.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.1</version>
</parent>
<modules>
<module>im-platform</module>
@ -17,34 +22,24 @@
</modules>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<mybatisplus.version>3.4.0</mybatisplus.version>
<fastjson.version>1.2.40</fastjson.version>
<velocity.version>1.7</velocity.version>
<swagger.version>2.7.0</swagger.version>
<hutool.version>5.8.16</hutool.version>
<java.version>17</java.version>
<mybatisplus.version>3.5.7</mybatisplus.version>
<fastjson.version>1.2.83</fastjson.version>
<knife4j.version>4.5.0</knife4j.version>
<hutool.version>5.8.28</hutool.version>
<druid.version>1.1.22</druid.version>
<minio.version>8.5.1</minio.version>
<redisson.version>3.21.3</redisson.version>
<commons-lang3.version>3.8.1</commons-lang3.version>
<lombok.version>1.18.16</lombok.version>
<mysql.version>5.1.46</mysql.version>
<lombok.version>1.18.32</lombok.version>
<mybatis.spring.version>3.0.3</mybatis.spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.17</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
@ -70,31 +65,11 @@
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>${velocity.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>

Loading…
Cancel
Save