diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 667a8df..91dae2f 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -7,8 +7,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 7ecaa0f..de949f4 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -4,5 +4,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index b7686d0..583a849 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -5,6 +5,7 @@
diff --git a/netty/.gitignore b/netty/.gitignore
new file mode 100644
index 0000000..359dca5
--- /dev/null
+++ b/netty/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+logs/
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/netty/common/common-generator/pom.xml b/netty/common/common-generator/pom.xml
new file mode 100644
index 0000000..c99ab7e
--- /dev/null
+++ b/netty/common/common-generator/pom.xml
@@ -0,0 +1,70 @@
+
+ 4.0.0
+
+ cn.bunny
+ common
+ 0.0.1-SNAPSHOT
+
+
+ common-generator
+ jar
+
+ common-utils
+ https://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ org.projectlombok
+ lombok
+
+
+ javax.xml.bind
+ jaxb-api
+ 2.1
+
+
+
+ mysql
+ mysql-connector-java
+
+
+
+ com.zaxxer
+ HikariCP
+ 5.1.0
+
+
+
+ com.baomidou
+ mybatis-plus-spring-boot3-starter
+
+
+
+ com.baomidou
+ mybatis-plus-generator
+ 3.5.6
+
+
+ org.apache.velocity
+ velocity-engine-core
+ 2.3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/netty/common/common-generator/src/main/java/cn/bunny/common/generator/NewCodeGet.java b/netty/common/common-generator/src/main/java/cn/bunny/common/generator/NewCodeGet.java
new file mode 100644
index 0000000..27d0fe9
--- /dev/null
+++ b/netty/common/common-generator/src/main/java/cn/bunny/common/generator/NewCodeGet.java
@@ -0,0 +1,83 @@
+package cn.bunny.common.generator;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.generator.FastAutoGenerator;
+import com.baomidou.mybatisplus.generator.config.OutputFile;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Collections;
+
+public class NewCodeGet {
+ // 数据连接
+ public static final String sqlHost = "jdbc:mysql://106.15.251.123:3305/bunny_docs?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true";
+ // 作者名称
+ public static final String author = "Bunny";
+ // 公共路径
+ public static final String outputDir = "F:\\web项目\\PC\\BunnyNote\\BunnyBBS-server\\service\\service-web";
+ // 实体类名称
+ public static final String entity = "Bunny";
+
+ public static void main(String[] args) {
+ Generation("article");
+ }
+
+ /**
+ * 根据表名生成相应结构代码
+ *
+ * @param tableName 表名
+ */
+ public static void Generation(String... tableName) {
+ // TODO 修改数据库路径、账户、密码
+ FastAutoGenerator.create(sqlHost, "root", "02120212")
+ .globalConfig(builder -> {
+ // 添加作者名称
+ builder.author(author)
+ // 启用swagger
+ .enableSwagger()
+ // 指定输出目录
+ .outputDir(outputDir + "/src/main/java");
+ })
+ .packageConfig(builder -> {
+ builder.entity(entity)// 实体类包名
+ // TODO 父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名
+ .parent("cn.bunny.service.web")
+ .controller("controller")// 控制层包名
+ .mapper("mapper")// mapper层包名
+ .service("service")// service层包名
+ .serviceImpl("service.impl")// service实现类包名
+ // 自定义mapper.xml文件输出目录
+ .pathInfo(Collections.singletonMap(OutputFile.xml, outputDir + "/src/main/resources/mapper"));
+ })
+ .strategyConfig(builder -> {
+ // 设置要生成的表名
+ builder.addInclude(tableName)
+ //.addTablePrefix("sys_")// TODO 设置表前缀过滤
+ .entityBuilder()
+ .enableLombok()
+ .enableChainModel()
+ .naming(NamingStrategy.underline_to_camel)// 数据表映射实体命名策略:默认下划线转驼峰underline_to_camel
+ .columnNaming(NamingStrategy.underline_to_camel)// 表字段映射实体属性命名规则:默认null,不指定按照naming执行
+ .idType(IdType.AUTO)// TODO 添加全局主键类型
+ .formatFileName("%s")// 格式化实体名称,%s取消首字母I,
+ .mapperBuilder()
+ .mapperAnnotation(Mapper.class)// 开启mapper注解
+ .enableBaseResultMap()// 启用xml文件中的BaseResultMap 生成
+ .enableBaseColumnList()// 启用xml文件中的BaseColumnList
+ .formatMapperFileName("%sMapper")// 格式化Dao类名称
+ .formatXmlFileName("%sMapper")// 格式化xml文件名称
+ .serviceBuilder()
+ .formatServiceFileName("%sService")// 格式化 service 接口文件名称
+ .formatServiceImplFileName("%sServiceImpl")// 格式化 service 接口文件名称
+ .controllerBuilder()
+ .enableRestStyle();
+ })
+ // .injectionConfig(consumer -> {
+ // Map customFile = new HashMap<>();
+ // // 配置DTO(需要的话)但是需要有能配置Dto的模板引擎,比如freemarker,但是这里我们用的VelocityEngine,因此不多作介绍
+ // customFile.put(outputDir, "/src/main/resources/templates/entityDTO.java.ftl");
+ // consumer.customFile(customFile);
+ // })
+ .execute();
+ }
+}
diff --git a/netty/common/common-generator/src/main/java/cn/bunny/common/generator/OldCodeGet.java b/netty/common/common-generator/src/main/java/cn/bunny/common/generator/OldCodeGet.java
new file mode 100644
index 0000000..d43819c
--- /dev/null
+++ b/netty/common/common-generator/src/main/java/cn/bunny/common/generator/OldCodeGet.java
@@ -0,0 +1,57 @@
+package cn.bunny.common.generator;
+
+public class OldCodeGet {
+ public static void main(String[] args) {
+ // // 1、创建代码生成器
+ // AutoGenerator mpg = new AutoGenerator();
+ //
+ // // 2、全局配置
+ // // 全局配置
+ // GlobalConfig gc = new GlobalConfig();
+ // // TODO 需要修改路径名称
+ // gc.setOutputDir("F:\\web项目\\Bunny-Cli\\Java\\java-template\\service" + "/src/main/java");
+ // gc.setServiceName("%sService"); // 去掉Service接口的首字母I
+ // gc.setAuthor("bunny");
+ // gc.setOpen(false);
+ // mpg.setGlobalConfig(gc);
+ //
+ // // 3、数据源配置
+ // DataSourceConfig dsc = new DataSourceConfig();
+ // // TODO 需要修改数据库
+ // dsc.setUrl("jdbc:mysql://106.15.251.123:3305/guigu-oa?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true");
+ // dsc.setDriverName("com.mysql.cj.jdbc.Driver");
+ // dsc.setUsername("root");
+ // dsc.setPassword("02120212");
+ // dsc.setDbType(DbType.MYSQL);
+ // mpg.setDataSource(dsc);
+ //
+ // // 4、包配置
+ // PackageConfig pc = new PackageConfig();
+ // pc.setParent("cn.bunny");
+ // // TODO 需要修改模块名
+ // pc.setModuleName("service");
+ // pc.setController("controller");
+ // pc.setService("service");
+ // pc.setMapper("mapper");
+ // mpg.setPackageInfo(pc);
+ //
+ // // 5、策略配置
+ // StrategyConfig strategy = getStrategyConfig();
+ // mpg.setStrategy(strategy);
+ //
+ // // 6、执行
+ // mpg.execute();
+ // }
+ //
+ // private static StrategyConfig getStrategyConfig() {
+ // StrategyConfig strategy = new StrategyConfig();
+ // // TODO 要生成的表
+ // strategy.setInclude("sys_menu", "sys_role_menu");
+ // strategy.setNaming(NamingStrategy.underline_to_camel);// 数据库表映射到实体的命名策略
+ // strategy.setColumnNaming(NamingStrategy.underline_to_camel);// 数据库表字段映射到实体的命名策略
+ // strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
+ // strategy.setRestControllerStyle(true); // restful api风格控制器
+ // strategy.setControllerMappingHyphenStyle(true); // url中驼峰转连字符
+ // return strategy;
+ }
+}
diff --git a/netty/common/common-utils/pom.xml b/netty/common/common-utils/pom.xml
new file mode 100644
index 0000000..f832c59
--- /dev/null
+++ b/netty/common/common-utils/pom.xml
@@ -0,0 +1,27 @@
+
+ 4.0.0
+
+ cn.bunny
+ common
+ 0.0.1-SNAPSHOT
+
+
+ common-utils
+ jar
+
+ common-utils
+ https://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ cn.bunny
+ model
+ 0.0.1-SNAPSHOT
+
+
+
diff --git a/netty/common/common-utils/src/main/java/cn/bunny/common/utils/CommentUtil.java b/netty/common/common-utils/src/main/java/cn/bunny/common/utils/CommentUtil.java
new file mode 100644
index 0000000..b733f66
--- /dev/null
+++ b/netty/common/common-utils/src/main/java/cn/bunny/common/utils/CommentUtil.java
@@ -0,0 +1,51 @@
+package cn.bunny.common.utils;
+
+import cn.bunny.vo.system.comment.CommentVo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CommentUtil {
+ /**
+ * 构建树型结构
+ *
+ * @param commentList 评论列表
+ * @return 结构列表
+ */
+ public static List buildTree(List commentList) {
+ // 构建树形结构
+ List tree = new ArrayList<>();
+ // 遍历评论列表
+ for (CommentVo comment : commentList) {
+ // 找到顶级评论(没有父评论)
+ if (comment.getPCommentId() == 0) {
+ // 递归构建子评论
+ comment.setChildren(getChildren(comment.getId(), commentList));
+ tree.add(comment);
+ }
+ }
+ return tree;
+ }
+
+ /**
+ * 递归获取子评论
+ *
+ * @param commentId 当前评论ID
+ * @param commentList 评论列表
+ * @return 子评论列表
+ */
+ private static List getChildren(Long commentId, List commentList) {
+ List children = new ArrayList<>();
+
+ // 遍历评论列表
+ for (CommentVo comment : commentList) {
+ // 找到当前评论的子评论
+ if (Long.valueOf(comment.getPCommentId()).equals(commentId)) {
+ // 递归构建子评论的子评论
+ comment.setChildren(getChildren(comment.getId(), commentList));
+ children.add(comment);
+ }
+ }
+ return children;
+ }
+}
diff --git a/netty/common/common-utils/src/main/java/cn/bunny/common/utils/FileUtil.java b/netty/common/common-utils/src/main/java/cn/bunny/common/utils/FileUtil.java
new file mode 100644
index 0000000..739253c
--- /dev/null
+++ b/netty/common/common-utils/src/main/java/cn/bunny/common/utils/FileUtil.java
@@ -0,0 +1,25 @@
+package cn.bunny.common.utils;
+
+public class FileUtil {
+ public static String getSize(Long fileSize) {
+ double fileSizeInKB = fileSize / 1024.00;
+ double fileSizeInMB = fileSizeInKB / 1024;
+ double fileSizeInGB = fileSizeInMB / 1024;
+
+ String size;
+ if (fileSizeInGB >= 1) {
+ fileSizeInGB = Double.parseDouble(String.format("%.2f", fileSizeInGB));
+ size = fileSizeInGB + "GB";
+ } else if (fileSizeInMB >= 1) {
+ fileSizeInMB = Double.parseDouble(String.format("%.2f", fileSizeInMB));
+ size = fileSizeInMB + "MB";
+ } else if (fileSizeInKB >= 1) {
+ fileSizeInKB = Double.parseDouble(String.format("%.2f", fileSizeInKB));
+ size = fileSizeInKB + "KB";
+ } else {
+ size = fileSize + "B";
+ }
+
+ return size;
+ }
+}
diff --git a/netty/common/pom.xml b/netty/common/pom.xml
new file mode 100644
index 0000000..c04ed68
--- /dev/null
+++ b/netty/common/pom.xml
@@ -0,0 +1,30 @@
+
+ 4.0.0
+
+ cn.bunny
+ bunny-template
+ 0.0.1-SNAPSHOT
+
+
+ common
+ pom
+ common Maven Webapp
+ https://maven.apache.org
+
+ service-utils
+ common-generator
+ common-utils
+
+
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+
+
+ io.jsonwebtoken
+ jjwt
+
+
+
diff --git a/netty/common/service-utils/pom.xml b/netty/common/service-utils/pom.xml
new file mode 100644
index 0000000..3a326b2
--- /dev/null
+++ b/netty/common/service-utils/pom.xml
@@ -0,0 +1,57 @@
+
+ 4.0.0
+
+ cn.bunny
+ common
+ 0.0.1-SNAPSHOT
+
+
+ service-utils
+ jar
+ service-utils
+ https://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ cn.bunny
+ model
+ 0.0.1-SNAPSHOT
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.14
+
+
+
+ com.github.xiaoymin
+ knife4j-openapi3-jakarta-spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+ org.redisson
+ redisson
+ 3.26.1
+
+
+
+ com.github.pagehelper
+ pagehelper
+
+
+
diff --git a/netty/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java b/netty/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java
new file mode 100644
index 0000000..5abefce
--- /dev/null
+++ b/netty/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java
@@ -0,0 +1,46 @@
+package cn.bunny.common.service.config;
+
+import io.swagger.v3.oas.models.ExternalDocumentation;
+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 lombok.extern.slf4j.Slf4j;
+import org.springdoc.core.models.GroupedOpenApi;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@Slf4j
+public class Knife4jConfig {
+ @Bean
+ public OpenAPI openAPI() {
+ log.info("Knife4jConfig===>配置knife4j");
+ // 作者等信息
+ Contact contact = new Contact().name("Bunny").email("1319900154@qq.com").url("http://z-bunny.com");
+ // 使用协议
+ License license = new License().name("MIT").url("http://MUT.com");
+ // 相关信息
+ Info info = new Info().title("Bunny-Java-Template").description("Bunny的Java模板").version("v1.0.0").contact(contact).license(license);
+
+ return new OpenAPI().info(info).externalDocs(new ExternalDocumentation());
+ }
+
+ // 前台相关分类接口
+ @Bean
+ public GroupedOpenApi groupedOpenApi() {
+ return GroupedOpenApi.builder().group("前台接口管理").pathsToMatch("/api/**").build();
+ }
+
+ // 管理员相关分类接口
+ @Bean
+ public GroupedOpenApi groupedOpenAdminApi() {
+ return GroupedOpenApi.builder().group("管理员接口请求").pathsToMatch("/admin/**").build();
+ }
+
+ // 测试相关分类接口
+ @Bean
+ public GroupedOpenApi testGroupedOpenApi() {
+ return GroupedOpenApi.builder().group("测试相关分类接口").pathsToMatch("/test/**").build();
+ }
+}
diff --git a/netty/common/service-utils/src/main/java/cn/bunny/common/service/config/MyBatisPlusFieldConfig.java b/netty/common/service-utils/src/main/java/cn/bunny/common/service/config/MyBatisPlusFieldConfig.java
new file mode 100644
index 0000000..d32b125
--- /dev/null
+++ b/netty/common/service-utils/src/main/java/cn/bunny/common/service/config/MyBatisPlusFieldConfig.java
@@ -0,0 +1,39 @@
+package cn.bunny.common.service.config;
+
+import cn.bunny.common.service.context.BaseContext;
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+/**
+ * 配置MP在修改和新增时的操作
+ */
+@Component
+public class MyBatisPlusFieldConfig implements MetaObjectHandler {
+
+ /**
+ * 使用mp做添加操作时候,这个方法执行
+ */
+ @Override
+ public void insertFill(MetaObject metaObject) {
+ // 设置属性值
+ this.setFieldValByName("createTime", new Date(), metaObject);
+ this.setFieldValByName("updateTime", new Date(), metaObject);
+ this.setFieldValByName("deleteStatus", 1, metaObject);
+ if (BaseContext.getUsername() != null) {
+ this.setFieldValByName("createBy", BaseContext.getUsername(), metaObject);
+ this.setFieldValByName("updateBy", BaseContext.getUsername(), metaObject);
+ }
+ }
+
+ /**
+ * 使用mp做修改操作时候,这个方法执行
+ */
+ @Override
+ public void updateFill(MetaObject metaObject) {
+ this.setFieldValByName("updateTime", new Date(), metaObject);
+ this.setFieldValByName("updateBy", BaseContext.getUsername(), metaObject);
+ }
+}
diff --git a/netty/common/service-utils/src/main/java/cn/bunny/common/service/config/MybatisPlusConfig.java b/netty/common/service-utils/src/main/java/cn/bunny/common/service/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..013c778
--- /dev/null
+++ b/netty/common/service-utils/src/main/java/cn/bunny/common/service/config/MybatisPlusConfig.java
@@ -0,0 +1,42 @@
+package cn.bunny.common.service.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import com.github.pagehelper.PageInterceptor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * Mybatis-Plus配置类
+ */
+@EnableTransactionManagement
+@Configuration
+@Slf4j
+public class MybatisPlusConfig {
+ @Bean
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ log.info("MybatisPlusInterceptor===>注入Mybatis-Plus配置...");
+
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+ // 分页插件
+ PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
+ paginationInnerInterceptor.setMaxLimit(100L);// ? 设置最大分页为100
+ interceptor.addInnerInterceptor(paginationInnerInterceptor);
+ // 乐观锁
+ interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
+ // 防止全表删除
+ interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
+
+ return interceptor;
+ }
+
+ @Bean// pagehelper分页插件需要配的拦截器
+ public PageInterceptor pageInterceptor() {
+ return new PageInterceptor();
+ }
+}
diff --git a/netty/common/service-utils/src/main/java/cn/bunny/common/service/config/RedisConfiguration.java b/netty/common/service-utils/src/main/java/cn/bunny/common/service/config/RedisConfiguration.java
new file mode 100644
index 0000000..1b5c8d7
--- /dev/null
+++ b/netty/common/service-utils/src/main/java/cn/bunny/common/service/config/RedisConfiguration.java
@@ -0,0 +1,98 @@
+package cn.bunny.common.service.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cache.CacheManager;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.stereotype.Component;
+
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * 设置Redis序列化
+ */
+@Component
+@Slf4j
+public class RedisConfiguration {
+ /**
+ * 使用StringRedisSerializer序列化为字符串
+ */
+ @Bean
+ public RedisTemplate redisTemplate(LettuceConnectionFactory connectionFactory) {
+ log.info("RedisConfiguration===>使用StringRedisSerializer序列化为字符串");
+
+ RedisTemplate redisTemplate = new RedisTemplate<>();
+ redisTemplate.setConnectionFactory(connectionFactory);
+ // 设置key序列化为string
+ redisTemplate.setKeySerializer(new StringRedisSerializer());
+ // 设置value序列化为JSON,使用GenericJackson2JsonRedisSerializer替换默认序列化
+ redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
+ redisTemplate.setHashKeySerializer(new StringRedisSerializer());
+ redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
+
+ return redisTemplate;
+ }
+
+ /**
+ * 解决cache(@Cacheable)把数据缓存到redis中的value是乱码问题
+ */
+ @Bean
+ @SuppressWarnings("all")
+ public CacheManager cacheManager(RedisConnectionFactory factory) {
+ log.info("RedisConfiguration===>解决cache(@Cacheable)把数据缓存到redis中的value是乱码问题");
+
+ // 配置序列化
+ RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
+ .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
+ .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jsonRedisSerializer()))
+ .entryTtl(Duration.ofDays(30));
+
+ return RedisCacheManager.builder(factory).cacheDefaults(config).build();
+ }
+
+ /**
+ * 指定的日期模式
+ */
+ public Jackson2JsonRedisSerializer