├── .gitignore
├── LICENSE
├── README.md
├── java_navigation.sql
├── pom.xml
└── src
├── main
├── java
│ └── com
│ │ └── ujuji
│ │ └── navigation
│ │ ├── NavigationApplication.java
│ │ ├── annotation
│ │ └── FrequencyLimit.java
│ │ ├── config
│ │ ├── AsyncConfig.java
│ │ ├── CorsDataConfig.java
│ │ ├── MybatisPlusConfig.java
│ │ ├── ObjectMapperConfig.java
│ │ ├── RedisConfig.java
│ │ ├── SecurityConfig.java
│ │ └── WebConfig.java
│ │ ├── controller
│ │ ├── BoxController.java
│ │ ├── IndexController.java
│ │ ├── JobController.java
│ │ ├── LeaveMsgController.java
│ │ ├── LinkController.java
│ │ ├── NoticeController.java
│ │ ├── PublicController.java
│ │ ├── SearchSiteController.java
│ │ ├── SiteConfigController.java
│ │ ├── UserController.java
│ │ ├── admin
│ │ │ ├── AdminBoxController.java
│ │ │ ├── AdminCardCodeController.java
│ │ │ ├── AdminController.java
│ │ │ ├── AdminGlobalSettingController.java
│ │ │ ├── AdminLinkController.java
│ │ │ ├── AdminMsgController.java
│ │ │ └── AdminUserController.java
│ │ └── common
│ │ │ └── ErrorController.java
│ │ ├── core
│ │ └── Constants.java
│ │ ├── exception
│ │ └── MyException.java
│ │ ├── filter
│ │ ├── JwtAuthenticationTokenFilter.java
│ │ └── JwtLoginFilter.java
│ │ ├── handler
│ │ ├── MyAccessDeniedHandler.java
│ │ ├── MyExceptionHandler.java
│ │ └── MyMetaObjectHandler.java
│ │ ├── interceptor
│ │ └── FrequentInterceptor.java
│ │ ├── mapper
│ │ ├── BoxMapper.java
│ │ ├── CardCodeMapper.java
│ │ ├── GlobalSettingMapper.java
│ │ ├── LeaveMsgMapper.java
│ │ ├── LinkMapper.java
│ │ ├── NoticeMapper.java
│ │ ├── SearchSiteMapper.java
│ │ ├── SiteConfigMapper.java
│ │ └── UserMapper.java
│ │ ├── model
│ │ ├── WeatherResp.java
│ │ ├── dto
│ │ │ ├── BoxDto.java
│ │ │ ├── ForgotPassDto.java
│ │ │ ├── ImportBoxDto.java
│ │ │ ├── InsertCardCodeDto.java
│ │ │ ├── LeaveMsgDto.java
│ │ │ ├── LinkDto.java
│ │ │ ├── PageDto.java
│ │ │ ├── ReplyMsgDto.java
│ │ │ ├── SearchDto.java
│ │ │ ├── SearchLinkDto.java
│ │ │ ├── UpdatePassWithCodeDto.java
│ │ │ ├── UserDto.java
│ │ │ └── VerifyCodeDto.java
│ │ ├── entity
│ │ │ ├── BaseEntity.java
│ │ │ ├── BoxEntity.java
│ │ │ ├── CardCodeEntity.java
│ │ │ ├── GlobalSettingEntity.java
│ │ │ ├── LeaveMsgEntity.java
│ │ │ ├── LinkEntity.java
│ │ │ ├── NoticeEntity.java
│ │ │ ├── SearchSiteEntity.java
│ │ │ ├── SiteConfigEntity.java
│ │ │ └── UserEntity.java
│ │ └── vo
│ │ │ ├── BoxVo.java
│ │ │ └── UserVo.java
│ │ ├── service
│ │ ├── AdminBoxService.java
│ │ ├── AdminLinkService.java
│ │ ├── AdminMsgService.java
│ │ ├── AdminUserService.java
│ │ ├── BoxService.java
│ │ ├── CardCodeService.java
│ │ ├── CommonService.java
│ │ ├── EmailService.java
│ │ ├── GlobalSettingService.java
│ │ ├── LeaveMsgService.java
│ │ ├── LinkService.java
│ │ ├── NoticeService.java
│ │ ├── SearchSiteService.java
│ │ ├── SiteConfigService.java
│ │ ├── UserService.java
│ │ └── impl
│ │ │ ├── AdminBoxServiceImpl.java
│ │ │ ├── AdminLinkServiceImpl.java
│ │ │ ├── AdminMsgServiceImpl.java
│ │ │ ├── AdminUserServiceImpl.java
│ │ │ ├── BoxServiceImpl.java
│ │ │ ├── CardCodeServiceImpl.java
│ │ │ ├── CommonServiceImpl.java
│ │ │ ├── EmailServiceImpl.java
│ │ │ ├── GlobalSettingServiceImpl.java
│ │ │ ├── LeaveMsgServiceImpl.java
│ │ │ ├── LinkServiceImpl.java
│ │ │ ├── NoticeServiceImpl.java
│ │ │ ├── SearchSiteServiceImpl.java
│ │ │ ├── SiteConfigServiceImpl.java
│ │ │ └── UserServiceImpl.java
│ │ └── util
│ │ ├── AppResult.java
│ │ ├── AppResultBuilder.java
│ │ ├── AuthInfo.java
│ │ ├── HttpUtils.java
│ │ ├── JwtUtils.java
│ │ ├── MyBeanUtils.java
│ │ ├── MyUtils.java
│ │ ├── RedisUtils.java
│ │ ├── ResultCode.java
│ │ ├── SnowflakeIdUtils.java
│ │ ├── VerifyCodeCheck.java
│ │ └── VerifyCodeUtils.java
└── resources
│ ├── application.yml
│ └── http
│ ├── Admin.http
│ ├── adminBox.http
│ ├── adminCardCode.http
│ ├── adminLink.http
│ ├── adminMsg.http
│ ├── adminSetting.http
│ ├── adminUser.http
│ ├── box.http
│ ├── code.http
│ ├── http-client.private.env.json
│ ├── leaveMsg.http
│ ├── link.http
│ ├── notice.http
│ ├── public.http
│ ├── searchSite.http
│ ├── siteConfig.http
│ ├── test.http
│ └── user.http
└── test
└── java
└── com
└── ujuji
└── navigation
├── NavigationApplicationTests.java
├── service
├── UserServiceImplTest.java
└── impl
│ └── EmailServiceImplTest.java
└── test
└── Test.java
/.gitignore:
--------------------------------------------------------------------------------
1 | HELP.md
2 | target/
3 | !.mvn/wrapper/maven-wrapper.jar
4 | !**/src/main/**
5 | !**/src/test/**
6 |
7 | ### STS ###
8 | .apt_generated
9 | .classpath
10 | .factorypath
11 | .project
12 | .settings
13 | .springBeans
14 | .sts4-cache
15 |
16 | ### IntelliJ IDEA ###
17 | .idea
18 | *.iws
19 | *.iml
20 | *.ipr
21 |
22 | ### NetBeans ###
23 | /nbproject/private/
24 | /nbbuild/
25 | /dist/
26 | /nbdist/
27 | /.nb-gradle/
28 | build/
29 |
30 | ### VS Code ###
31 | .vscode/
32 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ### 优聚集
2 |
3 | 2020年初,疫情肆虐,想着以后的规划,结果是毫无规划,可能我就是随波逐流、活在当下的人。
4 |
5 |
6 |
7 | 不管怎么说,我也希望以后能自由职业且能不饿肚子,为此,为了锻炼技能,写了优聚集这个前后端分离的项目。
8 |
9 |
10 |
11 | 这是第一次写较大规模的Vue.js 应用
12 |
13 | 这也是第一次写较大规模的SpringBoot应用
14 |
15 |
16 |
17 | 第一次写,肯定就是巨难看和维护,这点我有自知之明,但是我希望你们不要说出来。我自己知道就行。所以,于2021年我完全从零开始重构了优聚集,前端虽也是Vue.js,但是也是完全重写了。后端用golang重构。不得不说,golang没有像springboot这类似的大统一框架,对于某些方面来说也是好事,我可以完全决定我的后台应用怎么架构。而不是被springboot规定死了:你就该在这个目录写这个东西…
18 |
19 |
20 |
21 | ### 仓库
22 |
23 | 前端仓库(Vue.js):[https://github.com/Xwudao/ujuji_frontend](https://github.com/Xwudao/ujuji_frontend)
24 |
25 | 后端仓库(SpringBoot):[https://github.com/Xwudao/ujuji_backend](https://github.com/Xwudao/ujuji_backend)
26 |
27 |
28 |
29 | ### 声明
30 |
31 | 1、
32 |
33 | 尽管我已经仔细检查过代码,但是不可避免的可能代码中依旧有一些我个人的私密信息,尤其是诸如邮箱密码之类的,如果被发现了,那么请告知我,或者最起码请不要用它干一些危险的事情,谢谢合作。
34 |
35 | 2、
36 |
37 | 因为本套代码之初并不是为了开源而写的,所以对于一些测试中的敏感信息我都是直接写死在代码中的,所以如果您发现了一些私密信息请告知我。
38 |
39 |
40 |
41 | 3、
42 |
43 | 本套代码是基于SpringBoot 2.3.0.RELEASE
44 |
45 | 在当时,应该是最新的版本,但是在2021年来说,可能也许有点旧了,当然,不是很旧。
46 |
47 | 这套代码和现在的优聚集 [https://ujuji.com/](https://ujuji.com/) 有很大区别,因为现在的优聚集网站时是我完全在2021年通过golang重构了的。**所以当您发现这和优聚集https://ujuji.com/ 差别很大时,很正常,因为现有优聚集是重构之后的版本。**
48 |
49 |
50 |
51 | 4、
52 |
53 | 如果您想自己部署优聚集前后端项目,最起码得有以下知识点:
54 |
55 | - 数据库
56 | - Java
57 | - Maven
58 | - SpringBoot(如果不想修改增加功能,也就无伤大雅)
59 | - Vue.js
60 |
61 |
62 |
63 | ### 构建
64 |
65 | 1、修改配置文件
66 |
67 | `src\main\resources\application.yml`
68 |
69 | - 修改服务端口
70 |
71 | ```yml
72 | server:
73 | port: 4037
74 | ```
75 |
76 | - 修改邮件服务
77 |
78 | ```yml
79 | mail:
80 | host: smtp.domain.com
81 | password: 123456@test
82 | username: ujuji@domain.com
83 | port: 25
84 | ```
85 |
86 | - 修改数据库信息
87 |
88 | sql文件是:`java_navigation.sql`
89 |
90 | 将其导入数据库并修改如下信息:
91 |
92 | ```yml
93 | spring:
94 | profiles: dev
95 | datasource:
96 | driver-class-name: com.mysql.cj.jdbc.Driver
97 | username: root
98 | password: root
99 | url: jdbc:mysql://localhost:3306/java_navigation?useSSL=false&serverTimezone=UTC
100 | artemis:
101 | port: 4029
102 | ```
103 |
104 | - Redis信息修改:
105 |
106 | ```yml
107 | redis:
108 | host: 127.0.0.1
109 | password:
110 | port: 6379
111 | lettuce:
112 | pool:
113 | max-active: 8 #最大连接数
114 | max-wait: -1 # 表示未限制
115 | max-idle: 8 # 接池中的最大空闲连接
116 | min-idle: 0 # 最小空闲链接
117 | timeout: 5000 # 超时时间
118 | cache:
119 | redis:
120 | time-to-live: 1m
121 | ```
122 |
123 | - jwt的`secret`修改:
124 |
125 | ```yml
126 | jwt:
127 | secret: 21312142131232
128 | expiration: 86400000
129 | header: Authorization
130 | prefix: "Bearer "
131 | ```
132 |
133 | - 跨域设置:
134 |
135 | 当在生产环境中使用是,您还需要修改跨域(当然,如果是开放子站注册的话,下面这个就无所谓了,所以在代码中src\main\java\com\ujuji\navigation\config\WebConfig.java 放行了所有origin)
136 |
137 | ```yml
138 | cors:
139 | origins:
140 | - http://localhost:8080
141 | ```
142 |
143 |
144 |
145 | 2、当基本配置修改完后,就可以构建了:
146 |
147 | 执行(需要maven环境)
148 |
149 | ```bash
150 | mvn clean package
151 | ```
152 |
153 | 成功后,会输出:
154 |
155 | ```ini
156 | [INFO] ------------------------------------------------------------------------
157 | [INFO] BUILD SUCCESS
158 | [INFO] ------------------------------------------------------------------------
159 | [INFO] Total time: 11.233 s
160 | [INFO] Finished at: 2021-02-06T10:08:10+08:00
161 | [INFO] ------------------------------------------------------------------------
162 | ```
163 |
164 | 构建出的产物是:
165 |
166 | `target\navigation-1.0.0.jar`
167 |
168 | 简单来说把他放到服务器中执行 `java -jar navigation-1.0.0.jar`就行
169 |
170 |
171 |
172 | ****
173 |
174 |
175 |
176 | 好了,基本配置的就完了,**懂Java会Spring不用我说都知道怎么弄,不会的,我写再多也是一脸懵**
177 |
178 |
179 |
180 | 之后的通过nginx反向代理到80端口之类的就不多讲了,如果有哪位大神愿意出一个详细的教程,有视频更好。欢迎@我
181 |
182 |
183 |
184 | ### 感谢
185 |
186 |
187 |
188 | 感谢Jetbrains 这家伟大的IDE开发公司,他们的全家桶极其好用
189 |
190 | [https://jetbrains.com/](https://jetbrains.com/)
191 |
192 |
193 |
194 | ### 协议
195 |
196 | 使用本代码请保留前端界面到 https://ujuji.com 的链接
197 |
198 | Apache License 2.0
199 |
200 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | org.springframework.boot
7 | spring-boot-starter-parent
8 | 2.3.0.RELEASE
9 |
10 |
11 | com.ujuji
12 | navigation
13 | 1.0.0
14 | navigation
15 | navigation by springboot
16 |
17 |
18 | 1.8
19 |
20 |
21 |
22 |
23 | org.springframework.boot
24 | spring-boot-starter-security
25 |
26 |
27 | org.springframework.boot
28 | spring-boot-starter-web
29 |
30 |
31 | com.squareup.okhttp3
32 | okhttp
33 |
34 |
35 |
36 | org.springframework.boot
37 | spring-boot-devtools
38 | runtime
39 | true
40 |
41 |
42 | mysql
43 | mysql-connector-java
44 | runtime
45 |
46 |
47 | org.springframework.boot
48 | spring-boot-configuration-processor
49 | true
50 |
51 |
52 | org.projectlombok
53 | lombok
54 | true
55 |
56 |
57 | org.springframework.boot
58 | spring-boot-starter-test
59 | test
60 |
61 |
62 | org.junit.vintage
63 | junit-vintage-engine
64 |
65 |
66 |
67 |
68 |
69 | org.springframework.boot
70 | spring-boot-starter-cache
71 |
72 |
73 | org.springframework.boot
74 | spring-boot-starter-data-redis
75 |
76 |
77 |
78 | org.springframework.boot
79 | spring-boot-starter-mail
80 |
81 |
82 |
83 | org.apache.commons
84 | commons-pool2
85 |
86 |
87 |
88 | com.fasterxml.jackson.datatype
89 | jackson-datatype-jsr310
90 |
91 |
92 |
93 | com.github.whvcse
94 | easy-captcha
95 | 1.6.2
96 |
97 |
98 | org.springframework.security
99 | spring-security-test
100 | test
101 |
102 |
103 | io.jsonwebtoken
104 | jjwt
105 | 0.9.1
106 |
107 |
108 | com.baomidou
109 | mybatis-plus-boot-starter
110 | 3.3.1
111 |
112 |
113 | org.apache.commons
114 | commons-lang3
115 |
116 |
117 | org.springframework.boot
118 | spring-boot-starter-validation
119 |
120 |
121 |
122 |
123 |
124 |
125 | org.springframework.boot
126 | spring-boot-maven-plugin
127 |
128 |
129 |
130 |
131 |
132 |
--------------------------------------------------------------------------------
/src/main/java/com/ujuji/navigation/NavigationApplication.java:
--------------------------------------------------------------------------------
1 | package com.ujuji.navigation;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class NavigationApplication {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(NavigationApplication.class, args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/ujuji/navigation/annotation/FrequencyLimit.java:
--------------------------------------------------------------------------------
1 | package com.ujuji.navigation.annotation;
2 |
3 | import java.lang.annotation.*;
4 |
5 | @Documented
6 | @Inherited
7 | @Target(ElementType.METHOD)
8 | @Retention(RetentionPolicy.RUNTIME)
9 | public @interface FrequencyLimit {
10 | int value() default 10;
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/com/ujuji/navigation/config/AsyncConfig.java:
--------------------------------------------------------------------------------
1 | package com.ujuji.navigation.config;
2 |
3 | import org.springframework.context.annotation.Configuration;
4 | import org.springframework.scheduling.annotation.AsyncConfigurer;
5 | import org.springframework.scheduling.annotation.EnableAsync;
6 | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
7 |
8 | import java.util.concurrent.Executor;
9 | import java.util.concurrent.ThreadPoolExecutor;
10 |
11 | @Configuration
12 | @EnableAsync
13 | public class AsyncConfig implements AsyncConfigurer {
14 |
15 | @Override
16 | public Executor getAsyncExecutor() {
17 | ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
18 | // 线程池维护线程的最少数量
19 | taskExecutor.setCorePoolSize(10);
20 | // 线程池维护线程的最大数量
21 | taskExecutor.setMaxPoolSize(50);
22 | // 缓存队列
23 | taskExecutor.setQueueCapacity(99999);
24 | // 对拒绝task的处理策略
25 | //(1) 默认的ThreadPoolExecutor.AbortPolicy 处理程序遭到拒绝将抛出运行时RejectedExecutionException;
26 | //(2) ThreadPoolExecutor.CallerRunsPolicy 线程调用运行该任务的 execute 本身。此策略提供简单的反馈控制机制,能够减缓新任务的提交速度
27 | //(3) ThreadPoolExecutor.DiscardPolicy 不能执行的任务将被删除;
28 | //(4) ThreadPoolExecutor.DiscardOldestPolicy 如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)
29 | taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
30 | // 线程名前缀,方便排查问题
31 | taskExecutor.setThreadNamePrefix("order-send-thread-");
32 | // 注意一定要初始化
33 | taskExecutor.initialize();
34 |
35 | return taskExecutor;
36 | }
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/src/main/java/com/ujuji/navigation/config/CorsDataConfig.java:
--------------------------------------------------------------------------------
1 | package com.ujuji.navigation.config;
2 |
3 | import lombok.Data;
4 | import org.springframework.boot.context.properties.ConfigurationProperties;
5 | import org.springframework.context.annotation.Configuration;
6 |
7 | import java.util.List;
8 |
9 | @Configuration
10 | @ConfigurationProperties(prefix = "cors")
11 | @Data
12 | public class CorsDataConfig {
13 | List origins;
14 | List headers;
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/com/ujuji/navigation/config/MybatisPlusConfig.java:
--------------------------------------------------------------------------------
1 | package com.ujuji.navigation.config;
2 |
3 | import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
4 | import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
5 | import com.ujuji.navigation.handler.MyMetaObjectHandler;
6 | import org.mybatis.spring.annotation.MapperScan;
7 | import org.springframework.context.annotation.Bean;
8 | import org.springframework.context.annotation.Configuration;
9 |
10 | @Configuration
11 | @MapperScan("com.ujuji.navigation.mapper")
12 | public class MybatisPlusConfig {
13 |
14 | @Bean
15 | public MyMetaObjectHandler myMetaObjectHandler() {
16 | return new MyMetaObjectHandler();
17 | }
18 |
19 | @Bean
20 | public PaginationInterceptor paginationInterceptor() {
21 | PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
22 | // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
23 | paginationInterceptor.setOverflow(true);
24 | // 设置最大单页限制数量,默认 500 条,-1 不受限制
25 | paginationInterceptor.setLimit(100);
26 | // 开启 count 的 join 优化,只针对部分 left join
27 | paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
28 | return paginationInterceptor;
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/java/com/ujuji/navigation/config/ObjectMapperConfig.java:
--------------------------------------------------------------------------------
1 | package com.ujuji.navigation.config;
2 |
3 | import com.fasterxml.jackson.annotation.JsonAutoDetect;
4 | import com.fasterxml.jackson.annotation.PropertyAccessor;
5 | import com.fasterxml.jackson.databind.ObjectMapper;
6 | import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
7 | import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
8 | import lombok.extern.slf4j.Slf4j;
9 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
10 | import org.springframework.context.annotation.Bean;
11 | import org.springframework.context.annotation.Configuration;
12 | import org.springframework.context.annotation.Primary;
13 |
14 | import java.time.LocalDateTime;
15 |
16 | @Configuration
17 | @Slf4j
18 | public class ObjectMapperConfig {
19 | @Bean
20 | @Primary
21 | @ConditionalOnMissingBean(ObjectMapper.class)
22 | public ObjectMapper objectMapper() {
23 | //注册时间处理Module,处理LocalDateTime等序列化问题
24 | ObjectMapper mapper = new ObjectMapper();
25 | JavaTimeModule javaTimeModule = new JavaTimeModule();
26 | javaTimeModule.addSerializer(LocalDateTime.class, new RedisConfig.LocalDateTimeSerializer());
27 | javaTimeModule.addDeserializer(LocalDateTime.class, new RedisConfig.LocalDateTimeDeserializer());
28 | mapper.registerModule(javaTimeModule);
29 |
30 |
31 | // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
32 | mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
33 | // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
34 | mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
35 | return mapper;
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/main/java/com/ujuji/navigation/config/RedisConfig.java:
--------------------------------------------------------------------------------
1 | package com.ujuji.navigation.config;
2 |
3 | import com.fasterxml.jackson.core.JsonGenerator;
4 | import com.fasterxml.jackson.core.JsonParser;
5 | import com.fasterxml.jackson.core.JsonProcessingException;
6 | import com.fasterxml.jackson.databind.*;
7 | import org.springframework.beans.factory.annotation.Value;
8 | import org.springframework.cache.CacheManager;
9 | import org.springframework.cache.annotation.CachingConfigurerSupport;
10 | import org.springframework.cache.annotation.EnableCaching;
11 | import org.springframework.context.annotation.Bean;
12 | import org.springframework.context.annotation.Configuration;
13 | import org.springframework.data.redis.cache.RedisCacheConfiguration;
14 | import org.springframework.data.redis.cache.RedisCacheManager;
15 | import org.springframework.data.redis.connection.RedisConnectionFactory;
16 | import org.springframework.data.redis.core.RedisTemplate;
17 | import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
18 | import org.springframework.data.redis.serializer.RedisSerializationContext;
19 | import org.springframework.data.redis.serializer.RedisSerializer;
20 | import org.springframework.data.redis.serializer.StringRedisSerializer;
21 |
22 | import javax.annotation.Resource;
23 | import java.io.IOException;
24 | import java.time.Duration;
25 | import java.time.LocalDateTime;
26 | import java.time.ZoneOffset;
27 |
28 | @Configuration
29 | @EnableCaching
30 | public class RedisConfig extends CachingConfigurerSupport {
31 |
32 | @Value("${spring.cache.redis.time-to-live}")
33 | private final Duration timeToLive = Duration.ZERO;
34 |
35 | @Resource
36 | ObjectMapper objectMapper;
37 |
38 | /**
39 | * 配置Jackson2JsonRedisSerializer序列化策略
40 | */
41 | private Jackson2JsonRedisSerializer