diff --git a/README.md b/README.md index a41cb5dc47279cd04e1e627a2bfa64e85df25925..99395aa76938e3c99be8647798d2f930bfda8988 100644 --- a/README.md +++ b/README.md @@ -4,25 +4,57 @@ license release commit - stars


### 🎁简介 -🔥🔥🔥dorive是一个轻量化、渐进式开发框架,帮助开发者,快速落地领域驱动式项目。 +🔥🔥🔥dorive是一个轻量化、渐进式、领域驱动式开发框架,帮助开发者,开发**可持续演进的复杂应用**。 dorive = domain + driven 或 do + driven ,是原公司项目沉淀后的开源库。 “do”表明了一种态度,只有付诸行动,才能有所收获。 -### 📚3M架构 +### 🧱领域驱动 -领域驱动设计的核心是高内聚、低耦合。为了实现它,现代应用架构正朝着微服务化、模块化、模型化方向发展。 +领域驱动是一种软件开发方式。 -3M架构 = Microservices + Module + Model +解决痛点: -### 📦模块化 +- **腐化**(代码组织混乱,逻辑互相渗透) +- **僵化**(直接依赖过多,修改困难) + +实施方法: + +- 通过**业务划界**,理清业务之间的关系。 +- 通过**业务建模**,表达真实的业务逻辑。 + +核心: + +- **高内聚** +- **低耦合** + +### 🏗️架构实现 + +领域驱动的几种架构实现方式: + +- 分层架构(Layered Architecture) +- 六边形架构(Hexagonal Architecture) +- 清洁架构(Clean Architecture) +- 事件驱动架构(Event-Driven Architecture, EDA) +- CQRS(命令查询职责分离) +- 微服务架构(Microservices + DDD) + +- **3M架构(Microservices + Module + Model)** + +### 3️⃣3M架构 + +一种新的架构实现。在分层架构、微服务架构的基础上,提出将项目**模块化、模型化**,从而达到业务自由组合,灵活定制的效果。 + +- 逻辑架构图:[logic.png](https://gitee.com/digital-engine/dorive/blob/3.5.2/doc/img/logic.png) +- 物理架构图:[physical.png](https://gitee.com/digital-engine/dorive/blob/3.5.2/doc/img/physical.png) + +### 📦模块化(module) 一个应用系统由一个或多个模块组成。 @@ -36,7 +68,7 @@ dorive = domain + driven 或 do + driven ,是原公司项目沉淀后的开源 - 模块可选择向外暴露的bean。 - 模块之间不直接依赖,可通过接口与事件进行交互。 -### 🛠️模型化 +### 🛠️模型化(model) 同个领域内的多个模块共享一个边界上下文。 @@ -66,28 +98,44 @@ dorive开发框架实现了模块化、模型化的全部特性,你可以有 - 持续演进,技术负债低。 - 代码生成,开发快。 -### 💬使用建议 +### 🚅快速开始 -基础依赖说明: - -| 依赖库 | 版本 | 说明 | -| ------------------------- | ------ | ------------------- | -| spring-boot-starter-web | 2.7.18 | spring boot web集成 | -| spring-tx | 5.3.31 | spring事务管理 | -| hutool-all | 5.8.25 | 工具库 | -| mybatis-plus-boot-starter | 3.5.7 | 数据库框架 | - -如果是新项目,你将毫无负担地使用它: +Maven引入: ```xml com.gitee.digital-engine dorive-spring-boot-starter - 3.5.1 + 3.5.2 ``` -如果是存量项目,你还需要考虑兼容性: +### 💡项目案例 + +项目地址:[dorive-example](https://gitee.com/digital-engine/dorive-example) + +### 📝说明文档 + +文档地址:[Gitee wiki](https://gitee.com/digital-engine/dorive/wikis/pages) + +### 🌿版本说明 + +例如:3.5.1(格式A.B.C) + +- A-架构版本:架构重构时增加,不保证兼容性。 +- B-特性版本:新特性引入时增加。 +- C-迭代版本:功能优化、bug修复时增加。 + +### 💬依赖项 + +| 依赖库 | 版本 | 说明 | +| ------------------------- | ------ | ------------------- | +| spring-boot-starter-web | 2.7.18 | spring boot web集成 | +| spring-tx | 5.3.31 | spring事务管理 | +| hutool-all | 5.8.25 | 工具库 | +| mybatis-plus-boot-starter | 3.5.7 | 数据库框架 | + +### 🤝兼容性 | 模块 | 说明 | 模块 | 适配Spring Boot版本 | | -------------------------- | ---------------- | ------ | ------------------- | @@ -104,25 +152,11 @@ dorive开发框架实现了模块化、模型化的全部特性,你可以有 | dorive-autoconfigure | 自动配置实现 | | | | dorive-spring-boot-starter | 启动器 | | | -### 🌿分支版本说明 - -例如:3.5.1(格式A.B.C) - -- A-架构版本:架构重构时增加,不保证兼容性。 -- B-特性版本:新特性引入时增加。 -- C-迭代版本:功能优化、bug修复时增加。 - -### 📝文档 - -wiki地址: - -- [Gitee wiki](https://gitee.com/digital-engine/dorive/wikis/pages) - ### 🐞bug反馈与建议 提交问题反馈请说明正在使用的JDK版本、dorive版本,以及依赖库版本。 -- [Gitee issue](https://gitee.com/digital-engine/dorive/issues) +页面地址:[Gitee issue](https://gitee.com/digital-engine/dorive/issues) ### 🙏🏻特别感谢 diff --git a/doc/img/physical.png b/doc/img/physical.png index d43c96b57af9cd8bb23877d3e064ab3b637af66c..4c2240ee0b65e501dbc4778b8d87065905aa4daa 100644 Binary files a/doc/img/physical.png and b/doc/img/physical.png differ diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index 8a4a7517922bfdf59fa941bd7258c5a502f602a6..ed5c73c13cac2684652b64e22681bdb38f08159f 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.1 + 3.5.2 dorive-api @@ -14,10 +14,6 @@ org.springframework.boot spring-boot-starter - - org.projectlombok - lombok - org.apache.commons commons-lang3 diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Order.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/OrderBy.java similarity index 93% rename from dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Order.java rename to dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/OrderBy.java index 3f882063a60bad14ad95c1f56265421c00794b9b..957efc3e918acb586469fc7221d380089ceb2882 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Order.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/OrderBy.java @@ -31,17 +31,17 @@ import java.lang.annotation.Target; @Documented @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) -public @interface Order { +public @interface OrderBy { /** * 排序字段 */ - String sortBy() default ""; + String field() default ""; /** * 排序方式 */ - String order() default ""; + String sort() default ""; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/api/BoundedContextAware.java b/dorive-api/src/main/java/com/gitee/dorive/api/api/common/BoundedContextAware.java similarity index 90% rename from dorive-api/src/main/java/com/gitee/dorive/api/api/BoundedContextAware.java rename to dorive-api/src/main/java/com/gitee/dorive/api/api/common/BoundedContextAware.java index 0433a048e1060050a2c792cc91a5f6490aa5e6e1..e985c176d3330119f73c5ed2e6b368552bcaf14f 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/api/BoundedContextAware.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/api/common/BoundedContextAware.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.api.api; +package com.gitee.dorive.api.api.common; -import com.gitee.dorive.api.entity.BoundedContext; +import com.gitee.dorive.api.entity.common.BoundedContext; public interface BoundedContextAware { diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/constant/core/Order.java b/dorive-api/src/main/java/com/gitee/dorive/api/constant/core/Sort.java similarity index 97% rename from dorive-api/src/main/java/com/gitee/dorive/api/constant/core/Order.java rename to dorive-api/src/main/java/com/gitee/dorive/api/constant/core/Sort.java index 3c47a6d3103e1125cda6b65c0dd3c749abd73732..5eac131e903078a34ac8c97e6682cd48f86e11d0 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/constant/core/Order.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/constant/core/Sort.java @@ -17,7 +17,7 @@ package com.gitee.dorive.api.constant.core; -public interface Order { +public interface Sort { String ASC = "ASC"; String DESC = "DESC"; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/BoundedContext.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/common/BoundedContext.java similarity index 90% rename from dorive-api/src/main/java/com/gitee/dorive/api/entity/BoundedContext.java rename to dorive-api/src/main/java/com/gitee/dorive/api/entity/common/BoundedContext.java index d770c46d60c09fe1f982da7a93c0409f9576b1e5..7530e928036279b944e9beaf3cb8cee7ae08816e 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/BoundedContext.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/common/BoundedContext.java @@ -15,12 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.api.entity; - -import lombok.NoArgsConstructor; +package com.gitee.dorive.api.entity.common; import java.util.Properties; -@NoArgsConstructor public class BoundedContext extends Properties { } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/FieldEntityDefinition.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/FieldEntityDefinition.java index 6e23921e3bd4bf8dd6c526a4995b98baaddcf3d2..8a39182b43040d22ab90339c0073b506d6e27e39 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/FieldEntityDefinition.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/FieldEntityDefinition.java @@ -18,7 +18,7 @@ package com.gitee.dorive.api.entity.core; import com.gitee.dorive.api.entity.core.def.BindingDef; -import com.gitee.dorive.api.entity.core.def.OrderDef; +import com.gitee.dorive.api.entity.core.def.OrderByDef; import lombok.Data; import lombok.EqualsAndHashCode; @@ -29,7 +29,7 @@ import java.util.List; public class FieldEntityDefinition extends EntityDefinition { private Field field; private List bindingDefs; - private OrderDef orderDef; + private OrderByDef orderByDef; public java.lang.reflect.Field getJavaField() { return field != null ? field.getField() : null; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/OrderDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/OrderByDef.java similarity index 81% rename from dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/OrderDef.java rename to dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/OrderByDef.java index a52719b98d5e8c86c031659446a4383be5ee08bd..3ed9ff351ee9857e1afde6a6dd907b50df782b75 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/OrderDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/OrderByDef.java @@ -18,7 +18,7 @@ package com.gitee.dorive.api.entity.core.def; import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.api.annotation.core.Order; +import com.gitee.dorive.api.annotation.core.OrderBy; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -30,12 +30,12 @@ import java.util.Map; @Data @NoArgsConstructor @AllArgsConstructor -public class OrderDef { - private String sortBy; - private String order; +public class OrderByDef { + private String field; + private String sort; - public static OrderDef fromElement(AnnotatedElement element) { - Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, Order.class); - return attributes != null ? BeanUtil.copyProperties(attributes, OrderDef.class) : null; + public static OrderByDef fromElement(AnnotatedElement element) { + Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, OrderBy.class); + return attributes != null ? BeanUtil.copyProperties(attributes, OrderByDef.class) : null; } } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityDefinitionResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityDefinitionResolver.java index 1a8cbe698f2bce6fd6d09e7d5cbf25cd11b4a93e..4025ddc6f7b98637af81a099742a0e323bc44f79 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityDefinitionResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityDefinitionResolver.java @@ -163,7 +163,7 @@ public class EntityDefinitionResolver { FieldEntityDefinition fieldEntityDefinition = BeanUtil.copyProperties(entityDefinition, FieldEntityDefinition.class); fieldEntityDefinition.setField(myField); fieldEntityDefinition.setBindingDefs(BindingDef.fromElement(field)); - fieldEntityDefinition.setOrderDef(OrderDef.fromElement(field)); + fieldEntityDefinition.setOrderByDef(OrderByDef.fromElement(field)); EntityDef entityDef = fieldEntityDefinition.getEntityDef(); EntityDef newEntityDef = BeanUtil.copyProperties(entityDef, EntityDef.class); diff --git a/dorive-autoconfigure/pom.xml b/dorive-autoconfigure/pom.xml index 817b07c5de1e39956aa106eb367ac5be5b89493f..e0d4462b5b0bb033cb3c60807b0803351ec66283 100644 --- a/dorive-autoconfigure/pom.xml +++ b/dorive-autoconfigure/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.1 + 3.5.2 dorive-autoconfigure diff --git a/dorive-autoconfigure/src/main/java/com/gitee/dorive/autoconfigure/web/DoriveWebConfiguration.java b/dorive-autoconfigure/src/main/java/com/gitee/dorive/autoconfigure/web/DoriveWebConfiguration.java index a99703209ee51bb2e6ad4688756adf5b49a4d3f5..1d51bcae7e5f045859dba5ca46290ab8cc739a59 100644 --- a/dorive-autoconfigure/src/main/java/com/gitee/dorive/autoconfigure/web/DoriveWebConfiguration.java +++ b/dorive-autoconfigure/src/main/java/com/gitee/dorive/autoconfigure/web/DoriveWebConfiguration.java @@ -18,6 +18,7 @@ package com.gitee.dorive.autoconfigure.web; import com.gitee.dorive.web.impl.advice.ParameterControllerAdvice; +import com.gitee.dorive.web.impl.banner.BannerPrinter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; @@ -31,4 +32,9 @@ public class DoriveWebConfiguration { return new ParameterControllerAdvice(); } + @Bean("bannerPrinterV3") + public static BannerPrinter bannerPrinter() { + return new BannerPrinter(); + } + } diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index 3e9dfaa152e75c539ca5ab0af7aa1d1630b54b02..c401baa54b1f4134e1ce7b6bbff571e801030904 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.1 + 3.5.2 dorive-core diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java index 736c75ac71139414cc7a36d91bebb3ca3ead1457..11345e925ca2c22dfaf67243192572b5c58a8a5d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.entity.executor; import com.gitee.dorive.api.constant.core.Operator; -import com.gitee.dorive.api.constant.core.Order; +import com.gitee.dorive.api.constant.core.Sort; import com.gitee.dorive.core.impl.util.StringUtils; import lombok.Data; import lombok.NoArgsConstructor; @@ -133,12 +133,12 @@ public class Example { } public Example orderByAsc(String... fields) { - orderBy = new OrderBy(Arrays.asList(fields), Order.ASC); + orderBy = new OrderBy(Arrays.asList(fields), Sort.ASC); return this; } public Example orderByDesc(String... fields) { - orderBy = new OrderBy(Arrays.asList(fields), Order.DESC); + orderBy = new OrderBy(Arrays.asList(fields), Sort.DESC); return this; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/OrderBy.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/OrderBy.java index 9c874e6dfea13198bf1b81864b74873a2813bedc..f4441599bcdc2ec46ca8271740ef2fb4b992b79e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/OrderBy.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/OrderBy.java @@ -28,11 +28,11 @@ import java.util.List; public class OrderBy { private List properties; - private String order; + private String sort; @Override public String toString() { - return "ORDER BY " + StrUtil.join(",", properties) + " " + order.toUpperCase(); + return "ORDER BY " + StrUtil.join(",", properties) + " " + sort.toUpperCase(); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java index 5367f246115df234bd2b36addeb404913c8c3d99..fd88667fbaa9d8b1f2fe28b917afbec468bc60ff 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java @@ -26,7 +26,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.factory.EntityAdapter; import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.api.factory.EntityMapper; -import com.gitee.dorive.api.entity.BoundedContext; +import com.gitee.dorive.api.entity.common.BoundedContext; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.enums.Domain; import com.gitee.dorive.core.entity.factory.FieldConverter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/AbstractContextRepository.java index 8ddee9c5074ac2e4cecbcb1c3c8111d38aed8113..a647e654a23ddbf2e89a727edaac0ec06b4b0332 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/repository/AbstractContextRepository.java @@ -19,12 +19,12 @@ package com.gitee.dorive.core.impl.repository; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; -import com.gitee.dorive.api.api.BoundedContextAware; -import com.gitee.dorive.api.constant.core.Order; +import com.gitee.dorive.api.api.common.BoundedContextAware; +import com.gitee.dorive.api.constant.core.Sort; import com.gitee.dorive.api.entity.core.EntityDefinition; import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.api.entity.core.def.EntityDef; -import com.gitee.dorive.api.entity.core.def.OrderDef; +import com.gitee.dorive.api.entity.core.def.OrderByDef; import com.gitee.dorive.api.entity.core.def.RepositoryDef; import com.gitee.dorive.api.impl.core.EntityDefinitionResolver; import com.gitee.dorive.api.impl.core.EntityElementResolver; @@ -36,7 +36,7 @@ import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.config.RepositoryContext; -import com.gitee.dorive.api.entity.BoundedContext; +import com.gitee.dorive.api.entity.common.BoundedContext; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.factory.FieldConverter; @@ -142,7 +142,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor resetEntityDef(entityElement); EntityDef entityDef = entityElement.getEntityDef(); - OrderDef orderDef = entityElement.getOrderDef(); + OrderByDef orderByDef = entityElement.getOrderByDef(); String accessPath = entityElement.getAccessPath(); OperationFactory operationFactory = new OperationFactory(entityElement); @@ -159,7 +159,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor boolean isAggregated = repository instanceof AbstractContextRepository; BinderResolver binderResolver = new BinderResolver(this); binderResolver.resolve(entityElement); - OrderBy defaultOrderBy = newDefaultOrderBy(orderDef); + OrderBy defaultOrderBy = newDefaultOrderBy(orderByDef); CommonRepository repositoryWrapper = new CommonRepository(); repositoryWrapper.setEntityElement(entityElement); @@ -249,15 +249,15 @@ public abstract class AbstractContextRepository extends AbstractRepositor return repository; } - private OrderBy newDefaultOrderBy(OrderDef orderDef) { - if (orderDef != null) { - String sortBy = orderDef.getSortBy(); - String order = orderDef.getOrder(); - if (StringUtils.isNotBlank(sortBy) && StringUtils.isNotBlank(order)) { - order = order.toUpperCase(); - if (Order.ASC.equals(order) || Order.DESC.equals(order)) { - List properties = StrUtil.splitTrim(sortBy, ","); - return new OrderBy(properties, order); + private OrderBy newDefaultOrderBy(OrderByDef orderByDef) { + if (orderByDef != null) { + String field = orderByDef.getField(); + String sort = orderByDef.getSort(); + if (StringUtils.isNotBlank(field) && StringUtils.isNotBlank(sort)) { + sort = sort.toUpperCase(); + if (Sort.ASC.equals(sort) || Sort.DESC.equals(sort)) { + List properties = StrUtil.splitTrim(field, ","); + return new OrderBy(properties, sort); } } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/util/ExampleUtils.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/util/ExampleUtils.java index a12a54698a92333a6517b6fa54823b10223a3f14..2d0000ae651176b2889ab308e1176864d5339bba 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/util/ExampleUtils.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/util/ExampleUtils.java @@ -70,7 +70,7 @@ public class ExampleUtils { } public static OrderBy clone(OrderBy orderBy) { - return new OrderBy(new ArrayList<>(orderBy.getProperties()), orderBy.getOrder()); + return new OrderBy(new ArrayList<>(orderBy.getProperties()), orderBy.getSort()); } public static Page clone(Page page) { diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index bbb0e760b653b3696b8a07d012748c8509cad0ef..12869573de5e7a5f11eda39b6ecbdb6831e361e1 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.1 + 3.5.2 dorive-event diff --git a/dorive-module/pom.xml b/dorive-module/pom.xml index 9f3b1b3acbe48fb39187fc0ccfceaf6ba5d6535b..2bddf35fa313cdec3c2cbcf5db9cb42893efaeb7 100644 --- a/dorive-module/pom.xml +++ b/dorive-module/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.1 + 3.5.2 dorive-module diff --git a/dorive-module/src/main/java/com/gitee/dorive/module/entity/ModuleDefinition.java b/dorive-module/src/main/java/com/gitee/dorive/module/entity/ModuleDefinition.java index 64266b5821783944e15b8e31d6124e3a07cf85ca..fa61c38e1c2a8cbb09bceba7973da5aeba06339d 100644 --- a/dorive-module/src/main/java/com/gitee/dorive/module/entity/ModuleDefinition.java +++ b/dorive-module/src/main/java/com/gitee/dorive/module/entity/ModuleDefinition.java @@ -21,6 +21,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.StrUtil; +import com.gitee.dorive.module.impl.util.NameUtils; import lombok.Data; import org.apache.commons.lang3.StringUtils; import org.springframework.core.io.Resource; @@ -37,6 +38,7 @@ import static com.gitee.dorive.module.impl.parser.AbstractModuleParser.PATH_MATC public class ModuleDefinition { private Resource resource; private String originId; + private String organization; private String project; private String domain; private String subdomain; @@ -62,6 +64,7 @@ public class ModuleDefinition { Attributes mainAttributes = manifest.getMainAttributes(); String originId = mainAttributes.getValue("Dorive-Origin-Id"); + String organization = mainAttributes.getValue("Dorive-Organization"); String project = mainAttributes.getValue("Dorive-Project"); String domain = mainAttributes.getValue("Dorive-Domain"); String subdomain = mainAttributes.getValue("Dorive-Subdomain"); @@ -82,6 +85,7 @@ public class ModuleDefinition { String requestPrefix = mainAttributes.getValue("Dorive-Request-Prefix"); this.originId = filterValue(originId); + this.organization = filterValue(organization); this.project = filterValue(project); this.domain = filterValue(domain); this.subdomain = filterValue(subdomain); @@ -123,7 +127,14 @@ public class ModuleDefinition { } public String getScanPackage() { - return project + ".**"; + List packages = new ArrayList<>(2); + if (StringUtils.isNotBlank(organization)) { + packages.add(NameUtils.toPackage(organization)); + } + if (StringUtils.isNotBlank(project)) { + packages.add(NameUtils.toPackage(project)); + } + return StrUtil.join(".", packages) + ".**"; } public boolean isExposed(Class clazz) { @@ -131,7 +142,7 @@ public class ModuleDefinition { return CollUtil.findOne(exports, export -> PATH_MATCHER.match(export, className)) != null; } - public String getDomainPackage() { + public String getDomainPath() { List packages = new ArrayList<>(2); if (StringUtils.isNotBlank(project)) { packages.add(project); @@ -143,18 +154,21 @@ public class ModuleDefinition { } public String getBasePackage() { - List packages = new ArrayList<>(4); + List packages = new ArrayList<>(5); + if (StringUtils.isNotBlank(organization)) { + packages.add(NameUtils.toPackage(organization)); + } if (StringUtils.isNotBlank(project)) { - packages.add(project); + packages.add(NameUtils.toPackage(project)); } if (StringUtils.isNotBlank(domain)) { - packages.add(domain); + packages.add(NameUtils.toPackage(domain)); } if (StringUtils.isNotBlank(subdomain)) { - packages.add(subdomain); + packages.add(NameUtils.toPackage(subdomain)); } if (StringUtils.isNotBlank(version)) { - packages.add(version); + packages.add(NameUtils.toPackage(version)); } return StrUtil.join(".", packages); } diff --git a/dorive-module/src/main/java/com/gitee/dorive/module/impl/filter/BoundedContextExposedBeanFilter.java b/dorive-module/src/main/java/com/gitee/dorive/module/impl/filter/BoundedContextExposedBeanFilter.java index 8c968db0498cdb92b246725a1252fc066e779409..c50f2534a2c4bbb1dce0cc03d3392e50e554d540 100644 --- a/dorive-module/src/main/java/com/gitee/dorive/module/impl/filter/BoundedContextExposedBeanFilter.java +++ b/dorive-module/src/main/java/com/gitee/dorive/module/impl/filter/BoundedContextExposedBeanFilter.java @@ -17,7 +17,7 @@ package com.gitee.dorive.module.impl.filter; -import com.gitee.dorive.api.entity.BoundedContext; +import com.gitee.dorive.api.entity.common.BoundedContext; import com.gitee.dorive.module.api.ExposedBeanFilter; import com.gitee.dorive.module.entity.ModuleBeanDescriptor; import com.gitee.dorive.module.entity.ModuleDefinition; @@ -32,8 +32,8 @@ public class BoundedContextExposedBeanFilter implements ExposedBeanFilter { Class declaredType = descriptor.getDeclaredType(); if (declaredType == BoundedContext.class && !exposedCandidates.isEmpty()) { ModuleDefinition moduleDefinition = beanDescriptor.getModuleDefinition(); - String domainPackage = moduleDefinition.getDomainPackage(); - String boundedContextName = domainPackage + ".boundedContext"; + String domainPath = moduleDefinition.getDomainPath(); + String boundedContextName = domainPath + ".boundedContext"; ModuleBeanDescriptor existModuleBeanDescriptor = exposedCandidates.get(boundedContextName); // 清空 exposedCandidates.clear(); diff --git a/dorive-module/src/main/java/com/gitee/dorive/module/impl/inject/BoundedContextBeanPostProcessor.java b/dorive-module/src/main/java/com/gitee/dorive/module/impl/inject/BoundedContextBeanPostProcessor.java index 275e390e543368ac45fc3c329ee60369ca8be5e5..f0a300f27050c54210511427dddd3201c6e0e9d9 100644 --- a/dorive-module/src/main/java/com/gitee/dorive/module/impl/inject/BoundedContextBeanPostProcessor.java +++ b/dorive-module/src/main/java/com/gitee/dorive/module/impl/inject/BoundedContextBeanPostProcessor.java @@ -17,8 +17,8 @@ package com.gitee.dorive.module.impl.inject; -import com.gitee.dorive.api.api.BoundedContextAware; -import com.gitee.dorive.api.entity.BoundedContext; +import com.gitee.dorive.api.api.common.BoundedContextAware; +import com.gitee.dorive.api.entity.common.BoundedContext; import com.gitee.dorive.module.api.ModuleParser; import com.gitee.dorive.module.entity.ModuleDefinition; import com.gitee.dorive.module.impl.parser.DefaultModuleParser; @@ -50,8 +50,8 @@ public class BoundedContextBeanPostProcessor implements BeanFactoryAware, BeanPo if (bean instanceof BoundedContextAware) { ModuleDefinition moduleDefinition = moduleParser.findModuleDefinition(userClass); if (moduleDefinition != null) { - String domainPackage = moduleDefinition.getDomainPackage(); - String boundedContextName = domainPackage + ".boundedContext"; + String domainPath = moduleDefinition.getDomainPath(); + String boundedContextName = domainPath + ".boundedContext"; if (beanFactory.containsBean(boundedContextName)) { BoundedContext boundedContext = beanFactory.getBean(boundedContextName, BoundedContext.class); ((BoundedContextAware) bean).setBoundedContext(boundedContext); diff --git a/dorive-module/src/main/java/com/gitee/dorive/module/impl/parser/AbstractModuleParser.java b/dorive-module/src/main/java/com/gitee/dorive/module/impl/parser/AbstractModuleParser.java index f14fb0dbf128d0fd6a519c874238a375593d4e4d..1c0d7ed54b594f4f509e80ef5156e714b4dd82bc 100644 --- a/dorive-module/src/main/java/com/gitee/dorive/module/impl/parser/AbstractModuleParser.java +++ b/dorive-module/src/main/java/com/gitee/dorive/module/impl/parser/AbstractModuleParser.java @@ -87,6 +87,13 @@ public abstract class AbstractModuleParser implements ModuleParser { ModuleDefinition moduleDefinition = new ModuleDefinition(resource, manifest); nameModuleDefinitionMap.put(moduleName, moduleDefinition); uriModuleDefinitionMap.put(uriForMatch, moduleDefinition); + // For test. + String uri = uriForMatch.toString(); + if (uri.endsWith("/target/classes/")) { + uri = StrUtil.removeSuffix(uri, "/target/classes/"); + uri = uri + "/target/test-classes/"; + uriModuleDefinitionMap.put(new URI(uri), moduleDefinition); + } List configs = moduleDefinition.getConfigs(); if (configs != null && !configs.isEmpty()) { for (String config : configs) { diff --git a/dorive-module/src/main/java/com/gitee/dorive/module/impl/util/NameUtils.java b/dorive-module/src/main/java/com/gitee/dorive/module/impl/util/NameUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..1cb1dd213817e395abd6b7e12dfa65a1f926d4bd --- /dev/null +++ b/dorive-module/src/main/java/com/gitee/dorive/module/impl/util/NameUtils.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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 com.gitee.dorive.module.impl.util; + +import cn.hutool.core.util.StrUtil; + +public class NameUtils { + + public static String toPackage(String name) { + name = StrUtil.replace(name, "-", "_"); + name = StrUtil.toUnderlineCase(name); + return name; + } + +} diff --git a/dorive-mybatis-plus/pom.xml b/dorive-mybatis-plus/pom.xml index abed11f1be972ca8dbcd726102423b1ad30764b3..4dca5421171e32d978b673f0b2e4ea773db145bf 100644 --- a/dorive-mybatis-plus/pom.xml +++ b/dorive-mybatis-plus/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.1 + 3.5.2 dorive-mybatis-plus diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/executor/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/executor/MybatisPlusExecutor.java index 2a4b195d28def170eb1c8467e838ce5c1b88e16d..a364dd43461e5af935805551844351455b48ca50 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/executor/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/executor/MybatisPlusExecutor.java @@ -23,7 +23,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.gitee.dorive.api.constant.core.Order; +import com.gitee.dorive.api.constant.core.Sort; import com.gitee.dorive.api.entity.core.def.EntityDef; import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.core.api.context.Context; @@ -137,11 +137,11 @@ public class MybatisPlusExecutor extends AbstractExecutor { OrderBy orderBy = example.getOrderBy(); if (orderBy != null) { - String order = orderBy.getOrder(); - if (Order.ASC.equals(order)) { + String sort = orderBy.getSort(); + if (Sort.ASC.equals(sort)) { queryWrapper.orderByAsc(orderBy.getProperties()); - } else if (Order.DESC.equals(order)) { + } else if (Sort.DESC.equals(sort)) { queryWrapper.orderByDesc(orderBy.getProperties()); } } diff --git a/dorive-query/pom.xml b/dorive-query/pom.xml index 910a60b7aed5ab6cebbceb256489e40d201acc14..994e3e4cb669b5bab954256ba097f8f6cd95fa30 100644 --- a/dorive-query/pom.xml +++ b/dorive-query/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.1 + 3.5.2 dorive-query diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java index 64fec98320d055d7a13bdc5b47adca172b7b4db7..2aedd8e243651500ebc963c1bc0e1fe284f5ff9c 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java @@ -19,7 +19,7 @@ package com.gitee.dorive.query.impl.resolver; import cn.hutool.core.convert.Convert; import com.gitee.dorive.api.constant.core.Operator; -import com.gitee.dorive.api.constant.core.Order; +import com.gitee.dorive.api.constant.core.Sort; import com.gitee.dorive.api.constant.query.OperatorV2; import com.gitee.dorive.api.entity.core.Field; import com.gitee.dorive.api.entity.query.QueryDefinition; @@ -78,7 +78,7 @@ public class QueryExampleResolver { List properties = StringUtils.toList(sortBy); if (properties != null && !properties.isEmpty()) { String orderStr = ((String) order).toUpperCase(); - if (Order.ASC.equals(orderStr) || Order.DESC.equals(orderStr)) { + if (Sort.ASC.equals(orderStr) || Sort.DESC.equals(orderStr)) { return new OrderBy(properties, orderStr); } } diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index 0242cc312305e7287b6a528dd312aa848e77463c..c7f6b7c9ceb4b100a4cb6e5fc44e1b8ca3a5dad2 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.1 + 3.5.2 dorive-ref diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index ae4f8cbfbcdd1fe53cd7f0e492c1a32270a03411..dcbd2f53280f13610ad33551023e509c050329b9 100644 --- a/dorive-spring-boot-starter/pom.xml +++ b/dorive-spring-boot-starter/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.1 + 3.5.2 dorive-spring-boot-starter diff --git a/dorive-sql/pom.xml b/dorive-sql/pom.xml index 63f68ca91d0bf863ff31b7e26fb0962ce4b45353..eea1c97820994df0cdec41d5cd8ad6b2fad8d988 100644 --- a/dorive-sql/pom.xml +++ b/dorive-sql/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.1 + 3.5.2 dorive-sql diff --git a/dorive-test/pom.xml b/dorive-test/pom.xml index 6173f98fb2c6640981d5bcf9f890242c7aee881d..0d0e18fe1740ec72c04215352176dbfc4313e808 100644 --- a/dorive-test/pom.xml +++ b/dorive-test/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.1 + 3.5.2 dorive-test diff --git a/dorive-web/pom.xml b/dorive-web/pom.xml index d81c1bca1686ee6eefbd7dc6b117592a345582cb..fd377bf7d270d576e9148d0b08117eda95ce14d2 100644 --- a/dorive-web/pom.xml +++ b/dorive-web/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.1 + 3.5.2 dorive-web diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/impl/banner/BannerPrinter.java b/dorive-web/src/main/java/com/gitee/dorive/web/impl/banner/BannerPrinter.java new file mode 100644 index 0000000000000000000000000000000000000000..deee640c7bcab6607395f0ef321248dcfc674543 --- /dev/null +++ b/dorive-web/src/main/java/com/gitee/dorive/web/impl/banner/BannerPrinter.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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 com.gitee.dorive.web.impl.banner; + +import org.springframework.beans.factory.InitializingBean; + +public class BannerPrinter implements InitializingBean { + + @Override + public void afterPropertiesSet() { + System.out.println(" __ __ __ ___ "); + System.out.println("| \\ / \\ |__) | \\ / |__ "); + System.out.println("|__/ \\__/ | \\ | \\/ |___ "); + System.out.println(" " + DoriveVersion.getVersion() + ""); + } + + public static void main(String[] args) { + BannerPrinter bannerPrinter = new BannerPrinter(); + bannerPrinter.afterPropertiesSet(); + } + +} diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/impl/banner/DoriveVersion.java b/dorive-web/src/main/java/com/gitee/dorive/web/impl/banner/DoriveVersion.java new file mode 100644 index 0000000000000000000000000000000000000000..53c792dba7d2cd21e0628ea07909c55d2f0b01f4 --- /dev/null +++ b/dorive-web/src/main/java/com/gitee/dorive/web/impl/banner/DoriveVersion.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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 com.gitee.dorive.web.impl.banner; + +import java.io.File; +import java.io.IOException; +import java.net.JarURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.security.CodeSource; +import java.util.jar.Attributes; +import java.util.jar.JarFile; + +public class DoriveVersion { + + public static String getVersion() { + return determineSpringBootVersion(); + } + + private static String determineSpringBootVersion() { + final Package pkg = DoriveVersion.class.getPackage(); + if (pkg != null && pkg.getImplementationVersion() != null) { + return pkg.getImplementationVersion(); + } + CodeSource codeSource = DoriveVersion.class.getProtectionDomain().getCodeSource(); + if (codeSource == null) { + return null; + } + URL codeSourceLocation = codeSource.getLocation(); + try { + URLConnection connection = codeSourceLocation.openConnection(); + if (connection instanceof JarURLConnection) { + return getImplementationVersion(((JarURLConnection) connection).getJarFile()); + } + try (JarFile jarFile = new JarFile(new File(codeSourceLocation.toURI()))) { + return getImplementationVersion(jarFile); + } + } catch (Exception ex) { + return null; + } + } + + private static String getImplementationVersion(JarFile jarFile) throws IOException { + return jarFile.getManifest().getMainAttributes().getValue(Attributes.Name.IMPLEMENTATION_VERSION); + } + +} diff --git a/pom.xml b/pom.xml index f89ea1b42b959022c1d91f197c6c6829be6080f3..2bf7caecd213fd9688d761f8b0df1c134d157422 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.5.1 + 3.5.2 pom @@ -81,7 +81,6 @@ org.projectlombok lombok 1.18.16 - compile org.apache.commons @@ -101,6 +100,14 @@ + + + org.projectlombok + lombok + provided + + + @@ -119,6 +126,18 @@ + + org.apache.maven.plugins + maven-jar-plugin + 3.1.2 + + + + ${project.version} + + + + \ No newline at end of file