diff --git a/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/config/RedisConfig.java b/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/config/RedisConfig.java index 943dfc78..f0ae80a9 100644 --- a/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/config/RedisConfig.java +++ b/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/config/RedisConfig.java @@ -9,6 +9,9 @@ import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.jedis.JedisClientConfiguration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; import redis.clients.jedis.JedisPoolConfig; import java.time.Duration; @@ -125,6 +128,51 @@ public class RedisConfig { return jedisPoolConfig; } + /** + * 配置 RedisTemplate + * 使用 String 序列化器作为 key 的序列化器 + * 使用 JSON 序列化器作为 value 的序列化器 + */ + @Bean + @Primary + public RedisTemplate redisTemplate(@Qualifier("redisConnectionFactory") RedisConnectionFactory redisConnectionFactory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(redisConnectionFactory); + + // 使用 StringRedisSerializer 来序列化和反序列化 redis 的 key 值 + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + template.setKeySerializer(stringRedisSerializer); + template.setHashKeySerializer(stringRedisSerializer); + + // 使用 GenericJackson2JsonRedisSerializer 来序列化和反序列化 redis 的 value 值 + GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); + template.setValueSerializer(jsonRedisSerializer); + template.setHashValueSerializer(jsonRedisSerializer); + + template.afterPropertiesSet(); + return template; + } + + /** + * 配置第二个 RedisTemplate(使用第二个数据库) + */ + @Bean(name = "secondRedisTemplate") + public RedisTemplate secondRedisTemplate(@Qualifier("secondRedisConnectionFactory") RedisConnectionFactory secondRedisConnectionFactory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(secondRedisConnectionFactory); + + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + template.setKeySerializer(stringRedisSerializer); + template.setHashKeySerializer(stringRedisSerializer); + + GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); + template.setValueSerializer(jsonRedisSerializer); + template.setHashValueSerializer(jsonRedisSerializer); + + template.afterPropertiesSet(); + return template; + } + } diff --git a/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/constants/CategoryConstants.java b/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/constants/CategoryConstants.java index 162bf864..cd3a03ca 100644 --- a/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/constants/CategoryConstants.java +++ b/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/constants/CategoryConstants.java @@ -33,5 +33,9 @@ public class CategoryConstants { public static final Integer CATEGORY_TYPE_CONFIG = 6; /** 分类类型-秒杀配置 */ public static final Integer CATEGORY_TYPE_SECKILL = 7; + /** 分类类型-直播间分类 */ + public static final Integer CATEGORY_TYPE_LIVE_ROOM = 8; + /** 分类类型-作品分类 */ + public static final Integer CATEGORY_TYPE_WORK = 9; } diff --git a/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/model/live/LiveRoom.java b/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/model/live/LiveRoom.java index d16bcf15..31a28f49 100644 --- a/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/model/live/LiveRoom.java +++ b/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/model/live/LiveRoom.java @@ -10,6 +10,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import javax.persistence.Column; import java.io.Serializable; import java.util.Date; @@ -36,6 +37,10 @@ public class LiveRoom implements Serializable { @TableField("streamer_name") private String streamerName; + @ApiModelProperty(value = "分类ID") + @TableField("category_id") + private Integer categoryId; + @ApiModelProperty(value = "流密钥(推流 streamKey)") @TableField("stream_key") private String streamKey; diff --git a/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/model/ratelimit/RateLimitConfig.java b/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/model/ratelimit/RateLimitConfig.java new file mode 100644 index 00000000..b0b1cf96 --- /dev/null +++ b/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/model/ratelimit/RateLimitConfig.java @@ -0,0 +1,60 @@ +package com.zbkj.common.model.ratelimit; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 限流配置实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("eb_rate_limit_config") +@ApiModel(value = "RateLimitConfig对象", description = "限流配置") +public class RateLimitConfig implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "配置ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "限流类型") + private String limitType; + + @ApiModelProperty(value = "限流名称") + private String limitName; + + @ApiModelProperty(value = "限流速率(每时间窗口允许的请求数)") + private Integer rate; + + @ApiModelProperty(value = "令牌桶容量") + private Integer capacity; + + @ApiModelProperty(value = "时间窗口(秒)") + private Integer timeWindow; + + @ApiModelProperty(value = "状态: 0-禁用, 1-启用") + private Integer status; + + @ApiModelProperty(value = "是否删除: 0-未删除, 1-已删除") + private Integer isDeleted; + + @ApiModelProperty(value = "描述") + private String description; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; +} diff --git a/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/model/ratelimit/RateLimitRecord.java b/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/model/ratelimit/RateLimitRecord.java new file mode 100644 index 00000000..39c18814 --- /dev/null +++ b/Zhibo/zhibo-h/crmeb-common/src/main/java/com/zbkj/common/model/ratelimit/RateLimitRecord.java @@ -0,0 +1,63 @@ +package com.zbkj.common.model.ratelimit; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 限流记录实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("eb_rate_limit_record") +@ApiModel(value = "RateLimitRecord对象", description = "限流记录") +public class RateLimitRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "记录ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "限流类型") + private String limitType; + + @ApiModelProperty(value = "请求路径") + private String requestPath; + + @ApiModelProperty(value = "请求方法") + private String requestMethod; + + @ApiModelProperty(value = "IP地址") + private String ipAddress; + + @ApiModelProperty(value = "用户代理") + private String userAgent; + + @ApiModelProperty(value = "请求次数") + private Integer requestCount; + + @ApiModelProperty(value = "限流阈值") + private Integer limitThreshold; + + @ApiModelProperty(value = "处理动作: block-拒绝, allow-允许") + private String action; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "创建时间") + private Date createTime; +} diff --git a/Zhibo/zhibo-h/crmeb-service/pom.xml b/Zhibo/zhibo-h/crmeb-service/pom.xml index 3d627fce..8b041aad 100644 --- a/Zhibo/zhibo-h/crmeb-service/pom.xml +++ b/Zhibo/zhibo-h/crmeb-service/pom.xml @@ -38,6 +38,11 @@ gson 2.8.9 + + + org.springframework.boot + spring-boot-starter-websocket + \ No newline at end of file diff --git a/Zhibo/zhibo-h/crmeb-service/src/main/java/com/zbkj/service/dao/RateLimitConfigDao.java b/Zhibo/zhibo-h/crmeb-service/src/main/java/com/zbkj/service/dao/RateLimitConfigDao.java new file mode 100644 index 00000000..33cb6343 --- /dev/null +++ b/Zhibo/zhibo-h/crmeb-service/src/main/java/com/zbkj/service/dao/RateLimitConfigDao.java @@ -0,0 +1,11 @@ +package com.zbkj.service.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zbkj.common.model.ratelimit.RateLimitConfig; + +/** + * 限流配置 Mapper 接口 + */ +public interface RateLimitConfigDao extends BaseMapper { + +} diff --git a/Zhibo/zhibo-h/crmeb-service/src/main/java/com/zbkj/service/dao/RateLimitRecordDao.java b/Zhibo/zhibo-h/crmeb-service/src/main/java/com/zbkj/service/dao/RateLimitRecordDao.java new file mode 100644 index 00000000..85cea586 --- /dev/null +++ b/Zhibo/zhibo-h/crmeb-service/src/main/java/com/zbkj/service/dao/RateLimitRecordDao.java @@ -0,0 +1,11 @@ +package com.zbkj.service.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zbkj.common.model.ratelimit.RateLimitRecord; + +/** + * 限流记录 Mapper 接口 + */ +public interface RateLimitRecordDao extends BaseMapper { + +}