{"id":15180990,"url":"https://github.com/vaulka/java-enhancement-kit","last_synced_at":"2026-03-17T23:38:06.452Z","repository":{"id":37411264,"uuid":"459823786","full_name":"vaulka/java-enhancement-kit","owner":"vaulka","description":"Java 增强套件","archived":true,"fork":false,"pushed_at":"2022-10-28T02:04:15.000Z","size":5286,"stargazers_count":8,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-01-14T03:48:42.318Z","etag":null,"topics":["java","spring-boot","spring-cloud"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vaulka.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-02-16T02:28:03.000Z","updated_at":"2023-06-26T03:01:55.000Z","dependencies_parsed_at":"2022-08-08T20:15:47.475Z","dependency_job_id":null,"html_url":"https://github.com/vaulka/java-enhancement-kit","commit_stats":null,"previous_names":["vaulka/java-enhancement-kit","jarvispongsky/java-enhancement-kit","jarvispongsky/spring-cloud-enhancement-kit"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/vaulka/java-enhancement-kit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaulka%2Fjava-enhancement-kit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaulka%2Fjava-enhancement-kit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaulka%2Fjava-enhancement-kit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaulka%2Fjava-enhancement-kit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vaulka","download_url":"https://codeload.github.com/vaulka/java-enhancement-kit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vaulka%2Fjava-enhancement-kit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30635280,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T22:38:22.569Z","status":"ssl_error","status_checked_at":"2026-03-17T22:38:11.804Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","spring-boot","spring-cloud"],"created_at":"2024-09-27T17:00:26.145Z","updated_at":"2026-03-17T23:38:06.431Z","avatar_url":"https://github.com/vaulka.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/JarvisPongSky/java-enhancement-kit\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\n        \u003cimg width=\"100\" src=\"https://www.pongsky.com/upload/2021/04/origin-logo.1-fc8493fcd5f449be9d87c141c1a93ac9.png\" alt=\"Spring logo\" /\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp style=\"text-align:center\"\u003e\u003cb\u003eJava 增强套件\u003c/b\u003e 旨在减少重复造轮子以及封装一些实用功能，让开发者专注于业务，提高工作效率，值得一试。\u003c/p\u003e\n\n# 包含组件\n\n## kit-captcha 验证码模块\n\n### captcha-input-char 输入型字符 字符验证码模块\n\n|模块|介绍|\n|---|---|\n|[captcha-input-char-utils](kit-captcha/captcha-input-char/captcha-input-char-utils/README.md)|输入型字符 验证码 Utils 模块|\n|[spring-boot-starter-captcha-input-char](kit-captcha/captcha-input-char/spring-boot-starter-captcha-input-char/README.md)|输入型字符 验证码 Spring Boot Starter 模块|\n\n### captcha-input-math 输入型算数 字符验证码模块\n\n|模块|介绍|\n|---|---|\n|[captcha-input-math-utils](kit-captcha/captcha-input-math/captcha-input-math-utils/README.md)|输入型算数 验证码 Utils 模块|\n|[spring-boot-starter-captcha-input-math](kit-captcha/captcha-input-math/spring-boot-starter-captcha-input-math/README.md)|输入型算数 验证码 Spring Boot Starter 模块|\n\n## kit-desensitization 数据脱敏模块\n\n|模块|介绍|\n|---|---|\n|[desensitization-annotation](kit-desensitization/desensitization-annotation/README.md)|数据脱敏 Annotation 模块|\n|[desensitization-utils](kit-desensitization/desensitization-utils/README.md)|数据脱敏 Utils 模块|\n|[spring-boot-starter-desensitization](kit-desensitization/spring-boot-starter-desensitization/README.md)|数据脱敏 Spring Boot Starter 模块|\n\n## kit-doc 文档模块\n\n### springdoc SringDoc 模块\n\n|模块|介绍|\n|---|---|\n|[spring-boot-springdoc-common](kit-doc/springdoc/spring-boot-springdoc-common/README.md)|SpringDoc Common Spring Boot 模块|\n|[spring-boot-starter-springdoc](kit-doc/springdoc/spring-boot-starter-springdoc/README.md)|SpringDoc Spring Boot Starter 模块|\n|[spring-boot-starter-springdoc-knife4j](kit-doc/springdoc/spring-boot-starter-springdoc-knife4j/README.md)|SpringDoc Knife4j Spring Boot Starter 模块|\n|[spring-boot-starter-webflux-springdoc](kit-doc/springdoc/spring-boot-starter-webflux-springdoc/README.md)|WebFlux SpringDoc Spring Boot Starter 模块|\n|[spring-boot-starter-webflux-springdoc-knife4j](kit-doc/springdoc/spring-boot-starter-webflux-springdoc-knife4j/README.md)|WebFlux SpringDoc Knife4j Spring Boot Starter 模块|\n\n### springfox SpringFox 模块\n\n|模块|介绍|\n|---|---|\n|[spring-boot-starter-springfox](kit-doc/springfox/spring-boot-starter-springfox/README.md)|SpringDoc Spring Boot Starter 模块|\n|[spring-boot-starter-springfox-knife4j](kit-doc/springfox/spring-boot-starter-springfox-knife4j/README.md)|SpringDoc Knife4j Spring Boot Starter 模块|\n\n## kit-excel 导入/导出 Excel 模块\n\n|模块|介绍|\n|---|---|\n|[excel-utils](kit-excel/excel-utils/README.md)|Excel Utils 模块|\n|[spring-boot-starter-excel](kit-excel/spring-boot-starter-excel/README.md)|Excel Spring Boot Starter 模块|\n\n## kit-ip IP 模块\n\n|模块|介绍|\n|---|---|\n|[spring-boot-starter-ip](kit-ip/spring-boot-starter-ip/README.md)|IP Spring Boot Starter 模块|\n\n## kit-sms 短信模块\n\n### aliyun-sms 阿里云短信模块\n\n|模块|介绍|\n|---|---|\n|[aliyun-sms-utils](kit-sms/aliyun-sms/aliyun-sms-utils/README.md)|阿里云短信 Utils 模块|\n|[spring-boot-starter-aliyun-sms](kit-sms/aliyun-sms/spring-boot-starter-aliyun-sms/README.md)|阿里云短信 Spring Boot Starter 模块|\n\n### tencent-sms 腾讯云短信模块\n\n|模块|介绍|\n|---|---|\n|[tencent-sms-utils](kit-sms/tencent-sms/tencent-sms-utils/README.md)|腾讯云短信 Utils 模块|\n|[spring-boot-starter-tencent-sms](kit-sms/tencent-sms/spring-boot-starter-tencent-sms/README.md)|腾讯云短信 Spring Boot Starter 模块|\n\n## kit-spring-boot Spring Boot 增强模块\n\n|模块|介绍|\n|---|---|\n|[spring-boot-starter-cache-redis](kit-spring-boot/spring-boot-starter-cache-redis/README.md)|Redis 缓存 Spring Boot Starter 模块|\n|[spring-boot-starter-common](kit-spring-boot/spring-boot-starter-common/README.md)|公共 Spring Boot Starter 模块|\n|[spring-boot-starter-core](kit-spring-boot/spring-boot-starter-core/README.md)|Core Spring Boot Starter 模块|\n|[spring-boot-starter-dynamic-datasource](kit-spring-boot/spring-boot-starter-dynamic-datasource/README.md)|动态数据源 Spring Boot Starter 模块|\n|[spring-boot-starter-global-response](kit-spring-boot/spring-boot-starter-global-response/README.md)|全局响应 Spring Boot Starter 模块|\n|[spring-boot-starter-trace](kit-spring-boot/spring-boot-starter-trace/README.md)|链路 Spring Boot Starter 模块|\n|[spring-boot-starter-web](kit-spring-boot/spring-boot-starter-web/README.md)|Web Spring Boot Starter 模块|\n|[spring-boot-starter-web-core](kit-spring-boot/spring-boot-starter-web-core/README.md)|Web Core Spring Boot Starter 模块|\n\n## kit-storage 云存储模块\n\n|模块|介绍|\n|---|---|\n|[spring-boot-storage](kit-storage/spring-boot-storage/README.md)|云存储 Spring Boot 模块|\n\n### minio MinIO 云存储模块\n\n|模块|介绍|\n|---|---|\n|[spring-boot-starter-storage-minio](kit-storage/minio/spring-boot-starter-storage-minio/README.md)|云存储 MinIO Spring Boot Starter 模块|\n|[storage-minio-utils](kit-storage/minio/storage-minio-utils/README.md)|云存储 MinIO Utils 模块|\n\n### oss OSS 云存储模块\n\n|模块|介绍|\n|---|---|\n|[spring-boot-starter-aliyun-oss](kit-storage/aliyun-oss/spring-boot-starter-aliyun-oss/README.md)|云存储 OSS Spring Boot Starter 模块|\n|[storage-aliyun-utils](kit-storage/aliyun-oss/aliyun-oss-utils/README.md)|云存储 OSS Utils 模块|\n\n## kit-system 系统模块\n\n|模块|介绍|\n|---|---|\n|[system-utils](kit-system/system-utils/README.md)|系统 Utils 模块|\n\n## kit-tree 树形结构模块\n\n|模块|介绍|\n|---|---|\n|[tree-utils](kit-tree/tree-utils/README.md)|树形结构 Utils 模块|\n\n## kit-type-parser 类型解析模块\n\n|模块|介绍|\n|---|---|\n|[type-parser-utils](kit-type-parser/type-parser-utils/README.md)|类型解析 Utils 模块|\n\n## kit-validation 校验模块\n\n|模块|介绍|\n|---|---|\n|[validation-utils](kit-validation/validation-utils/README.md)|校验 Utils 模块|\n\n# 使用\n\n\u003e 版本号说明\n\u003e\n\u003e 版本由：`项目版本号`-`Spring Boot 版本` 组成。\n\u003e\n\u003e 最新版本请点击 [Maven Repository](https://mvnrepository.com/search?q=pongsky) 查阅\n\n## Maven 依赖\n\n```xml\n\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.pongsky.kit\u003c/groupId\u003e\n    \u003cartifactId\u003espring-boot-starter-captcha-input-math\u003c/artifactId\u003e\n    \u003cversion\u003e${latestVersion}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## Gradle 依赖\n\n```groovy\nimplementation \"com.pongsky.kit:spring-boot-starter-captcha-input-math:$latestVersion\"\n```\n\n# 其他功能特点（TODO，后续功能将拆模块移除优化）\n\n* config-core\n    * Swagger 配置（自动装配）\n    * 全局日志链路追踪（需配合 bootstrap.yml）\n    * 异步配置（增强日志链路追踪）\n    * Quartz 配置（增强日志链路追踪）\n\n* config-web\n    * Feign 调用日志打印\n\n## 前置条件\n\n* 需引入 `spring-boot-starter-data-redis` 依赖并配置相关 yml 信息\n* 需配置 yml 信息，信息如下：\n\n|参数|示例|说明|\n|---|---|---|\n|application.name|`@name@`|应用名称。\u003cbr /\u003e建议读取项目名称，并在 `bootstrap.yml` 中配置|\n|application.module|gateway|模块名称。\u003cbr /\u003e建议在 `application.yml` 中配置|\n|application.version|`@version@`|版本号。\u003cbr /\u003e建议读取项目版本号，并在 `bootstrap.yml` 中配置|\n|application.formatted-version|`${application.name}-${application.module}-${application.version}`|打印版本号格式。\u003cbr /\u003e建议在 `application.yml` 中配置|\n|spring.profiles.active|`dev`|环境，`local`、`dev`、`beta`、`prod`。\u003cbr /\u003e建议在 `bootstrap.yml` 中配置|\n|spring.application.name|`${application.name}-${application.module}`|应用名称。\u003cbr /\u003e建议在 `application.yml` 中配置|\n\n# 功能配置\n\n## 全局实例ID\n\n在 yml 或 `@Value` 中可直接引用 `${brokerId}` 获取当前实例ID。\n\n\u003e brokerId 由 系统 HostName、HostAddress 信息进行 MD5 后组成。\n\u003e\n\u003e 该场景适用于容器部署，每个实例的 HostName、HostAddress 组成唯一。\n\n## 全局日志链路追踪\n\n日志打印信息需添加打印 `X-Trace-Id` 参数。\n\n```yml\nlogging:\n  pattern:\n    console: ${CONSOLE_LOG_PATTERN:%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}  %-5.5L{5}){cyan} %clr([%39X{X-Trace-Id}]){yellow} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}} # 控制台日志打印格式\n```\n\n## Feign 日志打印\n\n```java\n    @Bean\n    public feign.Logger logger() {\n        return new Slf4jLogger();\n    }\n```\n\n```yml\nlogging:\n  level:\n    feign.Logger: debug # Feign 日志打印\nfeign:\n  client:\n    config:\n      default:\n        loggerLevel: basic # Feign 日志打印等级\n```\n\n# 模块建议\n\n\u003e 按照此信息进行分模块，配合此套件能获得最佳的体验～\n\n在多模块项目中建议按如下分包：\n\n\u003e `${project}`：项目名。\n\u003e\n\u003e `${service}`：服务名。\n\n* `${project}`-common-entity\n    * 依赖 `${project}`-common-utils\n* `${project}`-common-utils\n    * 依赖 `com.pongsky.kit:common-utils`\n* `${project}`-config-core\n    * 依赖 `${project}`-common-entity\n    * 依赖 `com.pongsky.kit:config-core`\n* `${project}`-config-core\n    * 依赖 `${project}`-config-core\n    * 依赖 `com.pongsky.kit:config-web`\n* `${project}`-service-`${service}`\n    * 依赖 `com.pongsky.kit:config-core` / `com.pongsky.kit:config-web`\n\n# 代码、分包建议\n\n\u003e 按照此信息进行代码实装、分包，配合此套件能获得最佳的体验～\n\u003e\n\u003e `${basePackage}`：基础项目包，譬如 `com.pongsky.kit`。\n\n## `${project}`-config-core\n\n### 包：`${basePackage}`.config\n\n譬如：com.pongsky.kit.config\n\n#### BaseConfig\n\n```java\n/**\n * 基础配置\n *\n * @author pengsenhao\n */\n@Component\n@Import({RedisConfig.class})\npublic class BaseConfig {\n\n\n}\n```\n\n### bootstrap.yml\n\n```yml\napplication:\n  name: @name@ # 工程名称\n  version: @version@ # 工程版本号\nspring:\n  profiles:\n    active: local # 选择配置文件\n  security:\n    user:\n      name: ${application.name} # security 默认账号\n      password: ${application.name} # security 默认密码\n  web:\n    locale: zh_CN # 简体中文语言\n    resources:\n      add-mappings: false # 不要为资源文件建立映射\n  mvc:\n    log-resolved-exception: true # 开启日志解析异常\n    throw-exception-if-no-handler-found: true # 出现异常直接抛出错误\n    format:\n      time: HH:mm:ss # time 转换格式\n      date: yyyy-MM-dd # date 转换格式\n      date-time: yyyy-MM-dd HH:mm:ss # date-time 转换格式\n  thymeleaf:\n    check-template-location: false # 不检查模块位置\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss # 设置时间默认序列化格式\n    time-zone: Asia/Shanghai # 设置序列化时区\n    default-property-inclusion: non_null # 只序列化非空字段\n  servlet:\n    multipart:\n      max-file-size: 100MB # 设置最大文件上传大小 100MB\n      max-request-size: 100MB # 设置发起请求最大文件上传大小 100MB\n  task:\n    execution:\n      pool:\n        core-size: 10 # 定时任务线程池核心数\n        max-size: 100 # 定时任务最大线程数\n        keep-alive: 30s # 定时任务线程保持空闲时间\n  output:\n    ansi:\n      enabled: always # 启用控制台打印颜色\n  cloud:\n    consul:\n      discovery:\n        health-check-critical-timeout: 10s # 设置健康检查失败多长时间后，取消注册\n        tags:\n          - ${spring.profiles.active}-@version@ # 版本号，通过与 server-list-query-tags 参数关联，实现服务隔离\n        server-list-query-tags:\n          genshin-adventure-mihoyo: ${spring.profiles.active}-@version@\n          genshin-adventure-gateway: ${spring.profiles.active}-@version@\n  datasource:\n    driver-class-name: com.mysql.cj.jdbc.Driver\n    type: com.zaxxer.hikari.HikariDataSource\n    hikari:\n      minimum-idle: 5\n      maximum-pool-size: 50\n      auto-commit: true\n      idle-timeout: 600000\n      pool-name: DatebookHikariCP\n      max-lifetime: 1800000\n      connection-timeout: 30000\n      connection-test-query: SELECT 1\n  rabbitmq:\n    template:\n      reply-timeout: 10000 # sendAndReceive()方法的超时时间，单位毫秒\nlogging:\n  pattern:\n    console: ${CONSOLE_LOG_PATTERN:%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}  %-5.5L{5}){cyan} %clr([%39X{X-Trace-Id}]){yellow} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}} # 控制台日志打印格式\n  level:\n    feign.Logger: debug # Feign 日志打印\nserver:\n  shutdown: graceful # 优雅关机\nmanagement:\n  endpoints:\n    web:\n      exposure:\n        include: \"*\" # 以 web 方式暴露所有监控端点\n  endpoint:\n    health:\n      show-details: always # 总是显示健康详情\nmybatis-plus:\n  global-config:\n    banner: false # 关闭 mybatis-plus banner 打印\n    db-config:\n      id-type: input # 主键策略\nfeign:\n  client:\n    config:\n      default:\n        loggerLevel: basic # Feign 日志打印等级\n\n```\n\n## `${project}`-config-web\n\n### 包：`${basePackage}`.security\n\n譬如：com.pongsky.kit.security\n\n\u003e 基于 `spring-boot-starter-security` 拦截。\n\n#### SecurityConfig\n\n```java\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;\nimport org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;\nimport org.springframework.security.config.http.SessionCreationPolicy;\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\nimport org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.cors.CorsConfiguration;\nimport org.springframework.web.cors.CorsConfigurationSource;\nimport org.springframework.web.cors.UrlBasedCorsConfigurationSource;\n\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\n\n/**\n * 鉴权配置\n *\n * @author pengsenhao\n */\n@EnableWebSecurity\n@RequiredArgsConstructor\n@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class SecurityConfig extends WebSecurityConfigurerAdapter {\n\n    private final TraceFilter traceFilter;\n    private final AuthenticationFilter authenticationFilter;\n\n    @Bean\n    public BCryptPasswordEncoder bCryptPasswordEncoder() {\n        return new BCryptPasswordEncoder();\n    }\n\n    /**\n     * 配置跨域请求\n     *\n     * @param http http\n     * @throws Exception 异常\n     */\n    @Override\n    protected void configure(HttpSecurity http) throws Exception {\n        http.cors().configurationSource(corsConfigurationSource())\n                .and().csrf().disable()\n                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)\n                .and()\n                .addFilterBefore(traceFilter, UsernamePasswordAuthenticationFilter.class)\n                .addFilterBefore(authenticationFilter, UsernamePasswordAuthenticationFilter.class);\n    }\n\n    /**\n     * 配置跨域请求\n     *\n     * @return 跨域请求\n     */\n    @Bean\n    CorsConfigurationSource corsConfigurationSource() {\n        CorsConfiguration corsConfiguration = new CorsConfiguration();\n        corsConfiguration.setAllowedOriginPatterns(Collections.singletonList(\"*\"));\n        List\u003cString\u003e methods = Stream.of(RequestMethod.PATCH, RequestMethod.OPTIONS,\n                        RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE)\n                .map(Enum::toString)\n                .collect(Collectors.toList());\n        corsConfiguration.setAllowedMethods(methods);\n        corsConfiguration.setAllowedHeaders(Collections.singletonList(\"*\"));\n        corsConfiguration.setAllowCredentials(true);\n        corsConfiguration.setMaxAge(0L);\n        corsConfiguration.addExposedHeader(HttpHeaders.AUTHORIZATION);\n        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();\n        source.registerCorsConfiguration(\"/**\", corsConfiguration);\n        return source;\n    }\n\n}\n```\n\n#### TraceFilter\n\n```java\nimport CurrentInfo;\nimport CurrentThreadConfig;\nimport DiyHeader;\nimport com.pongsky.kit.web.request.Whitelist;\nimport org.slf4j.MDC;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.filter.OncePerRequestFilter;\n\nimport javax.annotation.Nonnull;\nimport javax.servlet.FilterChain;\nimport javax.servlet.ServletException;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.util.Enumeration;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * 链路拦截器\n *\n * @author pengsenhao\n */\n@Component\npublic class TraceFilter extends OncePerRequestFilter {\n\n    @Override\n    protected boolean shouldNotFilter(HttpServletRequest request) {\n        return Whitelist.URLS.contains(request.getRequestURI());\n    }\n\n    @Override\n    protected void doFilterInternal(\n            @Nonnull HttpServletRequest request,\n            @Nonnull HttpServletResponse response,\n            @Nonnull FilterChain chain) throws IOException, ServletException {\n        String traceId = CurrentThreadConfig.buildTraceId(request);\n        MDC.put(DiyHeader.X_TRACE_ID, traceId);\n        Enumeration\u003cString\u003e headerNames = request.getHeaderNames();\n        Map\u003cString, String\u003e requestHeaders = new HashMap\u003c\u003e(16);\n        while (headerNames.hasMoreElements()) {\n            String key = headerNames.nextElement();\n            String value = request.getHeader(key);\n            requestHeaders.put(key, value);\n        }\n        String authorization = request.getHeader(HttpHeaders.AUTHORIZATION);\n        CurrentInfo currentInfo = new CurrentInfo()\n                .setTraceId(traceId)\n                .setAuthorization(authorization)\n                .setRequestHeaders(requestHeaders);\n        CurrentThreadConfig.setCurrentInfo(currentInfo);\n        try {\n            chain.doFilter(request, response);\n        } finally {\n            MDC.clear();\n            CurrentThreadConfig.relCurrentInfo();\n        }\n    }\n\n}\n```\n\n## `${project}`-service-`${service}`\n\n### 包：`${basePackage}`.config\n\n譬如：com.pongsky.kit.config\n\n#### LocalConfig\n\n```java\n/**\n * @author pengsenhao\n */\n@Component\n@Import({MyBatisConfig.class, AsyncConfig.class})\npublic class LocalConfig {\n\n\n}\n```\n\n#### QuartzConfig\n\n```java\nimport QuartzUtils;\nimport lombok.RequiredArgsConstructor;\nimport org.quartz.Scheduler;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * @author pengsenhao\n * @create 2021-02-25\n */\n@Configuration\n@RequiredArgsConstructor\npublic class QuartzConfig {\n\n    private final Scheduler scheduler;\n\n    @Bean\n    public QuartzUtils quartzUtils() {\n        QuartzUtils quartzUtils = new QuartzUtils(scheduler);\n        // xxx.quartzUtils = quartzUtils;\n        return quartzUtils;\n    }\n\n}\n```\n\n### 包：`${basePackage}`.controller\n\n譬如：com.pongsky.kit.controller\n\n用于放置所有 controller 接口。\n\n#### 包：`${basePackage}`.controller.api\n\n譬如：com.pongsky.kit.controller.api\n\n该包下接口用于第三方调用。\n\n#### 包：`${basePackage}`.controller.console\n\n譬如：com.pongsky.kit.controller.console\n\n该包下接口用于前端项目调用。\n\n#### 包：`${basePackage}`.controller.service\n\n譬如：com.pongsky.kit.controller.service\n\n该包下接口用于后端项目远程调用。\n\n### 包：`${basePackage}`.job\n\n譬如：com.pongsky.kit.job\n\n用于放置所有 job 定时任务调度。\n\n### 包：`${basePackage}`.mapper\n\n譬如：com.pongsky.kit.mapper\n\n用于放置所有 Mapper。\n\n### 包：`${basePackage}`.service\n\n譬如：com.pongsky.kit.service\n\n用于放置所有 Service。\n\n#### 包：`${basePackage}`.service.impl\n\n譬如：com.pongsky.kit.service.impl\n\n用于放置所有 Service Impl。\n\n### banner.txt\n\nlogo 自行替换成项目模块。\n\n```txt\n  ██╗ ██╗ █████╗ ██████╗ ██╗   ██╗███████╗███╗   ██╗████████╗██╗   ██╗██████╗ ███████╗    ███╗   ███╗██╗██╗  ██╗ ██████╗ ██╗   ██╗ ██████╗ ██╗ ██╗\n ██╔╝██╔╝██╔══██╗██╔══██╗██║   ██║██╔════╝████╗  ██║╚══██╔══╝██║   ██║██╔══██╗██╔════╝    ████╗ ████║██║██║  ██║██╔═══██╗╚██╗ ██╔╝██╔═══██╗╚██╗╚██╗\n██╔╝██╔╝ ███████║██║  ██║██║   ██║█████╗  ██╔██╗ ██║   ██║   ██║   ██║██████╔╝█████╗█████╗██╔████╔██║██║███████║██║   ██║ ╚████╔╝ ██║   ██║ ╚██╗╚██╗\n╚██╗╚██╗ ██╔══██║██║  ██║╚██╗ ██╔╝██╔══╝  ██║╚██╗██║   ██║   ██║   ██║██╔══██╗██╔══╝╚════╝██║╚██╔╝██║██║██╔══██║██║   ██║  ╚██╔╝  ██║   ██║ ██╔╝██╔╝\n ╚██╗╚██╗██║  ██║██████╔╝ ╚████╔╝ ███████╗██║ ╚████║   ██║   ╚██████╔╝██║  ██║███████╗    ██║ ╚═╝ ██║██║██║  ██║╚██████╔╝   ██║   ╚██████╔╝██╔╝██╔╝\n  ╚═╝ ╚═╝╚═╝  ╚═╝╚═════╝   ╚═══╝  ╚══════╝╚═╝  ╚═══╝   ╚═╝    ╚═════╝ ╚═╝  ╚═╝╚══════╝    ╚═╝     ╚═╝╚═╝╚═╝  ╚═╝ ╚═════╝    ╚═╝    ╚═════╝ ╚═╝ ╚═╝\n\nApplication Version: ${application.formatted-version}-${application.instance-id}\nSpring Boot Version: ${spring-boot.formatted-version}\n```\n\n### application.yml\n\n```yml\napplication:\n  module: mihoyo # 模块名称\n  formatted-version: ${application.name}-${application.module}-${application.version} # 格式化版本\nspring:\n  application:\n    name: ${application.name}-${application.module} # 应用名称\n  cloud:\n    consul:\n      discovery:\n        service-name: ${spring.profiles.active}-${spring.application.name} # 服务名称\n        hostname: ${spring.profiles.active}-${spring.application.name} # hostname 名称\n        instance-id: ${spring.application.name}-${application.instance-id} # 唯一实例ID\n  # 集群定时任务 配置\n  quartz:\n    job-store-type: jdbc\n    wait-for-jobs-to-complete-on-shutdown: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: clusteredScheduler\n            instanceId: AUTO\n          jobStore:\n            acquireTriggersWithinLock: true\n            class: org.quartz.impl.jdbcjobstore.JobStoreTX\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            clusterCheckinInterval: 10000\n            misfireThreshold: 60000\n            maxMisfiresToHandleAtATime: 1\n            useProperties: false\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 50\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvaulka%2Fjava-enhancement-kit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvaulka%2Fjava-enhancement-kit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvaulka%2Fjava-enhancement-kit/lists"}