diff --git a/ARTICLE.md b/ARTICLE.md index 6414d7519c74f17c8857b21d11312a0ccfca2c9e..05e86aa404af175af2da8aada0f10bf9ceff03c3 100644 --- a/ARTICLE.md +++ b/ARTICLE.md @@ -2,4 +2,5 @@ * [How to Implement a Custom, Sequence-Based ID Generator](https://thorben-janssen.com/custom-sequence-based-idgenerator/) * [如何高效优雅的使用java枚举](https://mp.weixin.qq.com/s?__biz=MzIzOTU0NTQ0MA==&mid=2247533478&idx=1&sn=e490a390880decde70b92ee61047117c&chksm=e89c9a44be6b3f84aecd36ec7d6e3062da96bb9c84c8677ad7d587655d476f53663a5b0f406c&mpshare=1&scene=23&srcid=0612S6dpx1QsRkGS9tNuz2nn&sharer_shareinfo=314db2398ff71a77a92925a68003820f&sharer_shareinfo_first=314db2398ff71a77a92925a68003820f#rd) -* [一文吃透 Apache Tika:从文件解析到元数据提取的全能工具库](https://zhuanlan.zhihu.com/p/1932473734637281918) \ No newline at end of file +* [一文吃透 Apache Tika:从文件解析到元数据提取的全能工具库](https://zhuanlan.zhihu.com/p/1932473734637281918) +* [Spring Boot 遇上Apache Tika,数据提取竟如此简单!](https://mp.weixin.qq.com/s?__biz=Mzk0ODYyNjE4NA==&mid=2247488503&idx=1&sn=571aded8fbbf782a1c34f24e296a2ed9&chksm=c23d5c12c39c1f97d74cd4ba69c268a08ef9a9fc4950262bba95fb2ea3914766177c0ea11356&mpshare=1&scene=23&srcid=0829OVWDAPuIv1HKCMwNVik3&sharer_shareinfo=70614378e0d640a391dbd78bdce61d20&sharer_shareinfo_first=70614378e0d640a391dbd78bdce61d20#rd) \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f256e4c49149e1c7f959df74f6039da2b934070..dd1769fb1b1be48fcabde763e04e66b8620d6c25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ # 变更日志 -## [未发布] +## [路线图] +- starter-tika-client +- starter-tika-server +- starter-keycloak-server +- starter-s3 +- starter-cache +- starter-data-tenant +- starter-jasperreports + +## [0.4.0] ### 新增 - 集成uid-generator框架,生成ID - 自动配置cn.hutool.extra.spring.SpringUtil工具 @@ -9,6 +18,7 @@ - 集成Tika - 验证码缓存工厂(CaptchaCacheFactory),单例模式 - 扩展APIJSON框架,实现多数据源 +- 字体工具,支持:阿里巴巴普惠,思源黑体,思源宋体 ### 变更 - diff --git a/README.md b/README.md index e2a68bb92bfdc5a947bb26fb37201855b3b30af9..04124dc0e3c8289356cf5cc07997b684c527c848 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ 基于`Spring Boot`框架,集成其他框架开发的`Starter` -[使用指南](https://yunjiao-source.github.io) +[使用指南](https://yunjiao-spring-boot.pages.dev/) ## 发布版本 diff --git a/autoconfigure/pom.xml b/autoconfigure/pom.xml index 71c4d171bb0def934866d93d9783f1b4d6dd2888..320fafd557432da757eadcf9393ddad963fc1290 100644 --- a/autoconfigure/pom.xml +++ b/autoconfigure/pom.xml @@ -52,12 +52,12 @@ extension-id true - - com.google.guava - guava + io.gitee.yunjiao-source.spring-boot + extension-tika true + org.slf4j slf4j-api @@ -99,6 +99,7 @@ true + com.querydsl querydsl-sql-spring @@ -117,12 +118,7 @@ true - - cn.hutool - hutool-core - true - - + com.github.APIJSON apijson-framework @@ -139,11 +135,26 @@ true + + + + io.undertow + undertow-core + true + + + io.undertow + undertow-websockets-jsr + true + + + org.springframework.boot spring-boot-starter-test test + \ No newline at end of file diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonAutoConfiguration.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonAutoConfiguration.java index bd8ced20c9277ab6afe0f81493b96fa936066190..d9597d923f885f6b8aaa5cb887be8283fa4763be 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonAutoConfiguration.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonAutoConfiguration.java @@ -2,10 +2,10 @@ package yunjiao.springboot.autoconfigure.apijson; import apijson.framework.APIJSONApplication; -import yunjiao.springboot.extension.apjson._APIJSON; -import yunjiao.springboot.extension.apjson.annotation.ApijsonRest; -import yunjiao.springboot.extension.apjson.orm.IdKeyApijsonStrategy; -import yunjiao.springboot.extension.apjson.orm.IdKeyStrategy; +import yunjiao.springboot.extension.apijson._APIJSON; +import yunjiao.springboot.extension.apijson.annotation.ApijsonRest; +import yunjiao.springboot.extension.apijson.orm.IdKeyApijsonStrategy; +import yunjiao.springboot.extension.apijson.orm.IdKeyStrategy; import jakarta.annotation.Nonnull; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonInitConfiguration.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonInitConfiguration.java index c6b5f592395eec5932f4e97b5769771d245e6b0e..f07222d8f06f01305a8c790c63f77fcf85f9291f 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonInitConfiguration.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonInitConfiguration.java @@ -6,6 +6,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import yunjiao.springboot.extension.apijson.ApijsonFunctionParserConfigurer; +import yunjiao.springboot.extension.apijson.ApijsonSqlConfigConfigurer; +import yunjiao.springboot.extension.apijson.ApijsonVerifierConfigurer; /** * APIJSON初始化自动配置 diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonInitializingBean.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonInitializingBean.java index 0be497b91fa886ace3709d281f265e9656a25de6..138047959b36d41579d090040fb9bef68ce53c6d 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonInitializingBean.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonInitializingBean.java @@ -4,6 +4,9 @@ import apijson.framework.*; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.ObjectProvider; +import yunjiao.springboot.extension.apijson.ApijsonFunctionParserConfigurer; +import yunjiao.springboot.extension.apijson.ApijsonSqlConfigConfigurer; +import yunjiao.springboot.extension.apijson.ApijsonVerifierConfigurer; import java.util.stream.Collectors; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlProperties.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlProperties.java index d919bedfedb16bf1459017394bd9f6061cf0785a..c9708bcc54943ebb6777881008d0f55282c9718d 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlProperties.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlProperties.java @@ -1,6 +1,6 @@ package yunjiao.springboot.autoconfigure.apijson; -import yunjiao.springboot.extension.apjson.util.ApijsonConsts; +import yunjiao.springboot.extension.apijson.util.ApijsonConsts; import yunjiao.springboot.autoconfigure.util.PropertyNameConsts; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonUtils.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonUtils.java index d161e3e2aabe607745b348f6113b1db7bc19e186..2c9a20fa76e088fac650c8f19e30194a110522f4 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonUtils.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonUtils.java @@ -9,6 +9,9 @@ import apijson.orm.Entry; import apijson.orm.script.ScriptExecutor; import lombok.extern.slf4j.Slf4j; import org.springframework.util.ObjectUtils; +import yunjiao.springboot.extension.apijson.ApijsonFunctionParserConfigurer; +import yunjiao.springboot.extension.apijson.ApijsonSqlConfigConfigurer; +import yunjiao.springboot.extension.apijson.ApijsonVerifierConfigurer; import java.util.*; import java.util.function.BiConsumer; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/Fastjson2ApplicationConfiguration.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/Fastjson2ApplicationConfiguration.java index 1c3be193f8960244a9a66e0dcb88e8dc3f333a2f..00af6e3765266eb251cded3ae19df74dc6584cd4 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/Fastjson2ApplicationConfiguration.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/Fastjson2ApplicationConfiguration.java @@ -1,10 +1,5 @@ package yunjiao.springboot.autoconfigure.apijson; -import yunjiao.springboot.extension.apjson.orm.IdKeyStrategy; -import yunjiao.springboot.extension.apjson.orm.NewIdStrategy; -import yunjiao.springboot.autoconfigure.apijson.condition.ApllicationCondition; -import yunjiao.springboot.autoconfigure.apijson.fastjson2.*; -import yunjiao.springboot.autoconfigure.util.PropertyNameConsts; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -15,6 +10,15 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; +import yunjiao.springboot.autoconfigure.apijson.condition.ApllicationCondition; +import yunjiao.springboot.autoconfigure.apijson.fastjson2.Fastjson2InitializingBean; +import yunjiao.springboot.autoconfigure.util.PropertyNameConsts; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2Creator; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2EXtRestController; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2RestController; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2SimpleCallback; +import yunjiao.springboot.extension.apijson.orm.IdKeyStrategy; +import yunjiao.springboot.extension.apijson.orm.NewIdStrategy; import javax.sql.DataSource; @@ -48,7 +52,7 @@ public class Fastjson2ApplicationConfiguration { @ConditionalOnMissingBean Fastjson2Creator fastjson2Creator(DataSource dataSource, ApijsonSqlProperties sqlProperties) { - Fastjson2Creator bean = new Fastjson2Creator(dataSource, sqlProperties); + Fastjson2Creator bean = new Fastjson2Creator(dataSource, sqlProperties.getConfig().getVersion()); if (log.isDebugEnabled()) { log.debug("Configure Bean [Fastjson2 Creator -> {}]", bean); } @@ -109,7 +113,8 @@ public class Fastjson2ApplicationConfiguration { */ @Bean Fastjson2RestController fastjson2RestController() { - Fastjson2RestController bean = new Fastjson2RestController(properties); + Fastjson2RestController bean = new Fastjson2RestController(properties.isNeedVerifyLogin(), + properties.isNeedVerifyRole(), properties.isNeedVerifyContent()); if (log.isDebugEnabled()) { log.debug("Configure Bean [Fastjson2 Rest Controller -> {}]", bean); } diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/GsonApplicationConfiguration.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/GsonApplicationConfiguration.java index 9d3c8004d107c88268cc8e6eb0347b3464a7d611..49e3d07504433bbaf52003f16c9656329cd9e5c3 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/GsonApplicationConfiguration.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/GsonApplicationConfiguration.java @@ -1,10 +1,5 @@ package yunjiao.springboot.autoconfigure.apijson; -import yunjiao.springboot.extension.apjson.orm.IdKeyStrategy; -import yunjiao.springboot.extension.apjson.orm.NewIdStrategy; -import yunjiao.springboot.autoconfigure.apijson.condition.ApllicationCondition; -import yunjiao.springboot.autoconfigure.apijson.gson.*; -import yunjiao.springboot.autoconfigure.util.PropertyNameConsts; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -15,6 +10,15 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; +import yunjiao.springboot.autoconfigure.apijson.condition.ApllicationCondition; +import yunjiao.springboot.autoconfigure.apijson.gson.GsonInitializingBean; +import yunjiao.springboot.autoconfigure.util.PropertyNameConsts; +import yunjiao.springboot.extension.apijson.gson.GsonCreator; +import yunjiao.springboot.extension.apijson.gson.GsonEXtRestController; +import yunjiao.springboot.extension.apijson.gson.GsonRestController; +import yunjiao.springboot.extension.apijson.gson.GsonSimpleCallback; +import yunjiao.springboot.extension.apijson.orm.IdKeyStrategy; +import yunjiao.springboot.extension.apijson.orm.NewIdStrategy; import javax.sql.DataSource; @@ -48,7 +52,7 @@ public class GsonApplicationConfiguration { @ConditionalOnMissingBean GsonCreator gsonCreator(DataSource dataSource, ApijsonSqlProperties sqlProperties) { - GsonCreator bean = new GsonCreator(dataSource, sqlProperties); + GsonCreator bean = new GsonCreator(dataSource, sqlProperties.getConfig().getVersion()); if (log.isDebugEnabled()) { log.debug("Configure Bean [Gson Creator -> {}]", bean); } @@ -104,7 +108,8 @@ public class GsonApplicationConfiguration { @Bean GsonRestController gsonRestController() { - GsonRestController bean = new GsonRestController(properties); + GsonRestController bean = new GsonRestController(properties.isNeedVerifyLogin(), + properties.isNeedVerifyRole(), properties.isNeedVerifyContent()); if (log.isDebugEnabled()) { log.debug("Configure Bean [Gson Rest Controller -> {}]", bean); } diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/NewIdStrategyConfiguration.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/NewIdStrategyConfiguration.java index cab920d47c23b9ff6821e4097327c04a1c9f6851..075aeca84debc54ef3de36f3ddf04b687458d34b 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/NewIdStrategyConfiguration.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/NewIdStrategyConfiguration.java @@ -9,7 +9,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; -import yunjiao.springboot.extension.apjson.orm.*; +import yunjiao.springboot.extension.apijson.orm.*; /** * {@link NewIdStrategy}实现类自动配置 diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2InitializingBean.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2InitializingBean.java index cd255625757bc746f87e26db39cdfcfcb2427259..0f3c337b46891d32d214478cf0b60c51572553e4 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2InitializingBean.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2InitializingBean.java @@ -2,10 +2,14 @@ package yunjiao.springboot.autoconfigure.apijson.fastjson2; import apijson.Log; import apijson.fastjson2.*; -import yunjiao.springboot.autoconfigure.apijson.ApijsonProperties; -import yunjiao.springboot.autoconfigure.apijson.ApijsonUtils; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.InitializingBean; +import yunjiao.springboot.autoconfigure.apijson.ApijsonProperties; +import yunjiao.springboot.autoconfigure.apijson.ApijsonUtils; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2Creator; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2SimpleCallback; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2SqlConfig; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2Verifier; /** * Fastjson2 应用初始化Bean diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonInitializingBean.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonInitializingBean.java index 06adb5b893af25d7e228e65daa409b24e3db9fcf..04db38b59dfb2c807c5c0b6d83c44ea8d42f00b0 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonInitializingBean.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonInitializingBean.java @@ -1,10 +1,14 @@ package yunjiao.springboot.autoconfigure.apijson.gson; import apijson.gson.*; -import yunjiao.springboot.autoconfigure.apijson.ApijsonProperties; -import yunjiao.springboot.autoconfigure.apijson.ApijsonUtils; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.InitializingBean; +import yunjiao.springboot.autoconfigure.apijson.ApijsonProperties; +import yunjiao.springboot.autoconfigure.apijson.ApijsonUtils; +import yunjiao.springboot.extension.apijson.gson.GsonCreator; +import yunjiao.springboot.extension.apijson.gson.GsonSimpleCallback; +import yunjiao.springboot.extension.apijson.gson.GsonSqlConfig; +import yunjiao.springboot.extension.apijson.gson.GsonVerifier; /** * Fastjson2 应用初始化Bean diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/AnjiCaptchaConfiguration.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/AnjiCaptchaConfiguration.java index 4275b28bf471bd150c0d924049bfb86dbb2b5a04..ef8183d1474651dbf185182d0610a6283a19fc05 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/AnjiCaptchaConfiguration.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/AnjiCaptchaConfiguration.java @@ -64,11 +64,11 @@ public class AnjiCaptchaConfiguration { config.put(Const.ORIGINAL_PATH_PIC_CLICK, properties.getClickWord().getPicClick()); config.put(Const.CAPTCHA_SLIP_OFFSET, properties.getBlockPuzzle().getSlipOffset()); config.put(Const.CAPTCHA_AES_STATUS, "false"); - config.put(Const.CAPTCHA_WATER_FONT, properties.getWaterFont()); + config.put(Const.CAPTCHA_WATER_FONT, properties.getWaterFont().getName()); config.put(Const.CAPTCHA_FONT_SIZE, properties.getClickWord().getFontSize()); - config.put(Const.CAPTCHA_FONT_STYLE, properties.getClickWord().getFontStyle().getMapping()); + config.put(Const.CAPTCHA_FONT_STYLE, properties.getClickWord().getFontStyleEnum().getMapping()); config.put(Const.CAPTCHA_WORD_COUNT, properties.getClickWord().getClickWordCount()); fixBugCache(config); @@ -144,6 +144,10 @@ public class AnjiCaptchaConfiguration { return service; } + /** + * 初始化滑块资源 + * @param jigsaw 滑块资源路径 + */ private void initJigsawResource(String jigsaw) { if (StringUtils.hasText(jigsaw) && jigsaw.startsWith("classpath")) { ImageUtils.cacheBootImage(getResourcesImagesFile(jigsaw + "/original/*.png"), @@ -152,6 +156,10 @@ public class AnjiCaptchaConfiguration { } } + /** + * 初始化文字点击资源 + * @param picClick 文字点击资源路径 + */ private void initPicClickResource(String picClick) { if (StringUtils.hasText(picClick) && picClick.startsWith("classpath")) { ImageUtils.cacheBootImage(Collections.emptyMap(), Collections.emptyMap(), @@ -159,7 +167,13 @@ public class AnjiCaptchaConfiguration { } } - public Map getResourcesImagesFile(String path) { + /** + * 读取图片资源 + * + * @param path 路径 + * @return 资源 + */ + private Map getResourcesImagesFile(String path) { Map imgMap = new HashMap<>(); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); try { diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/AnjiCaptchaProperties.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/AnjiCaptchaProperties.java index d141df3948823aec57420a42db7a5e815c972062..674c99da7f70f42873e6b397419b94db03a22d6d 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/AnjiCaptchaProperties.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/AnjiCaptchaProperties.java @@ -4,7 +4,8 @@ import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; import yunjiao.springboot.autoconfigure.util.PropertyNameConsts; -import yunjiao.springboot.extension.common.model.FontStyle; +import yunjiao.springboot.extension.common.model.FontNameEnum; +import yunjiao.springboot.extension.common.model.FontStyleEnum; /** * anji验证码属性 @@ -20,9 +21,9 @@ public class AnjiCaptchaProperties { private String waterMark = "我的水印"; /** - * 右下角水印字体(文泉驿正黑). + * 右下角水印字体,默认宋体. */ - private String waterFont = "WenQuanZhengHei.ttf"; + private FontNameEnum waterFont = FontNameEnum.SimSun; /** * 滑动验证码配置 @@ -75,7 +76,7 @@ public class AnjiCaptchaProperties { /** * 点选字体样式 */ - private FontStyle fontStyle = FontStyle.bold; + private FontStyleEnum fontStyleEnum = FontStyleEnum.bold; /** * 点选字体大小 diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/CaptchaServiceFactory.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/CaptchaServiceFactory.java index 847075b4f5d15fe7522b195ebe28a82f759b391a..a8c61d2caddec5cb262318b9fba4d91261f6c719 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/CaptchaServiceFactory.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/CaptchaServiceFactory.java @@ -21,7 +21,7 @@ public record CaptchaServiceFactory(Map service * @return 实例 */ public CaptchaService findService(String categoryName) { - CaptchaCategory category = EnumCache.findByName(CaptchaCategory.class, categoryName); + CaptchaCategory category = EnumCache.getInstance().lookupByName(CaptchaCategory.class, categoryName); if (category == null) { throw new CaptchaException("验证码分类代码不存在,名称是:" + categoryName); } diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/HutoolCaptchaConfiguration.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/HutoolCaptchaConfiguration.java index 427cdd34c7271c443a149e517baed97baf6e9da4..ef03286351c3a03b30635e3e19d3b514e7fb8d25 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/HutoolCaptchaConfiguration.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/HutoolCaptchaConfiguration.java @@ -12,6 +12,7 @@ import yunjiao.springboot.extension.captcha.hutool.*; import yunjiao.springboot.extension.common.captcha.CaptchaService; import java.awt.*; +import java.util.Optional; /** * Hutool验证码配置 @@ -106,12 +107,10 @@ public class HutoolCaptchaConfiguration { Assert.isTrue(drawing.getHeight() > 0, "验证码配置属性‘height‘值必须大于0"); Assert.isTrue(drawing.getInterfereCount() > 0, "验证码配置属性‘interfereCount‘值必须大于0"); - Float transparency = drawing.getTransparency(); - if (transparency != null) { - Assert.isTrue(drawing.getTransparency() >= 0 && drawing.getTransparency() <= 1, "验证码配置属性‘transparency‘值必须在[0, 1]之间"); - } - Assert.isTrue(drawing.getFuzziness() >= 0 && drawing.getFuzziness() <= 30, "验证码配置属性‘fuzziness‘值必须在[0, 30]之间"); - + Optional.ofNullable(drawing.getTransparency()).ifPresent(transparency -> + Assert.isTrue(drawing.getTransparency() >= 0 && drawing.getTransparency() <= 1, "验证码配置属性‘transparency‘值必须在[0, 1]之间")); + Optional.ofNullable(drawing.getFuzziness()).ifPresent(fuzziness -> + Assert.isTrue(drawing.getFuzziness() >= 0 && drawing.getFuzziness() <= 30, "验证码配置属性‘fuzziness‘值必须在[0, 30]之间")); HutoolCaptchaProperties.CodeOptions code = drawing.getCode(); Assert.isTrue(code.getLength() > 0, "验证码配置属性‘code.length‘值必须大于0"); @@ -137,6 +136,6 @@ public class HutoolCaptchaConfiguration { @SuppressWarnings({"all"}) private Font createFont(HutoolCaptchaProperties.FontOptions options) { - return new Font(options.getName(), options.getStyle().getMapping(), options.getSize()); + return options.getName().getFont(options.getStyle().getMapping(), options.getSize()); } } diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/HutoolCaptchaProperties.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/HutoolCaptchaProperties.java index 09cf3a7651439fb2f3fa301ac633e1416ef757d8..9cce75cab41474745561158ada47a76437da9beb 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/HutoolCaptchaProperties.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/captcha/HutoolCaptchaProperties.java @@ -1,8 +1,9 @@ package yunjiao.springboot.autoconfigure.captcha; import yunjiao.springboot.extension.captcha.hutool.CodeGeneratorType; -import yunjiao.springboot.extension.common.model.ColorType; -import yunjiao.springboot.extension.common.model.FontStyle; +import yunjiao.springboot.extension.common.model.ColorTypeEnum; +import yunjiao.springboot.extension.common.model.FontNameEnum; +import yunjiao.springboot.extension.common.model.FontStyleEnum; import yunjiao.springboot.autoconfigure.util.PropertyNameConsts; import lombok.Data; import lombok.EqualsAndHashCode; @@ -22,23 +23,23 @@ public class HutoolCaptchaProperties { */ @NestedConfigurationProperty private DrawingOptions line = DrawingOptions.of(new DrawingOptions(), 250, 50, 60, - ColorType.white, null, 2, true, null, FontStyle.plain, 36, + ColorTypeEnum.white, null, null, true, FontNameEnum.Default, FontStyleEnum.plain, 36, CodeGeneratorType.numAndChar, 5); /** * 圆圈干扰验证码 */ @NestedConfigurationProperty - private DrawingOptions circle = DrawingOptions.of(new DrawingOptions(), 250, 50, 30, - ColorType.white, null, 2, true, null, FontStyle.plain, 36, + private DrawingOptions circle = DrawingOptions.of(new DrawingOptions(), 250, 50, 15, + ColorTypeEnum.white, null, null, true, FontNameEnum.Default, FontStyleEnum.plain, 36, CodeGeneratorType.numAndChar, 5); /** * 扭曲干扰验证码 */ @NestedConfigurationProperty - private DrawingOptions shear = DrawingOptions.of(new DrawingOptions(), 250, 50, 4, - ColorType.white, null, 2, true, null, FontStyle.plain, 36, + private DrawingOptions shear = DrawingOptions.of(new DrawingOptions(), 250, 50, 8, + ColorTypeEnum.white, null, null, true, FontNameEnum.Default, FontStyleEnum.plain, 36, CodeGeneratorType.numAndChar, 5); /** @@ -46,9 +47,12 @@ public class HutoolCaptchaProperties { */ @NestedConfigurationProperty private GifDrawingOptions gif = GifDrawingOptions.of(new GifDrawingOptions(), 250, 50, 10, - ColorType.white, null, 2, true, null, FontStyle.plain, 36, + ColorTypeEnum.white, null, null, true, FontNameEnum.Default, FontStyleEnum.plain, 36, CodeGeneratorType.numAndChar, 5, 10, 0, 0, 255); + /** + * gif绘图配置 + */ @Data @EqualsAndHashCode(callSuper = true) public static class GifDrawingOptions extends DrawingOptions { @@ -73,13 +77,35 @@ public class HutoolCaptchaProperties { private Integer maxColor; + /** + * 创建gif绘图配置实例 + * + * @param options 必须值 + * @param width 必须值 + * @param height 必须值 + * @param interfereCount 必须值 + * @param backgroundColor 必须值 + * @param transparency 必须值 + * @param fuzziness 必须值 + * @param validIgnoreCase 校验忽略大小写 + * @param fontName 可以空 + * @param fontStyleEnum 必须值 + * @param fontSize 必须值 + * @param generator 必须值 + * @param length 必须值 + * @param quality 量化器取样间隔 + * @param repeat 帧循环次数 + * @param minColor 设置随机颜色时,最小的取色范围 + * @param maxColor 设置随机颜色时,最大的取色范围 + * @return 实例 + */ public static GifDrawingOptions of(GifDrawingOptions options, int width, int height, int interfereCount, - ColorType backgroundColor, Float transparency, Integer fuzziness, Boolean validIgnoreCase, - String fontName, FontStyle fontStyle, Integer fontSize, - CodeGeneratorType generator, int length, + ColorTypeEnum backgroundColor, Float transparency, Integer fuzziness, Boolean validIgnoreCase, + FontNameEnum fontName, FontStyleEnum fontStyleEnum, Integer fontSize, + CodeGeneratorType generator, int length, Integer quality, Integer repeat, Integer minColor, Integer maxColor) { DrawingOptions.of(options, width, height, interfereCount, backgroundColor, transparency, fuzziness, validIgnoreCase, fontName, - fontStyle, fontSize, generator, length); + fontStyleEnum, fontSize, generator, length); options.setQuality(quality); options.setRepeat(repeat); options.setMinColor(minColor); @@ -89,7 +115,7 @@ public class HutoolCaptchaProperties { } /** - * 绘图选项 + * 绘图配置 */ @Data public static class DrawingOptions { @@ -111,7 +137,7 @@ public class HutoolCaptchaProperties { /** * 背景色 */ - private ColorType backgroundColor; + private ColorTypeEnum backgroundColor; /** * 文字透明度,取值0~1,1表示不透明 @@ -150,18 +176,19 @@ public class HutoolCaptchaProperties { * @param backgroundColor 必须值 * @param transparency 必须值 * @param fuzziness 必须值 + * @param validIgnoreCase 校验忽略大小写 * @param fontName 可以空 - * @param fontStyle 必须值 + * @param fontStyleEnum 必须值 * @param fontSize 必须值 * @param generator 必须值 * @param length 必须值 * @return 实例 */ public static DrawingOptions of(DrawingOptions options, int width, int height, int interfereCount, - ColorType backgroundColor, Float transparency, Integer fuzziness, Boolean validIgnoreCase, - String fontName, FontStyle fontStyle, Integer fontSize, + ColorTypeEnum backgroundColor, Float transparency, Integer fuzziness, Boolean validIgnoreCase, + FontNameEnum fontName, FontStyleEnum fontStyleEnum, Integer fontSize, CodeGeneratorType generator, int length) { - FontOptions font = FontOptions.of(new FontOptions(), fontName, fontStyle, fontSize); + FontOptions font = FontOptions.of(new FontOptions(), fontName, fontStyleEnum, fontSize); CodeOptions code = CodeOptions.of(new CodeOptions(), generator, length); options.setWidth(width); @@ -184,14 +211,14 @@ public class HutoolCaptchaProperties { @Data public static class FontOptions { /** - * 字体名称, 为空表示使用系统默认字体 + * 字体名称, 系统默认字体 */ - private String name; + private FontNameEnum name = FontNameEnum.Default; /** * 字体风格 */ - private FontStyle style; + private FontStyleEnum style; /** * 字体大小 @@ -207,7 +234,7 @@ public class HutoolCaptchaProperties { * @param size 必须值 * @return 实例 */ - public static FontOptions of(FontOptions options, String name, FontStyle style, Integer size) { + public static FontOptions of(FontOptions options, FontNameEnum name, FontStyleEnum style, Integer size) { options.setName(name); options.setStyle(style); options.setSize(size); diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/util/UtilsAutoConfig.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/common/CommonAutoConfig.java similarity index 52% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/util/UtilsAutoConfig.java rename to autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/common/CommonAutoConfig.java index 1005c6695b2aaec2fb85ecd083e20ef2306b0c69..5efb47121945d64136dfff71abf583e625fed259 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/util/UtilsAutoConfig.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/common/CommonAutoConfig.java @@ -1,6 +1,7 @@ -package yunjiao.springboot.autoconfigure.util; +package yunjiao.springboot.autoconfigure.common; import cn.hutool.extra.spring.SpringUtil; +import io.undertow.websockets.jsr.WebSocketDeploymentInfo; import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -9,20 +10,20 @@ import org.springframework.context.annotation.Bean; import yunjiao.springboot.extension.common._Common; /** - * 工具自动配置 + * 通用的自动配置 * * @author yangyunjiao */ @Slf4j @AutoConfiguration @ConditionalOnClass({_Common.class}) -public class UtilsAutoConfig { +public class CommonAutoConfig { /** * {@link PostConstruct} 注解方法 */ @PostConstruct public void postConstruct() { - log.info("Utils Auto Configuration"); + log.info("Common Auto Configuration"); } @Bean @@ -33,4 +34,20 @@ public class UtilsAutoConfig { } return bean; } + + /** + * 解决: + * + * @return 实例 + */ + @Bean + @ConditionalOnClass({WebSocketDeploymentInfo.class}) + CustomizerUndertowServletWebServerFactory customizerUndertowServletWebServerFactory() { + CustomizerUndertowServletWebServerFactory bean = new CustomizerUndertowServletWebServerFactory(); + + if (log.isDebugEnabled()) { + log.debug("Configure Bean [Customizer Undertow Servlet Web Server Factory -> {}]", bean); + } + return bean; + } } diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/common/CustomizerUndertowServletWebServerFactory.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/common/CustomizerUndertowServletWebServerFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..f61c2d2f95ddd48f775c641dab607db11f1e75ca --- /dev/null +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/common/CustomizerUndertowServletWebServerFactory.java @@ -0,0 +1,23 @@ +package yunjiao.springboot.autoconfigure.common; + +import io.undertow.server.DefaultByteBufferPool; +import io.undertow.websockets.jsr.WebSocketDeploymentInfo; +import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; +import org.springframework.boot.web.server.WebServerFactoryCustomizer; + +/** + * {link UndertowServletWebServerFactory} 自定义配置。 + * 解决:UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used + * + * @author yangyunjiao + */ +public class CustomizerUndertowServletWebServerFactory implements WebServerFactoryCustomizer { + @Override + public void customize(UndertowServletWebServerFactory factory) { + factory.addDeploymentInfoCustomizers(deploymentInfo -> { + WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo(); + webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(false, 1024)); + deploymentInfo.addServletContextAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME, webSocketDeploymentInfo); + }); + } +} diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/id/HutoolIdConfiguration.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/id/HutoolIdConfiguration.java index 301f19535f665b104535f7c024d4164685089934..b0decf0db4beffd7896933611cf7df85bfb6df09 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/id/HutoolIdConfiguration.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/id/HutoolIdConfiguration.java @@ -29,7 +29,7 @@ public class HutoolIdConfiguration { } /** - * 雪花算法, 获取系统变量 SNOWFLAKE_WORKER_ID 和 SNOWFLAKE_DATACENTER_ID 值创建, + * 雪花算法, 获取系统变量 'yunjiao.springboot.extension.id.snowflakeWorkId' 和 'yunjiao.springboot.extension.id.snowflakeDatacenterId' 值创建, * 如果不存在,值默认是1 * * @param env 必须值 @@ -47,7 +47,7 @@ public class HutoolIdConfiguration { } if (workerId == 1L && datacenterId == 1L) { - log.warn("Hutool 框架雪花算法配置使用默认参数。如需支持分布式,请设置系统环境变量:{} 与 {}", CommonConsts.ENV_SNOWFLAKE_WORKER_ID, CommonConsts.ENV_SNOWFLAKE_DATACENTER_ID); + log.warn("Hutool 框架雪花算法配置使用默认参数。如需支持分布式,请设置系统环境变量:'{}' 与 '{}'", CommonConsts.ENV_SNOWFLAKE_WORKER_ID, CommonConsts.ENV_SNOWFLAKE_DATACENTER_ID); } return snowflake; } diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/querydsl/jpa/QuerydslJPAConfiguration.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/querydsl/jpa/QuerydslJPAConfiguration.java index e7430177b687191a8b576f0b2968cb9074a69aba..78bc95f1463ed4f9c5e5a3d9d54aa4a65c1777ff 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/querydsl/jpa/QuerydslJPAConfiguration.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/querydsl/jpa/QuerydslJPAConfiguration.java @@ -31,11 +31,16 @@ public class QuerydslJPAConfiguration { log.info("QueryDSL JPA Configuration"); } + /** + * {@link JPAQueryFactory} 创建实例 + * @param jpaQueryFactoryConfigurers 自定义配置 + * @return 实例 + */ @Bean - public JPAQueryFactory jpaQueryFactory(ObjectProvider jpaQueryFactoryConfigurer) { + public JPAQueryFactory jpaQueryFactory(ObjectProvider jpaQueryFactoryConfigurers) { JPAQueryFactory bean = new JPAQueryFactory(entityManager); // 执行自定义配置 - jpaQueryFactoryConfigurer.orderedStream().forEach(configurer -> configurer.configure(bean)); + jpaQueryFactoryConfigurers.orderedStream().forEach(configurer -> configurer.configure(bean)); if (log.isDebugEnabled()) { log.debug("Configure Bean [JPA Query Factory -> {}]", bean); diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/querydsl/sql/QuerydslSQLConfiguration.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/querydsl/sql/QuerydslSQLConfiguration.java index 5a6b29cfe5657da60f3efc2e6f9cc992608c1ef4..3a8bc57551afdb98e91a72b0249f741dd3e5a022 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/querydsl/sql/QuerydslSQLConfiguration.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/querydsl/sql/QuerydslSQLConfiguration.java @@ -5,7 +5,6 @@ import com.querydsl.sql.SQLQueryFactory; import com.querydsl.sql.SQLTemplates; import com.querydsl.sql.spring.SpringConnectionProvider; import com.querydsl.sql.spring.SpringExceptionTranslator; -import yunjiao.springboot.extension.querydsl.sql.SQLQueryCurdExecutor; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -14,6 +13,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import yunjiao.springboot.extension.querydsl.sql.SQLQueryCurdExecutor; import javax.sql.DataSource; @@ -29,11 +29,20 @@ import javax.sql.DataSource; public class QuerydslSQLConfiguration { private final DataSource dataSource; + /** + * {@link PostConstruct} 注解方法 + */ @PostConstruct public void postConstruct() { log.info("QueryDSL SQL Configuration"); } + /** + * {@link SQLQueryFactory} 创建实例 + * @param sqlTemplates 必须值 + * @param sqlQueryFactoryConfigurers 自定义配置 + * @return 实例 + */ @Bean SQLQueryFactory sqlQueryFactory(SQLTemplates sqlTemplates, ObjectProvider sqlQueryFactoryConfigurers) { diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/tika/TikaAutoConfiguration.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/tika/TikaAutoConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..dac55f55d3bb0710d5ffe526a62c794e39b08460 --- /dev/null +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/tika/TikaAutoConfiguration.java @@ -0,0 +1,70 @@ +package yunjiao.springboot.autoconfigure.tika; + +import jakarta.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; +import org.apache.tika.Tika; +import org.apache.tika.config.TikaConfig; +import org.apache.tika.detect.Detector; +import org.apache.tika.exception.TikaException; +import org.apache.tika.parser.AutoDetectParser; +import org.apache.tika.parser.Parser; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.core.io.Resource; +import org.xml.sax.SAXException; +import yunjiao.springboot.extension.tika._TIKA; + +import java.io.IOException; + +/** + * 验证码 自动配置 + * + * @author yangyunjiao + */ +@Slf4j +@AutoConfiguration +@ConditionalOnClass({_TIKA.class}) +@EnableConfigurationProperties({TikaProperties.class}) +public class TikaAutoConfiguration { + /** + * {@link PostConstruct} 注解方法 + */ + @PostConstruct + public void postConstruct() { + log.info("Tika Auto Configuration"); + } + + @Bean + Tika tika(TikaProperties properties) { + TikaConfig config = createTikaConfig(properties.getConfigXmlFile()); + + Detector detector = config.getDetector(); + Parser autoDetectParser = new AutoDetectParser(config); + Tika bean = new Tika(detector, autoDetectParser); + if (log.isDebugEnabled()) { + log.debug("Configure Bean [Tika -> {}]", bean); + } + + return bean; + } + + private TikaConfig createTikaConfig(Resource res) { + if (res != null) { + if (log.isDebugEnabled()) { + log.debug("Loading tika config file: {}", res.getFilename()); + } + try { + return new TikaConfig(res.getInputStream()); + } catch (IOException e) { + throw new RuntimeException("Unable to read default configuration", e); + } catch (TikaException | SAXException e) { + throw new RuntimeException("Unable to access default configuration", e); + } + } + + return TikaConfig.getDefaultConfig(); + } + +} diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/tika/TikaProperties.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/tika/TikaProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..4f22b9b89b5da000183b702b53c3e69516b8ae28 --- /dev/null +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/tika/TikaProperties.java @@ -0,0 +1,20 @@ +package yunjiao.springboot.autoconfigure.tika; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.core.io.Resource; +import yunjiao.springboot.autoconfigure.util.PropertyNameConsts; + +/** + * Tika配置文件 + * + * @author yangyunjiao + */ +@Data +@ConfigurationProperties(prefix = PropertyNameConsts.PROPERTY_PREFIX_TIKA) +public class TikaProperties { + /** + * tika配置xml文件路径,如:classpath:tika/config.xml + */ + private Resource configXmlFile; +} diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/util/PropertyNameConsts.java b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/util/PropertyNameConsts.java index dc8163526319b7da200d722795444a83dca60a31..8afaeb0b6f87ca6cc1d399f8607f957a86a66224 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/util/PropertyNameConsts.java +++ b/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/util/PropertyNameConsts.java @@ -16,6 +16,11 @@ public class PropertyNameConsts { */ public static final String PROPERTY_PREFIX_SPRING = "spring"; + /** + * tika 属性 + */ + public static final String PROPERTY_PREFIX_TIKA = PROPERTY_PREFIX_SPRING + ".tika"; + // id /** diff --git a/autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 8aecf27b30312201077d5edc2053cf9930c1914d..b6876bd034172f412f7b164dea613d1e1e226e1e 100644 --- a/autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,5 +1,6 @@ +yunjiao.springboot.autoconfigure.common.CommonAutoConfig yunjiao.springboot.autoconfigure.querydsl.QueryDSLAutoConfig yunjiao.springboot.autoconfigure.id.IdAutoConfiguration yunjiao.springboot.autoconfigure.captcha.CaptchaAutoConfiguration yunjiao.springboot.autoconfigure.apijson.ApijsonAutoConfiguration -yunjiao.springboot.autoconfigure.util.UtilsAutoConfig \ No newline at end of file +yunjiao.springboot.autoconfigure.tika.TikaAutoConfiguration \ No newline at end of file diff --git a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonAutoConfigurationTest.java b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonAutoConfigurationTest.java index b2e7d17be3d50099a3f6945dbba1a2dc29364727..9c70af45de85c4e5ef335c7fe7847f4772d8e88e 100644 --- a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonAutoConfigurationTest.java +++ b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonAutoConfigurationTest.java @@ -1,7 +1,7 @@ package yunjiao.springboot.autoconfigure.apijson; -import yunjiao.springboot.extension.apjson.orm.IdKeyApijsonStrategy; -import yunjiao.springboot.extension.apjson.orm.IdKeyStrategy; +import yunjiao.springboot.extension.apijson.orm.IdKeyApijsonStrategy; +import yunjiao.springboot.extension.apijson.orm.IdKeyStrategy; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; diff --git a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonFunctionParserConfigurerTest.java b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonFunctionParserConfigurerTest.java index 0736b33738cadb11488f0c8053d85dd66149849d..02cbcfc989577528dab92b1c944687ca2085b1a6 100644 --- a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonFunctionParserConfigurerTest.java +++ b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonFunctionParserConfigurerTest.java @@ -4,6 +4,7 @@ import apijson.framework.APIJSONFunctionParser; import apijson.orm.AbstractFunctionParser; import apijson.orm.script.ScriptExecutor; import org.junit.jupiter.api.Test; +import yunjiao.springboot.extension.apijson.ApijsonFunctionParserConfigurer; import java.util.List; import java.util.Map; diff --git a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonInitConfigurationTest.java b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonInitConfigurationTest.java index 52437177288829d5fe62787ba83f72cb5470f0d8..7a7813d0ae5b07cb1ad328626a84e6dd9cc76c42 100644 --- a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonInitConfigurationTest.java +++ b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonInitConfigurationTest.java @@ -7,6 +7,9 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import yunjiao.springboot.extension.apijson.ApijsonFunctionParserConfigurer; +import yunjiao.springboot.extension.apijson.ApijsonSqlConfigConfigurer; +import yunjiao.springboot.extension.apijson.ApijsonVerifierConfigurer; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; diff --git a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlConfigConfigurerTest.java b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlConfigConfigurerTest.java index 6cc802ba4da288ae81ba16c47c81ae7112c98679..97080056ed91901d849a5e44dadd5a28aa04d05f 100644 --- a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlConfigConfigurerTest.java +++ b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlConfigConfigurerTest.java @@ -4,6 +4,7 @@ import apijson.framework.APIJSONSQLConfig; import apijson.framework.ColumnUtil; import apijson.orm.AbstractSQLConfig; import org.junit.jupiter.api.Test; +import yunjiao.springboot.extension.apijson.ApijsonSqlConfigConfigurer; import java.util.List; import java.util.Map; diff --git a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlPropertiesTest.java b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlPropertiesTest.java index a4423423866e419fff9f6cd606cd319f4bb1adf5..ce311589451f16a58f09694614099aefe547e852 100644 --- a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlPropertiesTest.java +++ b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlPropertiesTest.java @@ -1,6 +1,6 @@ package yunjiao.springboot.autoconfigure.apijson; -import yunjiao.springboot.extension.apjson.util.ApijsonConsts; +import yunjiao.springboot.extension.apijson.util.ApijsonConsts; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringBootConfiguration; diff --git a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonVerifierConfigurerTest.java b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonVerifierConfigurerTest.java index 4e41c58ca9997368f8e4580a95636c8113b0723a..7ce6d6642f32e20b39d4ca9c9fc5476f013d1244 100644 --- a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonVerifierConfigurerTest.java +++ b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/ApijsonVerifierConfigurerTest.java @@ -5,6 +5,7 @@ import apijson.framework.APIJSONVerifier; import apijson.orm.AbstractVerifier; import apijson.orm.Entry; import org.junit.jupiter.api.Test; +import yunjiao.springboot.extension.apijson.ApijsonVerifierConfigurer; import java.util.List; import java.util.Map; diff --git a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/NewIdStrategyConfigurationTest.java b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/NewIdStrategyConfigurationTest.java index 6263638dd845f4b3432aacc6852bee6ddcaf42a5..b11ad15de3c5fc4ce9fe00903f1cb102612052c2 100644 --- a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/NewIdStrategyConfigurationTest.java +++ b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/NewIdStrategyConfigurationTest.java @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import yunjiao.springboot.extension.apjson.orm.*; +import yunjiao.springboot.extension.apijson.orm.*; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertInstanceOf; diff --git a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/RestApiAutoConfigurationTest.java b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/RestApiAutoConfigurationTest.java index 2068ac9f4fd71abca1e45280469b90aae135998f..444428ddc75a9c0de3327f802b277556721878b4 100644 --- a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/RestApiAutoConfigurationTest.java +++ b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/apijson/RestApiAutoConfigurationTest.java @@ -1,14 +1,14 @@ package yunjiao.springboot.autoconfigure.apijson; -import yunjiao.springboot.autoconfigure.apijson.fastjson2.Fastjson2EXtRestController; -import yunjiao.springboot.autoconfigure.apijson.fastjson2.Fastjson2RestController; -import yunjiao.springboot.autoconfigure.apijson.gson.GsonEXtRestController; -import yunjiao.springboot.autoconfigure.apijson.gson.GsonRestController; -import yunjiao.springboot.autoconfigure.util.PropertyNameConsts; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import yunjiao.springboot.autoconfigure.util.PropertyNameConsts; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2EXtRestController; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2RestController; +import yunjiao.springboot.extension.apijson.gson.GsonEXtRestController; +import yunjiao.springboot.extension.apijson.gson.GsonRestController; import static org.assertj.core.api.Assertions.assertThat; diff --git a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/captcha/CaptchaDemo.java b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/captcha/CaptchaDemo.java new file mode 100644 index 0000000000000000000000000000000000000000..48af21a364542ed70d482e9cedf06862e568221b --- /dev/null +++ b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/captcha/CaptchaDemo.java @@ -0,0 +1,175 @@ +package yunjiao.springboot.autoconfigure.captcha; + +import com.anji.captcha.service.CaptchaCacheService; +import yunjiao.springboot.extension.common.captcha.CaptchaCategory; +import yunjiao.springboot.extension.common.captcha.CaptchaData; +import yunjiao.springboot.extension.common.captcha.CaptchaService; +import yunjiao.springboot.extension.common.util.EnumCache; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * 验证码示例 + * + * @author yangyunjiao + */ +public class CaptchaDemo { + static class CaptchaFrame extends JFrame { + + private CaptchaServiceFactory captchaServiceFactory; + private CaptchaData currentCaptcha; + + private JComboBox typeComboBox; + private JLabel captchaImageLabel; + private JLabel backgroundImageLabel; + private JTextField inputField; + private JButton verifyButton; + private JButton refreshButton; + + public CaptchaFrame() { + buildService(); + + setTitle("验证码校验系统"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(500, 350); + setLocationRelativeTo(null); + + initUI(); + refreshCaptcha(); + } + + private void buildService() { + HutoolCaptchaConfiguration hutoolCaptchaConfiguration = new HutoolCaptchaConfiguration(); + HutoolCaptchaProperties hutoolCaptchaProperties = new HutoolCaptchaProperties(); + Map services = new HashMap<>(); + + services.put(CaptchaCategory.line, hutoolCaptchaConfiguration.lineCaptchaService(hutoolCaptchaProperties)); + services.put(CaptchaCategory.circle, hutoolCaptchaConfiguration.circleCaptchaService(hutoolCaptchaProperties)); + services.put(CaptchaCategory.shear, hutoolCaptchaConfiguration.sheareCaptchaService(hutoolCaptchaProperties)); + services.put(CaptchaCategory.gif, hutoolCaptchaConfiguration.gifCaptchaService(hutoolCaptchaProperties)); + + AnjiCaptchaConfiguration anjiCaptchaConfiguration = new AnjiCaptchaConfiguration(); + AnjiCaptchaProperties anjiCaptchaProperties = new AnjiCaptchaProperties(); + CaptchaCacheService captchaCacheService = com.anji.captcha.service.impl.CaptchaServiceFactory.getCache("local"); + com.anji.captcha.service.CaptchaService captchaService = anjiCaptchaConfiguration.captchaService(anjiCaptchaProperties); + + services.put(CaptchaCategory.blockPuzzle, anjiCaptchaConfiguration.blockPuzzleCaptchaService(captchaService, captchaCacheService, anjiCaptchaProperties)); + services.put(CaptchaCategory.clickWord, anjiCaptchaConfiguration.clickWorkCaptchaService(captchaService, captchaCacheService, anjiCaptchaProperties)); + captchaServiceFactory = new CaptchaServiceFactory(services); + } + + private void initUI() { + setLayout(new BorderLayout(10, 10)); + + // 顶部面板 - 验证码类型选择 + JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + topPanel.add(new JLabel("验证码类型:")); + + String[] captchaName = Arrays.stream(CaptchaCategory.values()).map(CaptchaCategory::getDescription).toArray(String[]::new); + + typeComboBox = new JComboBox<>(captchaName); + topPanel.add(typeComboBox); + + refreshButton = new JButton("刷新验证码"); + refreshButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + refreshCaptcha(); + } + }); + topPanel.add(refreshButton); + + add(topPanel, BorderLayout.NORTH); + + // 中间面板 - 验证码图片显示 + JPanel centerPanel = new JPanel(new BorderLayout()); + centerPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + captchaImageLabel = new JLabel(); + captchaImageLabel.setHorizontalAlignment(SwingConstants.CENTER); + backgroundImageLabel = new JLabel(); + backgroundImageLabel.setHorizontalAlignment(SwingConstants.CENTER); + centerPanel.add(captchaImageLabel, BorderLayout.CENTER); + centerPanel.add(backgroundImageLabel, BorderLayout.SOUTH); + + add(centerPanel, BorderLayout.CENTER); + + // 底部面板 - 输入和验证 + JPanel bottomPanel = new JPanel(new BorderLayout(10, 10)); + bottomPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10)); + + JPanel inputPanel = new JPanel(new BorderLayout(10, 10)); + inputPanel.add(new JLabel("请输入验证码:"), BorderLayout.WEST); + inputField = new JTextField(); + inputPanel.add(inputField, BorderLayout.CENTER); + + verifyButton = new JButton("验证"); + verifyButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + verifyCaptcha(); + } + }); + inputPanel.add(verifyButton, BorderLayout.EAST); + + bottomPanel.add(inputPanel, BorderLayout.CENTER); + add(bottomPanel, BorderLayout.SOUTH); + } + + private void refreshCaptcha() { + String selectedType = (String) typeComboBox.getSelectedItem(); + CaptchaCategory category = EnumCache.getInstance() + .lookupByValue(CaptchaCategory.class, selectedType, CaptchaCategory::getDescription); + currentCaptcha = captchaServiceFactory.findService(category).draw(); + + try { + ImageIcon icon = new ImageIcon(currentCaptcha.captchaImage()); + captchaImageLabel.setIcon(icon); + + if (currentCaptcha.backgroundImage() != null) { + icon = new ImageIcon(currentCaptcha.backgroundImage()); + backgroundImageLabel.setIcon(icon); + } else { + backgroundImageLabel.setIcon(null); + } + } catch (Exception e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(this, "加载验证码图片失败", "错误", JOptionPane.ERROR_MESSAGE); + } + + inputField.setText(""); + } + + private void verifyCaptcha() { + String userInput = inputField.getText().trim(); + if (userInput.isEmpty()) { + JOptionPane.showMessageDialog(this, "请输入验证码", "提示", JOptionPane.WARNING_MESSAGE); + return; + } + + String selectedType = (String) typeComboBox.getSelectedItem(); + CaptchaCategory category = EnumCache.getInstance() + .lookupByValue(CaptchaCategory.class, selectedType, CaptchaCategory::getDescription); + + boolean isValid = captchaServiceFactory.findService(category).verify(currentCaptcha.code(), userInput); + if (isValid) { + JOptionPane.showMessageDialog(this, "验证码正确!", "成功", JOptionPane.INFORMATION_MESSAGE); + refreshCaptcha(); + } else { + JOptionPane.showMessageDialog(this, "验证码错误,请重新输入", "错误", JOptionPane.ERROR_MESSAGE); + inputField.setText(""); + inputField.requestFocus(); + } + } + + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> new CaptchaFrame().setVisible(true)); + } +} diff --git a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/util/UtilsAutoConfigTest.java b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/common/CommonAutoConfigTest.java similarity index 79% rename from autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/util/UtilsAutoConfigTest.java rename to autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/common/CommonAutoConfigTest.java index e6847793588f3c5f3418d3b2f4c83939a9ee1906..41b348c8d1bfa87129eb409f13d7d7cf4b76f44d 100644 --- a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/util/UtilsAutoConfigTest.java +++ b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/common/CommonAutoConfigTest.java @@ -1,27 +1,28 @@ -package yunjiao.springboot.autoconfigure.util; +package yunjiao.springboot.autoconfigure.common; import cn.hutool.extra.spring.SpringUtil; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import static org.assertj.core.api.Assertions.assertThat; /** - * {@link UtilsAutoConfig} 单元测试用例 + * {@link CommonAutoConfig} 单元测试用例 * * @author yangyunjiao */ -public class UtilsAutoConfigTest { +public class CommonAutoConfigTest { private ApplicationContextRunner applicationContextRunner; @BeforeEach void setUp() { applicationContextRunner = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(UtilsAutoConfig.class, TestConfig.class)); + .withConfiguration(AutoConfigurations.of(CommonAutoConfig.class, TestConfig.class)); } @Test @@ -29,6 +30,7 @@ public class UtilsAutoConfigTest { applicationContextRunner .run(context -> { assertThat(context).hasSingleBean(SpringUtil.class); + assertThat(context).hasSingleBean(WebServerFactoryCustomizer.class); assertThat(context).hasSingleBean(TestService.class); }); } diff --git a/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/tika/TikaAutoConfigurationTest.java b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/tika/TikaAutoConfigurationTest.java new file mode 100644 index 0000000000000000000000000000000000000000..b7f7d74cfb696f63fe737f20a524d46beaee3fb1 --- /dev/null +++ b/autoconfigure/src/test/java/yunjiao/springboot/autoconfigure/tika/TikaAutoConfigurationTest.java @@ -0,0 +1,48 @@ +package yunjiao.springboot.autoconfigure.tika; + +import org.apache.tika.Tika; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import yunjiao.springboot.autoconfigure.util.PropertyNameConsts; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * {@link TikaAutoConfiguration} 单元测试用例 + * + * @author yangyunjiao + */ +public class TikaAutoConfigurationTest { + private ApplicationContextRunner applicationContextRunner; + + @BeforeEach + void setUp() { + applicationContextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(TikaAutoConfiguration.class)); + } + + @Test + void whenConfig_thenExist() { + applicationContextRunner + .run(context -> { + assertThat(context).hasSingleBean(Tika.class); + }); + } + + @Test + void giveConfigFile_whenConfig_thenFail() { + // 因为缺少包,所以异常,异常也说明配置文件正常加载了 + applicationContextRunner + .withPropertyValues(PropertyNameConsts.PROPERTY_PREFIX_TIKA + ".config-xml-file=classpath:tika/config.xml") + .run(context -> { + assertThat(context).hasFailed(); + assertThat(context.getStartupFailure()).isNotNull(); + assertThat(context.getStartupFailure()) + .rootCause() + .isInstanceOf(ClassNotFoundException.class) + .hasMessageContaining("org.apache.tika.parser.html.HtmlEncodingDetector"); + }); + } +} diff --git a/autoconfigure/src/test/resources/tika/config.xml b/autoconfigure/src/test/resources/tika/config.xml new file mode 100644 index 0000000000000000000000000000000000000000..06fd7ca62c65f816e424723065bd245acf4d4eff --- /dev/null +++ b/autoconfigure/src/test/resources/tika/config.xml @@ -0,0 +1,13 @@ + + + + + + + + + 64000 + + + + \ No newline at end of file diff --git a/dependencies/pom.xml b/dependencies/pom.xml index 7900c9a4b3eb05d96ee7b8d969f372d9aeda110d..5b77d99e6c5031a33ee42cda84df3fe09c43badb 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -28,6 +28,7 @@ 1.0.2 1.4.0 2.2 + 3.2.2 17 ${java.version} @@ -77,6 +78,12 @@ extension-id ${revision} + + io.gitee.yunjiao-source.spring-boot + extension-tika + ${revision} + + io.gitee.yunjiao-source.spring-boot starter-querydsl-jpa @@ -107,6 +114,11 @@ starter-captcha ${revision} + + io.gitee.yunjiao-source.spring-boot + starter-tika + ${revision} + @@ -123,6 +135,13 @@ pom import + + org.apache.tika + tika-bom + ${tika.version} + pom + import + @@ -182,6 +201,7 @@ apijson-gson ${apijson-gson.version} + diff --git a/docs/chapter/1.introduction.adoc b/docs/adoc/chapter/1.introduction.adoc similarity index 100% rename from docs/chapter/1.introduction.adoc rename to docs/adoc/chapter/1.introduction.adoc diff --git a/docs/chapter/2.id.adoc b/docs/adoc/chapter/2.id.adoc similarity index 95% rename from docs/chapter/2.id.adoc rename to docs/adoc/chapter/2.id.adoc index e30a450913df993656fd30650136bb194ca4184f..06b2002b56d0e38d0f76d4277888603bc487cd80 100644 --- a/docs/chapter/2.id.adoc +++ b/docs/adoc/chapter/2.id.adoc @@ -120,8 +120,8 @@ public class IdCommandLineRunner implements CommandLineRunner { 在使用中,日志中会出现警告信息 [source,console,indent=0] ---- -WARN --- [ main] y.s.e.i.u.EnvironmentWorkerIdAssigner : Uid-Generator 框架雪花算法配置使用默认参数。如需支持分布式,请设置系统环境变量:SNOWFLAKE_WORKER_ID -WARN --- [ main] y.s.a.id.HutoolIdConfiguration : Hutool 框架雪花算法配置使用默认参数。如需支持分布式,请设置系统环境变量:SNOWFLAKE_WORKER_ID 与 SNOWFLAKE_DATACENTER_ID +WARN --- [ main] y.s.e.i.u.EnvironmentWorkerIdAssigner : Uid-Generator 框架雪花算法配置使用默认参数。如需支持分布式,请设置系统环境变量:'yunjiao.springboot.extension.id.snowflakeWorkId' +WARN --- [ main] y.s.a.id.HutoolIdConfiguration : Hutool 框架雪花算法配置使用默认参数。如需支持分布式,请设置系统环境变量:'yunjiao.springboot.extension.id.snowflakeWorkId' 与 'yunjiao.springboot.extension.id.snowflakeDatacenterId' ---- 如果不是微服务或集群部署应用,可以忽略此警告 diff --git a/docs/chapter/3.apijson.adoc b/docs/adoc/chapter/3.apijson.adoc similarity index 100% rename from docs/chapter/3.apijson.adoc rename to docs/adoc/chapter/3.apijson.adoc diff --git a/docs/chapter/4.captcha.adoc b/docs/adoc/chapter/4.captcha.adoc similarity index 100% rename from docs/chapter/4.captcha.adoc rename to docs/adoc/chapter/4.captcha.adoc diff --git a/docs/chapter/5.querydsl.adoc b/docs/adoc/chapter/5.querydsl.adoc similarity index 100% rename from docs/chapter/5.querydsl.adoc rename to docs/adoc/chapter/5.querydsl.adoc diff --git a/docs/index.adoc b/docs/adoc/index.adoc similarity index 100% rename from docs/index.adoc rename to docs/adoc/index.adoc diff --git a/examples/example-apijson-fastjson2/pom.xml b/examples/example-apijson-fastjson2/pom.xml index 37c439fc732152d5ac6146160f0311afa6c22be8..8cefd72cc2b1ded2eb60cccc0302c3d89162ce4b 100644 --- a/examples/example-apijson-fastjson2/pom.xml +++ b/examples/example-apijson-fastjson2/pom.xml @@ -23,6 +23,17 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-undertow @@ -31,7 +42,14 @@ - + + + + org.springframework.boot + spring-boot-maven-plugin + + + \ No newline at end of file diff --git a/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/ApijsonFastjson2Configuration.java b/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/ApijsonFastjson2Configuration.java index bcb39def2aad7be9990ab7ce38af9858a97be65c..44ab9201c3320fff02c046de52ac0a730195d5ec 100644 --- a/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/ApijsonFastjson2Configuration.java +++ b/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/ApijsonFastjson2Configuration.java @@ -1,7 +1,7 @@ package yunjiao.springboot.example.apijson; import yunjiao.springboot.example.apijson.fastjson2.CustomFastjson2Creator; -import yunjiao.springboot.extension.apjson.util.ApijsonConsts; +import yunjiao.springboot.extension.apijson.util.ApijsonConsts; import yunjiao.springboot.autoconfigure.apijson.ApijsonSqlProperties; import jakarta.annotation.Nonnull; import lombok.extern.slf4j.Slf4j; diff --git a/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/config/CustomFunctionParserConfigurer.java b/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/config/CustomFunctionParserConfigurer.java index ec3d9edbc00c3edb09844d8e1360880501d31322..20d4b085d093b8ed1469b85ba6878c79d3736053 100644 --- a/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/config/CustomFunctionParserConfigurer.java +++ b/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/config/CustomFunctionParserConfigurer.java @@ -2,8 +2,8 @@ package yunjiao.springboot.example.apijson.config; import apijson.orm.script.JavaScriptExecutor; import apijson.orm.script.ScriptExecutor; -import yunjiao.springboot.autoconfigure.apijson.ApijsonFunctionParserConfigurer; import org.springframework.context.annotation.Configuration; +import yunjiao.springboot.extension.apijson.ApijsonFunctionParserConfigurer; import java.util.List; import java.util.Map; diff --git a/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/config/CustomSqlConfigConfigurer.java b/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/config/CustomSqlConfigConfigurer.java index d3a6ee00824d872a6fc4a0efc63c24905e1c7b2c..216df3d042d6bd925a105aaa094d93331e69ae84 100644 --- a/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/config/CustomSqlConfigConfigurer.java +++ b/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/config/CustomSqlConfigConfigurer.java @@ -1,8 +1,8 @@ package yunjiao.springboot.example.apijson.config; import apijson.StringUtil; -import yunjiao.springboot.autoconfigure.apijson.ApijsonSqlConfigConfigurer; import org.springframework.context.annotation.Configuration; +import yunjiao.springboot.extension.apijson.ApijsonSqlConfigConfigurer; import java.util.Arrays; import java.util.HashMap; diff --git a/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/config/CustomVerifierConfigurer.java b/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/config/CustomVerifierConfigurer.java index f74268ece38454b4dcaf923bde9aa5c80b2752c1..bc5e3a27284d43fb16c9507fdf25e052c97ad2a4 100644 --- a/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/config/CustomVerifierConfigurer.java +++ b/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/config/CustomVerifierConfigurer.java @@ -3,8 +3,8 @@ package yunjiao.springboot.example.apijson.config; import apijson.RequestMethod; import apijson.StringUtil; import apijson.orm.Entry; -import yunjiao.springboot.autoconfigure.apijson.ApijsonVerifierConfigurer; import org.springframework.context.annotation.Configuration; +import yunjiao.springboot.extension.apijson.ApijsonVerifierConfigurer; import java.util.List; import java.util.Map; diff --git a/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2Creator.java b/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2Creator.java index 995363a8be67dcfdbf63882c69e3d1ea28818267..4c6df2f9c5c87fd4b072f25cee7fc6d495cf51f2 100644 --- a/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2Creator.java +++ b/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2Creator.java @@ -2,7 +2,7 @@ package yunjiao.springboot.example.apijson.fastjson2; import apijson.fastjson2.APIJSONFunctionParser; import yunjiao.springboot.autoconfigure.apijson.ApijsonSqlProperties; -import yunjiao.springboot.autoconfigure.apijson.fastjson2.Fastjson2Creator; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2Creator; import javax.sql.DataSource; import java.io.Serializable; @@ -14,7 +14,7 @@ import java.io.Serializable; */ public class CustomFastjson2Creator extends Fastjson2Creator { public CustomFastjson2Creator(DataSource dataSource, ApijsonSqlProperties sqlProperties) { - super(dataSource, sqlProperties); + super(dataSource, sqlProperties.getConfig().getVersion()); } @Override diff --git a/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2FunctionParser.java b/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2FunctionParser.java index a8271170e655d4eca46fecf2001e73aa5486c662..091fd3a2a6c6cb737694c6471b4f1db12caec11b 100644 --- a/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2FunctionParser.java +++ b/examples/example-apijson-fastjson2/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2FunctionParser.java @@ -11,9 +11,9 @@ import apijson.orm.Visitor; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import yunjiao.springboot.autoconfigure.apijson.ApijsonUtils; -import yunjiao.springboot.autoconfigure.apijson.fastjson2.Fastjson2FunctionParser; -import yunjiao.springboot.autoconfigure.apijson.fastjson2.Fastjson2Parser; -import yunjiao.springboot.autoconfigure.apijson.fastjson2.Fastjson2Verifier; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2FunctionParser; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2Parser; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2Verifier; import java.io.Serializable; import java.util.ArrayList; diff --git a/examples/example-apijson-gson/pom.xml b/examples/example-apijson-gson/pom.xml index 59de71f1fdf206ae530da1d2a6609fd8e4fb0f7a..bbe75fe5e04129643415f45c36983b3d269f730c 100644 --- a/examples/example-apijson-gson/pom.xml +++ b/examples/example-apijson-gson/pom.xml @@ -23,6 +23,17 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-undertow @@ -31,6 +42,13 @@ - + + + + org.springframework.boot + spring-boot-maven-plugin + + + \ No newline at end of file diff --git a/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/ApijsonGsonConfiguration.java b/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/ApijsonGsonConfiguration.java index 180134903102cac5bde2f66526184c28df53eab0..41665f9c018d6c56048f269427e3c824b4c6a26b 100644 --- a/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/ApijsonGsonConfiguration.java +++ b/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/ApijsonGsonConfiguration.java @@ -1,7 +1,7 @@ package yunjiao.springboot.example.apijson; import yunjiao.springboot.example.apijson.gson.CustomGsonCreator; -import yunjiao.springboot.extension.apjson.util.ApijsonConsts; +import yunjiao.springboot.extension.apijson.util.ApijsonConsts; import yunjiao.springboot.autoconfigure.apijson.ApijsonSqlProperties; import jakarta.annotation.Nonnull; import lombok.extern.slf4j.Slf4j; diff --git a/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/config/CustomFunctionParserConfigurer.java b/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/config/CustomFunctionParserConfigurer.java index ec3d9edbc00c3edb09844d8e1360880501d31322..20d4b085d093b8ed1469b85ba6878c79d3736053 100644 --- a/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/config/CustomFunctionParserConfigurer.java +++ b/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/config/CustomFunctionParserConfigurer.java @@ -2,8 +2,8 @@ package yunjiao.springboot.example.apijson.config; import apijson.orm.script.JavaScriptExecutor; import apijson.orm.script.ScriptExecutor; -import yunjiao.springboot.autoconfigure.apijson.ApijsonFunctionParserConfigurer; import org.springframework.context.annotation.Configuration; +import yunjiao.springboot.extension.apijson.ApijsonFunctionParserConfigurer; import java.util.List; import java.util.Map; diff --git a/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/config/CustomSqlConfigConfigurer.java b/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/config/CustomSqlConfigConfigurer.java index d3a6ee00824d872a6fc4a0efc63c24905e1c7b2c..216df3d042d6bd925a105aaa094d93331e69ae84 100644 --- a/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/config/CustomSqlConfigConfigurer.java +++ b/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/config/CustomSqlConfigConfigurer.java @@ -1,8 +1,8 @@ package yunjiao.springboot.example.apijson.config; import apijson.StringUtil; -import yunjiao.springboot.autoconfigure.apijson.ApijsonSqlConfigConfigurer; import org.springframework.context.annotation.Configuration; +import yunjiao.springboot.extension.apijson.ApijsonSqlConfigConfigurer; import java.util.Arrays; import java.util.HashMap; diff --git a/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/config/CustomVerifierConfigurer.java b/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/config/CustomVerifierConfigurer.java index f74268ece38454b4dcaf923bde9aa5c80b2752c1..bc5e3a27284d43fb16c9507fdf25e052c97ad2a4 100644 --- a/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/config/CustomVerifierConfigurer.java +++ b/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/config/CustomVerifierConfigurer.java @@ -3,8 +3,8 @@ package yunjiao.springboot.example.apijson.config; import apijson.RequestMethod; import apijson.StringUtil; import apijson.orm.Entry; -import yunjiao.springboot.autoconfigure.apijson.ApijsonVerifierConfigurer; import org.springframework.context.annotation.Configuration; +import yunjiao.springboot.extension.apijson.ApijsonVerifierConfigurer; import java.util.List; import java.util.Map; diff --git a/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/gson/CustomGsonCreator.java b/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/gson/CustomGsonCreator.java index 50465d72042b33429a6b8d989c07c93f814a7b34..d9458faf92d88800692d87a3347fccf46205ab57 100644 --- a/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/gson/CustomGsonCreator.java +++ b/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/gson/CustomGsonCreator.java @@ -2,7 +2,7 @@ package yunjiao.springboot.example.apijson.gson; import apijson.gson.APIJSONFunctionParser; import yunjiao.springboot.autoconfigure.apijson.ApijsonSqlProperties; -import yunjiao.springboot.autoconfigure.apijson.gson.GsonCreator; +import yunjiao.springboot.extension.apijson.gson.GsonCreator; import javax.sql.DataSource; import java.io.Serializable; @@ -14,7 +14,7 @@ import java.io.Serializable; */ public class CustomGsonCreator extends GsonCreator { public CustomGsonCreator(DataSource dataSource, ApijsonSqlProperties sqlProperties) { - super(dataSource, sqlProperties); + super(dataSource, sqlProperties.getConfig().getVersion()); } @Override diff --git a/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/gson/CustomGsonFunctionParser.java b/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/gson/CustomGsonFunctionParser.java index d4e534cef01b90d45316b206a2257a7282b878cc..d32e92a60c113a7301ae274c9560434cda15ea06 100644 --- a/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/gson/CustomGsonFunctionParser.java +++ b/examples/example-apijson-gson/src/main/java/yunjiao/springboot/example/apijson/gson/CustomGsonFunctionParser.java @@ -6,8 +6,8 @@ import apijson.StringUtil; import apijson.orm.AbstractVerifier; import apijson.orm.Visitor; import yunjiao.springboot.autoconfigure.apijson.ApijsonUtils; -import yunjiao.springboot.autoconfigure.apijson.gson.GsonFunctionParser; -import yunjiao.springboot.autoconfigure.apijson.gson.GsonVerifier; +import yunjiao.springboot.extension.apijson.gson.GsonFunctionParser; +import yunjiao.springboot.extension.apijson.gson.GsonVerifier; import java.io.Serializable; import java.util.ArrayList; diff --git a/examples/example-apijson-multipledatasource/pom.xml b/examples/example-apijson-multipledatasource/pom.xml index 438c203048601b8c76695125111f0c505fc59cce..dc21781a6b8c8e5777ab9fde964818b6aa1aa856 100644 --- a/examples/example-apijson-multipledatasource/pom.xml +++ b/examples/example-apijson-multipledatasource/pom.xml @@ -23,6 +23,17 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-undertow @@ -35,7 +46,14 @@ - + + + + org.springframework.boot + spring-boot-maven-plugin + + + \ No newline at end of file diff --git a/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/ApijsonMultipleDataSourceConfiguration.java b/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/ApijsonMultipleDataSourceConfiguration.java index 8e2574bb7f2a67b3d5d3bf45da51b7280a384ed2..d1fe053533374ea81e98f16e51edc8bafd54fcc8 100644 --- a/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/ApijsonMultipleDataSourceConfiguration.java +++ b/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/ApijsonMultipleDataSourceConfiguration.java @@ -13,7 +13,7 @@ import yunjiao.springboot.extension.common.spring.jdbc.MultipleDataSource; import yunjiao.springboot.autoconfigure.apijson.ApijsonSqlProperties; import yunjiao.springboot.example.apijson.fastjson2.CustomFastjson2Creator; import yunjiao.springboot.extension.common.spring.jdbc.DataSourceContextHolder; -import yunjiao.springboot.extension.apjson.util.ApijsonConsts; +import yunjiao.springboot.extension.apijson.util.ApijsonConsts; import javax.sql.DataSource; import java.util.HashMap; diff --git a/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/config/CustomFunctionParserConfigurer.java b/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/config/CustomFunctionParserConfigurer.java index ec3d9edbc00c3edb09844d8e1360880501d31322..20d4b085d093b8ed1469b85ba6878c79d3736053 100644 --- a/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/config/CustomFunctionParserConfigurer.java +++ b/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/config/CustomFunctionParserConfigurer.java @@ -2,8 +2,8 @@ package yunjiao.springboot.example.apijson.config; import apijson.orm.script.JavaScriptExecutor; import apijson.orm.script.ScriptExecutor; -import yunjiao.springboot.autoconfigure.apijson.ApijsonFunctionParserConfigurer; import org.springframework.context.annotation.Configuration; +import yunjiao.springboot.extension.apijson.ApijsonFunctionParserConfigurer; import java.util.List; import java.util.Map; diff --git a/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/config/CustomSqlConfigConfigurer.java b/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/config/CustomSqlConfigConfigurer.java index d3a6ee00824d872a6fc4a0efc63c24905e1c7b2c..216df3d042d6bd925a105aaa094d93331e69ae84 100644 --- a/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/config/CustomSqlConfigConfigurer.java +++ b/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/config/CustomSqlConfigConfigurer.java @@ -1,8 +1,8 @@ package yunjiao.springboot.example.apijson.config; import apijson.StringUtil; -import yunjiao.springboot.autoconfigure.apijson.ApijsonSqlConfigConfigurer; import org.springframework.context.annotation.Configuration; +import yunjiao.springboot.extension.apijson.ApijsonSqlConfigConfigurer; import java.util.Arrays; import java.util.HashMap; diff --git a/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/config/CustomVerifierConfigurer.java b/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/config/CustomVerifierConfigurer.java index f74268ece38454b4dcaf923bde9aa5c80b2752c1..bc5e3a27284d43fb16c9507fdf25e052c97ad2a4 100644 --- a/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/config/CustomVerifierConfigurer.java +++ b/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/config/CustomVerifierConfigurer.java @@ -3,8 +3,8 @@ package yunjiao.springboot.example.apijson.config; import apijson.RequestMethod; import apijson.StringUtil; import apijson.orm.Entry; -import yunjiao.springboot.autoconfigure.apijson.ApijsonVerifierConfigurer; import org.springframework.context.annotation.Configuration; +import yunjiao.springboot.extension.apijson.ApijsonVerifierConfigurer; import java.util.List; import java.util.Map; diff --git a/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2Creator.java b/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2Creator.java index 995363a8be67dcfdbf63882c69e3d1ea28818267..4c6df2f9c5c87fd4b072f25cee7fc6d495cf51f2 100644 --- a/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2Creator.java +++ b/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2Creator.java @@ -2,7 +2,7 @@ package yunjiao.springboot.example.apijson.fastjson2; import apijson.fastjson2.APIJSONFunctionParser; import yunjiao.springboot.autoconfigure.apijson.ApijsonSqlProperties; -import yunjiao.springboot.autoconfigure.apijson.fastjson2.Fastjson2Creator; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2Creator; import javax.sql.DataSource; import java.io.Serializable; @@ -14,7 +14,7 @@ import java.io.Serializable; */ public class CustomFastjson2Creator extends Fastjson2Creator { public CustomFastjson2Creator(DataSource dataSource, ApijsonSqlProperties sqlProperties) { - super(dataSource, sqlProperties); + super(dataSource, sqlProperties.getConfig().getVersion()); } @Override diff --git a/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2FunctionParser.java b/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2FunctionParser.java index a8271170e655d4eca46fecf2001e73aa5486c662..091fd3a2a6c6cb737694c6471b4f1db12caec11b 100644 --- a/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2FunctionParser.java +++ b/examples/example-apijson-multipledatasource/src/main/java/yunjiao/springboot/example/apijson/fastjson2/CustomFastjson2FunctionParser.java @@ -11,9 +11,9 @@ import apijson.orm.Visitor; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import yunjiao.springboot.autoconfigure.apijson.ApijsonUtils; -import yunjiao.springboot.autoconfigure.apijson.fastjson2.Fastjson2FunctionParser; -import yunjiao.springboot.autoconfigure.apijson.fastjson2.Fastjson2Parser; -import yunjiao.springboot.autoconfigure.apijson.fastjson2.Fastjson2Verifier; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2FunctionParser; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2Parser; +import yunjiao.springboot.extension.apijson.fastjson2.Fastjson2Verifier; import java.io.Serializable; import java.util.ArrayList; diff --git a/examples/example-apijson-multipledatasource/src/test/java/yunjiao/springboot/example/apijson/MultipleDataSourceDemoTestIT.java b/examples/example-apijson-multipledatasource/src/test/java/yunjiao/springboot/example/apijson/MultipleDataSourceTestIT.java similarity index 97% rename from examples/example-apijson-multipledatasource/src/test/java/yunjiao/springboot/example/apijson/MultipleDataSourceDemoTestIT.java rename to examples/example-apijson-multipledatasource/src/test/java/yunjiao/springboot/example/apijson/MultipleDataSourceTestIT.java index 88f4831a7fa19cbd925d0696bf8dc3c9b5c22373..6c52a3380f53b9eacf0b07b3edeb72676dad410a 100644 --- a/examples/example-apijson-multipledatasource/src/test/java/yunjiao/springboot/example/apijson/MultipleDataSourceDemoTestIT.java +++ b/examples/example-apijson-multipledatasource/src/test/java/yunjiao/springboot/example/apijson/MultipleDataSourceTestIT.java @@ -16,7 +16,7 @@ import java.nio.charset.StandardCharsets; * * @author yangyunjiao */ -public class MultipleDataSourceDemoTestIT { +public class MultipleDataSourceTestIT { private final WebClient commonClient = WebClient.builder() .baseUrl("http://localhost:8080/api-json/common") .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) diff --git a/examples/example-captcha/pom.xml b/examples/example-captcha/pom.xml index 3e883178a4222fd592a39a45d8140354921d0714..0b4d16522503c9c0d31e5b15a836fb85047eda35 100644 --- a/examples/example-captcha/pom.xml +++ b/examples/example-captcha/pom.xml @@ -28,7 +28,19 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-undertow + + org.springframework.boot spring-boot-starter-webflux @@ -36,5 +48,12 @@ - + + + + org.springframework.boot + spring-boot-maven-plugin + + + \ No newline at end of file diff --git a/examples/example-id/pom.xml b/examples/example-id/pom.xml index bd84146e82ee83aef0de2ac1fae38976e58a83eb..befd7c2d08748f5fb04ac4b54fcb8e0fd21a4431 100644 --- a/examples/example-id/pom.xml +++ b/examples/example-id/pom.xml @@ -23,9 +23,27 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + - + + org.springframework.boot + spring-boot-starter-undertow + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + \ No newline at end of file diff --git a/examples/example-querydsl-jpa/pom.xml b/examples/example-querydsl-jpa/pom.xml index b67e779a32e27792b2f243d257202a9eca6b3ecf..6c5a302501c4c81c02e00c01b4be3e802ac0fb3c 100644 --- a/examples/example-querydsl-jpa/pom.xml +++ b/examples/example-querydsl-jpa/pom.xml @@ -23,6 +23,17 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-undertow @@ -40,6 +51,15 @@ + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/examples/example-querydsl-sql/pom.xml b/examples/example-querydsl-sql/pom.xml index 95c1070f1eaa95b19537555b7d23b1b548612aed..6b78f19034bd2132eff65424db62bada9862f53d 100644 --- a/examples/example-querydsl-sql/pom.xml +++ b/examples/example-querydsl-sql/pom.xml @@ -23,7 +23,19 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-undertow + + org.springframework.boot spring-boot-starter-data-jdbc @@ -80,5 +92,12 @@ - + + + + org.springframework.boot + spring-boot-maven-plugin + + + \ No newline at end of file diff --git a/examples/example-tika/pom.xml b/examples/example-tika/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..3984eb2b21db05140a211f02b574e4e75fae36d6 --- /dev/null +++ b/examples/example-tika/pom.xml @@ -0,0 +1,62 @@ + + + + io.gitee.yunjiao-source.spring-boot + examples + ${revision} + + 4.0.0 + + example-tika + jar + Example :: Tika + Tika 示例应用 + + + + io.gitee.yunjiao-source.spring-boot + starter-tika + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-undertow + + + + + org.apache.commons + commons-lang3 + 3.18.0 + + + + org.springframework + spring-webflux + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaCommandLineRunner.java b/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaCommandLineRunner.java new file mode 100644 index 0000000000000000000000000000000000000000..f0b999d029812b538507f9a116a4c3f2ceb0f714 --- /dev/null +++ b/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaCommandLineRunner.java @@ -0,0 +1,27 @@ +package yunjiao.springboot.example.tika; + +import lombok.extern.slf4j.Slf4j; +import org.apache.tika.Tika; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; + +/** + * 示例 + * + * @author yangyunjiao + */ +@Slf4j +@Component +public class TikaCommandLineRunner implements CommandLineRunner { + @Autowired + private Tika tika; + + @Override + public void run(String... args) throws Exception { + Assert.notNull(tika, "Tika 配置失败"); + } + + +} diff --git a/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaConfiguration.java b/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..17df03a1ff0db52d747de23d9cf45c2a78b97798 --- /dev/null +++ b/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaConfiguration.java @@ -0,0 +1,17 @@ +package yunjiao.springboot.example.tika; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Configuration; + +/** + * 配置 + * + * @author yangyunjiao + */ +@Slf4j +@Configuration +public class TikaConfiguration { + + + +} diff --git a/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaController.java b/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaController.java new file mode 100644 index 0000000000000000000000000000000000000000..5bd5332c21138c83eadcf62be6a37a4e90f469f4 --- /dev/null +++ b/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaController.java @@ -0,0 +1,33 @@ +package yunjiao.springboot.example.tika; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +/** + * 控制器 + * + * @author yangyunjiao + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("tika") +public class TikaController { + private final TikaService tikaService; + + @PostMapping("/extract-text") + public ResponseEntity extractText(@RequestParam("file") MultipartFile file) { + String extractedText = tikaService.extractText(file); + return ResponseEntity.ok(extractedText); + } + + @PostMapping("/detect-mime-type") + public ResponseEntity detectMetadata(@RequestParam("file") MultipartFile file) { + String mimeType = tikaService.detectMimeType(file); + return ResponseEntity.ok(mimeType); + } +} diff --git a/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaExampleApplication.java b/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaExampleApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..ef70d2799d4c3d1847a2a85edb4fedfbfe004e4f --- /dev/null +++ b/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaExampleApplication.java @@ -0,0 +1,16 @@ +package yunjiao.springboot.example.tika; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * 程序入口 + * + * @author yangyunjiao + */ +@SpringBootApplication +public class TikaExampleApplication { + public static void main(String[] args) { + SpringApplication.run(TikaExampleApplication.class, args); + } +} diff --git a/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaService.java b/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaService.java new file mode 100644 index 0000000000000000000000000000000000000000..d746f74115ce26f442d8f9fd7e6d74b63a80a8fd --- /dev/null +++ b/examples/example-tika/src/main/java/yunjiao/springboot/example/tika/TikaService.java @@ -0,0 +1,36 @@ +package yunjiao.springboot.example.tika; + +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.apache.tika.Tika; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +/** + * tika服务 + * + * @author yangyunjiao + */ +@Service +@RequiredArgsConstructor +public class TikaService { + private final Tika tika; + + /** + * 提取文件中的文本内容 + */ + @SneakyThrows + public String extractText(MultipartFile file) { + // parseToString 方法内部会自动关闭 InputStream + return tika.parseToString(file.getInputStream()); + } + + + /** + * 检测文件的 MIME 类型(根据内容而非扩展名) + */ + @SneakyThrows + public String detectMimeType(MultipartFile file){ + return tika.detect(file.getInputStream()); + } +} diff --git a/examples/example-tika/src/main/resources/application.yml b/examples/example-tika/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..bdb14480faf7e9e95407fe6e4b5188c784883a3b --- /dev/null +++ b/examples/example-tika/src/main/resources/application.yml @@ -0,0 +1,10 @@ +spring: + tika: + config-xml-file: classpath:tika/config.xml + +logging: + level: + root: info + org.springframework.boot.autoconfigure: info + yunjiao.springboot: debug + diff --git a/examples/example-tika/src/main/resources/tika/config.xml b/examples/example-tika/src/main/resources/tika/config.xml new file mode 100644 index 0000000000000000000000000000000000000000..d0e8c763321cadf3fd113459494cc2b75d318478 --- /dev/null +++ b/examples/example-tika/src/main/resources/tika/config.xml @@ -0,0 +1,23 @@ + + + + + + + + + 64000 + + + + + 64001 + + + + + 64002 + + + + \ No newline at end of file diff --git a/examples/example-tika/src/test/java/yunjiao/springboot/example/tika/TikaControllerTestIT.java b/examples/example-tika/src/test/java/yunjiao/springboot/example/tika/TikaControllerTestIT.java new file mode 100644 index 0000000000000000000000000000000000000000..ac72c2d1eb9a65afdef0756035db0c722e8b5274 --- /dev/null +++ b/examples/example-tika/src/test/java/yunjiao/springboot/example/tika/TikaControllerTestIT.java @@ -0,0 +1,109 @@ +package yunjiao.springboot.example.tika; + +import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; + +/** + * 演示 + * + * @author yangyunjiao + */ +public class TikaControllerTestIT { + private final WebClient commonClient = WebClient.builder() + .baseUrl("http://localhost:8080/tika") + .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .build(); + + @Test + void testExtractTextWithText() { + String fileName = "text.txt"; + String data = extractText(fileName); + System.out.println(fileName + "=" + data); + } + + @Test + void testExtractTextWithImage() { + String fileName = "image.png"; + String data = extractText(fileName); + System.out.println(fileName + "=" + data); + } + + @Test + void testExtractTextWithPdf() { + String fileName = "pdf.pdf"; + String data = extractText(fileName); + System.out.println(fileName + "=" + data); + } + + @Test + void testExtractTextWithDoc() { + String fileName = "docx.docx"; + String data = extractText(fileName); + System.out.println(fileName + "=" + data); + } + + @Test + void testExtractTextWithXlsx() { + String fileName = "xlsx.xlsx"; + String data = extractText(fileName); + System.out.println(fileName + "=" + data); + } + + @Test + void detectMimeTypeText() { + String fileName = "text.txt"; + String data = detectMimeType(fileName); + System.out.println(fileName + "=" + data); + } + + @Test + void detectMimeTypePdf() { + String fileName = "pdf.pdf"; + String data = detectMimeType(fileName); + System.out.println(fileName + "=" + data); + } + + + @Test + void detectMimeTypeImage() { + String fileName = "image.png"; + String data = detectMimeType(fileName); + System.out.println(fileName + "=" + data); + } + + private String detectMimeType(String fileName) { + MultiValueMap parts = createMultiValueMap(fileName); + return commonClient.post() + .uri("/detect-mime-type") + .contentType(MediaType.MULTIPART_FORM_DATA) + .body(BodyInserters.fromMultipartData(parts)) + .retrieve() + .bodyToMono(String.class) + .block(); + } + + private String extractText(String fileName) { + MultiValueMap parts = createMultiValueMap(fileName); + return commonClient.post() + .uri("/extract-text") + .contentType(MediaType.MULTIPART_FORM_DATA) + .body(BodyInserters.fromMultipartData(parts)) + .retrieve() + .bodyToMono(String.class) + .block(); + } + + private MultiValueMap createMultiValueMap(String fileName) { + ClassPathResource resource = new ClassPathResource(fileName); + MultiValueMap parts = new LinkedMultiValueMap<>(); + parts.add("file", resource); + parts.add("fileName", fileName); + return parts; + } +} diff --git a/examples/example-tika/src/test/resources/docx.docx b/examples/example-tika/src/test/resources/docx.docx new file mode 100644 index 0000000000000000000000000000000000000000..f7aaee54a5e95b7536e7a73dbc9611cad142e2d9 Binary files /dev/null and b/examples/example-tika/src/test/resources/docx.docx differ diff --git a/examples/example-tika/src/test/resources/image.png b/examples/example-tika/src/test/resources/image.png new file mode 100644 index 0000000000000000000000000000000000000000..a0e7910d2083a8bb42a1407618f577993acf8500 Binary files /dev/null and b/examples/example-tika/src/test/resources/image.png differ diff --git a/examples/example-tika/src/test/resources/pdf.pdf b/examples/example-tika/src/test/resources/pdf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..29ded2c1a064745fdbdbcf56472ac5b113e47417 Binary files /dev/null and b/examples/example-tika/src/test/resources/pdf.pdf differ diff --git a/examples/example-tika/src/test/resources/text.txt b/examples/example-tika/src/test/resources/text.txt new file mode 100644 index 0000000000000000000000000000000000000000..ce55fb04d15cc35c480123bef728d4add2c1d6d1 --- /dev/null +++ b/examples/example-tika/src/test/resources/text.txt @@ -0,0 +1 @@ +Hello, 中文 \ No newline at end of file diff --git a/examples/example-tika/src/test/resources/xlsx.xlsx b/examples/example-tika/src/test/resources/xlsx.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4a5e73c0d8d49816da97696672319cc0a4f2feb4 Binary files /dev/null and b/examples/example-tika/src/test/resources/xlsx.xlsx differ diff --git a/examples/pom.xml b/examples/pom.xml index 0bcb83de96e48801ae4a8db8a119702fd117be10..fb7edfd512fc9a96aeffc3ace2c4cda43375fabc 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -24,6 +24,7 @@ example-apijson-gson example-apijson-multipledatasource example-captcha + example-tika @@ -125,11 +126,6 @@ org.codehaus.mojo flatten-maven-plugin - - - org.springframework.boot - spring-boot-maven-plugin - diff --git a/extensions/extension-apijson/pom.xml b/extensions/extension-apijson/pom.xml index 943fda77e56675e2aeff27fda65fc4bbc798dc1b..11a9ebfeefe00079d659230c54eb342e07e0b1c4 100644 --- a/extensions/extension-apijson/pom.xml +++ b/extensions/extension-apijson/pom.xml @@ -26,18 +26,24 @@ - cn.hutool - hutool-core + org.springframework + spring-web + + + jakarta.servlet + jakarta.servlet-api + + com.github.APIJSON apijson-fastjson2 - provided + true com.github.APIJSON apijson-gson - provided + true \ No newline at end of file diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonFunctionParserConfigurer.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/ApijsonFunctionParserConfigurer.java similarity index 91% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonFunctionParserConfigurer.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/ApijsonFunctionParserConfigurer.java index c42e8eabf7fc785a271dc4210d1ed99c92c14cab..9b996fd48c5f4ec417049fe5d072f254d2293c1b 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonFunctionParserConfigurer.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/ApijsonFunctionParserConfigurer.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.autoconfigure.apijson; +package yunjiao.springboot.extension.apijson; import apijson.orm.script.ScriptExecutor; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlConfigConfigurer.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/ApijsonSqlConfigConfigurer.java similarity index 93% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlConfigConfigurer.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/ApijsonSqlConfigConfigurer.java index c9d273289f25eac51d971df18678e14a55ef83a0..66df748314ad21ce90b8187d7a98a8e71f2bc5db 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonSqlConfigConfigurer.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/ApijsonSqlConfigConfigurer.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.autoconfigure.apijson; +package yunjiao.springboot.extension.apijson; import java.util.List; import java.util.Map; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonVerifierConfigurer.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/ApijsonVerifierConfigurer.java similarity index 96% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonVerifierConfigurer.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/ApijsonVerifierConfigurer.java index 0ae797c864293fa74be989c400f7919f23156a0e..9e3f6d9896df5f0e35fe97290deda424dd623564 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/ApijsonVerifierConfigurer.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/ApijsonVerifierConfigurer.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.autoconfigure.apijson; +package yunjiao.springboot.extension.apijson; import apijson.RequestMethod; import apijson.orm.Entry; diff --git a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/_APIJSON.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/_APIJSON.java similarity index 61% rename from extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/_APIJSON.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/_APIJSON.java index ec490a4fc1b8bed1dc219515c2f3d2e70dee5766..da9c5d1c66bd4c2afb1629dd451701d2d75c71ed 100644 --- a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/_APIJSON.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/_APIJSON.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.extension.apjson; +package yunjiao.springboot.extension.apijson; /** * _APIJSON diff --git a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/annotation/ApijsonRest.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/annotation/ApijsonRest.java similarity index 86% rename from extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/annotation/ApijsonRest.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/annotation/ApijsonRest.java index 067d032256ebabac7ea2bd74482726510b2d0f52..4cb3660f672a240eaa4143652ca655d066440658 100644 --- a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/annotation/ApijsonRest.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/annotation/ApijsonRest.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.extension.apjson.annotation; +package yunjiao.springboot.extension.apijson.annotation; import java.lang.annotation.Retention; import java.lang.annotation.Target; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2Creator.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2Creator.java similarity index 78% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2Creator.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2Creator.java index 05b06b5661c773a8057ea36e78061b9358c80e9a..95d216ace3b51521e89fc1c16aaa9448dcc59258 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2Creator.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2Creator.java @@ -1,7 +1,6 @@ -package yunjiao.springboot.autoconfigure.apijson.fastjson2; +package yunjiao.springboot.extension.apijson.fastjson2; import apijson.fastjson2.*; -import yunjiao.springboot.autoconfigure.apijson.ApijsonSqlProperties; import lombok.RequiredArgsConstructor; import javax.sql.DataSource; @@ -20,9 +19,9 @@ public class Fastjson2Creator extends APIJSONCreator { private final DataSource dataSource; /** - * 配置属性 + * 数据库版本 */ - private final ApijsonSqlProperties sqlProperties; + private final String dbVersion; @Override public APIJSONParser createParser() { @@ -41,7 +40,7 @@ public class Fastjson2Creator extends APIJSONCreator { @Override public APIJSONSQLConfig createSQLConfig() { - return new Fastjson2SqlConfig(sqlProperties); + return new Fastjson2SqlConfig(dbVersion); } @Override diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2EXtRestController.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2EXtRestController.java similarity index 98% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2EXtRestController.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2EXtRestController.java index 9d66cc003eaaccf42d6e744a164f6b8f2bccb905..9b121aa659a3a619976c64d7271154c7f906e4cc 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2EXtRestController.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2EXtRestController.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.autoconfigure.apijson.fastjson2; +package yunjiao.springboot.extension.apijson.fastjson2; import apijson.Log; import apijson.StringUtil; @@ -9,10 +9,6 @@ import apijson.orm.exception.ConditionErrorException; import apijson.orm.exception.ConflictException; import apijson.orm.exception.NotExistException; import com.alibaba.fastjson2.JSONObject; -import yunjiao.springboot.extension.apjson.annotation.ApijsonRest; -import yunjiao.springboot.autoconfigure.apijson.fastjson2.model.Privacy; -import yunjiao.springboot.autoconfigure.apijson.fastjson2.model.User; -import yunjiao.springboot.autoconfigure.apijson.fastjson2.model.Verify; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -20,6 +16,10 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import yunjiao.springboot.extension.apijson.fastjson2.model.Privacy; +import yunjiao.springboot.extension.apijson.fastjson2.model.User; +import yunjiao.springboot.extension.apijson.fastjson2.model.Verify; +import yunjiao.springboot.extension.apijson.annotation.ApijsonRest; import java.io.Serializable; import java.rmi.ServerException; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2FunctionParser.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2FunctionParser.java similarity index 86% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2FunctionParser.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2FunctionParser.java index 680d912cadb2a9e3ff71f6ec0f703bd2775fcd14..62a1fb02c9fb180a1b0840e9adb10f745fe9abc1 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2FunctionParser.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2FunctionParser.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.autoconfigure.apijson.fastjson2; +package yunjiao.springboot.extension.apijson.fastjson2; import apijson.fastjson2.APIJSONFunctionParser; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2ObjectParser.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2ObjectParser.java similarity index 96% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2ObjectParser.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2ObjectParser.java index ce84f46c6a521834c74f5fa6d583c4137e66feed..f9d1ef6b8e74c94764fb2b34e07ab12d02b38d37 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2ObjectParser.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2ObjectParser.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.autoconfigure.apijson.fastjson2; +package yunjiao.springboot.extension.apijson.fastjson2; import apijson.RequestMethod; import apijson.fastjson2.APIJSONObjectParser; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2Parser.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2Parser.java similarity index 95% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2Parser.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2Parser.java index 6d7905a411f41c1a632a5602684593f2408dc762..7a8cc96aa50a692c0c255e499a88f72e1f891c37 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2Parser.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2Parser.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.autoconfigure.apijson.fastjson2; +package yunjiao.springboot.extension.apijson.fastjson2; import apijson.RequestMethod; import apijson.fastjson2.APIJSONObjectParser; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2RestController.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2RestController.java similarity index 76% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2RestController.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2RestController.java index eab62df41ef05868ad013fdfe371eb1ba199074a..967a1745c0d0487efcc0b005694d4f4804b9764f 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2RestController.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2RestController.java @@ -1,14 +1,13 @@ -package yunjiao.springboot.autoconfigure.apijson.fastjson2; +package yunjiao.springboot.extension.apijson.fastjson2; import apijson.RequestMethod; import apijson.fastjson2.APIJSONController; import apijson.fastjson2.APIJSONParser; -import yunjiao.springboot.extension.apjson.annotation.ApijsonRest; -import yunjiao.springboot.autoconfigure.apijson.ApijsonProperties; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import yunjiao.springboot.extension.apijson.annotation.ApijsonRest; import java.io.Serializable; import java.util.Map; @@ -24,14 +23,18 @@ import java.util.Map; @RestController @RequestMapping("/common") public class Fastjson2RestController extends APIJSONController { - private final ApijsonProperties properties; + private final boolean needVerifyLogin; + + private final boolean needVerifyRole; + + private final boolean needVerifyContent; @Override public APIJSONParser newParser(HttpSession session, RequestMethod method) { return super.newParser(session, method) - .setNeedVerifyLogin(properties.isNeedVerifyLogin()) - .setNeedVerifyRole(properties.isNeedVerifyRole()) - .setNeedVerifyContent(properties.isNeedVerifyContent()); + .setNeedVerifyLogin(needVerifyLogin) + .setNeedVerifyRole(needVerifyRole) + .setNeedVerifyContent(needVerifyContent); } @PostMapping(value = "{method}") diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2SimpleCallback.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2SimpleCallback.java similarity index 90% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2SimpleCallback.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2SimpleCallback.java index e04683c9d86e997884d498afd7729f1281ef91ca..50ee00904f733cbd18b8e50c5d96865ad5053329 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2SimpleCallback.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2SimpleCallback.java @@ -1,12 +1,12 @@ -package yunjiao.springboot.autoconfigure.apijson.fastjson2; +package yunjiao.springboot.extension.apijson.fastjson2; import apijson.RequestMethod; import apijson.fastjson2.APIJSONApplication; import apijson.orm.AbstractSQLConfig; import apijson.orm.SQLConfig; -import yunjiao.springboot.extension.apjson.orm.IdKeyStrategy; -import yunjiao.springboot.extension.apjson.orm.NewIdStrategy; import lombok.RequiredArgsConstructor; +import yunjiao.springboot.extension.apijson.orm.IdKeyStrategy; +import yunjiao.springboot.extension.apijson.orm.NewIdStrategy; import java.io.Serializable; import java.util.List; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2SqlConfig.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2SqlConfig.java similarity index 68% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2SqlConfig.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2SqlConfig.java index 64cf5de9df0a0fb12d8048d6ab98a6d0cfa3a22b..2fbc635f02b6fbe8fae6a0c28a41bc8bd38748a2 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2SqlConfig.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2SqlConfig.java @@ -1,7 +1,6 @@ -package yunjiao.springboot.autoconfigure.apijson.fastjson2; +package yunjiao.springboot.extension.apijson.fastjson2; import apijson.fastjson2.APIJSONSQLConfig; -import yunjiao.springboot.autoconfigure.apijson.ApijsonSqlProperties; import lombok.RequiredArgsConstructor; import java.io.Serializable; @@ -18,11 +17,11 @@ public class Fastjson2SqlConfig extends APIJSONSQLConfig { */ public static final String TAG = Fastjson2SqlConfig.class.getSimpleName(); - private final ApijsonSqlProperties properties; + private final String dbVersion; @Override public String gainDBVersion() { - return properties.getConfig().getVersion(); + return dbVersion; } } diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2SqlExecutor.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2SqlExecutor.java similarity index 89% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2SqlExecutor.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2SqlExecutor.java index 7cda3f2a7ebbf357645ff67e74d40d288541622a..7a06995b93ed65d6a98d3a270f6dd22cec5937a3 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2SqlExecutor.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2SqlExecutor.java @@ -1,11 +1,11 @@ -package yunjiao.springboot.autoconfigure.apijson.fastjson2; +package yunjiao.springboot.extension.apijson.fastjson2; import apijson.fastjson2.APIJSONSQLExecutor; import apijson.orm.SQLConfig; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; -import yunjiao.springboot.extension.apjson.orm.SqlConnectProvider; import lombok.RequiredArgsConstructor; +import yunjiao.springboot.extension.apijson.orm.SqlConnectProvider; import javax.sql.DataSource; import java.io.Serializable; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2Verifier.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2Verifier.java similarity index 80% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2Verifier.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2Verifier.java index abfd7012f9c994bcab3e10b23d2feaa9b56bc81b..53083b330b43666d98b7d860c58ea1d29e28ff8c 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/Fastjson2Verifier.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/Fastjson2Verifier.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.autoconfigure.apijson.fastjson2; +package yunjiao.springboot.extension.apijson.fastjson2; import apijson.fastjson2.APIJSONVerifier; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/model/Privacy.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/model/Privacy.java similarity index 90% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/model/Privacy.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/model/Privacy.java index f034b40d0f3dc417030dc150dbeae1abd151e1f9..a25fda57edad58b7f908e2bd73548c0dcbe00d4b 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/model/Privacy.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/model/Privacy.java @@ -12,7 +12,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.*/ -package yunjiao.springboot.autoconfigure.apijson.fastjson2.model; +package yunjiao.springboot.extension.apijson.fastjson2.model; import apijson.MethodAccess; import apijson.framework.BaseModel; @@ -67,25 +67,48 @@ public class Privacy extends BaseModel { */ private Double balance; + /** + * 构造器 + */ public Privacy() { super(); } + /** + * 构造器 + * @param id id + */ public Privacy(long id) { this(); setId(id); } + /** + * 构造器 + * @param phone 手机号 + * @param password 密码 + */ public Privacy(String phone, String password) { this(); setPhone(phone); setPassword(password); } + /** + * 获取手机号 + * + * @return 手机号 + */ public String getPhone() { return phone; } + /** + * 设置手机号 + * + * @param phone 手机号 + * @return 实例 + */ public Privacy setPhone(String phone) { this.phone = phone; return this; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/model/User.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/model/User.java similarity index 98% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/model/User.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/model/User.java index 225bc5c6c13a0500c473e085441ebdc52bc7f0e3..115adb3164d57d5e179e00bd8947a938d7b8d8ad 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/model/User.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/model/User.java @@ -12,7 +12,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.*/ -package yunjiao.springboot.autoconfigure.apijson.fastjson2.model; +package yunjiao.springboot.extension.apijson.fastjson2.model; import apijson.MethodAccess; import apijson.framework.BaseModel; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/model/Verify.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/model/Verify.java similarity index 77% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/model/Verify.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/model/Verify.java index 0f01e478782e66c7e5b92d237f837601fccf08fb..440df2261d09261f753e6d78f375bcea68f7b612 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/fastjson2/model/Verify.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/fastjson2/model/Verify.java @@ -12,10 +12,13 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.*/ -package yunjiao.springboot.autoconfigure.apijson.fastjson2.model; +package yunjiao.springboot.extension.apijson.fastjson2.model; import apijson.MethodAccess; import apijson.framework.BaseModel; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; import static apijson.orm.AbstractVerifier.*; @@ -33,6 +36,9 @@ import static apijson.orm.AbstractVerifier.*; PUT = {ADMIN}, DELETE = {ADMIN} ) +@Getter +@Setter +@Accessors(chain = true) public class Verify extends BaseModel { /** @@ -75,12 +81,17 @@ public class Verify extends BaseModel { */ private Integer type; + /** + * 构造器 + */ public Verify() { super(); } /** * type和phone为联合主键,必传 + * @param type 类型 + * @param phone 手机 */ public Verify(int type, String phone) { this(); @@ -88,32 +99,4 @@ public class Verify extends BaseModel { setPhone(phone); } - - public String getVerify() { - return verify; - } - - public Verify setVerify(String verify) { - this.verify = verify; - return this; - } - - public String getPhone() { - return phone; - } - - public Verify setPhone(String phone) { - this.phone = phone; - return this; - } - - public Integer getType() { - return type; - } - - public Verify setType(Integer type) { - this.type = type; - return this; - } - } diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonCreator.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonCreator.java similarity index 79% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonCreator.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonCreator.java index ad86e858d468a7cbf7ceb9ac2b5de3a71b92a15d..862b267169470bda6b70d8432d49c7b413e1a701 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonCreator.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonCreator.java @@ -1,7 +1,6 @@ -package yunjiao.springboot.autoconfigure.apijson.gson; +package yunjiao.springboot.extension.apijson.gson; import apijson.gson.*; -import yunjiao.springboot.autoconfigure.apijson.ApijsonSqlProperties; import lombok.RequiredArgsConstructor; import javax.sql.DataSource; @@ -16,7 +15,10 @@ import java.io.Serializable; public class GsonCreator extends APIJSONCreator { private final DataSource dataSource; - private final ApijsonSqlProperties sqlProperties; + /** + * 数据库版本 + */ + private final String dbVersion; @Override public APIJSONParser createParser() { @@ -35,7 +37,7 @@ public class GsonCreator extends APIJSONCreator { @Override public APIJSONSQLConfig createSQLConfig() { - return new GsonSqlConfig(sqlProperties); + return new GsonSqlConfig(dbVersion); } @Override diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonEXtRestController.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonEXtRestController.java similarity index 94% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonEXtRestController.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonEXtRestController.java index 2e2feee3006220ff2f59954fb42e497ae3e116b4..77c0fd43314807ba6f22c1855f22d2f415fb4ade 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonEXtRestController.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonEXtRestController.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.autoconfigure.apijson.gson; +package yunjiao.springboot.extension.apijson.gson; import apijson.Log; import apijson.StringUtil; @@ -10,11 +10,6 @@ import apijson.gson.JSONResponse; import apijson.orm.exception.ConditionErrorException; import apijson.orm.exception.ConflictException; import apijson.orm.exception.NotExistException; -import yunjiao.springboot.extension.apjson.annotation.ApijsonRest; -import yunjiao.springboot.extension.apjson.orm.GsonMap; -import yunjiao.springboot.autoconfigure.apijson.gson.model.Privacy; -import yunjiao.springboot.autoconfigure.apijson.gson.model.User; -import yunjiao.springboot.autoconfigure.apijson.gson.model.Verify; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -22,6 +17,11 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import yunjiao.springboot.extension.apijson.gson.model.Privacy; +import yunjiao.springboot.extension.apijson.gson.model.User; +import yunjiao.springboot.extension.apijson.gson.model.Verify; +import yunjiao.springboot.extension.apijson.annotation.ApijsonRest; +import yunjiao.springboot.extension.apijson.orm.GsonMap; import java.io.Serializable; import java.rmi.ServerException; @@ -43,45 +43,101 @@ import static apijson.framework.APIJSONConstant.*; @RequiredArgsConstructor @RestController @RequestMapping("ext") -@SuppressWarnings({"all"}) public class GsonEXtRestController extends APIJSONController { + /** + * USER名 + */ public static final String USER_; + /** + * PRIVACY名 + */ public static final String PRIVACY_; - public static final String VERIFY_; //加下划线后缀是为了避免 Verify 和 verify 都叫VERIFY,分不清 + /** + * 加下划线后缀是为了避免 Verify 和 verify 都叫VERIFY,分不清 + */ + public static final String VERIFY_; + /** + * 当前用户ID + */ public static final String CURRENT_USER_ID = "currentUserId"; + /** + * 名称 + */ public static final String NAME = "name"; + /** + * 手机 + */ public static final String PHONE = "phone"; + /** + * 密码 + */ public static final String PASSWORD = "password"; + /** + * 密码 + */ public static final String _PASSWORD = "_password"; + /** + * 支付密码 + */ public static final String _PAY_PASSWORD = "_payPassword"; + /** + * 旧密码 + */ public static final String OLD_PASSWORD = "oldPassword"; + /** + * VERIFY名 + */ public static final String VERIFY = "verify"; + /** + * 类型 + */ public static final String TYPE = "type"; + /** + * 值 + */ public static final String VALUE = "value"; + /** + * 登录 + */ public static final String LOGIN = "login"; + /** + * 名称 + */ public static final String AS_DB_ACCOUNT = "asDBAccount"; + /** + * 记住 + */ public static final String REMEMBER = "remember"; + /** + * 默认 + */ public static final String DEFAULTS = "defaults"; - public static final int LOGIN_TYPE_PASSWORD = 0;//密码登录 + /** + * 密码登录 + */ + public static final int LOGIN_TYPE_PASSWORD = 0;// - public static final int LOGIN_TYPE_VERIFY = 1;//验证码登录 + /** + * 验证码登录 + */ + public static final int LOGIN_TYPE_VERIFY = 1;// static { USER_ = User.class.getSimpleName(); @@ -89,6 +145,9 @@ public class GsonEXtRestController extends APIJSONController { VERIFY_ = Verify.class.getSimpleName(); } + /** + * + */ private static final String REGISTER = "register"; /**重新加载配置 @@ -566,10 +625,24 @@ public class GsonEXtRestController extends APIJSONController { } + /** + * 响应结果包装 + * + * @param requestObject 必须值 + * @param key 必须值 + * @return 实例 + */ public static Map newIllegalArgumentResult(Map requestObject, String key) { return newIllegalArgumentResult(requestObject, key, null); } + /** + * 响应结果包装 + * @param requestObject 必须值 + * @param key 必须值 + * @param msg 必须值 + * @return 实例 + */ public static Map newIllegalArgumentResult(Map requestObject, String key, String msg) { return new GsonParser().extendErrorResult(requestObject, new IllegalArgumentException(key + ":value 中value不合法!" + StringUtil.get(msg))); } diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonFunctionParser.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonFunctionParser.java similarity index 87% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonFunctionParser.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonFunctionParser.java index 69a74a26b6122738d91d161112246a969f904b3b..00cda9d4ecf2ce4c26d796a2c2cc597435714681 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonFunctionParser.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonFunctionParser.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.autoconfigure.apijson.gson; +package yunjiao.springboot.extension.apijson.gson; import apijson.gson.APIJSONFunctionParser; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonObjectParser.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonObjectParser.java similarity index 96% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonObjectParser.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonObjectParser.java index 5cc77011e0c65dd080a0f4ea6680c77de4e38d7d..eedea2d8b8e4a053a46b10fbb997974715b5fdef 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonObjectParser.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonObjectParser.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.autoconfigure.apijson.gson; +package yunjiao.springboot.extension.apijson.gson; import apijson.RequestMethod; import apijson.gson.APIJSONObjectParser; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonParser.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonParser.java similarity index 95% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonParser.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonParser.java index cac03cbe7df8827950eb3f71608e5d4ffdfa4adf..52075c382408f3236e12b5ee81f6a4c1b7913f61 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonParser.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonParser.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.autoconfigure.apijson.gson; +package yunjiao.springboot.extension.apijson.gson; import apijson.RequestMethod; import apijson.gson.APIJSONObjectParser; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonRestController.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonRestController.java similarity index 76% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonRestController.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonRestController.java index 08c1e248bc336022970081c90228c8816598b5b5..6fd8502993bc7abb4e733afbf2d96d7eb44d164b 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonRestController.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonRestController.java @@ -1,14 +1,13 @@ -package yunjiao.springboot.autoconfigure.apijson.gson; +package yunjiao.springboot.extension.apijson.gson; import apijson.RequestMethod; import apijson.gson.APIJSONController; import apijson.gson.APIJSONParser; -import yunjiao.springboot.extension.apjson.annotation.ApijsonRest; -import yunjiao.springboot.autoconfigure.apijson.ApijsonProperties; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import yunjiao.springboot.extension.apijson.annotation.ApijsonRest; import java.io.Serializable; import java.util.Map; @@ -24,14 +23,18 @@ import java.util.Map; @RestController @RequestMapping("common") public class GsonRestController extends APIJSONController { - private final ApijsonProperties properties; + private final boolean needVerifyLogin; + + private final boolean needVerifyRole; + + private final boolean needVerifyContent; @Override public APIJSONParser newParser(HttpSession session, RequestMethod method) { return super.newParser(session, method) - .setNeedVerifyLogin(properties.isNeedVerifyLogin()) - .setNeedVerifyRole(properties.isNeedVerifyRole()) - .setNeedVerifyContent(properties.isNeedVerifyContent()); + .setNeedVerifyLogin(needVerifyLogin) + .setNeedVerifyRole(needVerifyRole) + .setNeedVerifyContent(needVerifyContent); } @PostMapping(value = "{method}") diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonSimpleCallback.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonSimpleCallback.java similarity index 89% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonSimpleCallback.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonSimpleCallback.java index 9fd4f6899e61dee4ebc97bb964d0cb712fa2e25d..47af08d2518083274e3d0d8e889c42f4b1baded0 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonSimpleCallback.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonSimpleCallback.java @@ -1,13 +1,13 @@ -package yunjiao.springboot.autoconfigure.apijson.gson; +package yunjiao.springboot.extension.apijson.gson; import apijson.RequestMethod; import apijson.fastjson2.APIJSONApplication; import apijson.gson.APIJSONSQLConfig; import apijson.orm.AbstractSQLConfig; import apijson.orm.SQLConfig; -import yunjiao.springboot.extension.apjson.orm.IdKeyStrategy; -import yunjiao.springboot.extension.apjson.orm.NewIdStrategy; import lombok.RequiredArgsConstructor; +import yunjiao.springboot.extension.apijson.orm.IdKeyStrategy; +import yunjiao.springboot.extension.apijson.orm.NewIdStrategy; import java.io.Serializable; import java.util.List; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonSqlConfig.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonSqlConfig.java similarity index 67% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonSqlConfig.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonSqlConfig.java index cdbd6c696bff93b2233f8aad9059f0a699dbc5bb..08807f807210d1ad22f93189b9c3089aa9dc1627 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonSqlConfig.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonSqlConfig.java @@ -1,7 +1,6 @@ -package yunjiao.springboot.autoconfigure.apijson.gson; +package yunjiao.springboot.extension.apijson.gson; import apijson.gson.APIJSONSQLConfig; -import yunjiao.springboot.autoconfigure.apijson.ApijsonSqlProperties; import lombok.RequiredArgsConstructor; import java.io.Serializable; @@ -18,10 +17,10 @@ public class GsonSqlConfig extends APIJSONSQLConfig { */ public static final String TAG = GsonSqlConfig.class.getSimpleName(); - private final ApijsonSqlProperties properties; + private final String dbVersion; @Override public String gainDBVersion() { - return properties.getConfig().getVersion(); + return dbVersion; } } diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonSqlExecutor.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonSqlExecutor.java similarity index 89% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonSqlExecutor.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonSqlExecutor.java index f0dd05bdbdeb8089817a1345908050c160827e8a..6918728d78298134ea7b1d60131c34c571ddc55d 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonSqlExecutor.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonSqlExecutor.java @@ -1,9 +1,9 @@ -package yunjiao.springboot.autoconfigure.apijson.gson; +package yunjiao.springboot.extension.apijson.gson; import apijson.gson.APIJSONSQLExecutor; import apijson.orm.SQLConfig; -import yunjiao.springboot.extension.apjson.orm.SqlConnectProvider; import lombok.RequiredArgsConstructor; +import yunjiao.springboot.extension.apijson.orm.SqlConnectProvider; import javax.sql.DataSource; import java.io.Serializable; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonVerifier.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonVerifier.java similarity index 81% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonVerifier.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonVerifier.java index aeb276d6f3a60c4be67233b7f027c6f43e4731ab..445043fa5c35009b669e4b51fd174bf8a6c45212 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/GsonVerifier.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/GsonVerifier.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.autoconfigure.apijson.gson; +package yunjiao.springboot.extension.apijson.gson; import apijson.gson.APIJSONVerifier; diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/model/Privacy.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/model/Privacy.java similarity index 85% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/model/Privacy.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/model/Privacy.java index ffed20c5e5ba73020253982be32e857d360f3c4e..cab7f65740d82d89971b6d4a157f22ba9101a828 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/model/Privacy.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/model/Privacy.java @@ -12,7 +12,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.*/ -package yunjiao.springboot.autoconfigure.apijson.gson.model; +package yunjiao.springboot.extension.apijson.gson.model; import apijson.MethodAccess; import apijson.framework.BaseModel; @@ -77,26 +77,46 @@ public class Privacy extends BaseModel { */ private Double balance; + /** + * 构造器 + */ public Privacy() { super(); } + /** + * 构造器 + * @param id id + */ public Privacy(Long id) { this(); setId(id); } + /** + * 构造器 + * @param password 密码 + */ public Privacy(String password) { this.password = password; } + /** + * 构造器 + * @param phone 手机号 + * @param password 密码 + */ public Privacy(String phone, String password) { this(); setPhone(phone); setPassword(password); } - + /** + * 示例 + * + * @param args 参数 + */ public static void main(String[] args) { Privacy privacy = new Privacy("uer", "pwd"); String json = new Gson().toJson(privacy); diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/model/User.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/model/User.java similarity index 61% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/model/User.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/model/User.java index 3251e7c9e50b201f3877b0c237824ccd0dc1b621..c1d499de8b1d4e48b404cb8eb59d81472f187ae2 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/model/User.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/model/User.java @@ -12,11 +12,14 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.*/ -package yunjiao.springboot.autoconfigure.apijson.gson.model; +package yunjiao.springboot.extension.apijson.gson.model; import apijson.MethodAccess; import apijson.framework.BaseModel; import apijson.orm.Visitor; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; import java.util.List; @@ -32,11 +35,23 @@ import static apijson.orm.AbstractVerifier.UNKNOWN; POST = {UNKNOWN, ADMIN}, DELETE = {ADMIN} ) +@Getter +@Setter +@Accessors(chain = true) public class User extends BaseModel implements Visitor { + /** + * 性别0 + */ public static final int SEX_MAIL = 0; + /** + * 性别1 + */ public static final int SEX_FEMALE = 1; + /** + * 性别2 + */ public static final int SEX_UNKNOWN = 2; /** @@ -76,63 +91,14 @@ public class User extends BaseModel implements Visitor { super(); } + /** + * 构造器 + * @param id id + */ public User(long id) { this(); setId(id); } - public Integer getSex() { - return sex; - } - - public User setSex(Integer sex) { - this.sex = sex; - return this; - } - - public String getHead() { - return head; - } - - public User setHead(String head) { - this.head = head; - return this; - } - - public String getName() { - return name; - } - - public User setName(String name) { - this.name = name; - return this; - } - - public List getPictureList() { - return pictureList; - } - - public User setPictureList(List pictureList) { - this.pictureList = pictureList; - return this; - } - - public String getTag() { - return tag; - } - - public User setTag(String tag) { - this.tag = tag; - return this; - } - - public List getContactIdList() { - return contactIdList; - } - - public User setContactIdList(List contactIdList) { - this.contactIdList = contactIdList; - return this; - } } diff --git a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/model/Verify.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/model/Verify.java similarity index 64% rename from autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/model/Verify.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/model/Verify.java index 0f7f8e2b252bc1cef6c2d96123e0219506bb52ce..cbe0c57037c2218a3eb729a6ccb498f33914dc0f 100644 --- a/autoconfigure/src/main/java/yunjiao/springboot/autoconfigure/apijson/gson/model/Verify.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/gson/model/Verify.java @@ -12,10 +12,13 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.*/ -package yunjiao.springboot.autoconfigure.apijson.gson.model; +package yunjiao.springboot.extension.apijson.gson.model; import apijson.MethodAccess; import apijson.framework.BaseModel; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; import static apijson.orm.AbstractVerifier.*; @@ -33,17 +36,35 @@ import static apijson.orm.AbstractVerifier.*; PUT = {ADMIN}, DELETE = {ADMIN} ) +@Setter +@Getter +@Accessors(chain = true) public class Verify extends BaseModel { - public static final int TYPE_LOGIN = 0; //登录 + /** + * 登录 + */ + public static final int TYPE_LOGIN = 0; - public static final int TYPE_REGISTER = 1; //注册 + /** + *注册 + */ + public static final int TYPE_REGISTER = 1; - public static final int TYPE_PASSWORD = 2; //登录密码 + /** + *登录密码 + */ + public static final int TYPE_PASSWORD = 2; - public static final int TYPE_PAY_PASSWORD = 3; //支付密码 + /** + *支付密码 + */ + public static final int TYPE_PAY_PASSWORD = 3; - public static final int TYPE_RELOAD = 4; //重载配置 + /** + *重载配置 + */ + public static final int TYPE_RELOAD = 4; /** * 手机 @@ -60,47 +81,22 @@ public class Verify extends BaseModel { */ private Integer type; + /** + * 构造器 + */ public Verify() { super(); } /** * type和phone为联合主键,必传 + * + * @param type 类型 + * @param phone 手机 */ public Verify(int type, String phone) { this(); setType(type); setPhone(phone); } - - - public String getVerify() { - return verify; - } - - public Verify setVerify(String verify) { - this.verify = verify; - return this; - } - - public String getPhone() { - return phone; - } - - public Verify setPhone(String phone) { - this.phone = phone; - return this; - } - - public Integer getType() { - return type; - } - - public Verify setType(Integer type) { - this.type = type; - return this; - } - - - } diff --git a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/GsonMap.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/GsonMap.java similarity index 97% rename from extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/GsonMap.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/GsonMap.java index c12b02fc949a03f6b1e4fc9cb996dd82d277f2cb..176e2344f5e38744d72b63925aaba8a67c1617ce 100644 --- a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/GsonMap.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/GsonMap.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.extension.apjson.orm; +package yunjiao.springboot.extension.apijson.orm; import java.util.LinkedHashMap; import java.util.Map; diff --git a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/IdKeyApijsonStrategy.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/IdKeyApijsonStrategy.java similarity index 85% rename from extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/IdKeyApijsonStrategy.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/IdKeyApijsonStrategy.java index ab1bd44f9e55d57877f4348a467f6d317da5a0b8..c8071281dbdf7f0bf296bc1b04482c841d692776 100644 --- a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/IdKeyApijsonStrategy.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/IdKeyApijsonStrategy.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.extension.apjson.orm; +package yunjiao.springboot.extension.apijson.orm; import apijson.JSONMap; diff --git a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/IdKeyStrategy.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/IdKeyStrategy.java similarity index 90% rename from extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/IdKeyStrategy.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/IdKeyStrategy.java index 79def433ad20904143d0ca2fce6aacf76659e507..8750a9df38a638d3100b7050872cd8f69af0654f 100644 --- a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/IdKeyStrategy.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/IdKeyStrategy.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.extension.apjson.orm; +package yunjiao.springboot.extension.apijson.orm; /** * 主键名称策略 diff --git a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdDatabaseStrategy.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdDatabaseStrategy.java similarity index 88% rename from extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdDatabaseStrategy.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdDatabaseStrategy.java index 985025a6bdfc9338daa56711b6f85c88f5cfd824..cd404a64d88d0a3d48dbceef8674e8161768ef26 100644 --- a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdDatabaseStrategy.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdDatabaseStrategy.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.extension.apjson.orm; +package yunjiao.springboot.extension.apijson.orm; import apijson.RequestMethod; diff --git a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdExceptionStrategy.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdExceptionStrategy.java similarity index 89% rename from extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdExceptionStrategy.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdExceptionStrategy.java index 4ce4df262ed6cf7b50d75c6a3b9bc397f925d004..6575865b1ff93184fcfac4b9aa25db5e0b38a344 100644 --- a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdExceptionStrategy.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdExceptionStrategy.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.extension.apjson.orm; +package yunjiao.springboot.extension.apijson.orm; import apijson.RequestMethod; diff --git a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdSnowflakeStrategy.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdSnowflakeStrategy.java similarity index 91% rename from extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdSnowflakeStrategy.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdSnowflakeStrategy.java index 5b011b9211d7e7f86a8a3cf880fa2bb82280c16b..46abb343361d18495d79d2aa45c5d90cfb75fb7d 100644 --- a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdSnowflakeStrategy.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdSnowflakeStrategy.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.extension.apjson.orm; +package yunjiao.springboot.extension.apijson.orm; import apijson.RequestMethod; import cn.hutool.core.lang.Snowflake; diff --git a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdStrategy.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdStrategy.java similarity index 92% rename from extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdStrategy.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdStrategy.java index 4624c3a4681b967b354224288d90e1bc952ff211..ddf353ae60da17fa28ec76d65bbe3f1f7ac55922 100644 --- a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdStrategy.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdStrategy.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.extension.apjson.orm; +package yunjiao.springboot.extension.apijson.orm; import apijson.RequestMethod; diff --git a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdTimestampStrategy.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdTimestampStrategy.java similarity index 92% rename from extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdTimestampStrategy.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdTimestampStrategy.java index 56dda6c9cb2c0082edf6d17a7e3615daeb376e8f..85f0466a4d5e8a884c5083a02bfe7dcc1b68a244 100644 --- a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdTimestampStrategy.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdTimestampStrategy.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.extension.apjson.orm; +package yunjiao.springboot.extension.apijson.orm; import apijson.RequestMethod; import yunjiao.springboot.extension.common.generator.TimestampIdGenerator; diff --git a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdUuidStrategy.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdUuidStrategy.java similarity index 89% rename from extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdUuidStrategy.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdUuidStrategy.java index 745278932ce50a1822870e9c7ea911ee9010937d..d5c93f428fa839a90bda2f1ef31d67264f5b29da 100644 --- a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/NewIdUuidStrategy.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/NewIdUuidStrategy.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.extension.apjson.orm; +package yunjiao.springboot.extension.apijson.orm; import apijson.RequestMethod; import cn.hutool.core.util.IdUtil; diff --git a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/SqlConnectProvider.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/SqlConnectProvider.java similarity index 93% rename from extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/SqlConnectProvider.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/SqlConnectProvider.java index 301abbeaa7947920c904c6930958ade2a980cd05..3c7d02a8299f71210683beba3da1c545c89b18ef 100644 --- a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/orm/SqlConnectProvider.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/orm/SqlConnectProvider.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.extension.apjson.orm; +package yunjiao.springboot.extension.apijson.orm; import apijson.NotNull; import org.slf4j.Logger; @@ -55,11 +55,11 @@ public interface SqlConnectProvider { Connection newCon = null; try { String dataSourceType = parseKey(key); - DataSourceContextHolder.setDataSourceType(dataSourceType); + DataSourceContextHolder.setDataSourceName(dataSourceType); DataSource dataSource = getDataSource(); newCon = dataSource.getConnection(); }finally { - DataSourceContextHolder.clearDataSourceType(); + DataSourceContextHolder.clearDataSourceName(); } if (log.isDebugEnabled()) { log.debug("Successfully obtained a connection from data source: {}->{}", key, newCon); diff --git a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/util/ApijsonConsts.java b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/util/ApijsonConsts.java similarity index 93% rename from extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/util/ApijsonConsts.java rename to extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/util/ApijsonConsts.java index 0057b60bf93c1616b6c1f4d6ca55a4b30297c53d..d939f24be252a9db052dd82348eaaf4d666fc025 100644 --- a/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apjson/util/ApijsonConsts.java +++ b/extensions/extension-apijson/src/main/java/yunjiao/springboot/extension/apijson/util/ApijsonConsts.java @@ -1,4 +1,4 @@ -package yunjiao.springboot.extension.apjson.util; +package yunjiao.springboot.extension.apijson.util; import apijson.orm.SQLConfig; diff --git a/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/anji/BlockPuzzleCaptchaService.java b/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/anji/BlockPuzzleCaptchaService.java index dcd776ba3e1b77abfe7e883a3afecceb13b9d6c0..df30ca579904898bf445983be4dd2daa1bf083f9 100644 --- a/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/anji/BlockPuzzleCaptchaService.java +++ b/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/anji/BlockPuzzleCaptchaService.java @@ -4,6 +4,8 @@ import com.anji.captcha.model.common.CaptchaTypeEnum; import com.anji.captcha.model.vo.CaptchaVO; import com.anji.captcha.service.CaptchaCacheService; import com.anji.captcha.service.CaptchaService; +import com.google.gson.JsonSyntaxException; +import lombok.extern.slf4j.Slf4j; import yunjiao.springboot.extension.common.captcha.CaptchaCategory; import yunjiao.springboot.extension.common.captcha.CaptchaData; import yunjiao.springboot.extension.common.captcha.Point; @@ -16,6 +18,7 @@ import java.util.Base64; * * @author yangyunjiao */ +@Slf4j public class BlockPuzzleCaptchaService extends BaseCaptchaService { /** * 拼图坐标允许误差偏移量 @@ -37,11 +40,17 @@ public class BlockPuzzleCaptchaService extends BaseCaptchaService { @Override public boolean verify(String originalCode, String userCode) { - Point original = GsonUtils.fromJson(originalCode, Point.class); - Point user = GsonUtils.fromJson(userCode, Point.class); + try { + Point original = GsonUtils.fromJson(originalCode, Point.class); + Point user = GsonUtils.fromJson(userCode, Point.class); - return between(user.x(), original.x() - slipOffset, original.x() + slipOffset) - && between(user.y(), original.y() - slipOffset, original.y() + slipOffset); + return between(user.x(), original.x() - slipOffset, original.x() + slipOffset) + && between(user.y(), original.y() - slipOffset, original.y() + slipOffset); + } catch (JsonSyntaxException e) { + log.error("验证码格式异常", e); + } + + return false; } @Override diff --git a/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/anji/ClickWorkCaptchaService.java b/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/anji/ClickWorkCaptchaService.java index d44da78a28e4f50f446f11844a03397415d189a0..f7e76cc40e9d02cd52dc951bf7b7791eb8e8afa5 100644 --- a/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/anji/ClickWorkCaptchaService.java +++ b/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/anji/ClickWorkCaptchaService.java @@ -4,6 +4,8 @@ import com.anji.captcha.model.common.CaptchaTypeEnum; import com.anji.captcha.model.vo.CaptchaVO; import com.anji.captcha.service.CaptchaCacheService; import com.anji.captcha.service.CaptchaService; +import com.google.gson.JsonSyntaxException; +import lombok.extern.slf4j.Slf4j; import yunjiao.springboot.extension.common.captcha.CaptchaCategory; import yunjiao.springboot.extension.common.captcha.CaptchaData; import yunjiao.springboot.extension.common.captcha.Point; @@ -17,6 +19,7 @@ import java.util.List; * * @author yangyunjiao */ +@Slf4j public class ClickWorkCaptchaService extends BaseCaptchaService { /** * 拼图坐标允许误差偏移量 @@ -38,22 +41,30 @@ public class ClickWorkCaptchaService extends BaseCaptchaService { @Override public boolean verify(String originalCode, String userCode) { - List originalList = GsonUtils.toList(originalCode, Point.class); - List userList = GsonUtils.toList(userCode, Point.class); - if (originalList.size() != userList.size()) { - return false; - } + try { + List originalList = GsonUtils.toList(originalCode, Point.class); + List userList = GsonUtils.toList(userCode, Point.class); - for (int i = 0; i < originalList.size(); i++) { - Point original = originalList.get(i); - Point user = userList.get(i); - boolean passed = between(user.x(), original.x() - slipOffset, original.x() + slipOffset) - && between(user.y(), original.y() - slipOffset, original.y() + slipOffset); - if (!passed) { + if (originalList.size() != userList.size()) { return false; } + + boolean passed = true; + for (int i = 0; i < originalList.size(); i++) { + Point original = originalList.get(i); + Point user = userList.get(i); + passed = between(user.x(), original.x() - slipOffset, original.x() + slipOffset) + && between(user.y(), original.y() - slipOffset, original.y() + slipOffset); + if (!passed) { + return false; + } + } + return true; + } catch (JsonSyntaxException e) { + log.error("验证码格式异常", e); } - return true; + + return false; } @Override diff --git a/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/cache/GuavaCaptchaCache.java b/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/cache/GuavaCaptchaCache.java index 9036e72a7096022c560cdf65478fa1e7862b7b85..f780eda6a6ce50340b39c5bf235e23181f3c9a09 100644 --- a/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/cache/GuavaCaptchaCache.java +++ b/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/cache/GuavaCaptchaCache.java @@ -20,12 +20,21 @@ import java.util.concurrent.TimeUnit; */ @Slf4j public class GuavaCaptchaCache implements CaptchaCache { + /** + * 缓存 + */ private final LoadingCache> cache; - public GuavaCaptchaCache(Duration expireMillis, long size) { + /** + * 构造器 + * + * @param expired 缓存过期时间 + * @param size 缓存大小 + */ + public GuavaCaptchaCache(Duration expired, long size) { CacheBuilder builder = CacheBuilder.newBuilder() - .expireAfterWrite(expireMillis.toMillis(), TimeUnit.MILLISECONDS); + .expireAfterWrite(expired.toMillis(), TimeUnit.MILLISECONDS); if (size > 0) { builder.maximumSize(size); diff --git a/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/cache/HutoolCaptchaCache.java b/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/cache/HutoolCaptchaCache.java index 0e2f4618212e5239e03d73a3a518acede34d3a2a..ab284b669c405ed5a59de398a3bcc7127c798963 100644 --- a/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/cache/HutoolCaptchaCache.java +++ b/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/cache/HutoolCaptchaCache.java @@ -13,9 +13,15 @@ import java.util.Optional; public class HutoolCaptchaCache implements CaptchaCache { private final TimedCache cache; - public HutoolCaptchaCache(Duration expireMillis, Duration delay) { - this.cache = new TimedCache<>(expireMillis.toMillis()); - this.cache.schedulePrune(delay.toMillis()); + /** + * 构造器 + * + * @param expired 过期时间 + * @param scheduleInterval 定时间隔,清理过期缓存 + */ + public HutoolCaptchaCache(Duration expired, Duration scheduleInterval) { + this.cache = new TimedCache<>(expired.toMillis()); + this.cache.schedulePrune(scheduleInterval.toMillis()); } @Override diff --git a/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/hutool/AbstractCaptchaBuilder.java b/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/hutool/AbstractCaptchaBuilder.java index 55dbeb4ae5462277a3498838696826f3db0b0481..f93d5161c192481e388954f14bef35f502984786 100644 --- a/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/hutool/AbstractCaptchaBuilder.java +++ b/extensions/extension-captcha/src/main/java/yunjiao/springboot/extension/captcha/hutool/AbstractCaptchaBuilder.java @@ -2,7 +2,7 @@ package yunjiao.springboot.extension.captcha.hutool; import cn.hutool.captcha.AbstractCaptcha; import cn.hutool.captcha.generator.CodeGenerator; -import yunjiao.springboot.extension.common.model.ColorType; +import yunjiao.springboot.extension.common.model.ColorTypeEnum; import lombok.Getter; import lombok.Setter; @@ -34,7 +34,7 @@ public abstract class AbstractCaptchaBuilder { /** * 背景色 */ - private ColorType backgroundColor; + private ColorTypeEnum backgroundColor; /** * 文字透明度,取值0~1,1表示不透明 diff --git a/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/CaptchaJFrameDemo.java b/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/CaptchaJFrameDemo.java deleted file mode 100644 index ed75a5e831dc1381d3e9ad77785e5f95f24da1aa..0000000000000000000000000000000000000000 --- a/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/CaptchaJFrameDemo.java +++ /dev/null @@ -1,219 +0,0 @@ -package yunjiao.springboot.extension.captcha; - -import cn.hutool.captcha.CaptchaUtil; -import cn.hutool.captcha.LineCaptcha; -import com.anji.captcha.model.common.Const; -import com.anji.captcha.service.CaptchaCacheService; -import com.anji.captcha.service.CaptchaService; -import com.anji.captcha.service.impl.CaptchaServiceFactory; -import yunjiao.springboot.extension.captcha.anji.BlockPuzzleCaptchaService; -import yunjiao.springboot.extension.captcha.anji.ClickWorkCaptchaService; -import yunjiao.springboot.extension.common.captcha.CaptchaData; -import yunjiao.springboot.extension.common.model.ColorType; -import yunjiao.springboot.extension.captcha.hutool.*; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.Properties; - -/** - * 可视化界面 - * - * @author yangyunjiao - */ -public class CaptchaJFrameDemo extends JFrame { - private JPanel captchaPanel; - - private JButton generateButton; - - private LineCaptchaService lineCaptchaService; - - private CircleCaptchaService circleCaptchaService; - - private ShearCaptchaService shearCaptchaService; - - private GifCaptchaService gifCaptchaService; - - private BlockPuzzleCaptchaService blockPuzzleCaptchaService; - - private ClickWorkCaptchaService clickWorkCaptchaService; - - public CaptchaJFrameDemo() { - setTitle("验证码生成器"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setSize(800, 800); - setLocationRelativeTo(null); - - initUI(); - initService(); - - // 初始生成验证码 - generateCaptchas(); - } - - private void initService() { - Font font = new Font(null, Font.PLAIN, 36); - LineCaptchaBuilder lcb = new LineCaptchaBuilder(); - lcb.setWidth(250); - lcb.setHeight(50); - lcb.setInterfereCount(60); - lcb.setBackgroundColor(ColorType.white); - lcb.setFuzziness(2); - lcb.setValidIgnoreCase(true); - lcb.setFont(font); - lcb.setGenerator(CodeGeneratorType.numAndChar.apply(5)); - lineCaptchaService = new LineCaptchaService(lcb); - - CircleCaptchaBuilder ccb = new CircleCaptchaBuilder(); - ccb.setWidth(250); - ccb.setHeight(50); - ccb.setInterfereCount(30); - ccb.setBackgroundColor(ColorType.white); - ccb.setFuzziness(2); - ccb.setValidIgnoreCase(true); - ccb.setFont(font); - ccb.setGenerator(CodeGeneratorType.numAndChar.apply(5)); - circleCaptchaService = new CircleCaptchaService(ccb); - - ShearCaptchaBuilder scb = new ShearCaptchaBuilder(); - scb.setWidth(250); - scb.setHeight(50); - scb.setInterfereCount(4); - scb.setBackgroundColor(ColorType.white); - scb.setFuzziness(2); - scb.setValidIgnoreCase(true); - scb.setFont(font); - scb.setGenerator(CodeGeneratorType.numAndChar.apply(5)); - - shearCaptchaService = new ShearCaptchaService(scb); - - GifCaptchaBuilder gcb = new GifCaptchaBuilder(); - gcb.setWidth(250); - gcb.setHeight(50); - gcb.setInterfereCount(10); - gcb.setBackgroundColor(ColorType.white); - gcb.setFuzziness(2); - gcb.setValidIgnoreCase(true); - gcb.setFont(font); - gcb.setGenerator(CodeGeneratorType.numAndChar.apply(5)); - gcb.setQuality(10); - gcb.setRepeat(0); - gcb.setMinColor(0); - gcb.setMaxColor(255); - - gifCaptchaService = new GifCaptchaService(gcb); - - Properties config = new Properties(); - config.put(Const.CAPTCHA_CACHETYPE, "local"); - config.put(Const.CAPTCHA_WATER_MARK, "我的水印"); - config.put(Const.CAPTCHA_FONT_TYPE, "WenQuanZhengHei.ttf"); - config.put(Const.CAPTCHA_TYPE, "default"); - config.put(Const.CAPTCHA_INTERFERENCE_OPTIONS, "0"); - config.put(Const.ORIGINAL_PATH_JIGSAW, ""); - config.put(Const.ORIGINAL_PATH_PIC_CLICK, ""); - config.put(Const.CAPTCHA_SLIP_OFFSET, "5"); - config.put(Const.CAPTCHA_AES_STATUS, "false"); - config.put(Const.CAPTCHA_WATER_FONT, "WenQuanZhengHei.ttf"); - // CacheUtil的定时任务存在泄露的问题 - config.put(Const.CAPTCHA_TIMING_CLEAR_SECOND, "0"); - - config.put(Const.CAPTCHA_FONT_SIZE, "25"); - config.put(Const.CAPTCHA_FONT_STYLE, Font.BOLD); - config.put(Const.CAPTCHA_WORD_COUNT, "4"); - - CaptchaService captchaService = CaptchaServiceFactory.getInstance(config); - CaptchaCacheService captchaCacheService = CaptchaServiceFactory.getCache("local"); - blockPuzzleCaptchaService = new BlockPuzzleCaptchaService(captchaService, - captchaCacheService, - 5); - clickWorkCaptchaService = new ClickWorkCaptchaService(captchaService, - captchaCacheService, - 5); - } - - private void initUI() { - setLayout(new BorderLayout()); - - // 创建验证码显示面板 - captchaPanel = new JPanel(new GridLayout(3, 3, 10, 10)); - captchaPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - add(captchaPanel, BorderLayout.CENTER); - - // 创建按钮面板 - JPanel buttonPanel = new JPanel(); - generateButton = new JButton("生成验证码"); - generateButton.setFont(new Font("Microsoft YaHei", Font.BOLD, 16)); - generateButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - generateCaptchas(); - } - }); - buttonPanel.add(generateButton); - add(buttonPanel, BorderLayout.SOUTH); - } - - private void generateCaptchas() { - captchaPanel.removeAll(); - - LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(250, 50); - ImageIcon icon = new ImageIcon(lineCaptcha.getImageBytes()); - - JLabel label = new JLabel(icon); - label.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1)); - captchaPanel.add(label); - - CaptchaData captchaData = lineCaptchaService.draw(); - decodeImage(captchaData); - - captchaData = circleCaptchaService.draw(); - decodeImage(captchaData); - - captchaData = shearCaptchaService.draw(); - decodeImage(captchaData); - - captchaData = gifCaptchaService.draw(); - decodeImage(captchaData); - - captchaData = blockPuzzleCaptchaService.draw(); - decodeImage(captchaData); - - captchaData = clickWorkCaptchaService.draw(); - decodeImage(captchaData); - - captchaPanel.revalidate(); - captchaPanel.repaint(); - } - - private void decodeImage(CaptchaData captchaData) { - ImageIcon icon = new ImageIcon(captchaData.captchaImage()); - - JLabel label = new JLabel(icon); - label.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1)); - captchaPanel.add(label); - - if (captchaData.backgroundImage() != null) { - icon = new ImageIcon(captchaData.backgroundImage()); - - label = new JLabel(icon); - label.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1)); - captchaPanel.add(label); - } - } - - public static void main(String[] args) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Exception e) { - e.printStackTrace(); - } - new CaptchaJFrameDemo().setVisible(true); - } - }); - } -} diff --git a/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/CircleCaptchaServiceTest.java b/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/CircleCaptchaServiceTest.java index 9b7384ab71831c4bae17e97f5dacb5bccbc1f73f..1031dca6ee295961f73baf39ed57e0c246795a4f 100644 --- a/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/CircleCaptchaServiceTest.java +++ b/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/CircleCaptchaServiceTest.java @@ -3,7 +3,8 @@ package yunjiao.springboot.extension.captcha.hutool; import org.junit.jupiter.api.Test; import yunjiao.springboot.extension.common.captcha.CaptchaCategory; import yunjiao.springboot.extension.common.captcha.CaptchaData; -import yunjiao.springboot.extension.common.model.ColorType; +import yunjiao.springboot.extension.common.model.ColorTypeEnum; +import yunjiao.springboot.extension.common.model.FontNameEnum; import java.awt.*; @@ -19,16 +20,16 @@ public class CircleCaptchaServiceTest { private static final CircleCaptchaBuilder builder; static { - Font font = new Font(null, Font.PLAIN, 36); + Font font = FontNameEnum.Default.getFont(Font.PLAIN, 36); builder = new CircleCaptchaBuilder(); builder.setWidth(250); builder.setHeight(50); builder.setInterfereCount(30); - builder.setBackgroundColor(ColorType.white); + builder.setBackgroundColor(ColorTypeEnum.white); builder.setFuzziness(2); builder.setValidIgnoreCase(true); builder.setFont(font); - builder.setGenerator(CodeGeneratorType.numAndChar.apply(6)); + builder.setGenerator(CodeGeneratorType.lowerChar.apply(6)); circleCaptchaService = new CircleCaptchaService(builder); } diff --git a/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/GifCaptchaServiceTest.java b/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/GifCaptchaServiceTest.java index 80cf999395e251cdc08559635cadce4a98029e9c..efe81b7409afa98f136bcf6ec0d83a3471f0f2d1 100644 --- a/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/GifCaptchaServiceTest.java +++ b/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/GifCaptchaServiceTest.java @@ -3,7 +3,8 @@ package yunjiao.springboot.extension.captcha.hutool; import org.junit.jupiter.api.Test; import yunjiao.springboot.extension.common.captcha.CaptchaCategory; import yunjiao.springboot.extension.common.captcha.CaptchaData; -import yunjiao.springboot.extension.common.model.ColorType; +import yunjiao.springboot.extension.common.model.ColorTypeEnum; +import yunjiao.springboot.extension.common.model.FontNameEnum; import java.awt.*; @@ -19,12 +20,12 @@ public class GifCaptchaServiceTest { private static final GifCaptchaBuilder builder; static { - Font font = new Font(null, Font.PLAIN, 36); + Font font = FontNameEnum.Default.getFont(Font.PLAIN, 36); builder = new GifCaptchaBuilder(); builder.setWidth(250); builder.setHeight(50); builder.setInterfereCount(10); - builder.setBackgroundColor(ColorType.white); + builder.setBackgroundColor(ColorTypeEnum.white); builder.setFuzziness(2); builder.setValidIgnoreCase(true); builder.setFont(font); diff --git a/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/LineCaptchaServiceTest.java b/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/LineCaptchaServiceTest.java index 7ef00426fb3797b3bd353ead2673d238473bc21b..20aecd80716dfe9cdf49cef2d425000146f1c977 100644 --- a/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/LineCaptchaServiceTest.java +++ b/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/LineCaptchaServiceTest.java @@ -3,7 +3,8 @@ package yunjiao.springboot.extension.captcha.hutool; import org.junit.jupiter.api.Test; import yunjiao.springboot.extension.common.captcha.CaptchaCategory; import yunjiao.springboot.extension.common.captcha.CaptchaData; -import yunjiao.springboot.extension.common.model.ColorType; +import yunjiao.springboot.extension.common.model.ColorTypeEnum; +import yunjiao.springboot.extension.common.model.FontNameEnum; import java.awt.*; @@ -19,12 +20,12 @@ public class LineCaptchaServiceTest { private static final LineCaptchaBuilder builder; static { - Font font = new Font(null, Font.PLAIN, 36); + Font font = FontNameEnum.Default.getFont(Font.PLAIN, 36); builder = new LineCaptchaBuilder(); builder.setWidth(250); builder.setHeight(50); builder.setInterfereCount(60); - builder.setBackgroundColor(ColorType.white); + builder.setBackgroundColor(ColorTypeEnum.white); builder.setFuzziness(2); builder.setValidIgnoreCase(true); builder.setFont(font); diff --git a/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/ShearCaptchaServiceTest.java b/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/ShearCaptchaServiceTest.java index ba35f6cfe40880a37a83443c63abf12c454bbcf0..fecbb18b6b75bc27de4275b5c5b5be043ea166d7 100644 --- a/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/ShearCaptchaServiceTest.java +++ b/extensions/extension-captcha/src/test/java/yunjiao/springboot/extension/captcha/hutool/ShearCaptchaServiceTest.java @@ -3,7 +3,8 @@ package yunjiao.springboot.extension.captcha.hutool; import org.junit.jupiter.api.Test; import yunjiao.springboot.extension.common.captcha.CaptchaCategory; import yunjiao.springboot.extension.common.captcha.CaptchaData; -import yunjiao.springboot.extension.common.model.ColorType; +import yunjiao.springboot.extension.common.model.ColorTypeEnum; +import yunjiao.springboot.extension.common.model.FontNameEnum; import java.awt.*; @@ -19,16 +20,16 @@ public class ShearCaptchaServiceTest { private static final ShearCaptchaBuilder builder; static { - Font font = new Font(null, Font.PLAIN, 36); + Font font = FontNameEnum.SimSun.getFont(Font.PLAIN, 36); builder = new ShearCaptchaBuilder(); builder.setWidth(250); builder.setHeight(50); builder.setInterfereCount(4); - builder.setBackgroundColor(ColorType.white); + builder.setBackgroundColor(ColorTypeEnum.white); builder.setFuzziness(2); builder.setValidIgnoreCase(true); builder.setFont(font); - builder.setGenerator(CodeGeneratorType.numAndChar.apply(6)); + builder.setGenerator(CodeGeneratorType.lowerChar.apply(6)); shearCaptchaService = new ShearCaptchaService(builder); } diff --git a/extensions/extension-common/pom.xml b/extensions/extension-common/pom.xml index 09b1dc2e55a0d14b9892571b16244bfe553bdddc..4bf38c87c7c7aeae00c01481710ec422584f2861 100644 --- a/extensions/extension-common/pom.xml +++ b/extensions/extension-common/pom.xml @@ -47,5 +47,11 @@ org.apache.commons commons-lang3 + + + com.google.code.findbugs + jsr305 + compile + \ No newline at end of file diff --git a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/CommonConsts.java b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/CommonConsts.java index cf5b9eba273b34073140bdc02af2d794f78050ff..9e69eef5ed5868987470e3f67bffa1eeb0823b8c 100644 --- a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/CommonConsts.java +++ b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/CommonConsts.java @@ -9,10 +9,10 @@ public final class CommonConsts { /** * 系统环境变量名称:雪花算法workId */ - public static final String ENV_SNOWFLAKE_WORKER_ID = "SNOWFLAKE_WORKER_ID"; + public static final String ENV_SNOWFLAKE_WORKER_ID = "yunjiao.springboot.extension.id.snowflakeWorkId"; /** * 系统环境变量名称:雪花算法datacenterId */ - public static final String ENV_SNOWFLAKE_DATACENTER_ID = "SNOWFLAKE_DATACENTER_ID"; + public static final String ENV_SNOWFLAKE_DATACENTER_ID = "yunjiao.springboot.extension.id.snowflakeDatacenterId"; } diff --git a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/captcha/CaptchaCategory.java b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/captcha/CaptchaCategory.java index ae903f0dc37bfdfda6b3f13acce49de8cc032c99..c93db89d9c0bb91458724c8cd00b16898acca49c 100644 --- a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/captcha/CaptchaCategory.java +++ b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/captcha/CaptchaCategory.java @@ -1,6 +1,5 @@ package yunjiao.springboot.extension.common.captcha; -import yunjiao.springboot.extension.common.util.EnumCache; import lombok.Getter; import lombok.ToString; @@ -12,12 +11,39 @@ import lombok.ToString; @Getter @ToString public enum CaptchaCategory { + /** + * 线段干扰验证码 + */ line("png", "线段干扰验证码"), + + /** + * 圆圈干扰验证码 + */ circle("png", "圆圈干扰验证码"), + + /** + * 扭曲干扰验证码 + */ shear("png", "扭曲干扰验证码"), + + /** + * GIF验证码 + */ gif("gif", "GIF验证码"), + + /** + * 滑块拼图验证码 + */ blockPuzzle("png", "滑块拼图验证码"), + + /** + * 文字点选验证码 + */ clickWord("png", "文字点选验证码"), + + /** + * 旋转拼图验证码 + */ rotatePuzzle("png", "旋转拼图验证码"); /** @@ -34,8 +60,4 @@ public enum CaptchaCategory { this.ext = ext; this.description = description; } - - static { - EnumCache.registerByName(CaptchaCategory.class, CaptchaCategory.values()); - } } diff --git a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/ColorType.java b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/ColorTypeEnum.java similarity index 93% rename from extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/ColorType.java rename to extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/ColorTypeEnum.java index 5d868d504e086f47e162f89fa5252802e07f8bd8..13412f83b45e275e044bb03e75adb9ec948916c1 100644 --- a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/ColorType.java +++ b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/ColorTypeEnum.java @@ -10,7 +10,7 @@ import java.awt.*; * @author yangyunjiao */ @Getter -public enum ColorType { +public enum ColorTypeEnum { /** * 白色 */ @@ -79,7 +79,7 @@ public enum ColorType { private final Color mapping; - ColorType(Color mapping) { + ColorTypeEnum(Color mapping) { this.mapping = mapping; } } diff --git a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/FontNameEnum.java b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/FontNameEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..172a2066bbd1fc3293dc0c56c3d2b3913025d1aa --- /dev/null +++ b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/FontNameEnum.java @@ -0,0 +1,127 @@ +package yunjiao.springboot.extension.common.model; + +import lombok.Getter; +import yunjiao.springboot.extension.common.util.FontCache; + +import java.awt.*; + +/** + * 字体名称 + * + * @author yangyunjiao + */ +@Getter +public enum FontNameEnum { + + // 阿里巴巴普惠体 3.0 (下载地址:...) + /** + * 常规体 (字重:55) + * 最标准、最常用的字重。笔画清晰,可读性极高,是长时间阅读正文的首选,也被广泛用于用户界面(UI)的默认文本。 + */ + AlibabaPuHuiTi355Regular("阿里巴巴普惠体 3.0 55 Regular"), + + /** + * 细体 / 纤体 (字重:35) + * 笔画最细,显得非常清秀、轻盈、现代。适用于大字号标题、时尚设计等需要精致感的场景,小字号下可能不易阅读。 + */ + AlibabaPuHuiTi335Thin("阿里巴巴普惠体 3.0 35 Thin"), + + /** + * 轻体 (字重:45) + * 比Thin稍粗一点,但仍然保持轻盈的感觉。阅读起来比Thin更舒适,适合副标题、正文等。 + */ + AlibabaPuHuiTi345Light("阿里巴巴普惠体 3.0 45 Light"), + + /** + * 常规体(L3版本) (字重:55) + * 重与Regular完全相同(都是55)。后缀的 L3 很可能表示这是一个专门为西文(拉丁字母、数字、符号)优化的版本,或者是一个仅包含西文字符的子集字体, + * 以确保在西文环境下显示效果更佳。中文部分可能保持不变或未包含。 + */ + AlibabaPuHuiTi355RegularL3("阿里巴巴普惠体 3.0 55 Regular L3"), + + /** + * 中等 (字重:65) + * 比Regular更粗一点,更有力量感。常用于需要稍加强调的小标题、按钮文字、数据标注等,在不使用粗体的情况下提供层次感。 + */ + AlibabaPuHuiTi365Medium("阿里巴巴普惠体 3.0 65 Medium"), + + /** + * 半粗体 (字重:75) + * 已经具有明显的粗壮感。非常适合用于标题、强调性段落,视觉效果突出。 + */ + AlibabaPuHuiTi375SemiBold("阿里巴巴普惠体 3.0 75 SemiBold"), + + /** + * 粗体 (字重:85) + * 标准的粗体,强调效果强烈。常用于重点标题、需要用户特别注意的提示信息等。 + */ + AlibabaPuHuiTi385Bold("阿里巴巴普惠体 3.0 85 Bold"), + + /** + * 特粗体 / 超粗体 (字重:95) + * 非常粗壮,视觉冲击力极强。通常用于超大字号的主标题、海报、广告牌等,能够有效吸引眼球。 + */ + AlibabaPuHuiTi395ExtraBold("阿里巴巴普惠体 3.0 95 ExtraBold"), + + /** + * 重体 / 黑体 Heavy (字重:105) + * 笔画极粗,几乎填满了所有空间。是字体家族中最粗的成员,用于需要最强视觉重量的场合,使用时要非常谨慎,以免显得臃肿。 + */ + AlibabaPuHuiTi3105Heavy("阿里巴巴普惠体 3.0 105 Heavy"), + + /** + * 黑体 (字重:115) + */ + AlibabaPuHuiTi3115Black("阿里巴巴普惠体 3.0 115 Black"), + + /** + * 思源黑体 (下载地址:...) + */ + SourceHanSansVF("Source Han Sans VF"), + + /** + * 思源宋体 (下载地址:...) + */ + SourceHanSerifVF("Source Han Serif VF"), + + /** + * 通用字体:宋体 + */ + SimSun("宋体"), + + /** + * 通用字体:新宋体 + */ + NSimSun("新宋体"), + + /** + * 默认系统字体 + */ + Default(null); + + + private final String name; + + FontNameEnum(String name) { + this.name = name; + } + + /** + * 获取字体 + * @param style 字体样式 (Font.PLAIN, Font.BOLD, Font.ITALIC) + * @param size 字体大小 + * @return 请求的字体 + */ + public Font getFont(int style, float size) { + return FontCache.getInstance().getFont(getName(), style, size); + } + + /** + * 获取字体 (默认样式和大小) + * + * @return 请求的字体 + */ + public Font getFont() { + return FontCache.getInstance().getFont(getName()); + } +} diff --git a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/FontStyle.java b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/FontStyleEnum.java similarity index 86% rename from extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/FontStyle.java rename to extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/FontStyleEnum.java index 45cf7ba00810189ba71887158ea9fa6034cb15d5..249fb2e897fc332dd0e52424eb8e59ee19136d4a 100644 --- a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/FontStyle.java +++ b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/FontStyleEnum.java @@ -10,7 +10,7 @@ import java.awt.*; * @author yangyunjiao */ @Getter -public enum FontStyle { +public enum FontStyleEnum { /** * 正常体 */ @@ -28,7 +28,7 @@ public enum FontStyle { private final int mapping; - FontStyle(int mapping) { + FontStyleEnum(int mapping) { this.mapping = mapping; } } diff --git a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/TransparencyType.java b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/TransparencyTypeEnum.java similarity index 93% rename from extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/TransparencyType.java rename to extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/TransparencyTypeEnum.java index ea369292973cbdc7dd39bc17f46ab87ee379ce32..28c83187ddecc70ff0ef146fa17f12dddcf3b4ba 100644 --- a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/TransparencyType.java +++ b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/model/TransparencyTypeEnum.java @@ -10,7 +10,7 @@ import java.awt.*; * @author yangyunjiao */ @Getter -public enum TransparencyType { +public enum TransparencyTypeEnum { /** * {@link AlphaComposite#Clear} */ @@ -73,7 +73,7 @@ public enum TransparencyType { private final AlphaComposite mapping; - TransparencyType(AlphaComposite mapping) { + TransparencyTypeEnum(AlphaComposite mapping) { this.mapping = mapping; } } diff --git a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/spring/jdbc/DataSourceContextHolder.java b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/spring/jdbc/DataSourceContextHolder.java index 54826e6738108c94726ead5685bbc7006a5d8e2e..9ccba3ad2dadeb0a42d97e910a0043ab498a6a16 100644 --- a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/spring/jdbc/DataSourceContextHolder.java +++ b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/spring/jdbc/DataSourceContextHolder.java @@ -1,5 +1,6 @@ package yunjiao.springboot.extension.common.spring.jdbc; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -8,24 +9,41 @@ import org.springframework.util.StringUtils; * @author yangyunjiao */ public class DataSourceContextHolder { + /** + * 默认是数据源名称 + */ public static final String DEFAULT = "default"; + /** + * 数据源名称上下文 + */ private static final ThreadLocal contextHolder = new ThreadLocal<>(); - public static void setDataSourceType(String dsType) { - if (!StringUtils.hasText(dsType)) { + /** + * 设置上下文数据源名称,如果是空,设置默认数据源名称 + * @param dsName 数据源名称 + */ + public static void setDataSourceName(@Nullable String dsName) { + if (!StringUtils.hasText(dsName)) { contextHolder.set(DEFAULT); } else { - contextHolder.set(dsType); + contextHolder.set(dsName); } } - public static String getDataSourceType() { + /** + * 获取上下文数据源名称 + * @return 名称 + */ + public static String getDataSourceName() { return contextHolder.get(); } - public static void clearDataSourceType() { + /** + * 清理上下文数据源名称 + */ + public static void clearDataSourceName() { contextHolder.remove(); } } diff --git a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/spring/jdbc/MultipleDataSource.java b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/spring/jdbc/MultipleDataSource.java index 88bf7eb6591175c8c63baa54d4062a4dfff739d1..722ac80d5af99d40e758238c75fc365f2c1d80ee 100644 --- a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/spring/jdbc/MultipleDataSource.java +++ b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/spring/jdbc/MultipleDataSource.java @@ -10,6 +10,6 @@ import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class MultipleDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { - return DataSourceContextHolder.getDataSourceType(); + return DataSourceContextHolder.getDataSourceName(); } } diff --git a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/util/EnumCache.java b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/util/EnumCache.java index 5fba8248313b7528823a4efbe6e76c54626f7caf..a3274af6abbda780f8c217c0506c66891a7e373a 100644 --- a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/util/EnumCache.java +++ b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/util/EnumCache.java @@ -1,202 +1,147 @@ package yunjiao.springboot.extension.common.util; -import java.util.Map; +import lombok.extern.slf4j.Slf4j; + +import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; /** - * 枚举缓存 + * 枚举缓存, 单例模式 * * @author yangyunjiao */ -public class EnumCache { - - /** - * 以枚举任意值构建的缓存结构 - **/ - static final Map>, Map>> CACHE_BY_VALUE = new ConcurrentHashMap<>(); - - /** - * 以枚举名称构建的缓存结构 - **/ - static final Map>, Map>> CACHE_BY_NAME = new ConcurrentHashMap<>(); - - /** - * 枚举静态块加载标识缓存结构 - */ - static final Map>, Boolean> LOADED = new ConcurrentHashMap<>(); - - /** - * 锁对象 - */ - private static final Object lock = new Object(); - - /** - * 以枚举名称构建缓存,在枚举的静态块里面调用 - * - * @param clazz 必须值 - * @param values 必须值 - * @param 枚举类型 - */ - public static > void registerByName(Class clazz, E[] values) { - Map> map = new ConcurrentHashMap<>(); - for (E v : values) { - map.put(v.name(), v); - } - CACHE_BY_NAME.put(clazz, map); - } - - /** - * 以枚举转换出的任意值构建缓存,在枚举的静态块里面调用 - * - * @param clazz 必须值 - * @param values 必须值 - * @param enumMapping 必须值 - * @param 枚举类型 - */ - public static > void registerByValue(Class clazz, E[] values, EnumMapping enumMapping) { - if (CACHE_BY_VALUE.containsKey(clazz)) { - throw new RuntimeException(String.format("枚举%s已经构建过value缓存,不允许重复构建", clazz.getSimpleName())); - } - Map> map = new ConcurrentHashMap<>(); - for (E v : values) { - Object value = enumMapping.value(v); - if (map.containsKey(value)) { - throw new RuntimeException(String.format("枚举%s存在相同的值%s映射同一个枚举%s.%s", clazz.getSimpleName(), value, clazz.getSimpleName(), v)); - } - map.put(value, v); - } - CACHE_BY_VALUE.put(clazz, map); +@Slf4j +public final class EnumCache { + private EnumCache() { } /** - * 从以枚举名称构建的缓存中通过枚举名获取枚举 + * 获取实例,单例模式 * - * @param clazz 必须值 - * @param name 可以空 * @return 实例 - * @param 枚举类型 */ - public static > E findByName(Class clazz, String name) { - return find(clazz, name, CACHE_BY_NAME, null); + public static EnumCache getInstance() { + return EnumCacheHolder.instance; } /** - * 从以枚举名称构建的缓存中通过枚举名获取枚举 - * - * @param clazz 必须值 - * @param name 可以空 - * @param defaultEnum 可以空 + * 使用枚举值定位枚举 + * @param clazz 枚举类 + * @param lookupValue 定位值 + * @return 枚举实例 * @param 枚举类型 - * @return 实例 */ - public static > E findByName(Class clazz, String name, E defaultEnum) { - return find(clazz, name, CACHE_BY_NAME, defaultEnum); + public > E lookupByName(Class clazz, String lookupValue) { + return lookupByValue(clazz, lookupValue, Enum::name, null); } /** - * 从以枚举转换值构建的缓存中通过枚举转换值获取枚举 + * 使用枚举值定位枚举。未找到则返回默认值 * - * @param clazz 必须值 - * @param value 可以空 + * @param clazz 枚举类 + * @param lookupValue 定位值 + * @param defaultValue 默认值 + * @return 枚举实例 * @param 枚举类型 - * @return 实例 */ - public static > E findByValue(Class clazz, Object value) { - return find(clazz, value, CACHE_BY_VALUE, null); + public > E lookupByName(Class clazz, String lookupValue, E defaultValue) { + return lookupByValue(clazz, lookupValue, Enum::name, defaultValue); } /** - * 从以枚举转换值构建的缓存中通过枚举转换值获取枚举 + * 使用值定位枚举 * - * @param clazz 必须值 - * @param value 可以空 - * @param defaultEnum 可以空 + * @param clazz 枚举类 + * @param lookupValue 定位值 + * @param getValue 获取枚举值方法引用 + * @return 枚举实例 * @param 枚举类型 - * @return 实例 */ - public static > E findByValue(Class clazz, Object value, E defaultEnum) { - return find(clazz, value, CACHE_BY_VALUE, defaultEnum); + public > E lookupByValue(Class clazz, Object lookupValue, Function getValue) { + return lookupByValue(clazz, lookupValue, getValue, null); } /** + * 使用枚举值定位枚举。未找到则返回默认值 * - * @param clazz 必须值 - * @param obj 可以空 - * @param cache 必须值 - * @param defaultEnum 可以空 - * @return 实例 + * @param clazz 枚举类 + * @param lookupValue 定位值 + * @param getValue 获取枚举值方法引用 + * @param defaultValue 默认值 + * @return 枚举实例 * @param 枚举类型 */ - @SuppressWarnings({"all"}) - private static > E find(Class clazz, Object obj, Map>, Map>> cache, E defaultEnum) { - Map> map = cache.get(clazz); - if (map == null) { - executeEnumStatic(clazz);// 触发枚举静态块执行 - map = cache.get(clazz);// 执行枚举静态块后重新获取缓存 + @SuppressWarnings({"unchecked"}) + public > E lookupByValue(Class clazz, Object lookupValue, Function getValue, E defaultValue) { + assert clazz != null; + assert getValue != null; + + if (!EnumCacheHolder.existCache(clazz)) { + EnumCacheHolder.initCache(clazz); } - if (map == null) { - String msg = null; - if (cache == CACHE_BY_NAME) { - msg = String.format( - "枚举%s还没有注册到枚举缓存中,请在%s.static代码块中加入如下代码 : EnumCache.registerByName(%s.class, %s.values());", - clazz.getSimpleName(), - clazz.getSimpleName(), - clazz.getSimpleName(), - clazz.getSimpleName() - ); - } - if (cache == CACHE_BY_VALUE) { - msg = String.format( - "枚举%s还没有注册到枚举缓存中,请在%s.static代码块中加入如下代码 : EnumCache.registerByValue(%s.class, %s.values(), %s::getXxx);", - clazz.getSimpleName(), - clazz.getSimpleName(), - clazz.getSimpleName(), - clazz.getSimpleName(), - clazz.getSimpleName() - ); + + List> values = EnumCacheHolder.getValue(clazz).orElse(Collections.emptyList()); + for (Enum value : values) { + Object o = getValue.apply((E)value); + if (Objects.equals(lookupValue, o)) { + return (E)value; } - throw new RuntimeException(msg); - } - if (obj == null) { - return defaultEnum; } - Enum result = map.get(obj); - return result == null ? defaultEnum : (E) result; + + return defaultValue; } /** - * - * @param clazz 必须值 - * @param 枚举类型 + * Holder 类,包含所有静态属性 */ - private static > void executeEnumStatic(Class clazz) { - if (!LOADED.containsKey(clazz)) { - synchronized (lock) { - if (!LOADED.containsKey(clazz)) { - try { - // 目的是让枚举类的static块运行,static块没有执行完是会阻塞在此的 - Class.forName(clazz.getName()); - LOADED.put(clazz, true); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } + protected static final class EnumCacheHolder { + /** + * {@link EnumCache}自身实例 + */ + private static final EnumCache instance = new EnumCache(); + + /** + * 枚举值缓存 + */ + private static final Map>, List>> CHACHE = new ConcurrentHashMap<>(); + + /** + * 获取缓存值 + * + * @param clazz 枚举类,键值 + * @return 枚举缓存值 + */ + public static Optional>> getValue(Class clazz) { + return Optional.ofNullable(CHACHE.get(clazz)); } - } - /** - * 枚举缓存映射器函数式接口 - */ - @FunctionalInterface - public interface EnumMapping> { /** - * 自定义映射器 + * 枚举是否已经缓存 * - * @param e 枚举 - * @return 映射关系,最终体现到缓存中 + * @param clazz 枚举类,键值 + * @return 已缓存返回True;否则False */ - Object value(E e); - } + public static boolean existCache(Class clazz) { + return CHACHE.containsKey(clazz); + } + /** + * 初始化枚举缓存。key=枚举类;value=枚举值 + * @param clazz 枚举类 + */ + public static synchronized void initCache(Class> clazz) { + if (EnumCacheHolder.existCache(clazz)) { + return; + } + + final Enum[] enums = clazz.getEnumConstants(); + CHACHE.put(clazz, List.of(enums)); + + if (log.isDebugEnabled()) { + log.debug("初始化枚举缓存: {}, 总共枚举缓存 {} 个", clazz.getName(), CHACHE.size()); + } + + } + } } diff --git a/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/util/FontCache.java b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/util/FontCache.java new file mode 100644 index 0000000000000000000000000000000000000000..1d7fe398ef6ad4f891edb6945daeb7066b3ec5b2 --- /dev/null +++ b/extensions/extension-common/src/main/java/yunjiao/springboot/extension/common/util/FontCache.java @@ -0,0 +1,147 @@ +package yunjiao.springboot.extension.common.util; + +import lombok.extern.slf4j.Slf4j; +import yunjiao.springboot.extension.common.model.FontNameEnum; + +import java.awt.*; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * 字体缓存 + * + * @author yangyunjiao + */ +@Slf4j +public final class FontCache { + private static FontCache instance; + + // 字体缓存,存储字体名称和对应的Font对象 + private Map fontCache; + + // 系统可用字体列表 + private String[] availableFonts; + + /** + * 构造函数,初始化字体缓存和获取系统可用字体 + */ + private FontCache() { + fontCache = new HashMap<>(); + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + availableFonts = ge.getAvailableFontFamilyNames(); + } + + /** + * 获取实例。单例模式 + * @return 实例 + */ + public static synchronized FontCache getInstance() { + if (instance == null) { + instance = new FontCache(); + } + return instance; + } + + /** + * 注册单个字体流并缓存 + * @param is 字体流文件 + * @throws FontFormatException 当字体格式不正确时抛出 + * @throws IOException 读取字体异常 + */ + public void registerFont(InputStream is) throws IOException, FontFormatException { + Font font = Font.createFont(Font.TRUETYPE_FONT, is); + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + ge.registerFont(font); + + // 缓存字体 + String fontName = font.getFontName(); + fontCache.put(fontName, font); + if (log.isDebugEnabled()) { + log.debug("成功注册字体: {}", fontName); + } + } + + /** + * 获取字体 + * @param fontName 字体名称 + * @param style 字体样式 (Font.PLAIN, Font.BOLD, Font.ITALIC) + * @param size 字体大小 + * @return 请求的字体 + */ + public Font getFont(String fontName, int style, float size) { + // 首先检查缓存 + if (fontCache.containsKey(fontName)) { + return fontCache.get(fontName).deriveFont(style, size); + } + + // 然后检查系统字体 + for (String availableFont : availableFonts) { + if (availableFont.equalsIgnoreCase(fontName)) { + // 创建并缓存系统字体 + Font font = new Font(fontName, style, (int) size); + fontCache.put(fontName, font); + return font.deriveFont(style, size); + } + } + + // 字体不存在,使用默认字体 + Font defaultFont = FontNameEnum.SimSun.getFont(style, size); + log.warn("系统中不存在字体:{}, 将使用默认字体:{}", fontName, defaultFont.getFamily()); + return defaultFont; + } + + /** + * 获取字体 (默认样式和大小) + * @param fontName 字体名称 + * @return 请求的字体 + */ + public Font getFont(String fontName) { + return getFont(fontName, Font.PLAIN, 12f); + } + + /** + * 检查字体是否可用 + * @param fontName 字体名称 + * @return 如果字体可用返回true,否则返回false + */ + public boolean isFontAvailable(String fontName) { + // 检查缓存 + if (fontCache.containsKey(fontName)) { + return true; + } + + // 检查系统字体 + for (String availableFont : availableFonts) { + if (availableFont.equalsIgnoreCase(fontName)) { + return true; + } + } + + return false; + } + + /** + * 获取所有可用字体名称 + * @return 所有可用字体名称的数组 + */ + public String[] getAllAvailableFonts() { + return availableFonts; + } + + /** + * 获取所有已缓存字体名称 + * @return 所有已缓存字体名称的数组 + */ + public String[] getAllCachedFonts() { + return fontCache.keySet().toArray(new String[0]); + } + + /** + * 清空字体缓存 + */ + public void clearCache() { + fontCache.clear(); + } +} diff --git a/extensions/extension-common/src/test/java/yunjiao/springboot/extension/common/algorithm/GaussianBlurJFrameDemo.java b/extensions/extension-common/src/test/java/yunjiao/springboot/extension/common/algorithm/GaussianBlurDemo.java similarity index 96% rename from extensions/extension-common/src/test/java/yunjiao/springboot/extension/common/algorithm/GaussianBlurJFrameDemo.java rename to extensions/extension-common/src/test/java/yunjiao/springboot/extension/common/algorithm/GaussianBlurDemo.java index febb0bd67e514289e2a5c83a1046af6ce8cad1e7..428378641d90ac1948710bf75a6651cc33a5c137 100644 --- a/extensions/extension-common/src/test/java/yunjiao/springboot/extension/common/algorithm/GaussianBlurJFrameDemo.java +++ b/extensions/extension-common/src/test/java/yunjiao/springboot/extension/common/algorithm/GaussianBlurDemo.java @@ -14,7 +14,7 @@ import java.io.IOException; * * @author yangyunjiao */ -public class GaussianBlurJFrameDemo extends JFrame { +public class GaussianBlurDemo extends JFrame { private BufferedImage originalImage; private BufferedImage blurredImage; private final JLabel imageLabel; @@ -42,7 +42,7 @@ public class GaussianBlurJFrameDemo extends JFrame { } - public GaussianBlurJFrameDemo() { + public GaussianBlurDemo() { setTitle("Java高斯模糊算法 - 支持强度设置"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(1000, 700); @@ -191,9 +191,7 @@ public class GaussianBlurJFrameDemo extends JFrame { } public static void main(String[] args) { - SwingUtilities.invokeLater(() -> { - GaussianBlurJFrameDemo app = new GaussianBlurJFrameDemo(); - app.setVisible(true); - }); + SwingUtilities.invokeLater(() -> new GaussianBlurDemo().setVisible(true)); } + } diff --git a/extensions/extension-common/src/test/java/yunjiao/springboot/extension/common/util/EnumCacheTest.java b/extensions/extension-common/src/test/java/yunjiao/springboot/extension/common/util/EnumCacheTest.java index 7c987e1b69c90238de9b10a70b5229fdc15c851b..a5547838e1b10dbaf2c4e30772da49c9a5ab454b 100644 --- a/extensions/extension-common/src/test/java/yunjiao/springboot/extension/common/util/EnumCacheTest.java +++ b/extensions/extension-common/src/test/java/yunjiao/springboot/extension/common/util/EnumCacheTest.java @@ -1,7 +1,7 @@ package yunjiao.springboot.extension.common.util; +import lombok.Getter; import org.junit.jupiter.api.Test; -import yunjiao.springboot.extension.common.util.EnumCache; import static org.assertj.core.api.Assertions.assertThat; @@ -14,56 +14,50 @@ public class EnumCacheTest { @Test void givenName_whenFindByName_thenReturnOk() { - StatusEnum status = EnumCache.findByName(StatusEnum.class, "SUCCESS"); + StatusEnum status = EnumCache.getInstance().lookupByName(StatusEnum.class, "SUCCESS"); assertThat(status).isEqualTo(StatusEnum.SUCCESS); } @Test void givenWrongName_whenFindByName_thenReturnNull() { - StatusEnum status = EnumCache.findByName(StatusEnum.class, "SUCCESS1"); + StatusEnum status = EnumCache.getInstance().lookupByName(StatusEnum.class, "SUCCESS1"); assertThat(status).isNull(); } @Test - void givenValue_whenFindByValue_thenReturnOk() { - StatusEnum status = EnumCache.findByValue(StatusEnum.class, "S"); + void givenWrongValue_whenFindByName_thenReturnNull() { + StatusEnum status = EnumCache.getInstance().lookupByValue(StatusEnum.class, "s", StatusEnum::getCode); + assertThat(status).isNull(); + } + + @Test + void givenCode_whenFindByValue_thenReturnOk() { + StatusEnum status = EnumCache.getInstance().lookupByValue(StatusEnum.class, "S", StatusEnum::getCode); assertThat(status).isEqualTo(StatusEnum.SUCCESS); } @Test - void givenWrongValue_whenFindByName_thenReturnNull() { - StatusEnum status = EnumCache.findByName(StatusEnum.class, "s"); - assertThat(status).isNull(); + void givenDesc_whenFindByValue_thenReturnOk() { + StatusEnum status = EnumCache.getInstance().lookupByValue(StatusEnum.class, "失败", StatusEnum::getDesc); + assertThat(status).isEqualTo(StatusEnum.FAIL); } + + + @Getter enum StatusEnum { INIT("I", "初始化"), PROCESSING("P", "处理中"), SUCCESS("S", "成功"), FAIL("F", "失败"); - private String code; - private String desc; + private final String code; + private final String desc; StatusEnum(String code, String desc) { this.code = code; this.desc = desc; } - - public String getCode() { - return code; - } - - public String getDesc() { - return desc; - } - - static { - // 通过名称构建缓存,通过EnumCache.findByName(StatusEnum.class,"SUCCESS",null);调用能获取枚举 - EnumCache.registerByName(StatusEnum.class, StatusEnum.values()); - // 通过code构建缓存,通过EnumCache.findByValue(StatusEnum.class,"S",null);调用能获取枚举 - EnumCache.registerByValue(StatusEnum.class, StatusEnum.values(), StatusEnum::getCode); - } } } diff --git a/extensions/extension-common/src/test/java/yunjiao/springboot/extension/common/util/FontCacheDemo.java b/extensions/extension-common/src/test/java/yunjiao/springboot/extension/common/util/FontCacheDemo.java new file mode 100644 index 0000000000000000000000000000000000000000..d9eda39e61b7de588ce8896a7f617551cc7a42a3 --- /dev/null +++ b/extensions/extension-common/src/test/java/yunjiao/springboot/extension/common/util/FontCacheDemo.java @@ -0,0 +1,159 @@ +package yunjiao.springboot.extension.common.util; + +import yunjiao.springboot.extension.common.model.FontNameEnum; + +import javax.swing.*; +import java.awt.*; +import java.util.Arrays; + +/** + * {@link FontCache} 单元测试用例 + * + * @author yangyunjiao + */ +public class FontCacheDemo { + static void listSystemFont() { + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + + System.out.println("可用的字体系列:"); + String[] fontFamilies = ge.getAvailableFontFamilyNames(); + for (int i = 0; i < 300 && i < fontFamilies.length; i++) { // 只打印前10个 + System.out.println(" - " + fontFamilies[i]); + } + System.out.println("... (总共: " + fontFamilies.length + " 种)"); + + } + + static class FontSelector extends JFrame { + private JComboBox fontComboBox; + private JList sizeList; + private JCheckBox boldCheckBox, italicCheckBox; + private JTextArea previewTextArea; + private JLabel previewLabel; + + public FontSelector() { + listSystemFont(); + + setTitle("字体选择器"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(600, 500); + setLocationRelativeTo(null); + + initUI(); + + setVisible(true); + } + + private void initUI() { + // 主面板 + JPanel mainPanel = new JPanel(new BorderLayout(10, 10)); + mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + + // 控制面板 + JPanel controlPanel = new JPanel(new GridLayout(2, 1, 5, 5)); + + // 字体选择面板 + JPanel fontPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + fontPanel.setBorder(BorderFactory.createTitledBorder("选择字体")); + + // 获取系统可用字体 + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + String[] fontNames = Arrays.stream(FontNameEnum.values()).map(FontNameEnum::getName).toArray(String[]::new); + + + fontComboBox = new JComboBox<>(fontNames); + fontComboBox.setSelectedIndex(0); + fontComboBox.addActionListener(e -> updateFont()); + + fontPanel.add(new JLabel("字体:")); + fontPanel.add(fontComboBox); + + // 大小和样式面板 + JPanel sizeStylePanel = new JPanel(new GridLayout(1, 2, 10, 5)); + + // 字体大小 + JPanel sizePanel = new JPanel(new BorderLayout()); + sizePanel.setBorder(BorderFactory.createTitledBorder("选择大小")); + + Integer[] sizes = {8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72}; + sizeList = new JList<>(sizes); + sizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + sizeList.setSelectedValue(16, true); + sizeList.addListSelectionListener(e -> updateFont()); + + JScrollPane sizeScrollPane = new JScrollPane(sizeList); + sizeScrollPane.setPreferredSize(new Dimension(100, 100)); + sizePanel.add(sizeScrollPane, BorderLayout.CENTER); + + // 字体样式 + JPanel stylePanel = new JPanel(new GridLayout(2, 1, 5, 5)); + stylePanel.setBorder(BorderFactory.createTitledBorder("选择样式")); + + boldCheckBox = new JCheckBox("粗体"); + boldCheckBox.addActionListener(e -> updateFont()); + + italicCheckBox = new JCheckBox("斜体"); + italicCheckBox.addActionListener(e -> updateFont()); + + stylePanel.add(boldCheckBox); + stylePanel.add(italicCheckBox); + + sizeStylePanel.add(sizePanel); + sizeStylePanel.add(stylePanel); + + controlPanel.add(fontPanel); + controlPanel.add(sizeStylePanel); + + // 预览面板 + JPanel previewPanel = new JPanel(new BorderLayout(5, 5)); + previewPanel.setBorder(BorderFactory.createTitledBorder("预览")); + + previewTextArea = new JTextArea("这是一段示例文本,用于展示字体效果。\n" + + "The quick brown fox jumps over the lazy dog.\n" + + "1234567890"); + previewTextArea.setLineWrap(true); + previewTextArea.setWrapStyleWord(true); + + previewLabel = new JLabel("字体预览: ABCabc 123"); + previewLabel.setHorizontalAlignment(SwingConstants.CENTER); + + JTabbedPane previewTabbedPane = new JTabbedPane(); + previewTabbedPane.addTab("文本区域", new JScrollPane(previewTextArea)); + previewTabbedPane.addTab("标签", previewLabel); + + previewPanel.add(previewTabbedPane, BorderLayout.CENTER); + + // 添加到主面板 + mainPanel.add(controlPanel, BorderLayout.NORTH); + mainPanel.add(previewPanel, BorderLayout.CENTER); + + add(mainPanel); + + // 初始化字体 + updateFont(); + } + + private void updateFont() { + String fontName = (String) fontComboBox.getSelectedItem(); + int fontSize = sizeList.getSelectedValue(); + int fontStyle = Font.PLAIN; + + if (boldCheckBox.isSelected()) { + fontStyle |= Font.BOLD; + } + if (italicCheckBox.isSelected()) { + fontStyle |= Font.ITALIC; + } + + Font selectedFont = FontCache.getInstance().getFont(fontName, fontStyle, fontSize); + + previewTextArea.setFont(selectedFont); + previewLabel.setFont(selectedFont); + } + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> new FontSelector().setVisible(true)); + } + +} diff --git a/extensions/extension-id/src/main/java/yunjiao/springboot/extension/id/IdUtils.java b/extensions/extension-id/src/main/java/yunjiao/springboot/extension/id/IdUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..825d18d7d007e1abf42da820f7e90b5cdba53ded --- /dev/null +++ b/extensions/extension-id/src/main/java/yunjiao/springboot/extension/id/IdUtils.java @@ -0,0 +1,101 @@ +package yunjiao.springboot.extension.id; + +import cn.hutool.core.lang.Snowflake; +import cn.hutool.extra.spring.SpringUtil; +import yunjiao.springboot.extension.id.uidgenerator.UidGeneratorCached; +import yunjiao.springboot.extension.id.uidgenerator.UidGeneratorDefault; + +/** + * ID 工具, 使用静态方法获取Spring容器中的ID生成器 + * + * @author yangyunjiao + */ +public final class IdUtils { + /** + * 实例 + */ + private static Snowflake snowflake; + + /** + * 实例 + */ + private static UidGeneratorCached uidGeneratorCached; + + /** + * 实例 + */ + private static UidGeneratorDefault uidGeneratorDefault; + + /** + * 构造器 + */ + private IdUtils() { + } + + /** + * 从Spring容器中获取 + */ + private static synchronized void initSnowflake() { + if (snowflake == null) { + snowflake = SpringUtil.getBean(Snowflake.class); + } + } + + /** + * 从Spring容器中获取 + */ + private static synchronized void initUidGeneratorCached() { + if (uidGeneratorCached == null) { + uidGeneratorCached = SpringUtil.getBean(UidGeneratorCached.class); + } + } + + /** + * 从Spring容器中获取 + */ + private static synchronized void initUidGeneratorDefault() { + if (uidGeneratorDefault == null) { + uidGeneratorDefault = SpringUtil.getBean(UidGeneratorDefault.class); + } + } + + /** + * 获取 + * + * @return 实例 + */ + public static Snowflake getSnowflake() { + if (snowflake == null) { + initSnowflake(); + } + + return snowflake; + } + + /** + * 获取 + * + * @return 实例 + */ + public static UidGeneratorCached getUidGeneratorCached() { + if (uidGeneratorCached == null) { + initUidGeneratorCached(); + } + + return uidGeneratorCached; + } + + /** + * 获取 + * + * @return 实例 + */ + public static UidGeneratorDefault getUidGeneratorDefault() { + if (uidGeneratorDefault == null) { + initUidGeneratorDefault(); + } + + return uidGeneratorDefault; + } + +} diff --git a/extensions/extension-id/src/main/java/yunjiao/springboot/extension/id/uidgenerator/EnvironmentWorkerIdAssigner.java b/extensions/extension-id/src/main/java/yunjiao/springboot/extension/id/uidgenerator/EnvironmentWorkerIdAssigner.java index bccd73f6952a92612050be0a82e711b4e52a4f88..4b47ca06916256c5e2e74ba4d3b3ed657acd658c 100644 --- a/extensions/extension-id/src/main/java/yunjiao/springboot/extension/id/uidgenerator/EnvironmentWorkerIdAssigner.java +++ b/extensions/extension-id/src/main/java/yunjiao/springboot/extension/id/uidgenerator/EnvironmentWorkerIdAssigner.java @@ -18,7 +18,7 @@ public record EnvironmentWorkerIdAssigner(Environment env) implements WorkerIdAs long workerId = Utils.convertEnv(env, CommonConsts.ENV_SNOWFLAKE_WORKER_ID, Long.class, 1L); if (workerId == 1L) { - log.warn("Uid-Generator 框架雪花算法配置使用默认参数。如需支持分布式,请设置系统环境变量:{}", CommonConsts.ENV_SNOWFLAKE_WORKER_ID); + log.warn("Uid-Generator 框架雪花算法配置使用默认参数。如需支持分布式,请设置系统环境变量:'{}'", CommonConsts.ENV_SNOWFLAKE_WORKER_ID); } return workerId; } diff --git a/extensions/extension-querydsl/pom.xml b/extensions/extension-querydsl/pom.xml index 9f3a8f8e79234ee9508f6fea1a2a7f0d4c74e9da..35cf7607cee16069f91a7ec21de6879dac014cca 100644 --- a/extensions/extension-querydsl/pom.xml +++ b/extensions/extension-querydsl/pom.xml @@ -15,6 +15,11 @@ QueryDSL 扩展 + + io.gitee.yunjiao-source.spring-boot + extension-common + + org.springframework.data spring-data-commons diff --git a/extensions/extension-tika/pom.xml b/extensions/extension-tika/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..57aafda5f89b43f3b9f707ef2acd0b120f53e445 --- /dev/null +++ b/extensions/extension-tika/pom.xml @@ -0,0 +1,28 @@ + + + + io.gitee.yunjiao-source.spring-boot + extensions + ${revision} + + 4.0.0 + + extension-tika + jar + Extension :: Tika + Tika扩展 + + + + io.gitee.yunjiao-source.spring-boot + extension-common + + + org.apache.tika + tika-core + + + + \ No newline at end of file diff --git a/extensions/extension-tika/src/main/java/yunjiao/springboot/extension/tika/_TIKA.java b/extensions/extension-tika/src/main/java/yunjiao/springboot/extension/tika/_TIKA.java new file mode 100644 index 0000000000000000000000000000000000000000..c4da9bc0c38636164de90abd429b6f241959fd6d --- /dev/null +++ b/extensions/extension-tika/src/main/java/yunjiao/springboot/extension/tika/_TIKA.java @@ -0,0 +1,9 @@ +package yunjiao.springboot.extension.tika; + +/** + * _TIKA + * + * @author yangyunjiao + */ +public class _TIKA { +} diff --git a/extensions/extension-tika/src/main/java/yunjiao/springboot/extension/tika/core/DefaultHandlerBuilder.java b/extensions/extension-tika/src/main/java/yunjiao/springboot/extension/tika/core/DefaultHandlerBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..4a865516b4b7c67521bb44f9a36929773dcebf41 --- /dev/null +++ b/extensions/extension-tika/src/main/java/yunjiao/springboot/extension/tika/core/DefaultHandlerBuilder.java @@ -0,0 +1,492 @@ +package yunjiao.springboot.extension.tika.core; + +import lombok.Setter; +import lombok.SneakyThrows; +import lombok.experimental.Accessors; +import org.apache.tika.io.TikaInputStream; +import org.apache.tika.metadata.Metadata; +import org.apache.tika.metadata.filter.MetadataFilter; +import org.apache.tika.sax.*; +import org.xml.sax.ContentHandler; +import org.xml.sax.helpers.DefaultHandler; + +import java.io.OutputStream; +import java.io.Writer; +import java.util.Optional; + +/** + * {@link DefaultHandler} 子类建造器 + * + * @author yangyunjiao + */ +public interface DefaultHandlerBuilder { + /** + * 构建实例 + * + * @return 实例 + */ + T build(); + + /** + * {@link BodyContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class BodyBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + private Writer writer; + + private Integer writeLimit; + + @Override + public BodyContentHandler build() { + if (handler != null) { + return new BodyContentHandler(handler); + } + + if (writer != null) { + return new BodyContentHandler(writer); + } + + if (writeLimit != null) { + return new BodyContentHandler(writeLimit); + } + + return new BodyContentHandler(); + } + } + + /** + * {@link LinkContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class LinkBuilder implements DefaultHandlerBuilder { + private Boolean collapseWhitespaceInAnchor; + + @Override + public LinkContentHandler build() { + if (collapseWhitespaceInAnchor != null) { + return new LinkContentHandler(collapseWhitespaceInAnchor); + } + + return new LinkContentHandler(); + } + } + + /** + * {@link TeeContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class TeeBuilder implements DefaultHandlerBuilder { + private ContentHandler[] handlers; + + @Override + public TeeContentHandler build() { + assert handlers != null; + + return new TeeContentHandler(handlers); + } + } + + /** + * {@link DIFContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class DIFBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + private Metadata metadata; + + @Override + public DIFContentHandler build() { + assert handler != null; + assert metadata != null; + + return new DIFContentHandler(handler, metadata); + } + } + + /** + * {@link EmbeddedContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class EmbeddedBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + @Override + public EmbeddedContentHandler build() { + assert handler != null; + + return new EmbeddedContentHandler(handler); + } + } + + /** + * {@link EndDocumentShieldingContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class EndDocumentShieldingBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + @Override + public EndDocumentShieldingContentHandler build() { + assert handler != null; + + return new EndDocumentShieldingContentHandler(handler); + } + } + + /** + * {@link ExpandedTitleContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class ExpandedTitleBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + @Override + public ExpandedTitleContentHandler build() { + if (handler != null) { + return new ExpandedTitleContentHandler(handler); + } + + return new ExpandedTitleContentHandler(); + } + } + + /** + * {@link OfflineContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class OfflineBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + @Override + public OfflineContentHandler build() { + assert handler != null; + + return new OfflineContentHandler(handler); + } + } + + /** + * {@link PhoneExtractingContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class PhoneExtractingBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + private Metadata metadata; + + @Override + public PhoneExtractingContentHandler build() { + if (handler == null) { + handler = new DefaultHandler(); + } + if (metadata == null) { + metadata = new Metadata(); + } + + return new PhoneExtractingContentHandler(handler, metadata); + } + } + + /** + * {@link RecursiveParserWrapperHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class RecursiveParserWrapperBuilder implements DefaultHandlerBuilder { + private ContentHandlerFactory contentHandlerFactory; + + private Integer maxEmbeddedResources; + + private MetadataFilter metadataFilter; + + @Override + public RecursiveParserWrapperHandler build() { + assert contentHandlerFactory != null; + + if (maxEmbeddedResources != null && metadataFilter != null ) { + return new RecursiveParserWrapperHandler(contentHandlerFactory, maxEmbeddedResources, metadataFilter); + } + + if (maxEmbeddedResources != null) { + return new RecursiveParserWrapperHandler(contentHandlerFactory, maxEmbeddedResources); + } + + return new RecursiveParserWrapperHandler(contentHandlerFactory); + } + } + + /** + * {@link RichTextContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class RichTextBuilder implements DefaultHandlerBuilder { + private Writer writer; + + @Override + public RichTextContentHandler build() { + assert writer != null; + + return new RichTextContentHandler(writer); + } + } + + /** + * {@link SafeContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class SafeBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + @Override + public SafeContentHandler build() { + assert handler != null; + + return new SafeContentHandler(handler); + } + } + + /** + * {@link SecureContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class SecureBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + private TikaInputStream stream; + + private Long threshold; + + private Long ratio; + + private Integer maxDepth; + + private Integer maxPackageEntryDepth; + + @Override + public SecureContentHandler build() { + assert handler != null; + assert stream != null; + + SecureContentHandler result = new SecureContentHandler(handler, stream); + Optional.ofNullable(threshold).ifPresent(result::setOutputThreshold); + Optional.ofNullable(ratio).ifPresent(result::setMaximumCompressionRatio); + Optional.ofNullable(maxDepth).ifPresent(result::setMaximumDepth); + Optional.ofNullable(maxPackageEntryDepth).ifPresent(result::setMaximumPackageEntryDepth); + return result; + } + } + + /** + * {@link StandardsExtractingContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class StandardsExtractingBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + private Metadata metadata; + + private Double threshold; + + private Integer maxBufferLength; + + @Override + public StandardsExtractingContentHandler build() { + if (handler == null) { + handler = new DefaultHandler(); + } + if (metadata == null) { + metadata = new Metadata(); + } + + StandardsExtractingContentHandler result = new StandardsExtractingContentHandler(handler, metadata); + Optional.ofNullable(threshold).ifPresent(result::setThreshold); + Optional.ofNullable(maxBufferLength).ifPresent(result::setMaxBufferLength); + return result; + } + } + + /** + * {@link TaggedContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class TaggedBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + @Override + public TaggedContentHandler build() { + assert handler != null; + + return new TaggedContentHandler(handler); + } + } + + /** + * {@link TextContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class TextBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + private Boolean addSpaceBetweenElements; + + @Override + public TextContentHandler build() { + assert handler != null; + + return new TextContentHandler(handler, + Optional.ofNullable(addSpaceBetweenElements).orElse(false)); + } + } + + /** + * {@link ToHTMLContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class ToHTMLBuilder implements DefaultHandlerBuilder { + private OutputStream stream; + + private String encoding; + + @Override + @SneakyThrows + public ToHTMLContentHandler build() { + if (stream != null && encoding != null) { + return new ToHTMLContentHandler(stream, encoding); + } + + return new ToHTMLContentHandler(); + } + } + + /** + * {@link ToTextContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class ToTextBuilder implements DefaultHandlerBuilder { + private Writer writer; + + private OutputStream stream; + + private String encoding; + + @Override + @SneakyThrows + public ToTextContentHandler build() { + if (writer != null) { + return new ToTextContentHandler(writer); + } + + if (stream != null && encoding != null) { + return new ToTextContentHandler(stream, encoding); + } + + return new ToTextContentHandler(); + } + } + + /** + * {@link ToXMLContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class ToXMLBuilder implements DefaultHandlerBuilder { + private OutputStream stream; + + private String encoding; + + @Override + @SneakyThrows + public ToXMLContentHandler build() { + if (stream != null && encoding != null) { + return new ToXMLContentHandler(stream, encoding); + } + + return new ToXMLContentHandler(); + } + } + + /** + * {@link WriteOutContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class WriteOutBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + private Integer writeLimit; + + private Writer writer; + + @Override + public WriteOutContentHandler build() { + if (handler != null && writeLimit != null) { + return new WriteOutContentHandler(handler, writeLimit); + } + + if (writer != null && writeLimit != null) { + return new WriteOutContentHandler(writer, writeLimit); + } + + if (writeLimit != null) { + return new WriteOutContentHandler(writeLimit); + } + + return new WriteOutContentHandler(); + } + } + + /** + * {@link XHTMLContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class XHTMLBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + private Metadata metadata; + + @Override + public XHTMLContentHandler build() { + assert handler != null; + assert metadata != null; + + return new XHTMLContentHandler(handler, metadata); + } + } + + /** + * {@link XMPContentHandler} 建造器 + */ + @Setter + @Accessors(chain = true, fluent = true) + class XMPBuilder implements DefaultHandlerBuilder { + private ContentHandler handler; + + @Override + public XMPContentHandler build() { + assert handler != null; + + return new XMPContentHandler(handler); + } + } +} diff --git a/extensions/extension-tika/src/main/java/yunjiao/springboot/extension/tika/core/DefaultHandlerType.java b/extensions/extension-tika/src/main/java/yunjiao/springboot/extension/tika/core/DefaultHandlerType.java new file mode 100644 index 0000000000000000000000000000000000000000..393c962f967abe6465bc6c0e74f6ce4c743eb64c --- /dev/null +++ b/extensions/extension-tika/src/main/java/yunjiao/springboot/extension/tika/core/DefaultHandlerType.java @@ -0,0 +1,79 @@ +package yunjiao.springboot.extension.tika.core; + +import lombok.Getter; +import org.apache.tika.sax.*; +import org.xml.sax.ContentHandler; +import org.xml.sax.helpers.DefaultHandler; + +/** + * {@link DefaultHandler} 子类类型(有无参数构造器的) + * + * @author yangyunjiao + */ +@Getter +public enum DefaultHandlerType { + /** + * {@link BodyContentHandler} 类型实例构建 + */ + body(new DefaultHandlerBuilder.BodyBuilder()), + + /** + * {@link LinkContentHandler} 类型实例构建 + */ + link(new DefaultHandlerBuilder.LinkBuilder()), + + /** + * {@link BodyContentHandler} 类型实例构建 + */ + tee(new DefaultHandlerBuilder.TeeBuilder()), + + /** + * {@link TeeContentHandler} 类型实例构建 + */ + expandedTitle(new DefaultHandlerBuilder.ExpandedTitleBuilder()), + + /** + * {@link PhoneExtractingContentHandler} 类型实例构建 + */ + phoneExtracting(new DefaultHandlerBuilder.PhoneExtractingBuilder()), + + /** + * {@link StandardsExtractingContentHandler} 类型实例构建 + */ + standardsExtracting(new DefaultHandlerBuilder.StandardsExtractingBuilder()), + + /** + * {@link ToHTMLContentHandler} 类型实例构建 + */ + toHTML(new DefaultHandlerBuilder.ToHTMLBuilder()), + + /** + * {@link ToTextContentHandler} 类型实例构建 + */ + toText(new DefaultHandlerBuilder.ToTextBuilder()), + + /** + * {@link ToXMLContentHandler} 类型实例构建 + */ + toXML(new DefaultHandlerBuilder.ToXMLBuilder()), + + /** + * {@link WriteOutContentHandler} 类型实例构建 + */ + writeOutBuilder(new DefaultHandlerBuilder.WriteOutBuilder()); + + private final DefaultHandlerBuilder builder; + + DefaultHandlerType(DefaultHandlerBuilder builder) { + this.builder = builder; + } + + /** + * 创建 + * + * @return 实例 + */ + public ContentHandler create() { + return builder.build(); + } +} diff --git a/extensions/extension-tika/src/test/java/yunjiao/springboot/extension/tika/core/DefaultHandlerTypeTest.java b/extensions/extension-tika/src/test/java/yunjiao/springboot/extension/tika/core/DefaultHandlerTypeTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0ff9636e90444a284c654b6d676d8e31445ca32b --- /dev/null +++ b/extensions/extension-tika/src/test/java/yunjiao/springboot/extension/tika/core/DefaultHandlerTypeTest.java @@ -0,0 +1,21 @@ +package yunjiao.springboot.extension.tika.core; + +import org.apache.tika.sax.BodyContentHandler; +import org.apache.tika.sax.LinkContentHandler; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * {@link DefaultHandlerType} 单元测试用例 + * + * @author yangyunjiao + */ +public class DefaultHandlerTypeTest { + + @Test + void whenCreate_thenOK() { + assertThat(DefaultHandlerType.body.create()).isInstanceOf(BodyContentHandler.class); + assertThat(DefaultHandlerType.link.create()).isInstanceOf(LinkContentHandler.class); + } +} diff --git a/extensions/pom.xml b/extensions/pom.xml index 2aef7492eaf92cc1a40fa68cfceebff8a5de2348..001434e4dbbe22d2483967b96cbd4cf18053f067 100644 --- a/extensions/pom.xml +++ b/extensions/pom.xml @@ -21,6 +21,7 @@ extension-querydsl extension-captcha extension-id + extension-tika diff --git a/pom.xml b/pom.xml index a700e742ca5fb92707fae8ed674f9405ec1282a2..a074d417895a8b0054c17f21f40e6475cdca52c4 100644 --- a/pom.xml +++ b/pom.xml @@ -114,7 +114,7 @@ html - docs + docs/adoc docs/build/html @@ -126,7 +126,7 @@ pdf - docs + docs/adoc docs/build/pdf diff --git a/projects/rest-query-language/pom.xml b/projects/rest-query-language/pom.xml index 2e76c3af7dd5e49641ad4db5eadd8ea57062eb9f..164fdeb72b1ed1ff6c77dd1a39b5ae4233ff9f34 100644 --- a/projects/rest-query-language/pom.xml +++ b/projects/rest-query-language/pom.xml @@ -30,6 +30,17 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-undertow diff --git a/starters/pom.xml b/starters/pom.xml index c488c8777b51a3879f0189ad1918d7e7c8843a2b..4401ddc4a3544f8761773028147b1b1da29068b7 100644 --- a/starters/pom.xml +++ b/starters/pom.xml @@ -22,6 +22,7 @@ starter-apijson-fastjson2 starter-apijson-gson starter-captcha + starter-tika diff --git a/starters/starter-tika/pom.xml b/starters/starter-tika/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..470f9c7c485dd7f3e1f8d0183adef92e334080a4 --- /dev/null +++ b/starters/starter-tika/pom.xml @@ -0,0 +1,33 @@ + + + + io.gitee.yunjiao-source.spring-boot + starters + ${revision} + + 4.0.0 + + starter-tika + jar + Starter :: Tika + Tika 启动器 + + + + io.gitee.yunjiao-source.spring-boot + autoconfigure + + + io.gitee.yunjiao-source.spring-boot + extension-tika + + + + org.apache.tika + tika-parsers-standard-package + + + + \ No newline at end of file