From 50a01b33093e5981e81ddd33d9424d4ded0459b0 Mon Sep 17 00:00:00 2001 From: bunny <1319900154@qq.com> Date: Mon, 1 Apr 2024 21:44:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=96=B0=E5=A2=9E):=20=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- .idea/dataSources.xml | 18 +++ .idea/uiDesigner.xml | 124 ++++++++++++++++++ .../java/com/atguigu/common/utils/MD5.java | 30 +++++ common/pom.xml | 6 + .../common/config/RedisConfiguration.java | 99 ++++++++++++++ ...gger2Config.java => WebKnife4jConfig.java} | 39 +----- .../common/properties/MinioProperties.java | 27 ++++ .../com/atguigu/ssyx/vo/acl/LoginInfoVo.java | 21 +++ .../java/com/atguigu/ssyx/vo/acl/LoginVo.java | 18 +++ pom.xml | 13 ++ .../ssyx/acl/ServiceAclApplication.java | 2 +- .../ssyx/acl/config/Knife4jConfig.java | 54 ++++++++ .../ssyx/acl/controller/IndexController.java | 28 +++- .../src/main/resources/application-dev.yml | 6 + .../src/main/resources/application.yml | 13 +- 16 files changed, 452 insertions(+), 50 deletions(-) create mode 100644 .idea/dataSources.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 common/common-util/src/main/java/com/atguigu/common/utils/MD5.java create mode 100644 common/service-util/src/main/java/com/atguigu/ssyx/common/config/RedisConfiguration.java rename common/service-util/src/main/java/com/atguigu/ssyx/common/config/{Swagger2Config.java => WebKnife4jConfig.java} (61%) create mode 100644 common/service-util/src/main/java/com/atguigu/ssyx/common/properties/MinioProperties.java create mode 100644 model/src/main/java/com/atguigu/ssyx/vo/acl/LoginInfoVo.java create mode 100644 model/src/main/java/com/atguigu/ssyx/vo/acl/LoginVo.java create mode 100644 service/service-acl/src/main/java/com/atguigu/ssyx/acl/config/Knife4jConfig.java diff --git a/.gitignore b/.gitignore index 5ff6309..2ebe1c7 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,6 @@ build/ .vscode/ ### Mac OS ### -.DS_Store \ No newline at end of file +.DS_Store + +logs \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..a57e5fc --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,18 @@ + + + + + mysql.8 + true + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://106.15.251.123:3305/shequ-acl?serverTimezone=GMT + + + + + + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/common-util/src/main/java/com/atguigu/common/utils/MD5.java b/common/common-util/src/main/java/com/atguigu/common/utils/MD5.java new file mode 100644 index 0000000..6f7230d --- /dev/null +++ b/common/common-util/src/main/java/com/atguigu/common/utils/MD5.java @@ -0,0 +1,30 @@ +package com.atguigu.common.utils; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + + +public final class MD5 { + public static String encrypt(String strSrc) { + try { + char[] hexChars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', + '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + byte[] bytes = strSrc.getBytes(); + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(bytes); + bytes = md.digest(); + int j = bytes.length; + char[] chars = new char[j * 2]; + int k = 0; + for (int i = 0; i < bytes.length; i++) { + byte b = bytes[i]; + chars[k++] = hexChars[b >>> 4 & 0xf]; + chars[k++] = hexChars[b & 0xf]; + } + return new String(chars); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + throw new RuntimeException("MD5加密出错!!+" + e); + } + } +} diff --git a/common/pom.xml b/common/pom.xml index f90885c..bff215d 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -50,5 +50,11 @@ org.springframework.cloud spring-cloud-starter-openfeign + + + + io.minio + minio + diff --git a/common/service-util/src/main/java/com/atguigu/ssyx/common/config/RedisConfiguration.java b/common/service-util/src/main/java/com/atguigu/ssyx/common/config/RedisConfiguration.java new file mode 100644 index 0000000..c3d6ca5 --- /dev/null +++ b/common/service-util/src/main/java/com/atguigu/ssyx/common/config/RedisConfiguration.java @@ -0,0 +1,99 @@ +package com.atguigu.ssyx.common.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.context.annotation.Configuration; +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 java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Configuration +@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是乱码问题"); + + StringRedisSerializer redisSerializer = new StringRedisSerializer(); + // 配置序列化 + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); + RedisCacheConfiguration redisCacheConfiguration = config + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jsonRedisSerializer())); + + RedisCacheManager cacheManager = RedisCacheManager.builder(factory) + .cacheDefaults(redisCacheConfiguration).build(); + return cacheManager; + } + + /** + * 指定的日期模式 + */ + public Jackson2JsonRedisSerializer jsonRedisSerializer() { + log.info("RedisConfiguration===>指定的日期模式"); + + Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class); + ObjectMapper mapper = new ObjectMapper(); + // 设置ObjectMapper访问权限 + mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + // 记录序列化之后的数据类型,方便反序列化 + mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); + // LocalDatetime序列化,默认不兼容jdk8日期序列化 + JavaTimeModule timeModule = new JavaTimeModule(); + timeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + timeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + + timeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + timeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + // 关闭默认的日期格式化方式,默认UTC日期格式 yyyy-MM-dd’T’HH:mm:ss.SSS + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + mapper.registerModule(timeModule); + + serializer.setObjectMapper(mapper); + return serializer; + } +} \ No newline at end of file diff --git a/common/service-util/src/main/java/com/atguigu/ssyx/common/config/Swagger2Config.java b/common/service-util/src/main/java/com/atguigu/ssyx/common/config/WebKnife4jConfig.java similarity index 61% rename from common/service-util/src/main/java/com/atguigu/ssyx/common/config/Swagger2Config.java rename to common/service-util/src/main/java/com/atguigu/ssyx/common/config/WebKnife4jConfig.java index 39d48b1..4d2ef87 100644 --- a/common/service-util/src/main/java/com/atguigu/ssyx/common/config/Swagger2Config.java +++ b/common/service-util/src/main/java/com/atguigu/ssyx/common/config/WebKnife4jConfig.java @@ -17,13 +17,9 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; import java.util.ArrayList; import java.util.List; -/** - * Swagger2配置信息 - */ @Configuration @EnableSwagger2WebMvc -public class Swagger2Config { - +public class WebKnife4jConfig { @Bean public Docket webApiConfig() { List pars = new ArrayList<>(); @@ -49,30 +45,6 @@ public class Swagger2Config { .globalOperationParameters(pars); } - @Bean - public Docket adminApiConfig() { - List pars = new ArrayList<>(); - ParameterBuilder tokenPar = new ParameterBuilder(); - tokenPar.name("adminId") - .description("用户token") - .defaultValue("1") - .modelRef(new ModelRef("string")) - .parameterType("header") - .required(false) - .build(); - pars.add(tokenPar.build()); - - return new Docket(DocumentationType.SWAGGER_2) - .groupName("adminApi") - .apiInfo(adminApiInfo()) - .select() - // 只显示admin路径下的页面 - .apis(RequestHandlerSelectors.basePackage("com.atguigu.ssyx")) - .paths(PathSelectors.regex("/admin/.*")) - .build() - .globalOperationParameters(pars); - } - private ApiInfo webApiInfo() { return new ApiInfoBuilder() .title("网站-API文档") @@ -81,13 +53,4 @@ public class Swagger2Config { .contact(new Contact("atguigu", "http://atguigu.com", "atguigu")) .build(); } - - private ApiInfo adminApiInfo() { - return new ApiInfoBuilder() - .title("后台管理系统-API文档") - .description("本文档描述了尚上优选后台系统服务接口定义") - .version("1.0") - .contact(new Contact("atguigu", "http://atguigu.com", "atguigu")) - .build(); - } } \ No newline at end of file diff --git a/common/service-util/src/main/java/com/atguigu/ssyx/common/properties/MinioProperties.java b/common/service-util/src/main/java/com/atguigu/ssyx/common/properties/MinioProperties.java new file mode 100644 index 0000000..9605787 --- /dev/null +++ b/common/service-util/src/main/java/com/atguigu/ssyx/common/properties/MinioProperties.java @@ -0,0 +1,27 @@ +package com.atguigu.ssyx.common.properties; + +import io.minio.MinioClient; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "bunny.minio") +@ConditionalOnProperty(name = "bunny.minio.bucket-name")// 当属性有值时这个配置才生效 +@Data +@Slf4j +public class MinioProperties { + private String endpointUrl; + private String accessKey; + private String secretKey; + private String bucketName; + + @Bean + public MinioClient minioClient() { + log.info("注册MinioClient..."); + return MinioClient.builder().endpoint(endpointUrl).credentials(accessKey, secretKey).build(); + } +} diff --git a/model/src/main/java/com/atguigu/ssyx/vo/acl/LoginInfoVo.java b/model/src/main/java/com/atguigu/ssyx/vo/acl/LoginInfoVo.java new file mode 100644 index 0000000..e66ce22 --- /dev/null +++ b/model/src/main/java/com/atguigu/ssyx/vo/acl/LoginInfoVo.java @@ -0,0 +1,21 @@ +package com.atguigu.ssyx.vo.acl; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(description = "返回用户信息") +public class LoginInfoVo { + @ApiModelProperty(value = "用户名") + private String name; + + @ApiModelProperty(value = "头像") + private String avatar; +} diff --git a/model/src/main/java/com/atguigu/ssyx/vo/acl/LoginVo.java b/model/src/main/java/com/atguigu/ssyx/vo/acl/LoginVo.java new file mode 100644 index 0000000..e7a00b2 --- /dev/null +++ b/model/src/main/java/com/atguigu/ssyx/vo/acl/LoginVo.java @@ -0,0 +1,18 @@ +package com.atguigu.ssyx.vo.acl; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(description = "登录成功后返回") +public class LoginVo { + @ApiModelProperty(value = "token") + private String token; +} diff --git a/pom.xml b/pom.xml index c927133..c89e45a 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,7 @@ 2.0.8 2.10.1 2.3.0 + 8.4.3 @@ -108,6 +109,18 @@ xxl-job-core ${xxl-job.version} + + + io.minio + minio + ${minio.version} + + + + com.squareup.okhttp3 + okhttp + 4.9.3 + diff --git a/service/service-acl/src/main/java/com/atguigu/ssyx/acl/ServiceAclApplication.java b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/ServiceAclApplication.java index 676c091..57c62a3 100644 --- a/service/service-acl/src/main/java/com/atguigu/ssyx/acl/ServiceAclApplication.java +++ b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/ServiceAclApplication.java @@ -6,7 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication -@ComponentScan("com.atguigu.ssyx.common") +@ComponentScan(basePackages = {"com.atguigu.ssyx", "com.atguigu.ssyx.acl"}) @MapperScan("com.atguigu.ssyx.*.mapper") public class ServiceAclApplication { public static void main(String[] args) { diff --git a/service/service-acl/src/main/java/com/atguigu/ssyx/acl/config/Knife4jConfig.java b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/config/Knife4jConfig.java new file mode 100644 index 0000000..94da04c --- /dev/null +++ b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/config/Knife4jConfig.java @@ -0,0 +1,54 @@ +package com.atguigu.ssyx.acl.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.ParameterBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.schema.ModelRef; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.service.Parameter; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; + +import java.util.ArrayList; +import java.util.List; + +@Configuration +@EnableSwagger2WebMvc +public class Knife4jConfig { + @Bean + public Docket adminApiConfig() { + List pars = new ArrayList<>(); + ParameterBuilder tokenPar = new ParameterBuilder(); + tokenPar.name("adminId") + .description("用户token") + .defaultValue("1") + .modelRef(new ModelRef("string")) + .parameterType("header") + .required(false) + .build(); + pars.add(tokenPar.build()); + + return new Docket(DocumentationType.SWAGGER_2) + .groupName("adminApi") + .apiInfo(adminApiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("com.atguigu.ssyx.acl.controller")) + .paths(PathSelectors.regex("/admin/.*")) + .build() + .globalOperationParameters(pars); + } + + private ApiInfo adminApiInfo() { + return new ApiInfoBuilder() + .title("后台管理系统-API文档") + .description("本文档描述了尚上优选后台系统服务接口定义") + .version("1.0") + .contact(new Contact("atguigu", "http://atguigu.com", "atguigu")) + .build(); + } +} \ No newline at end of file diff --git a/service/service-acl/src/main/java/com/atguigu/ssyx/acl/controller/IndexController.java b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/controller/IndexController.java index d072253..459c039 100644 --- a/service/service-acl/src/main/java/com/atguigu/ssyx/acl/controller/IndexController.java +++ b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/controller/IndexController.java @@ -1,22 +1,36 @@ package com.atguigu.ssyx.acl.controller; import com.atguigu.ssyx.common.result.Result; +import com.atguigu.ssyx.vo.acl.LoginInfoVo; +import com.atguigu.ssyx.vo.acl.LoginVo; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.HashMap; -import java.util.Map; - @Api(tags = "登录相关管理") @RestController @RequestMapping("/admin/acl/index") public class IndexController { + @ApiOperation(value = "请求登陆的login") @PostMapping("login") - public Result> login() { - Map map = new HashMap<>(); - map.put("token", "admin-token"); - return Result.success(map); + public Result login() { + LoginVo vo = LoginVo.builder().token("admin-token").build(); + return Result.success(vo); + } + + @ApiOperation(value = "获取用户信息") + @GetMapping("info") + public Result info() { + LoginInfoVo vo = LoginInfoVo.builder().name("admin").avatar("").build(); + return Result.success(vo); + } + + @ApiOperation(value = "退出登录") + @PostMapping("logout") + public Result logout() { + return Result.success(); } } \ No newline at end of file diff --git a/service/service-acl/src/main/resources/application-dev.yml b/service/service-acl/src/main/resources/application-dev.yml index fbcd6bf..ce202f2 100644 --- a/service/service-acl/src/main/resources/application-dev.yml +++ b/service/service-acl/src/main/resources/application-dev.yml @@ -20,6 +20,12 @@ bunny: database: 2 password: "02120212" + minio: + endpointUrl: "http://129.211.31.58:9000" + bucket-name: ssyx + accessKey: bunny + secretKey: "02120212" + logging: level: com.atguigu.ssyx.acl.mapper: debug diff --git a/service/service-acl/src/main/resources/application.yml b/service/service-acl/src/main/resources/application.yml index 0c1c95a..53c407d 100644 --- a/service/service-acl/src/main/resources/application.yml +++ b/service/service-acl/src/main/resources/application.yml @@ -38,10 +38,17 @@ mybatis-plus: # db-config: # 设置表名前缀,不用在每个tableName添加前缀 # table-prefix: t_ - # 全局配置主键值方式 - # id-type: assign_id + # 全局配置主键值方式 + # id-type: assign_id # 指定逻辑删除-未删除 # logic-not-delete-value: 0 # 未删除默认为0 # 指定逻辑删除-删除 # logic-delete-value: 1 # 删除 - # logic-delete-field: deleted # 全局配置逻辑删除 \ No newline at end of file + # logic-delete-field: deleted # 全局配置逻辑删除 + +bunny: + minio: + endpointUrl: ${bunny.minio.endpointUrl} + accessKey: ${bunny.minio.accessKey} + secretKey: ${bunny.minio.secretKey} + bucket-name: ${bunny.minio.bucket-name} \ No newline at end of file