From fb91081c7ad7af0f2e67e54a15440482bc00cbf2 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 28 Oct 2022 13:54:17 +0800 Subject: [PATCH 01/42] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=903.0.0?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../example/coating/tenant/TenantQuery.java | 19 --- .../example/coating/visitor/VisitorQuery.java | 13 -- .../spring/domain/example/entity/Api.java | 2 +- .../domain/example/entity/Department.java | 18 +-- .../spring/domain/example/entity/Menu.java | 12 +- .../spring/domain/example/entity/Role.java | 16 +- .../domain/example/entity/RoleGroup.java | 14 +- .../example/entity/{link => }/RoleMenu.java | 12 +- .../entity/{aggregate => }/Tenant.java | 16 +- .../spring/domain/example/entity/User.java | 16 +- .../example/entity/{link => }/UserRole.java | 12 +- .../entity/{aggregate => }/Visitor.java | 3 +- .../domain/example/entity/VisitorUser.java | 14 +- .../entity/listener/DepartmentListener.java | 39 ----- .../entity/listener/TenantListener.java | 24 --- .../example/entity/view/TenantView.java | 73 --------- .../repository/DepartmentRepository.java | 4 +- .../example/repository/MenuRepository.java | 4 +- .../repository/RoleGroupRepository.java | 4 +- ...epository.java => RoleMenuRepository.java} | 6 +- .../example/repository/RoleRepository.java | 4 +- .../example/repository/TenantRepository.java | 6 +- .../example/repository/UserRepository.java | 4 +- .../repository/UserRoleRepository.java | 15 ++ .../repository/VisitorUserRepository.java | 4 +- .../example/service/SaasDataService.java | 146 ------------------ .../domain/example/SpringDomainTest01.java | 84 ---------- .../domain/example/SpringDomainTest02.java | 62 +------- .../domain/example/SpringDomainTest03.java | 72 --------- .../domain/example/SpringDomainTest04.java | 82 ---------- 31 files changed, 110 insertions(+), 692 deletions(-) delete mode 100644 src/main/java/com/gitee/spring/domain/example/coating/tenant/TenantQuery.java delete mode 100644 src/main/java/com/gitee/spring/domain/example/coating/visitor/VisitorQuery.java rename src/main/java/com/gitee/spring/domain/example/entity/{link => }/RoleMenu.java (42%) rename src/main/java/com/gitee/spring/domain/example/entity/{aggregate => }/Tenant.java (67%) rename src/main/java/com/gitee/spring/domain/example/entity/{link => }/UserRole.java (36%) rename src/main/java/com/gitee/spring/domain/example/entity/{aggregate => }/Visitor.java (64%) delete mode 100644 src/main/java/com/gitee/spring/domain/example/entity/listener/DepartmentListener.java delete mode 100644 src/main/java/com/gitee/spring/domain/example/entity/listener/TenantListener.java delete mode 100644 src/main/java/com/gitee/spring/domain/example/entity/view/TenantView.java rename src/main/java/com/gitee/spring/domain/example/repository/{TenantViewRepository.java => RoleMenuRepository.java} (54%) create mode 100644 src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java delete mode 100644 src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java delete mode 100644 src/test/java/com/gitee/spring/domain/example/SpringDomainTest01.java delete mode 100644 src/test/java/com/gitee/spring/domain/example/SpringDomainTest03.java delete mode 100644 src/test/java/com/gitee/spring/domain/example/SpringDomainTest04.java diff --git a/pom.xml b/pom.xml index 85b7631..d42376c 100644 --- a/pom.xml +++ b/pom.xml @@ -70,7 +70,7 @@ com.gitee.digital-engine spring-boot-starter-domain - 2.8.2 + 3.0.0 diff --git a/src/main/java/com/gitee/spring/domain/example/coating/tenant/TenantQuery.java b/src/main/java/com/gitee/spring/domain/example/coating/tenant/TenantQuery.java deleted file mode 100644 index 2cb46cc..0000000 --- a/src/main/java/com/gitee/spring/domain/example/coating/tenant/TenantQuery.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.gitee.spring.domain.example.coating.tenant; - -import com.gitee.spring.domain.coating.annotation.Coating; -import lombok.Data; - -@Data -@Coating -public class TenantQuery { - // 租户名称 - private String tenantName; - // 部门名称 - private String deptName; - // 用户编码 - private String userCode; - // 用户名称 - private String userName; - // 是否主账户 1-是 2-否 - private Integer isMaster; -} diff --git a/src/main/java/com/gitee/spring/domain/example/coating/visitor/VisitorQuery.java b/src/main/java/com/gitee/spring/domain/example/coating/visitor/VisitorQuery.java deleted file mode 100644 index 0f7ff56..0000000 --- a/src/main/java/com/gitee/spring/domain/example/coating/visitor/VisitorQuery.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gitee.spring.domain.example.coating.visitor; - -import com.gitee.spring.domain.coating.annotation.Coating; -import lombok.Data; - -@Data -@Coating -public class VisitorQuery { - // 角色名称 - private String roleName; - // 菜单名称 - private String menuName; -} diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Api.java b/src/main/java/com/gitee/spring/domain/example/entity/Api.java index ae60314..2f19305 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Api.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Api.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.entity; import com.fasterxml.jackson.annotation.JsonFormat; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.spring.domain.core3.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestApiMapper; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Department.java b/src/main/java/com/gitee/spring/domain/example/entity/Department.java index 42dd629..0fa0960 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Department.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Department.java @@ -1,9 +1,9 @@ package com.gitee.spring.domain.example.entity; import com.fasterxml.jackson.annotation.JsonFormat; -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Bindings; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.spring.domain.core3.annotation.Binding; +import com.gitee.spring.domain.core3.annotation.Bindings; +import com.gitee.spring.domain.core3.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestDeptMapper; import com.gitee.spring.domain.example.mapper.AcsTestUserMapper; import lombok.Data; @@ -30,13 +30,13 @@ public class Department { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; // 用户实体 - @Entity(scene = "dept.users", mapper = AcsTestUserMapper.class) + @Entity(context = "dept.users", mapper = AcsTestUserMapper.class) @Bindings({ - @Binding(field = "deptId", bind = "./id"), - @Binding(field = "tenantId", bind = "tenantId"), - @Binding(field = "userCode", bind = "userCode"), - @Binding(field = "userName", bind = "userName"), - @Binding(field = "isMaster", bind = "isMaster"), + @Binding(field = "deptId", bindProp = "./id"), + @Binding(field = "tenantId", bindCtx = "tenantId"), + @Binding(field = "userCode", bindCtx = "userCode"), + @Binding(field = "userName", bindCtx = "userName"), + @Binding(field = "isMaster", bindCtx = "isMaster"), }) private List users; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java index 7cc779a..5c08d41 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java @@ -1,9 +1,9 @@ package com.gitee.spring.domain.example.entity; import com.fasterxml.jackson.annotation.JsonFormat; -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Bindings; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.spring.domain.core3.annotation.Binding; +import com.gitee.spring.domain.core3.annotation.Bindings; +import com.gitee.spring.domain.core3.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestApiMapper; import com.gitee.spring.domain.example.mapper.AcsTestMenuMapper; import lombok.Data; @@ -39,10 +39,10 @@ public class Menu { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; // 接口实体 - @Entity(scene = "api", mapper = AcsTestApiMapper.class) + @Entity(context = "api", mapper = AcsTestApiMapper.class) @Bindings({ - @Binding(field = "menuId", bind = "./id"), - @Binding(field = "apiUrl", bind = "apiUrl") + @Binding(field = "menuId", bindProp = "./id"), + @Binding(field = "apiUrl", bindCtx = "apiUrl") }) private List apis; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Role.java b/src/main/java/com/gitee/spring/domain/example/entity/Role.java index 5f2c2fc..e441335 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Role.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Role.java @@ -2,12 +2,10 @@ package com.gitee.spring.domain.example.entity; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.entity.link.RoleMenu; +import com.gitee.spring.domain.core3.annotation.Binding; +import com.gitee.spring.domain.core3.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; -import com.gitee.spring.domain.example.mapper.AcsTestRoleMenuMapper; -import com.gitee.spring.domain.example.repository.MenuRepository; +import com.gitee.spring.domain.example.repository.RoleMenuRepository; import lombok.Data; import java.util.Date; @@ -38,11 +36,7 @@ public class Role { private Date updateTime; // 角色菜单关联实体 @JsonIgnore - @Entity(scene = "menu", mapper = AcsTestRoleMenuMapper.class) - @Binding(field = "roleId", bind = "./id") + @Entity(context = "menu", repository = RoleMenuRepository.class) + @Binding(field = "roleId", bindProp = "./id") private List roleMenus; - // 菜单实体 - @Entity(scene = "menu", repository = MenuRepository.class) - @Binding(field = "id", bind = "./roleMenus", property = "menuId") - private List menus; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java index a301ab2..3dc1236 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java @@ -1,9 +1,9 @@ package com.gitee.spring.domain.example.entity; import com.fasterxml.jackson.annotation.JsonFormat; -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Bindings; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.spring.domain.core3.annotation.Binding; +import com.gitee.spring.domain.core3.annotation.Bindings; +import com.gitee.spring.domain.core3.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestRoleGroupMapper; import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; import lombok.Data; @@ -30,11 +30,11 @@ public class RoleGroup { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; // 角色实体 - @Entity(scene = "group.roles", mapper = AcsTestRoleMapper.class) + @Entity(context = "group.roles", mapper = AcsTestRoleMapper.class) @Bindings({ - @Binding(field = "groupId", bind = "./id"), - @Binding(field = "tenantId", bind = "tenantId"), - @Binding(field = "roleName", bind = "roleName"), + @Binding(field = "groupId", bindProp = "./id"), + @Binding(field = "tenantId", bindCtx = "tenantId"), + @Binding(field = "roleName", bindCtx = "roleName"), }) private List roles; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/link/RoleMenu.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java similarity index 42% rename from src/main/java/com/gitee/spring/domain/example/entity/link/RoleMenu.java rename to src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java index afde52a..d873c7d 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/link/RoleMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java @@ -1,10 +1,16 @@ -package com.gitee.spring.domain.example.entity.link; +package com.gitee.spring.domain.example.entity; +import com.gitee.spring.domain.core3.annotation.Binding; +import com.gitee.spring.domain.core3.annotation.Entity; +import com.gitee.spring.domain.example.mapper.AcsTestRoleMenuMapper; +import com.gitee.spring.domain.example.repository.MenuRepository; import lombok.Data; import java.util.Date; +import java.util.List; @Data +@Entity(mapper = AcsTestRoleMenuMapper.class) public class RoleMenu { // 主键 private Integer id; @@ -18,4 +24,8 @@ public class RoleMenu { private String createUser; // 创建时间 private Date createTime; + // 菜单实体 + @Entity(context = "menu", repository = MenuRepository.class) + @Binding(field = "id", bindProp = "./menuId") + private List menus; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/aggregate/Tenant.java b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java similarity index 67% rename from src/main/java/com/gitee/spring/domain/example/entity/aggregate/Tenant.java rename to src/main/java/com/gitee/spring/domain/example/entity/Tenant.java index 4351fff..fd8591b 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/aggregate/Tenant.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java @@ -1,10 +1,8 @@ -package com.gitee.spring.domain.example.entity.aggregate; +package com.gitee.spring.domain.example.entity; import com.fasterxml.jackson.annotation.JsonFormat; -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.entity.Department; -import com.gitee.spring.domain.example.entity.RoleGroup; +import com.gitee.spring.domain.core3.annotation.Binding; +import com.gitee.spring.domain.core3.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestTenantMapper; import com.gitee.spring.domain.example.repository.DepartmentRepository; import com.gitee.spring.domain.example.repository.RoleGroupRepository; @@ -37,11 +35,11 @@ public class Tenant { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; // 部门实体 - @Entity(scene = "tenant.depts", repository = DepartmentRepository.class) - @Binding(field = "tenantId", bind = "./id") + @Entity(context = "tenant.depts", repository = DepartmentRepository.class) + @Binding(field = "tenantId", bindProp = "./id") private List departments; // 角色组实体 - @Entity(scene = "tenant.groups", repository = RoleGroupRepository.class) - @Binding(field = "tenantId", bind = "./id") + @Entity(context = "tenant.groups", repository = RoleGroupRepository.class) + @Binding(field = "tenantId", bindProp = "./id") private List roleGroups; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/User.java b/src/main/java/com/gitee/spring/domain/example/entity/User.java index a51ed80..6f58f7b 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/User.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/User.java @@ -2,12 +2,10 @@ package com.gitee.spring.domain.example.entity; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.entity.link.UserRole; +import com.gitee.spring.domain.core3.annotation.Binding; +import com.gitee.spring.domain.core3.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestUserMapper; -import com.gitee.spring.domain.example.mapper.AcsTestUserRoleMapper; -import com.gitee.spring.domain.example.repository.RoleRepository; +import com.gitee.spring.domain.example.repository.UserRoleRepository; import lombok.Data; import java.util.Date; @@ -40,11 +38,7 @@ public class User { private Date updateTime; // 用户角色关联实体 @JsonIgnore - @Entity(scene = "role", mapper = AcsTestUserRoleMapper.class) - @Binding(field = "userId", bind = "./id") + @Entity(context = "role", repository = UserRoleRepository.class) + @Binding(field = "userId", bindProp = "./id") private List userRoles; - // 角色实体 - @Entity(scene = "role", repository = RoleRepository.class) - @Binding(field = "id", bind = "./userRoles", property = "roleId") - private List roles; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/link/UserRole.java b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java similarity index 36% rename from src/main/java/com/gitee/spring/domain/example/entity/link/UserRole.java rename to src/main/java/com/gitee/spring/domain/example/entity/UserRole.java index d9d130b..ddcac48 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/link/UserRole.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java @@ -1,10 +1,16 @@ -package com.gitee.spring.domain.example.entity.link; +package com.gitee.spring.domain.example.entity; +import com.gitee.spring.domain.core3.annotation.Binding; +import com.gitee.spring.domain.core3.annotation.Entity; +import com.gitee.spring.domain.example.mapper.AcsTestUserRoleMapper; +import com.gitee.spring.domain.example.repository.RoleRepository; import lombok.Data; import java.util.Date; +import java.util.List; @Data +@Entity(mapper = AcsTestUserRoleMapper.class) public class UserRole { // 主键 private Integer id; @@ -16,4 +22,8 @@ public class UserRole { private String createUser; // 创建时间 private Date createTime; + // 角色实体 + @Entity(context = "role", repository = RoleRepository.class) + @Binding(field = "id", bindProp = "./roleId") + private List roles; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/aggregate/Visitor.java b/src/main/java/com/gitee/spring/domain/example/entity/Visitor.java similarity index 64% rename from src/main/java/com/gitee/spring/domain/example/entity/aggregate/Visitor.java rename to src/main/java/com/gitee/spring/domain/example/entity/Visitor.java index 017cc26..2448889 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/aggregate/Visitor.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Visitor.java @@ -1,6 +1,5 @@ -package com.gitee.spring.domain.example.entity.aggregate; +package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.example.entity.VisitorUser; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java b/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java index 61bd89e..a846bfc 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java @@ -1,9 +1,9 @@ package com.gitee.spring.domain.example.entity; import com.fasterxml.jackson.annotation.JsonFormat; -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Bindings; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.spring.domain.core3.annotation.Binding; +import com.gitee.spring.domain.core3.annotation.Bindings; +import com.gitee.spring.domain.core3.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestUserMapper; import com.gitee.spring.domain.example.mapper.AcsTestVisitorUserMapper; import lombok.Data; @@ -22,11 +22,11 @@ public class VisitorUser { // 用户id private Integer userId; // 用户对象 - @Entity(scene = "user", mapper = AcsTestUserMapper.class) + @Entity(context = "user", mapper = AcsTestUserMapper.class) @Bindings({ - @Binding(field = "id", bind = "./userId"), - @Binding(field = "isMaster", bind = "isMaster"), - @Binding(field = "status", bind = "status") + @Binding(field = "id", bindProp = "./userId"), + @Binding(field = "isMaster", bindCtx = "isMaster"), + @Binding(field = "status", bindCtx = "status") }) private User user; // 创建者 diff --git a/src/main/java/com/gitee/spring/domain/example/entity/listener/DepartmentListener.java b/src/main/java/com/gitee/spring/domain/example/entity/listener/DepartmentListener.java deleted file mode 100644 index b76219e..0000000 --- a/src/main/java/com/gitee/spring/domain/example/entity/listener/DepartmentListener.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.gitee.spring.domain.example.entity.listener; - -import com.gitee.spring.domain.event.annotation.EntityListener; -import com.gitee.spring.domain.event.api.EventListener; -import com.gitee.spring.domain.event.entity.OperationType; -import com.gitee.spring.domain.event.entity.RepositoryEvent; -import com.gitee.spring.domain.example.entity.Department; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Data -@Slf4j -@Component -@EntityListener(Department.class) -public class DepartmentListener implements EventListener { - - private int count = 0; - - @Override - public void onApplicationEvent(RepositoryEvent repositoryEvent) { - if (repositoryEvent.getOperationType() == OperationType.INSERT) { - Department department = (Department) repositoryEvent.getEntity(); - log.info(department.toString()); - count++; - - } else if (repositoryEvent.getOperationType() == OperationType.UPDATE) { - Department department = (Department) repositoryEvent.getEntity(); - log.info(department.toString()); - count++; - - } else if (repositoryEvent.getOperationType() == OperationType.DELETE) { - Department department = (Department) repositoryEvent.getEntity(); - log.info(department.toString()); - count++; - } - } - -} diff --git a/src/main/java/com/gitee/spring/domain/example/entity/listener/TenantListener.java b/src/main/java/com/gitee/spring/domain/example/entity/listener/TenantListener.java deleted file mode 100644 index 66e91bb..0000000 --- a/src/main/java/com/gitee/spring/domain/example/entity/listener/TenantListener.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gitee.spring.domain.example.entity.listener; - -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.event.annotation.EntityListener; -import com.gitee.spring.domain.event.api.EventListener; -import com.gitee.spring.domain.event.entity.OperationType; -import com.gitee.spring.domain.event.entity.RepositoryEvent; -import com.gitee.spring.domain.example.entity.aggregate.Tenant; -import org.springframework.stereotype.Component; - -@Component -@EntityListener(Tenant.class) -public class TenantListener implements EventListener { - - @Override - public void onApplicationEvent(RepositoryEvent repositoryEvent) { - if (repositoryEvent.getOperationType() == OperationType.INSERT) { - BoundedContext boundedContext = repositoryEvent.getBoundedContext(); - Tenant tenant = (Tenant) repositoryEvent.getEntity(); - boundedContext.put("tenantId", tenant.getId()); - } - } - -} diff --git a/src/main/java/com/gitee/spring/domain/example/entity/view/TenantView.java b/src/main/java/com/gitee/spring/domain/example/entity/view/TenantView.java deleted file mode 100644 index 2b2cd69..0000000 --- a/src/main/java/com/gitee/spring/domain/example/entity/view/TenantView.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.gitee.spring.domain.example.entity.view; - -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.entity.Api; -import com.gitee.spring.domain.example.entity.Department; -import com.gitee.spring.domain.example.entity.Menu; -import com.gitee.spring.domain.example.entity.Role; -import com.gitee.spring.domain.example.entity.RoleGroup; -import com.gitee.spring.domain.example.entity.User; -import com.gitee.spring.domain.example.entity.VisitorUser; -import com.gitee.spring.domain.example.entity.link.RoleMenu; -import com.gitee.spring.domain.example.entity.link.UserRole; -import com.gitee.spring.domain.example.mapper.AcsTestApiMapper; -import com.gitee.spring.domain.example.mapper.AcsTestDeptMapper; -import com.gitee.spring.domain.example.mapper.AcsTestMenuMapper; -import com.gitee.spring.domain.example.mapper.AcsTestRoleGroupMapper; -import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; -import com.gitee.spring.domain.example.mapper.AcsTestRoleMenuMapper; -import com.gitee.spring.domain.example.mapper.AcsTestTenantMapper; -import com.gitee.spring.domain.example.mapper.AcsTestUserMapper; -import com.gitee.spring.domain.example.mapper.AcsTestUserRoleMapper; -import com.gitee.spring.domain.example.mapper.AcsTestVisitorUserMapper; -import lombok.Data; - -import java.util.List; - -@Data -@Entity(mapper = AcsTestTenantMapper.class) -public class TenantView { - // 主键 - private Integer id; - - // 部门实体 - @Entity(mapper = AcsTestDeptMapper.class) - @Binding(field = "tenantId", bind = "./id") - private List departments; - // 用户实体 - @Entity(mapper = AcsTestUserMapper.class) - @Binding(field = "tenantId", bind = "./id") - private List users; - - // 角色组实体 - @Entity(mapper = AcsTestRoleGroupMapper.class) - @Binding(field = "tenantId", bind = "./id") - private List roleGroups; - // 角色实体 - @Entity(mapper = AcsTestRoleMapper.class) - @Binding(field = "tenantId", bind = "./id") - private List roles; - - // 访问者用户关联实体 - @Entity(mapper = AcsTestVisitorUserMapper.class) - @Binding(field = "userId", bind = "./users", property = "id") - private List visitorUsers; - // 用户角色关联实体 - @Entity(mapper = AcsTestUserRoleMapper.class) - @Binding(field = "userId", bind = "./users", property = "id") - private List userRoles; - // 角色菜单关联实体 - @Entity(mapper = AcsTestRoleMenuMapper.class) - @Binding(field = "roleId", bind = "./roles", property = "id") - private List roleMenus; - - // 菜单实体 - @Entity(mapper = AcsTestMenuMapper.class) - @Binding(field = "id", bind = "./roleMenus", property = "menuId") - private List menus; - // 接口实体 - @Entity(mapper = AcsTestApiMapper.class) - @Binding(field = "menuId", bind = "./roleMenus", property = "menuId") - private List apis; -} diff --git a/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java index d3d4fbd..f279aa2 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusGenericRepository; +import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Department; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,5 +11,5 @@ import lombok.EqualsAndHashCode; @RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class DepartmentRepository extends MybatisPlusGenericRepository { +public class DepartmentRepository extends MybatisPlusRepository { } diff --git a/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java index 598f0ff..dc8c119 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusGenericRepository; +import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Menu; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,5 +11,5 @@ import lombok.EqualsAndHashCode; @RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class MenuRepository extends MybatisPlusGenericRepository { +public class MenuRepository extends MybatisPlusRepository { } diff --git a/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java index a393a9a..3e8c742 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusGenericRepository; +import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.RoleGroup; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,5 +11,5 @@ import lombok.EqualsAndHashCode; @RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class RoleGroupRepository extends MybatisPlusGenericRepository { +public class RoleGroupRepository extends MybatisPlusRepository { } diff --git a/src/main/java/com/gitee/spring/domain/example/repository/TenantViewRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java similarity index 54% rename from src/main/java/com/gitee/spring/domain/example/repository/TenantViewRepository.java rename to src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java index f4924cd..d8cb97d 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/TenantViewRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusGenericRepository; -import com.gitee.spring.domain.example.entity.view.TenantView; +import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; +import com.gitee.spring.domain.example.entity.RoleMenu; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -11,5 +11,5 @@ import lombok.EqualsAndHashCode; @RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class TenantViewRepository extends MybatisPlusGenericRepository { +public class RoleMenuRepository extends MybatisPlusRepository { } diff --git a/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java index 47b8467..2744b6c 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusGenericRepository; +import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Role; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,5 +11,5 @@ import lombok.EqualsAndHashCode; @RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class RoleRepository extends MybatisPlusGenericRepository { +public class RoleRepository extends MybatisPlusRepository { } diff --git a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java index 7dea64c..a2b9a0a 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusGenericRepository; -import com.gitee.spring.domain.example.entity.aggregate.Tenant; +import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; +import com.gitee.spring.domain.example.entity.Tenant; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -11,5 +11,5 @@ import lombok.EqualsAndHashCode; @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @RootRepository(scanPackages = "com.gitee.spring.domain.example.coating.tenant") -public class TenantRepository extends MybatisPlusGenericRepository { +public class TenantRepository extends MybatisPlusRepository { } diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java index 3228b32..06c111f 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusGenericRepository; +import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.User; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,5 +11,5 @@ import lombok.EqualsAndHashCode; @RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class UserRepository extends MybatisPlusGenericRepository { +public class UserRepository extends MybatisPlusRepository { } diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java new file mode 100644 index 0000000..1af7872 --- /dev/null +++ b/src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java @@ -0,0 +1,15 @@ +package com.gitee.spring.domain.example.repository; + +import com.gitee.spring.boot.starter.domain.annotation.RootRepository; +import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; +import com.gitee.spring.domain.example.entity.UserRole; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@RootRepository +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class UserRoleRepository extends MybatisPlusRepository { +} diff --git a/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java index e11168b..199c652 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusGenericRepository; +import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.VisitorUser; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,5 +11,5 @@ import lombok.EqualsAndHashCode; @AllArgsConstructor @EqualsAndHashCode(callSuper = false) @RootRepository(scanPackages = "com.gitee.spring.domain.example.coating.visitor") -public class VisitorUserRepository extends MybatisPlusGenericRepository { +public class VisitorUserRepository extends MybatisPlusRepository { } diff --git a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java b/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java deleted file mode 100644 index 195bd18..0000000 --- a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.gitee.spring.domain.example.service; - -import cn.hutool.core.lang.Assert; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.core.entity.EntityExample; -import com.gitee.spring.domain.example.entity.Api; -import com.gitee.spring.domain.example.entity.Department; -import com.gitee.spring.domain.example.entity.Menu; -import com.gitee.spring.domain.example.entity.Role; -import com.gitee.spring.domain.example.entity.RoleGroup; -import com.gitee.spring.domain.example.entity.User; -import com.gitee.spring.domain.example.entity.VisitorUser; -import com.gitee.spring.domain.example.entity.aggregate.Tenant; -import com.gitee.spring.domain.example.entity.link.RoleMenu; -import com.gitee.spring.domain.example.entity.link.UserRole; -import com.gitee.spring.domain.example.entity.view.TenantView; -import com.gitee.spring.domain.example.repository.MenuRepository; -import com.gitee.spring.domain.example.repository.RoleRepository; -import com.gitee.spring.domain.example.repository.TenantRepository; -import com.gitee.spring.domain.example.repository.TenantViewRepository; -import com.gitee.spring.domain.example.repository.UserRepository; -import com.gitee.spring.domain.example.repository.VisitorUserRepository; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.Collections; -import java.util.Date; -import java.util.List; - -@Service -@AllArgsConstructor -public class SaasDataService { - - private final TenantRepository tenantRepository; - private final VisitorUserRepository visitorUserRepository; - private final UserRepository userRepository; - private final RoleRepository roleRepository; - private final MenuRepository menuRepository; - private final TenantViewRepository tenantViewRepository; - - public void init() { - Tenant tenant = new Tenant(); - tenant.setTenantCode("digital_engine"); - tenant.setTenantName("数字引擎"); - tenant.setLogoUrl("https://portrait.gitee.com/uploads/avatars/namespa…3/8859066_digital-engine_1654079160.png!avatar100"); - tenant.setStatus(0); - tenant.setCreateUser("admin"); - tenant.setCreateTime(new Date()); - - Department department = new Department(); - department.setSuperId(null); - department.setDeptCode("default"); - department.setDeptName("默认部门"); - department.setCreateUser("admin"); - department.setCreateTime(new Date()); - tenant.setDepartments(Collections.singletonList(department)); - - User user = new User(); - user.setUserCode("000001"); - user.setUserName("默认用户"); - user.setIsMaster(1); - user.setStatus(0); - user.setCreateUser("admin"); - user.setCreateTime(new Date()); - department.setUsers(Collections.singletonList(user)); - - RoleGroup roleGroup = new RoleGroup(); - roleGroup.setSuperId(null); - roleGroup.setGroupCode("default"); - roleGroup.setGroupName("默认角色组"); - roleGroup.setCreateUser("admin"); - roleGroup.setCreateTime(new Date()); - tenant.setRoleGroups(Collections.singletonList(roleGroup)); - - Role role = new Role(); - role.setRoleCode("system admin"); - role.setRoleName("系统管理员"); - role.setStatus(0); - role.setCreateUser("admin"); - role.setCreateTime(new Date()); - roleGroup.setRoles(Collections.singletonList(role)); - - BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "dept.users", "group.roles"); - int count = tenantRepository.insert(boundedContext, tenant); - Assert.isTrue(count == 5); - - Menu menu = new Menu(); - menu.setSuperId(null); - menu.setMenuCode("default"); - menu.setMenuName("默认菜单"); - menu.setMenuType("nav"); - menu.setMenuIndex(0); - menu.setOnlyAdmin(2); - menu.setCreateUser("admin"); - menu.setCreateTime(new Date()); - - Api api = new Api(); - api.setApiCode("default"); - api.setApiName("默认接口"); - api.setApiUrl("/test"); - api.setCreateUser("admin"); - api.setCreateTime(new Date()); - menu.setApis(Collections.singletonList(api)); - - boundedContext = new BoundedContext("api"); - count = menuRepository.insert(boundedContext, menu); - Assert.isTrue(count == 2); - - VisitorUser visitorUser = new VisitorUser(); - visitorUser.setUserLogin("000001"); - visitorUser.setIsAdmin(2); - visitorUser.setUser(user); - visitorUser.setCreateUser("admin"); - visitorUser.setCreateTime(new Date()); - boundedContext = new BoundedContext("user"); - count = visitorUserRepository.insert(boundedContext, visitorUser); - Assert.isTrue(count == 1); - - UserRole userRole = new UserRole(); - userRole.setRoleId(role.getId()); - userRole.setCreateUser("admin"); - userRole.setCreateTime(new Date()); - user.setUserRoles(Collections.singletonList(userRole)); - boundedContext = new BoundedContext("role"); - count = userRepository.insert(boundedContext, user); - Assert.isTrue(count == 1); - - RoleMenu roleMenu = new RoleMenu(); - roleMenu.setMenuId(menu.getId()); - roleMenu.setDataAuthority(4); - roleMenu.setCreateUser("admin"); - roleMenu.setCreateTime(new Date()); - role.setRoleMenus(Collections.singletonList(roleMenu)); - boundedContext = new BoundedContext("menu"); - count = roleRepository.insert(boundedContext, role); - Assert.isTrue(count == 1); - } - - public void clear() { - BoundedContext boundedContext = new BoundedContext(); - List tenantViews = tenantViewRepository.selectByExample(boundedContext, new EntityExample()); - int count = tenantViewRepository.deleteList(boundedContext, tenantViews); - Assert.isTrue(count == 10); - } - -} diff --git a/src/test/java/com/gitee/spring/domain/example/SpringDomainTest01.java b/src/test/java/com/gitee/spring/domain/example/SpringDomainTest01.java deleted file mode 100644 index ed3a5cc..0000000 --- a/src/test/java/com/gitee/spring/domain/example/SpringDomainTest01.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.gitee.spring.domain.example; - -import com.gitee.spring.domain.core.api.EntityBinder; -import com.gitee.spring.domain.core.impl.binder.ContextEntityBinder; -import com.gitee.spring.domain.core.impl.binder.PropertyEntityBinder; -import com.gitee.spring.domain.core.repository.ConfiguredRepository; -import com.gitee.spring.domain.example.repository.DepartmentRepository; -import com.gitee.spring.domain.example.repository.RoleRepository; -import com.gitee.spring.domain.example.repository.VisitorUserRepository; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.List; -import java.util.Map; - -import static org.junit.jupiter.api.Assumptions.assumeTrue; - -@Slf4j -@SpringBootTest -@DisplayName("测试解析逻辑") -public class SpringDomainTest01 { - - @Autowired - private DepartmentRepository departmentRepository; - @Autowired - private VisitorUserRepository visitorUserRepository; - @Autowired - private RoleRepository roleRepository; - - @Test - @DisplayName("测试绑定器解析逻辑") - public void test01() { - Map allConfiguredRepositoryMap = departmentRepository.getAllConfiguredRepositoryMap(); - ConfiguredRepository configuredRepository = allConfiguredRepositoryMap.get("/users"); - List allEntityBinders = configuredRepository.getAllEntityBinders(); - List boundEntityBinders = configuredRepository.getBoundEntityBinders(); - List contextEntityBinders = configuredRepository.getContextEntityBinders(); - List boundValueEntityBinders = configuredRepository.getBoundValueEntityBinders(); - PropertyEntityBinder boundIdEntityBinder = configuredRepository.getBoundIdEntityBinder(); - assumeTrue(allEntityBinders.size() == 5); - assumeTrue(boundEntityBinders.size() == 1); - assumeTrue(contextEntityBinders.size() == 4); - assumeTrue(boundValueEntityBinders.size() == 5); - assumeTrue(boundIdEntityBinder == null); - } - - @Test - @DisplayName("测试绑定器解析逻辑(绑定id值)") - public void test02() { - Map allConfiguredRepositoryMap = visitorUserRepository.getAllConfiguredRepositoryMap(); - ConfiguredRepository configuredRepository = allConfiguredRepositoryMap.get("/user"); - List allEntityBinders = configuredRepository.getAllEntityBinders(); - List boundEntityBinders = configuredRepository.getBoundEntityBinders(); - List contextEntityBinders = configuredRepository.getContextEntityBinders(); - List boundValueEntityBinders = configuredRepository.getBoundValueEntityBinders(); - PropertyEntityBinder boundIdEntityBinder = configuredRepository.getBoundIdEntityBinder(); - assumeTrue(allEntityBinders.size() == 3); - assumeTrue(boundEntityBinders.size() == 1); - assumeTrue(contextEntityBinders.size() == 2); - assumeTrue(boundValueEntityBinders.size() == 2); - assumeTrue(boundIdEntityBinder != null); - } - - @Test - @DisplayName("测试绑定器解析逻辑(绑定id值,但类型不同)") - public void test03() { - Map allConfiguredRepositoryMap = roleRepository.getAllConfiguredRepositoryMap(); - ConfiguredRepository configuredRepository = allConfiguredRepositoryMap.get("/menus"); - List allEntityBinders = configuredRepository.getAllEntityBinders(); - List boundEntityBinders = configuredRepository.getBoundEntityBinders(); - List contextEntityBinders = configuredRepository.getContextEntityBinders(); - List boundValueEntityBinders = configuredRepository.getBoundValueEntityBinders(); - PropertyEntityBinder boundIdEntityBinder = configuredRepository.getBoundIdEntityBinder(); - assumeTrue(allEntityBinders.size() == 1); - assumeTrue(boundEntityBinders.size() == 1); - assumeTrue(contextEntityBinders.size() == 0); - assumeTrue(boundValueEntityBinders.size() == 0); - assumeTrue(boundIdEntityBinder == null); - } - -} diff --git a/src/test/java/com/gitee/spring/domain/example/SpringDomainTest02.java b/src/test/java/com/gitee/spring/domain/example/SpringDomainTest02.java index dfa2c26..a84ef6b 100644 --- a/src/test/java/com/gitee/spring/domain/example/SpringDomainTest02.java +++ b/src/test/java/com/gitee/spring/domain/example/SpringDomainTest02.java @@ -1,14 +1,11 @@ package com.gitee.spring.domain.example; import cn.hutool.json.JSONUtil; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.core.entity.EntityExample; +import com.gitee.spring.domain.core3.entity.BoundedContext; +import com.gitee.spring.domain.core3.entity.executor.Example; +import com.gitee.spring.domain.example.entity.Visitor; import com.gitee.spring.domain.example.entity.VisitorUser; -import com.gitee.spring.domain.example.entity.aggregate.Tenant; -import com.gitee.spring.domain.example.entity.aggregate.Visitor; -import com.gitee.spring.domain.example.repository.TenantRepository; import com.gitee.spring.domain.example.repository.VisitorUserRepository; -import com.gitee.spring.domain.example.service.SaasDataService; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; @@ -18,9 +15,7 @@ import org.junit.jupiter.api.TestMethodOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import java.util.LinkedHashSet; import java.util.List; -import java.util.Set; import static org.junit.jupiter.api.Assumptions.assumeTrue; @@ -30,65 +25,20 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class SpringDomainTest02 { - @Autowired - private SaasDataService saasDataService; - @Autowired - private TenantRepository tenantRepository; @Autowired private VisitorUserRepository visitorUserRepository; - @Test - @Order(1) - @DisplayName("测试新增逻辑") - public void test01() { - saasDataService.init(); - } - @Test @Order(2) @DisplayName("测试查询逻辑") public void test02() { BoundedContext boundedContext = new BoundedContext("user", "role", "menu", "api"); - EntityExample entityExample = new EntityExample(); - entityExample.eq("userLogin", "000001"); - List visitorUsers = visitorUserRepository.selectByExample(boundedContext, entityExample); + Example example = new Example(); + example.eq("userLogin", "000001"); + List visitorUsers = visitorUserRepository.selectByExample(boundedContext, example); Visitor visitor = new Visitor(visitorUsers); log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(visitor))); assumeTrue(visitor.getVisitorUsers().size() > 0); } - @Test - @Order(3) - @DisplayName("测试更新逻辑") - public void test03() { - BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "dept.users", "group.roles"); - EntityExample entityExample = new EntityExample(); - entityExample.eq("tenantCode", "digital_engine"); - List tenants = tenantRepository.selectByExample(boundedContext, entityExample); - Tenant tenant = tenants.get(0); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenant))); - - // 非空更新 - tenant.setStatus(1); - int count = tenantRepository.update(boundedContext, tenant); - assumeTrue(count == 5); - - // 强制更新 - boundedContext = new BoundedContext(); - Set fieldNames = new LinkedHashSet<>(); - fieldNames.add("logoUrl"); - boundedContext.put("#forceUpdate", fieldNames); - - tenant.setLogoUrl(null); - count = tenantRepository.update(boundedContext, tenant); - assumeTrue(count == 1); - } - - @Test - @Order(4) - @DisplayName("测试删除逻辑") - public void test04() { - saasDataService.clear(); - } - } diff --git a/src/test/java/com/gitee/spring/domain/example/SpringDomainTest03.java b/src/test/java/com/gitee/spring/domain/example/SpringDomainTest03.java deleted file mode 100644 index dd2df39..0000000 --- a/src/test/java/com/gitee/spring/domain/example/SpringDomainTest03.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.gitee.spring.domain.example; - -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.example.entity.Department; -import com.gitee.spring.domain.example.entity.aggregate.Tenant; -import com.gitee.spring.domain.example.entity.listener.DepartmentListener; -import com.gitee.spring.domain.example.repository.TenantRepository; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.Collections; -import java.util.Date; - -import static org.junit.jupiter.api.Assumptions.assumeTrue; - -@Slf4j -@SpringBootTest -@DisplayName("测试事件通知逻辑") -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class SpringDomainTest03 { - - @Autowired - private TenantRepository tenantRepository; - @Autowired - private DepartmentListener departmentListener; - - @Test - @Order(1) - @DisplayName("测试事件仅通知一次逻辑") - public void test01() { - int operateCount = departmentListener.getCount(); - - Tenant tenant = new Tenant(); - tenant.setTenantCode("digital_engine"); - tenant.setTenantName("数字引擎"); - tenant.setLogoUrl("https://portrait.gitee.com/uploads/avatars/namespa…3/8859066_digital-engine_1654079160.png!avatar100"); - tenant.setStatus(0); - tenant.setCreateUser("admin"); - tenant.setCreateTime(new Date()); - - Department department = new Department(); - department.setSuperId(null); - department.setDeptCode("default"); - department.setDeptName("默认部门"); - department.setCreateUser("admin"); - department.setCreateTime(new Date()); - tenant.setDepartments(Collections.singletonList(department)); - - BoundedContext boundedContext = new BoundedContext("tenant.depts"); - int count = tenantRepository.insert(boundedContext, tenant); - assumeTrue(count == 2); - assumeTrue(departmentListener.getCount() == ++operateCount); - - department.setDeptCode("default1"); - department.setDeptCode("默认部门1"); - - count = tenantRepository.update(boundedContext, tenant); - assumeTrue(count == 2); - assumeTrue(departmentListener.getCount() == ++operateCount); - - count = tenantRepository.delete(boundedContext, tenant); - assumeTrue(count == 2); - assumeTrue(departmentListener.getCount() == ++operateCount); - } - -} diff --git a/src/test/java/com/gitee/spring/domain/example/SpringDomainTest04.java b/src/test/java/com/gitee/spring/domain/example/SpringDomainTest04.java deleted file mode 100644 index 09fee7e..0000000 --- a/src/test/java/com/gitee/spring/domain/example/SpringDomainTest04.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.gitee.spring.domain.example; - -import cn.hutool.json.JSONUtil; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.example.coating.tenant.TenantQuery; -import com.gitee.spring.domain.example.coating.visitor.VisitorQuery; -import com.gitee.spring.domain.example.entity.VisitorUser; -import com.gitee.spring.domain.example.entity.aggregate.Tenant; -import com.gitee.spring.domain.example.entity.aggregate.Visitor; -import com.gitee.spring.domain.example.repository.TenantRepository; -import com.gitee.spring.domain.example.repository.VisitorUserRepository; -import com.gitee.spring.domain.example.service.SaasDataService; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.List; - -import static org.junit.jupiter.api.Assumptions.assumeTrue; - -@Slf4j -@SpringBootTest -@DisplayName("测试反向查询逻辑") -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class SpringDomainTest04 { - - @Autowired - private SaasDataService saasDataService; - @Autowired - private TenantRepository tenantRepository; - @Autowired - private VisitorUserRepository visitorUserRepository; - - @BeforeEach - public void beforeEach() { - saasDataService.init(); - } - - @AfterEach - public void afterEach() { - saasDataService.clear(); - } - - @Test - @Order(1) - @DisplayName("测试反向查询逻辑") - public void test01() { - BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "dept.users", "group.roles"); - TenantQuery tenantQuery = new TenantQuery(); - tenantQuery.setTenantName("数字引擎"); - tenantQuery.setDeptName("默认部门"); - tenantQuery.setUserCode("000001"); - tenantQuery.setUserName("默认用户"); - tenantQuery.setIsMaster(1); - List tenants = tenantRepository.selectByCoating(boundedContext, tenantQuery); - Tenant tenant = tenants.get(0); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenant))); - assumeTrue(!tenants.isEmpty()); - } - - @Test - @Order(2) - @DisplayName("测试反向查询逻辑(使用了property属性)") - public void test02() { - BoundedContext boundedContext = new BoundedContext(); - VisitorQuery visitorQuery = new VisitorQuery(); - visitorQuery.setRoleName("系统管理员"); - visitorQuery.setMenuName("默认菜单"); - List visitorUsers = visitorUserRepository.selectByCoating(boundedContext, visitorQuery); - Visitor visitor = new Visitor(visitorUsers); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(visitor))); - assumeTrue(!visitorUsers.isEmpty()); - } - -} -- Gitee From aad4aac26ab480f520bca2ae969baa79bd1ebbd1 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 31 Oct 2022 23:53:30 +0800 Subject: [PATCH 02/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=96=B0=E5=A2=9E=E6=B5=8B=E8=AF=95=E6=A1=88?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/example/entity/Department.java | 4 +- .../spring/domain/example/entity/Menu.java | 2 +- .../spring/domain/example/entity/Role.java | 2 +- .../domain/example/entity/RoleGroup.java | 4 +- .../domain/example/entity/RoleMenu.java | 2 +- .../spring/domain/example/entity/Tenant.java | 4 +- .../spring/domain/example/entity/User.java | 2 +- .../domain/example/entity/UserRole.java | 2 +- .../domain/example/entity/VisitorUser.java | 2 +- .../example/service/SaasDataService.java | 129 ++++++++++++++++++ .../domain/example/SpringDomainTest02.java | 10 ++ 11 files changed, 151 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Department.java b/src/main/java/com/gitee/spring/domain/example/entity/Department.java index 0fa0960..a6ef69f 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Department.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Department.java @@ -30,10 +30,10 @@ public class Department { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; // 用户实体 - @Entity(context = "dept.users", mapper = AcsTestUserMapper.class) + @Entity(triggers = "dept.users", mapper = AcsTestUserMapper.class) @Bindings({ + @Binding(field = "tenantId", bindProp = "./tenantId"), @Binding(field = "deptId", bindProp = "./id"), - @Binding(field = "tenantId", bindCtx = "tenantId"), @Binding(field = "userCode", bindCtx = "userCode"), @Binding(field = "userName", bindCtx = "userName"), @Binding(field = "isMaster", bindCtx = "isMaster"), diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java index 5c08d41..23bb685 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java @@ -39,7 +39,7 @@ public class Menu { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; // 接口实体 - @Entity(context = "api", mapper = AcsTestApiMapper.class) + @Entity(triggers = "api", mapper = AcsTestApiMapper.class) @Bindings({ @Binding(field = "menuId", bindProp = "./id"), @Binding(field = "apiUrl", bindCtx = "apiUrl") diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Role.java b/src/main/java/com/gitee/spring/domain/example/entity/Role.java index e441335..fe02109 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Role.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Role.java @@ -36,7 +36,7 @@ public class Role { private Date updateTime; // 角色菜单关联实体 @JsonIgnore - @Entity(context = "menu", repository = RoleMenuRepository.class) + @Entity(triggers = "menu", repository = RoleMenuRepository.class) @Binding(field = "roleId", bindProp = "./id") private List roleMenus; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java index 3dc1236..048696f 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java @@ -30,10 +30,10 @@ public class RoleGroup { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; // 角色实体 - @Entity(context = "group.roles", mapper = AcsTestRoleMapper.class) + @Entity(triggers = "group.roles", mapper = AcsTestRoleMapper.class) @Bindings({ + @Binding(field = "tenantId", bindProp = "./tenantId"), @Binding(field = "groupId", bindProp = "./id"), - @Binding(field = "tenantId", bindCtx = "tenantId"), @Binding(field = "roleName", bindCtx = "roleName"), }) private List roles; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java index d873c7d..8e3f39d 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java @@ -25,7 +25,7 @@ public class RoleMenu { // 创建时间 private Date createTime; // 菜单实体 - @Entity(context = "menu", repository = MenuRepository.class) + @Entity(triggers = "menu", repository = MenuRepository.class) @Binding(field = "id", bindProp = "./menuId") private List menus; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java index fd8591b..38f14fa 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java @@ -35,11 +35,11 @@ public class Tenant { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; // 部门实体 - @Entity(context = "tenant.depts", repository = DepartmentRepository.class) + @Entity(triggers = "tenant.depts", repository = DepartmentRepository.class) @Binding(field = "tenantId", bindProp = "./id") private List departments; // 角色组实体 - @Entity(context = "tenant.groups", repository = RoleGroupRepository.class) + @Entity(triggers = "tenant.groups", repository = RoleGroupRepository.class) @Binding(field = "tenantId", bindProp = "./id") private List roleGroups; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/User.java b/src/main/java/com/gitee/spring/domain/example/entity/User.java index 6f58f7b..60560aa 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/User.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/User.java @@ -38,7 +38,7 @@ public class User { private Date updateTime; // 用户角色关联实体 @JsonIgnore - @Entity(context = "role", repository = UserRoleRepository.class) + @Entity(triggers = "role", repository = UserRoleRepository.class) @Binding(field = "userId", bindProp = "./id") private List userRoles; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java index ddcac48..8f8df5f 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java @@ -23,7 +23,7 @@ public class UserRole { // 创建时间 private Date createTime; // 角色实体 - @Entity(context = "role", repository = RoleRepository.class) + @Entity(triggers = "role", repository = RoleRepository.class) @Binding(field = "id", bindProp = "./roleId") private List roles; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java b/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java index a846bfc..7e50dfa 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java @@ -22,7 +22,7 @@ public class VisitorUser { // 用户id private Integer userId; // 用户对象 - @Entity(context = "user", mapper = AcsTestUserMapper.class) + @Entity(triggers = "user", mapper = AcsTestUserMapper.class) @Bindings({ @Binding(field = "id", bindProp = "./userId"), @Binding(field = "isMaster", bindCtx = "isMaster"), diff --git a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java b/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java new file mode 100644 index 0000000..dffa8ef --- /dev/null +++ b/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java @@ -0,0 +1,129 @@ +package com.gitee.spring.domain.example.service; + +import cn.hutool.core.lang.Assert; +import com.gitee.spring.domain.core3.entity.BoundedContext; +import com.gitee.spring.domain.example.entity.*; +import com.gitee.spring.domain.example.repository.MenuRepository; +import com.gitee.spring.domain.example.repository.RoleRepository; +import com.gitee.spring.domain.example.repository.TenantRepository; +import com.gitee.spring.domain.example.repository.UserRepository; +import com.gitee.spring.domain.example.repository.VisitorUserRepository; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.Date; + +@Service +@AllArgsConstructor +public class SaasDataService { + + private final TenantRepository tenantRepository; + private final VisitorUserRepository visitorUserRepository; + private final UserRepository userRepository; + private final RoleRepository roleRepository; + private final MenuRepository menuRepository; + + public void init() { + Tenant tenant = new Tenant(); + tenant.setTenantCode("digital_engine"); + tenant.setTenantName("数字引擎"); + tenant.setLogoUrl("https://portrait.gitee.com/uploads/avatars/namespa…3/8859066_digital-engine_1654079160.png!avatar100"); + tenant.setStatus(0); + tenant.setCreateUser("admin"); + tenant.setCreateTime(new Date()); + + Department department = new Department(); + department.setSuperId(null); + department.setDeptCode("default"); + department.setDeptName("默认部门"); + department.setCreateUser("admin"); + department.setCreateTime(new Date()); + tenant.setDepartments(Collections.singletonList(department)); + + User user = new User(); + user.setUserCode("000001"); + user.setUserName("默认用户"); + user.setIsMaster(1); + user.setStatus(0); + user.setCreateUser("admin"); + user.setCreateTime(new Date()); + department.setUsers(Collections.singletonList(user)); + + RoleGroup roleGroup = new RoleGroup(); + roleGroup.setSuperId(null); + roleGroup.setGroupCode("default"); + roleGroup.setGroupName("默认角色组"); + roleGroup.setCreateUser("admin"); + roleGroup.setCreateTime(new Date()); + tenant.setRoleGroups(Collections.singletonList(roleGroup)); + + Role role = new Role(); + role.setRoleCode("system admin"); + role.setRoleName("系统管理员"); + role.setStatus(0); + role.setCreateUser("admin"); + role.setCreateTime(new Date()); + roleGroup.setRoles(Collections.singletonList(role)); + + BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "dept.users", "group.roles"); + int count = tenantRepository.insert(boundedContext, tenant); + Assert.isTrue(count == 5); + + Menu menu = new Menu(); + menu.setSuperId(null); + menu.setMenuCode("default"); + menu.setMenuName("默认菜单"); + menu.setMenuType("nav"); + menu.setMenuIndex(0); + menu.setOnlyAdmin(2); + menu.setCreateUser("admin"); + menu.setCreateTime(new Date()); + + Api api = new Api(); + api.setApiCode("default"); + api.setApiName("默认接口"); + api.setApiUrl("/test"); + api.setCreateUser("admin"); + api.setCreateTime(new Date()); + menu.setApis(Collections.singletonList(api)); + + boundedContext = new BoundedContext("api"); + count = menuRepository.insert(boundedContext, menu); + Assert.isTrue(count == 2); + + VisitorUser visitorUser = new VisitorUser(); + visitorUser.setUserLogin("000001"); + visitorUser.setIsAdmin(2); + visitorUser.setUser(user); + visitorUser.setCreateUser("admin"); + visitorUser.setCreateTime(new Date()); + boundedContext = new BoundedContext("user"); + count = visitorUserRepository.insert(boundedContext, visitorUser); + Assert.isTrue(count == 1); + + UserRole userRole = new UserRole(); + userRole.setRoleId(role.getId()); + userRole.setCreateUser("admin"); + userRole.setCreateTime(new Date()); + user.setUserRoles(Collections.singletonList(userRole)); + boundedContext = new BoundedContext("role"); + count = userRepository.insert(boundedContext, user); + Assert.isTrue(count == 1); + + RoleMenu roleMenu = new RoleMenu(); + roleMenu.setMenuId(menu.getId()); + roleMenu.setDataAuthority(4); + roleMenu.setCreateUser("admin"); + roleMenu.setCreateTime(new Date()); + role.setRoleMenus(Collections.singletonList(roleMenu)); + boundedContext = new BoundedContext("menu"); + count = roleRepository.insert(boundedContext, role); + Assert.isTrue(count == 1); + } + + public void clear() { + + } + +} diff --git a/src/test/java/com/gitee/spring/domain/example/SpringDomainTest02.java b/src/test/java/com/gitee/spring/domain/example/SpringDomainTest02.java index a84ef6b..b9bfd12 100644 --- a/src/test/java/com/gitee/spring/domain/example/SpringDomainTest02.java +++ b/src/test/java/com/gitee/spring/domain/example/SpringDomainTest02.java @@ -6,6 +6,7 @@ import com.gitee.spring.domain.core3.entity.executor.Example; import com.gitee.spring.domain.example.entity.Visitor; import com.gitee.spring.domain.example.entity.VisitorUser; import com.gitee.spring.domain.example.repository.VisitorUserRepository; +import com.gitee.spring.domain.example.service.SaasDataService; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; @@ -25,9 +26,18 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class SpringDomainTest02 { + @Autowired + private SaasDataService saasDataService; @Autowired private VisitorUserRepository visitorUserRepository; + @Test + @Order(1) + @DisplayName("测试新增逻辑") + public void test01() { + saasDataService.init(); + } + @Test @Order(2) @DisplayName("测试查询逻辑") -- Gitee From 6d58e975929a90af82f4effd99b70d81e4a32bb3 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Wed, 2 Nov 2022 12:08:18 +0800 Subject: [PATCH 03/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/domain/example/entity/Api.java | 2 - .../domain/example/entity/Department.java | 4 +- .../spring/domain/example/entity/Menu.java | 3 - .../spring/domain/example/entity/Role.java | 5 - .../domain/example/entity/RoleGroup.java | 4 +- .../spring/domain/example/entity/Tenant.java | 7 +- .../spring/domain/example/entity/User.java | 5 - .../domain/example/entity/VisitorUser.java | 2 - .../example/service/SaasDataService.java | 97 +++++++++++-------- .../spring/domain/example/BinderTest.java | 71 ++++++++++++++ ...{SpringDomainTest02.java => CRUDTest.java} | 46 ++++++++- 11 files changed, 175 insertions(+), 71 deletions(-) create mode 100644 src/test/java/com/gitee/spring/domain/example/BinderTest.java rename src/test/java/com/gitee/spring/domain/example/{SpringDomainTest02.java => CRUDTest.java} (54%) diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Api.java b/src/main/java/com/gitee/spring/domain/example/entity/Api.java index 2f19305..5d479f9 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Api.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Api.java @@ -1,6 +1,5 @@ package com.gitee.spring.domain.example.entity; -import com.fasterxml.jackson.annotation.JsonFormat; import com.gitee.spring.domain.core3.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestApiMapper; import lombok.Data; @@ -23,6 +22,5 @@ public class Api { // 创建者 private String createUser; // 创建时间 - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Department.java b/src/main/java/com/gitee/spring/domain/example/entity/Department.java index a6ef69f..a11a515 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Department.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Department.java @@ -1,6 +1,5 @@ package com.gitee.spring.domain.example.entity; -import com.fasterxml.jackson.annotation.JsonFormat; import com.gitee.spring.domain.core3.annotation.Binding; import com.gitee.spring.domain.core3.annotation.Bindings; import com.gitee.spring.domain.core3.annotation.Entity; @@ -27,10 +26,9 @@ public class Department { // 创建者 private String createUser; // 创建时间 - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; // 用户实体 - @Entity(triggers = "dept.users", mapper = AcsTestUserMapper.class) + @Entity(triggers = "users", mapper = AcsTestUserMapper.class) @Bindings({ @Binding(field = "tenantId", bindProp = "./tenantId"), @Binding(field = "deptId", bindProp = "./id"), diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java index 23bb685..3d9719a 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java @@ -1,6 +1,5 @@ package com.gitee.spring.domain.example.entity; -import com.fasterxml.jackson.annotation.JsonFormat; import com.gitee.spring.domain.core3.annotation.Binding; import com.gitee.spring.domain.core3.annotation.Bindings; import com.gitee.spring.domain.core3.annotation.Entity; @@ -33,10 +32,8 @@ public class Menu { // 创建者 private String createUser; // 创建时间 - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; // 更新时间 - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; // 接口实体 @Entity(triggers = "api", mapper = AcsTestApiMapper.class) diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Role.java b/src/main/java/com/gitee/spring/domain/example/entity/Role.java index fe02109..8e60022 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Role.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Role.java @@ -1,7 +1,5 @@ package com.gitee.spring.domain.example.entity; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.gitee.spring.domain.core3.annotation.Binding; import com.gitee.spring.domain.core3.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; @@ -29,13 +27,10 @@ public class Role { // 创建者 private String createUser; // 创建时间 - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; // 更新时间 - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; // 角色菜单关联实体 - @JsonIgnore @Entity(triggers = "menu", repository = RoleMenuRepository.class) @Binding(field = "roleId", bindProp = "./id") private List roleMenus; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java index 048696f..5e6935b 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java @@ -1,6 +1,5 @@ package com.gitee.spring.domain.example.entity; -import com.fasterxml.jackson.annotation.JsonFormat; import com.gitee.spring.domain.core3.annotation.Binding; import com.gitee.spring.domain.core3.annotation.Bindings; import com.gitee.spring.domain.core3.annotation.Entity; @@ -27,10 +26,9 @@ public class RoleGroup { // 创建者 private String createUser; // 创建时间 - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; // 角色实体 - @Entity(triggers = "group.roles", mapper = AcsTestRoleMapper.class) + @Entity(triggers = "roles", mapper = AcsTestRoleMapper.class) @Bindings({ @Binding(field = "tenantId", bindProp = "./tenantId"), @Binding(field = "groupId", bindProp = "./id"), diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java index 38f14fa..b158661 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java @@ -1,6 +1,5 @@ package com.gitee.spring.domain.example.entity; -import com.fasterxml.jackson.annotation.JsonFormat; import com.gitee.spring.domain.core3.annotation.Binding; import com.gitee.spring.domain.core3.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestTenantMapper; @@ -27,19 +26,17 @@ public class Tenant { // 创建者 private String createUser; // 创建时间 - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; // 更新者 private String updateUser; // 更新时间 - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; // 部门实体 - @Entity(triggers = "tenant.depts", repository = DepartmentRepository.class) + @Entity(triggers = "departments", repository = DepartmentRepository.class) @Binding(field = "tenantId", bindProp = "./id") private List departments; // 角色组实体 - @Entity(triggers = "tenant.groups", repository = RoleGroupRepository.class) + @Entity(triggers = "roleGroups", repository = RoleGroupRepository.class) @Binding(field = "tenantId", bindProp = "./id") private List roleGroups; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/User.java b/src/main/java/com/gitee/spring/domain/example/entity/User.java index 60560aa..bda8fe0 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/User.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/User.java @@ -1,7 +1,5 @@ package com.gitee.spring.domain.example.entity; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.gitee.spring.domain.core3.annotation.Binding; import com.gitee.spring.domain.core3.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestUserMapper; @@ -31,13 +29,10 @@ public class User { // 创建者 private String createUser; // 创建时间 - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; // 更新时间 - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; // 用户角色关联实体 - @JsonIgnore @Entity(triggers = "role", repository = UserRoleRepository.class) @Binding(field = "userId", bindProp = "./id") private List userRoles; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java b/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java index 7e50dfa..e028a5b 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java @@ -1,6 +1,5 @@ package com.gitee.spring.domain.example.entity; -import com.fasterxml.jackson.annotation.JsonFormat; import com.gitee.spring.domain.core3.annotation.Binding; import com.gitee.spring.domain.core3.annotation.Bindings; import com.gitee.spring.domain.core3.annotation.Entity; @@ -32,6 +31,5 @@ public class VisitorUser { // 创建者 private String createUser; // 创建时间 - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; } diff --git a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java b/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java index dffa8ef..3917da1 100644 --- a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java +++ b/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java @@ -2,17 +2,15 @@ package com.gitee.spring.domain.example.service; import cn.hutool.core.lang.Assert; import com.gitee.spring.domain.core3.entity.BoundedContext; +import com.gitee.spring.domain.core3.entity.executor.Example; import com.gitee.spring.domain.example.entity.*; -import com.gitee.spring.domain.example.repository.MenuRepository; -import com.gitee.spring.domain.example.repository.RoleRepository; -import com.gitee.spring.domain.example.repository.TenantRepository; -import com.gitee.spring.domain.example.repository.UserRepository; -import com.gitee.spring.domain.example.repository.VisitorUserRepository; +import com.gitee.spring.domain.example.repository.*; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.Date; +import java.util.List; @Service @AllArgsConstructor @@ -24,56 +22,58 @@ public class SaasDataService { private final RoleRepository roleRepository; private final MenuRepository menuRepository; - public void init() { + public void newTenant() { Tenant tenant = new Tenant(); - tenant.setTenantCode("digital_engine"); - tenant.setTenantName("数字引擎"); - tenant.setLogoUrl("https://portrait.gitee.com/uploads/avatars/namespa…3/8859066_digital-engine_1654079160.png!avatar100"); + tenant.setTenantCode("tenant"); + tenant.setTenantName("租户"); + tenant.setLogoUrl("https://gitee.com/digital-engine/spring-domain-example"); tenant.setStatus(0); tenant.setCreateUser("admin"); tenant.setCreateTime(new Date()); Department department = new Department(); department.setSuperId(null); - department.setDeptCode("default"); - department.setDeptName("默认部门"); + department.setDeptCode("dept"); + department.setDeptName("部门"); department.setCreateUser("admin"); department.setCreateTime(new Date()); tenant.setDepartments(Collections.singletonList(department)); + RoleGroup roleGroup = new RoleGroup(); + roleGroup.setSuperId(null); + roleGroup.setGroupCode("group"); + roleGroup.setGroupName("角色组"); + roleGroup.setCreateUser("admin"); + roleGroup.setCreateTime(new Date()); + tenant.setRoleGroups(Collections.singletonList(roleGroup)); + User user = new User(); user.setUserCode("000001"); - user.setUserName("默认用户"); + user.setUserName("用户"); user.setIsMaster(1); user.setStatus(0); user.setCreateUser("admin"); user.setCreateTime(new Date()); department.setUsers(Collections.singletonList(user)); - RoleGroup roleGroup = new RoleGroup(); - roleGroup.setSuperId(null); - roleGroup.setGroupCode("default"); - roleGroup.setGroupName("默认角色组"); - roleGroup.setCreateUser("admin"); - roleGroup.setCreateTime(new Date()); - tenant.setRoleGroups(Collections.singletonList(roleGroup)); - Role role = new Role(); - role.setRoleCode("system admin"); - role.setRoleName("系统管理员"); + role.setRoleCode("admin"); + role.setRoleName("管理员"); role.setStatus(0); role.setCreateUser("admin"); role.setCreateTime(new Date()); roleGroup.setRoles(Collections.singletonList(role)); - BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "dept.users", "group.roles"); + BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); int count = tenantRepository.insert(boundedContext, tenant); Assert.isTrue(count == 5); + } + public void newMenu() { Menu menu = new Menu(); menu.setSuperId(null); - menu.setMenuCode("default"); - menu.setMenuName("默认菜单"); + menu.setMenuCode("menu"); + menu.setMenuName("菜单"); menu.setMenuType("nav"); menu.setMenuIndex(0); menu.setOnlyAdmin(2); @@ -81,45 +81,60 @@ public class SaasDataService { menu.setCreateTime(new Date()); Api api = new Api(); - api.setApiCode("default"); - api.setApiName("默认接口"); + api.setApiCode("api"); + api.setApiName("接口"); api.setApiUrl("/test"); api.setCreateUser("admin"); api.setCreateTime(new Date()); menu.setApis(Collections.singletonList(api)); - boundedContext = new BoundedContext("api"); - count = menuRepository.insert(boundedContext, menu); + BoundedContext boundedContext = new BoundedContext("api"); + int count = menuRepository.insert(boundedContext, menu); Assert.isTrue(count == 2); + } + + public void newBindings() { + BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); + Example example = new Example(); + example.orderByDesc("id"); + example.startPage(1, 1); + List tenants = tenantRepository.selectByExample(boundedContext, example); + Tenant tenant = tenants.get(0); + Department department = tenant.getDepartments().get(0); + RoleGroup roleGroup = tenant.getRoleGroups().get(0); + User user = department.getUsers().get(0); + Role role = roleGroup.getRoles().get(0); + + boundedContext = new BoundedContext("api"); + Example example1 = new Example(); + example1.orderByDesc("id"); + example1.startPage(1, 1); + List menus = menuRepository.selectByExample(boundedContext, example1); + Menu menu = menus.get(0); VisitorUser visitorUser = new VisitorUser(); visitorUser.setUserLogin("000001"); visitorUser.setIsAdmin(2); - visitorUser.setUser(user); visitorUser.setCreateUser("admin"); visitorUser.setCreateTime(new Date()); - boundedContext = new BoundedContext("user"); - count = visitorUserRepository.insert(boundedContext, visitorUser); - Assert.isTrue(count == 1); + visitorUser.setUser(user); UserRole userRole = new UserRole(); - userRole.setRoleId(role.getId()); userRole.setCreateUser("admin"); userRole.setCreateTime(new Date()); user.setUserRoles(Collections.singletonList(userRole)); - boundedContext = new BoundedContext("role"); - count = userRepository.insert(boundedContext, user); - Assert.isTrue(count == 1); + userRole.setRoles(Collections.singletonList(role)); RoleMenu roleMenu = new RoleMenu(); - roleMenu.setMenuId(menu.getId()); roleMenu.setDataAuthority(4); roleMenu.setCreateUser("admin"); roleMenu.setCreateTime(new Date()); role.setRoleMenus(Collections.singletonList(roleMenu)); - boundedContext = new BoundedContext("menu"); - count = roleRepository.insert(boundedContext, role); - Assert.isTrue(count == 1); + roleMenu.setMenus(Collections.singletonList(menu)); + + boundedContext = new BoundedContext("user", "role", "menu", "api"); + int count = visitorUserRepository.insert(boundedContext, visitorUser); + Assert.isTrue(count == 3); } public void clear() { diff --git a/src/test/java/com/gitee/spring/domain/example/BinderTest.java b/src/test/java/com/gitee/spring/domain/example/BinderTest.java new file mode 100644 index 0000000..e03e54d --- /dev/null +++ b/src/test/java/com/gitee/spring/domain/example/BinderTest.java @@ -0,0 +1,71 @@ +package com.gitee.spring.domain.example; + +import com.gitee.spring.domain.core3.api.Binder; +import com.gitee.spring.domain.core3.impl.binder.ContextBinder; +import com.gitee.spring.domain.core3.impl.binder.PropertyBinder; +import com.gitee.spring.domain.core3.impl.resolver.BinderResolver; +import com.gitee.spring.domain.core3.repository.ConfiguredRepository; +import com.gitee.spring.domain.example.repository.DepartmentRepository; +import com.gitee.spring.domain.example.repository.VisitorUserRepository; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +@Slf4j +@SpringBootTest +@DisplayName("测试解析逻辑") +public class BinderTest { + + @Autowired + private DepartmentRepository departmentRepository; + @Autowired + private VisitorUserRepository visitorUserRepository; + + @Test + @DisplayName("测试绑定器解析逻辑") + public void test01() { + Map allRepositoryMap = departmentRepository.getAllRepositoryMap(); + ConfiguredRepository repository = allRepositoryMap.get("/users"); + BinderResolver binderResolver = repository.getBinderResolver(); + + List allBinders = binderResolver.getAllBinders(); + List propertyBinders = binderResolver.getPropertyBinders(); + List contextBinders = binderResolver.getContextBinders(); + List boundValueBinders = binderResolver.getBoundValueBinders(); + PropertyBinder boundIdBinder = binderResolver.getBoundIdBinder(); + + assumeTrue(allBinders.size() == 5); + assumeTrue(propertyBinders.size() == 2); + assumeTrue(contextBinders.size() == 3); + assumeTrue(boundValueBinders.size() == 5); + assumeTrue(boundIdBinder == null); + } + + @Test + @DisplayName("测试绑定器解析逻辑(绑定id值)") + public void test02() { + Map allRepositoryMap = visitorUserRepository.getAllRepositoryMap(); + ConfiguredRepository repository = allRepositoryMap.get("/user"); + BinderResolver binderResolver = repository.getBinderResolver(); + + List allBinders = binderResolver.getAllBinders(); + List propertyBinders = binderResolver.getPropertyBinders(); + List contextBinders = binderResolver.getContextBinders(); + List boundValueBinders = binderResolver.getBoundValueBinders(); + PropertyBinder boundIdBinder = binderResolver.getBoundIdBinder(); + + assumeTrue(allBinders.size() == 3); + assumeTrue(propertyBinders.size() == 1); + assumeTrue(contextBinders.size() == 2); + assumeTrue(boundValueBinders.size() == 2); + assumeTrue(boundIdBinder != null); + } + +} diff --git a/src/test/java/com/gitee/spring/domain/example/SpringDomainTest02.java b/src/test/java/com/gitee/spring/domain/example/CRUDTest.java similarity index 54% rename from src/test/java/com/gitee/spring/domain/example/SpringDomainTest02.java rename to src/test/java/com/gitee/spring/domain/example/CRUDTest.java index b9bfd12..132d06a 100644 --- a/src/test/java/com/gitee/spring/domain/example/SpringDomainTest02.java +++ b/src/test/java/com/gitee/spring/domain/example/CRUDTest.java @@ -3,8 +3,10 @@ package com.gitee.spring.domain.example; import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core3.entity.BoundedContext; import com.gitee.spring.domain.core3.entity.executor.Example; +import com.gitee.spring.domain.example.entity.Tenant; import com.gitee.spring.domain.example.entity.Visitor; import com.gitee.spring.domain.example.entity.VisitorUser; +import com.gitee.spring.domain.example.repository.TenantRepository; import com.gitee.spring.domain.example.repository.VisitorUserRepository; import com.gitee.spring.domain.example.service.SaasDataService; import lombok.extern.slf4j.Slf4j; @@ -16,7 +18,9 @@ import org.junit.jupiter.api.TestMethodOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; import static org.junit.jupiter.api.Assumptions.assumeTrue; @@ -24,18 +28,22 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; @SpringBootTest @DisplayName("测试增、删、改、查逻辑") @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class SpringDomainTest02 { +public class CRUDTest { @Autowired private SaasDataService saasDataService; @Autowired + private TenantRepository tenantRepository; + @Autowired private VisitorUserRepository visitorUserRepository; @Test @Order(1) @DisplayName("测试新增逻辑") public void test01() { - saasDataService.init(); + saasDataService.newTenant(); + saasDataService.newMenu(); + saasDataService.newBindings(); } @Test @@ -51,4 +59,38 @@ public class SpringDomainTest02 { assumeTrue(visitor.getVisitorUsers().size() > 0); } + @Test + @Order(3) + @DisplayName("测试更新逻辑") + public void test03() { + BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "dept.users", "group.roles"); + Example entityExample = new Example(); + entityExample.eq("tenantCode", "digital_engine"); + List tenants = tenantRepository.selectByExample(boundedContext, entityExample); + Tenant tenant = tenants.get(0); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenant))); + + // 非空更新 + tenant.setStatus(1); + int count = tenantRepository.update(boundedContext, tenant); + assumeTrue(count == 5); + + // 强制更新 + boundedContext = new BoundedContext(); + Set fieldNames = new LinkedHashSet<>(); + fieldNames.add("logoUrl"); + boundedContext.put("#forceUpdate", fieldNames); + + tenant.setLogoUrl(null); + count = tenantRepository.update(boundedContext, tenant); + assumeTrue(count == 1); + } + + @Test + @Order(4) + @DisplayName("测试删除逻辑") + public void test04() { + saasDataService.clear(); + } + } -- Gitee From df9de36eac8810ec5c85fc1f11687cf30d8eb9e8 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Wed, 2 Nov 2022 17:27:31 +0800 Subject: [PATCH 04/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5=E6=A1=88?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/example/entity/RoleMenu.java | 7 ++-- .../spring/domain/example/entity/Tenant.java | 2 +- .../domain/example/entity/UserRole.java | 7 ++-- .../example/repository/ApiRepository.java | 15 +++++++++ .../example/repository/TenantRepository.java | 2 +- .../repository/VisitorUserRepository.java | 2 +- .../example/service/SaasDataService.java | 32 ++++++++++++++++--- .../gitee/spring/domain/example/CRUDTest.java | 16 +++++----- 8 files changed, 60 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java index 8e3f39d..43b569f 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java @@ -2,12 +2,11 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core3.annotation.Binding; import com.gitee.spring.domain.core3.annotation.Entity; +import com.gitee.spring.domain.example.mapper.AcsTestMenuMapper; import com.gitee.spring.domain.example.mapper.AcsTestRoleMenuMapper; -import com.gitee.spring.domain.example.repository.MenuRepository; import lombok.Data; import java.util.Date; -import java.util.List; @Data @Entity(mapper = AcsTestRoleMenuMapper.class) @@ -25,7 +24,7 @@ public class RoleMenu { // 创建时间 private Date createTime; // 菜单实体 - @Entity(triggers = "menu", repository = MenuRepository.class) + @Entity(triggers = "menu", mapper = AcsTestMenuMapper.class) @Binding(field = "id", bindProp = "./menuId") - private List menus; + private Menu menu; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java index b158661..b2d918c 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java @@ -11,7 +11,7 @@ import java.util.Date; import java.util.List; @Data -@Entity(mapper = AcsTestTenantMapper.class) +@Entity(mapper = AcsTestTenantMapper.class, nullableKey = "tenant.nullable") public class Tenant { // 主键 private Integer id; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java index 8f8df5f..c503299 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java @@ -2,12 +2,11 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core3.annotation.Binding; import com.gitee.spring.domain.core3.annotation.Entity; +import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; import com.gitee.spring.domain.example.mapper.AcsTestUserRoleMapper; -import com.gitee.spring.domain.example.repository.RoleRepository; import lombok.Data; import java.util.Date; -import java.util.List; @Data @Entity(mapper = AcsTestUserRoleMapper.class) @@ -23,7 +22,7 @@ public class UserRole { // 创建时间 private Date createTime; // 角色实体 - @Entity(triggers = "role", repository = RoleRepository.class) + @Entity(triggers = "role", mapper = AcsTestRoleMapper.class) @Binding(field = "id", bindProp = "./roleId") - private List roles; + private Role role; } diff --git a/src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java new file mode 100644 index 0000000..4e41f2f --- /dev/null +++ b/src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java @@ -0,0 +1,15 @@ +package com.gitee.spring.domain.example.repository; + +import com.gitee.spring.boot.starter.domain.annotation.RootRepository; +import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; +import com.gitee.spring.domain.example.entity.Api; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@RootRepository +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class ApiRepository extends MybatisPlusRepository { +} diff --git a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java index a2b9a0a..8445762 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java @@ -8,8 +8,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; @Data +@RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) -@RootRepository(scanPackages = "com.gitee.spring.domain.example.coating.tenant") public class TenantRepository extends MybatisPlusRepository { } diff --git a/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java index 199c652..eda9b9e 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java @@ -8,8 +8,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; @Data +@RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) -@RootRepository(scanPackages = "com.gitee.spring.domain.example.coating.visitor") public class VisitorUserRepository extends MybatisPlusRepository { } diff --git a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java b/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java index 3917da1..565e77b 100644 --- a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java +++ b/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java @@ -17,10 +17,18 @@ import java.util.List; public class SaasDataService { private final TenantRepository tenantRepository; - private final VisitorUserRepository visitorUserRepository; + private final DepartmentRepository departmentRepository; + private final RoleGroupRepository roleGroupRepository; private final UserRepository userRepository; private final RoleRepository roleRepository; + private final MenuRepository menuRepository; + private final ApiRepository apiRepository; + + private final VisitorUserRepository visitorUserRepository; + private final UserRoleRepository userRoleRepository; + private final RoleMenuRepository roleMenuRepository; + public void newTenant() { Tenant tenant = new Tenant(); @@ -69,7 +77,7 @@ public class SaasDataService { Assert.isTrue(count == 5); } - public void newMenu() { + public void newMenuAndApi() { Menu menu = new Menu(); menu.setSuperId(null); menu.setMenuCode("menu"); @@ -123,14 +131,14 @@ public class SaasDataService { userRole.setCreateUser("admin"); userRole.setCreateTime(new Date()); user.setUserRoles(Collections.singletonList(userRole)); - userRole.setRoles(Collections.singletonList(role)); + userRole.setRole(role); RoleMenu roleMenu = new RoleMenu(); roleMenu.setDataAuthority(4); roleMenu.setCreateUser("admin"); roleMenu.setCreateTime(new Date()); role.setRoleMenus(Collections.singletonList(roleMenu)); - roleMenu.setMenus(Collections.singletonList(menu)); + roleMenu.setMenu(menu); boundedContext = new BoundedContext("user", "role", "menu", "api"); int count = visitorUserRepository.insert(boundedContext, visitorUser); @@ -138,7 +146,23 @@ public class SaasDataService { } public void clear() { + BoundedContext boundedContext = new BoundedContext(); + Example example = new Example(); + + int count = tenantRepository.deleteByExample(boundedContext, example); + count += departmentRepository.deleteByExample(boundedContext, example); + count += roleGroupRepository.deleteByExample(boundedContext, example); + count += userRepository.deleteByExample(boundedContext, example); + count += roleRepository.deleteByExample(boundedContext, example); + + count += menuRepository.deleteByExample(boundedContext, example); + count += apiRepository.deleteByExample(boundedContext, example); + + count += visitorUserRepository.deleteByExample(boundedContext, example); + count += userRoleRepository.deleteByExample(boundedContext, example); + count += roleMenuRepository.deleteByExample(boundedContext, example); + Assert.isTrue(count > 0); } } diff --git a/src/test/java/com/gitee/spring/domain/example/CRUDTest.java b/src/test/java/com/gitee/spring/domain/example/CRUDTest.java index 132d06a..f2a9d22 100644 --- a/src/test/java/com/gitee/spring/domain/example/CRUDTest.java +++ b/src/test/java/com/gitee/spring/domain/example/CRUDTest.java @@ -42,7 +42,7 @@ public class CRUDTest { @DisplayName("测试新增逻辑") public void test01() { saasDataService.newTenant(); - saasDataService.newMenu(); + saasDataService.newMenuAndApi(); saasDataService.newBindings(); } @@ -51,8 +51,7 @@ public class CRUDTest { @DisplayName("测试查询逻辑") public void test02() { BoundedContext boundedContext = new BoundedContext("user", "role", "menu", "api"); - Example example = new Example(); - example.eq("userLogin", "000001"); + Example example = new Example().eq("userLogin", "000001"); List visitorUsers = visitorUserRepository.selectByExample(boundedContext, example); Visitor visitor = new Visitor(visitorUsers); log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(visitor))); @@ -63,10 +62,9 @@ public class CRUDTest { @Order(3) @DisplayName("测试更新逻辑") public void test03() { - BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "dept.users", "group.roles"); - Example entityExample = new Example(); - entityExample.eq("tenantCode", "digital_engine"); - List tenants = tenantRepository.selectByExample(boundedContext, entityExample); + BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); + Example example = new Example().eq("tenantCode", "tenant"); + List tenants = tenantRepository.selectByExample(boundedContext, example); Tenant tenant = tenants.get(0); log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenant))); @@ -77,11 +75,13 @@ public class CRUDTest { // 强制更新 boundedContext = new BoundedContext(); + Set fieldNames = new LinkedHashSet<>(); fieldNames.add("logoUrl"); - boundedContext.put("#forceUpdate", fieldNames); + boundedContext.put("tenant.nullable", fieldNames); tenant.setLogoUrl(null); + count = tenantRepository.update(boundedContext, tenant); assumeTrue(count == 1); } -- Gitee From 927b826b14756c04d9ed01be865ad785708af71f Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 3 Nov 2022 16:48:32 +0800 Subject: [PATCH 05/42] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=903.0.0?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/spring/domain/example/service/SaasDataService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java b/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java index 565e77b..18e4e29 100644 --- a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java +++ b/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java @@ -29,7 +29,6 @@ public class SaasDataService { private final UserRoleRepository userRoleRepository; private final RoleMenuRepository roleMenuRepository; - public void newTenant() { Tenant tenant = new Tenant(); tenant.setTenantCode("tenant"); -- Gitee From 064e7accca1468f9fe118e849f8e604a70cb8586 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 4 Nov 2022 18:20:26 +0800 Subject: [PATCH 06/42] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d42376c..86f5820 100644 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,7 @@ com.gitee.digital-engine - spring-boot-starter-domain + spring-boot-starter-domain3 3.0.0 -- Gitee From c5bc58e9ececc3d62b5422e8499748cc1d5408b1 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 4 Nov 2022 18:29:12 +0800 Subject: [PATCH 07/42] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/spring/domain/example/repository/ApiRepository.java | 2 +- .../spring/domain/example/repository/DepartmentRepository.java | 2 +- .../gitee/spring/domain/example/repository/MenuRepository.java | 2 +- .../spring/domain/example/repository/RoleGroupRepository.java | 2 +- .../spring/domain/example/repository/RoleMenuRepository.java | 2 +- .../gitee/spring/domain/example/repository/RoleRepository.java | 2 +- .../spring/domain/example/repository/TenantRepository.java | 2 +- .../gitee/spring/domain/example/repository/UserRepository.java | 2 +- .../spring/domain/example/repository/UserRoleRepository.java | 2 +- .../spring/domain/example/repository/VisitorUserRepository.java | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java index 4e41f2f..3195bea 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; +import com.gitee.spring.boot.starter.domain3.annotation.RootRepository; import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Api; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java index f279aa2..b20371e 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; +import com.gitee.spring.boot.starter.domain3.annotation.RootRepository; import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Department; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java index dc8c119..30fdede 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; +import com.gitee.spring.boot.starter.domain3.annotation.RootRepository; import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Menu; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java index 3e8c742..f782b25 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; +import com.gitee.spring.boot.starter.domain3.annotation.RootRepository; import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.RoleGroup; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java index d8cb97d..79b7c2d 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; +import com.gitee.spring.boot.starter.domain3.annotation.RootRepository; import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.RoleMenu; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java index 2744b6c..4426fe2 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; +import com.gitee.spring.boot.starter.domain3.annotation.RootRepository; import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Role; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java index 8445762..5c497f7 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; +import com.gitee.spring.boot.starter.domain3.annotation.RootRepository; import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Tenant; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java index 06c111f..503a65a 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; +import com.gitee.spring.boot.starter.domain3.annotation.RootRepository; import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.User; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java index 1af7872..6c04c14 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; +import com.gitee.spring.boot.starter.domain3.annotation.RootRepository; import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.UserRole; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java index eda9b9e..6e1a9d1 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; +import com.gitee.spring.boot.starter.domain3.annotation.RootRepository; import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.VisitorUser; import lombok.AllArgsConstructor; -- Gitee From c63d491750b13a46f7069270a213f5fb733f3b25 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 7 Nov 2022 23:37:11 +0800 Subject: [PATCH 08/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=8F=8D=E5=90=91=E6=9F=A5=E8=AF=A2=E6=A1=88?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/domain/example/entity/Api.java | 2 +- .../domain/example/entity/Department.java | 6 +-- .../spring/domain/example/entity/Menu.java | 6 +-- .../spring/domain/example/entity/Role.java | 4 +- .../domain/example/entity/RoleGroup.java | 6 +-- .../domain/example/entity/RoleMenu.java | 4 +- .../spring/domain/example/entity/Tenant.java | 4 +- .../spring/domain/example/entity/User.java | 4 +- .../domain/example/entity/UserRole.java | 4 +- .../domain/example/entity/VisitorUser.java | 6 +-- .../example/entity/coating/TenantQuery.java | 19 ++++++++++ .../example/repository/ApiRepository.java | 2 +- .../repository/DepartmentRepository.java | 2 +- .../example/repository/MenuRepository.java | 2 +- .../repository/RoleGroupRepository.java | 2 +- .../repository/RoleMenuRepository.java | 2 +- .../example/repository/RoleRepository.java | 2 +- .../example/repository/TenantRepository.java | 6 ++- .../example/repository/UserRepository.java | 2 +- .../repository/UserRoleRepository.java | 2 +- .../repository/VisitorUserRepository.java | 2 +- .../example/service/SaasDataService.java | 4 +- src/main/resources/application.yml | 2 + .../spring/domain/example/BinderTest.java | 10 ++--- .../gitee/spring/domain/example/CRUDTest.java | 4 +- .../spring/domain/example/CoatingTest.java | 38 +++++++++++++++++++ 26 files changed, 105 insertions(+), 42 deletions(-) create mode 100644 src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java create mode 100644 src/test/java/com/gitee/spring/domain/example/CoatingTest.java diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Api.java b/src/main/java/com/gitee/spring/domain/example/entity/Api.java index 5d479f9..6073b23 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Api.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Api.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core3.annotation.Entity; +import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestApiMapper; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Department.java b/src/main/java/com/gitee/spring/domain/example/entity/Department.java index a11a515..34fefe5 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Department.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Department.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core3.annotation.Binding; -import com.gitee.spring.domain.core3.annotation.Bindings; -import com.gitee.spring.domain.core3.annotation.Entity; +import com.gitee.spring.domain.core.annotation.Binding; +import com.gitee.spring.domain.core.annotation.Bindings; +import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestDeptMapper; import com.gitee.spring.domain.example.mapper.AcsTestUserMapper; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java index 3d9719a..12f6fb4 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core3.annotation.Binding; -import com.gitee.spring.domain.core3.annotation.Bindings; -import com.gitee.spring.domain.core3.annotation.Entity; +import com.gitee.spring.domain.core.annotation.Binding; +import com.gitee.spring.domain.core.annotation.Bindings; +import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestApiMapper; import com.gitee.spring.domain.example.mapper.AcsTestMenuMapper; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Role.java b/src/main/java/com/gitee/spring/domain/example/entity/Role.java index 8e60022..6ff84ae 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Role.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Role.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core3.annotation.Binding; -import com.gitee.spring.domain.core3.annotation.Entity; +import com.gitee.spring.domain.core.annotation.Binding; +import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; import com.gitee.spring.domain.example.repository.RoleMenuRepository; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java index 5e6935b..0dd4a6e 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core3.annotation.Binding; -import com.gitee.spring.domain.core3.annotation.Bindings; -import com.gitee.spring.domain.core3.annotation.Entity; +import com.gitee.spring.domain.core.annotation.Binding; +import com.gitee.spring.domain.core.annotation.Bindings; +import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestRoleGroupMapper; import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java index 43b569f..b2cbcf7 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core3.annotation.Binding; -import com.gitee.spring.domain.core3.annotation.Entity; +import com.gitee.spring.domain.core.annotation.Binding; +import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestMenuMapper; import com.gitee.spring.domain.example.mapper.AcsTestRoleMenuMapper; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java index b2d918c..a9fc06d 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core3.annotation.Binding; -import com.gitee.spring.domain.core3.annotation.Entity; +import com.gitee.spring.domain.core.annotation.Binding; +import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestTenantMapper; import com.gitee.spring.domain.example.repository.DepartmentRepository; import com.gitee.spring.domain.example.repository.RoleGroupRepository; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/User.java b/src/main/java/com/gitee/spring/domain/example/entity/User.java index bda8fe0..59c9327 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/User.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/User.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core3.annotation.Binding; -import com.gitee.spring.domain.core3.annotation.Entity; +import com.gitee.spring.domain.core.annotation.Binding; +import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestUserMapper; import com.gitee.spring.domain.example.repository.UserRoleRepository; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java index c503299..41d9bb4 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core3.annotation.Binding; -import com.gitee.spring.domain.core3.annotation.Entity; +import com.gitee.spring.domain.core.annotation.Binding; +import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; import com.gitee.spring.domain.example.mapper.AcsTestUserRoleMapper; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java b/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java index e028a5b..e55dab0 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core3.annotation.Binding; -import com.gitee.spring.domain.core3.annotation.Bindings; -import com.gitee.spring.domain.core3.annotation.Entity; +import com.gitee.spring.domain.core.annotation.Binding; +import com.gitee.spring.domain.core.annotation.Bindings; +import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.example.mapper.AcsTestUserMapper; import com.gitee.spring.domain.example.mapper.AcsTestVisitorUserMapper; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java b/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java new file mode 100644 index 0000000..e1b2b22 --- /dev/null +++ b/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java @@ -0,0 +1,19 @@ +package com.gitee.spring.domain.example.entity.coating; + +import com.gitee.spring.domain.coating.annotation.Coating; +import lombok.Data; + +@Data +@Coating +public class TenantQuery { + // 租户编码 + private String tenantCode; + // 部门编码 + private String deptCode; + // 用户编码 + private String userCode; + // 页码 + private Long pageNum; + // 条目数 + private Long pageSize; +} diff --git a/src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java index 4e41f2f..6c0a7b2 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Api; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java index f279aa2..30c8b65 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Department; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java index dc8c119..4aecc9f 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Menu; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java index 3e8c742..c52d22a 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.RoleGroup; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java index d8cb97d..34d3939 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.RoleMenu; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java index 2744b6c..cde16ae 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Role; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java index 8445762..8febae0 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java @@ -1,15 +1,19 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; +import com.gitee.spring.domain.coating.annotation.CoatingScan; +import com.gitee.spring.domain.event.annotation.EnableEvent; import com.gitee.spring.domain.example.entity.Tenant; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @Data +@EnableEvent @RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) +@CoatingScan("com.gitee.spring.domain.example.entity.coating") public class TenantRepository extends MybatisPlusRepository { } diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java index 06c111f..27a4542 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.User; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java index 1af7872..0e2caa1 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.UserRole; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java index eda9b9e..2e1848f 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain3.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.VisitorUser; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java b/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java index 565e77b..42331e6 100644 --- a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java +++ b/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.service; import cn.hutool.core.lang.Assert; -import com.gitee.spring.domain.core3.entity.BoundedContext; -import com.gitee.spring.domain.core3.entity.executor.Example; +import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.core.entity.executor.Example; import com.gitee.spring.domain.example.entity.*; import com.gitee.spring.domain.example.repository.*; import lombok.AllArgsConstructor; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b389ebc..ada9c41 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -6,5 +6,7 @@ spring: active: db mybatis-plus: + global-config: + enable-sql-runner: true configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 是否将sql打印到控制面板(该配置会将sql语句和查询的结果都打印到控制台) \ No newline at end of file diff --git a/src/test/java/com/gitee/spring/domain/example/BinderTest.java b/src/test/java/com/gitee/spring/domain/example/BinderTest.java index e03e54d..167b71d 100644 --- a/src/test/java/com/gitee/spring/domain/example/BinderTest.java +++ b/src/test/java/com/gitee/spring/domain/example/BinderTest.java @@ -1,10 +1,10 @@ package com.gitee.spring.domain.example; -import com.gitee.spring.domain.core3.api.Binder; -import com.gitee.spring.domain.core3.impl.binder.ContextBinder; -import com.gitee.spring.domain.core3.impl.binder.PropertyBinder; -import com.gitee.spring.domain.core3.impl.resolver.BinderResolver; -import com.gitee.spring.domain.core3.repository.ConfiguredRepository; +import com.gitee.spring.domain.core.api.Binder; +import com.gitee.spring.domain.core.impl.binder.ContextBinder; +import com.gitee.spring.domain.core.impl.binder.PropertyBinder; +import com.gitee.spring.domain.core.impl.resolver.BinderResolver; +import com.gitee.spring.domain.core.repository.ConfiguredRepository; import com.gitee.spring.domain.example.repository.DepartmentRepository; import com.gitee.spring.domain.example.repository.VisitorUserRepository; import lombok.extern.slf4j.Slf4j; diff --git a/src/test/java/com/gitee/spring/domain/example/CRUDTest.java b/src/test/java/com/gitee/spring/domain/example/CRUDTest.java index f2a9d22..9dba756 100644 --- a/src/test/java/com/gitee/spring/domain/example/CRUDTest.java +++ b/src/test/java/com/gitee/spring/domain/example/CRUDTest.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example; import cn.hutool.json.JSONUtil; -import com.gitee.spring.domain.core3.entity.BoundedContext; -import com.gitee.spring.domain.core3.entity.executor.Example; +import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.core.entity.executor.Example; import com.gitee.spring.domain.example.entity.Tenant; import com.gitee.spring.domain.example.entity.Visitor; import com.gitee.spring.domain.example.entity.VisitorUser; diff --git a/src/test/java/com/gitee/spring/domain/example/CoatingTest.java b/src/test/java/com/gitee/spring/domain/example/CoatingTest.java new file mode 100644 index 0000000..01d537a --- /dev/null +++ b/src/test/java/com/gitee/spring/domain/example/CoatingTest.java @@ -0,0 +1,38 @@ +package com.gitee.spring.domain.example; + +import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.spring.domain.example.entity.coating.TenantQuery; +import com.gitee.spring.domain.example.repository.TenantRepository; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +@Slf4j +@SpringBootTest +@DisplayName("测试反向查询逻辑") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class CoatingTest { + + @Autowired + private TenantRepository tenantRepository; + + @Test + @Order(1) + @DisplayName("测试新增逻辑") + public void test01() { + BoundedContext boundedContext = new BoundedContext(); + TenantQuery tenantQuery = new TenantQuery(); + tenantQuery.setTenantCode("tenant"); + tenantQuery.setDeptCode("dept"); + tenantQuery.setUserCode("000001"); + tenantQuery.setPageNum(1L); + tenantQuery.setPageSize(10L); + Example example = tenantRepository.buildExample(boundedContext, tenantQuery); + assumeTrue(example != null); + } + +} -- Gitee From 51001030bc24c1f68819751dd63572970c20c9f9 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 7 Nov 2022 23:41:19 +0800 Subject: [PATCH 09/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=8F=8D=E5=90=91=E6=9F=A5=E8=AF=A2=E6=A1=88?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 86f5820..d42376c 100644 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,7 @@ com.gitee.digital-engine - spring-boot-starter-domain3 + spring-boot-starter-domain 3.0.0 -- Gitee From 751ee4f12379f61baa1de477e012e99f24e2edfb Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 8 Nov 2022 16:52:54 +0800 Subject: [PATCH 10/42] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E6=8B=BC=E6=8E=A5sql=E7=9A=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/domain/example/entity/coating/TenantQuery.java | 4 ++-- .../java/com/gitee/spring/domain/example/CoatingTest.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java b/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java index e1b2b22..590e596 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java @@ -7,9 +7,9 @@ import lombok.Data; @Coating public class TenantQuery { // 租户编码 - private String tenantCode; +// private String tenantCode; // 部门编码 - private String deptCode; +// private String deptCode; // 用户编码 private String userCode; // 页码 diff --git a/src/test/java/com/gitee/spring/domain/example/CoatingTest.java b/src/test/java/com/gitee/spring/domain/example/CoatingTest.java index 01d537a..ba9dc64 100644 --- a/src/test/java/com/gitee/spring/domain/example/CoatingTest.java +++ b/src/test/java/com/gitee/spring/domain/example/CoatingTest.java @@ -26,8 +26,8 @@ public class CoatingTest { public void test01() { BoundedContext boundedContext = new BoundedContext(); TenantQuery tenantQuery = new TenantQuery(); - tenantQuery.setTenantCode("tenant"); - tenantQuery.setDeptCode("dept"); +// tenantQuery.setTenantCode("tenant"); +// tenantQuery.setDeptCode("dept"); tenantQuery.setUserCode("000001"); tenantQuery.setPageNum(1L); tenantQuery.setPageSize(10L); -- Gitee From 3c464eef73e03e53461b6adee21d7bea7c14c1ee Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 8 Nov 2022 17:31:41 +0800 Subject: [PATCH 11/42] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E6=8B=BC=E6=8E=A5sql=E7=9A=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/domain/example/CoatingTest.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/gitee/spring/domain/example/CoatingTest.java b/src/test/java/com/gitee/spring/domain/example/CoatingTest.java index ba9dc64..22a24b9 100644 --- a/src/test/java/com/gitee/spring/domain/example/CoatingTest.java +++ b/src/test/java/com/gitee/spring/domain/example/CoatingTest.java @@ -1,14 +1,21 @@ package com.gitee.spring.domain.example; +import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.spring.domain.example.entity.Tenant; import com.gitee.spring.domain.example.entity.coating.TenantQuery; import com.gitee.spring.domain.example.repository.TenantRepository; import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.*; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.util.List; + import static org.junit.jupiter.api.Assumptions.assumeTrue; @Slf4j @@ -24,15 +31,17 @@ public class CoatingTest { @Order(1) @DisplayName("测试新增逻辑") public void test01() { - BoundedContext boundedContext = new BoundedContext(); + BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); TenantQuery tenantQuery = new TenantQuery(); // tenantQuery.setTenantCode("tenant"); // tenantQuery.setDeptCode("dept"); tenantQuery.setUserCode("000001"); tenantQuery.setPageNum(1L); tenantQuery.setPageSize(10L); - Example example = tenantRepository.buildExample(boundedContext, tenantQuery); - assumeTrue(example != null); +// Example example = tenantRepository.buildExample(boundedContext, tenantQuery); + List tenants = tenantRepository.selectByCoating(boundedContext, tenantQuery); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenants))); + assumeTrue(!tenants.isEmpty()); } } -- Gitee From 59c1881422a6e6df4667309405e5e82cb839205c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 14 Nov 2022 17:22:22 +0800 Subject: [PATCH 12/42] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/example/entity/Department.java | 2 +- .../spring/domain/example/entity/Menu.java | 2 +- .../spring/domain/example/entity/Role.java | 2 +- .../domain/example/entity/RoleGroup.java | 2 +- .../domain/example/entity/RoleMenu.java | 2 +- .../spring/domain/example/entity/Tenant.java | 4 +- .../domain/example/entity/TenantView.java | 52 +++++++++++++++++ .../spring/domain/example/entity/User.java | 5 +- .../domain/example/entity/UserRole.java | 2 +- .../domain/example/entity/UserView.java | 23 ++++++++ .../domain/example/entity/VisitorUser.java | 2 +- .../example/entity/coating/TenantQuery.java | 7 +-- .../entity/coating/TenantViewQuery.java | 16 ++++++ .../domain/example/factory/UserFactory.java | 22 ++++++++ .../example/repository/TenantRepository.java | 2 - .../repository/TenantViewRepository.java | 17 ++++++ .../example/repository/UserRepository.java | 1 + .../repository/UserViewRepository.java | 15 +++++ .../spring/domain/example/BinderTest.java | 2 +- .../gitee/spring/domain/example/CRUDTest.java | 2 +- .../spring/domain/example/CoatingTest.java | 7 +-- .../spring/domain/example/OverrideTest.java | 41 ++++++++++++++ .../gitee/spring/domain/example/ViewTest.java | 56 +++++++++++++++++++ 23 files changed, 261 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/gitee/spring/domain/example/entity/TenantView.java create mode 100644 src/main/java/com/gitee/spring/domain/example/entity/UserView.java create mode 100644 src/main/java/com/gitee/spring/domain/example/entity/coating/TenantViewQuery.java create mode 100644 src/main/java/com/gitee/spring/domain/example/factory/UserFactory.java create mode 100644 src/main/java/com/gitee/spring/domain/example/repository/TenantViewRepository.java create mode 100644 src/main/java/com/gitee/spring/domain/example/repository/UserViewRepository.java create mode 100644 src/test/java/com/gitee/spring/domain/example/OverrideTest.java create mode 100644 src/test/java/com/gitee/spring/domain/example/ViewTest.java diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Department.java b/src/main/java/com/gitee/spring/domain/example/entity/Department.java index 34fefe5..2e19544 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Department.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Department.java @@ -28,7 +28,7 @@ public class Department { // 创建时间 private Date createTime; // 用户实体 - @Entity(triggers = "users", mapper = AcsTestUserMapper.class) + @Entity(matchKeys = "users", mapper = AcsTestUserMapper.class) @Bindings({ @Binding(field = "tenantId", bindProp = "./tenantId"), @Binding(field = "deptId", bindProp = "./id"), diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java index 12f6fb4..ed0fb70 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java @@ -36,7 +36,7 @@ public class Menu { // 更新时间 private Date updateTime; // 接口实体 - @Entity(triggers = "api", mapper = AcsTestApiMapper.class) + @Entity(matchKeys = "api", mapper = AcsTestApiMapper.class) @Bindings({ @Binding(field = "menuId", bindProp = "./id"), @Binding(field = "apiUrl", bindCtx = "apiUrl") diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Role.java b/src/main/java/com/gitee/spring/domain/example/entity/Role.java index 6ff84ae..50f2aaf 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Role.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Role.java @@ -31,7 +31,7 @@ public class Role { // 更新时间 private Date updateTime; // 角色菜单关联实体 - @Entity(triggers = "menu", repository = RoleMenuRepository.class) + @Entity(matchKeys = "menu", repository = RoleMenuRepository.class) @Binding(field = "roleId", bindProp = "./id") private List roleMenus; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java index 0dd4a6e..95685e0 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java @@ -28,7 +28,7 @@ public class RoleGroup { // 创建时间 private Date createTime; // 角色实体 - @Entity(triggers = "roles", mapper = AcsTestRoleMapper.class) + @Entity(matchKeys = "roles", mapper = AcsTestRoleMapper.class) @Bindings({ @Binding(field = "tenantId", bindProp = "./tenantId"), @Binding(field = "groupId", bindProp = "./id"), diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java index b2cbcf7..9348351 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java @@ -24,7 +24,7 @@ public class RoleMenu { // 创建时间 private Date createTime; // 菜单实体 - @Entity(triggers = "menu", mapper = AcsTestMenuMapper.class) + @Entity(matchKeys = "menu", mapper = AcsTestMenuMapper.class) @Binding(field = "id", bindProp = "./menuId") private Menu menu; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java index a9fc06d..86e2fac 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java @@ -32,11 +32,11 @@ public class Tenant { // 更新时间 private Date updateTime; // 部门实体 - @Entity(triggers = "departments", repository = DepartmentRepository.class) + @Entity(matchKeys = "departments", repository = DepartmentRepository.class) @Binding(field = "tenantId", bindProp = "./id") private List departments; // 角色组实体 - @Entity(triggers = "roleGroups", repository = RoleGroupRepository.class) + @Entity(matchKeys = "roleGroups", repository = RoleGroupRepository.class) @Binding(field = "tenantId", bindProp = "./id") private List roleGroups; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/TenantView.java b/src/main/java/com/gitee/spring/domain/example/entity/TenantView.java new file mode 100644 index 0000000..4e43be1 --- /dev/null +++ b/src/main/java/com/gitee/spring/domain/example/entity/TenantView.java @@ -0,0 +1,52 @@ +package com.gitee.spring.domain.example.entity; + +import com.gitee.spring.domain.core.annotation.Binding; +import com.gitee.spring.domain.core.annotation.Bindings; +import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.spring.domain.core.impl.processor.PropertyProcessor; +import com.gitee.spring.domain.example.mapper.AcsTestDeptMapper; +import com.gitee.spring.domain.example.mapper.AcsTestRoleGroupMapper; +import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; +import com.gitee.spring.domain.example.mapper.AcsTestTenantMapper; +import com.gitee.spring.domain.example.repository.UserRepository; +import lombok.Data; + +import java.util.List; + +@Data +@Entity(mapper = AcsTestTenantMapper.class) +public class TenantView { + // 主键 + private Integer id; + // 租户编码 + private String tenantCode; + // 租户名称 + private String tenantName; + + // 部门实体 + @Entity(matchKeys = "departments", mapper = AcsTestDeptMapper.class) + @Binding(field = "tenantId", bindProp = "./id") + private List departments; + + // 角色组实体 + @Entity(matchKeys = "roleGroups", mapper = AcsTestRoleGroupMapper.class) + @Binding(field = "tenantId", bindProp = "./id") + private List roleGroups; + + // 用户实体 + @Entity(matchKeys = "users", repository = UserRepository.class) + @Bindings({ + @Binding(field = "tenantId", bindProp = "./id"), + @Binding(field = "deptId", bindProp = "./departments", property = "id", processor = PropertyProcessor.class), + }) + private List users; + + // 角色实体 + @Entity(matchKeys = "roles", mapper = AcsTestRoleMapper.class) + @Bindings({ + @Binding(field = "tenantId", bindProp = "./id"), + @Binding(field = "groupId", bindProp = "./roleGroups", property = "id", processor = PropertyProcessor.class), + }) + private List roles; + +} diff --git a/src/main/java/com/gitee/spring/domain/example/entity/User.java b/src/main/java/com/gitee/spring/domain/example/entity/User.java index 59c9327..da89e7a 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/User.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/User.java @@ -2,6 +2,7 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.spring.domain.example.factory.UserFactory; import com.gitee.spring.domain.example.mapper.AcsTestUserMapper; import com.gitee.spring.domain.example.repository.UserRoleRepository; import lombok.Data; @@ -10,7 +11,7 @@ import java.util.Date; import java.util.List; @Data -@Entity(mapper = AcsTestUserMapper.class) +@Entity(mapper = AcsTestUserMapper.class, factory = UserFactory.class) public class User { // 主键 private Integer id; @@ -33,7 +34,7 @@ public class User { // 更新时间 private Date updateTime; // 用户角色关联实体 - @Entity(triggers = "role", repository = UserRoleRepository.class) + @Entity(matchKeys = "role", repository = UserRoleRepository.class) @Binding(field = "userId", bindProp = "./id") private List userRoles; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java index 41d9bb4..988d6f5 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java @@ -22,7 +22,7 @@ public class UserRole { // 创建时间 private Date createTime; // 角色实体 - @Entity(triggers = "role", mapper = AcsTestRoleMapper.class) + @Entity(matchKeys = "role", mapper = AcsTestRoleMapper.class) @Binding(field = "id", bindProp = "./roleId") private Role role; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserView.java b/src/main/java/com/gitee/spring/domain/example/entity/UserView.java new file mode 100644 index 0000000..54e152c --- /dev/null +++ b/src/main/java/com/gitee/spring/domain/example/entity/UserView.java @@ -0,0 +1,23 @@ +package com.gitee.spring.domain.example.entity; + +import com.gitee.spring.domain.core.annotation.Binding; +import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.spring.domain.core.impl.processor.PropertyProcessor; +import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; +import com.gitee.spring.domain.example.mapper.AcsTestUserMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = false) +@Entity(mapper = AcsTestUserMapper.class) +public class UserView extends User { + + // 角色实体 + @Entity(matchKeys = "role", mapper = AcsTestRoleMapper.class) + @Binding(field = "id", bindProp = "./userRoles", property = "roleId", processor = PropertyProcessor.class) + private List roles; + +} diff --git a/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java b/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java index e55dab0..56fa19f 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java @@ -21,7 +21,7 @@ public class VisitorUser { // 用户id private Integer userId; // 用户对象 - @Entity(triggers = "user", mapper = AcsTestUserMapper.class) + @Entity(matchKeys = "user", mapper = AcsTestUserMapper.class) @Bindings({ @Binding(field = "id", bindProp = "./userId"), @Binding(field = "isMaster", bindCtx = "isMaster"), diff --git a/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java b/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java index 590e596..6d674d3 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java @@ -1,15 +1,12 @@ package com.gitee.spring.domain.example.entity.coating; import com.gitee.spring.domain.coating.annotation.Coating; +import com.gitee.spring.domain.example.entity.Tenant; import lombok.Data; @Data -@Coating +@Coating(qualifier = Tenant.class) public class TenantQuery { - // 租户编码 -// private String tenantCode; - // 部门编码 -// private String deptCode; // 用户编码 private String userCode; // 页码 diff --git a/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantViewQuery.java b/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantViewQuery.java new file mode 100644 index 0000000..3612e07 --- /dev/null +++ b/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantViewQuery.java @@ -0,0 +1,16 @@ +package com.gitee.spring.domain.example.entity.coating; + +import com.gitee.spring.domain.coating.annotation.Coating; +import com.gitee.spring.domain.example.entity.TenantView; +import lombok.Data; + +@Data +@Coating(qualifier = TenantView.class) +public class TenantViewQuery { + // 用户编码 + private String userCode; + // 页码 + private Long pageNum; + // 条目数 + private Long pageSize; +} diff --git a/src/main/java/com/gitee/spring/domain/example/factory/UserFactory.java b/src/main/java/com/gitee/spring/domain/example/factory/UserFactory.java new file mode 100644 index 0000000..4f52c5c --- /dev/null +++ b/src/main/java/com/gitee/spring/domain/example/factory/UserFactory.java @@ -0,0 +1,22 @@ +package com.gitee.spring.domain.example.factory; + +import cn.hutool.core.bean.BeanUtil; +import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.core.impl.DefaultEntityFactory; +import com.gitee.spring.domain.example.entity.UserView; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.stereotype.Component; + +@Data +@Component +@EqualsAndHashCode(callSuper = false) +public class UserFactory extends DefaultEntityFactory { + + @Override + public Object reconstitute(BoundedContext boundedContext, Object persistentObject) { + persistentObject = super.reconstitute(boundedContext, persistentObject); + return BeanUtil.copyProperties(persistentObject, UserView.class); + } + +} diff --git a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java index 8febae0..c3ecc2d 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java @@ -3,14 +3,12 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; import com.gitee.spring.domain.coating.annotation.CoatingScan; -import com.gitee.spring.domain.event.annotation.EnableEvent; import com.gitee.spring.domain.example.entity.Tenant; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @Data -@EnableEvent @RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) diff --git a/src/main/java/com/gitee/spring/domain/example/repository/TenantViewRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/TenantViewRepository.java new file mode 100644 index 0000000..b4bb471 --- /dev/null +++ b/src/main/java/com/gitee/spring/domain/example/repository/TenantViewRepository.java @@ -0,0 +1,17 @@ +package com.gitee.spring.domain.example.repository; + +import com.gitee.spring.boot.starter.domain.annotation.RootRepository; +import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; +import com.gitee.spring.domain.coating.annotation.CoatingScan; +import com.gitee.spring.domain.example.entity.TenantView; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@RootRepository +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +@CoatingScan("com.gitee.spring.domain.example.entity.coating") +public class TenantViewRepository extends MybatisPlusRepository { +} diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java index 27a4542..5269c09 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java @@ -12,4 +12,5 @@ import lombok.EqualsAndHashCode; @AllArgsConstructor @EqualsAndHashCode(callSuper = false) public class UserRepository extends MybatisPlusRepository { + private final UserViewRepository userViewRepository; } diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserViewRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/UserViewRepository.java new file mode 100644 index 0000000..84bcff5 --- /dev/null +++ b/src/main/java/com/gitee/spring/domain/example/repository/UserViewRepository.java @@ -0,0 +1,15 @@ +package com.gitee.spring.domain.example.repository; + +import com.gitee.spring.boot.starter.domain.annotation.RootRepository; +import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; +import com.gitee.spring.domain.example.entity.UserView; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@RootRepository +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class UserViewRepository extends MybatisPlusRepository { +} diff --git a/src/test/java/com/gitee/spring/domain/example/BinderTest.java b/src/test/java/com/gitee/spring/domain/example/BinderTest.java index 167b71d..36d7442 100644 --- a/src/test/java/com/gitee/spring/domain/example/BinderTest.java +++ b/src/test/java/com/gitee/spring/domain/example/BinderTest.java @@ -20,7 +20,7 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; @Slf4j @SpringBootTest -@DisplayName("测试解析逻辑") +@DisplayName("绑定器解析测试") public class BinderTest { @Autowired diff --git a/src/test/java/com/gitee/spring/domain/example/CRUDTest.java b/src/test/java/com/gitee/spring/domain/example/CRUDTest.java index 9dba756..ca1b1f3 100644 --- a/src/test/java/com/gitee/spring/domain/example/CRUDTest.java +++ b/src/test/java/com/gitee/spring/domain/example/CRUDTest.java @@ -26,7 +26,7 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; @Slf4j @SpringBootTest -@DisplayName("测试增、删、改、查逻辑") +@DisplayName("增、删、改、查测试") @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class CRUDTest { diff --git a/src/test/java/com/gitee/spring/domain/example/CoatingTest.java b/src/test/java/com/gitee/spring/domain/example/CoatingTest.java index 22a24b9..950443c 100644 --- a/src/test/java/com/gitee/spring/domain/example/CoatingTest.java +++ b/src/test/java/com/gitee/spring/domain/example/CoatingTest.java @@ -20,7 +20,7 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; @Slf4j @SpringBootTest -@DisplayName("测试反向查询逻辑") +@DisplayName("防腐层测试") @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class CoatingTest { @@ -29,16 +29,13 @@ public class CoatingTest { @Test @Order(1) - @DisplayName("测试新增逻辑") + @DisplayName("反向查询") public void test01() { BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); TenantQuery tenantQuery = new TenantQuery(); -// tenantQuery.setTenantCode("tenant"); -// tenantQuery.setDeptCode("dept"); tenantQuery.setUserCode("000001"); tenantQuery.setPageNum(1L); tenantQuery.setPageSize(10L); -// Example example = tenantRepository.buildExample(boundedContext, tenantQuery); List tenants = tenantRepository.selectByCoating(boundedContext, tenantQuery); log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenants))); assumeTrue(!tenants.isEmpty()); diff --git a/src/test/java/com/gitee/spring/domain/example/OverrideTest.java b/src/test/java/com/gitee/spring/domain/example/OverrideTest.java new file mode 100644 index 0000000..237d047 --- /dev/null +++ b/src/test/java/com/gitee/spring/domain/example/OverrideTest.java @@ -0,0 +1,41 @@ +package com.gitee.spring.domain.example; + +import cn.hutool.json.JSONUtil; +import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.spring.domain.example.entity.TenantView; +import com.gitee.spring.domain.example.repository.TenantViewRepository; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +@Slf4j +@SpringBootTest +@DisplayName("多态测试") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class OverrideTest { + + @Autowired + private TenantViewRepository tenantViewRepository; + + @Test + @Order(1) + @DisplayName("查询") + public void test01() { + BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles", "role"); + Example example = new Example(); + List tenantViews = tenantViewRepository.selectByExample(boundedContext, example); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenantViews))); + assumeTrue(!tenantViews.isEmpty()); + } + +} diff --git a/src/test/java/com/gitee/spring/domain/example/ViewTest.java b/src/test/java/com/gitee/spring/domain/example/ViewTest.java new file mode 100644 index 0000000..643ed95 --- /dev/null +++ b/src/test/java/com/gitee/spring/domain/example/ViewTest.java @@ -0,0 +1,56 @@ +package com.gitee.spring.domain.example; + +import cn.hutool.json.JSONUtil; +import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.spring.domain.example.entity.TenantView; +import com.gitee.spring.domain.example.entity.coating.TenantViewQuery; +import com.gitee.spring.domain.example.repository.TenantViewRepository; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +@Slf4j +@SpringBootTest +@DisplayName("视图测试") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class ViewTest { + + @Autowired + private TenantViewRepository tenantViewRepository; + + @Test + @Order(1) + @DisplayName("查询") + public void test01() { + BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); + Example example = new Example(); + List tenantViews = tenantViewRepository.selectByExample(boundedContext, example); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenantViews))); + assumeTrue(!tenantViews.isEmpty()); + } + + @Test + @Order(2) + @DisplayName("反向查询") + public void test02() { + BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); + TenantViewQuery tenantViewQuery = new TenantViewQuery(); + tenantViewQuery.setUserCode("000001"); + tenantViewQuery.setPageNum(1L); + tenantViewQuery.setPageSize(10L); + List tenantViews = tenantViewRepository.selectByCoating(boundedContext, tenantViewQuery); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenantViews))); + assumeTrue(!tenantViews.isEmpty()); + } + +} -- Gitee From b5659d59ea60d87dcffb5ad5d11aa2592c63dbab Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 14 Nov 2022 17:57:24 +0800 Subject: [PATCH 13/42] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/SpringDomainExampleApp.java | 2 +- .../{ => dal}/mapper/AcsTestApiMapper.java | 4 +- .../{ => dal}/mapper/AcsTestDeptMapper.java | 4 +- .../{ => dal}/mapper/AcsTestMenuMapper.java | 4 +- .../mapper/AcsTestRoleGroupMapper.java | 4 +- .../{ => dal}/mapper/AcsTestRoleMapper.java | 4 +- .../mapper/AcsTestRoleMenuMapper.java | 4 +- .../{ => dal}/mapper/AcsTestTenantMapper.java | 4 +- .../{ => dal}/mapper/AcsTestUserMapper.java | 4 +- .../mapper/AcsTestUserRoleMapper.java | 4 +- .../mapper/AcsTestVisitorUserMapper.java | 4 +- .../example/{ => dal}/pojo/AcsTestApi.java | 5 +- .../example/{ => dal}/pojo/AcsTestDept.java | 2 +- .../example/{ => dal}/pojo/AcsTestMenu.java | 2 +- .../example/{ => dal}/pojo/AcsTestRole.java | 2 +- .../{ => dal}/pojo/AcsTestRoleGroup.java | 2 +- .../{ => dal}/pojo/AcsTestRoleMenu.java | 2 +- .../example/{ => dal}/pojo/AcsTestTenant.java | 2 +- .../example/{ => dal}/pojo/AcsTestUser.java | 2 +- .../{ => dal}/pojo/AcsTestUserRole.java | 2 +- .../{ => dal}/pojo/AcsTestVisitorUser.java | 2 +- .../spring/domain/example/entity/Api.java | 2 +- .../domain/example/entity/Department.java | 4 +- .../spring/domain/example/entity/Menu.java | 4 +- .../spring/domain/example/entity/Role.java | 2 +- .../domain/example/entity/RoleGroup.java | 4 +- .../domain/example/entity/RoleMenu.java | 4 +- .../spring/domain/example/entity/Tenant.java | 2 +- .../domain/example/entity/TenantView.java | 8 +-- .../spring/domain/example/entity/User.java | 2 +- .../domain/example/entity/UserRole.java | 4 +- .../domain/example/entity/UserView.java | 4 +- .../domain/example/entity/VisitorUser.java | 4 +- .../entity/listener/TenantListener.java | 21 ++++++++ .../example/repository/TenantRepository.java | 2 + .../resources/mapper/AcsTestApiMapper.xml | 4 +- .../resources/mapper/AcsTestDeptMapper.xml | 4 +- .../resources/mapper/AcsTestMenuMapper.xml | 4 +- .../mapper/AcsTestRoleGroupMapper.xml | 4 +- .../resources/mapper/AcsTestRoleMapper.xml | 4 +- .../mapper/AcsTestRoleMenuMapper.xml | 4 +- .../resources/mapper/AcsTestTenantMapper.xml | 4 +- .../resources/mapper/AcsTestUserMapper.xml | 4 +- .../mapper/AcsTestUserRoleMapper.xml | 4 +- .../mapper/AcsTestVisitorUserMapper.xml | 4 +- .../spring/domain/example/EventTest.java | 49 +++++++++++++++++++ 46 files changed, 147 insertions(+), 74 deletions(-) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/mapper/AcsTestApiMapper.java (63%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/mapper/AcsTestDeptMapper.java (63%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/mapper/AcsTestMenuMapper.java (63%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/mapper/AcsTestRoleGroupMapper.java (64%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/mapper/AcsTestRoleMapper.java (63%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/mapper/AcsTestRoleMenuMapper.java (64%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/mapper/AcsTestTenantMapper.java (63%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/mapper/AcsTestUserMapper.java (63%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/mapper/AcsTestUserRoleMapper.java (64%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/mapper/AcsTestVisitorUserMapper.java (65%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/pojo/AcsTestApi.java (95%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/pojo/AcsTestDept.java (96%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/pojo/AcsTestMenu.java (96%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/pojo/AcsTestRole.java (96%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/pojo/AcsTestRoleGroup.java (96%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/pojo/AcsTestRoleMenu.java (96%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/pojo/AcsTestTenant.java (96%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/pojo/AcsTestUser.java (96%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/pojo/AcsTestUserRole.java (95%) rename src/main/java/com/gitee/spring/domain/example/{ => dal}/pojo/AcsTestVisitorUser.java (95%) create mode 100644 src/main/java/com/gitee/spring/domain/example/entity/listener/TenantListener.java create mode 100644 src/test/java/com/gitee/spring/domain/example/EventTest.java diff --git a/src/main/java/com/gitee/spring/domain/example/SpringDomainExampleApp.java b/src/main/java/com/gitee/spring/domain/example/SpringDomainExampleApp.java index 4ac60fe..0484d9a 100644 --- a/src/main/java/com/gitee/spring/domain/example/SpringDomainExampleApp.java +++ b/src/main/java/com/gitee/spring/domain/example/SpringDomainExampleApp.java @@ -5,7 +5,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -@MapperScan("com.gitee.spring.domain.example.mapper") +@MapperScan("com.gitee.spring.domain.example.dal.mapper") public class SpringDomainExampleApp { public static void main(String[] args) { SpringApplication.run(SpringDomainExampleApp.class, args); diff --git a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestApiMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestApiMapper.java similarity index 63% rename from src/main/java/com/gitee/spring/domain/example/mapper/AcsTestApiMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestApiMapper.java index 8a4a57e..0da999c 100644 --- a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestApiMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestApiMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.mapper; +package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.pojo.AcsTestApi; +import com.gitee.spring.domain.example.dal.pojo.AcsTestApi; /** * 接口表 diff --git a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestDeptMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestDeptMapper.java similarity index 63% rename from src/main/java/com/gitee/spring/domain/example/mapper/AcsTestDeptMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestDeptMapper.java index 51e9042..e1cc251 100644 --- a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestDeptMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestDeptMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.mapper; +package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.pojo.AcsTestDept; +import com.gitee.spring.domain.example.dal.pojo.AcsTestDept; /** * 部门表 diff --git a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestMenuMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestMenuMapper.java similarity index 63% rename from src/main/java/com/gitee/spring/domain/example/mapper/AcsTestMenuMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestMenuMapper.java index cd0bf9d..d726cc2 100644 --- a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestMenuMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestMenuMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.mapper; +package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.pojo.AcsTestMenu; +import com.gitee.spring.domain.example.dal.pojo.AcsTestMenu; /** * 菜单表 diff --git a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestRoleGroupMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleGroupMapper.java similarity index 64% rename from src/main/java/com/gitee/spring/domain/example/mapper/AcsTestRoleGroupMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleGroupMapper.java index 086c90f..f58959f 100644 --- a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestRoleGroupMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleGroupMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.mapper; +package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.pojo.AcsTestRoleGroup; +import com.gitee.spring.domain.example.dal.pojo.AcsTestRoleGroup; /** * 角色组表 diff --git a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestRoleMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleMapper.java similarity index 63% rename from src/main/java/com/gitee/spring/domain/example/mapper/AcsTestRoleMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleMapper.java index 460da15..5895801 100644 --- a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestRoleMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.mapper; +package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.pojo.AcsTestRole; +import com.gitee.spring.domain.example.dal.pojo.AcsTestRole; /** * 角色表 diff --git a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestRoleMenuMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleMenuMapper.java similarity index 64% rename from src/main/java/com/gitee/spring/domain/example/mapper/AcsTestRoleMenuMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleMenuMapper.java index 2542f03..a367b28 100644 --- a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestRoleMenuMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleMenuMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.mapper; +package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.pojo.AcsTestRoleMenu; +import com.gitee.spring.domain.example.dal.pojo.AcsTestRoleMenu; /** * 角色菜单绑定表 diff --git a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestTenantMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestTenantMapper.java similarity index 63% rename from src/main/java/com/gitee/spring/domain/example/mapper/AcsTestTenantMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestTenantMapper.java index 14b310e..fb795e3 100644 --- a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestTenantMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestTenantMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.mapper; +package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.pojo.AcsTestTenant; +import com.gitee.spring.domain.example.dal.pojo.AcsTestTenant; /** * 租户表 diff --git a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestUserMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserMapper.java similarity index 63% rename from src/main/java/com/gitee/spring/domain/example/mapper/AcsTestUserMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserMapper.java index 8e94196..12eb09b 100644 --- a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestUserMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.mapper; +package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.pojo.AcsTestUser; +import com.gitee.spring.domain.example.dal.pojo.AcsTestUser; /** * 用户表 diff --git a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestUserRoleMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserRoleMapper.java similarity index 64% rename from src/main/java/com/gitee/spring/domain/example/mapper/AcsTestUserRoleMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserRoleMapper.java index 05dba5b..98e3b4e 100644 --- a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestUserRoleMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserRoleMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.mapper; +package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.pojo.AcsTestUserRole; +import com.gitee.spring.domain.example.dal.pojo.AcsTestUserRole; /** * 用户角色绑定表 diff --git a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestVisitorUserMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestVisitorUserMapper.java similarity index 65% rename from src/main/java/com/gitee/spring/domain/example/mapper/AcsTestVisitorUserMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestVisitorUserMapper.java index 58dc158..1178c45 100644 --- a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestVisitorUserMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestVisitorUserMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.mapper; +package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.pojo.AcsTestVisitorUser; +import com.gitee.spring.domain.example.dal.pojo.AcsTestVisitorUser; /** * 游客用户绑定表 diff --git a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestApi.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestApi.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/pojo/AcsTestApi.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestApi.java index 7b2806d..7283ad5 100644 --- a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestApi.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestApi.java @@ -1,15 +1,16 @@ -package com.gitee.spring.domain.example.pojo; +package com.gitee.spring.domain.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import java.util.Date; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; + /** * 接口表 * Generated by Mybatis Generator on 2022-08-29 diff --git a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestDept.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestDept.java similarity index 96% rename from src/main/java/com/gitee/spring/domain/example/pojo/AcsTestDept.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestDept.java index 5d46a51..bdc8d93 100644 --- a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestDept.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestDept.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.pojo; +package com.gitee.spring.domain.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestMenu.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestMenu.java similarity index 96% rename from src/main/java/com/gitee/spring/domain/example/pojo/AcsTestMenu.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestMenu.java index 78a7f89..90a10b6 100644 --- a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestMenu.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.pojo; +package com.gitee.spring.domain.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestRole.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRole.java similarity index 96% rename from src/main/java/com/gitee/spring/domain/example/pojo/AcsTestRole.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRole.java index eae3628..480f03a 100644 --- a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestRole.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRole.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.pojo; +package com.gitee.spring.domain.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestRoleGroup.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRoleGroup.java similarity index 96% rename from src/main/java/com/gitee/spring/domain/example/pojo/AcsTestRoleGroup.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRoleGroup.java index 8b6e549..177c460 100644 --- a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestRoleGroup.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRoleGroup.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.pojo; +package com.gitee.spring.domain.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestRoleMenu.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRoleMenu.java similarity index 96% rename from src/main/java/com/gitee/spring/domain/example/pojo/AcsTestRoleMenu.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRoleMenu.java index b0f76a5..506a28b 100644 --- a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestRoleMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRoleMenu.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.pojo; +package com.gitee.spring.domain.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestTenant.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestTenant.java similarity index 96% rename from src/main/java/com/gitee/spring/domain/example/pojo/AcsTestTenant.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestTenant.java index 905f224..cd4cfab 100644 --- a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestTenant.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestTenant.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.pojo; +package com.gitee.spring.domain.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestUser.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUser.java similarity index 96% rename from src/main/java/com/gitee/spring/domain/example/pojo/AcsTestUser.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUser.java index e8f2dd5..9e0aeba 100644 --- a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestUser.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUser.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.pojo; +package com.gitee.spring.domain.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestUserRole.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUserRole.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/pojo/AcsTestUserRole.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUserRole.java index c6ac0c3..f20921f 100644 --- a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestUserRole.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUserRole.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.pojo; +package com.gitee.spring.domain.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestVisitorUser.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestVisitorUser.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/pojo/AcsTestVisitorUser.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestVisitorUser.java index 5fc55a2..2a3de33 100644 --- a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestVisitorUser.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestVisitorUser.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.pojo; +package com.gitee.spring.domain.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Api.java b/src/main/java/com/gitee/spring/domain/example/entity/Api.java index 6073b23..241bcef 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Api.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Api.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.mapper.AcsTestApiMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestApiMapper; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Department.java b/src/main/java/com/gitee/spring/domain/example/entity/Department.java index 2e19544..bdd5f8f 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Department.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Department.java @@ -3,8 +3,8 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Bindings; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.mapper.AcsTestDeptMapper; -import com.gitee.spring.domain.example.mapper.AcsTestUserMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestDeptMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestUserMapper; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java index ed0fb70..a7a1d7b 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java @@ -3,8 +3,8 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Bindings; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.mapper.AcsTestApiMapper; -import com.gitee.spring.domain.example.mapper.AcsTestMenuMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestApiMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestMenuMapper; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Role.java b/src/main/java/com/gitee/spring/domain/example/entity/Role.java index 50f2aaf..7bdcb85 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Role.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Role.java @@ -2,7 +2,7 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMapper; import com.gitee.spring.domain.example.repository.RoleMenuRepository; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java index 95685e0..0ef60c3 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java @@ -3,8 +3,8 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Bindings; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.mapper.AcsTestRoleGroupMapper; -import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleGroupMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMapper; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java index 9348351..ed2450e 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java @@ -2,8 +2,8 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.mapper.AcsTestMenuMapper; -import com.gitee.spring.domain.example.mapper.AcsTestRoleMenuMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestMenuMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMenuMapper; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java index 86e2fac..7f81c75 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java @@ -2,7 +2,7 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.mapper.AcsTestTenantMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestTenantMapper; import com.gitee.spring.domain.example.repository.DepartmentRepository; import com.gitee.spring.domain.example.repository.RoleGroupRepository; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/TenantView.java b/src/main/java/com/gitee/spring/domain/example/entity/TenantView.java index 4e43be1..7723aed 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/TenantView.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/TenantView.java @@ -4,10 +4,10 @@ import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Bindings; import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.core.impl.processor.PropertyProcessor; -import com.gitee.spring.domain.example.mapper.AcsTestDeptMapper; -import com.gitee.spring.domain.example.mapper.AcsTestRoleGroupMapper; -import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; -import com.gitee.spring.domain.example.mapper.AcsTestTenantMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestDeptMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleGroupMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestTenantMapper; import com.gitee.spring.domain.example.repository.UserRepository; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/User.java b/src/main/java/com/gitee/spring/domain/example/entity/User.java index da89e7a..7fc40ae 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/User.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/User.java @@ -3,7 +3,7 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.example.factory.UserFactory; -import com.gitee.spring.domain.example.mapper.AcsTestUserMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestUserMapper; import com.gitee.spring.domain.example.repository.UserRoleRepository; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java index 988d6f5..d12b4c3 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java @@ -2,8 +2,8 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; -import com.gitee.spring.domain.example.mapper.AcsTestUserRoleMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestUserRoleMapper; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserView.java b/src/main/java/com/gitee/spring/domain/example/entity/UserView.java index 54e152c..b04f55a 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/UserView.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/UserView.java @@ -3,8 +3,8 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.core.impl.processor.PropertyProcessor; -import com.gitee.spring.domain.example.mapper.AcsTestRoleMapper; -import com.gitee.spring.domain.example.mapper.AcsTestUserMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestUserMapper; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java b/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java index 56fa19f..0db7937 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java @@ -3,8 +3,8 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Bindings; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.mapper.AcsTestUserMapper; -import com.gitee.spring.domain.example.mapper.AcsTestVisitorUserMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestUserMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestVisitorUserMapper; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/listener/TenantListener.java b/src/main/java/com/gitee/spring/domain/example/entity/listener/TenantListener.java new file mode 100644 index 0000000..130b270 --- /dev/null +++ b/src/main/java/com/gitee/spring/domain/example/entity/listener/TenantListener.java @@ -0,0 +1,21 @@ +package com.gitee.spring.domain.example.entity.listener; + +import com.gitee.spring.domain.event.annotation.Listener; +import com.gitee.spring.domain.event.api.EntityListener; +import com.gitee.spring.domain.event.listener.RepositoryEvent; +import com.gitee.spring.domain.example.entity.Tenant; +import org.springframework.stereotype.Component; + +@Component +@Listener(Tenant.class) +public class TenantListener implements EntityListener { + + @Override + public void onApplicationEvent(RepositoryEvent repositoryEvent) { + Object entity = repositoryEvent.getCondition().getEntity(); + if (entity instanceof Tenant) { + System.out.println(entity); + } + } + +} diff --git a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java index c3ecc2d..8febae0 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java @@ -3,12 +3,14 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; import com.gitee.spring.domain.coating.annotation.CoatingScan; +import com.gitee.spring.domain.event.annotation.EnableEvent; import com.gitee.spring.domain.example.entity.Tenant; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @Data +@EnableEvent @RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) diff --git a/src/main/resources/mapper/AcsTestApiMapper.xml b/src/main/resources/mapper/AcsTestApiMapper.xml index de00ec9..f50cd71 100644 --- a/src/main/resources/mapper/AcsTestApiMapper.xml +++ b/src/main/resources/mapper/AcsTestApiMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestDeptMapper.xml b/src/main/resources/mapper/AcsTestDeptMapper.xml index 88236ef..25a75c3 100644 --- a/src/main/resources/mapper/AcsTestDeptMapper.xml +++ b/src/main/resources/mapper/AcsTestDeptMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestMenuMapper.xml b/src/main/resources/mapper/AcsTestMenuMapper.xml index 830afc8..69a4daf 100644 --- a/src/main/resources/mapper/AcsTestMenuMapper.xml +++ b/src/main/resources/mapper/AcsTestMenuMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestRoleGroupMapper.xml b/src/main/resources/mapper/AcsTestRoleGroupMapper.xml index 57fda4f..7762573 100644 --- a/src/main/resources/mapper/AcsTestRoleGroupMapper.xml +++ b/src/main/resources/mapper/AcsTestRoleGroupMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestRoleMapper.xml b/src/main/resources/mapper/AcsTestRoleMapper.xml index 9033f6f..6f67fad 100644 --- a/src/main/resources/mapper/AcsTestRoleMapper.xml +++ b/src/main/resources/mapper/AcsTestRoleMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestRoleMenuMapper.xml b/src/main/resources/mapper/AcsTestRoleMenuMapper.xml index 2738984..5af0116 100644 --- a/src/main/resources/mapper/AcsTestRoleMenuMapper.xml +++ b/src/main/resources/mapper/AcsTestRoleMenuMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestTenantMapper.xml b/src/main/resources/mapper/AcsTestTenantMapper.xml index fbdfc68..86bfb95 100644 --- a/src/main/resources/mapper/AcsTestTenantMapper.xml +++ b/src/main/resources/mapper/AcsTestTenantMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestUserMapper.xml b/src/main/resources/mapper/AcsTestUserMapper.xml index 1efc8eb..a4a1823 100644 --- a/src/main/resources/mapper/AcsTestUserMapper.xml +++ b/src/main/resources/mapper/AcsTestUserMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestUserRoleMapper.xml b/src/main/resources/mapper/AcsTestUserRoleMapper.xml index 0da9a01..103db91 100644 --- a/src/main/resources/mapper/AcsTestUserRoleMapper.xml +++ b/src/main/resources/mapper/AcsTestUserRoleMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestVisitorUserMapper.xml b/src/main/resources/mapper/AcsTestVisitorUserMapper.xml index 6ddd9f7..ee165db 100644 --- a/src/main/resources/mapper/AcsTestVisitorUserMapper.xml +++ b/src/main/resources/mapper/AcsTestVisitorUserMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/test/java/com/gitee/spring/domain/example/EventTest.java b/src/test/java/com/gitee/spring/domain/example/EventTest.java new file mode 100644 index 0000000..b5b6cd9 --- /dev/null +++ b/src/test/java/com/gitee/spring/domain/example/EventTest.java @@ -0,0 +1,49 @@ +package com.gitee.spring.domain.example; + +import cn.hutool.json.JSONUtil; +import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.example.entity.Tenant; +import com.gitee.spring.domain.example.entity.coating.TenantQuery; +import com.gitee.spring.domain.example.repository.TenantRepository; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +@Slf4j +@SpringBootTest +@DisplayName("事件测试") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class EventTest { + + @Autowired + private TenantRepository tenantRepository; + + @Test + @Order(1) + @DisplayName("更新事件测试") + public void test01() { + BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); + TenantQuery tenantQuery = new TenantQuery(); + tenantQuery.setUserCode("000001"); + tenantQuery.setPageNum(1L); + tenantQuery.setPageSize(10L); + List tenants = tenantRepository.selectByCoating(boundedContext, tenantQuery); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenants))); + + Tenant tenant = tenants.get(0); + tenant.setStatus(1); + int count = tenantRepository.update(new BoundedContext(), tenant); + + assumeTrue(count > 0); + } + +} -- Gitee From 1f57b1565512a140561053c619e1a8d384c488c2 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 15 Nov 2022 18:58:06 +0800 Subject: [PATCH 14/42] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/dal/mapper/AcsTestUserMapper.java | 2 +- .../dal/mapper/AcsTestVisitorUserMapper.java | 11 - .../domain/example/dal/pojo/AcsTestUser.java | 8 +- .../domain/example/entity/Department.java | 4 +- .../spring/domain/example/entity/Menu.java | 12 +- .../spring/domain/example/entity/Role.java | 13 +- .../domain/example/entity/RoleGroup.java | 2 +- .../domain/example/entity/RoleMenu.java | 6 - .../spring/domain/example/entity/Tenant.java | 37 ++- .../domain/example/entity/TenantView.java | 52 ---- .../spring/domain/example/entity/User.java | 19 +- .../entity/{UserView.java => UserAdmin.java} | 18 +- .../domain/example/entity/UserRole.java | 6 - .../spring/domain/example/entity/Visitor.java | 13 - .../domain/example/entity/VisitorUser.java | 35 --- .../entity/coating/TenantViewQuery.java | 16 - .../{ => impl}/factory/UserFactory.java | 12 +- .../listener/TenantListener.java | 9 +- .../example/mapper/AcsTestUserMapper.java | 11 + .../AcsTestUser.java} | 35 ++- .../example/repository/ApiRepository.java | 15 - .../repository/RoleMenuRepository.java | 15 - .../repository/TenantViewRepository.java | 17 -- ...pository.java => UserAdminRepository.java} | 4 +- .../example/repository/UserRepository.java | 2 +- .../repository/UserRoleRepository.java | 15 - .../repository/VisitorUserRepository.java | 15 - .../example/service/SaasDataService.java | 273 ++++++++++-------- .../resources/mapper/AcsTestUserMapper.xml | 4 +- .../mapper/AcsTestVisitorUserMapper.xml | 16 - .../gitee/spring/domain/example/AppTest.java | 38 +++ .../spring/domain/example/BinderTest.java | 27 +- .../gitee/spring/domain/example/CRUDTest.java | 59 ++-- .../spring/domain/example/CoatingTest.java | 4 +- .../spring/domain/example/EventTest.java | 23 +- .../spring/domain/example/OverrideTest.java | 21 +- .../gitee/spring/domain/example/ViewTest.java | 56 ---- 37 files changed, 363 insertions(+), 562 deletions(-) delete mode 100644 src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestVisitorUserMapper.java delete mode 100644 src/main/java/com/gitee/spring/domain/example/entity/TenantView.java rename src/main/java/com/gitee/spring/domain/example/entity/{UserView.java => UserAdmin.java} (51%) delete mode 100644 src/main/java/com/gitee/spring/domain/example/entity/Visitor.java delete mode 100644 src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java delete mode 100644 src/main/java/com/gitee/spring/domain/example/entity/coating/TenantViewQuery.java rename src/main/java/com/gitee/spring/domain/example/{ => impl}/factory/UserFactory.java (60%) rename src/main/java/com/gitee/spring/domain/example/{entity => impl}/listener/TenantListener.java (72%) create mode 100644 src/main/java/com/gitee/spring/domain/example/mapper/AcsTestUserMapper.java rename src/main/java/com/gitee/spring/domain/example/{dal/pojo/AcsTestVisitorUser.java => pojo/AcsTestUser.java} (57%) delete mode 100644 src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java delete mode 100644 src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java delete mode 100644 src/main/java/com/gitee/spring/domain/example/repository/TenantViewRepository.java rename src/main/java/com/gitee/spring/domain/example/repository/{UserViewRepository.java => UserAdminRepository.java} (72%) delete mode 100644 src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java delete mode 100644 src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java delete mode 100644 src/main/resources/mapper/AcsTestVisitorUserMapper.xml create mode 100644 src/test/java/com/gitee/spring/domain/example/AppTest.java delete mode 100644 src/test/java/com/gitee/spring/domain/example/ViewTest.java diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserMapper.java index 12eb09b..c4d2d6e 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserMapper.java @@ -5,7 +5,7 @@ import com.gitee.spring.domain.example.dal.pojo.AcsTestUser; /** * 用户表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by MyBatis Generator on 2022-11-15 */ public interface AcsTestUserMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestVisitorUserMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestVisitorUserMapper.java deleted file mode 100644 index 1178c45..0000000 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestVisitorUserMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gitee.spring.domain.example.dal.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.AcsTestVisitorUser; - -/** - * 游客用户绑定表 - * Generated by Mybatis Generator on 2022-08-29 - */ -public interface AcsTestVisitorUserMapper extends BaseMapper { -} \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUser.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUser.java index 9e0aeba..38fbebf 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUser.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUser.java @@ -13,7 +13,7 @@ import java.util.Date; /** * 用户表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by Mybatis Generator on 2022-11-15 */ @Data @Builder @@ -41,9 +41,9 @@ public class AcsTestUser { @TableField(value = "user_name") private String userName; - // 是否主账户 1-是 2-否 - @TableField(value = "is_master") - private Integer isMaster; + // 是否平台管理员 0-否 1-是 + @TableField(value = "is_admin") + private Integer isAdmin; // 状态 0-可用 1-禁用 private Integer status; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Department.java b/src/main/java/com/gitee/spring/domain/example/entity/Department.java index bdd5f8f..4649ab3 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Department.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Department.java @@ -28,13 +28,13 @@ public class Department { // 创建时间 private Date createTime; // 用户实体 - @Entity(matchKeys = "users", mapper = AcsTestUserMapper.class) + @Entity(matchKeys = "dept.users", mapper = AcsTestUserMapper.class) @Bindings({ @Binding(field = "tenantId", bindProp = "./tenantId"), @Binding(field = "deptId", bindProp = "./id"), @Binding(field = "userCode", bindCtx = "userCode"), @Binding(field = "userName", bindCtx = "userName"), - @Binding(field = "isMaster", bindCtx = "isMaster"), + @Binding(field = "isAdmin", bindCtx = "isAdmin") }) private List users; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java index a7a1d7b..57b2975 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java @@ -21,22 +21,14 @@ public class Menu { private String menuCode; // 菜单名称 private String menuName; - // 菜单类型 nav-导航 function-功能(按钮) + // 菜单类型 nav-导航 page-页面 button-按钮 private String menuType; - // 菜单顺序 - private Integer menuIndex; - // 菜单图标 - private String menuIcon; - // 是否仅限平台管理员配置 1-是 2-否 - private Integer onlyAdmin; // 创建者 private String createUser; // 创建时间 private Date createTime; - // 更新时间 - private Date updateTime; // 接口实体 - @Entity(matchKeys = "api", mapper = AcsTestApiMapper.class) + @Entity(matchKeys = "menu.apis", mapper = AcsTestApiMapper.class) @Bindings({ @Binding(field = "menuId", bindProp = "./id"), @Binding(field = "apiUrl", bindCtx = "apiUrl") diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Role.java b/src/main/java/com/gitee/spring/domain/example/entity/Role.java index 7bdcb85..b875155 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Role.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Role.java @@ -3,7 +3,8 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMapper; -import com.gitee.spring.domain.example.repository.RoleMenuRepository; +import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMenuMapper; +import com.gitee.spring.domain.example.repository.MenuRepository; import lombok.Data; import java.util.Date; @@ -28,10 +29,14 @@ public class Role { private String createUser; // 创建时间 private Date createTime; - // 更新时间 - private Date updateTime; + // 角色菜单关联实体 - @Entity(matchKeys = "menu", repository = RoleMenuRepository.class) + @Entity(matchKeys = "role.menus", mapper = AcsTestRoleMenuMapper.class) @Binding(field = "roleId", bindProp = "./id") private List roleMenus; + + // 菜单实体 + @Entity(matchKeys = "role.menus", repository = MenuRepository.class) + @Binding(field = "id", bindProp = "./roleMenus", property = "menuId") + private List menus; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java index 0ef60c3..5eb662a 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java @@ -28,7 +28,7 @@ public class RoleGroup { // 创建时间 private Date createTime; // 角色实体 - @Entity(matchKeys = "roles", mapper = AcsTestRoleMapper.class) + @Entity(matchKeys = "group.roles", mapper = AcsTestRoleMapper.class) @Bindings({ @Binding(field = "tenantId", bindProp = "./tenantId"), @Binding(field = "groupId", bindProp = "./id"), diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java index ed2450e..519f910 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java @@ -1,8 +1,6 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.AcsTestMenuMapper; import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMenuMapper; import lombok.Data; @@ -23,8 +21,4 @@ public class RoleMenu { private String createUser; // 创建时间 private Date createTime; - // 菜单实体 - @Entity(matchKeys = "menu", mapper = AcsTestMenuMapper.class) - @Binding(field = "id", bindProp = "./menuId") - private Menu menu; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java index 7f81c75..7f82f10 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java @@ -1,17 +1,20 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; +import com.gitee.spring.domain.core.annotation.Bindings; import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.spring.domain.example.dal.mapper.AcsTestDeptMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleGroupMapper; +import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMapper; import com.gitee.spring.domain.example.dal.mapper.AcsTestTenantMapper; -import com.gitee.spring.domain.example.repository.DepartmentRepository; -import com.gitee.spring.domain.example.repository.RoleGroupRepository; +import com.gitee.spring.domain.example.dal.mapper.AcsTestUserMapper; import lombok.Data; import java.util.Date; import java.util.List; @Data -@Entity(mapper = AcsTestTenantMapper.class, nullableKey = "tenant.nullable") +@Entity(mapper = AcsTestTenantMapper.class) public class Tenant { // 主键 private Integer id; @@ -19,24 +22,36 @@ public class Tenant { private String tenantCode; // 租户名称 private String tenantName; - // 企业logo - private String logoUrl; // 状态 0-可用 1-禁用 private Integer status; // 创建者 private String createUser; // 创建时间 private Date createTime; - // 更新者 - private String updateUser; - // 更新时间 - private Date updateTime; + // 部门实体 - @Entity(matchKeys = "departments", repository = DepartmentRepository.class) + @Entity(matchKeys = "tenant.depts", mapper = AcsTestDeptMapper.class) @Binding(field = "tenantId", bindProp = "./id") private List departments; + // 角色组实体 - @Entity(matchKeys = "roleGroups", repository = RoleGroupRepository.class) + @Entity(matchKeys = "tenant.groups", mapper = AcsTestRoleGroupMapper.class) @Binding(field = "tenantId", bindProp = "./id") private List roleGroups; + + // 用户实体 + @Entity(matchKeys = "tenant.users", mapper = AcsTestUserMapper.class) + @Bindings({ + @Binding(field = "tenantId", bindProp = "./id"), + @Binding(field = "deptId", bindProp = "./departments", property = "id") + }) + private List users; + + // 角色实体 + @Entity(matchKeys = "tenant.roles", mapper = AcsTestRoleMapper.class) + @Bindings({ + @Binding(field = "tenantId", bindProp = "./id"), + @Binding(field = "groupId", bindProp = "./roleGroups", property = "id") + }) + private List roles; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/TenantView.java b/src/main/java/com/gitee/spring/domain/example/entity/TenantView.java deleted file mode 100644 index 7723aed..0000000 --- a/src/main/java/com/gitee/spring/domain/example/entity/TenantView.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.gitee.spring.domain.example.entity; - -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Bindings; -import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.core.impl.processor.PropertyProcessor; -import com.gitee.spring.domain.example.dal.mapper.AcsTestDeptMapper; -import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleGroupMapper; -import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMapper; -import com.gitee.spring.domain.example.dal.mapper.AcsTestTenantMapper; -import com.gitee.spring.domain.example.repository.UserRepository; -import lombok.Data; - -import java.util.List; - -@Data -@Entity(mapper = AcsTestTenantMapper.class) -public class TenantView { - // 主键 - private Integer id; - // 租户编码 - private String tenantCode; - // 租户名称 - private String tenantName; - - // 部门实体 - @Entity(matchKeys = "departments", mapper = AcsTestDeptMapper.class) - @Binding(field = "tenantId", bindProp = "./id") - private List departments; - - // 角色组实体 - @Entity(matchKeys = "roleGroups", mapper = AcsTestRoleGroupMapper.class) - @Binding(field = "tenantId", bindProp = "./id") - private List roleGroups; - - // 用户实体 - @Entity(matchKeys = "users", repository = UserRepository.class) - @Bindings({ - @Binding(field = "tenantId", bindProp = "./id"), - @Binding(field = "deptId", bindProp = "./departments", property = "id", processor = PropertyProcessor.class), - }) - private List users; - - // 角色实体 - @Entity(matchKeys = "roles", mapper = AcsTestRoleMapper.class) - @Bindings({ - @Binding(field = "tenantId", bindProp = "./id"), - @Binding(field = "groupId", bindProp = "./roleGroups", property = "id", processor = PropertyProcessor.class), - }) - private List roles; - -} diff --git a/src/main/java/com/gitee/spring/domain/example/entity/User.java b/src/main/java/com/gitee/spring/domain/example/entity/User.java index 7fc40ae..aca5bbc 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/User.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/User.java @@ -2,9 +2,10 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.factory.UserFactory; import com.gitee.spring.domain.example.dal.mapper.AcsTestUserMapper; -import com.gitee.spring.domain.example.repository.UserRoleRepository; +import com.gitee.spring.domain.example.dal.mapper.AcsTestUserRoleMapper; +import com.gitee.spring.domain.example.impl.factory.UserFactory; +import com.gitee.spring.domain.example.repository.RoleRepository; import lombok.Data; import java.util.Date; @@ -23,18 +24,22 @@ public class User { private String userCode; // 用户名称 private String userName; - // 是否主账户 1-是 2-否 - private Integer isMaster; + // 是否平台管理员 0-否 1-是 + private Integer isAdmin; // 状态 0-可用 1-禁用 private Integer status; // 创建者 private String createUser; // 创建时间 private Date createTime; - // 更新时间 - private Date updateTime; + // 用户角色关联实体 - @Entity(matchKeys = "role", repository = UserRoleRepository.class) + @Entity(matchKeys = "user.roles", mapper = AcsTestUserRoleMapper.class) @Binding(field = "userId", bindProp = "./id") private List userRoles; + + // 角色实体 + @Entity(matchKeys = "user.roles", repository = RoleRepository.class) + @Binding(field = "id", bindProp = "./userRoles", property = "roleId") + private List roles; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserView.java b/src/main/java/com/gitee/spring/domain/example/entity/UserAdmin.java similarity index 51% rename from src/main/java/com/gitee/spring/domain/example/entity/UserView.java rename to src/main/java/com/gitee/spring/domain/example/entity/UserAdmin.java index b04f55a..afff020 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/UserView.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/UserAdmin.java @@ -2,9 +2,8 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.core.impl.processor.PropertyProcessor; -import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMapper; import com.gitee.spring.domain.example.dal.mapper.AcsTestUserMapper; +import com.gitee.spring.domain.example.repository.RoleRepository; import lombok.Data; import lombok.EqualsAndHashCode; @@ -13,11 +12,18 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = false) @Entity(mapper = AcsTestUserMapper.class) -public class UserView extends User { +public class UserAdmin extends User { + + private Integer roleStatus = 0; // 角色实体 - @Entity(matchKeys = "role", mapper = AcsTestRoleMapper.class) - @Binding(field = "id", bindProp = "./userRoles", property = "roleId", processor = PropertyProcessor.class) - private List roles; + @Entity(matchKeys = "user.roles", repository = RoleRepository.class) + @Binding(field = "status", bindProp = "./roleStatus") + private List allRoles; + + @Override + public List getRoles() { + return allRoles; + } } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java index d12b4c3..f08228a 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java @@ -1,8 +1,6 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMapper; import com.gitee.spring.domain.example.dal.mapper.AcsTestUserRoleMapper; import lombok.Data; @@ -21,8 +19,4 @@ public class UserRole { private String createUser; // 创建时间 private Date createTime; - // 角色实体 - @Entity(matchKeys = "role", mapper = AcsTestRoleMapper.class) - @Binding(field = "id", bindProp = "./roleId") - private Role role; } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Visitor.java b/src/main/java/com/gitee/spring/domain/example/entity/Visitor.java deleted file mode 100644 index 2448889..0000000 --- a/src/main/java/com/gitee/spring/domain/example/entity/Visitor.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gitee.spring.domain.example.entity; - -import lombok.AllArgsConstructor; -import lombok.Data; - -import java.util.List; - -@Data -@AllArgsConstructor -public class Visitor { - // 访问者用户关联实体 - private List visitorUsers; -} diff --git a/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java b/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java deleted file mode 100644 index 0db7937..0000000 --- a/src/main/java/com/gitee/spring/domain/example/entity/VisitorUser.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.gitee.spring.domain.example.entity; - -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Bindings; -import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.AcsTestUserMapper; -import com.gitee.spring.domain.example.dal.mapper.AcsTestVisitorUserMapper; -import lombok.Data; - -import java.util.Date; - -@Data -@Entity(mapper = AcsTestVisitorUserMapper.class) -public class VisitorUser { - // 主键 - private Integer id; - // 登录工号 - private String userLogin; - // 是否平台管理员 1-是 2-否 - private Integer isAdmin; - // 用户id - private Integer userId; - // 用户对象 - @Entity(matchKeys = "user", mapper = AcsTestUserMapper.class) - @Bindings({ - @Binding(field = "id", bindProp = "./userId"), - @Binding(field = "isMaster", bindCtx = "isMaster"), - @Binding(field = "status", bindCtx = "status") - }) - private User user; - // 创建者 - private String createUser; - // 创建时间 - private Date createTime; -} diff --git a/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantViewQuery.java b/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantViewQuery.java deleted file mode 100644 index 3612e07..0000000 --- a/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantViewQuery.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.gitee.spring.domain.example.entity.coating; - -import com.gitee.spring.domain.coating.annotation.Coating; -import com.gitee.spring.domain.example.entity.TenantView; -import lombok.Data; - -@Data -@Coating(qualifier = TenantView.class) -public class TenantViewQuery { - // 用户编码 - private String userCode; - // 页码 - private Long pageNum; - // 条目数 - private Long pageSize; -} diff --git a/src/main/java/com/gitee/spring/domain/example/factory/UserFactory.java b/src/main/java/com/gitee/spring/domain/example/impl/factory/UserFactory.java similarity index 60% rename from src/main/java/com/gitee/spring/domain/example/factory/UserFactory.java rename to src/main/java/com/gitee/spring/domain/example/impl/factory/UserFactory.java index 4f52c5c..6d62ee6 100644 --- a/src/main/java/com/gitee/spring/domain/example/factory/UserFactory.java +++ b/src/main/java/com/gitee/spring/domain/example/impl/factory/UserFactory.java @@ -1,9 +1,10 @@ -package com.gitee.spring.domain.example.factory; +package com.gitee.spring.domain.example.impl.factory; import cn.hutool.core.bean.BeanUtil; import com.gitee.spring.domain.core.entity.BoundedContext; import com.gitee.spring.domain.core.impl.DefaultEntityFactory; -import com.gitee.spring.domain.example.entity.UserView; +import com.gitee.spring.domain.example.entity.User; +import com.gitee.spring.domain.example.entity.UserAdmin; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.stereotype.Component; @@ -16,7 +17,12 @@ public class UserFactory extends DefaultEntityFactory { @Override public Object reconstitute(BoundedContext boundedContext, Object persistentObject) { persistentObject = super.reconstitute(boundedContext, persistentObject); - return BeanUtil.copyProperties(persistentObject, UserView.class); + User user = (User) persistentObject; + if (user.getIsAdmin() == 0) { + return user; + } else { + return BeanUtil.copyProperties(user, UserAdmin.class); + } } } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/listener/TenantListener.java b/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java similarity index 72% rename from src/main/java/com/gitee/spring/domain/example/entity/listener/TenantListener.java rename to src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java index 130b270..32897b6 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/listener/TenantListener.java +++ b/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java @@ -1,20 +1,25 @@ -package com.gitee.spring.domain.example.entity.listener; +package com.gitee.spring.domain.example.impl.listener; import com.gitee.spring.domain.event.annotation.Listener; import com.gitee.spring.domain.event.api.EntityListener; import com.gitee.spring.domain.event.listener.RepositoryEvent; import com.gitee.spring.domain.example.entity.Tenant; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +@Slf4j @Component @Listener(Tenant.class) public class TenantListener implements EntityListener { + public static int updateCount = 0; + @Override public void onApplicationEvent(RepositoryEvent repositoryEvent) { Object entity = repositoryEvent.getCondition().getEntity(); if (entity instanceof Tenant) { - System.out.println(entity); + updateCount = updateCount + 1; + log.info("update success"); } } diff --git a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestUserMapper.java b/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestUserMapper.java new file mode 100644 index 0000000..8d47f7c --- /dev/null +++ b/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestUserMapper.java @@ -0,0 +1,11 @@ +package com.gitee.spring.domain.example.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gitee.spring.domain.example.pojo.AcsTestUser; + +/** + * 用户表 + * Generated by MyBatis Generator on 2022-11-15 + */ +public interface AcsTestUserMapper extends BaseMapper { +} \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestVisitorUser.java b/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestUser.java similarity index 57% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestVisitorUser.java rename to src/main/java/com/gitee/spring/domain/example/pojo/AcsTestUser.java index 2a3de33..68621ef 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestVisitorUser.java +++ b/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestUser.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.dal.pojo; +package com.gitee.spring.domain.example.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; @@ -11,30 +11,41 @@ import lombok.Data; import lombok.NoArgsConstructor; /** - * 游客用户绑定表 - * Generated by Mybatis Generator on 2022-08-29 + * 用户表 + * Generated by Mybatis Generator on 2022-11-15 */ @Data @Builder @NoArgsConstructor @AllArgsConstructor -@TableName(value = "acs_test_visitor_user") -public class AcsTestVisitorUser { +@TableName(value = "acs_test_user") +public class AcsTestUser { // 主键 @TableId(value = "id", type = IdType.AUTO) private Integer id; - // 登录工号 - @TableField(value = "user_login") - private String userLogin; + // 租户id + @TableField(value = "tenant_id") + private Integer tenantId; - // 是否平台管理员 1-是 2-否 + // 部门id + @TableField(value = "dept_id") + private Integer deptId; + + // 用户编码 + @TableField(value = "user_code") + private String userCode; + + // 用户名称 + @TableField(value = "user_name") + private String userName; + + // 是否平台管理员 0-否 1-是 @TableField(value = "is_admin") private Integer isAdmin; - // 用户id - @TableField(value = "user_id") - private Integer userId; + // 状态 0-可用 1-禁用 + private Integer status; // 创建者 @TableField(value = "create_user") diff --git a/src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java deleted file mode 100644 index 6c0a7b2..0000000 --- a/src/main/java/com/gitee/spring/domain/example/repository/ApiRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gitee.spring.domain.example.repository; - -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; -import com.gitee.spring.domain.example.entity.Api; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@RootRepository -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class ApiRepository extends MybatisPlusRepository { -} diff --git a/src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java deleted file mode 100644 index 34d3939..0000000 --- a/src/main/java/com/gitee/spring/domain/example/repository/RoleMenuRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gitee.spring.domain.example.repository; - -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; -import com.gitee.spring.domain.example.entity.RoleMenu; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@RootRepository -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class RoleMenuRepository extends MybatisPlusRepository { -} diff --git a/src/main/java/com/gitee/spring/domain/example/repository/TenantViewRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/TenantViewRepository.java deleted file mode 100644 index b4bb471..0000000 --- a/src/main/java/com/gitee/spring/domain/example/repository/TenantViewRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.gitee.spring.domain.example.repository; - -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; -import com.gitee.spring.domain.coating.annotation.CoatingScan; -import com.gitee.spring.domain.example.entity.TenantView; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@RootRepository -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -@CoatingScan("com.gitee.spring.domain.example.entity.coating") -public class TenantViewRepository extends MybatisPlusRepository { -} diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserViewRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/UserAdminRepository.java similarity index 72% rename from src/main/java/com/gitee/spring/domain/example/repository/UserViewRepository.java rename to src/main/java/com/gitee/spring/domain/example/repository/UserAdminRepository.java index 84bcff5..59044f0 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/UserViewRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/UserAdminRepository.java @@ -2,7 +2,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; -import com.gitee.spring.domain.example.entity.UserView; +import com.gitee.spring.domain.example.entity.UserAdmin; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -11,5 +11,5 @@ import lombok.EqualsAndHashCode; @RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class UserViewRepository extends MybatisPlusRepository { +public class UserAdminRepository extends MybatisPlusRepository { } diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java index 5269c09..b13ea7b 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java @@ -12,5 +12,5 @@ import lombok.EqualsAndHashCode; @AllArgsConstructor @EqualsAndHashCode(callSuper = false) public class UserRepository extends MybatisPlusRepository { - private final UserViewRepository userViewRepository; + private final UserAdminRepository userAdminRepository; } diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java deleted file mode 100644 index 0e2caa1..0000000 --- a/src/main/java/com/gitee/spring/domain/example/repository/UserRoleRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gitee.spring.domain.example.repository; - -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; -import com.gitee.spring.domain.example.entity.UserRole; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@RootRepository -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class UserRoleRepository extends MybatisPlusRepository { -} diff --git a/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java deleted file mode 100644 index 2e1848f..0000000 --- a/src/main/java/com/gitee/spring/domain/example/repository/VisitorUserRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gitee.spring.domain.example.repository; - -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; -import com.gitee.spring.domain.example.entity.VisitorUser; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@RootRepository -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class VisitorUserRepository extends MybatisPlusRepository { -} diff --git a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java b/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java index 8d6aec2..e560f0f 100644 --- a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java +++ b/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java @@ -1,165 +1,200 @@ package com.gitee.spring.domain.example.service; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; import com.gitee.spring.domain.core.entity.BoundedContext; import com.gitee.spring.domain.core.entity.executor.Example; -import com.gitee.spring.domain.example.entity.*; -import com.gitee.spring.domain.example.repository.*; +import com.gitee.spring.domain.example.entity.Api; +import com.gitee.spring.domain.example.entity.Department; +import com.gitee.spring.domain.example.entity.Menu; +import com.gitee.spring.domain.example.entity.Role; +import com.gitee.spring.domain.example.entity.RoleGroup; +import com.gitee.spring.domain.example.entity.RoleMenu; +import com.gitee.spring.domain.example.entity.Tenant; +import com.gitee.spring.domain.example.entity.User; +import com.gitee.spring.domain.example.entity.UserRole; +import com.gitee.spring.domain.example.repository.MenuRepository; +import com.gitee.spring.domain.example.repository.RoleRepository; +import com.gitee.spring.domain.example.repository.TenantRepository; +import com.gitee.spring.domain.example.repository.UserRepository; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.Collections; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; @Service @AllArgsConstructor public class SaasDataService { private final TenantRepository tenantRepository; - private final DepartmentRepository departmentRepository; - private final RoleGroupRepository roleGroupRepository; private final UserRepository userRepository; private final RoleRepository roleRepository; - private final MenuRepository menuRepository; - private final ApiRepository apiRepository; - - private final VisitorUserRepository visitorUserRepository; - private final UserRoleRepository userRoleRepository; - private final RoleMenuRepository roleMenuRepository; public void newTenant() { Tenant tenant = new Tenant(); tenant.setTenantCode("tenant"); tenant.setTenantName("租户"); - tenant.setLogoUrl("https://gitee.com/digital-engine/spring-domain-example"); tenant.setStatus(0); tenant.setCreateUser("admin"); tenant.setCreateTime(new Date()); - Department department = new Department(); - department.setSuperId(null); - department.setDeptCode("dept"); - department.setDeptName("部门"); - department.setCreateUser("admin"); - department.setCreateTime(new Date()); - tenant.setDepartments(Collections.singletonList(department)); - - RoleGroup roleGroup = new RoleGroup(); - roleGroup.setSuperId(null); - roleGroup.setGroupCode("group"); - roleGroup.setGroupName("角色组"); - roleGroup.setCreateUser("admin"); - roleGroup.setCreateTime(new Date()); - tenant.setRoleGroups(Collections.singletonList(roleGroup)); - - User user = new User(); - user.setUserCode("000001"); - user.setUserName("用户"); - user.setIsMaster(1); - user.setStatus(0); - user.setCreateUser("admin"); - user.setCreateTime(new Date()); - department.setUsers(Collections.singletonList(user)); - - Role role = new Role(); - role.setRoleCode("admin"); - role.setRoleName("管理员"); - role.setStatus(0); - role.setCreateUser("admin"); - role.setCreateTime(new Date()); - roleGroup.setRoles(Collections.singletonList(role)); - - BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); + List departments = new ArrayList<>(); + for (int index = 0; index < 10; index++) { + Department department = new Department(); + department.setSuperId(null); + department.setDeptCode("dept" + index); + department.setDeptName("部门" + index); + department.setCreateUser("admin"); + department.setCreateTime(new Date()); + departments.add(department); + } + tenant.setDepartments(departments); + + List roleGroups = new ArrayList<>(); + for (int index = 0; index < 10; index++) { + RoleGroup roleGroup = new RoleGroup(); + roleGroup.setSuperId(null); + roleGroup.setGroupCode("group" + index); + roleGroup.setGroupName("角色组" + index); + roleGroup.setCreateUser("admin"); + roleGroup.setCreateTime(new Date()); + roleGroups.add(roleGroup); + } + tenant.setRoleGroups(roleGroups); + + BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups"); int count = tenantRepository.insert(boundedContext, tenant); - Assert.isTrue(count == 5); + Assert.isTrue(count == 21); + + List users = new ArrayList<>(); + int adminIndex = RandomUtil.randomInt(0, 10); + for (int index = 0; index < 10; index++) { + User user = new User(); + Department department = departments.get(RandomUtil.randomInt(0, 10)); + user.setDeptId(department.getId()); + user.setUserCode(StrUtil.fillBefore(String.valueOf(index), '0', 6)); + user.setUserName("用户" + index); + user.setIsAdmin(index == adminIndex ? 1 : 0); + user.setStatus(0); + user.setCreateUser("admin"); + user.setCreateTime(new Date()); + users.add(user); + } + tenant.setUsers(users); + + List roles = new ArrayList<>(); + for (int index = 0; index < 10; index++) { + Role role = new Role(); + RoleGroup roleGroup = roleGroups.get(RandomUtil.randomInt(0, 10)); + role.setGroupId(roleGroup.getId()); + role.setRoleCode("role" + index); + role.setRoleName("角色" + index); + role.setStatus(0); + role.setCreateUser("admin"); + role.setCreateTime(new Date()); + roles.add(role); + } + tenant.setRoles(roles); + + boundedContext = new BoundedContext("tenant.users", "tenant.roles"); + count = tenantRepository.insert(boundedContext, tenant); + Assert.isTrue(count == 20); } public void newMenuAndApi() { - Menu menu = new Menu(); - menu.setSuperId(null); - menu.setMenuCode("menu"); - menu.setMenuName("菜单"); - menu.setMenuType("nav"); - menu.setMenuIndex(0); - menu.setOnlyAdmin(2); - menu.setCreateUser("admin"); - menu.setCreateTime(new Date()); - - Api api = new Api(); - api.setApiCode("api"); - api.setApiName("接口"); - api.setApiUrl("/test"); - api.setCreateUser("admin"); - api.setCreateTime(new Date()); - menu.setApis(Collections.singletonList(api)); - - BoundedContext boundedContext = new BoundedContext("api"); - int count = menuRepository.insert(boundedContext, menu); - Assert.isTrue(count == 2); + List menus = new ArrayList<>(); + for (int index = 0; index < 10; index++) { + Menu menu = new Menu(); + menu.setSuperId(null); + menu.setMenuCode("menu" + index); + menu.setMenuName("菜单" + index); + menu.setMenuType("nav"); + menu.setCreateUser("admin"); + menu.setCreateTime(new Date()); + + Api api = new Api(); + api.setApiCode("api" + index); + api.setApiName("接口" + index); + api.setApiUrl("/api" + index); + api.setCreateUser("admin"); + api.setCreateTime(new Date()); + menu.setApis(Collections.singletonList(api)); + + menus.add(menu); + } + + BoundedContext boundedContext = new BoundedContext("menu.apis"); + int count = menuRepository.insertList(boundedContext, menus); + Assert.isTrue(count == 20); } public void newBindings() { - BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); - Example example = new Example(); - example.orderByDesc("id"); - example.startPage(1, 1); + BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "tenant.users", "tenant.roles"); + Example example = new Example().orderByDesc("id").startPage(1, 1); List tenants = tenantRepository.selectByExample(boundedContext, example); Tenant tenant = tenants.get(0); - Department department = tenant.getDepartments().get(0); - RoleGroup roleGroup = tenant.getRoleGroups().get(0); - User user = department.getUsers().get(0); - Role role = roleGroup.getRoles().get(0); - - boundedContext = new BoundedContext("api"); - Example example1 = new Example(); - example1.orderByDesc("id"); - example1.startPage(1, 1); + List users = tenant.getUsers(); + List roles = tenant.getRoles(); + + boundedContext = new BoundedContext("menu.apis"); + Example example1 = new Example().orderByDesc("id").startPage(1, 10); List menus = menuRepository.selectByExample(boundedContext, example1); - Menu menu = menus.get(0); - - VisitorUser visitorUser = new VisitorUser(); - visitorUser.setUserLogin("000001"); - visitorUser.setIsAdmin(2); - visitorUser.setCreateUser("admin"); - visitorUser.setCreateTime(new Date()); - visitorUser.setUser(user); - - UserRole userRole = new UserRole(); - userRole.setCreateUser("admin"); - userRole.setCreateTime(new Date()); - user.setUserRoles(Collections.singletonList(userRole)); - userRole.setRole(role); - - RoleMenu roleMenu = new RoleMenu(); - roleMenu.setDataAuthority(4); - roleMenu.setCreateUser("admin"); - roleMenu.setCreateTime(new Date()); - role.setRoleMenus(Collections.singletonList(roleMenu)); - roleMenu.setMenu(menu); - - boundedContext = new BoundedContext("user", "role", "menu", "api"); - int count = visitorUserRepository.insert(boundedContext, visitorUser); - Assert.isTrue(count == 3); - } - public void clear() { - BoundedContext boundedContext = new BoundedContext(); - Example example = new Example(); + for (User user : users) { + List userRoles = new ArrayList<>(); + Set existIds = new HashSet<>(); + for (int index = RandomUtil.randomInt(0, 5); index >= 0; index--) { + Role role = roles.get(RandomUtil.randomInt(0, 10)); + if (existIds.add(role.getId())) { + UserRole userRole = new UserRole(); + userRole.setRoleId(role.getId()); + userRole.setCreateUser("admin"); + userRole.setCreateTime(new Date()); + userRoles.add(userRole); + } + } + user.setUserRoles(userRoles); + } + + boundedContext = new BoundedContext("user.roles"); + int count = userRepository.insertList(boundedContext, users); + Assert.isTrue(count > 0); - int count = tenantRepository.deleteByExample(boundedContext, example); - count += departmentRepository.deleteByExample(boundedContext, example); - count += roleGroupRepository.deleteByExample(boundedContext, example); - count += userRepository.deleteByExample(boundedContext, example); - count += roleRepository.deleteByExample(boundedContext, example); + for (Role role : roles) { + List roleMenus = new ArrayList<>(); + Set existIds = new HashSet<>(); + for (int index = RandomUtil.randomInt(0, 5); index >= 0; index--) { + Menu menu = menus.get(RandomUtil.randomInt(0, 10)); + if (existIds.add(menu.getId())) { + RoleMenu roleMenu = new RoleMenu(); + roleMenu.setMenuId(menu.getId()); + roleMenu.setDataAuthority(4); + roleMenu.setCreateUser("admin"); + roleMenu.setCreateTime(new Date()); + roleMenus.add(roleMenu); + } + } + role.setRoleMenus(roleMenus); + } + + boundedContext = new BoundedContext("role.menus"); + count = roleRepository.insertList(boundedContext, roles); + Assert.isTrue(count > 0); + } - count += menuRepository.deleteByExample(boundedContext, example); - count += apiRepository.deleteByExample(boundedContext, example); + public void clear() { + BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups"); + int count = tenantRepository.deleteByExample(boundedContext, new Example()); - count += visitorUserRepository.deleteByExample(boundedContext, example); - count += userRoleRepository.deleteByExample(boundedContext, example); - count += roleMenuRepository.deleteByExample(boundedContext, example); + boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); + count += userRepository.deleteByExample(boundedContext, new Example()); Assert.isTrue(count > 0); } diff --git a/src/main/resources/mapper/AcsTestUserMapper.xml b/src/main/resources/mapper/AcsTestUserMapper.xml index a4a1823..9875198 100644 --- a/src/main/resources/mapper/AcsTestUserMapper.xml +++ b/src/main/resources/mapper/AcsTestUserMapper.xml @@ -7,14 +7,14 @@ - + - id, tenant_id, dept_id, user_code, user_name, is_master, status, create_user, create_time, + id, tenant_id, dept_id, user_code, user_name, is_admin, status, create_user, create_time, update_time \ No newline at end of file diff --git a/src/main/resources/mapper/AcsTestVisitorUserMapper.xml b/src/main/resources/mapper/AcsTestVisitorUserMapper.xml deleted file mode 100644 index ee165db..0000000 --- a/src/main/resources/mapper/AcsTestVisitorUserMapper.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - id, user_login, is_admin, user_id, create_user, create_time, update_time - - \ No newline at end of file diff --git a/src/test/java/com/gitee/spring/domain/example/AppTest.java b/src/test/java/com/gitee/spring/domain/example/AppTest.java new file mode 100644 index 0000000..e158107 --- /dev/null +++ b/src/test/java/com/gitee/spring/domain/example/AppTest.java @@ -0,0 +1,38 @@ +package com.gitee.spring.domain.example; + +import com.gitee.spring.domain.example.service.SaasDataService; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@Slf4j +@SpringBootTest +@DisplayName("数据测试") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class AppTest { + + @Autowired + private SaasDataService saasDataService; + + @Test + @Order(1) + @DisplayName("新增测试") + public void test01() { + saasDataService.newTenant(); + saasDataService.newMenuAndApi(); + saasDataService.newBindings(); + } + + @Test + @Order(2) + @DisplayName("销毁测试") + public void test02() { + saasDataService.clear(); + } + +} diff --git a/src/test/java/com/gitee/spring/domain/example/BinderTest.java b/src/test/java/com/gitee/spring/domain/example/BinderTest.java index 36d7442..2df2a89 100644 --- a/src/test/java/com/gitee/spring/domain/example/BinderTest.java +++ b/src/test/java/com/gitee/spring/domain/example/BinderTest.java @@ -6,7 +6,6 @@ import com.gitee.spring.domain.core.impl.binder.PropertyBinder; import com.gitee.spring.domain.core.impl.resolver.BinderResolver; import com.gitee.spring.domain.core.repository.ConfiguredRepository; import com.gitee.spring.domain.example.repository.DepartmentRepository; -import com.gitee.spring.domain.example.repository.VisitorUserRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -20,16 +19,14 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; @Slf4j @SpringBootTest -@DisplayName("绑定器解析测试") +@DisplayName("绑定器测试") public class BinderTest { @Autowired private DepartmentRepository departmentRepository; - @Autowired - private VisitorUserRepository visitorUserRepository; @Test - @DisplayName("测试绑定器解析逻辑") + @DisplayName("解析测试") public void test01() { Map allRepositoryMap = departmentRepository.getAllRepositoryMap(); ConfiguredRepository repository = allRepositoryMap.get("/users"); @@ -48,24 +45,4 @@ public class BinderTest { assumeTrue(boundIdBinder == null); } - @Test - @DisplayName("测试绑定器解析逻辑(绑定id值)") - public void test02() { - Map allRepositoryMap = visitorUserRepository.getAllRepositoryMap(); - ConfiguredRepository repository = allRepositoryMap.get("/user"); - BinderResolver binderResolver = repository.getBinderResolver(); - - List allBinders = binderResolver.getAllBinders(); - List propertyBinders = binderResolver.getPropertyBinders(); - List contextBinders = binderResolver.getContextBinders(); - List boundValueBinders = binderResolver.getBoundValueBinders(); - PropertyBinder boundIdBinder = binderResolver.getBoundIdBinder(); - - assumeTrue(allBinders.size() == 3); - assumeTrue(propertyBinders.size() == 1); - assumeTrue(contextBinders.size() == 2); - assumeTrue(boundValueBinders.size() == 2); - assumeTrue(boundIdBinder != null); - } - } diff --git a/src/test/java/com/gitee/spring/domain/example/CRUDTest.java b/src/test/java/com/gitee/spring/domain/example/CRUDTest.java index ca1b1f3..bdea3da 100644 --- a/src/test/java/com/gitee/spring/domain/example/CRUDTest.java +++ b/src/test/java/com/gitee/spring/domain/example/CRUDTest.java @@ -4,11 +4,9 @@ import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core.entity.BoundedContext; import com.gitee.spring.domain.core.entity.executor.Example; import com.gitee.spring.domain.example.entity.Tenant; -import com.gitee.spring.domain.example.entity.Visitor; -import com.gitee.spring.domain.example.entity.VisitorUser; +import com.gitee.spring.domain.example.entity.User; import com.gitee.spring.domain.example.repository.TenantRepository; -import com.gitee.spring.domain.example.repository.VisitorUserRepository; -import com.gitee.spring.domain.example.service.SaasDataService; +import com.gitee.spring.domain.example.repository.UserRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; @@ -18,9 +16,7 @@ import org.junit.jupiter.api.TestMethodOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import java.util.LinkedHashSet; import java.util.List; -import java.util.Set; import static org.junit.jupiter.api.Assumptions.assumeTrue; @@ -30,67 +26,54 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class CRUDTest { - @Autowired - private SaasDataService saasDataService; @Autowired private TenantRepository tenantRepository; @Autowired - private VisitorUserRepository visitorUserRepository; + private UserRepository userRepository; @Test @Order(1) - @DisplayName("测试新增逻辑") + @DisplayName("新增测试") public void test01() { - saasDataService.newTenant(); - saasDataService.newMenuAndApi(); - saasDataService.newBindings(); + } @Test @Order(2) - @DisplayName("测试查询逻辑") + @DisplayName("查询测试") public void test02() { - BoundedContext boundedContext = new BoundedContext("user", "role", "menu", "api"); - Example example = new Example().eq("userLogin", "000001"); - List visitorUsers = visitorUserRepository.selectByExample(boundedContext, example); - Visitor visitor = new Visitor(visitorUsers); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(visitor))); - assumeTrue(visitor.getVisitorUsers().size() > 0); + BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "tenant.users", "tenant.roles"); + Example example = new Example().eq("tenantCode", "tenant"); + List tenants = tenantRepository.selectByExample(boundedContext, example); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenants))); + assumeTrue(tenants.size() > 0); + + boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); + example = new Example().eq("userCode", "000001"); + List users = userRepository.selectByExample(boundedContext, example); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(users))); + assumeTrue(users.size() > 0); } @Test @Order(3) - @DisplayName("测试更新逻辑") + @DisplayName("更新测试") public void test03() { - BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); + BoundedContext boundedContext = new BoundedContext(); Example example = new Example().eq("tenantCode", "tenant"); List tenants = tenantRepository.selectByExample(boundedContext, example); Tenant tenant = tenants.get(0); log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenant))); - - // 非空更新 tenant.setStatus(1); int count = tenantRepository.update(boundedContext, tenant); - assumeTrue(count == 5); - - // 强制更新 - boundedContext = new BoundedContext(); - - Set fieldNames = new LinkedHashSet<>(); - fieldNames.add("logoUrl"); - boundedContext.put("tenant.nullable", fieldNames); - - tenant.setLogoUrl(null); - - count = tenantRepository.update(boundedContext, tenant); assumeTrue(count == 1); } @Test @Order(4) - @DisplayName("测试删除逻辑") + @DisplayName("删除测试") public void test04() { - saasDataService.clear(); + } } diff --git a/src/test/java/com/gitee/spring/domain/example/CoatingTest.java b/src/test/java/com/gitee/spring/domain/example/CoatingTest.java index 950443c..254b70d 100644 --- a/src/test/java/com/gitee/spring/domain/example/CoatingTest.java +++ b/src/test/java/com/gitee/spring/domain/example/CoatingTest.java @@ -29,9 +29,9 @@ public class CoatingTest { @Test @Order(1) - @DisplayName("反向查询") + @DisplayName("查询测试") public void test01() { - BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); + BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "tenant.users", "tenant.roles"); TenantQuery tenantQuery = new TenantQuery(); tenantQuery.setUserCode("000001"); tenantQuery.setPageNum(1L); diff --git a/src/test/java/com/gitee/spring/domain/example/EventTest.java b/src/test/java/com/gitee/spring/domain/example/EventTest.java index b5b6cd9..e69b69f 100644 --- a/src/test/java/com/gitee/spring/domain/example/EventTest.java +++ b/src/test/java/com/gitee/spring/domain/example/EventTest.java @@ -2,8 +2,9 @@ package com.gitee.spring.domain.example; import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.core.entity.executor.Example; import com.gitee.spring.domain.example.entity.Tenant; -import com.gitee.spring.domain.example.entity.coating.TenantQuery; +import com.gitee.spring.domain.example.impl.listener.TenantListener; import com.gitee.spring.domain.example.repository.TenantRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; @@ -29,21 +30,17 @@ public class EventTest { @Test @Order(1) - @DisplayName("更新事件测试") + @DisplayName("更新测试") public void test01() { - BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); - TenantQuery tenantQuery = new TenantQuery(); - tenantQuery.setUserCode("000001"); - tenantQuery.setPageNum(1L); - tenantQuery.setPageSize(10L); - List tenants = tenantRepository.selectByCoating(boundedContext, tenantQuery); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenants))); - + BoundedContext boundedContext = new BoundedContext(); + Example example = new Example().eq("tenantCode", "tenant").startPage(); + List tenants = tenantRepository.selectByExample(boundedContext, example); Tenant tenant = tenants.get(0); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenant))); tenant.setStatus(1); - int count = tenantRepository.update(new BoundedContext(), tenant); - - assumeTrue(count > 0); + int lastUpdateCount = TenantListener.updateCount; + int count = tenantRepository.update(boundedContext, tenant); + assumeTrue(lastUpdateCount + 1 == TenantListener.updateCount && count == 1); } } diff --git a/src/test/java/com/gitee/spring/domain/example/OverrideTest.java b/src/test/java/com/gitee/spring/domain/example/OverrideTest.java index 237d047..85b8667 100644 --- a/src/test/java/com/gitee/spring/domain/example/OverrideTest.java +++ b/src/test/java/com/gitee/spring/domain/example/OverrideTest.java @@ -3,8 +3,9 @@ package com.gitee.spring.domain.example; import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core.entity.BoundedContext; import com.gitee.spring.domain.core.entity.executor.Example; -import com.gitee.spring.domain.example.entity.TenantView; -import com.gitee.spring.domain.example.repository.TenantViewRepository; +import com.gitee.spring.domain.example.entity.User; +import com.gitee.spring.domain.example.entity.UserAdmin; +import com.gitee.spring.domain.example.repository.UserRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; @@ -25,17 +26,19 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; public class OverrideTest { @Autowired - private TenantViewRepository tenantViewRepository; + private UserRepository userRepository; @Test @Order(1) - @DisplayName("查询") + @DisplayName("查询测试") public void test01() { - BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles", "role"); - Example example = new Example(); - List tenantViews = tenantViewRepository.selectByExample(boundedContext, example); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenantViews))); - assumeTrue(!tenantViews.isEmpty()); + BoundedContext boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); + Example example = new Example().eq("isAdmin", 1).startPage(); + List users = userRepository.selectByExample(boundedContext, example); + User user = users.get(0); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(user))); + assumeTrue(user instanceof UserAdmin); + assumeTrue(user.getRoles().size() == 10); } } diff --git a/src/test/java/com/gitee/spring/domain/example/ViewTest.java b/src/test/java/com/gitee/spring/domain/example/ViewTest.java deleted file mode 100644 index 643ed95..0000000 --- a/src/test/java/com/gitee/spring/domain/example/ViewTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.gitee.spring.domain.example; - -import cn.hutool.json.JSONUtil; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.core.entity.executor.Example; -import com.gitee.spring.domain.example.entity.TenantView; -import com.gitee.spring.domain.example.entity.coating.TenantViewQuery; -import com.gitee.spring.domain.example.repository.TenantViewRepository; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.List; - -import static org.junit.jupiter.api.Assumptions.assumeTrue; - -@Slf4j -@SpringBootTest -@DisplayName("视图测试") -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class ViewTest { - - @Autowired - private TenantViewRepository tenantViewRepository; - - @Test - @Order(1) - @DisplayName("查询") - public void test01() { - BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); - Example example = new Example(); - List tenantViews = tenantViewRepository.selectByExample(boundedContext, example); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenantViews))); - assumeTrue(!tenantViews.isEmpty()); - } - - @Test - @Order(2) - @DisplayName("反向查询") - public void test02() { - BoundedContext boundedContext = new BoundedContext("departments", "roleGroups", "users", "roles"); - TenantViewQuery tenantViewQuery = new TenantViewQuery(); - tenantViewQuery.setUserCode("000001"); - tenantViewQuery.setPageNum(1L); - tenantViewQuery.setPageSize(10L); - List tenantViews = tenantViewRepository.selectByCoating(boundedContext, tenantViewQuery); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenantViews))); - assumeTrue(!tenantViews.isEmpty()); - } - -} -- Gitee From 4749b97dcbed814a775a1e5186b6d385ed997622 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 15 Nov 2022 19:00:11 +0800 Subject: [PATCH 15/42] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/mapper/AcsTestUserMapper.java | 11 ---- .../domain/example/pojo/AcsTestUser.java | 61 ------------------- 2 files changed, 72 deletions(-) delete mode 100644 src/main/java/com/gitee/spring/domain/example/mapper/AcsTestUserMapper.java delete mode 100644 src/main/java/com/gitee/spring/domain/example/pojo/AcsTestUser.java diff --git a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestUserMapper.java b/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestUserMapper.java deleted file mode 100644 index 8d47f7c..0000000 --- a/src/main/java/com/gitee/spring/domain/example/mapper/AcsTestUserMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gitee.spring.domain.example.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.pojo.AcsTestUser; - -/** - * 用户表 - * Generated by MyBatis Generator on 2022-11-15 - */ -public interface AcsTestUserMapper extends BaseMapper { -} \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestUser.java b/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestUser.java deleted file mode 100644 index 68621ef..0000000 --- a/src/main/java/com/gitee/spring/domain/example/pojo/AcsTestUser.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.gitee.spring.domain.example.pojo; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import java.util.Date; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 用户表 - * Generated by Mybatis Generator on 2022-11-15 - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@TableName(value = "acs_test_user") -public class AcsTestUser { - // 主键 - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - // 租户id - @TableField(value = "tenant_id") - private Integer tenantId; - - // 部门id - @TableField(value = "dept_id") - private Integer deptId; - - // 用户编码 - @TableField(value = "user_code") - private String userCode; - - // 用户名称 - @TableField(value = "user_name") - private String userName; - - // 是否平台管理员 0-否 1-是 - @TableField(value = "is_admin") - private Integer isAdmin; - - // 状态 0-可用 1-禁用 - private Integer status; - - // 创建者 - @TableField(value = "create_user") - private String createUser; - - // 创建时间 - @TableField(value = "create_time") - private Date createTime; - - // 更新时间 - @TableField(value = "update_time") - private Date updateTime; -} \ No newline at end of file -- Gitee From ce244b996b6bb2e2774605c001e967cdaa6270ec Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 15 Nov 2022 19:13:25 +0800 Subject: [PATCH 16/42] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/com/gitee/spring/domain/example/CRUDTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/gitee/spring/domain/example/CRUDTest.java b/src/test/java/com/gitee/spring/domain/example/CRUDTest.java index bdea3da..091b55f 100644 --- a/src/test/java/com/gitee/spring/domain/example/CRUDTest.java +++ b/src/test/java/com/gitee/spring/domain/example/CRUDTest.java @@ -46,13 +46,13 @@ public class CRUDTest { Example example = new Example().eq("tenantCode", "tenant"); List tenants = tenantRepository.selectByExample(boundedContext, example); log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenants))); - assumeTrue(tenants.size() > 0); + assumeTrue(!tenants.isEmpty()); boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); example = new Example().eq("userCode", "000001"); List users = userRepository.selectByExample(boundedContext, example); log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(users))); - assumeTrue(users.size() > 0); + assumeTrue(!users.isEmpty()); } @Test -- Gitee From bb43a5c64700b10d22e42ef9ba1756d4f0dde329 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Tue, 15 Nov 2022 23:40:38 +0800 Subject: [PATCH 17/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=A1=A8=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 41 +++++---------- .../init.sql | 49 ++++-------------- script/query.sql | 13 +++++ ...csTestApiMapper.java => SysApiMapper.java} | 4 +- ...TestDeptMapper.java => SysDeptMapper.java} | 4 +- ...TestMenuMapper.java => SysMenuMapper.java} | 4 +- ...oupMapper.java => SysRoleGroupMapper.java} | 4 +- ...TestRoleMapper.java => SysRoleMapper.java} | 4 +- ...MenuMapper.java => SysRoleMenuMapper.java} | 4 +- ...TenantMapper.java => SysTenantMapper.java} | 4 +- ...TestUserMapper.java => SysUserMapper.java} | 4 +- ...RoleMapper.java => SysUserRoleMapper.java} | 4 +- .../dal/pojo/{AcsTestApi.java => SysApi.java} | 4 +- .../pojo/{AcsTestDept.java => SysDept.java} | 7 +-- .../pojo/{AcsTestMenu.java => SysMenu.java} | 4 +- .../pojo/{AcsTestRole.java => SysRole.java} | 7 +-- ...csTestRoleGroup.java => SysRoleGroup.java} | 7 +-- ...{AcsTestRoleMenu.java => SysRoleMenu.java} | 7 +-- .../{AcsTestTenant.java => SysTenant.java} | 7 +-- .../pojo/{AcsTestUser.java => SysUser.java} | 4 +- ...{AcsTestUserRole.java => SysUserRole.java} | 7 +-- .../spring/domain/example/entity/Api.java | 4 +- .../domain/example/entity/Department.java | 8 +-- .../spring/domain/example/entity/Menu.java | 8 +-- .../spring/domain/example/entity/Role.java | 8 +-- .../domain/example/entity/RoleGroup.java | 8 +-- .../domain/example/entity/RoleMenu.java | 4 +- .../spring/domain/example/entity/Tenant.java | 20 +++---- .../spring/domain/example/entity/User.java | 8 +-- .../domain/example/entity/UserAdmin.java | 4 +- .../domain/example/entity/UserRole.java | 4 +- ...{AcsTestApiMapper.xml => SysApiMapper.xml} | 4 +- ...csTestDeptMapper.xml => SysDeptMapper.xml} | 4 +- ...csTestMenuMapper.xml => SysMenuMapper.xml} | 4 +- ...GroupMapper.xml => SysRoleGroupMapper.xml} | 4 +- ...csTestRoleMapper.xml => SysRoleMapper.xml} | 4 +- ...leMenuMapper.xml => SysRoleMenuMapper.xml} | 4 +- ...stTenantMapper.xml => SysTenantMapper.xml} | 4 +- ...csTestUserMapper.xml => SysUserMapper.xml} | 4 +- ...erRoleMapper.xml => SysUserRoleMapper.xml} | 4 +- ...6\345\237\237\346\250\241\345\236\213.jpg" | Bin 191642 -> 0 bytes ...\345\220\210_\346\270\270\345\256\242.jpg" | Bin 161054 -> 0 bytes ...\345\220\210_\347\247\237\346\210\267.jpg" | Bin 73264 -> 0 bytes ...\345\220\210_\350\217\234\345\215\225.jpg" | Bin 31748 -> 0 bytes ...0\351\207\217\346\237\245\350\257\242.sql" | 14 ----- 45 files changed, 140 insertions(+), 179 deletions(-) rename "static/script/Saas\345\210\235\345\247\213\345\214\226\350\204\232\346\234\254.sql" => script/init.sql (72%) create mode 100644 script/query.sql rename src/main/java/com/gitee/spring/domain/example/dal/mapper/{AcsTestApiMapper.java => SysApiMapper.java} (58%) rename src/main/java/com/gitee/spring/domain/example/dal/mapper/{AcsTestDeptMapper.java => SysDeptMapper.java} (58%) rename src/main/java/com/gitee/spring/domain/example/dal/mapper/{AcsTestMenuMapper.java => SysMenuMapper.java} (58%) rename src/main/java/com/gitee/spring/domain/example/dal/mapper/{AcsTestRoleGroupMapper.java => SysRoleGroupMapper.java} (55%) rename src/main/java/com/gitee/spring/domain/example/dal/mapper/{AcsTestRoleMapper.java => SysRoleMapper.java} (58%) rename src/main/java/com/gitee/spring/domain/example/dal/mapper/{AcsTestRoleMenuMapper.java => SysRoleMenuMapper.java} (57%) rename src/main/java/com/gitee/spring/domain/example/dal/mapper/{AcsTestTenantMapper.java => SysTenantMapper.java} (56%) rename src/main/java/com/gitee/spring/domain/example/dal/mapper/{AcsTestUserMapper.java => SysUserMapper.java} (58%) rename src/main/java/com/gitee/spring/domain/example/dal/mapper/{AcsTestUserRoleMapper.java => SysUserRoleMapper.java} (57%) rename src/main/java/com/gitee/spring/domain/example/dal/pojo/{AcsTestApi.java => SysApi.java} (95%) rename src/main/java/com/gitee/spring/domain/example/dal/pojo/{AcsTestDept.java => SysDept.java} (95%) rename src/main/java/com/gitee/spring/domain/example/dal/pojo/{AcsTestMenu.java => SysMenu.java} (96%) rename src/main/java/com/gitee/spring/domain/example/dal/pojo/{AcsTestRole.java => SysRole.java} (95%) rename src/main/java/com/gitee/spring/domain/example/dal/pojo/{AcsTestRoleGroup.java => SysRoleGroup.java} (94%) rename src/main/java/com/gitee/spring/domain/example/dal/pojo/{AcsTestRoleMenu.java => SysRoleMenu.java} (94%) rename src/main/java/com/gitee/spring/domain/example/dal/pojo/{AcsTestTenant.java => SysTenant.java} (95%) rename src/main/java/com/gitee/spring/domain/example/dal/pojo/{AcsTestUser.java => SysUser.java} (95%) rename src/main/java/com/gitee/spring/domain/example/dal/pojo/{AcsTestUserRole.java => SysUserRole.java} (93%) rename src/main/resources/mapper/{AcsTestApiMapper.xml => SysApiMapper.xml} (89%) rename src/main/resources/mapper/{AcsTestDeptMapper.xml => SysDeptMapper.xml} (89%) rename src/main/resources/mapper/{AcsTestMenuMapper.xml => SysMenuMapper.xml} (91%) rename src/main/resources/mapper/{AcsTestRoleGroupMapper.xml => SysRoleGroupMapper.xml} (88%) rename src/main/resources/mapper/{AcsTestRoleMapper.xml => SysRoleMapper.xml} (90%) rename src/main/resources/mapper/{AcsTestRoleMenuMapper.xml => SysRoleMenuMapper.xml} (87%) rename src/main/resources/mapper/{AcsTestTenantMapper.xml => SysTenantMapper.xml} (90%) rename src/main/resources/mapper/{AcsTestUserMapper.xml => SysUserMapper.xml} (90%) rename src/main/resources/mapper/{AcsTestUserRoleMapper.xml => SysUserRoleMapper.xml} (86%) delete mode 100644 "static/img/Saas\351\242\206\345\237\237\346\250\241\345\236\213.jpg" delete mode 100644 "static/img/\350\201\232\345\220\210_\346\270\270\345\256\242.jpg" delete mode 100644 "static/img/\350\201\232\345\220\210_\347\247\237\346\210\267.jpg" delete mode 100644 "static/img/\350\201\232\345\220\210_\350\217\234\345\215\225.jpg" delete mode 100644 "static/script/Saas\345\205\250\351\207\217\346\237\245\350\257\242.sql" diff --git a/README.md b/README.md index bee9b63..c76d9dc 100644 --- a/README.md +++ b/README.md @@ -7,35 +7,18 @@ - 克隆或下载spring-domain项目,使用maven install命令进行打包。地址:https://gitee.com/digital-engine/spring-domain - 克隆或下载spring-domain-example项目。 - 在application-db.yml配置文件中,添加数据库连接配置。 -- 在数据库中,执行初始化脚本(Saas初始化脚本.sql)。 +- 在数据库中,执行初始化脚本(init.sql)。 ## 表说明 -| 表名 | 注释 | -| :-------------------: | :------------: | -| acs_test_tenant | 租户表 | -| acs_test_dept | 部门表 | -| acs_test_user | 用户表 | -| acs_test_role_group | 角色组表 | -| acs_test_role | 角色表 | -| acs_test_menu | 菜单表 | -| acs_test_api | 接口表 | -| acs_test_visitor_user | 游客用户绑定表 | -| acs_test_user_role | 用户角色绑定表 | -| acs_test_role_menu | 角色菜单绑定表 | - -## 领域模型 - -![avatar](https://gitee.com/digital-engine/spring-domain-example/raw/master/static/img/Saas领域模型.jpg) - -## 聚合(租户) - -![avatar](https://gitee.com/digital-engine/spring-domain-example/raw/master/static/img/聚合_租户.jpg) - -## 聚合(菜单) - -![avatar](https://gitee.com/digital-engine/spring-domain-example/raw/master/static/img/聚合_菜单.jpg) - -## 聚合(游客) - -![avatar](https://gitee.com/digital-engine/spring-domain-example/raw/master/static/img/聚合_游客.jpg) \ No newline at end of file +| 表名 | 注释 | +| :------------: | :------------: | +| sys_tenant | 租户表 | +| sys_dept | 部门表 | +| sys_user | 用户表 | +| sys_role_group | 角色组表 | +| sys_role | 角色表 | +| sys_menu | 菜单表 | +| sys_api | 接口表 | +| sys_user_role | 用户角色绑定表 | +| sys_role_menu | 角色菜单绑定表 | diff --git "a/static/script/Saas\345\210\235\345\247\213\345\214\226\350\204\232\346\234\254.sql" b/script/init.sql similarity index 72% rename from "static/script/Saas\345\210\235\345\247\213\345\214\226\350\204\232\346\234\254.sql" rename to script/init.sql index 8b0f82b..ea55519 100644 --- "a/static/script/Saas\345\210\235\345\247\213\345\214\226\350\204\232\346\234\254.sql" +++ b/script/init.sql @@ -1,19 +1,16 @@ -CREATE TABLE `acs_test_tenant` ( +CREATE TABLE `sys_tenant` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_code` varchar(128) DEFAULT NULL COMMENT '租户编码', `tenant_name` varchar(128) DEFAULT NULL COMMENT '租户名称', - `logo_url` varchar(512) DEFAULT NULL COMMENT '企业logo', `status` int(2) DEFAULT NULL COMMENT '状态 0-可用 1-禁用', `create_user` varchar(50) DEFAULT NULL COMMENT '创建者', `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_user` varchar(50) DEFAULT NULL COMMENT '更新者', - `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_tenant_code` (`tenant_code`), KEY `idx_tenant_name` (`tenant_name`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='租户表'; -CREATE TABLE `acs_test_dept` ( +CREATE TABLE `sys_dept` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` int(11) DEFAULT NULL COMMENT '租户id', `super_id` int(11) DEFAULT NULL COMMENT '父节点id', @@ -21,7 +18,6 @@ CREATE TABLE `acs_test_dept` ( `dept_name` varchar(128) DEFAULT NULL COMMENT '部门名称', `create_user` varchar(50) DEFAULT NULL COMMENT '创建者', `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_tenant_id` (`tenant_id`), KEY `idx_super_id` (`super_id`), @@ -29,17 +25,16 @@ CREATE TABLE `acs_test_dept` ( KEY `idx_dept_name` (`dept_name`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='部门表'; -CREATE TABLE `acs_test_user` ( +CREATE TABLE `sys_user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` int(11) DEFAULT NULL COMMENT '租户id', `dept_id` int(11) DEFAULT NULL COMMENT '部门id', `user_code` varchar(128) DEFAULT NULL COMMENT '用户编码', `user_name` varchar(128) DEFAULT NULL COMMENT '用户名称', - `is_master` int(2) DEFAULT NULL COMMENT '是否主账户 1-是 2-否', + `is_admin` int(2) DEFAULT NULL COMMENT '是否平台管理员 0-否 1-是', `status` int(2) DEFAULT NULL COMMENT '状态 0-可用 1-禁用', `create_user` varchar(50) DEFAULT NULL COMMENT '创建者', `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_tenant_id` (`tenant_id`), KEY `idx_dept_id` (`dept_id`), @@ -47,7 +42,7 @@ CREATE TABLE `acs_test_user` ( KEY `idx_user_name` (`user_name`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='用户表'; -CREATE TABLE `acs_test_role_group` ( +CREATE TABLE `sys_role_group` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` int(11) DEFAULT NULL COMMENT '租户id', `super_id` int(11) DEFAULT NULL COMMENT '父节点id', @@ -55,7 +50,6 @@ CREATE TABLE `acs_test_role_group` ( `group_name` varchar(128) DEFAULT NULL COMMENT '角色组名称', `create_user` varchar(50) DEFAULT NULL COMMENT '创建者', `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_tenant_id` (`tenant_id`), KEY `idx_super_id` (`super_id`), @@ -63,7 +57,7 @@ CREATE TABLE `acs_test_role_group` ( KEY `idx_group_name` (`group_name`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='角色组表'; -CREATE TABLE `acs_test_role` ( +CREATE TABLE `sys_role` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` int(11) DEFAULT NULL COMMENT '租户id', `group_id` int(11) DEFAULT NULL COMMENT '角色组id', @@ -72,7 +66,6 @@ CREATE TABLE `acs_test_role` ( `status` int(2) DEFAULT NULL COMMENT '状态 0-可用 1-禁用', `create_user` varchar(50) DEFAULT NULL COMMENT '创建者', `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_tenant_id` (`tenant_id`), KEY `idx_group_id` (`group_id`), @@ -80,25 +73,21 @@ CREATE TABLE `acs_test_role` ( KEY `idx_role_name` (`role_name`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='角色表'; -CREATE TABLE `acs_test_menu` ( +CREATE TABLE `sys_menu` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `super_id` int(11) DEFAULT NULL COMMENT '父节点id', `menu_code` varchar(128) DEFAULT NULL COMMENT '菜单编码', `menu_name` varchar(128) DEFAULT NULL COMMENT '菜单名称', - `menu_type` varchar(128) DEFAULT NULL COMMENT '菜单类型 nav-导航 button-功能(按钮)', - `menu_index` int(11) DEFAULT NULL COMMENT '菜单顺序', - `menu_icon` varchar(512) DEFAULT NULL COMMENT '菜单图标', - `only_admin` int(2) DEFAULT NULL COMMENT '是否仅限平台管理员配置 1-是 2-否', + `menu_type` varchar(128) DEFAULT NULL COMMENT '菜单类型 nav-导航 page-页面 button-按钮', `create_user` varchar(50) DEFAULT NULL COMMENT '创建者', `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_super_id` (`super_id`), KEY `idx_menu_code` (`menu_code`), KEY `idx_menu_name` (`menu_name`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='菜单表'; -CREATE TABLE `acs_test_api` ( +CREATE TABLE `sys_api` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `menu_id` int(11) DEFAULT NULL COMMENT '菜单id', `api_code` varchar(128) DEFAULT NULL COMMENT '接口编码', @@ -106,46 +95,30 @@ CREATE TABLE `acs_test_api` ( `api_url` varchar(512) DEFAULT NULL COMMENT '接口请求地址', `create_user` varchar(50) DEFAULT NULL COMMENT '创建者', `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_menu_id` (`menu_id`), KEY `idx_api_code` (`api_code`), KEY `idx_api_name` (`api_name`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='接口表'; -CREATE TABLE `acs_test_visitor_user` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', - `user_login` varchar(128) DEFAULT NULL COMMENT '登录工号', - `is_admin` int(2) DEFAULT NULL COMMENT '是否平台管理员 1-是 2-否', - `user_id` int(11) DEFAULT NULL COMMENT '用户id', - `create_user` varchar(50) DEFAULT NULL COMMENT '创建者', - `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `idx_user_login` (`user_login`), - KEY `idx_user_id` (`user_id`) -) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='游客用户绑定表'; - -CREATE TABLE `acs_test_user_role` ( +CREATE TABLE `sys_user_role` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `user_id` int(11) DEFAULT NULL COMMENT '用户id', `role_id` int(11) DEFAULT NULL COMMENT '角色id', `create_user` varchar(50) DEFAULT NULL COMMENT '创建者', `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`), KEY `idx_role_id` (`role_id`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='用户角色绑定表'; -CREATE TABLE `acs_test_role_menu` ( +CREATE TABLE `sys_role_menu` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `role_id` int(11) DEFAULT NULL COMMENT '角色id', `menu_id` int(11) DEFAULT NULL COMMENT '菜单id', `data_authority` int(2) DEFAULT NULL COMMENT '数据权限 1-所有 2-租户 3-部门 4-仅本人', `create_user` varchar(50) DEFAULT NULL COMMENT '创建者', `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_role_id` (`role_id`), KEY `idx_menu_id` (`menu_id`) diff --git a/script/query.sql b/script/query.sql new file mode 100644 index 0000000..fa4bf32 --- /dev/null +++ b/script/query.sql @@ -0,0 +1,13 @@ +select * from sys_tenant; + +select * from sys_dept; +select * from sys_user; + +select * from sys_role_group; +select * from sys_role; + +select * from sys_menu; +select * from sys_api; + +select * from sys_user_role; +select * from sys_role_menu; \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestApiMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysApiMapper.java similarity index 58% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestApiMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/SysApiMapper.java index 0da999c..d12161a 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestApiMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysApiMapper.java @@ -1,11 +1,11 @@ package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.AcsTestApi; +import com.gitee.spring.domain.example.dal.pojo.SysApi; /** * 接口表 * Generated by Mybatis Generator on 2022-08-29 */ -public interface AcsTestApiMapper extends BaseMapper { +public interface SysApiMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestDeptMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysDeptMapper.java similarity index 58% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestDeptMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/SysDeptMapper.java index e1cc251..af4d9d0 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestDeptMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysDeptMapper.java @@ -1,11 +1,11 @@ package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.AcsTestDept; +import com.gitee.spring.domain.example.dal.pojo.SysDept; /** * 部门表 * Generated by Mybatis Generator on 2022-08-29 */ -public interface AcsTestDeptMapper extends BaseMapper { +public interface SysDeptMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestMenuMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysMenuMapper.java similarity index 58% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestMenuMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/SysMenuMapper.java index d726cc2..ce2f172 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestMenuMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysMenuMapper.java @@ -1,11 +1,11 @@ package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.AcsTestMenu; +import com.gitee.spring.domain.example.dal.pojo.SysMenu; /** * 菜单表 * Generated by Mybatis Generator on 2022-08-29 */ -public interface AcsTestMenuMapper extends BaseMapper { +public interface SysMenuMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleGroupMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleGroupMapper.java similarity index 55% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleGroupMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleGroupMapper.java index f58959f..257ade3 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleGroupMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleGroupMapper.java @@ -1,11 +1,11 @@ package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.AcsTestRoleGroup; +import com.gitee.spring.domain.example.dal.pojo.SysRoleGroup; /** * 角色组表 * Generated by Mybatis Generator on 2022-08-29 */ -public interface AcsTestRoleGroupMapper extends BaseMapper { +public interface SysRoleGroupMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMapper.java similarity index 58% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMapper.java index 5895801..9913d2f 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMapper.java @@ -1,11 +1,11 @@ package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.AcsTestRole; +import com.gitee.spring.domain.example.dal.pojo.SysRole; /** * 角色表 * Generated by Mybatis Generator on 2022-08-29 */ -public interface AcsTestRoleMapper extends BaseMapper { +public interface SysRoleMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleMenuMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMenuMapper.java similarity index 57% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleMenuMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMenuMapper.java index a367b28..6c9ce00 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestRoleMenuMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMenuMapper.java @@ -1,11 +1,11 @@ package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.AcsTestRoleMenu; +import com.gitee.spring.domain.example.dal.pojo.SysRoleMenu; /** * 角色菜单绑定表 * Generated by Mybatis Generator on 2022-08-29 */ -public interface AcsTestRoleMenuMapper extends BaseMapper { +public interface SysRoleMenuMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestTenantMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysTenantMapper.java similarity index 56% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestTenantMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/SysTenantMapper.java index fb795e3..00056f6 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestTenantMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysTenantMapper.java @@ -1,11 +1,11 @@ package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.AcsTestTenant; +import com.gitee.spring.domain.example.dal.pojo.SysTenant; /** * 租户表 * Generated by Mybatis Generator on 2022-08-29 */ -public interface AcsTestTenantMapper extends BaseMapper { +public interface SysTenantMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserMapper.java similarity index 58% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserMapper.java index c4d2d6e..d1900bf 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserMapper.java @@ -1,11 +1,11 @@ package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.AcsTestUser; +import com.gitee.spring.domain.example.dal.pojo.SysUser; /** * 用户表 * Generated by MyBatis Generator on 2022-11-15 */ -public interface AcsTestUserMapper extends BaseMapper { +public interface SysUserMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserRoleMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserRoleMapper.java similarity index 57% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserRoleMapper.java rename to src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserRoleMapper.java index 98e3b4e..1829684 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/AcsTestUserRoleMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserRoleMapper.java @@ -1,11 +1,11 @@ package com.gitee.spring.domain.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.AcsTestUserRole; +import com.gitee.spring.domain.example.dal.pojo.SysUserRole; /** * 用户角色绑定表 * Generated by Mybatis Generator on 2022-08-29 */ -public interface AcsTestUserRoleMapper extends BaseMapper { +public interface SysUserRoleMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestApi.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysApi.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestApi.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/SysApi.java index 7283ad5..f2b1aee 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestApi.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysApi.java @@ -19,8 +19,8 @@ import java.util.Date; @Builder @NoArgsConstructor @AllArgsConstructor -@TableName(value = "acs_test_api") -public class AcsTestApi { +@TableName(value = "sys_api") +public class SysApi { // 主键 @TableId(value = "id", type = IdType.AUTO) private Integer id; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestDept.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysDept.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestDept.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/SysDept.java index bdc8d93..8dd5db1 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestDept.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysDept.java @@ -4,12 +4,13 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import java.util.Date; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; + /** * 部门表 * Generated by Mybatis Generator on 2022-08-29 @@ -18,8 +19,8 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -@TableName(value = "acs_test_dept") -public class AcsTestDept { +@TableName(value = "sys_dept") +public class SysDept { // 主键 @TableId(value = "id", type = IdType.AUTO) private Integer id; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestMenu.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysMenu.java similarity index 96% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestMenu.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/SysMenu.java index 90a10b6..31b1d74 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysMenu.java @@ -19,8 +19,8 @@ import java.util.Date; @Builder @NoArgsConstructor @AllArgsConstructor -@TableName(value = "acs_test_menu") -public class AcsTestMenu { +@TableName(value = "sys_menu") +public class SysMenu { // 主键 @TableId(value = "id", type = IdType.AUTO) private Integer id; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRole.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRole.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRole.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRole.java index 480f03a..265fa96 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRole.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRole.java @@ -4,12 +4,13 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import java.util.Date; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; + /** * 角色表 * Generated by Mybatis Generator on 2022-08-29 @@ -18,8 +19,8 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -@TableName(value = "acs_test_role") -public class AcsTestRole { +@TableName(value = "sys_role") +public class SysRole { // 主键 @TableId(value = "id", type = IdType.AUTO) private Integer id; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRoleGroup.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleGroup.java similarity index 94% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRoleGroup.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleGroup.java index 177c460..3c407b1 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRoleGroup.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleGroup.java @@ -4,12 +4,13 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import java.util.Date; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; + /** * 角色组表 * Generated by Mybatis Generator on 2022-08-29 @@ -18,8 +19,8 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -@TableName(value = "acs_test_role_group") -public class AcsTestRoleGroup { +@TableName(value = "sys_role_group") +public class SysRoleGroup { // 主键 @TableId(value = "id", type = IdType.AUTO) private Integer id; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRoleMenu.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleMenu.java similarity index 94% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRoleMenu.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleMenu.java index 506a28b..b9e3fb4 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestRoleMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleMenu.java @@ -4,12 +4,13 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import java.util.Date; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; + /** * 角色菜单绑定表 * Generated by Mybatis Generator on 2022-08-29 @@ -18,8 +19,8 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -@TableName(value = "acs_test_role_menu") -public class AcsTestRoleMenu { +@TableName(value = "sys_role_menu") +public class SysRoleMenu { // 主键 @TableId(value = "id", type = IdType.AUTO) private Integer id; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestTenant.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestTenant.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java index cd4cfab..40b82c1 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestTenant.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java @@ -4,12 +4,13 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import java.util.Date; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; + /** * 租户表 * Generated by Mybatis Generator on 2022-08-29 @@ -18,8 +19,8 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -@TableName(value = "acs_test_tenant") -public class AcsTestTenant { +@TableName(value = "sys_tenant") +public class SysTenant { // 主键 @TableId(value = "id", type = IdType.AUTO) private Integer id; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUser.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUser.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUser.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUser.java index 38fbebf..976e241 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUser.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUser.java @@ -19,8 +19,8 @@ import java.util.Date; @Builder @NoArgsConstructor @AllArgsConstructor -@TableName(value = "acs_test_user") -public class AcsTestUser { +@TableName(value = "sys_user") +public class SysUser { // 主键 @TableId(value = "id", type = IdType.AUTO) private Integer id; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUserRole.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUserRole.java similarity index 93% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUserRole.java rename to src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUserRole.java index f20921f..3aa8892 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/AcsTestUserRole.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUserRole.java @@ -4,12 +4,13 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import java.util.Date; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; + /** * 用户角色绑定表 * Generated by Mybatis Generator on 2022-08-29 @@ -18,8 +19,8 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -@TableName(value = "acs_test_user_role") -public class AcsTestUserRole { +@TableName(value = "sys_user_role") +public class SysUserRole { // 主键 @TableId(value = "id", type = IdType.AUTO) private Integer id; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Api.java b/src/main/java/com/gitee/spring/domain/example/entity/Api.java index 241bcef..0787d3c 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Api.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Api.java @@ -1,13 +1,13 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.AcsTestApiMapper; +import com.gitee.spring.domain.example.dal.mapper.SysApiMapper; import lombok.Data; import java.util.Date; @Data -@Entity(mapper = AcsTestApiMapper.class) +@Entity(mapper = SysApiMapper.class) public class Api { // 主键 private Integer id; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Department.java b/src/main/java/com/gitee/spring/domain/example/entity/Department.java index 4649ab3..ea0a1d5 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Department.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Department.java @@ -3,15 +3,15 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Bindings; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.AcsTestDeptMapper; -import com.gitee.spring.domain.example.dal.mapper.AcsTestUserMapper; +import com.gitee.spring.domain.example.dal.mapper.SysDeptMapper; +import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; import lombok.Data; import java.util.Date; import java.util.List; @Data -@Entity(mapper = AcsTestDeptMapper.class) +@Entity(mapper = SysDeptMapper.class) public class Department { // 主键 private Integer id; @@ -28,7 +28,7 @@ public class Department { // 创建时间 private Date createTime; // 用户实体 - @Entity(matchKeys = "dept.users", mapper = AcsTestUserMapper.class) + @Entity(matchKeys = "dept.users", mapper = SysUserMapper.class) @Bindings({ @Binding(field = "tenantId", bindProp = "./tenantId"), @Binding(field = "deptId", bindProp = "./id"), diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java index 57b2975..8243e70 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java @@ -3,15 +3,15 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Bindings; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.AcsTestApiMapper; -import com.gitee.spring.domain.example.dal.mapper.AcsTestMenuMapper; +import com.gitee.spring.domain.example.dal.mapper.SysApiMapper; +import com.gitee.spring.domain.example.dal.mapper.SysMenuMapper; import lombok.Data; import java.util.Date; import java.util.List; @Data -@Entity(mapper = AcsTestMenuMapper.class) +@Entity(mapper = SysMenuMapper.class) public class Menu { // 主键 private Integer id; @@ -28,7 +28,7 @@ public class Menu { // 创建时间 private Date createTime; // 接口实体 - @Entity(matchKeys = "menu.apis", mapper = AcsTestApiMapper.class) + @Entity(matchKeys = "menu.apis", mapper = SysApiMapper.class) @Bindings({ @Binding(field = "menuId", bindProp = "./id"), @Binding(field = "apiUrl", bindCtx = "apiUrl") diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Role.java b/src/main/java/com/gitee/spring/domain/example/entity/Role.java index b875155..bd92a29 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Role.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Role.java @@ -2,8 +2,8 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMapper; -import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMenuMapper; +import com.gitee.spring.domain.example.dal.mapper.SysRoleMapper; +import com.gitee.spring.domain.example.dal.mapper.SysRoleMenuMapper; import com.gitee.spring.domain.example.repository.MenuRepository; import lombok.Data; @@ -11,7 +11,7 @@ import java.util.Date; import java.util.List; @Data -@Entity(mapper = AcsTestRoleMapper.class) +@Entity(mapper = SysRoleMapper.class) public class Role { // 主键 private Integer id; @@ -31,7 +31,7 @@ public class Role { private Date createTime; // 角色菜单关联实体 - @Entity(matchKeys = "role.menus", mapper = AcsTestRoleMenuMapper.class) + @Entity(matchKeys = "role.menus", mapper = SysRoleMenuMapper.class) @Binding(field = "roleId", bindProp = "./id") private List roleMenus; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java index 5eb662a..86baa17 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java @@ -3,15 +3,15 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Bindings; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleGroupMapper; -import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMapper; +import com.gitee.spring.domain.example.dal.mapper.SysRoleGroupMapper; +import com.gitee.spring.domain.example.dal.mapper.SysRoleMapper; import lombok.Data; import java.util.Date; import java.util.List; @Data -@Entity(mapper = AcsTestRoleGroupMapper.class) +@Entity(mapper = SysRoleGroupMapper.class) public class RoleGroup { // 主键 private Integer id; @@ -28,7 +28,7 @@ public class RoleGroup { // 创建时间 private Date createTime; // 角色实体 - @Entity(matchKeys = "group.roles", mapper = AcsTestRoleMapper.class) + @Entity(matchKeys = "group.roles", mapper = SysRoleMapper.class) @Bindings({ @Binding(field = "tenantId", bindProp = "./tenantId"), @Binding(field = "groupId", bindProp = "./id"), diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java index 519f910..7a36332 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java @@ -1,13 +1,13 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMenuMapper; +import com.gitee.spring.domain.example.dal.mapper.SysRoleMenuMapper; import lombok.Data; import java.util.Date; @Data -@Entity(mapper = AcsTestRoleMenuMapper.class) +@Entity(mapper = SysRoleMenuMapper.class) public class RoleMenu { // 主键 private Integer id; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java index 7f82f10..166f7a7 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java @@ -3,18 +3,18 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Bindings; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.AcsTestDeptMapper; -import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleGroupMapper; -import com.gitee.spring.domain.example.dal.mapper.AcsTestRoleMapper; -import com.gitee.spring.domain.example.dal.mapper.AcsTestTenantMapper; -import com.gitee.spring.domain.example.dal.mapper.AcsTestUserMapper; +import com.gitee.spring.domain.example.dal.mapper.SysDeptMapper; +import com.gitee.spring.domain.example.dal.mapper.SysRoleGroupMapper; +import com.gitee.spring.domain.example.dal.mapper.SysRoleMapper; +import com.gitee.spring.domain.example.dal.mapper.SysTenantMapper; +import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; import lombok.Data; import java.util.Date; import java.util.List; @Data -@Entity(mapper = AcsTestTenantMapper.class) +@Entity(mapper = SysTenantMapper.class) public class Tenant { // 主键 private Integer id; @@ -30,17 +30,17 @@ public class Tenant { private Date createTime; // 部门实体 - @Entity(matchKeys = "tenant.depts", mapper = AcsTestDeptMapper.class) + @Entity(matchKeys = "tenant.depts", mapper = SysDeptMapper.class) @Binding(field = "tenantId", bindProp = "./id") private List departments; // 角色组实体 - @Entity(matchKeys = "tenant.groups", mapper = AcsTestRoleGroupMapper.class) + @Entity(matchKeys = "tenant.groups", mapper = SysRoleGroupMapper.class) @Binding(field = "tenantId", bindProp = "./id") private List roleGroups; // 用户实体 - @Entity(matchKeys = "tenant.users", mapper = AcsTestUserMapper.class) + @Entity(matchKeys = "tenant.users", mapper = SysUserMapper.class) @Bindings({ @Binding(field = "tenantId", bindProp = "./id"), @Binding(field = "deptId", bindProp = "./departments", property = "id") @@ -48,7 +48,7 @@ public class Tenant { private List users; // 角色实体 - @Entity(matchKeys = "tenant.roles", mapper = AcsTestRoleMapper.class) + @Entity(matchKeys = "tenant.roles", mapper = SysRoleMapper.class) @Bindings({ @Binding(field = "tenantId", bindProp = "./id"), @Binding(field = "groupId", bindProp = "./roleGroups", property = "id") diff --git a/src/main/java/com/gitee/spring/domain/example/entity/User.java b/src/main/java/com/gitee/spring/domain/example/entity/User.java index aca5bbc..20f9518 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/User.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/User.java @@ -2,8 +2,8 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.AcsTestUserMapper; -import com.gitee.spring.domain.example.dal.mapper.AcsTestUserRoleMapper; +import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; +import com.gitee.spring.domain.example.dal.mapper.SysUserRoleMapper; import com.gitee.spring.domain.example.impl.factory.UserFactory; import com.gitee.spring.domain.example.repository.RoleRepository; import lombok.Data; @@ -12,7 +12,7 @@ import java.util.Date; import java.util.List; @Data -@Entity(mapper = AcsTestUserMapper.class, factory = UserFactory.class) +@Entity(mapper = SysUserMapper.class, factory = UserFactory.class) public class User { // 主键 private Integer id; @@ -34,7 +34,7 @@ public class User { private Date createTime; // 用户角色关联实体 - @Entity(matchKeys = "user.roles", mapper = AcsTestUserRoleMapper.class) + @Entity(matchKeys = "user.roles", mapper = SysUserRoleMapper.class) @Binding(field = "userId", bindProp = "./id") private List userRoles; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserAdmin.java b/src/main/java/com/gitee/spring/domain/example/entity/UserAdmin.java index afff020..3136bb4 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/UserAdmin.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/UserAdmin.java @@ -2,7 +2,7 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.AcsTestUserMapper; +import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; import com.gitee.spring.domain.example.repository.RoleRepository; import lombok.Data; import lombok.EqualsAndHashCode; @@ -11,7 +11,7 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = false) -@Entity(mapper = AcsTestUserMapper.class) +@Entity(mapper = SysUserMapper.class) public class UserAdmin extends User { private Integer roleStatus = 0; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java index f08228a..53734d7 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java @@ -1,13 +1,13 @@ package com.gitee.spring.domain.example.entity; import com.gitee.spring.domain.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.AcsTestUserRoleMapper; +import com.gitee.spring.domain.example.dal.mapper.SysUserRoleMapper; import lombok.Data; import java.util.Date; @Data -@Entity(mapper = AcsTestUserRoleMapper.class) +@Entity(mapper = SysUserRoleMapper.class) public class UserRole { // 主键 private Integer id; diff --git a/src/main/resources/mapper/AcsTestApiMapper.xml b/src/main/resources/mapper/SysApiMapper.xml similarity index 89% rename from src/main/resources/mapper/AcsTestApiMapper.xml rename to src/main/resources/mapper/SysApiMapper.xml index f50cd71..629d897 100644 --- a/src/main/resources/mapper/AcsTestApiMapper.xml +++ b/src/main/resources/mapper/SysApiMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestDeptMapper.xml b/src/main/resources/mapper/SysDeptMapper.xml similarity index 89% rename from src/main/resources/mapper/AcsTestDeptMapper.xml rename to src/main/resources/mapper/SysDeptMapper.xml index 25a75c3..7a57d36 100644 --- a/src/main/resources/mapper/AcsTestDeptMapper.xml +++ b/src/main/resources/mapper/SysDeptMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestMenuMapper.xml b/src/main/resources/mapper/SysMenuMapper.xml similarity index 91% rename from src/main/resources/mapper/AcsTestMenuMapper.xml rename to src/main/resources/mapper/SysMenuMapper.xml index 69a4daf..f7936db 100644 --- a/src/main/resources/mapper/AcsTestMenuMapper.xml +++ b/src/main/resources/mapper/SysMenuMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestRoleGroupMapper.xml b/src/main/resources/mapper/SysRoleGroupMapper.xml similarity index 88% rename from src/main/resources/mapper/AcsTestRoleGroupMapper.xml rename to src/main/resources/mapper/SysRoleGroupMapper.xml index 7762573..bf0f2bf 100644 --- a/src/main/resources/mapper/AcsTestRoleGroupMapper.xml +++ b/src/main/resources/mapper/SysRoleGroupMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestRoleMapper.xml b/src/main/resources/mapper/SysRoleMapper.xml similarity index 90% rename from src/main/resources/mapper/AcsTestRoleMapper.xml rename to src/main/resources/mapper/SysRoleMapper.xml index 6f67fad..8d8d252 100644 --- a/src/main/resources/mapper/AcsTestRoleMapper.xml +++ b/src/main/resources/mapper/SysRoleMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestRoleMenuMapper.xml b/src/main/resources/mapper/SysRoleMenuMapper.xml similarity index 87% rename from src/main/resources/mapper/AcsTestRoleMenuMapper.xml rename to src/main/resources/mapper/SysRoleMenuMapper.xml index 5af0116..cc78bda 100644 --- a/src/main/resources/mapper/AcsTestRoleMenuMapper.xml +++ b/src/main/resources/mapper/SysRoleMenuMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestTenantMapper.xml b/src/main/resources/mapper/SysTenantMapper.xml similarity index 90% rename from src/main/resources/mapper/AcsTestTenantMapper.xml rename to src/main/resources/mapper/SysTenantMapper.xml index 86bfb95..745884a 100644 --- a/src/main/resources/mapper/AcsTestTenantMapper.xml +++ b/src/main/resources/mapper/SysTenantMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestUserMapper.xml b/src/main/resources/mapper/SysUserMapper.xml similarity index 90% rename from src/main/resources/mapper/AcsTestUserMapper.xml rename to src/main/resources/mapper/SysUserMapper.xml index 9875198..2df9eed 100644 --- a/src/main/resources/mapper/AcsTestUserMapper.xml +++ b/src/main/resources/mapper/SysUserMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/AcsTestUserRoleMapper.xml b/src/main/resources/mapper/SysUserRoleMapper.xml similarity index 86% rename from src/main/resources/mapper/AcsTestUserRoleMapper.xml rename to src/main/resources/mapper/SysUserRoleMapper.xml index 103db91..12025a3 100644 --- a/src/main/resources/mapper/AcsTestUserRoleMapper.xml +++ b/src/main/resources/mapper/SysUserRoleMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git "a/static/img/Saas\351\242\206\345\237\237\346\250\241\345\236\213.jpg" "b/static/img/Saas\351\242\206\345\237\237\346\250\241\345\236\213.jpg" deleted file mode 100644 index ba094ee2fd003ed28f71e2ac91c6519d2e6cd9c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191642 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

4HA=bOCN`d+> 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 TH@SHyAN*|HY-U(s;2QNmUjKa# diff --git "a/static/img/\350\201\232\345\220\210_\346\270\270\345\256\242.jpg" "b/static/img/\350\201\232\345\220\210_\346\270\270\345\256\242.jpg" deleted file mode 100644 index 4ca246fda55cc4645748975fb3250908f2520c86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161054 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 z 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 J{witg`yV!AzT*G@ diff --git "a/static/script/Saas\345\205\250\351\207\217\346\237\245\350\257\242.sql" "b/static/script/Saas\345\205\250\351\207\217\346\237\245\350\257\242.sql" deleted file mode 100644 index 1eb42f1..0000000 --- "a/static/script/Saas\345\205\250\351\207\217\346\237\245\350\257\242.sql" +++ /dev/null @@ -1,14 +0,0 @@ -select * from acs_test_tenant; - -select * from acs_test_dept; -select * from acs_test_user; - -select * from acs_test_role_group; -select * from acs_test_role; - -select * from acs_test_menu; -select * from acs_test_api; - -select * from acs_test_visitor_user; -select * from acs_test_user_role; -select * from acs_test_role_menu; \ No newline at end of file -- Gitee From ea532a76cdf4b1004a1244f52467447b7215e750 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 16 Nov 2022 10:19:26 +0800 Subject: [PATCH 18/42] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/example/{ => impl}/service/SaasDataService.java | 2 +- src/test/java/com/gitee/spring/domain/example/AppTest.java | 2 +- .../com/gitee/spring/domain/example/{ => test}/BinderTest.java | 2 +- .../com/gitee/spring/domain/example/{ => test}/CRUDTest.java | 2 +- .../com/gitee/spring/domain/example/{ => test}/CoatingTest.java | 2 +- .../com/gitee/spring/domain/example/{ => test}/EventTest.java | 2 +- .../gitee/spring/domain/example/{ => test}/OverrideTest.java | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) rename src/main/java/com/gitee/spring/domain/example/{ => impl}/service/SaasDataService.java (99%) rename src/test/java/com/gitee/spring/domain/example/{ => test}/BinderTest.java (97%) rename src/test/java/com/gitee/spring/domain/example/{ => test}/CRUDTest.java (98%) rename src/test/java/com/gitee/spring/domain/example/{ => test}/CoatingTest.java (97%) rename src/test/java/com/gitee/spring/domain/example/{ => test}/EventTest.java (97%) rename src/test/java/com/gitee/spring/domain/example/{ => test}/OverrideTest.java (97%) diff --git a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java b/src/main/java/com/gitee/spring/domain/example/impl/service/SaasDataService.java similarity index 99% rename from src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java rename to src/main/java/com/gitee/spring/domain/example/impl/service/SaasDataService.java index e560f0f..aa00403 100644 --- a/src/main/java/com/gitee/spring/domain/example/service/SaasDataService.java +++ b/src/main/java/com/gitee/spring/domain/example/impl/service/SaasDataService.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.service; +package com.gitee.spring.domain.example.impl.service; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.RandomUtil; diff --git a/src/test/java/com/gitee/spring/domain/example/AppTest.java b/src/test/java/com/gitee/spring/domain/example/AppTest.java index e158107..c2684e6 100644 --- a/src/test/java/com/gitee/spring/domain/example/AppTest.java +++ b/src/test/java/com/gitee/spring/domain/example/AppTest.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example; -import com.gitee.spring.domain.example.service.SaasDataService; +import com.gitee.spring.domain.example.impl.service.SaasDataService; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; diff --git a/src/test/java/com/gitee/spring/domain/example/BinderTest.java b/src/test/java/com/gitee/spring/domain/example/test/BinderTest.java similarity index 97% rename from src/test/java/com/gitee/spring/domain/example/BinderTest.java rename to src/test/java/com/gitee/spring/domain/example/test/BinderTest.java index 2df2a89..36a54c6 100644 --- a/src/test/java/com/gitee/spring/domain/example/BinderTest.java +++ b/src/test/java/com/gitee/spring/domain/example/test/BinderTest.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example; +package com.gitee.spring.domain.example.test; import com.gitee.spring.domain.core.api.Binder; import com.gitee.spring.domain.core.impl.binder.ContextBinder; diff --git a/src/test/java/com/gitee/spring/domain/example/CRUDTest.java b/src/test/java/com/gitee/spring/domain/example/test/CRUDTest.java similarity index 98% rename from src/test/java/com/gitee/spring/domain/example/CRUDTest.java rename to src/test/java/com/gitee/spring/domain/example/test/CRUDTest.java index 091b55f..fec0aee 100644 --- a/src/test/java/com/gitee/spring/domain/example/CRUDTest.java +++ b/src/test/java/com/gitee/spring/domain/example/test/CRUDTest.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example; +package com.gitee.spring.domain.example.test; import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core.entity.BoundedContext; diff --git a/src/test/java/com/gitee/spring/domain/example/CoatingTest.java b/src/test/java/com/gitee/spring/domain/example/test/CoatingTest.java similarity index 97% rename from src/test/java/com/gitee/spring/domain/example/CoatingTest.java rename to src/test/java/com/gitee/spring/domain/example/test/CoatingTest.java index 254b70d..a4f8ac0 100644 --- a/src/test/java/com/gitee/spring/domain/example/CoatingTest.java +++ b/src/test/java/com/gitee/spring/domain/example/test/CoatingTest.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example; +package com.gitee.spring.domain.example.test; import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core.entity.BoundedContext; diff --git a/src/test/java/com/gitee/spring/domain/example/EventTest.java b/src/test/java/com/gitee/spring/domain/example/test/EventTest.java similarity index 97% rename from src/test/java/com/gitee/spring/domain/example/EventTest.java rename to src/test/java/com/gitee/spring/domain/example/test/EventTest.java index e69b69f..4f4e7dc 100644 --- a/src/test/java/com/gitee/spring/domain/example/EventTest.java +++ b/src/test/java/com/gitee/spring/domain/example/test/EventTest.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example; +package com.gitee.spring.domain.example.test; import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core.entity.BoundedContext; diff --git a/src/test/java/com/gitee/spring/domain/example/OverrideTest.java b/src/test/java/com/gitee/spring/domain/example/test/OverrideTest.java similarity index 97% rename from src/test/java/com/gitee/spring/domain/example/OverrideTest.java rename to src/test/java/com/gitee/spring/domain/example/test/OverrideTest.java index 85b8667..d0b4e36 100644 --- a/src/test/java/com/gitee/spring/domain/example/OverrideTest.java +++ b/src/test/java/com/gitee/spring/domain/example/test/OverrideTest.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example; +package com.gitee.spring.domain.example.test; import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core.entity.BoundedContext; -- Gitee From 003e93113e8ec8926601c04bfa64137fbd449aba Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 16 Nov 2022 12:58:10 +0800 Subject: [PATCH 19/42] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/dal/mapper/SysApiMapper.java | 2 +- .../example/dal/mapper/SysDeptMapper.java | 2 +- .../example/dal/mapper/SysMenuMapper.java | 2 +- .../dal/mapper/SysRoleGroupMapper.java | 2 +- .../example/dal/mapper/SysRoleMapper.java | 2 +- .../example/dal/mapper/SysRoleMenuMapper.java | 2 +- .../example/dal/mapper/SysTenantMapper.java | 2 +- .../example/dal/mapper/SysUserMapper.java | 2 +- .../example/dal/mapper/SysUserRoleMapper.java | 2 +- .../domain/example/dal/pojo/SysApi.java | 6 +----- .../domain/example/dal/pojo/SysDept.java | 6 +----- .../domain/example/dal/pojo/SysMenu.java | 20 ++----------------- .../domain/example/dal/pojo/SysRole.java | 6 +----- .../domain/example/dal/pojo/SysRoleGroup.java | 6 +----- .../domain/example/dal/pojo/SysRoleMenu.java | 6 +----- .../domain/example/dal/pojo/SysTenant.java | 14 +------------ .../domain/example/dal/pojo/SysUser.java | 6 +----- .../domain/example/dal/pojo/SysUserRole.java | 6 +----- src/main/resources/mapper/SysApiMapper.xml | 3 +-- src/main/resources/mapper/SysDeptMapper.xml | 3 +-- src/main/resources/mapper/SysMenuMapper.xml | 7 +------ .../resources/mapper/SysRoleGroupMapper.xml | 3 +-- src/main/resources/mapper/SysRoleMapper.xml | 4 +--- .../resources/mapper/SysRoleMenuMapper.xml | 3 +-- src/main/resources/mapper/SysTenantMapper.xml | 6 +----- src/main/resources/mapper/SysUserMapper.xml | 4 +--- .../resources/mapper/SysUserRoleMapper.xml | 3 +-- 27 files changed, 28 insertions(+), 102 deletions(-) diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysApiMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysApiMapper.java index d12161a..a41f5cf 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysApiMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysApiMapper.java @@ -5,7 +5,7 @@ import com.gitee.spring.domain.example.dal.pojo.SysApi; /** * 接口表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by MyBatis Generator on 2022-11-16 */ public interface SysApiMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysDeptMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysDeptMapper.java index af4d9d0..4b6bb73 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysDeptMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysDeptMapper.java @@ -5,7 +5,7 @@ import com.gitee.spring.domain.example.dal.pojo.SysDept; /** * 部门表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by MyBatis Generator on 2022-11-16 */ public interface SysDeptMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysMenuMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysMenuMapper.java index ce2f172..ccc5c19 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysMenuMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysMenuMapper.java @@ -5,7 +5,7 @@ import com.gitee.spring.domain.example.dal.pojo.SysMenu; /** * 菜单表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by MyBatis Generator on 2022-11-16 */ public interface SysMenuMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleGroupMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleGroupMapper.java index 257ade3..f04ee6e 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleGroupMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleGroupMapper.java @@ -5,7 +5,7 @@ import com.gitee.spring.domain.example.dal.pojo.SysRoleGroup; /** * 角色组表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by MyBatis Generator on 2022-11-16 */ public interface SysRoleGroupMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMapper.java index 9913d2f..f7ba626 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMapper.java @@ -5,7 +5,7 @@ import com.gitee.spring.domain.example.dal.pojo.SysRole; /** * 角色表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by MyBatis Generator on 2022-11-16 */ public interface SysRoleMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMenuMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMenuMapper.java index 6c9ce00..bfba11f 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMenuMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMenuMapper.java @@ -5,7 +5,7 @@ import com.gitee.spring.domain.example.dal.pojo.SysRoleMenu; /** * 角色菜单绑定表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by MyBatis Generator on 2022-11-16 */ public interface SysRoleMenuMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysTenantMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysTenantMapper.java index 00056f6..eab6dc1 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysTenantMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysTenantMapper.java @@ -5,7 +5,7 @@ import com.gitee.spring.domain.example.dal.pojo.SysTenant; /** * 租户表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by MyBatis Generator on 2022-11-16 */ public interface SysTenantMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserMapper.java index d1900bf..a990505 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserMapper.java @@ -5,7 +5,7 @@ import com.gitee.spring.domain.example.dal.pojo.SysUser; /** * 用户表 - * Generated by MyBatis Generator on 2022-11-15 + * Generated by MyBatis Generator on 2022-11-16 */ public interface SysUserMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserRoleMapper.java b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserRoleMapper.java index 1829684..462c64c 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserRoleMapper.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserRoleMapper.java @@ -5,7 +5,7 @@ import com.gitee.spring.domain.example.dal.pojo.SysUserRole; /** * 用户角色绑定表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by MyBatis Generator on 2022-11-16 */ public interface SysUserRoleMapper extends BaseMapper { } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysApi.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysApi.java index f2b1aee..02ce3a5 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysApi.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysApi.java @@ -13,7 +13,7 @@ import java.util.Date; /** * 接口表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by Mybatis Generator on 2022-11-16 */ @Data @Builder @@ -48,8 +48,4 @@ public class SysApi { // 创建时间 @TableField(value = "create_time") private Date createTime; - - // 更新时间 - @TableField(value = "update_time") - private Date updateTime; } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysDept.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysDept.java index 8dd5db1..c74f37e 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysDept.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysDept.java @@ -13,7 +13,7 @@ import java.util.Date; /** * 部门表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by Mybatis Generator on 2022-11-16 */ @Data @Builder @@ -48,8 +48,4 @@ public class SysDept { // 创建时间 @TableField(value = "create_time") private Date createTime; - - // 更新时间 - @TableField(value = "update_time") - private Date updateTime; } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysMenu.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysMenu.java index 31b1d74..a244a7f 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysMenu.java @@ -13,7 +13,7 @@ import java.util.Date; /** * 菜单表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by Mybatis Generator on 2022-11-16 */ @Data @Builder @@ -37,22 +37,10 @@ public class SysMenu { @TableField(value = "menu_name") private String menuName; - // 菜单类型 nav-导航 button-功能(按钮) + // 菜单类型 nav-导航 page-页面 button-按钮 @TableField(value = "menu_type") private String menuType; - // 菜单顺序 - @TableField(value = "menu_index") - private Integer menuIndex; - - // 菜单图标 - @TableField(value = "menu_icon") - private String menuIcon; - - // 是否仅限平台管理员配置 1-是 2-否 - @TableField(value = "only_admin") - private Integer onlyAdmin; - // 创建者 @TableField(value = "create_user") private String createUser; @@ -60,8 +48,4 @@ public class SysMenu { // 创建时间 @TableField(value = "create_time") private Date createTime; - - // 更新时间 - @TableField(value = "update_time") - private Date updateTime; } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRole.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRole.java index 265fa96..a007d82 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRole.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRole.java @@ -13,7 +13,7 @@ import java.util.Date; /** * 角色表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by Mybatis Generator on 2022-11-16 */ @Data @Builder @@ -51,8 +51,4 @@ public class SysRole { // 创建时间 @TableField(value = "create_time") private Date createTime; - - // 更新时间 - @TableField(value = "update_time") - private Date updateTime; } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleGroup.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleGroup.java index 3c407b1..48bbd57 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleGroup.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleGroup.java @@ -13,7 +13,7 @@ import java.util.Date; /** * 角色组表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by Mybatis Generator on 2022-11-16 */ @Data @Builder @@ -48,8 +48,4 @@ public class SysRoleGroup { // 创建时间 @TableField(value = "create_time") private Date createTime; - - // 更新时间 - @TableField(value = "update_time") - private Date updateTime; } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleMenu.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleMenu.java index b9e3fb4..6bcd146 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleMenu.java @@ -13,7 +13,7 @@ import java.util.Date; /** * 角色菜单绑定表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by Mybatis Generator on 2022-11-16 */ @Data @Builder @@ -44,8 +44,4 @@ public class SysRoleMenu { // 创建时间 @TableField(value = "create_time") private Date createTime; - - // 更新时间 - @TableField(value = "update_time") - private Date updateTime; } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java index 40b82c1..9f1096e 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java @@ -13,7 +13,7 @@ import java.util.Date; /** * 租户表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by Mybatis Generator on 2022-11-16 */ @Data @Builder @@ -33,10 +33,6 @@ public class SysTenant { @TableField(value = "tenant_name") private String tenantName; - // 企业logo - @TableField(value = "logo_url") - private String logoUrl; - // 状态 0-可用 1-禁用 private Integer status; @@ -47,12 +43,4 @@ public class SysTenant { // 创建时间 @TableField(value = "create_time") private Date createTime; - - // 更新者 - @TableField(value = "update_user") - private String updateUser; - - // 更新时间 - @TableField(value = "update_time") - private Date updateTime; } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUser.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUser.java index 976e241..6964e18 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUser.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUser.java @@ -13,7 +13,7 @@ import java.util.Date; /** * 用户表 - * Generated by Mybatis Generator on 2022-11-15 + * Generated by Mybatis Generator on 2022-11-16 */ @Data @Builder @@ -55,8 +55,4 @@ public class SysUser { // 创建时间 @TableField(value = "create_time") private Date createTime; - - // 更新时间 - @TableField(value = "update_time") - private Date updateTime; } \ No newline at end of file diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUserRole.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUserRole.java index 3aa8892..4769483 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUserRole.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUserRole.java @@ -13,7 +13,7 @@ import java.util.Date; /** * 用户角色绑定表 - * Generated by Mybatis Generator on 2022-08-29 + * Generated by Mybatis Generator on 2022-11-16 */ @Data @Builder @@ -40,8 +40,4 @@ public class SysUserRole { // 创建时间 @TableField(value = "create_time") private Date createTime; - - // 更新时间 - @TableField(value = "update_time") - private Date updateTime; } \ No newline at end of file diff --git a/src/main/resources/mapper/SysApiMapper.xml b/src/main/resources/mapper/SysApiMapper.xml index 629d897..b43097a 100644 --- a/src/main/resources/mapper/SysApiMapper.xml +++ b/src/main/resources/mapper/SysApiMapper.xml @@ -9,9 +9,8 @@ - - id, menu_id, api_code, api_name, api_url, create_user, create_time, update_time + id, menu_id, api_code, api_name, api_url, create_user, create_time \ No newline at end of file diff --git a/src/main/resources/mapper/SysDeptMapper.xml b/src/main/resources/mapper/SysDeptMapper.xml index 7a57d36..e02100a 100644 --- a/src/main/resources/mapper/SysDeptMapper.xml +++ b/src/main/resources/mapper/SysDeptMapper.xml @@ -9,9 +9,8 @@ - - id, tenant_id, super_id, dept_code, dept_name, create_user, create_time, update_time + id, tenant_id, super_id, dept_code, dept_name, create_user, create_time \ No newline at end of file diff --git a/src/main/resources/mapper/SysMenuMapper.xml b/src/main/resources/mapper/SysMenuMapper.xml index f7936db..9b5086a 100644 --- a/src/main/resources/mapper/SysMenuMapper.xml +++ b/src/main/resources/mapper/SysMenuMapper.xml @@ -7,15 +7,10 @@ - - - - - id, super_id, menu_code, menu_name, menu_type, menu_index, menu_icon, only_admin, - create_user, create_time, update_time + id, super_id, menu_code, menu_name, menu_type, create_user, create_time \ No newline at end of file diff --git a/src/main/resources/mapper/SysRoleGroupMapper.xml b/src/main/resources/mapper/SysRoleGroupMapper.xml index bf0f2bf..3096f2c 100644 --- a/src/main/resources/mapper/SysRoleGroupMapper.xml +++ b/src/main/resources/mapper/SysRoleGroupMapper.xml @@ -9,9 +9,8 @@ - - id, tenant_id, super_id, group_code, group_name, create_user, create_time, update_time + id, tenant_id, super_id, group_code, group_name, create_user, create_time \ No newline at end of file diff --git a/src/main/resources/mapper/SysRoleMapper.xml b/src/main/resources/mapper/SysRoleMapper.xml index 8d8d252..de057f5 100644 --- a/src/main/resources/mapper/SysRoleMapper.xml +++ b/src/main/resources/mapper/SysRoleMapper.xml @@ -10,10 +10,8 @@ - - id, tenant_id, group_id, role_code, role_name, status, create_user, create_time, - update_time + id, tenant_id, group_id, role_code, role_name, status, create_user, create_time \ No newline at end of file diff --git a/src/main/resources/mapper/SysRoleMenuMapper.xml b/src/main/resources/mapper/SysRoleMenuMapper.xml index cc78bda..f1e12a4 100644 --- a/src/main/resources/mapper/SysRoleMenuMapper.xml +++ b/src/main/resources/mapper/SysRoleMenuMapper.xml @@ -8,9 +8,8 @@ - - id, role_id, menu_id, data_authority, create_user, create_time, update_time + id, role_id, menu_id, data_authority, create_user, create_time \ No newline at end of file diff --git a/src/main/resources/mapper/SysTenantMapper.xml b/src/main/resources/mapper/SysTenantMapper.xml index 745884a..2f08658 100644 --- a/src/main/resources/mapper/SysTenantMapper.xml +++ b/src/main/resources/mapper/SysTenantMapper.xml @@ -5,15 +5,11 @@ - - - - id, tenant_code, tenant_name, logo_url, status, create_user, create_time, update_user, - update_time + id, tenant_code, tenant_name, status, create_user, create_time \ No newline at end of file diff --git a/src/main/resources/mapper/SysUserMapper.xml b/src/main/resources/mapper/SysUserMapper.xml index 2df9eed..32e0680 100644 --- a/src/main/resources/mapper/SysUserMapper.xml +++ b/src/main/resources/mapper/SysUserMapper.xml @@ -11,10 +11,8 @@ - - id, tenant_id, dept_id, user_code, user_name, is_admin, status, create_user, create_time, - update_time + id, tenant_id, dept_id, user_code, user_name, is_admin, status, create_user, create_time \ No newline at end of file diff --git a/src/main/resources/mapper/SysUserRoleMapper.xml b/src/main/resources/mapper/SysUserRoleMapper.xml index 12025a3..1fb5f03 100644 --- a/src/main/resources/mapper/SysUserRoleMapper.xml +++ b/src/main/resources/mapper/SysUserRoleMapper.xml @@ -7,9 +7,8 @@ - - id, user_id, role_id, create_user, create_time, update_time + id, user_id, role_id, create_user, create_time \ No newline at end of file -- Gitee From c866a2011c38d569ad502b102e381ba2dec330e9 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 16 Nov 2022 16:37:25 +0800 Subject: [PATCH 20/42] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/{SpringDomainExampleApp.java => Application.java} | 4 ++-- .../spring/domain/example/{AppTest.java => DataTest.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/main/java/com/gitee/spring/domain/example/{SpringDomainExampleApp.java => Application.java} (76%) rename src/test/java/com/gitee/spring/domain/example/{AppTest.java => DataTest.java} (97%) diff --git a/src/main/java/com/gitee/spring/domain/example/SpringDomainExampleApp.java b/src/main/java/com/gitee/spring/domain/example/Application.java similarity index 76% rename from src/main/java/com/gitee/spring/domain/example/SpringDomainExampleApp.java rename to src/main/java/com/gitee/spring/domain/example/Application.java index 0484d9a..80a22a6 100644 --- a/src/main/java/com/gitee/spring/domain/example/SpringDomainExampleApp.java +++ b/src/main/java/com/gitee/spring/domain/example/Application.java @@ -6,8 +6,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.gitee.spring.domain.example.dal.mapper") -public class SpringDomainExampleApp { +public class Application { public static void main(String[] args) { - SpringApplication.run(SpringDomainExampleApp.class, args); + SpringApplication.run(Application.class, args); } } diff --git a/src/test/java/com/gitee/spring/domain/example/AppTest.java b/src/test/java/com/gitee/spring/domain/example/DataTest.java similarity index 97% rename from src/test/java/com/gitee/spring/domain/example/AppTest.java rename to src/test/java/com/gitee/spring/domain/example/DataTest.java index c2684e6..b8a5eeb 100644 --- a/src/test/java/com/gitee/spring/domain/example/AppTest.java +++ b/src/test/java/com/gitee/spring/domain/example/DataTest.java @@ -14,7 +14,7 @@ import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest @DisplayName("数据测试") @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class AppTest { +public class DataTest { @Autowired private SaasDataService saasDataService; -- Gitee From 589cf4cd44b2b1756265364fd8571cfef10046b9 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 16 Nov 2022 16:38:16 +0800 Subject: [PATCH 21/42] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{SaasDataService.java => DataService.java} | 2 +- .../com/gitee/spring/domain/example/DataTest.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) rename src/main/java/com/gitee/spring/domain/example/impl/service/{SaasDataService.java => DataService.java} (99%) diff --git a/src/main/java/com/gitee/spring/domain/example/impl/service/SaasDataService.java b/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java similarity index 99% rename from src/main/java/com/gitee/spring/domain/example/impl/service/SaasDataService.java rename to src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java index aa00403..e7a31a9 100644 --- a/src/main/java/com/gitee/spring/domain/example/impl/service/SaasDataService.java +++ b/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java @@ -30,7 +30,7 @@ import java.util.Set; @Service @AllArgsConstructor -public class SaasDataService { +public class DataService { private final TenantRepository tenantRepository; private final UserRepository userRepository; diff --git a/src/test/java/com/gitee/spring/domain/example/DataTest.java b/src/test/java/com/gitee/spring/domain/example/DataTest.java index b8a5eeb..2f17999 100644 --- a/src/test/java/com/gitee/spring/domain/example/DataTest.java +++ b/src/test/java/com/gitee/spring/domain/example/DataTest.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example; -import com.gitee.spring.domain.example.impl.service.SaasDataService; +import com.gitee.spring.domain.example.impl.service.DataService; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; @@ -17,22 +17,22 @@ import org.springframework.boot.test.context.SpringBootTest; public class DataTest { @Autowired - private SaasDataService saasDataService; + private DataService dataService; @Test @Order(1) @DisplayName("新增测试") public void test01() { - saasDataService.newTenant(); - saasDataService.newMenuAndApi(); - saasDataService.newBindings(); + dataService.newTenant(); + dataService.newMenuAndApi(); + dataService.newBindings(); } @Test @Order(2) @DisplayName("销毁测试") public void test02() { - saasDataService.clear(); + dataService.clear(); } } -- Gitee From e743d1f590fcf9aa906ddd7615dfabd5ecb72525 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 16 Nov 2022 17:37:07 +0800 Subject: [PATCH 22/42] =?UTF-8?q?=E7=9C=81=E7=95=A5=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ada9c41..b389ebc 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -6,7 +6,5 @@ spring: active: db mybatis-plus: - global-config: - enable-sql-runner: true configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 是否将sql打印到控制面板(该配置会将sql语句和查询的结果都打印到控制台) \ No newline at end of file -- Gitee From 9c644863673d9e3ae0a668b9ffecc5dbd44811c5 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 17 Nov 2022 10:13:46 +0800 Subject: [PATCH 23/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/entity/coating/UserQuery.java | 12 ++++++++++++ .../example/repository/UserRepository.java | 2 ++ .../domain/example/test/CoatingTest.java | 18 ++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 src/main/java/com/gitee/spring/domain/example/entity/coating/UserQuery.java diff --git a/src/main/java/com/gitee/spring/domain/example/entity/coating/UserQuery.java b/src/main/java/com/gitee/spring/domain/example/entity/coating/UserQuery.java new file mode 100644 index 0000000..c76863e --- /dev/null +++ b/src/main/java/com/gitee/spring/domain/example/entity/coating/UserQuery.java @@ -0,0 +1,12 @@ +package com.gitee.spring.domain.example.entity.coating; + +import com.gitee.spring.domain.coating.annotation.Coating; +import com.gitee.spring.domain.example.entity.User; +import lombok.Data; + +@Data +@Coating(qualifier = User.class) +public class UserQuery { + // 接口请求地址 + private String apiUrl; +} diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java index b13ea7b..96f638e 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java @@ -2,6 +2,7 @@ package com.gitee.spring.domain.example.repository; import com.gitee.spring.boot.starter.domain.annotation.RootRepository; import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; +import com.gitee.spring.domain.coating.annotation.CoatingScan; import com.gitee.spring.domain.example.entity.User; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,6 +12,7 @@ import lombok.EqualsAndHashCode; @RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) +@CoatingScan("com.gitee.spring.domain.example.entity.coating") public class UserRepository extends MybatisPlusRepository { private final UserAdminRepository userAdminRepository; } diff --git a/src/test/java/com/gitee/spring/domain/example/test/CoatingTest.java b/src/test/java/com/gitee/spring/domain/example/test/CoatingTest.java index a4f8ac0..42b4f88 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/CoatingTest.java +++ b/src/test/java/com/gitee/spring/domain/example/test/CoatingTest.java @@ -3,8 +3,11 @@ package com.gitee.spring.domain.example.test; import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core.entity.BoundedContext; import com.gitee.spring.domain.example.entity.Tenant; +import com.gitee.spring.domain.example.entity.User; import com.gitee.spring.domain.example.entity.coating.TenantQuery; +import com.gitee.spring.domain.example.entity.coating.UserQuery; import com.gitee.spring.domain.example.repository.TenantRepository; +import com.gitee.spring.domain.example.repository.UserRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; @@ -26,6 +29,8 @@ public class CoatingTest { @Autowired private TenantRepository tenantRepository; + @Autowired + private UserRepository userRepository; @Test @Order(1) @@ -41,4 +46,17 @@ public class CoatingTest { assumeTrue(!tenants.isEmpty()); } + @Test + @Order(2) + @DisplayName("查询测试") + public void test02() { + BoundedContext boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); + boundedContext.put("apiUrl", "/api9"); + UserQuery userQuery = new UserQuery(); + userQuery.setApiUrl("/api9"); + List users = userRepository.selectByCoating(boundedContext, userQuery); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(users))); + assumeTrue(!users.isEmpty()); + } + } -- Gitee From 6e5c1a4f0da49b050b137b8a8f0a6180aea390c8 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 17 Nov 2022 10:27:51 +0800 Subject: [PATCH 24/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E5=9B=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/img/model.png | Bin 0 -> 46752 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/img/model.png diff --git a/doc/img/model.png b/doc/img/model.png new file mode 100644 index 0000000000000000000000000000000000000000..f4abfdffc5d8ded5dca32dc13641977231a09b75 GIT binary patch literal 46752 zcmeFZWmuJ47d8qD7TqD;Qqm<|q9BcQcQ-0s3y}sv=>`#`OS-#DT9oeYuJbI#{qFr; z=eoW>=jZt)K0Gn!m}B1K9`_iN5G4gEbQEF~7#J9I>6g!yVPN2hU|>M(NC?1{E#90; z;2+pG%2Ll@iib!yVPGg>q@Rncy6NxCBEH32okKXV7!#DHd@sg;ocfp&HfArI;RW~$ zQm7j&_~Z$7s9ueJsgcx4el8@G3|om&rWOSr4+KJP#6^;RN!7UTI;R)p@Xhwqtf_^o z`B~x{A<9Je{{7V10pGbCI7}2J2na6&2FxG^3;odrZ{!CD3*C#~|M}-S3>v2!?*DNk zzG0M+h60`Bf9_=OSrGp7qQB2ht3kvA_4pGB|9;{3FIp)5&;R-6?<E+chr@hwbd9KYIS!s3P zaivu^<#w-mPPDQfluqH}Q;ffGj@T?(=pMLuPTwp#adE3P>uobA>@dh5io%J5i^~#M zt5a=1ISy_}^NF*^n-jgc(L4sX?PL1*9$YVL!}|ChT}RKSSEA;go(Gw~3*REnILlck z`tQOC!+(iKMC07a?B#xNwuj#XP9y(+IE|jz*Rfs^vu9^$U!>oVvYMS=`y(s=Yr$L0 z0dIL4eF*xG`)1GqR~tnC`}TSi_MTEEdfcr4_#2_=0r~&D9y*YnCoPoi#VK;(|K1M8 zEE$QkwlBE0PCXiJc(X)k}&0o@fRHA9_`6iSfTz|8Ms~>_9e?g{@K)-tRlZ2xy)>>8lD$ zb*s|u-+j($F8{}9r3?T-@FIX208}{45b?e9dj9-*?voxRo7&wOx4%ndhzL8#Y{bNT z;?Za{q``@FE zKH($^xpSHirC43er=*Y$B=Mk1OG^iGN=ix^U!80QrgwIA8Grx$0to}7X-$`rCGSR= zD7!^mx88B_nZ$7D3N?|Yjy?L^lR}(7;}d%XjIX?u^A!r8Vn!XJ`QgFs#d73w<&-{` zkZH0=c(TYen^rkI2M5O#JmF`_HOzyx%EDbEJ$RBezcBXdau4oJQQt%*>Yx3dNuFN zHzior#!d#C#+jlL5-c}ZqC8N_zkRcj%X(VA6-Xw1Z%@qdauweyG=u8#;}vVgK&#;Z zJf#GY3pTwvJU9fj8iBH3%Cld5aW`d!334QJ8W~7g)pYug)*pOh8=lZqbG_pmLk2PI z7^0=D!x;;hY80;Fq(x7MxY9_|L$jnfzMY!|8?VxSwyw{S(duP99@4~ky&-vNuv!r_ zm^{bKDC(7t%|CDa2@M1GUBJS+!H!j*D;u$#q68!ENJrBVk#BKvaTOH8tLYH)Q1LzK zi2`9BmnR@lqjBQ-)|W$m4=F<&b`YNE@bEA&HoHRt5eS1V42B{W;>03m0zxwIM2aGp zrj^Gm`LbCe;(=ECe(nNmxXlIIy*+(>`J5fHatIcR2>V`t&#rErrl;k(vgh z7BE$lB?U@9L|I)K0HQZnic5Eh92Ek8$@iR8(isj~%WD^KZU2Qn$TDCUzM&-kS7O+p zoJQnIyV9@0pl?`z0V7ud;09Ys;ouyxS$Mf1>JYq|EazELcl^Ixp%OsY+}U6YB{5u3 zj<}>AT=*7U04n7%@=B7J3GH8;&y9xh4;Lsqr2cO(5P)uc-oH2f0sDGnOLJr$s?Sr~ z==DCw{|x{s^gsY`Kl{5;{s3tb9ssPp=4RRde$Rps@amy&7DIn00=3D=7bx&QWn%gd zcUngVVnmwoo1A~cDIJ&_*R-R%n?yZMMowzUdE>1>>aWgNVYs2*sCwi?5pX`i$oA<=dHEOG+QgikoKdl{0XsXkEBdwX zZfbU04TS>&a2s)|26#1W59$8QF4KxVoFL-Ks3GL(s-T<-)A8R7OTi zoH?Y$2x96&Blc(ha9B7SK?r`ZNC)Ts>FJnWjg1SdtH_wHm^HOT^Mb1CTd(wAeHb0( z#EXsjTv|$a2@a_F6d$?M@XT~|g@%R;(JG$HiE)=R>4oHH_pmt2iG2LeSy|ufoNXi^ zZT^2l-YT#FO8UvA&+(LE#FUkBK1D}6ttjCrqzL&{y<)+d6#^Aew}1bvh07ggiRQ}7 ztJSajN-G34ZxJ3_I;=@gRk=;E)h;Tie1yGsC67>!8U7OxlAf zO&T^HD>pZ{WpB0~UG~|1B`@|zY@=YiDIBt&70<3GSr+$L9mI@SUcY!j`yovztet*{ za&ubi%NO&7x(j=(=s}N@4OmxKSDWZ1_rI^6)&e$2s(2zPc>Iau#evbzbQzo=u1khQ za@+>_7_r{+3=JQH624kr?_hhAzf>9h<>L=2d|~>H*BOfGA{*0XSx@?gpFI$#3Se<0 zWQ%(1lrk_t0G;ccWYJMlR}O9xUK$Z>!hJ@ZOH-O#T=zrcD5~@vt7=~aNzp+RjgSuu z!1r8#47SV%7j9Ai9d@4-6UhEL0Jcye4i-hc^Y*0Ca^PujsO>wyMu9BZuT|=L1y#{! z6apVu1Th!h_R*pd381wHVXn)lS=&61i~qeos#ZGd;k`HJhctmmY#N8|g;sxjedE8JCPM+(id(k4aY-O&oats? z(Wd)768KAZM2US&&f9#c#Q3EE#Gdbor|)6>Le*D)PZHr-zO25f#jl3tos*m(NY?s^-eoGwvb*@_< zeU9{Dg$034T?$7XodHn>PZsNip^KJujtd56c@nTLYpV$E{_rJ~ZPp9QtPXDp#-@px z`NB-_5E}47NywZ_%gg9YvLS=*ZU6$cbW^a1Uj>XM_)H;jqoC7;;Dh47y)IqpueAKd zjB+lYY~P756!3Rn$O6&8%|J=a1Y~SAQ$6oR)?~k0<2%X_F)_q3ak+3j!H|E_LK8W( zs9gPl%7XRxcr!QvV-wpbsRw~dSiFdg#M2Ul_8u9JOBi0diqgTy)|YSglL-r82id0*qcmi@(Ub7t~kFroG#o8zX;7~6dN zT0`OtjgMYpkIwW;hCs8)mJx-MZK<`_Bt~CVEq1?gb-umXNJTDOIHL**>Sb}#rY0niiDD)>~Vi5Y5aXdC0e6BX*iWc;55H8ozx$69VrIT zcDIVfW(@?QS4e3ILrv>OeUp=^_1uIYw`{qm!$5cg34 z4w75?UDFihCFnlwni)ZV9-H@UOA?O=?DI1*n8la8%lAc0i3FL25jb*M;VYX zBxapDJXrexLf36dg1j=${L5Lz66{lvXB@w*>DutZpwRwj4(&>`{UH+9K}3IaYz#uH-{f_8zZB(r_s2+rh$YHB~;4 zYVnCLoYbPaIdn$4-44D`=tr5_X&4V^V@H>}nOdtR!q0$T(Nk$_0fkydmV70^WtkV95bW$VwC=eHHAt zKcRUQ#geWkI5LvAkU2IXAy?NfE*#{7<#yRgz~10MTGvtWO~P94b1~>TI?`zN%-`+m z$NE+he91#rX{ioCfO&Ep{#brXh3D6WB6m!xmU+bjHPsi5N2n+qo_F;Z8_{O@3~Z=3udN*z*{o}Kaelo=3}$0fyvFPE%Ny|U0eqB~B7%h1#jtoF^ugo20FUc) zpoxnDX@Ea{`c&$&8t=B2DXpMV>&6IIa(B+9JJcthHDV}qSmKH1n}moq>RydWV#v|M zF2DXm>-@9HPxYyBX%yoDUnRYTCCixjxm!}2uDO8eX-z4M!J7wf3nduYd@E3k%IJxZ z5>4fb%jr#vWc#xUy*K2i)BS8#ihjzx%U&nucC|K{=}TdPI1j;mRO)kuGy|UUB3%CD)!fR|dV^ z#a48AQ>{shuhtqVl=U0yU7w=m;RJ1PVEcvQcyOr~&OibO1r4W5jT(girpD|*uH35g z4)g?Dv(ba6?~OA1*`&Avi<7<&mHz$08{OW)>RNgUyoNe{!b&g^ZMK=(k=@MWfjkT* z-x;*Xg_q&Pt2b%1U!SqRd2oF&VB!WAh726oGAV>3HlvdRSOu1{@pi-hl<=z)(**S@ z=Yp35wZ1qYxRmC)$$V!WKM36~ruIBn8m>QSb~bd^S@)Of;<4i@$tZU5+W55oK#g}? z7;%z7UKe6VMy@|6xnn(5PB@pbbW%X@M;s zmm43eyXM2QV@yG^jyP{l59cs0X5nNP{{9^4pEC2|`ybcmTe*(!+R2(zeR#`Z{)8@W zV3A~Ou;YS2l}NvMojD%~-?QJ`dZk*^f{D23B3h?xo-VB<##r}rd0ss)yj|r*+Zk(L z+M8D>dP&B`#=zWG2)wmhHhzi&tpA{S{u4QJUiroACq(L88w3rd&RACjZso>lYHfd= zzi;Cj9#oO?(~@~`6*wSb@L?ruy=ox`8JC2Yr=Svw8kY)xG9h-xyD;CSbK|xQBJXOyCk;^_Ojhng23ZUlbO@#wwYG!7+Mtq~*hvzs^p*hNcme~IyJ?_QIawOJ{S|CR| zB14g766^5!b`|y4aoqDcUiq<8)71yCIR&KWR|ewxim>!ZU$V0o54+8m2i>{8GjLBM z(>gXXvstVze7_7koFQ?b5)%4#3ZrTAV19I9cD5}`d3Z{nAeuu@Pfw_XE)-d_wt`*U z_s90Ju_utTq#|9Oy9_*}4;j{g*W}xaJer#TuZdja+3(E~-P&(#ZQ+$q`u?Q2K9FsL zWp+En*E%*@da!vB!01L~WXs7}87a>OH7|}(-He8~pTFmQEe%)8l$zv1^qWk0UGeXQ zQSm-~(Afr|Psyp2Qx`ue^||%fnJdFTCQn?-hcBP>y!+Wdk~Iv2M)Fi{(kp@QVWF5n zNm^~{+`;-KygOHe{-9!p(v#>&rPs7%n7`UDL1(u2=b}2`eS`>(Q~hE(GewP@Kd3qb z(4@@WGqYV?xrMyv4?>XWsc9Knq4a7~r;)XR)xhrk?)Ajpfe}TUG%|P@^0D ztxcN%niuIfGz3yQ7+!UJ)GjGzKGiwuBwmSw`9|SMy0^DizS8>q!85d>BV3&{o7L4` zXvdtBa`8Yhmm>{{Lhxg?GqPL#RIQ zc>voWm!6XCD})#x1qJ1xGj!N#$&#}R{T|UncS;()Gp;eb{$Aky{^TvD-AuRP(rom? z{yv*$+Q5UVy?_Gvrfz1emK4ej3#A8-y3aLF+dDY+qqVtU`|ks^b_%KW5T548lr;1d zCi@93bExqRsG3&4ryd1OKvL@Dl0hi=K&XTB(fvl8Dky1UdB0~#M3g!5X{K7!LPfc3 z@m!eC@dD4DgdasB2&2*gK`!F&_zOS+sS5PGLH|;7l=SsK{7LJaE$8cK5l+J;R z3vx0=dZiSNkBj~JJdT(H(a1h5wg1$R6u;~`Y3_uboa}>BEB@B10wJD`7X9l` z_EN{@vE|%neu1~45^{2AOG``8z0^JKPV{FlK|p6fE@h-B5A5OyR6KnA#f}hMKJP2; zp%ngzHx|RxG{R)q@@-gixm0b$PsQ37#NNYSQ8BQ?_`&)d9H06{R`WJA3Kb_h>gntI zeF7wv_?V2+TtfHDfS$pADHnYz&NoL#AgMe-dG+d*(JIinl?@kEsKB~^#=@B#bHtSbTbMI(em>0Udqb0ulC1(OiT;`v~k_uUU45E zRuoi}SE{=39B8tI)~jddp)Ro=jZ_<0?MYtVUW@DdK@bQfHxh=Vqa!=r(1N47 zPTc8dAg4y*gs=q?$?_grw212F(VEph_$OX&7F08AJLE)B%J=}{w}3cw6SI+@vtZ%q zb-#D}$LcabsL33UGpc3CQ1d%^Y5pY*~C zTg#e7cp|1QOvR<=Moe^QyX{}%S=#)cP=2Oi917GdZsG5|2rg`DIU1)A#rC^*hTtOv|^QYYaw3o;5H_qIg) z^QLEv`ZIv){E12b11A{p7G;z#@`wh=Pk!5x;~z;!3>_peJ72%wr>U75ZbkBGEd{MM z08kD8S_`W35CHzyh(G-0VQhb3s}Kvg3dT|Vs|`I|{olP?)JjR1j~k41%d1`mMk0R<|vwn!R%WXNFjlUIcO`V_Xv0Rf>=wbHuaE6gUM-!>iG zl<1c{>u;P7aaIGG?)Mc9*Qtov`!$Pz?{v}Jz#tQK7{9^%wFGyxi#yhqS=5?U?+j^z zTG@`1zl#v1CB`K?jY8k3?=XFuj0k4P!18N~OP3lBVLKh z>irE#s?0#n+8NRPSw*Z2)cFH~M67%cyXe$1@&e+jG}y^91Uo5=q$`5*widBw(Wp~B z68yJLnPDEvP@Vd>7XX@KNC3-mjT$UHXIx&b2)9rb=@-SYebgg>al=P;fDDV!4C1!6 zm~|F<@Jlh+7f|g$^-U=|-bfS#iTiof_lh99Sb=ny8qXP@RJ+;(+rPs!1?*2n!y5e` znVRW8De*?=ZjXRUi#rIs+0vBV<;@C8>QVVn0oRi4Ew(NV8In&EN_g^jJzant%ZOKo z?l~+09$zWw!iJxc&aRpqgy!*z{5{JXKiqA!nhOEn)py$hwU3OeO;RjKAX`B2mbNCUL8yYsiQ z>uBXS3ZlG)iEv8QUs-Tsbx#+g1A4xC7r)U=j2#lX|vCm5Y3-FUy(FC z{?_GtjEOjd2K($YuuqoL(S&rD?+jUf<3Ni&0IWNbz3&+oOkuIv2|;0S!2XcKOgCIk zdsOYSvGVK*x2I9OJ1MZaR&rEXOby{joVXol@d6&Dbv~dogCc;sM>FqfKZ^~5KD#b? zfkx~+CXVIiyAWRxyDnlx!Vy>T*sHH^N@>}^cZ@a?1wl?Ex)%FYJq`ZC{<=uB-F*)zMrpJwOUVC|( zuNJ+A|GpDuFD<{Q${M9@&!*5OqOI3bVQ|SS^ZUMg{&jn88ou`<+(Yz{^3K^7SHLuBggzxWt%^$;ET6Jw-i=e+H zR^egcV3w6D#QXrdX)o*#vUs2Ysz8}uA|RrR+U6ytbGlO}%`xwsvBvJO1E>K6=^=sS z%trXV$ig7bZ;&idPC^WB6nMKQ*6*XnRO?Me33|DS)u<3*65d`!T)~cEb8MCIictLz zcIirsas6&vF*3{R=y2gSRi8ahzfhlh@28CoH38qlKFEed~pgFh9`$; zQ|&CDy+L@l!}sADO#cKzAZO%3j#-22A3Qs;Bt?CW&W%9Y%Ch;OGAlvlz86nXQL_bL zzw0=eGdX%NvA_ONDVrFIe%LYXNsd>lw$P`wFs;~ikHVR+&$6}=u8mRSKArSr_@Nb} zhxNBMZbAK5W4pD1N8t(=513A08oj%}ciQjvn?8ikg4}}pLLs=@5%(c4;5>#91QZLC z6kpLT{2aM+=X&vAjtF2rw(!fFtgHYqQ_LHBjTA8R8eas!e)kW@^n%4^#pu`)l*?d1 zJwPu?N;TSC4io$8)TKA)&ZlNLn8cGH>MLSwVp3-Lof;kyQLs{IAO#>B5E`hwp`7fV zXCTI`cr}LBQV%;)h&WO%I^t4uwcSZrX7O^#(c?XScoot!uxF>4x*qzbySdU<(` z(|Ru|E)1VT{7^6GH1$}zM^Rvp4JFVDw)hY>xM%npB7-D=UBmZ2F%by=C{QLi68Nz| z^8*s+7Z{WFKy*TZx4Cui!plL1!-y@dCE@ZTR%j#VR<%j~o62JPuw#Za=0YRuPVUFw zOty07X_U*Cu2&X=D7tVJg^V^LcDMdgUKU*xz)EPkBtZu!#Ql@~cxe1IPV4MDRE>Y}{ zdO9!Wjy9x#QXax*s;=I&(& zT{@C&UULWvUMDTeEHuMvpWjzz6eI0yWhbhZp_qF$*SbmF5= zoPb-)l{0(*INDm*Se`g@!=>kps+-Inu=X6IO|=j~R5_c|V}ROoPn0|VR* zcpT|sc5^hkKMxpf-a%z~O~L!N8<%_=pyx(BkjFXKA8bovDhkraqM;C9Xb20u#uHQ z;H9gJ-j-of`sV&q*#g1XNQq|Pa1P_Hy~i>w67$*xjPq9awFQ{9;*3-hlx^C2hnVDA5_h1 z%UxA4&>B>ZGRli@JMqk`f_bhwIJ1}o)M6%tcakyN^X>Qivk_f&$lC@>cxU6=lG4yN zU8+?vWF>m#;BXdi((i8&@9)l=(F^c^!OCfH;JHtnDGyAD`V@+SE1;C6OTDr?neP}q z{>zf~byxprpK6X;T+>BCzf_9N?w0bJ8KNf|- z4lAJ81vMeEQh=7|p4eCBZ4r0J5wL078``|1uH81!+pqm~$>|M5vP8hAO>GGP82ff| z;2^KjY*i@-hknefl;aT3%<{^Hm@i>J8k>M1XiDF6Fe)~iGx6)!1j^;Fh>);)KN50; zx?eQQWG!C+6W4^q;&<6;mf{{i;3YNk-Ead_S3Vv+aT5A70mYD1c%K zl#l|WXVmQ+mhi|-@xH(r6De@GSB?>8?2k=VS+8*bqD;nTyc$>fg*{}`R2X#y_B25! zvW59+X;-*!*$`ZK>+4^-B52%OZg#B~wNB4WIAozDXbVVD7r#7J`I*f30+Hx5I@=xx z0&yq5*gn75&U~x?c$23n>{$b51sMif0;Xyl30!yzm)I{ou@b4&xAg2fD15In>V_jK zT)R$$)lj>KBXCK=w4f~|O7VczoGS@rb)s7q)mp0J!!6K!F@qZx?}tUwVN&K{D>e|H zpTYYi!lhhNjBHV~ENH;+V$LYH@PL`U?bT<|bwxnG%5aeEPw!c8e$}iAw`oIPo9ho1 ztTGO9z^K8sM2PAz`hG1n4$PQ-Gq>cW4n!jvwCpD=8RDp5jo=qq5IFb&QC`GmZl4cV zLa-gbjF@3Wc`+=J%%M_-7|EZ~LD1jQL7+E#2mJoQP)kp?n)rtjxT+zpyPpTH5skz` z0Qp_M;}~71GZ!jd)iP0>A1r~p`E`KtNADp4=+QK!Q$_8uQVjYH-yq-o=i8SHUA0|p z7NiJ138pum%@&XkS!$|`k77Zbs0lvy+UPJtwqRmzM1-b};fR3~xilzkoCMxuS@c3H z{hr|EEaD9}93W5$TfnAv!Olk@9@`b6oZFC4!gv+=<8L1F-+(yhVKtYv*4MGM!`$g`u)`?J*3!1uRK+Cn-mM1W5DG)kFhpTT0EL|Gg%grQz=foL4|LZRW8t5nHpA`B5yc`9# zj6iI?emDK8$`^<__@ef^b$_`&^a)cyGoupZ;EIxkwq0y)Zua!_KrTEL6flZc^jl*a zm{$naKIhiJ&}MfsFtJIzFbl{e+_T?1I5~J<9gpedeS^I~@E*Z0(-LbOrnR-za=MhN zt*vdO#>u38-dzdMx@l=?0eP0o%Z1gTDIDniTehHQBdG=RGcfl_IZ0#7^vfvezrtv2 z!VyR%5&9*(u)2v(;b3rajX*gfN{9}UKub@Kio)Wy9`8A*MaIMos;;h{oYtiHvkB>|*(&oEB*IL%%=FfM~-%KX5!+kxmiuCbk$#ZA*-a?&%wP{u0*!{^=RSfu=?9 z3#onUZ&21Zcy;n)jo65 z!_fX9XQ)G4$&RPFR>poNLHt?G)TY83J0drip~8N41}hxe`v&;O6j16|6tFAGPfFu+ z0`>OxUThz*k_x-vp(nXf^ARIis)dg{(nkt8c^5xF|IuHLhl!=|xr+>A`A{tNeK_W8 z1y~K%*i7&GvzlTP#g2}S44_uRxjJOZXjm_1Z_f(!Y&af_81T8hEy>hiE36~{W%Z3@ zWRqtOHe!u;jGeu=YoI}D_a7FrU}3j*3S;KAS@2~QON zWRaE7*3iRznaMvLR+DFMUM^jq?Y09=d+$VDutSuj89-Kb{8l{aH0hWPPS*Av<$b$?deZ`znDq4+gB ztEPhZDCW0B4$XU71v?f&$jHdk<<4BnoROJo2AJHNdMi;zq_5Rg(XeY{7Q(oG_GAAj zB}2dJjHhK&EP&wp~d-+cdJ-}i=C1UtZzqYwt0%v)9MuI|y(Q%8=W zqH`&ye2T7LPhoGb&r58S8-~E(4zDmCn@Pj&Ir$CtU#LYv8;g6i*Lb{NWi?{9oL*;P zNKM9mR=hC`C*}Wi{4@oin!oqMPhe`$#{5D&zSk>AO}e#cwROjqT;+K3Cf-F2$~s^5 zGoI>j!8QQ-kLT#~QqaecuMhy@r3t^qq36e8i6BHpNTc4H&E#W3w_ z`a*XGVz#Dn7iJ ze@}2*pFLAZ+x)GlLCB!C!;Y4Q1v^B|?j^>jC7$JSWvzyZ1g zLy@i~CD0AH?{z{P`c5(P+SH+Q2Q{mM4%>5LM@t_xpJFK_wCnUfAb_zf0Z0J=SBM7! z%;HfsOn4+CPvES!)L?fzZZtN`Y`XCa>1sZ6`QVC*y*UXNDRL4cKXqj4j2fI;XP|W=RRWAhM%_BuZaaRp8{e~ngg==Q|6WJv z*`dGZKY;kW+tT*95Z~>(8P%!Pgup}I0%BC8CBMF_`zg|VRrs){IjutKwVXsI2oaOK z<7O(YD?;%q!wL;9{Oajg=L+>rRVm>yxi68ElhdjEhpFG4#Sk(mJA(bL7Jac3mOUMR z$8|M$_C^h)wbi&=^z5yj7wTRjpIY2WV(uHTva<5Q$vY`5QN75x*^3`#8a65N%pG&I z0u4gvcF!dxXPC5d{z${lK%wT96rV=3ZGRlgh54~3;faHRTTKf_#|PW}BW2;I_g|5g z5ru>O;1C5kZPsYNL8klG4}osP8ebHFS-i(@?2F@XG7a8*JobF7pM1~yR$%I9!^o+2 z3J*~FiGdcYdW*6~%2WB@AiP-<38q55`Cb}Z{Y*A*&)6)Dv9+rf?B?C-3G~{>)-kn@ z8sJ|zZr1Z<|9nr99V);>%$Zk0+~l#nY&0C@$TWZna(l6fCfj}$4mxk*@shU-1&S>tvm|nfC z6m|NTwq7|{Dv|@@CHjpk{lSdCjVx9Kpqn-A67r`OMbX>$gWd62^R^1=&K-JXyG7J! z)`CRUa~=gW_Uu?mlXgI%8c5`>{O(pwN z3-YrD*6v`kREAPekOXre?On3LkvKc=&u@K&P4ug}%1}G$q!aMIto>3J=}tAX( z64VS`1g!R_z?Lc=By{s!oeGScL{h(-sWSP`m#SXC9-z9onohE&Y8WYieNtj0T@CKx zjf{*~?OOYwHgJps@(qjL0tV=DG`VzlOvxq!n0ZPO2LAHR(AP|*Ypq_)S~o=R{Qb!i zd5+7WVC3aTvsWnfMMfOC}1klo+>UBr|sgQ^OhTU1t-BgA4DT{t< z7CUDYNh0aU2NjV~@UC469(61r<_082= z{y5(Qd?BHYeM28}KnAa=ftbgY;_v1XgpC|Wy;xYJH_sS5vE{aJr?oMIEvEf`f=kO+ z@fd!;;VP4>+#<~xZ@S8kM19|#z}x)IkrNs6w)c+@)iNCU*AhSkH)tF){_R~1hK+y$ zwu^Mn22{Q(EXHD{w~Yj#v8TA>+Pam)D-ODWzkmNe#EfuUCB9Hut^fY+O4xEN2)D`3 z@Y{ACy~~QkxrM8c$hB5|PJhSmh?xOBTiPIDjgKXfeTL`r;i8@|r$L>WNOAhwjH>Qh zekqEPC}KDDBvnPyq@%v+;LP=#>!{qYjNhksGKJo`NCqrAW~=x@e_CsHsDL^kc_^`> z$z9v}$iiB?;+L#6ek#W<(gNz6K^AWXhgq}dhet92gMgxt&rUvXXzYcc^PAoCp;Znbmx+QrWwUg z{?nyZP?gPmssJ?FAQq%|Lo8xz-xlF1aoexIIfa$Fs=nhQCXsuNWqbvp^?>*B79KqK zmb~`fU`&FBJV9Z1K*Kbu?6lMPm*|!|z`1)y=j6tHK*Nm(eAHbj;?JelyD5DHdf4^J>K5=^0oOeKn z;$3_**cxHF$y;!e)C;wdTuEKAt8D%#-#coPg9@+NHvt3N^b0A&^Q}zd_I6bTnI9AS zkr{Mpf!i+}Byqn5iP0hw3C^>1^wj*=_*u=iuN&|rbcphAF9530!G`It15=K7ZNjO_ z%8V`Sm}u5pKN#31Os>0$dSsbOa3C+!dB?~l@|3BCH@WBnRb|#?(u=l6-#(VH*Cx8t z-0(l2*WK%}{S&(5p{*37g9e_fytdPjc{X3jo~xj1Pf+%!B#iG^5?LKsdE54w;>%Sc zfz9VN->5!K>WM$6r)XDtViN>m;P09KMvZw(G8+jTshym26Kc-`Mdw6zvN(9Q_YWU3 z$xe*>8-1V#W8?@E#(CU@7RMNj)zh!i3=sq&{YrK|YY%`6(13HJg(u1mh`qS{h~w2{ znys>rY_0$$%CP_t*C^XeWfmJ>&di!oWc{p(63}Itr(J5Lb#KRi?2~Lph!X3WH^APJ zH?<;(WV>U9#QE71tV(qDC4iFVu-^9Mpdqqy^z_q;8uYKl+Lb8RrFeQ$O!PfbbK%+^QP^tR z{CU`)Cf5l;AEJ>jHG+H+FycSah3I@%dac;ir1oPYG!J@20==k5g^VR*YMaA;)UL)R z;8=ur0*pTaCTi>P%8lNnMmE;W1Ww;pM7 zCq*s48}n-_pq^-dm&D{S9b9r_(h=!A*Z!$!P-V7bKcg#cs_=Ps6{X33pY7XoL&dgs&C6*&*?rtgRXjMKd$SakoA}mXD&Ms|c0v`GT0S#Dt%Z$$57!!;v$~i3!leKOeMM6AfKk9tLvl zHzI-yf6UPNgdwnFVlnfC;*Ib|95&XqW^cO7pmC0Vc(i=OJ9s$Sz{}&BUiJ*i ztR4v4@=AF&&V_MT>Lc~@?gNFjrBx)F&b#m=7eroz*uJ+^2#1$8zh)5YMVbq9 zX>B9#(-4~_ZaI$cq-<=S-T?*Q+!xR@y@4Y zQG*6IjyN_0drcqjy6?L9F5wFPprNq}8BFXu$9F?2>7om%<)U?jS$ zIfB4upPu4!xwp>Arb!0ti?rA8{M80#wlqpC@x0VDW@x{m{>U+Jb!{f(~RWtFeEX>T*kRjC6)M(-_R8{dp!@^kB zSa3dq(8rFn`y`%xec8{wU=-!Ft2aa`!IbVrw9RoIKtJNP!pI$V9LqsKrUDgE;OJ`w_v^L=6MKrE9+aR=-zL5;mGq<>s1 z1pjus-s|n8e8+T|Nvx(&T(2CoXVg`mD8fmWq~*KA-VefiHcAhRreqJW0jmyJQBiRe zi20{jQRJiY(d_7Wa-ITTeB;T7vV(kO8>w>IW38X0SpmIF5vr_X`l!c7iaEk86RT8x zzv`T~i9H#BY}6Nyqo;JP&umx-5F#EGB?KkwFOX@kKQa7CYwxoW)qGY2_T>o zuM|?V8=zP!w44|js19+9v6GS0z6+;M_bQ*ce6)sJYC|GoRsxim({PW;v5spW?ev!3 zxtIgJnz6F!mxH|XlzB&jZyTeJIa8cycCPc0%IuffeQw+=OoxTG8I&|NgL}E?497iT z50GD%m^^7HECzMf;%nX-ip2R|@Z8+QR6f(!+wRzA$aoAZ`-c5X(A)2x*u=!4D=RBD z>dBl%{@GOO6BA{?UrEpu?yErTiA*DAwK;Hm^WXmW!{VTrXG}y7@fgo|U>SwXP z+OvUXw>dZy6dNmNMp@iC`E~Dv^Ns{wJpXWegipZV!|AL0l2I5E1|WFUz2HW(>?4|@ zL%O#__>X%-~YV{Ag<*!vgl?K)>A&zu)~G-r-* zgeOIGA@S*+h=a+z@f`GY@_;B@if5XzA40_~2ZwwN(*aa72ahVLXRppogSnXpnewdK z+??C9nOQ=Zww}Z_u8I(K4a0kK>aN#k&ha$59a58f@4^1M3KYG0#&?o6m!bYxDM8OK zogBB3a6ijxEJt0pRV9Yu;QJ`1W7oaKTM`53S}EE%H6}Be8#=@y6#LeSymOmunL^-P z7!BoMKfAY^hWw(IQa!X*OOkE#_++qpo|5C5}=D!N}w=KLrR=jKisJm-BIZ8LcoFX)h?2&+NBzROrz71TB{ zSfT3+93k)|Xadd<)Wj^?f7en}lsd*H3f}AV=2}q|t>mIup9(bk-Y>iIJH;0(rWDBoJrW+9E>uNF=3frgW9)+Md~hpV>?i@N=yh3W3@mhO-aNdXB#x)B5g zY3UfG8ziN>ySqyol$7pnq~X2!Kj)ke?_6{7iR(8rckaFRT5E?Ax*nwwMlYE$G_PP6 z-&7aZK|I<=B?t2iT_4tV{^-Idq`(y8aiVkYlNf*CuhNHTx0qxwpYiHj0%^02ep7M1 z^O5dD@&gls$Y?{g1Cgy)6Bd8p11_y>cr>kB{vMt0!-MC@&ufla;>3Y;3E~Bb%cry( zcC3o=XAT&cx!=sNT(K`4X=7kYftJ$fT1{7Z)5CAK>_zInJdh`N5w_uqTQ+z}! z;X2D#)=3lpspj-^T5~SoImvJqvRWEjgXYX@!rRlKvBIfAmXb5JzEB<4~ zrK~0DF;FMp(;nzEc^heezh@9L(H8shAG?iF3PerZ3vc4{7@3&59<(wL7SbgekU_=t zcW{W25p-ljS1W^IU<1DvRdG}vN%>N>IjWdm4Urecm1Iu>__u{mKP?oiHb&JJc^v2w zFvzrL&Hit8`5)Vw@ISV7&`0=Qhi@Ehe3*II1NM(*k$&Z2PZ`4(Yw-&N<0I*ql$01* zMPXSa74yyCSj29fvE4^6C8QaQ_%yqU%#}qy_@{*p+noJw6zphcm=w*Ap41 zmT~m2_m1ANb^JqTD;Lo>_OB>BPIVUTdeCPK`!D_n26VmwI0zZs5%av~dQuNwCP?UU>V;Ix`#v{g`HK)lkM{i=eBiXC?8 zG8E^SfhIGT1ry+QT2S5@{|{tA1`kh#lwYyB94!Q3CUgW0rl4Sn(@P&rm#IJg^UjEf zGkUat-kjf^udzs*T9sMA!MaFEVD-QZVyDl%SQ7GY*r*h|AW#<842Na8-2GF_pReK; z?U-15g>C$m(N2SkpPw+1-9XaaU5J~9CkB{)q_PMO{u-4w?83(*z|U;VMKU+fW2|5d zGBiR?8$+i!rU0so?@lg& ziRUz8$H&I{t2xAas}wyZKBrQ|7&K-CHWI4+BV3M z0ly1WHvY_S2&6cWY{mB>*{u6P`j1aPe}Fcy#CZ6=w1&Hj!QsR2dfU|1^LO<0ad+Eh zPD6KOSjHTls-0sx@cF5Fs1yI?`D>cS5a+dRUhj(Dd@97yuWTVZ&TB>Ht z&d$anC;y5h<~sMn?R{kZ`2!w$vZTs%Yv43$Ozu9$9gZKs%1#dKaqGJz zRoCA$5=h{C^;#=B?s0^l7sBgv6edlg58Ca8s|5)Mv^=tAzxi>REE;&;4~}ENe_)S} ziSf5%_fR9wK$BWI_MSLNqg_fR6U+Rds2(Zt&-5w zHigJ_)RL)Ka0~=ZGTPcni+vMLcmK}=;uSspm*%cNx`I_wH$!zsG{sT;*@5v?g&_sH zC8p|4jvVo8m+rQy%kRHe(H^g3EWh46+XPz2^`JTyd$D^?T?`J1l=ku(_rD=Ww*oC= zl%rBY>;JGnPPTh_ECatDhywf=AQy^y{97IOLT-%vhOt&FX(%reIm z=OvE|>;GEYL@9k2f}_7k7F^R3X7_hulIXQH(Zl1TLHVeT$vx7;)vS?r!;^*npkQcW zmqZD4yxqmbGH3CSgXoy`x1J&;2{StnG)iaG@|I(vdn#^xkeFt{1Ox=UAc*x050SMj z7FhE=xDn0xL@=mzWHhUdsk>2eOIt{`6F6QT*K!@+kE=Ta)T=YK)P87IajuaD@V)IM zDg3tm6?!v0qPa+;cL`M0{Htqu$3gi3W>>?3p#E)pA9ECzf`HMJ`NpsDB*5T=VpjQZ zB1;M@<>v8r*17hG64LMGfIXx8=AQBqzq^Aw;@8s$e~MzQ_+JA(o6V%XdbaQ0k(DA6qYu%Hmh^x6+? zK!7Ll3taDMJ&?m~M790J`X+@X*|L){4+sD$_j3M<{}HBlE(*{QavWgloE?E^_g2WGdlORbsK)yID{;p6W_pb zi~)&Z`vFcRltB)=!#S=V%K$%yC+WX$41>wEVOFSacQgl$YKjH%42mR%G;PUN^g|n8 z&yvbAzbKI>`&5;@g}7LZw*M+lchw_lY328 z=2cUqa*rphPp#2x(!o=0NnkhkUr9vWklH<7&C+s4dyox!mTt6EVQ7T zA2%U|l}Pj?Iq-fyK|O)mvJTbxVHBb$7Z&~V&^O%g__P>_8*a_@!l7wfPlsLjk1W`a3r}dd-NXr_5_@s#N)R|dw{ZQUHVoSgp7 zKbd%PruwHjo92>qsSX|a1hpvSN(O9D5HT?aL~^uObjO5a-vnM9{;a`=0XesT{kp#i z`BAJztrvi(aRRj=w2&@l`e;3zW*Lv~9*2K` zZe^LcsU_j$6S{TC%tM;V*n{r&IexHR8_wtis`d*-#7x-&@yvt`&|0Aj1LUO+@P?RX6HW1ayY1xg91G#I_RA({FKg>jZlv-IK$#^{O*g)oEOv?Y53^kY67oF!%e1k-wp(p%HlaRcFJJSXg$m_*Qt&u-%i`bYrA66>W3VoVJ6C zFhC}Nk&TV((sj4j(N7t3_uIsC+pqY)MpX& zB2QED&C6haBRM7O)K0o+IV*`9rsRTI3gte4(f7wk`S-Sxu~gZAG_2`Ys_)WfOqzMA%`0%lZw;$w9Med1)jR!QhqqYDQI%$VHz+MY_LPR*x(3cBC+fV9jY zwyN_ra_R&8+yfdGA5`NWUkdxyFFc^uVcCJ$%ED4l0*abJ^7r@x2n*`rN(ZIw!!>*@ zsX?f+l)i;6D^v2Yv88rq zXYZl?ogoVpwas^2cEPBoDapYd)!a-qS#^$;_iekBqDg9oK*h{k$^+UNm$ zeN2T6&$wy|BkX+G=_Bre??rhf>FRNH_@}J)lY+2r_>pbGy3w_Wub9^zW0`Ape9)Uf z>)LnPTrhtPVK6FS+{F=kmy422tEli)13J%rpz>}zdo!S)?KJRy27t_9pM&c4u-D_` z^J+gs+hijfs3C{uQ*!j%qAH%=bfn7xWrA0%dfye$n@qlAHEV;@j6|$fhS_L`meieP zVKRINortR~jw;XrOZ0$(B|5iNJdUE?i4PBy1Q7*!7O_~~rN#qY7TnPUhd zVB}dcqhJVN7BX`C(L7|-sieFfa1_|-oZmTY8*fPulJn*BJZPBFIdrMG@)~~pD1rKi z&W;QD#_P3eozTRy6rY~y5}olo7~%n6d|JqZLjRg$Ff4;vi<_jNOHTPUdQcbQ~HxrrQRj%2djpY4=%QLw3w?U5PbawBIGjjqNJFW)mOKY#0_fSi*m>N*+n3 z_gZI@!6v+Za8AmroodDhyy^_Dwt-`avD>kb5D1cv@RvhcBF-g3=(=K@urTCJL#FP1 z`2cOs9X+YQ+Pp!#Gk;S@W}LYv=t>`CELB9;RnpFi{LqN1FF25R!>^y;m=W=&aYWS1p;Oo$E6qAqC zqu6uY_yU*Wu{u#tQPli={1Uu_oN$^^u*$ZGlF2E~yuBUoz^`tmJ6-n4&;HUNYPrm( zn)r{jYxm<{N7dRgSVJ%SYV2n9d`vvzKvFf#!-+dB=(R((sih2PbRl;tIOm^mK(xIS z))~TvN5U>WmjAYM9u7deXLGyv_A9ASA4-mo4)=93(%{Os2tW4C>3fPkd$@X#T9Gkw zAEv^MA^Yt%E>^^^8e%i->{_i^0~iNel<949_NA)a?fFjK+5> z13jA7jwBzBvKp}Q@$*br$azLNsjX!i6crQ{$PUCDNxw^YBb@&JEpe^I$ce_4dFWq` zWPKxyB??!#@<`TFt$%D9x<63s4*0q{;3C`g_O22EPo;o8Y6Zl)T znkEr@P|T&KL#CfA9o1zXs*?J@rB91><9htgtYOhVLDb5!T6moz#3nhsd4NSLpbHED^0Zy|7G z^p!r(-f(bmR00A-byl;^jjj5?XQMSZ5Hnp;JJ%@Sz|Q%N4%TKa;k?E-V@r)ouO_iC zuQ>xs2x(~7E)*@7*|4fqW@5Y(PWxVw{Y~(T#GIBqc5Oi$uOI z@#Tl89`ia~2#r(;tyIepj=(uj<&NU&KJxEzk2ds0(^NJY41Q#yK#4Q-)g238$B_Ju zFmeh+lBW!l=7Gp)NDK1AzrVHuuBVx1vS8E!q{{3yU8Y9}*q`49TP^4#B@?w!RddQ; zpTs(tG0?I#L5V+aq#8VS9GswI5#*7Zyb2#{cO@5IzUV37A()#+6gA5poakY6tB#;C zjYCrOa8C)5Oq-EN3G&rDJ~v}N6h^j8lsNlFwWmk5Crq`|`fF?#5i)}bO^v-!my!?z zQAR=%4-F&a06slvpFe*#FD-wc6G$gO!fOfnG@3l$y7=`biJC~@x0Y5+p4pl`Q=P_w@0@!^uY9&rj}V(ylBC^-UN+fa?Jpgm zMFw?}RiJs;UFi_tpRI@jiiWk#U$IkK-rn9!xY#HfNRc4Yr3JPTl8~f=Alb#RAVRnv z#gFgRw`f%o5E_;JGd6AQzqn9*-@l7He!J_%kdsTKEyRqw!ghDj&H+1O(-RyH@I$8m zxxYXM1{icM%XHe-K-|Cj27BkHp{`JUr-sIvAoUGHgup67+i$+l6`Jf^m2p3SKY9f{ ziZ$0@n{ip{cz@JDOOt(gygFT?W&iI`2PAf~IFv(pL_|nuul#?NH7qmJIIMTAU9VPE zNb>&XpU0Z#$gxor|4f)&SgGv*Rq?)}_|nV$OO_L_!d_I?bsE~_bw!Z5@vWBlXB!db zFIY0NGQX-)DS(6R|K$QWB5meEGx+eet$oPO`pv;)D(a$Ad2oI;5( zakr)$zZ97dO2lb=q?ox8;}2)9$gjhFKOfy1ANPdvu=6k3xf^5OpJC?h+dM4(D!f^3 z%-h^6%m4d5pmR_WG0+qB&zCg<^*Ki5Xh;fj?=!9?4kB-aV-2-+I$W)a#EnU*VH-(I zOw8^=-GLHAJNUKeWNbLX_rv%$<0h+P)v0ZSWe#Y zDkJI<^i<|5bPt8m~VI=rAK&nuHo4Q?klUNX*kDEMbU!Xs@?NbIg6ozP{)6qP| z7vpl|U8q|5CrbHOOGdT-k-fvQL-ftgreXRK_m-HLSi8zJVAE={VBDzXQPMNGP`#U9 zN|{Z!HrhX6(26O-%Y?4E-5H&4KY4$~w0bkcM8%0wF>*!sFvD8?UmuP2vlidTt#MYu zsMFkQj=bV;jkR9z;3VHLTh#yGO?6Y^)7>H2+Jtt3%zI$I=v`w0u9q#`w|`Mn@miAg zASFIxWVb=dy|N`9kO@W{I_RiZcDLu|^1MitVJ#=^q}@OD$o%d=vX^_$b=-Ds_(FFF zZ1W!+fvEtvqO+%_QH@VD^x2W&othIRR`3Yuyx9msyG&QblrQ1QGm>#a?dACWTOmgw zBtvlhl5N&DO4WX=7x&sMRc8k7nRh~z_&cRcAd5u|Lv6eVG*Y2feZhS@cR(GQm2K!x z4mjCwM}jGC-KUjNbeTFZzgA#>i9?yXE%0|hjhX5!Lqq1jF}^N2MSV039-Y>xrzC5Z$C z5Ql2N{f)5((t8u_X4>sH5D3_qNwdnn{;hw}7JUCs7S_#py!hW`2yclHa2RWUuo|s) z_ECxRP}d!PpnfN==}hl9cv)KZ|J{OC?andMfa#Gg9TMLlvA{GVlF>6Ip0 z-7Zodn0m+hzr*M2Wyv@(+4ByqtQ_)~7BF=OZNzTbW?h>ti<>iWPgj3U)eW`?Y7N-k zwVYnClk3AHKF%z^e$7G7i5!+=<+~W>6M~9Op1;H?8#;A=Gv$pl!3>QZaeQwgflrw^ znj>+5sMM1CjxN&?#?8%5yTiMUj@@5e21vcj{=G%Q0iQci;NWO<7%KAm&U;auA4|-e zq$NgWXJaq;b`~}C>@kV#C4Tu(q}CUcojk4>lXXiymFdeu`F!yD_><_nYn@u6%r{b> zall!Sg%oTM-Xjh(zoWENyo3`>0VBO+TWC|w(@#$oDHF1xvMn!i*>XpHk@0&a(Du;K z-(_+vhUsI}(`cJ;J1t=V^3mB{E>qxsvkChKZjKs_haB;jVBQ5{ds>%%`^+tg%r^`X zB=R+2=cCDYstH(Q2QYu(>cum|rb>kaNnicrsDynTK4Fb0u%E1MNdanQT~TEF5_LAp;fr z2Qc^HrzArJwSSKTAWe;ZW3C`kw4wBxN0FBJjgGpAoHv_-rS z;~DEC`LsR1p2x!YaHDUA;o!h`!IihzJ>hYT+~K^*V~1g<4FZ*T0v(8!i|9n0!$0e4 z*k7V7J9aQ>%zLDn*W!>>`mwTE53flDs($@(eZ-JB z2!d?8G$pb4qmBp1SxOKLm9B>C)katU){CFXX&&%@|nxjz;6KFb6-grR%(j zPS?NZ_)X@7fDcJPLVD&}qocS-xs8SlBfp>pOiWC`Zaaqk*Kdd94m*m-508{W=-&>@ z(b=x$59*I}e+1}-9{26Ws8}xjL7A6}c~5PPz*_sHq5f7k25g`m3s-x9^87TQfsUe~ zn&GXg5BZZxYj-FXv*y_z^Q))}zu}F+dE==4aSG1Lf)R_li z5;@NoA7Bpok)tKxkxKQOZ~#9yK6`T{RS*~GN=hZzY*?#5(pTD6eV(l!_gHNEwxPP) zwg+6lnA|_e$|3;x9~;nt09$pxP4CAehzwl6?xQw7=6$i8$Zw{;%MDOYRU8_q_+7qc z6e~XANd;wbb`D++ng%ob@7tj7%mg_7t7BbawSQC27dxFgKqzW{K;&>I+6J+57-l+; zE1;&OMBG{DZ$ohfoDYeBnKm_9OHX$J)hX!Ti3&cu-oy2`hMW} zDi#IIodc&>*L`%SvYU3HM(!E|m;}p_CO9h83 za2wl?)1MAd`WOS56pp`UnQj&s-avR7|38biPkzU^C0RD8C=sC;mwh<_b3z*={UUcX zzypq1H-dfmz1gnA9JBG|mQ<%tP%=uWp1s~BtSU@g+$noF%BmSQ&Z#s^GXe3dK1i)& z#ocx@gED&5{>8tezu0(q{xfBIr0px~Z|4Rso+HXPye0}obCd;zRxSQ*o7|TkxY}F} zPempcyb48Yi@G`HfY6G=8Zf}DBgNI#ekF;n#S3nx4E7)ghaRg35t0oGT5p_SJtOHYdf^2Bb!@x+aZ7973IiAbT`^>_-o4!hZd}rzg*ckX2h%w?p&^``<{>#z2%}MhqY^CC-StotvSN@D^TrSkVBD z{gk27JNWs%7Wc2KU3rj9$@o9&QM5Z3#)e7bm|QbMDTu;YWSa^!j3aKV0j zi=BOUS}o>r%TO`i-DO*1I^}5lqD}fo!1F;23=gKoR6}R|UcTXCNAEdy;mGe!%pPAW z!Oq7p-wDRmfda^d2PBEXSNS8KO4kp8XqkXU`ET9+$Wv0u=Wq1APqA-%{pJBD$_9sM zyF0gMLsiX%U0*Z+!c- zeEDss!`J=DhN1)Y9ugmw;w@&)wrZr;5gVPL6$}X`n+9`*63?fW1@@)M%+5*9my3&C z5$4WXra`k9hyYc!;~VzS$mxNb0z+Td_q#-aHUUb8-Qdxc<+My?FG7OOIRMx9k_7=A&o}DVu&z0q5bu?N1cF zg23XUvDrKt5ar5K<_U#w8+m_qpe0+VT`YG2D+>#%pzV7cwuZsCw9ilb(3M!Ds)iVW@s<{r{j*25@8|bXE9Pkp#)gL&v#&hxl{B4(PmNB1bZf2#S@NgmPkvGnDIDT#O#(QvypFH59Hyj7GB4B?cm zp_8xR?w*=zs4p7b$porNkWS!JpJC^oD1Y1D`Dj03v!I{x`uJHrC4BHsVSd(sU^zh; z#5Aklx2qqFKB)P(`l(1X=DMgLow=@!=KEWz9$ED#I^#XY9}b3bF10GlMXF*G!^THx zlrxclX>7J;{Pa^Tlx$wpF@{>wAemD914eV(zb5N!G6QsL&)3& z2xvYbo?c{#pWMMr{8N#$W4k_3`5T8RqTpx_ZPHFUQEnjoSuV@@Xd&0+fzLD2&4x-wf=36Z%%b97tMh535Ka^M8$!F&4vDt<{KVJYiGII6 zA|YAqfWqP1$B4+t{^v)^lQ?e5hwg4k&jxFznZ63?l6xB}cSx1wjS%-dX8Blu7QV&= zzYP|J`>Dyz9XC$ms$9(4AnTOW@;u6+JC(RN1X74lA0VshG1>d(& zxI4v0Y}@*?-3kR~)P4O+@H=0rW_LiOy5_0p1qJ_>~GJv)PiiyUu}Qyn>l0hkd`%f=03z0N=`^)B2Bft92$j_c+{VtN&wKNEhh_lLbT?R(UpAu zDG_^||IG4SxXhz z4ql1lthwYi#d%C_PNc;m{P~Kizld4eifB0ltIhw*>^SZBI~f08v`Bz@_!dTLar5Zt zh>hIk^L%xl+~pE++B+Zx0S85l!xw(t%c9W!wsO*QqIdy}k>wncX0b$QM4V8- z&~!|~vQdbU8;w8L$Jug+A)nuok0hC_1@qa`U6|pA00owF$+5c)Q*q?3|7}k^cgC$$ zRNFW0?;rQxwQ*-GCQO~_-Fj?|1@H;8$|M5NZRtauWo6y%$Mziabd|k#Uym9yL|c&R zod<@(*v)?xy#3rzSN(5pYi3gPmZj2p-H1N;syY`5tEGL(5N<(aU-M$F(F!?uJQ0i7 z6yPmU=bOP2@zfj-wXcC1Lkam{g1MZ2->Dl{`qF^Vd?F!AotjCX>7x!5ar;KB?3+3vJ^9@Gz5V1KON7H zwyZkU(#=6RA~7bP6MLroe!hCf2}L7UnsRtoN5{=Nike5nNl29-9VohH6`)fu9XR-L zoSb{+fuA*gx^GeG0qyO>BCo@`YaG%A5M!8y7Y!H+NJx10mm76N3VqubPz}{#!v@W= zzMp;#S*a%`hToa2tl{79-OM@$Rd1#lp{6i76uZw2;$z3GvcX1Pz26R)3^*ngvAVr&ORUw5p)wxhtSGpiclofKp~0OtDogB?7Ki6 z->N$alz7ib!B8kmw3^M=SrK~wO@pvBeO40*(4CycBG?OpENJjaF&*sN;DX4%B4URG^sK>&8z_y1)T8TK z!Y`x!o8|R^Vef~!y{Rwgqru3{Jf2G@xtz^MB&QyK!$h3qdHN3BZNg}zXB0HZ__ z$H2~GzS^Wt6>@|z6zeM_-VTE_8x~Ty!y49AuTtv6d%w}3vv8pFvAwx*&k2npY{k=Z zio=8DFHc-`H{mMZ!Iu*FOlYNm5G~~ znX^>zW7zvm*bE`ZpLI_%5`xdn+$%$w*O&pm@J(v_#1V`!U59wJdZM%h91|$)+T!gTv;tO}NO5ja2 zFgSRJ;^KC`iJU6vh0@1wLse?SxE~lu#Y;z2_q{mhlPc90I0UNB4xxvV`|bu^zMGp5 zGWaLVKRU4_H)PMy^*apxyRBxU6ODowTRqKoHrKysVw9V0(TdXI68`3icIF~q)+o+= zzd>)gQ2WyfXk>s_$&0&$*L%gYkdzXOqMKVT}624>m& zxfc?bK9wbF@zmJgEyAaYqy%nQuv1-a>fjN=mStySFEvLvX~sm(sGJ)`PU)=Qyk4-=wISA#Gi=FJ)iOMPK;6`Nx$lzYt)M#$Vr06c z+7Q1lmbL9CsV%B+OW=| zvd(1Wd?@}LpSltxo~B6fSqIvRleoZJFL*TNb+%r?zg-I45YVbj-_ln|=}1K^w5&zF z^6RYO<>53bps*)o^KpVQb+m*G_)Voqd<9)SDCZ!(L9G;c|b9qKgm4V4~V81^A|P^^<#4QF{~W)`oUNpkXIK zTsBM6H3OgxC&fL0s{s;eGbG$&HA-CXko361 zU(x9M_fG-CLTdI|A@^OXHKUiN@#d_8n%eq#*s~THWN)^~XcPwPgFsudvr<30e;uM~zZw%dYAE|Q!=vKMG`hS)jt*bu& ztxOhzgPnVRaWR=Cg@_U{L^~~q{$D}ah7@s8NR9Hf2P7Vkm>KQ-MM-9xz$%-fmux)P znI0%Yu*LY=p4a%cc=WB1142>d1 z1Y=)i4Jar?!MW=KR~p=+#7GfSiK7(8Y%+ndh;D1&Z{IGokoF*4zqz-(qeEZ89Oy8vhiYs&EY-v8}8=YE!Np>AGi?3dSud@}qt#$7HYc6Vw7{UVR7z;WHO zRk>OY3_by}U0JPjrTr2ew?hZ z&|>(rORQ14)JncmA>UcEL7(Y$|1W*=^S>W(B1urQL!szmvkC``uR-&ifIz|!F(UjF zBUTxhFW8*ngD(-EHW zEGsP(UfOV``xlT9tntOxRb8F-3CoF0XpZ@kMLZtmJ;xA%(IQoJoRkA&Lv3R8MCp{;|e$&;w?WrA*YjH zi>Mn-g>Zty#4jzQ8a4yv$8|l~k4ux19O}e}~cfBA&!A z`@Z$E)TJR-c?X@OZe@6KIlb6SG5ddtXyFlniH|+GetoVH%#Jg(cm&_P_@-W_ChFrq znH})8=eQuCz>&mz<`z!LM-;=BJpcZ?4zm>1)-Ljh?kQ~k_ze~~yyJ^P&E+A0zyUr1 z)dZGvU$?0B83^ha80wX3B0ioxhqCNblt%^hhRJ(@DwAuLBXpcV=&)N9(Qv_)Dro}hx490;O zd`olqE{*D>_p=ItC1snv#`ZXNJkUMSKEE zC4ah1S#p;$C6uPNm@kVK57*w33a7;}A=>BRUy?8+;0&K?^UE2iJMRuaeXF3*U8G)s zg@pwH#elBa+1WO#`DS}$Gcs759T=}=9ve!&86NO-*lP1(g2Trnt#BXD;Qqid$B~~` zTMo6)9e*ct$q81Kr>M$0lQTQTp8#X5gZ!&qrJ7QZ3*)S z0Z~+E)m7)6meOPMqY{-v^x0iu7sY$CIik4dcNu{;UsE!z2AoOA#Kt*4d#sCD|MfxP zPtBQ#?81A_4~2G5zFfl-n7V>2B)289SCc@&PkelbIDz}zom8fXpVhbpWaulk~p zHy6I{trPDxmZ2EAhp6@S^}{D=gFcRR7)pKW++h7J5W zo#nxL+TMZ8%nkwGwjzyGF6g2Pd~*?iz#@4^0Tx}FYE5)?)geNKpgx9I|04_83|8fB?`@=vDLP8H5L|-gKYFjl! zKdP;3ry zw~y}URrji8$x-?Djcy(^7#YJ|Nd*I67L-ZkVA9`899V5N)hgaxGlXH0;RVZo49bzs zJi3qE^Jg}%W*ep#HYp@vD<-}0PuAWl^a25cy z5(8ZM9P|aanS+dod&0IVU4DyS zkMewfk4L-}zTUetur^&4m1$$irW8@fiq-6F9TtRm6>qKA>_A@6aLnPgLBB&Rl9@=y zZT*;~;XJWGY2YH+nB)zAGI~qEBlf_BCs(_PZ^wNKjyHEuJ)%L z3xjkGSmF=T9SmyfYGOP$;hwl0DdNnl9nU$v#!SsVZCSco^u$}4fBC}f4M_J>O*jMu z^dU3B!AQZkz2F{_fH4HGFY2mo(0rcU{UTf>JS!wo`_qqqwl`EC7vety1k9> zK=@)`=Cs+TU|E)&*ZpR>E7)?TaAcDCcISGLSnJL~E{vy7$11N;pNoM(?haIPfADG{ zpb@F&55Fiq8trLcxIv&?l&wteMaJ}dy>XHrhm#qcT`aW1rgI;)IX6y{QB!ndHq`#z z7+dO?1>1G!&_BUev_AzpUATbZ$>TR)Uz2;t0K2G@>whhBL1&}M23w;&==Yxepw$j7 zGKM{Djq6}s?9B*r7jMM2c%}xO zwFpn}h~G~7k4%P-kUDZwi=&}cv;Ag@rBE#|^zvHq!RqN%|Dwnv0Ly+94vvh(wa3Ym z6#xscB=^9YPdF1WzDJZ$@Qk-KxoWQ?^ zm61|oF|N=p)!O%3#WW}fAR#~ICiZoitn2BROGD7s7TGAniV1ZU7q0N-iRq-Co+R(^ zThay%L}!QeSj_cgquK>|@2Bz<6*+$4GLY@hl!YbpSt;;4AR-_rwCKL0GuDP#m$kF! zam^|3G!RKXDz(oatdyL(bUsFR^(gUP7|yCH4IixBekkOX2oodj>wD$uIVFB}xYAE6 zF5WSc=vu;D0IWq6Bqe{g-|e#mr+kW+Z}r8$1ucmtJA9r~{DTB2sFoLhx%KKv(Bn)9 zL08>ViBX!ihXzTS<4C?q%_8Jy3lo{2pJ!xblmIdiyMwX@-J=Ci+_YQm^i|8ErV#7f zp%)U;Z9b8pD=Uw$9>i)P-g>oV&(s!%R;3x4e8ZleA%H9+BLiw$ftRnIjSiiHPx_iI z(t8C^O{ljqT!QPKJ{Nc?Gejq1Je=d$nTTUOLSfw}|4upWMPcGD4Zl-Y3GXj$V6Z%{ zKM5sE{PAojyMkkLB~q0Tr5KW8J)rV4WW4OgY;${C0aH1_ChBpoAR{-2@*Fnl)=tko zhu`OEw4HK2s=Srd;d+T*E~nA+w%UpJ&6xU6OVRX3tg3MzY^-jb^cqR5uq7CC97iRx zZ)zwu)D*ovId9jehS&|7G9m@PEQN}gKIIA_Cr^c-Q22db0-|`Z6+Da-mlIDd5L5A!1`}f(piI*Fy{ft8>b6A zQQ0<@w%nGCva^& zz~uFL9aat4aC?C8XX>ws`45+O{;NPABlY&}d=nkTLvM`0uZYJ95cw5JOw#{S(uv z4TjT~STz%={0FZt_4owKd$jglHe%l2L~<^4jR`vvPx+m0#3Q?$;QM7;6GgMZZfQ&x zQ*9DStpRWThBr*_dZj)dE!5d^tBX`3$52x&`%A>EFb@+0-#E|Tq{fQf(qkO{fdWr? z@46$=NndL_ZN`xce>AmeCzK(JuiAzhA}1UU3!Edy@4c1 zEhngw!cfl~C(E%2x8<-#?+d2u)V!Ofs@-Cz3f;E^z4gw4Lk4$m^4-x;UGl}S-L>vs zuXtB!DBPl)@pxkAm@!>jiGr~5z&9ddOCbp9`>m+-U9fTU$@)I0pQ~2I;Tz%74ytN zaY*61>dXCzedPtHlUx7nHwR<*Wu)~gjeW7!2!=xt{{&HbH;$b6D}k6^voDiH2)^I*V=by@$v&f|SBo64m4NG8Ub4#)Y4+?IZ zZ#wR;6GhuWH0kXf&wx{C>B6UWSSs$&wC{k5@D}ra$WqKS=#3`_S?Oq6sSGbA*Y=PB ztJXVHE{;T29U7Tn9JwsB9UIU&KD1-l>%O-OqUzZt0HU7V<^U(Yl~m zmh;_jWlr#<^>1J>u(gG;1#Vd;S}`YfM1w-PYeGOmDaiAtH)dSG1Fq+|foyV+JoasH z_@7vdv%klWuGV%wgSPXV;;yjnE1k~uZ zT_7AIXZkeQ3ViZvZXj$FNqv(n7Yzq6-;;)CD24)zISG0G52sPXdwp(13RBeScTdOM z&#HvpD$=TyoOj(_hGa@L3B3mB+f}z)h;CNq{u{-&BG`#zA;UYRuk2auqbST9df|6K zPrd}fp?r}UdYWVHg~_SmT-*zj$!wXtZ4?{RL>d30Z@i!F%kaFggozL84;w$1;fWEu zEKQQv?6Ac*FO;dba9<<-;`nTBKe0Z>Ijf+T)4vi6NrSV|hjsRWcJiJXgBkgx457(M z6{M!%Oz>&Lip`+x`?>K6MqOMVLLC(mN3+0Lq#|*s5X}E~#y`ZBha)u%93l~f8N^od zWII*0vDD6JrLU@DsUM)@#4c#KKkM;ix>Yziz9RxxUODAdNjF0a*y2fW`#j;1XoM7Ms z0*Ee#ct?yHck?%7m2JcEe?Sniv4llT8w#sKtjx`kg$hJw6?W{**g%XlMlBIz;#phUJ#l5iBQSuN zaN=egRL4)g1+-WY#bD#&(z?~r)6;7b1?GK!QKUYlArtX8m%^5-lbV=s;UtMZcUb-v zBmhtl9TUhgBVG`VC*S}3z*lyARCad6cDI~%Cy5do={8jsxlG*FsyHrm;p7)|VoBT- z)LndsCPO01bkQ+CBM6t%0|XsAqO(_DU`5MVs9A;UNYvS(p))|xeU-1A7773zxW}#}Tq?L!c`3(TL~%MlO!5zk?ap z`YLTB4<#F!ebL6#RLzc~>IWXrSGb_XFspDcpffBJ^Ip)K;=TL0i1AK=L_}ccDm)~k zp8d3|^n|6+VG*w$77#)0;!T z5lRD48XuSFM*mQ0<{Pu0<63DKay}=*NbU_)}En;_RbiD#- z!~~c+T_{XXbk}(olOnmwsww$UG+|kz-t7#4G`#aPMbec$b$1hv)?gl9`xBeQWh?lC zG_04y(Ss@T!U9vaU_aHZ%k*IXLZaEL_Yk}~S)l|Bmw{o9j&PtB4?bD(ycktm5yH+j zA4%dWH0luhG@c#-^2a?RdzY}(!?P&WdeJX`7SuPOIp+<6tComX{G7@}LSeN(eB>1XTOO0n~2txBjcScYdwBK9!J3 zH=KO#PX-;!xi3;<1$c^h#LnJgxH~ZGin)NQVsfPP{Cs6VWez`)Ek1E?FdU!ufdAH& za+e<#>8rVgU;l_~%vxuo_uZKsQn99gmf!!^-d9FdwY6;vYzYDBl9CNd$^k{X8$nW# z?rso}E^*V{Ae|!J4N8{^D%~YW3Me7*&3(@CusQGZjPd<=f4+`29DA_W+B4TZ=e+Oh zy6#^*AcRRtQ@$Mdu(xsbg<1NqRNAhjM93>3G^3?fpt?;%2jKXm&%dlAtj2l-jm6!^^-|bK1s1E-PrBCTXjSh5Wzbpc1xo zo@U~uTBTzn?;}QB8ss&60T=ZVpD48NIL^~#7#fh+oGKP=V5P?B-L~L-+nI7+56yK` zs=bLR3SbV-XftKFKBbYhzBOTPb|h3k4_Y^iJiP{a=#nY2WCGYz`f^?VcVD&dY)@d+ zJr8!sq^p_~n;)ZW`u=HEC#H%^Y;;mA%8M(Hze1Sfm7%` z9hK7%bzD5ofn&x{KicDC*6U39HuCfPet? znJ(O)y@ukO(@E5P1Z{~Dm=cnAgaS1R{Pc8DS*ia-$jJZE_HGdx+g|UEZ2pV%qqE^1 z?2kSUAy{ZVip@MpC!@yA96yz+Er=HMElleqZ?7vdz99gA!efU7>g8AhNC3`&%cUvGm0RMQ@a^ni;$fbJJb9>BlSq zGavAL-lP1BknEdhEz798A!hlxYUUBI{nVVV)&PcNl`X!#VUMQbsNA^H49vo57&j8nj~^mh)=L3a{S&%3yt~Vw52UR$=UE6_>|2AWHj+ z>yb8dT95MQ+?AS<=`vAokFseV*Nd}58u4zBok^CmH9lbQdT7a#%FiIIXBCUR@-P9> zo=Nnl#`GOAy$q3lH8ml8WbeUTAW*U8gw5 z*nMNM_o1+;o@=Z3LwkN-zWnqLypM&UH+gegg9*vvjb8ypo8$de!_z{vkFCxFk49JB zx(=zh!!$6@Lx&Z@M69igzarUZ_9Q@H46Ntqhd^k8BOteCjc&0dJILOUs$Z#8jO_hz zj7CHdmR7XkX7FS-zrsB!(+c`YIk%O5K4gP+*T6lTGJ$Aa3R3yVf&Q9GN3qf`prwt* z=NdJuyDWw3zpN+r=e5#%ah(%Mboyf+)Q{L&nQT?a9#@K<&go`gndn+s$6M95@R4PQ zxg{B_gjLrm#HV(lGPD?iyp$N`_?Q74Xq6w3Y^blRos&6pY&+ln=8fX?nMVgqY~&uW zjL$DkJow%#(DIRfoAa+2OXLOR+<865hwxP2o0Pn+k_F7evRa7}@g)9A=N*iqp&|A$ zKlzJOQ!UGS6?s`S-7zhwG$eHc26Ji|F4|LfIN}0_HF;$5o{HNe<;_51oOQg|REhttmk_ zXuOF^)rGzzYz&SV@4q@o=63!@D44O2k-}9Ru7raffN87rJZ7b|OtStx%aJWnL|RK&LAM~Y zPI{+ts&8JM<>RoNlw6CM#6T# z=rf6dcv&!k=&4B3#R@-#{A{Gb;Y=`RbXb&e1Q+8SBE6EM>-Tad4G)$S6vKGfE{b*B z^E}_=1601CXT1~Z({+6d1QU_CcMjXOP8Ee~S9Hz2oVf>27#^2BQBgdNmlqXc3FUS+pN(te$ddWM7yL)isyA z3?YOr#Xr?$Y;k+)wj=H4%q?b|B(ys)7rNy(Au}^drmxl0Q9NNGYaHa*KSM6{{Ju3$ z_BS6`Ln)dzvz@6;HLzPkp&8U;UajLX{Se|=Btlc<89h`@p^?T+5s+B(UliAJpHo|Mq_V!S0P zEpOmg&UWvM=DhOA{tOKQ?A0DR0DV`wwUXOhcrRi+pMuqD<<&~8!K{Kqm|Vm`_6v&~ z9)bq7^M`bj+RX9L94K-Q|5r1q=R9cw$M>$+E4C_D5Xp5+{45tFAz)yF++;fsoy7@ZAMGQjRr24y#c)lgaMV zS1-?=4KH7v6hMO!n^m-l+)7aX5obE&WJn zg;{1}%aUeajq(gx_oNIUq!t&muAZGttQiUyfwZNAdh9_oJ^U+kG{X1oX-MI)^F9ZipjI4q|jz?~kut!V*#<8*>y zDb3or7=5xfu9|y&3}t1D>RrIC8@0PZ-02)Fa+oA7UT0m(N%dtz$n}V{c3WQLG-4*G zr3G!fe(C0VCG_qX!Mx3vQnUBOX$l}xv7cNiiN9-%3>U&u2Dp>EcNP@;MO-~l@E(&x zo0SAOY)E0<*x#~D?Xkb$=?o2auRkNP-?P3Ik`(^mtZgh@} zXZ^gNTO!OQm*$vSz1&&sbTpdMQXL4f#+%o)2*veL05OGdU-aY_t1;HiiL@Z*b&}z` zl{}ht=Kj6JLyBD038w8ja&7)`IlybV#z>b(Ay)FSaSitqUK+3Sh*y$N2o{&Zg9=r8 zK}Zw9a~du_0vp;6yqWCR2Q-D0_?xC1=a%P=lKBTT+^z?7KMN?Ngv0eaoi^#b&|QUm zJp%hqNh3>oA8*$rl*9^m!K3V?TnSJl1!z=aV&Kt{tMybZQ8HQLaDx{iZ*4?W`s;(3 z&MLJIw=ozQfg%ZGVNHC+R9|$e3Wp_0>)C3&8Qz-2h@84`%Pg0w zqOmri<3cA2uc^|OwTU-e?uXkYZ-jXX$%+)BL%86uH%9*aqup2h4iskc88C$}Oz3Y& zLK6D7Qx(c=JN8tEB z%}ogkx&0~$#7tzxicQQ+pi(z0)YOAE#!7Q?bL%-y{D6>*XVJ0r;gcX-D?dNK!YuR( zVn8bAArEFigD&3!Fb)7BNe1U_fk-MFdcQpkKp@o&Npd~-D6$^n+bYoLidE^XEV(k&KbJ* zn9W#UL5wQY5k!L6i&oxn(ysS1^7A@z+cs@+O1)9MCnN#0G}mDNt(*bx;0Nd|+HBM^ z9?y-&=LOBFOT6?TW(O0|yg#Y*c?BbONA6AB*N)c#Yyl6{C#EKhlnc% zUIoiMGAVlCG?7itRX*RO%I(F7X_W3gx`pHcK*Itv<2;vD|48o#Kv;{h6Av7GF4PY; zCR8)h>|cDb;Gw8G!rtj92)Yi%KCVS6YOy})^3jaYCyz8{DJ8*LX*8%?jF;eO(b ziK3t@_wc!43bZ7<`S&RrU7RC@A0VJ*c)76#<^N{o0Y4L6Cefc!s_bJu{Y4d=9940Z zlB7I7zMFaJonapm4LjH9hg&?JCr&9uFE}n+NBwRwXnH$7()Y@vPm!jJ;7GHWu=*JN zbqpkeg74*_kdD7uk3eKnQWDr+tAm4Ck1IQ%aDi_A>+-z;iJ%sWcs`pF_BF#3cPrag zDeL-&Vn@9_JkO)9`_0FrPXYo1o3M~2U;~O(e``bh)nT#_z&VHY*)>O;S8NSeY0-;1 z-uD}taxr-PPFK$BFr!edBqi3WPB$$P)7Jl|aue4M~$}TvbLhMMSP&m2q+dLV9jGiN<7kCrdWDA9I|3Zf_)k#KY@#=H_ z^9=Z4|G=*+lmx{s(N(VhWvm!Qs{fzJ5A7dn4Y66ghF9(dMF8OIn4TBegSm9yTS(v9 zRO!74{5Gfg<&y3bTzKxxp<`mI5MfHdid;2#E*lf&%i{-P99ixToK($CTnqI{?Ufmv z(77g5$uQC^&C#e9(red(s!;WT zdK2u{=Sl<^N6|~5yu!A&Y*2UkiU_}f)B+bzOWRq<_eh-KB9L>}YBX_R`250FDw0az z$vQY)GpTDZB3AVw@+~W~ATZ zqG1>n55=?dANWPTj`3qs(U(aG4L7YmvH2_*x_Wr<&D;pVDxfuac{y6b$fM|V^z=(j zclOy=j)w!5O_A+IIn4ax0K=gLH+ zI}%8_?K3~!V@G`5DDjyAg!3OeWq;GJA!A5n0M&18q9*4Vlaum2z=!D}(JPCx^!OXc zaB#6qOTQbLyl?*@&B4`GaqfOeUt3jAKmqKgWMnD(Ph)3|^r0yNha>Hq-TVTh>o!2X zfRgb_G3Ao;X>|qjZ@qPJC$f|CZ!=1C@6w=DxE?cEPt|a=eRoyJr=2S(zaahcRu=_=xRYC8U)=pQrQDh)sV2$Q)D?;E8^An zsb&4@An}gdYvqb;<-Y}qdQSlI>bGs)gGgd|U}2h`>cp47j;{d8aT=X%BiA!nS?e0x z6kJ75TGBxb^{+sFXzNMi{k7tRyk5oY%*=p(`Om;9;=`3~ce5fF-)N|CpmmSPOS;HY z<$ur!o1Nj)a+)0dB@ZJFFj$)FeyW!m@sfv6$(TEpVS^UoC(5PUt7E^THn*q>tu1~; z?}dtSdkjR(yps|;vaGhA&6Vq9Y%pvI4O?8q4+9b7=lA_)&KA~jY~dyB}g_Zgh@zdt3eM} z(D*%s+~V{9#9qyV#8y7PxAxY4G~4CseuNU#m`7$zGg4zTHS+8JL2Il7y8z0?$pN`1 z+o$8LF`2?(lF*D$0Z2lfiEdX%NWFR1_n)K9mg&w>7i_Dp>T`r^=d{5XpR zZ&v(I^!RUMmvU!!;*|p41e^4;Iz27NQ?(O|USWwRj1^T`gk(S4M;F8A7PH&qsx(~P zHy`|TdYi=$YoHf9NP%`_RhXGxj)^_b-|rzFcn>oMrfNqsN9e_Z{HjCOOy;Ai90z}f4T=K z=)B5m(!Z@dXpMe&dpJ24oBJ~Qpx4EnqvI3&xKwmPLSn-~X1KwD!nF+6)d2AIU#}-a zWcy`g=MDoG-gt$F5dKf9p4>!Tr7mPZZYZx*zHH}hBr6D~-E7zy9|4=~0ZPE~UF52- z7bG@(J=ta-(u>sfNu%F-+<%fxjc5&D$!7w!0HYrMV4VCgDQSD`g0T-b2Ivt2G`<-b z8BFy61^u@F(d7h#i=C9)zeR?)t{C>V&jRJk%b<($hvRf;N7sw~)l0+f3-JZcemG3j zU{#9%cU~_|T3h@!*B{gXw-fw&=NuFJ7KdVqY6#YskClc9ZSr$`{(zWO_{%#itd=$* zk%pl5n4PiAUM>i&R8d_h&GRl0SdrbbeLZ{4>;7jd(NS=``8|K$--(KieF0xzJLzGW zCgLhz)!t9qLhZSK(3uWuMXWy%6xY|!{1yP3CN+qPSXF?G1Cp(Y;e=C+hD6Q25B$1P)>{kIQ3 zoITDXwk=J7c9;}S;9kC8V2wq>8&Tu-o13X3u-(BI6PCZbyAd&SWU z-)p}oT*-^jA4omux%v5q-vE?%WL#=EUp2t!W%3l0U#{5eB+jqoa^6--UM;<7y*{Nbx-7#v?5WEwtg8##+DE#QE<kb zbYK+Vl)UUry7?!_04aN9`W;!$^P536y4~jIMuFFrIXwzS-Ct$Duk9)UV8t`HG0-&; zudorZu_;M-835Yzc4%?Fv2A#-_W=CY7BNrAk!n_ z4ryK-+2iNt+ny@3#b^)rEQM(s`QnLj)sm}T%KDNjV7$aWz^=|t`){8aJq5oKaM-Dn z=TO~Z*w(qt#taDIl-XNkps<$o?1&%**NBkJJ&C6}`u95G3*mp&4mk1Ohhikw#v8B0ur^;_ zyZA;W59u8m=-E?EjdGo5prYhO2Kb6ESOkc2P^R-ExQHYD6_4S6xW0zm;x~%(zmV4% zbTyU)Z46`L2p-@9eA2@&DF5NKBQf6@OrYN2cwL@Sp-V@AZz)23Y!=C2K=7eY8;t?I z_iQu4<9D=d<{!NPxG*_oNVVP;fW>o+L=da-9AEk`zN5o8ai)__7tu1-Eo`^2M--ux z)kc4e(r=2!n&OeN>0bllK-0mqrc;DuoOtXgh!Z^l13qUvVA#?}&X|jhotYkTblF;* zW0id_6E3^E?A9|Nl`mxzo`(m{v_lVNP|(N7rKUv8cYd#_?7{@eT!vIlp_eOU2R@wc zSKn(lH3}hIUdep+OS-e#)=$gH>Df{AQbEP9b|v5}Ko+_XcG{p~)+r<*B+PAc$N}`p zs9}ACmig_WQwVueG`VcO+wRoq9eOW5)oU+aXC4CggYeO*KiFk8Gll}VHU+;s{x6jX z+Du6{LtYnAka!rEimH^1kJ%6%=wuaEU?H}Z75$Zv50#9JjI>}>KwO;hlfxe(|FD?8 zNG+lMP^A5+_oEdMsum6!FuC1U`TzF+MC-XyMn@|JS)E*)rshVnChbq9d)`xIR zA)aFG`TPKoPV~qjh(VQJfuaZa%NA5>ZoK>UGTU|wHvk67Qi~Gue}RlgNb2kB`)&7d z|D|1x_H|*?oMg$2-NS1zk%lt(F7L1meo+Md=r#>b=@F0vuyZM!0HRgJ~t`kc5 zEiTDVrVGkX7#8$~%MHZp_7w-N0U65PN?nA0MAE^ncU-wKGBRSnK5{3wpg_zsBRM&E zvse!BXKxD$;Vh;{{N+7RZ&cNqmfT)h!OpN091$Rb6YSX7a3A{n<55tAY1UZMaBvVh zfBP%~RL2im=z&;-!Y!MhK!5LYo2Cp2sAt2#`eQwG-4q#q^k`IrN~Zp)h;n&XdkKh+ zO^0NJU&>yBU5)Q|bVXxQJGlv3#LDB_GXvme-J;pjKMM!^gFZhpAz3#$h@2sm4wwLs zfD^yuXo4GI$gg3LM*13vOUlWG5o$28vk$xGbW$Ongra;SK*?+7<>pLR9$WJR=mjdt zU`|A9`JZq0{ff)&eaa2Q=K?2dtc(CEqEMqMzm#`p#ed_YYMWh}AX#I|GmZp=%C@8W zf$+8=peiVr0`VNtS;~)?+(2ItHKD{!0HYoQ$h9Twscw@Bny>_ym8~k?t8u+eIVjQ`p`0N8HHx&Hh2qKtJC{p z>5Twbf^&f>lDjWCUMj6rw=Kj>G`oRGDh2; zAzCN=U4G=spePSp@4?>FES*zbL8d#Q*R*=lDDs%5=rGatmz2Ttg=5+fN^W~$-bZ;o zOUi^~5$_3C5f`A3bVycG(Z)zw2W_}Q0Kz`=_)w8ypMj4tG+>X{wxpN=M9q?@-vXf> zPtDh0Tb|UJhSh@xyMr)L=8!=z+PI#AxSpKJTANUi%O(ECwL56f-WqNk#Wnawr*#5E zBIqg;w+Y>CI+CefQ8TNJ_ZLLi?lX}ZW}8Z${MThwUsZMWepY- ztE^YEhT@!nr?LLW(?BjN>6dY@ss>*IowwaKooyez*m9M#cK?VHa6uqEb3C>&E>BZrQg&-k6iUy+C z216CvNd{$eu!110x1C^b>WrP~jsos)F9_2>+@MGcn*a;Lgkt*RirtyF0H%xIrgK8? z@)ZS>Rxufvihf@W0fgbXhT(b(m@Wl!ho6ZEH35*MyTZ{~_x05f_QIfybn$k!L*pP3 zu(|v9lm!LYQ-hy6tS}q6QX73~P)8VrnoG!)0;Z*a74+JixPPTKq%ok5G=cGH2x~QH z#3392b ze%Zrk6mbb>VATXhT{)0O`JREU-Zblab>+8&kzH^zd&^Pqs}Lsu_zY5Y zKs&tE2Cr6#4&-+R0Ib{Wm{@J))+pQWF2`>;GF^!7eFt}sJd zIC=Zy#YWE%q~6={jAQYn!Q;?Y^^X;`8pnO4XuFHrhl-=TLwoEl$F)%zD>&F+alS^D z)JUDCXHa{4vkVcGQfmvjK`P#}%g*@odv0OS=}78>kFHD}I{j2I)oehD=Bt06 zzXrwvO`o0l%1=l6+JL$AFWUy+51@eYr||76{=bSNjK%*}k6+*{qxiwz)ywB!1OH?s L Date: Thu, 17 Nov 2022 10:40:21 +0800 Subject: [PATCH 25/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E5=9B=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/img/user.png | Bin 0 -> 56140 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/img/user.png diff --git a/doc/img/user.png b/doc/img/user.png new file mode 100644 index 0000000000000000000000000000000000000000..f80a9483e138ff6c814267801ef24fd0a34487b2 GIT binary patch literal 56140 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

tv}qm?EcV`)CD#qJd9o}IACMN3A`J1mBoHM2Lv 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 Date: Thu, 17 Nov 2022 10:42:05 +0800 Subject: [PATCH 26/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E5=9B=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/img/user.png | Bin 56140 -> 58230 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/img/user.png b/doc/img/user.png index f80a9483e138ff6c814267801ef24fd0a34487b2..4f90486a4e5f04da869b23292e94702a30f7b61a 100644 GIT binary patch delta 34931 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 D#Dwvv -- Gitee From dd46ecf792b6639e43e6d8158335198e8d9788b1 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 17 Nov 2022 10:48:44 +0800 Subject: [PATCH 27/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E5=9B=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index c76d9dc..3af892e 100644 --- a/README.md +++ b/README.md @@ -22,3 +22,12 @@ | sys_api | 接口表 | | sys_user_role | 用户角色绑定表 | | sys_role_menu | 角色菜单绑定表 | + +## 模型 + +![avater](https://gitee.com/digital-engine/spring-domain-example/raw/3.0.0/doc/img/model.png) + +## 用户 + +![avater](https://gitee.com/digital-engine/spring-domain-example/raw/3.0.0/doc/img/user.png) + -- Gitee From 4e603b9f0ac93149d87041f7899ec98d6259d9dd Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Fri, 18 Nov 2022 23:22:27 +0800 Subject: [PATCH 28/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E6=9E=84=E5=BB=BA=E5=99=A8=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/domain/example/entity/User.java | 2 +- .../spring/domain/example/test/QueryTest.java | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/gitee/spring/domain/example/test/QueryTest.java diff --git a/src/main/java/com/gitee/spring/domain/example/entity/User.java b/src/main/java/com/gitee/spring/domain/example/entity/User.java index 20f9518..1adc8b2 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/User.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/User.java @@ -39,7 +39,7 @@ public class User { private List userRoles; // 角色实体 - @Entity(matchKeys = "user.roles", repository = RoleRepository.class) + @Entity(matchKeys = "user.roles", builderKey = "user.roles.builder", repository = RoleRepository.class) @Binding(field = "id", bindProp = "./userRoles", property = "roleId") private List roles; } diff --git a/src/test/java/com/gitee/spring/domain/example/test/QueryTest.java b/src/test/java/com/gitee/spring/domain/example/test/QueryTest.java new file mode 100644 index 0000000..c52217b --- /dev/null +++ b/src/test/java/com/gitee/spring/domain/example/test/QueryTest.java @@ -0,0 +1,38 @@ +package com.gitee.spring.domain.example.test; + +import cn.hutool.json.JSONUtil; +import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.spring.domain.example.entity.User; +import com.gitee.spring.domain.example.repository.UserRepository; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +@Slf4j +@SpringBootTest +@DisplayName("查询测试") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class QueryTest { + + @Autowired + private UserRepository userRepository; + + @Test + @Order(1) + @DisplayName("条件构建器测试") + public void test01() { + BoundedContext boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); + boundedContext.putBuilder("user.roles.builder", (context, root, example) -> example.eq("status", 0)); + Example example = new Example().eq("userCode", "000001"); + List users = userRepository.selectByExample(boundedContext, example); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(users))); + assumeTrue(!users.isEmpty()); + } + +} -- Gitee From 2c52dd94b002f109b62fb00f052db95cc966aafa Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 22 Nov 2022 10:52:00 +0800 Subject: [PATCH 29/42] =?UTF-8?q?=E3=80=90=E4=BC=98=E5=8C=96=E3=80=91?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/impl/listener/TenantListener.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java b/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java index 32897b6..799adfb 100644 --- a/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java +++ b/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java @@ -1,8 +1,10 @@ package com.gitee.spring.domain.example.impl.listener; +import com.gitee.spring.domain.core.entity.operation.Operation; +import com.gitee.spring.domain.core.entity.operation.Update; import com.gitee.spring.domain.event.annotation.Listener; import com.gitee.spring.domain.event.api.EntityListener; -import com.gitee.spring.domain.event.listener.RepositoryEvent; +import com.gitee.spring.domain.event.entity.RepositoryEvent; import com.gitee.spring.domain.example.entity.Tenant; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -16,10 +18,13 @@ public class TenantListener implements EntityListener { @Override public void onApplicationEvent(RepositoryEvent repositoryEvent) { - Object entity = repositoryEvent.getCondition().getEntity(); - if (entity instanceof Tenant) { - updateCount = updateCount + 1; - log.info("update success"); + Operation operation = repositoryEvent.getOperation(); + Object entity = operation.getEntity(); + if (operation instanceof Update) { + if (entity instanceof Tenant) { + updateCount = updateCount + 1; + log.info("update success"); + } } } -- Gitee From 84875068dccc8fef05c09e7474eb330738607330 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 23 Nov 2022 12:26:10 +0800 Subject: [PATCH 30/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E6=80=A7=E8=83=BD=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/domain/example/test/ProxyTest.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/test/java/com/gitee/spring/domain/example/test/ProxyTest.java diff --git a/src/test/java/com/gitee/spring/domain/example/test/ProxyTest.java b/src/test/java/com/gitee/spring/domain/example/test/ProxyTest.java new file mode 100644 index 0000000..a219c86 --- /dev/null +++ b/src/test/java/com/gitee/spring/domain/example/test/ProxyTest.java @@ -0,0 +1,72 @@ +package com.gitee.spring.domain.example.test; + +import cn.hutool.core.util.ReflectUtil; +import com.gitee.spring.domain.core.api.PropertyProxy; +import com.gitee.spring.domain.core.impl.PropertyProxyFactory; +import com.gitee.spring.domain.example.entity.Department; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.boot.test.context.SpringBootTest; + +import java.lang.reflect.Field; + +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +@Slf4j +@SpringBootTest +@DisplayName("代理测试") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class ProxyTest { + + @Test + @Order(1) + @DisplayName("性能测试") + public void test01() throws Exception { + PropertyProxy propertyProxy = PropertyProxyFactory.newPropertyProxy(Department.class, Integer.class, "id"); + Field field = Department.class.getDeclaredField("id"); + + Department department = new Department(); + department.setId(100); + + int count = 0; + long startTime = System.nanoTime(); + for (int index = 0; index < 1000000; index++) { + Integer id = department.getId(); + if (id == 100) { + count++; + } + } + long elapsedTime = System.nanoTime() - startTime; + log.info("End of execution. count: {}, elapsed time: {}, mode: {}", count, elapsedTime, "getter"); + assumeTrue(count == 1000000); + + count = 0; + startTime = System.nanoTime(); + for (int index = 0; index < 1000000; index++) { + Integer id = (Integer) ReflectUtil.getFieldValue(department, field); + if (id == 100) { + count++; + } + } + elapsedTime = System.nanoTime() - startTime; + log.info("End of execution. count: {}, elapsed time: {}, mode: {}", count, elapsedTime, "reflect"); + assumeTrue(count == 1000000); + + count = 0; + startTime = System.nanoTime(); + for (int index = 0; index < 1000000; index++) { + Integer id = (Integer) propertyProxy.getValue(department); + if (id == 100) { + count++; + } + } + elapsedTime = System.nanoTime() - startTime; + log.info("End of execution. count: {}, elapsed time: {}, mode: {}", count, elapsedTime, "proxy"); + assumeTrue(count == 1000000); + } + +} -- Gitee From 2e046f815820aba4c5f6b35d2ca2e426fe5e4935 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 23 Nov 2022 17:12:20 +0800 Subject: [PATCH 31/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/domain/example/entity/Tenant.java | 2 +- .../domain/example/test/InsertTest.java | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/gitee/spring/domain/example/test/InsertTest.java diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java index 166f7a7..c065c5b 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java @@ -14,7 +14,7 @@ import java.util.Date; import java.util.List; @Data -@Entity(mapper = SysTenantMapper.class) +@Entity(mapper = SysTenantMapper.class, commandKey = "tenant.command") public class Tenant { // 主键 private Integer id; diff --git a/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java b/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java new file mode 100644 index 0000000..aeac200 --- /dev/null +++ b/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java @@ -0,0 +1,50 @@ +package com.gitee.spring.domain.example.test; + +import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.core.entity.Command; +import com.gitee.spring.domain.example.entity.Tenant; +import com.gitee.spring.domain.example.repository.TenantRepository; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Date; + +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +@Slf4j +@SpringBootTest +@DisplayName("新增测试") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class InsertTest { + + @Autowired + private TenantRepository tenantRepository; + + @Test + @Order(1) + @DisplayName("强制忽略测试") + public void test01() { + BoundedContext boundedContext = new BoundedContext(); + + Command command = new Command(); + command.setForceIgnore(true); + boundedContext.put("tenant.command", command); + + Tenant tenant = new Tenant(); + tenant.setTenantCode("tenant1"); + tenant.setTenantName("租户1"); + tenant.setStatus(0); + tenant.setCreateUser("admin"); + tenant.setCreateTime(new Date()); + + int count = tenantRepository.insert(boundedContext, tenant); + assumeTrue(count == 0); + } + +} -- Gitee From 5f3529fa768448f276b1b5f4cd661785212b466a Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 24 Nov 2022 15:12:19 +0800 Subject: [PATCH 32/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/example/dal/pojo/SysTenant.java | 2 +- .../domain/example/test/InsertTest.java | 55 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java index 9f1096e..9c2f0a4 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java @@ -22,7 +22,7 @@ import java.util.Date; @TableName(value = "sys_tenant") public class SysTenant { // 主键 - @TableId(value = "id", type = IdType.AUTO) + @TableId(value = "id", type = IdType.INPUT) private Integer id; // 租户编码 diff --git a/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java b/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java index aeac200..3144114 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java +++ b/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java @@ -2,6 +2,7 @@ package com.gitee.spring.domain.example.test; import com.gitee.spring.domain.core.entity.BoundedContext; import com.gitee.spring.domain.core.entity.Command; +import com.gitee.spring.domain.core.entity.executor.Example; import com.gitee.spring.domain.example.entity.Tenant; import com.gitee.spring.domain.example.repository.TenantRepository; import lombok.extern.slf4j.Slf4j; @@ -14,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.Date; +import java.util.List; import static org.junit.jupiter.api.Assumptions.assumeTrue; @@ -26,6 +28,30 @@ public class InsertTest { @Autowired private TenantRepository tenantRepository; + @Test + @Order(0) + @DisplayName("插入测试") + public void test00() { + BoundedContext boundedContext = new BoundedContext(); + + int lastId = 0; + List tenants = tenantRepository.selectByExample(boundedContext, new Example().orderByDesc("id").startPage()); + if (!tenants.isEmpty()) { + lastId = tenants.get(0).getId(); + } + int id = lastId + 1; + + Tenant tenant = new Tenant(); + tenant.setTenantCode("tenant" + id); + tenant.setTenantName("租户" + id); + tenant.setStatus(0); + tenant.setCreateUser("admin"); + tenant.setCreateTime(new Date()); + + int count = tenantRepository.insert(boundedContext, tenant); + assumeTrue(count == 1); + } + @Test @Order(1) @DisplayName("强制忽略测试") @@ -47,4 +73,33 @@ public class InsertTest { assumeTrue(count == 0); } + @Test + @Order(2) + @DisplayName("强制插入测试") + public void test02() { + BoundedContext boundedContext = new BoundedContext(); + + int lastId = 0; + List tenants = tenantRepository.selectByExample(boundedContext, new Example().orderByDesc("id").startPage()); + if (!tenants.isEmpty()) { + lastId = tenants.get(0).getId(); + } + int id = lastId + 1; + + Command command = new Command(); + command.setForceInsert(true); + boundedContext.put("tenant.command", command); + + Tenant tenant = new Tenant(); + tenant.setId(id); + tenant.setTenantCode("tenant" + id); + tenant.setTenantName("租户" + id); + tenant.setStatus(0); + tenant.setCreateUser("admin"); + tenant.setCreateTime(new Date()); + + int count = tenantRepository.insertOrUpdate(boundedContext, tenant); + assumeTrue(count == 1); + } + } -- Gitee From 85fc2f27b3f73487288dd7148a0fab1a510a8eab Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 24 Nov 2022 15:13:17 +0800 Subject: [PATCH 33/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/spring/domain/example/test/InsertTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java b/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java index 3144114..769afa1 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java +++ b/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java @@ -79,6 +79,10 @@ public class InsertTest { public void test02() { BoundedContext boundedContext = new BoundedContext(); + Command command = new Command(); + command.setForceInsert(true); + boundedContext.put("tenant.command", command); + int lastId = 0; List tenants = tenantRepository.selectByExample(boundedContext, new Example().orderByDesc("id").startPage()); if (!tenants.isEmpty()) { @@ -86,10 +90,6 @@ public class InsertTest { } int id = lastId + 1; - Command command = new Command(); - command.setForceInsert(true); - boundedContext.put("tenant.command", command); - Tenant tenant = new Tenant(); tenant.setId(id); tenant.setTenantCode("tenant" + id); -- Gitee From be1a59c8f54f2a950d5724a5f862706836dd0b1b Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 24 Nov 2022 16:00:25 +0800 Subject: [PATCH 34/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/example/dal/pojo/SysTenant.java | 2 +- .../domain/example/entity/Department.java | 5 + .../domain/example/test/InsertTest.java | 101 ++++++++++++++++-- 3 files changed, 101 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java index 9c2f0a4..9f1096e 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java +++ b/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java @@ -22,7 +22,7 @@ import java.util.Date; @TableName(value = "sys_tenant") public class SysTenant { // 主键 - @TableId(value = "id", type = IdType.INPUT) + @TableId(value = "id", type = IdType.AUTO) private Integer id; // 租户编码 diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Department.java b/src/main/java/com/gitee/spring/domain/example/entity/Department.java index ea0a1d5..d8882d7 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Department.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Department.java @@ -4,6 +4,7 @@ import com.gitee.spring.domain.core.annotation.Binding; import com.gitee.spring.domain.core.annotation.Bindings; import com.gitee.spring.domain.core.annotation.Entity; import com.gitee.spring.domain.example.dal.mapper.SysDeptMapper; +import com.gitee.spring.domain.example.dal.mapper.SysTenantMapper; import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; import lombok.Data; @@ -17,6 +18,10 @@ public class Department { private Integer id; // 租户id private Integer tenantId; + // 租户实体 + @Entity(matchKeys = "dept.tenant", mapper = SysTenantMapper.class) + @Binding(field = "id", bindProp = "./tenantId") + private Tenant tenant; // 父节点id private Integer superId; // 部门编码 diff --git a/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java b/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java index 769afa1..e436589 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java +++ b/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java @@ -3,7 +3,9 @@ package com.gitee.spring.domain.example.test; import com.gitee.spring.domain.core.entity.BoundedContext; import com.gitee.spring.domain.core.entity.Command; import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.spring.domain.example.entity.Department; import com.gitee.spring.domain.example.entity.Tenant; +import com.gitee.spring.domain.example.repository.DepartmentRepository; import com.gitee.spring.domain.example.repository.TenantRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; @@ -14,6 +16,7 @@ import org.junit.jupiter.api.TestMethodOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.util.Collections; import java.util.Date; import java.util.List; @@ -27,11 +30,13 @@ public class InsertTest { @Autowired private TenantRepository tenantRepository; + @Autowired + private DepartmentRepository departmentRepository; @Test - @Order(0) + @Order(1) @DisplayName("插入测试") - public void test00() { + public void test01() { BoundedContext boundedContext = new BoundedContext(); int lastId = 0; @@ -53,9 +58,9 @@ public class InsertTest { } @Test - @Order(1) + @Order(2) @DisplayName("强制忽略测试") - public void test01() { + public void test02() { BoundedContext boundedContext = new BoundedContext(); Command command = new Command(); @@ -74,9 +79,9 @@ public class InsertTest { } @Test - @Order(2) + @Order(3) @DisplayName("强制插入测试") - public void test02() { + public void test03() { BoundedContext boundedContext = new BoundedContext(); Command command = new Command(); @@ -102,4 +107,88 @@ public class InsertTest { assumeTrue(count == 1); } + @Test + @Order(4) + @DisplayName("绑定插入测试") + public void test04() { + BoundedContext boundedContext = new BoundedContext(); + + int lastId = 0; + List tenants = tenantRepository.selectByExample(boundedContext, new Example().orderByDesc("id").startPage()); + if (!tenants.isEmpty()) { + lastId = tenants.get(0).getId(); + } + int id = lastId + 1; + + int lastDeptId = 0; + List departments = departmentRepository.selectByExample(boundedContext, new Example().orderByDesc("id").startPage()); + if (!departments.isEmpty()) { + lastDeptId = departments.get(0).getId(); + } + int deptId = lastDeptId + 1; + + boundedContext = new BoundedContext("tenant.depts"); + + Tenant tenant = new Tenant(); + tenant.setTenantCode("tenant" + id); + tenant.setTenantName("租户" + id); + tenant.setStatus(0); + tenant.setCreateUser("admin"); + tenant.setCreateTime(new Date()); + + Department department = new Department(); + department.setSuperId(null); + department.setDeptCode("dept" + deptId); + department.setDeptName("部门" + deptId); + department.setCreateUser("admin"); + department.setCreateTime(new Date()); + tenant.setDepartments(Collections.singletonList(department)); + + int count = tenantRepository.insertOrUpdate(boundedContext, tenant); + assumeTrue(department.getTenantId() != null); + assumeTrue(count == 2); + } + + @Test + @Order(5) + @DisplayName("绑定id插入测试") + public void test05() { + BoundedContext boundedContext = new BoundedContext(); + + int lastId = 0; + List tenants = tenantRepository.selectByExample(boundedContext, new Example().orderByDesc("id").startPage()); + if (!tenants.isEmpty()) { + lastId = tenants.get(0).getId(); + } + int id = lastId + 1; + + int lastDeptId = 0; + List departments = departmentRepository.selectByExample(boundedContext, new Example().orderByDesc("id").startPage()); + if (!departments.isEmpty()) { + lastDeptId = departments.get(0).getId(); + } + int deptId = lastDeptId + 1; + + boundedContext = new BoundedContext("dept.tenant"); + + Department department = new Department(); + department.setSuperId(null); + department.setDeptCode("dept" + deptId); + department.setDeptName("部门" + deptId); + department.setCreateUser("admin"); + department.setCreateTime(new Date()); + + Tenant tenant = new Tenant(); + tenant.setTenantCode("tenant" + id); + tenant.setTenantName("租户" + id); + tenant.setStatus(0); + tenant.setCreateUser("admin"); + tenant.setCreateTime(new Date()); + department.setTenant(tenant); + + int count = departmentRepository.insertOrUpdate(boundedContext, department); + assumeTrue(department.getTenantId() != null); + assumeTrue(count == 2); + } + } -- Gitee From 201255b7f887165147271786a25f7364b197cc09 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 24 Nov 2022 16:08:26 +0800 Subject: [PATCH 35/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/example/impl/listener/TenantListener.java | 11 +++++++++-- .../gitee/spring/domain/example/test/InsertTest.java | 5 +++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java b/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java index 799adfb..3416eb4 100644 --- a/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java +++ b/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java @@ -1,5 +1,6 @@ package com.gitee.spring.domain.example.impl.listener; +import com.gitee.spring.domain.core.entity.operation.Insert; import com.gitee.spring.domain.core.entity.operation.Operation; import com.gitee.spring.domain.core.entity.operation.Update; import com.gitee.spring.domain.event.annotation.Listener; @@ -14,16 +15,22 @@ import org.springframework.stereotype.Component; @Listener(Tenant.class) public class TenantListener implements EntityListener { + public static int insertCount = 0; public static int updateCount = 0; @Override public void onApplicationEvent(RepositoryEvent repositoryEvent) { Operation operation = repositoryEvent.getOperation(); Object entity = operation.getEntity(); - if (operation instanceof Update) { + if (operation instanceof Insert) { + if (entity instanceof Tenant) { + insertCount = insertCount + 1; + log.info("Insert success!"); + } + } else if (operation instanceof Update) { if (entity instanceof Tenant) { updateCount = updateCount + 1; - log.info("update success"); + log.info("Update success!"); } } } diff --git a/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java b/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java index e436589..a958564 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java +++ b/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java @@ -5,6 +5,7 @@ import com.gitee.spring.domain.core.entity.Command; import com.gitee.spring.domain.core.entity.executor.Example; import com.gitee.spring.domain.example.entity.Department; import com.gitee.spring.domain.example.entity.Tenant; +import com.gitee.spring.domain.example.impl.listener.TenantListener; import com.gitee.spring.domain.example.repository.DepartmentRepository; import com.gitee.spring.domain.example.repository.TenantRepository; import lombok.extern.slf4j.Slf4j; @@ -103,7 +104,11 @@ public class InsertTest { tenant.setCreateUser("admin"); tenant.setCreateTime(new Date()); + int lastInsertCount = TenantListener.insertCount; int count = tenantRepository.insertOrUpdate(boundedContext, tenant); + int insertCount = TenantListener.insertCount; + + assumeTrue(lastInsertCount + 1 == insertCount); assumeTrue(count == 1); } -- Gitee From 4adb56dfd12c1bc671ef809fcd34357e41a1eccf Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 24 Nov 2022 16:28:34 +0800 Subject: [PATCH 36/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/impl/service/DataService.java | 30 +++++++++---------- .../spring/domain/example/test/CRUDTest.java | 4 +-- .../spring/domain/example/test/EventTest.java | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java b/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java index e7a31a9..b74c99b 100644 --- a/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java +++ b/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java @@ -39,8 +39,8 @@ public class DataService { public void newTenant() { Tenant tenant = new Tenant(); - tenant.setTenantCode("tenant"); - tenant.setTenantName("租户"); + tenant.setTenantCode("tenant1"); + tenant.setTenantName("租户1"); tenant.setStatus(0); tenant.setCreateUser("admin"); tenant.setCreateTime(new Date()); @@ -49,8 +49,8 @@ public class DataService { for (int index = 0; index < 10; index++) { Department department = new Department(); department.setSuperId(null); - department.setDeptCode("dept" + index); - department.setDeptName("部门" + index); + department.setDeptCode("dept" + (index + 1)); + department.setDeptName("部门" + (index + 1)); department.setCreateUser("admin"); department.setCreateTime(new Date()); departments.add(department); @@ -61,8 +61,8 @@ public class DataService { for (int index = 0; index < 10; index++) { RoleGroup roleGroup = new RoleGroup(); roleGroup.setSuperId(null); - roleGroup.setGroupCode("group" + index); - roleGroup.setGroupName("角色组" + index); + roleGroup.setGroupCode("group" + (index + 1)); + roleGroup.setGroupName("角色组" + (index + 1)); roleGroup.setCreateUser("admin"); roleGroup.setCreateTime(new Date()); roleGroups.add(roleGroup); @@ -79,8 +79,8 @@ public class DataService { User user = new User(); Department department = departments.get(RandomUtil.randomInt(0, 10)); user.setDeptId(department.getId()); - user.setUserCode(StrUtil.fillBefore(String.valueOf(index), '0', 6)); - user.setUserName("用户" + index); + user.setUserCode(StrUtil.fillBefore(String.valueOf((index + 1)), '0', 6)); + user.setUserName("用户" + (index + 1)); user.setIsAdmin(index == adminIndex ? 1 : 0); user.setStatus(0); user.setCreateUser("admin"); @@ -94,8 +94,8 @@ public class DataService { Role role = new Role(); RoleGroup roleGroup = roleGroups.get(RandomUtil.randomInt(0, 10)); role.setGroupId(roleGroup.getId()); - role.setRoleCode("role" + index); - role.setRoleName("角色" + index); + role.setRoleCode("role" + (index + 1)); + role.setRoleName("角色" + (index + 1)); role.setStatus(0); role.setCreateUser("admin"); role.setCreateTime(new Date()); @@ -113,16 +113,16 @@ public class DataService { for (int index = 0; index < 10; index++) { Menu menu = new Menu(); menu.setSuperId(null); - menu.setMenuCode("menu" + index); - menu.setMenuName("菜单" + index); + menu.setMenuCode("menu" + (index + 1)); + menu.setMenuName("菜单" + (index + 1)); menu.setMenuType("nav"); menu.setCreateUser("admin"); menu.setCreateTime(new Date()); Api api = new Api(); - api.setApiCode("api" + index); - api.setApiName("接口" + index); - api.setApiUrl("/api" + index); + api.setApiCode("api" + (index + 1)); + api.setApiName("接口" + (index + 1)); + api.setApiUrl("/api" + (index + 1)); api.setCreateUser("admin"); api.setCreateTime(new Date()); menu.setApis(Collections.singletonList(api)); diff --git a/src/test/java/com/gitee/spring/domain/example/test/CRUDTest.java b/src/test/java/com/gitee/spring/domain/example/test/CRUDTest.java index fec0aee..b129701 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/CRUDTest.java +++ b/src/test/java/com/gitee/spring/domain/example/test/CRUDTest.java @@ -43,7 +43,7 @@ public class CRUDTest { @DisplayName("查询测试") public void test02() { BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "tenant.users", "tenant.roles"); - Example example = new Example().eq("tenantCode", "tenant"); + Example example = new Example().eq("tenantCode", "tenant1"); List tenants = tenantRepository.selectByExample(boundedContext, example); log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenants))); assumeTrue(!tenants.isEmpty()); @@ -60,7 +60,7 @@ public class CRUDTest { @DisplayName("更新测试") public void test03() { BoundedContext boundedContext = new BoundedContext(); - Example example = new Example().eq("tenantCode", "tenant"); + Example example = new Example().eq("tenantCode", "tenant1"); List tenants = tenantRepository.selectByExample(boundedContext, example); Tenant tenant = tenants.get(0); log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenant))); diff --git a/src/test/java/com/gitee/spring/domain/example/test/EventTest.java b/src/test/java/com/gitee/spring/domain/example/test/EventTest.java index 4f4e7dc..8fd5ffe 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/EventTest.java +++ b/src/test/java/com/gitee/spring/domain/example/test/EventTest.java @@ -33,7 +33,7 @@ public class EventTest { @DisplayName("更新测试") public void test01() { BoundedContext boundedContext = new BoundedContext(); - Example example = new Example().eq("tenantCode", "tenant").startPage(); + Example example = new Example().eq("tenantCode", "tenant1").startPage(); List tenants = tenantRepository.selectByExample(boundedContext, example); Tenant tenant = tenants.get(0); log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenant))); -- Gitee From bbcf8b92644e25932078a37d0fbb899b316aa976 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 24 Nov 2022 16:56:14 +0800 Subject: [PATCH 37/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/{test => common}/BinderTest.java | 2 +- .../example/{test => common}/CoatingTest.java | 2 +- .../example/{test => common}/EventTest.java | 2 +- .../{test => common}/OverrideTest.java | 2 +- .../example/{test => common}/ProxyTest.java | 2 +- .../example/{test => crud}/CRUDTest.java | 30 +------- .../example/{test => crud}/InsertTest.java | 2 +- .../example/{test => crud}/QueryTest.java | 2 +- .../domain/example/crud/UpdateTest.java | 77 +++++++++++++++++++ 9 files changed, 85 insertions(+), 36 deletions(-) rename src/test/java/com/gitee/spring/domain/example/{test => common}/BinderTest.java (97%) rename src/test/java/com/gitee/spring/domain/example/{test => common}/CoatingTest.java (97%) rename src/test/java/com/gitee/spring/domain/example/{test => common}/EventTest.java (97%) rename src/test/java/com/gitee/spring/domain/example/{test => common}/OverrideTest.java (96%) rename src/test/java/com/gitee/spring/domain/example/{test => common}/ProxyTest.java (98%) rename src/test/java/com/gitee/spring/domain/example/{test => crud}/CRUDTest.java (71%) rename src/test/java/com/gitee/spring/domain/example/{test => crud}/InsertTest.java (99%) rename src/test/java/com/gitee/spring/domain/example/{test => crud}/QueryTest.java (96%) create mode 100644 src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java diff --git a/src/test/java/com/gitee/spring/domain/example/test/BinderTest.java b/src/test/java/com/gitee/spring/domain/example/common/BinderTest.java similarity index 97% rename from src/test/java/com/gitee/spring/domain/example/test/BinderTest.java rename to src/test/java/com/gitee/spring/domain/example/common/BinderTest.java index 36a54c6..1d8c898 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/BinderTest.java +++ b/src/test/java/com/gitee/spring/domain/example/common/BinderTest.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.test; +package com.gitee.spring.domain.example.common; import com.gitee.spring.domain.core.api.Binder; import com.gitee.spring.domain.core.impl.binder.ContextBinder; diff --git a/src/test/java/com/gitee/spring/domain/example/test/CoatingTest.java b/src/test/java/com/gitee/spring/domain/example/common/CoatingTest.java similarity index 97% rename from src/test/java/com/gitee/spring/domain/example/test/CoatingTest.java rename to src/test/java/com/gitee/spring/domain/example/common/CoatingTest.java index 42b4f88..1c3e6a8 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/CoatingTest.java +++ b/src/test/java/com/gitee/spring/domain/example/common/CoatingTest.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.test; +package com.gitee.spring.domain.example.common; import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core.entity.BoundedContext; diff --git a/src/test/java/com/gitee/spring/domain/example/test/EventTest.java b/src/test/java/com/gitee/spring/domain/example/common/EventTest.java similarity index 97% rename from src/test/java/com/gitee/spring/domain/example/test/EventTest.java rename to src/test/java/com/gitee/spring/domain/example/common/EventTest.java index 8fd5ffe..a020aee 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/EventTest.java +++ b/src/test/java/com/gitee/spring/domain/example/common/EventTest.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.test; +package com.gitee.spring.domain.example.common; import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core.entity.BoundedContext; diff --git a/src/test/java/com/gitee/spring/domain/example/test/OverrideTest.java b/src/test/java/com/gitee/spring/domain/example/common/OverrideTest.java similarity index 96% rename from src/test/java/com/gitee/spring/domain/example/test/OverrideTest.java rename to src/test/java/com/gitee/spring/domain/example/common/OverrideTest.java index d0b4e36..320a126 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/OverrideTest.java +++ b/src/test/java/com/gitee/spring/domain/example/common/OverrideTest.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.test; +package com.gitee.spring.domain.example.common; import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core.entity.BoundedContext; diff --git a/src/test/java/com/gitee/spring/domain/example/test/ProxyTest.java b/src/test/java/com/gitee/spring/domain/example/common/ProxyTest.java similarity index 98% rename from src/test/java/com/gitee/spring/domain/example/test/ProxyTest.java rename to src/test/java/com/gitee/spring/domain/example/common/ProxyTest.java index a219c86..3a0d17c 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/ProxyTest.java +++ b/src/test/java/com/gitee/spring/domain/example/common/ProxyTest.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.test; +package com.gitee.spring.domain.example.common; import cn.hutool.core.util.ReflectUtil; import com.gitee.spring.domain.core.api.PropertyProxy; diff --git a/src/test/java/com/gitee/spring/domain/example/test/CRUDTest.java b/src/test/java/com/gitee/spring/domain/example/crud/CRUDTest.java similarity index 71% rename from src/test/java/com/gitee/spring/domain/example/test/CRUDTest.java rename to src/test/java/com/gitee/spring/domain/example/crud/CRUDTest.java index b129701..d2ac44d 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/CRUDTest.java +++ b/src/test/java/com/gitee/spring/domain/example/crud/CRUDTest.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.test; +package com.gitee.spring.domain.example.crud; import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core.entity.BoundedContext; @@ -31,13 +31,6 @@ public class CRUDTest { @Autowired private UserRepository userRepository; - @Test - @Order(1) - @DisplayName("新增测试") - public void test01() { - - } - @Test @Order(2) @DisplayName("查询测试") @@ -55,25 +48,4 @@ public class CRUDTest { assumeTrue(!users.isEmpty()); } - @Test - @Order(3) - @DisplayName("更新测试") - public void test03() { - BoundedContext boundedContext = new BoundedContext(); - Example example = new Example().eq("tenantCode", "tenant1"); - List tenants = tenantRepository.selectByExample(boundedContext, example); - Tenant tenant = tenants.get(0); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenant))); - tenant.setStatus(1); - int count = tenantRepository.update(boundedContext, tenant); - assumeTrue(count == 1); - } - - @Test - @Order(4) - @DisplayName("删除测试") - public void test04() { - - } - } diff --git a/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java b/src/test/java/com/gitee/spring/domain/example/crud/InsertTest.java similarity index 99% rename from src/test/java/com/gitee/spring/domain/example/test/InsertTest.java rename to src/test/java/com/gitee/spring/domain/example/crud/InsertTest.java index a958564..af27b7b 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/InsertTest.java +++ b/src/test/java/com/gitee/spring/domain/example/crud/InsertTest.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.test; +package com.gitee.spring.domain.example.crud; import com.gitee.spring.domain.core.entity.BoundedContext; import com.gitee.spring.domain.core.entity.Command; diff --git a/src/test/java/com/gitee/spring/domain/example/test/QueryTest.java b/src/test/java/com/gitee/spring/domain/example/crud/QueryTest.java similarity index 96% rename from src/test/java/com/gitee/spring/domain/example/test/QueryTest.java rename to src/test/java/com/gitee/spring/domain/example/crud/QueryTest.java index c52217b..bf21ef2 100644 --- a/src/test/java/com/gitee/spring/domain/example/test/QueryTest.java +++ b/src/test/java/com/gitee/spring/domain/example/crud/QueryTest.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.test; +package com.gitee.spring.domain.example.crud; import cn.hutool.json.JSONUtil; import com.gitee.spring.domain.core.entity.BoundedContext; diff --git a/src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java b/src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java new file mode 100644 index 0000000..c199340 --- /dev/null +++ b/src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java @@ -0,0 +1,77 @@ +package com.gitee.spring.domain.example.crud; + +import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.core.entity.Command; +import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.spring.domain.example.entity.Tenant; +import com.gitee.spring.domain.example.repository.TenantRepository; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Collections; +import java.util.List; + +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +@Slf4j +@SpringBootTest +@DisplayName("修改测试") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class UpdateTest { + + @Autowired + private TenantRepository tenantRepository; + + @Test + @Order(1) + @DisplayName("更新测试") + public void test01() { + BoundedContext boundedContext = new BoundedContext(); + Example example = new Example().eq("tenantCode", "tenant1"); + List tenants = tenantRepository.selectByExample(boundedContext, example); + Tenant tenant = tenants.get(0); + + Integer lastStatus = tenant.getStatus(); + if (lastStatus == 0) { + tenant.setStatus(1); + + } else if (lastStatus == 1) { + tenant.setStatus(0); + } + + int count = tenantRepository.update(boundedContext, tenant); + assumeTrue(count == 1); + + Tenant updatedTenant = tenantRepository.selectByPrimaryKey(boundedContext, tenant.getId()); + assumeTrue(tenant.getStatus().equals(updatedTenant.getStatus())); + } + + @Test + @Order(2) + @DisplayName("强制赋空测试") + public void test02() { + BoundedContext boundedContext = new BoundedContext(); + Example example = new Example().eq("tenantCode", "tenant1"); + List tenants = tenantRepository.selectByExample(boundedContext, example); + Tenant tenant = tenants.get(0); + + Command command = new Command(); + command.setNullableProperties(Collections.singleton("createUser")); + boundedContext.put("tenant.command", command); + + tenant.setCreateUser(null); + + int count = tenantRepository.update(boundedContext, tenant); + assumeTrue(count == 1); + + Tenant updatedTenant = tenantRepository.selectByPrimaryKey(boundedContext, tenant.getId()); + assumeTrue(updatedTenant.getCreateUser() == null); + } + +} -- Gitee From 7b1e26dad4bbc7b231f3789bca9179ae77ffb4f3 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 24 Nov 2022 17:27:03 +0800 Subject: [PATCH 38/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/domain/example/entity/User.java | 2 +- .../example/impl/service/DataService.java | 4 +- .../crud/{InsertTest.java => CreateTest.java} | 2 +- .../spring/domain/example/crud/QueryTest.java | 38 ------------- .../crud/{CRUDTest.java => ReadTest.java} | 55 +++++++++++++------ .../domain/example/crud/UpdateTest.java | 2 +- 6 files changed, 44 insertions(+), 59 deletions(-) rename src/test/java/com/gitee/spring/domain/example/crud/{InsertTest.java => CreateTest.java} (99%) delete mode 100644 src/test/java/com/gitee/spring/domain/example/crud/QueryTest.java rename src/test/java/com/gitee/spring/domain/example/crud/{CRUDTest.java => ReadTest.java} (46%) diff --git a/src/main/java/com/gitee/spring/domain/example/entity/User.java b/src/main/java/com/gitee/spring/domain/example/entity/User.java index 1adc8b2..e762b0f 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/User.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/User.java @@ -39,7 +39,7 @@ public class User { private List userRoles; // 角色实体 - @Entity(matchKeys = "user.roles", builderKey = "user.roles.builder", repository = RoleRepository.class) + @Entity(matchKeys = "user.roles", repository = RoleRepository.class, builderKey = "user.roles.builder") @Binding(field = "id", bindProp = "./userRoles", property = "roleId") private List roles; } diff --git a/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java b/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java index b74c99b..2ddb422 100644 --- a/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java +++ b/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java @@ -150,7 +150,7 @@ public class DataService { for (User user : users) { List userRoles = new ArrayList<>(); Set existIds = new HashSet<>(); - for (int index = RandomUtil.randomInt(0, 5); index >= 0; index--) { + for (int index = RandomUtil.randomInt(1, 5); index >= 0; index--) { Role role = roles.get(RandomUtil.randomInt(0, 10)); if (existIds.add(role.getId())) { UserRole userRole = new UserRole(); @@ -170,7 +170,7 @@ public class DataService { for (Role role : roles) { List roleMenus = new ArrayList<>(); Set existIds = new HashSet<>(); - for (int index = RandomUtil.randomInt(0, 5); index >= 0; index--) { + for (int index = RandomUtil.randomInt(1, 5); index >= 0; index--) { Menu menu = menus.get(RandomUtil.randomInt(0, 10)); if (existIds.add(menu.getId())) { RoleMenu roleMenu = new RoleMenu(); diff --git a/src/test/java/com/gitee/spring/domain/example/crud/InsertTest.java b/src/test/java/com/gitee/spring/domain/example/crud/CreateTest.java similarity index 99% rename from src/test/java/com/gitee/spring/domain/example/crud/InsertTest.java rename to src/test/java/com/gitee/spring/domain/example/crud/CreateTest.java index af27b7b..5972262 100644 --- a/src/test/java/com/gitee/spring/domain/example/crud/InsertTest.java +++ b/src/test/java/com/gitee/spring/domain/example/crud/CreateTest.java @@ -27,7 +27,7 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; @SpringBootTest @DisplayName("新增测试") @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class InsertTest { +public class CreateTest { @Autowired private TenantRepository tenantRepository; diff --git a/src/test/java/com/gitee/spring/domain/example/crud/QueryTest.java b/src/test/java/com/gitee/spring/domain/example/crud/QueryTest.java deleted file mode 100644 index bf21ef2..0000000 --- a/src/test/java/com/gitee/spring/domain/example/crud/QueryTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.gitee.spring.domain.example.crud; - -import cn.hutool.json.JSONUtil; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.core.entity.executor.Example; -import com.gitee.spring.domain.example.entity.User; -import com.gitee.spring.domain.example.repository.UserRepository; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.List; - -import static org.junit.jupiter.api.Assumptions.assumeTrue; - -@Slf4j -@SpringBootTest -@DisplayName("查询测试") -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class QueryTest { - - @Autowired - private UserRepository userRepository; - - @Test - @Order(1) - @DisplayName("条件构建器测试") - public void test01() { - BoundedContext boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); - boundedContext.putBuilder("user.roles.builder", (context, root, example) -> example.eq("status", 0)); - Example example = new Example().eq("userCode", "000001"); - List users = userRepository.selectByExample(boundedContext, example); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(users))); - assumeTrue(!users.isEmpty()); - } - -} diff --git a/src/test/java/com/gitee/spring/domain/example/crud/CRUDTest.java b/src/test/java/com/gitee/spring/domain/example/crud/ReadTest.java similarity index 46% rename from src/test/java/com/gitee/spring/domain/example/crud/CRUDTest.java rename to src/test/java/com/gitee/spring/domain/example/crud/ReadTest.java index d2ac44d..6d44799 100644 --- a/src/test/java/com/gitee/spring/domain/example/crud/CRUDTest.java +++ b/src/test/java/com/gitee/spring/domain/example/crud/ReadTest.java @@ -8,11 +8,7 @@ import com.gitee.spring.domain.example.entity.User; import com.gitee.spring.domain.example.repository.TenantRepository; import com.gitee.spring.domain.example.repository.UserRepository; import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -22,9 +18,9 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; @Slf4j @SpringBootTest -@DisplayName("增、删、改、查测试") +@DisplayName("读取测试") @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class CRUDTest { +public class ReadTest { @Autowired private TenantRepository tenantRepository; @@ -32,20 +28,47 @@ public class CRUDTest { private UserRepository userRepository; @Test - @Order(2) - @DisplayName("查询测试") - public void test02() { + @Order(1) + @DisplayName("查询租户测试") + public void test01() { BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "tenant.users", "tenant.roles"); Example example = new Example().eq("tenantCode", "tenant1"); List tenants = tenantRepository.selectByExample(boundedContext, example); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenants))); - assumeTrue(!tenants.isEmpty()); + Tenant tenant = tenants.get(0); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenant))); + assumeTrue(tenant != null); + assumeTrue(tenant.getDepartments().size() == 10); + assumeTrue(tenant.getRoleGroups().size() == 10); + assumeTrue(tenant.getUsers().size() == 10); + assumeTrue(tenant.getRoles().size() == 10); + } + + @Test + @Order(2) + @DisplayName("查询用户测试") + public void test02() { + BoundedContext boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); + Example example = new Example().eq("userCode", "000001"); + List users = userRepository.selectByExample(boundedContext, example); + User user = users.get(0); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(user))); + assumeTrue(user != null); + assumeTrue(!user.getRoles().isEmpty()); + assumeTrue(!user.getRoles().get(0).getMenus().isEmpty()); + } - boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); - example = new Example().eq("userCode", "000001"); + @Test + @Order(3) + @DisplayName("条件构造测试") + public void test03() { + BoundedContext boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); + boundedContext.putBuilder("user.roles.builder", (context, root, example) -> example.eq("status", 1)); + Example example = new Example().eq("userCode", "000001"); List users = userRepository.selectByExample(boundedContext, example); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(users))); - assumeTrue(!users.isEmpty()); + User user = users.get(0); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(user))); + assumeTrue(user != null); + assumeTrue(user.getRoles().isEmpty()); } } diff --git a/src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java b/src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java index c199340..c2bc447 100644 --- a/src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java +++ b/src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java @@ -21,7 +21,7 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; @Slf4j @SpringBootTest -@DisplayName("修改测试") +@DisplayName("更新测试") @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class UpdateTest { -- Gitee From f1befdf290f8e55879e2bb3f42f6f2948c1bf653 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 25 Nov 2022 13:54:40 +0800 Subject: [PATCH 39/42] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/domain/example/entity/Menu.java | 8 + .../spring/domain/example/entity/Role.java | 20 +++ .../spring/domain/example/entity/User.java | 20 +++ .../example/entity/coating/TenantQuery.java | 2 + .../domain/example/common/CoatingTest.java | 62 ------- .../domain/example/common/OverrideTest.java | 44 ----- .../domain/example/crud/CreateTest.java | 13 ++ .../domain/example/crud/DeleteTest.java | 111 ++++++++++++ .../spring/domain/example/crud/ReadTest.java | 163 +++++++++++++++++- 9 files changed, 334 insertions(+), 109 deletions(-) delete mode 100644 src/test/java/com/gitee/spring/domain/example/common/CoatingTest.java delete mode 100644 src/test/java/com/gitee/spring/domain/example/common/OverrideTest.java create mode 100644 src/test/java/com/gitee/spring/domain/example/crud/DeleteTest.java diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java index 8243e70..40e88dc 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java @@ -34,4 +34,12 @@ public class Menu { @Binding(field = "apiUrl", bindCtx = "apiUrl") }) private List apis; + + public void check() { + for (Api api : apis) { + if (!api.getMenuId().equals(id)) { + throw new RuntimeException("Id is different!"); + } + } + } } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Role.java b/src/main/java/com/gitee/spring/domain/example/entity/Role.java index bd92a29..736a1f8 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Role.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Role.java @@ -8,7 +8,9 @@ import com.gitee.spring.domain.example.repository.MenuRepository; import lombok.Data; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; @Data @Entity(mapper = SysRoleMapper.class) @@ -39,4 +41,22 @@ public class Role { @Entity(matchKeys = "role.menus", repository = MenuRepository.class) @Binding(field = "id", bindProp = "./roleMenus", property = "menuId") private List

menus; + + public void check() { + Set menuIds = new HashSet<>(); + for (RoleMenu roleMenu : roleMenus) { + if (roleMenu.getRoleId().equals(id)) { + menuIds.add(roleMenu.getMenuId()); + } else { + throw new RuntimeException("Id is different!"); + } + } + for (Menu menu : menus) { + if (menuIds.contains(menu.getId())) { + menu.check(); + } else { + throw new RuntimeException("Id is different!"); + } + } + } } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/User.java b/src/main/java/com/gitee/spring/domain/example/entity/User.java index e762b0f..a0fcb4d 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/User.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/User.java @@ -9,7 +9,9 @@ import com.gitee.spring.domain.example.repository.RoleRepository; import lombok.Data; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; @Data @Entity(mapper = SysUserMapper.class, factory = UserFactory.class) @@ -42,4 +44,22 @@ public class User { @Entity(matchKeys = "user.roles", repository = RoleRepository.class, builderKey = "user.roles.builder") @Binding(field = "id", bindProp = "./userRoles", property = "roleId") private List roles; + + public void check() { + Set roleIds = new HashSet<>(); + for (UserRole userRole : userRoles) { + if (userRole.getUserId().equals(id)) { + roleIds.add(userRole.getRoleId()); + } else { + throw new RuntimeException("Id is different!"); + } + } + for (Role role : roles) { + if (roleIds.contains(role.getId())) { + role.check(); + } else { + throw new RuntimeException("Id is different!"); + } + } + } } diff --git a/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java b/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java index 6d674d3..71e0574 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java @@ -9,6 +9,8 @@ import lombok.Data; public class TenantQuery { // 用户编码 private String userCode; + // 排序 + private String orderByDesc; // 页码 private Long pageNum; // 条目数 diff --git a/src/test/java/com/gitee/spring/domain/example/common/CoatingTest.java b/src/test/java/com/gitee/spring/domain/example/common/CoatingTest.java deleted file mode 100644 index 1c3e6a8..0000000 --- a/src/test/java/com/gitee/spring/domain/example/common/CoatingTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.gitee.spring.domain.example.common; - -import cn.hutool.json.JSONUtil; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.example.entity.Tenant; -import com.gitee.spring.domain.example.entity.User; -import com.gitee.spring.domain.example.entity.coating.TenantQuery; -import com.gitee.spring.domain.example.entity.coating.UserQuery; -import com.gitee.spring.domain.example.repository.TenantRepository; -import com.gitee.spring.domain.example.repository.UserRepository; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.List; - -import static org.junit.jupiter.api.Assumptions.assumeTrue; - -@Slf4j -@SpringBootTest -@DisplayName("防腐层测试") -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class CoatingTest { - - @Autowired - private TenantRepository tenantRepository; - @Autowired - private UserRepository userRepository; - - @Test - @Order(1) - @DisplayName("查询测试") - public void test01() { - BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "tenant.users", "tenant.roles"); - TenantQuery tenantQuery = new TenantQuery(); - tenantQuery.setUserCode("000001"); - tenantQuery.setPageNum(1L); - tenantQuery.setPageSize(10L); - List tenants = tenantRepository.selectByCoating(boundedContext, tenantQuery); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenants))); - assumeTrue(!tenants.isEmpty()); - } - - @Test - @Order(2) - @DisplayName("查询测试") - public void test02() { - BoundedContext boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); - boundedContext.put("apiUrl", "/api9"); - UserQuery userQuery = new UserQuery(); - userQuery.setApiUrl("/api9"); - List users = userRepository.selectByCoating(boundedContext, userQuery); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(users))); - assumeTrue(!users.isEmpty()); - } - -} diff --git a/src/test/java/com/gitee/spring/domain/example/common/OverrideTest.java b/src/test/java/com/gitee/spring/domain/example/common/OverrideTest.java deleted file mode 100644 index 320a126..0000000 --- a/src/test/java/com/gitee/spring/domain/example/common/OverrideTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.gitee.spring.domain.example.common; - -import cn.hutool.json.JSONUtil; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.core.entity.executor.Example; -import com.gitee.spring.domain.example.entity.User; -import com.gitee.spring.domain.example.entity.UserAdmin; -import com.gitee.spring.domain.example.repository.UserRepository; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.List; - -import static org.junit.jupiter.api.Assumptions.assumeTrue; - -@Slf4j -@SpringBootTest -@DisplayName("多态测试") -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class OverrideTest { - - @Autowired - private UserRepository userRepository; - - @Test - @Order(1) - @DisplayName("查询测试") - public void test01() { - BoundedContext boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); - Example example = new Example().eq("isAdmin", 1).startPage(); - List users = userRepository.selectByExample(boundedContext, example); - User user = users.get(0); - log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(user))); - assumeTrue(user instanceof UserAdmin); - assumeTrue(user.getRoles().size() == 10); - } - -} diff --git a/src/test/java/com/gitee/spring/domain/example/crud/CreateTest.java b/src/test/java/com/gitee/spring/domain/example/crud/CreateTest.java index 5972262..508a3bc 100644 --- a/src/test/java/com/gitee/spring/domain/example/crud/CreateTest.java +++ b/src/test/java/com/gitee/spring/domain/example/crud/CreateTest.java @@ -56,6 +56,9 @@ public class CreateTest { int count = tenantRepository.insert(boundedContext, tenant); assumeTrue(count == 1); + + count = tenantRepository.deleteByPrimaryKey(boundedContext, tenant.getId()); + assumeTrue(count == 1); } @Test @@ -110,6 +113,10 @@ public class CreateTest { assumeTrue(lastInsertCount + 1 == insertCount); assumeTrue(count == 1); + + boundedContext.remove("tenant.command"); + count = tenantRepository.deleteByPrimaryKey(boundedContext, tenant.getId()); + assumeTrue(count == 1); } @Test @@ -152,6 +159,9 @@ public class CreateTest { int count = tenantRepository.insertOrUpdate(boundedContext, tenant); assumeTrue(department.getTenantId() != null); assumeTrue(count == 2); + + count = tenantRepository.deleteByPrimaryKey(boundedContext, tenant.getId()); + assumeTrue(count == 2); } @Test @@ -194,6 +204,9 @@ public class CreateTest { int count = departmentRepository.insertOrUpdate(boundedContext, department); assumeTrue(department.getTenantId() != null); assumeTrue(count == 2); + + count = departmentRepository.deleteByPrimaryKey(boundedContext, department.getId()); + assumeTrue(count == 2); } } diff --git a/src/test/java/com/gitee/spring/domain/example/crud/DeleteTest.java b/src/test/java/com/gitee/spring/domain/example/crud/DeleteTest.java new file mode 100644 index 0000000..3d60466 --- /dev/null +++ b/src/test/java/com/gitee/spring/domain/example/crud/DeleteTest.java @@ -0,0 +1,111 @@ +package com.gitee.spring.domain.example.crud; + +import com.gitee.spring.domain.core.entity.BoundedContext; +import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.spring.domain.example.entity.Tenant; +import com.gitee.spring.domain.example.repository.TenantRepository; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Date; +import java.util.List; + +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +@Slf4j +@SpringBootTest +@DisplayName("删除测试") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class DeleteTest { + + @Autowired + private TenantRepository tenantRepository; + + @Test + @Order(1) + @DisplayName("实体删除测试") + public void test01() { + BoundedContext boundedContext = new BoundedContext(); + + int lastId = 0; + List tenants = tenantRepository.selectByExample(boundedContext, new Example().orderByDesc("id").startPage()); + if (!tenants.isEmpty()) { + lastId = tenants.get(0).getId(); + } + int id = lastId + 1; + + Tenant tenant = new Tenant(); + tenant.setTenantCode("tenant" + id); + tenant.setTenantName("租户" + id); + tenant.setStatus(0); + tenant.setCreateUser("admin"); + tenant.setCreateTime(new Date()); + + int count = tenantRepository.insert(boundedContext, tenant); + assumeTrue(count == 1); + + count = tenantRepository.delete(boundedContext, tenant); + assumeTrue(count == 1); + } + + @Test + @Order(2) + @DisplayName("主键删除测试") + public void test02() { + BoundedContext boundedContext = new BoundedContext(); + + int lastId = 0; + List tenants = tenantRepository.selectByExample(boundedContext, new Example().orderByDesc("id").startPage()); + if (!tenants.isEmpty()) { + lastId = tenants.get(0).getId(); + } + int id = lastId + 1; + + Tenant tenant = new Tenant(); + tenant.setTenantCode("tenant" + id); + tenant.setTenantName("租户" + id); + tenant.setStatus(0); + tenant.setCreateUser("admin"); + tenant.setCreateTime(new Date()); + + int count = tenantRepository.insert(boundedContext, tenant); + assumeTrue(count == 1); + + count = tenantRepository.deleteByPrimaryKey(boundedContext, tenant.getId()); + assumeTrue(count == 1); + } + + @Test + @Order(3) + @DisplayName("条件删除测试") + public void test03() { + BoundedContext boundedContext = new BoundedContext(); + + int lastId = 0; + List tenants = tenantRepository.selectByExample(boundedContext, new Example().orderByDesc("id").startPage()); + if (!tenants.isEmpty()) { + lastId = tenants.get(0).getId(); + } + int id = lastId + 1; + + Tenant tenant = new Tenant(); + tenant.setTenantCode("tenant" + id); + tenant.setTenantName("租户" + id); + tenant.setStatus(0); + tenant.setCreateUser("admin"); + tenant.setCreateTime(new Date()); + + int count = tenantRepository.insert(boundedContext, tenant); + assumeTrue(count == 1); + + count = tenantRepository.deleteByExample(boundedContext, new Example().eq("tenantCode", tenant.getTenantCode())); + assumeTrue(count == 1); + } + +} diff --git a/src/test/java/com/gitee/spring/domain/example/crud/ReadTest.java b/src/test/java/com/gitee/spring/domain/example/crud/ReadTest.java index 6d44799..5c8016c 100644 --- a/src/test/java/com/gitee/spring/domain/example/crud/ReadTest.java +++ b/src/test/java/com/gitee/spring/domain/example/crud/ReadTest.java @@ -1,18 +1,46 @@ package com.gitee.spring.domain.example.crud; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.gitee.spring.domain.core.entity.BoundedContext; import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.spring.domain.example.dal.mapper.SysApiMapper; +import com.gitee.spring.domain.example.dal.mapper.SysRoleMenuMapper; +import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; +import com.gitee.spring.domain.example.dal.mapper.SysUserRoleMapper; +import com.gitee.spring.domain.example.dal.pojo.SysApi; +import com.gitee.spring.domain.example.dal.pojo.SysRoleMenu; +import com.gitee.spring.domain.example.dal.pojo.SysUser; +import com.gitee.spring.domain.example.dal.pojo.SysUserRole; +import com.gitee.spring.domain.example.entity.Api; +import com.gitee.spring.domain.example.entity.Menu; +import com.gitee.spring.domain.example.entity.Role; +import com.gitee.spring.domain.example.entity.RoleMenu; import com.gitee.spring.domain.example.entity.Tenant; import com.gitee.spring.domain.example.entity.User; +import com.gitee.spring.domain.example.entity.UserAdmin; +import com.gitee.spring.domain.example.entity.UserRole; +import com.gitee.spring.domain.example.entity.coating.TenantQuery; +import com.gitee.spring.domain.example.entity.coating.UserQuery; import com.gitee.spring.domain.example.repository.TenantRepository; import com.gitee.spring.domain.example.repository.UserRepository; import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.*; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import static org.junit.jupiter.api.Assumptions.assumeTrue; @@ -27,9 +55,18 @@ public class ReadTest { @Autowired private UserRepository userRepository; + @Autowired + private SysUserMapper sysUserMapper; + @Autowired + private SysUserRoleMapper sysUserRoleMapper; + @Autowired + private SysRoleMenuMapper sysRoleMenuMapper; + @Autowired + private SysApiMapper sysApiMapper; + @Test @Order(1) - @DisplayName("查询租户测试") + @DisplayName("租户查询测试") public void test01() { BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "tenant.users", "tenant.roles"); Example example = new Example().eq("tenantCode", "tenant1"); @@ -45,7 +82,7 @@ public class ReadTest { @Test @Order(2) - @DisplayName("查询用户测试") + @DisplayName("用户查询测试") public void test02() { BoundedContext boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); Example example = new Example().eq("userCode", "000001"); @@ -71,4 +108,124 @@ public class ReadTest { assumeTrue(user.getRoles().isEmpty()); } + @Test + @Order(4) + @DisplayName("租户反向查询测试") + public void test04() { + BoundedContext boundedContext = new BoundedContext("tenant.depts", "tenant.groups", "tenant.users", "tenant.roles"); + TenantQuery tenantQuery = new TenantQuery(); + tenantQuery.setUserCode("000001"); + tenantQuery.setOrderByDesc("id"); + tenantQuery.setPageNum(1L); + tenantQuery.setPageSize(10L); + List tenants = tenantRepository.selectByCoating(boundedContext, tenantQuery); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(tenants))); + assumeTrue(!tenants.isEmpty()); + } + + @Test + @Order(5) + @DisplayName("用户反向查询测试") + public void test05() { + BoundedContext boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); + boundedContext.put("apiUrl", "/api9"); + UserQuery userQuery = new UserQuery(); + userQuery.setApiUrl("/api9"); + List users = userRepository.selectByCoating(boundedContext, userQuery); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(users))); + assumeTrue(!users.isEmpty()); + } + + @Test + @Order(6) + @DisplayName("多态查询测试") + public void test06() { + BoundedContext boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); + Example example = new Example().eq("isAdmin", 1).startPage(); + List users = userRepository.selectByExample(boundedContext, example); + User user = users.get(0); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(user))); + assumeTrue(user instanceof UserAdmin); + assumeTrue(user.getRoles().size() == 10); + } + + @Test + @Order(7) + @DisplayName("关联准确性测试") + public void test07() { + BoundedContext boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); + int number = RandomUtil.randomInt(0, 10); + Example example = new Example().eq("userCode", StrUtil.fillBefore(String.valueOf((number + 1)), '0', 6)); + List users = userRepository.selectByExample(boundedContext, example); + User user = users.get(0); + log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(user))); + + user.check(); + + List userRoleIds = new ArrayList<>(); + Set roleIds = new HashSet<>(); + List roleMenuIds = new ArrayList<>(); + Set menuIds = new HashSet<>(); + Set apiIds = new HashSet<>(); + + if (CollUtil.isNotEmpty(user.getUserRoles())) { + userRoleIds = user.getUserRoles().stream().map(UserRole::getId).collect(Collectors.toList()); + } + if (CollUtil.isNotEmpty(user.getRoles())) { + roleIds = user.getRoles().stream().map(Role::getId).collect(Collectors.toSet()); + for (Role role : user.getRoles()) { + if (CollUtil.isNotEmpty(role.getRoleMenus())) { + roleMenuIds.addAll(role.getRoleMenus().stream().map(RoleMenu::getId).collect(Collectors.toList())); + } + if (CollUtil.isNotEmpty(role.getMenus())) { + menuIds.addAll(role.getMenus().stream().map(Menu::getId).collect(Collectors.toList())); + for (Menu menu : role.getMenus()) { + if (CollUtil.isNotEmpty(menu.getApis())) { + apiIds.addAll(menu.getApis().stream().map(Api::getId).collect(Collectors.toList())); + } + } + } + } + } + + List sysUserRoleIds = new ArrayList<>(); + Set sysRoleIds = new HashSet<>(); + List sysRoleMenuIds = new ArrayList<>(); + Set sysMenuIds = new HashSet<>(); + Set sysApiIds = new HashSet<>(); + + SysUser sysUser = sysUserMapper.selectById(user.getId()); + assumeTrue(sysUser != null); + assumeTrue(user.getUserCode().equals(sysUser.getUserCode())); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_id", sysUser.getId()); + List sysUserRoles = sysUserRoleMapper.selectList(queryWrapper); + if (CollUtil.isNotEmpty(sysUserRoles)) { + sysUserRoleIds = sysUserRoles.stream().map(SysUserRole::getId).collect(Collectors.toList()); + sysRoleIds = sysUserRoles.stream().map(SysUserRole::getRoleId).collect(Collectors.toSet()); + + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.in("role_id", sysRoleIds); + List sysRoleMenus = sysRoleMenuMapper.selectList(queryWrapper1); + if (CollUtil.isNotEmpty(sysRoleMenus)) { + sysRoleMenuIds = sysRoleMenus.stream().map(SysRoleMenu::getId).collect(Collectors.toList()); + sysMenuIds = sysRoleMenus.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toSet()); + + QueryWrapper queryWrapper2 = new QueryWrapper<>(); + queryWrapper2.in("menu_id", sysMenuIds); + List sysApis = sysApiMapper.selectList(queryWrapper2); + if (CollUtil.isNotEmpty(sysApis)) { + sysApiIds = sysApis.stream().map(SysApi::getId).collect(Collectors.toSet()); + } + } + } + + assumeTrue(CollUtil.disjunction(userRoleIds, sysUserRoleIds).isEmpty()); + assumeTrue(CollUtil.disjunction(roleIds, sysRoleIds).isEmpty()); + assumeTrue(CollUtil.disjunction(roleMenuIds, sysRoleMenuIds).isEmpty()); + assumeTrue(CollUtil.disjunction(menuIds, sysMenuIds).isEmpty()); + assumeTrue(CollUtil.disjunction(apiIds, sysApiIds).isEmpty()); + } + } -- Gitee From 49f36d74b3adacd6caa5690c00fa36d600937cef Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 25 Nov 2022 17:48:36 +0800 Subject: [PATCH 40/42] =?UTF-8?q?=E3=80=90=E4=BC=98=E5=8C=96=E3=80=91?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=B8=AA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../com/gitee/spring/domain/example/entity/Api.java | 2 +- .../spring/domain/example/entity/Department.java | 6 +++--- .../com/gitee/spring/domain/example/entity/Menu.java | 6 +++--- .../com/gitee/spring/domain/example/entity/Role.java | 4 ++-- .../spring/domain/example/entity/RoleGroup.java | 6 +++--- .../gitee/spring/domain/example/entity/RoleMenu.java | 2 +- .../gitee/spring/domain/example/entity/Tenant.java | 6 +++--- .../com/gitee/spring/domain/example/entity/User.java | 4 ++-- .../spring/domain/example/entity/UserAdmin.java | 4 ++-- .../gitee/spring/domain/example/entity/UserRole.java | 2 +- .../domain/example/entity/coating/TenantQuery.java | 2 +- .../domain/example/entity/coating/UserQuery.java | 2 +- .../domain/example/impl/factory/UserFactory.java | 4 ++-- .../domain/example/impl/listener/TenantListener.java | 12 ++++++------ .../domain/example/impl/service/DataService.java | 4 ++-- .../example/repository/DepartmentRepository.java | 4 ++-- .../domain/example/repository/MenuRepository.java | 4 ++-- .../example/repository/RoleGroupRepository.java | 4 ++-- .../domain/example/repository/RoleRepository.java | 4 ++-- .../domain/example/repository/TenantRepository.java | 8 ++++---- .../example/repository/UserAdminRepository.java | 4 ++-- .../domain/example/repository/UserRepository.java | 6 +++--- .../spring/domain/example/common/BinderTest.java | 10 +++++----- .../spring/domain/example/common/EventTest.java | 4 ++-- .../spring/domain/example/common/ProxyTest.java | 4 ++-- .../gitee/spring/domain/example/crud/CreateTest.java | 6 +++--- .../gitee/spring/domain/example/crud/DeleteTest.java | 4 ++-- .../gitee/spring/domain/example/crud/ReadTest.java | 10 ++++------ .../gitee/spring/domain/example/crud/UpdateTest.java | 6 +++--- 30 files changed, 72 insertions(+), 74 deletions(-) diff --git a/pom.xml b/pom.xml index d42376c..7e945c2 100644 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,7 @@ com.gitee.digital-engine - spring-boot-starter-domain + spring-boot-starter-dorive 3.0.0 diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Api.java b/src/main/java/com/gitee/spring/domain/example/entity/Api.java index 0787d3c..7940619 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Api.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Api.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.dorive.core.annotation.Entity; import com.gitee.spring.domain.example.dal.mapper.SysApiMapper; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Department.java b/src/main/java/com/gitee/spring/domain/example/entity/Department.java index d8882d7..776a640 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Department.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Department.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Bindings; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.dorive.core.annotation.Binding; +import com.gitee.dorive.core.annotation.Bindings; +import com.gitee.dorive.core.annotation.Entity; import com.gitee.spring.domain.example.dal.mapper.SysDeptMapper; import com.gitee.spring.domain.example.dal.mapper.SysTenantMapper; import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java index 40e88dc..5c438fc 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Menu.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Bindings; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.dorive.core.annotation.Binding; +import com.gitee.dorive.core.annotation.Bindings; +import com.gitee.dorive.core.annotation.Entity; import com.gitee.spring.domain.example.dal.mapper.SysApiMapper; import com.gitee.spring.domain.example.dal.mapper.SysMenuMapper; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Role.java b/src/main/java/com/gitee/spring/domain/example/entity/Role.java index 736a1f8..d6ec2ba 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Role.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Role.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.dorive.core.annotation.Binding; +import com.gitee.dorive.core.annotation.Entity; import com.gitee.spring.domain.example.dal.mapper.SysRoleMapper; import com.gitee.spring.domain.example.dal.mapper.SysRoleMenuMapper; import com.gitee.spring.domain.example.repository.MenuRepository; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java index 86baa17..1495426 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Bindings; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.dorive.core.annotation.Binding; +import com.gitee.dorive.core.annotation.Bindings; +import com.gitee.dorive.core.annotation.Entity; import com.gitee.spring.domain.example.dal.mapper.SysRoleGroupMapper; import com.gitee.spring.domain.example.dal.mapper.SysRoleMapper; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java index 7a36332..6181a55 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.dorive.core.annotation.Entity; import com.gitee.spring.domain.example.dal.mapper.SysRoleMenuMapper; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java index c065c5b..b7162ae 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Bindings; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.dorive.core.annotation.Binding; +import com.gitee.dorive.core.annotation.Bindings; +import com.gitee.dorive.core.annotation.Entity; import com.gitee.spring.domain.example.dal.mapper.SysDeptMapper; import com.gitee.spring.domain.example.dal.mapper.SysRoleGroupMapper; import com.gitee.spring.domain.example.dal.mapper.SysRoleMapper; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/User.java b/src/main/java/com/gitee/spring/domain/example/entity/User.java index a0fcb4d..b0b7290 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/User.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/User.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.dorive.core.annotation.Binding; +import com.gitee.dorive.core.annotation.Entity; import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; import com.gitee.spring.domain.example.dal.mapper.SysUserRoleMapper; import com.gitee.spring.domain.example.impl.factory.UserFactory; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserAdmin.java b/src/main/java/com/gitee/spring/domain/example/entity/UserAdmin.java index 3136bb4..9b677ae 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/UserAdmin.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/UserAdmin.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core.annotation.Binding; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.dorive.core.annotation.Binding; +import com.gitee.dorive.core.annotation.Entity; import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; import com.gitee.spring.domain.example.repository.RoleRepository; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java index 53734d7..6af6c66 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.entity; -import com.gitee.spring.domain.core.annotation.Entity; +import com.gitee.dorive.core.annotation.Entity; import com.gitee.spring.domain.example.dal.mapper.SysUserRoleMapper; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java b/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java index 71e0574..6278997 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.entity.coating; -import com.gitee.spring.domain.coating.annotation.Coating; +import com.gitee.dorive.coating.annotation.Coating; import com.gitee.spring.domain.example.entity.Tenant; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/coating/UserQuery.java b/src/main/java/com/gitee/spring/domain/example/entity/coating/UserQuery.java index c76863e..3ff4269 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/coating/UserQuery.java +++ b/src/main/java/com/gitee/spring/domain/example/entity/coating/UserQuery.java @@ -1,6 +1,6 @@ package com.gitee.spring.domain.example.entity.coating; -import com.gitee.spring.domain.coating.annotation.Coating; +import com.gitee.dorive.coating.annotation.Coating; import com.gitee.spring.domain.example.entity.User; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/impl/factory/UserFactory.java b/src/main/java/com/gitee/spring/domain/example/impl/factory/UserFactory.java index 6d62ee6..4630a91 100644 --- a/src/main/java/com/gitee/spring/domain/example/impl/factory/UserFactory.java +++ b/src/main/java/com/gitee/spring/domain/example/impl/factory/UserFactory.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.impl.factory; import cn.hutool.core.bean.BeanUtil; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.core.impl.DefaultEntityFactory; +import com.gitee.dorive.core.entity.BoundedContext; +import com.gitee.dorive.core.impl.DefaultEntityFactory; import com.gitee.spring.domain.example.entity.User; import com.gitee.spring.domain.example.entity.UserAdmin; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java b/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java index 3416eb4..9485bda 100644 --- a/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java +++ b/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java @@ -1,11 +1,11 @@ package com.gitee.spring.domain.example.impl.listener; -import com.gitee.spring.domain.core.entity.operation.Insert; -import com.gitee.spring.domain.core.entity.operation.Operation; -import com.gitee.spring.domain.core.entity.operation.Update; -import com.gitee.spring.domain.event.annotation.Listener; -import com.gitee.spring.domain.event.api.EntityListener; -import com.gitee.spring.domain.event.entity.RepositoryEvent; +import com.gitee.dorive.core.entity.operation.Insert; +import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.Update; +import com.gitee.dorive.event.annotation.Listener; +import com.gitee.dorive.event.api.EntityListener; +import com.gitee.dorive.event.entity.RepositoryEvent; import com.gitee.spring.domain.example.entity.Tenant; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java b/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java index 2ddb422..acf7e72 100644 --- a/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java +++ b/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java @@ -3,8 +3,8 @@ package com.gitee.spring.domain.example.impl.service; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.dorive.core.entity.BoundedContext; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.spring.domain.example.entity.Api; import com.gitee.spring.domain.example.entity.Department; import com.gitee.spring.domain.example.entity.Menu; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java index 30c8b65..5165a5b 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.dorive.annotation.RootRepository; +import com.gitee.spring.boot.starter.dorive.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Department; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java index 4aecc9f..b6cc697 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.dorive.annotation.RootRepository; +import com.gitee.spring.boot.starter.dorive.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Menu; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java index c52d22a..da5fdfb 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.dorive.annotation.RootRepository; +import com.gitee.spring.boot.starter.dorive.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.RoleGroup; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java index cde16ae..5bba109 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.dorive.annotation.RootRepository; +import com.gitee.spring.boot.starter.dorive.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.Role; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java index 8febae0..c2255eb 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java @@ -1,9 +1,9 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; -import com.gitee.spring.domain.coating.annotation.CoatingScan; -import com.gitee.spring.domain.event.annotation.EnableEvent; +import com.gitee.spring.boot.starter.dorive.annotation.RootRepository; +import com.gitee.spring.boot.starter.dorive.repository.MybatisPlusRepository; +import com.gitee.dorive.coating.annotation.CoatingScan; +import com.gitee.dorive.event.annotation.EnableEvent; import com.gitee.spring.domain.example.entity.Tenant; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserAdminRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/UserAdminRepository.java index 59044f0..5c8837f 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/UserAdminRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/UserAdminRepository.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; +import com.gitee.spring.boot.starter.dorive.annotation.RootRepository; +import com.gitee.spring.boot.starter.dorive.repository.MybatisPlusRepository; import com.gitee.spring.domain.example.entity.UserAdmin; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java b/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java index 96f638e..4571122 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java +++ b/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.repository; -import com.gitee.spring.boot.starter.domain.annotation.RootRepository; -import com.gitee.spring.boot.starter.domain.repository.MybatisPlusRepository; -import com.gitee.spring.domain.coating.annotation.CoatingScan; +import com.gitee.spring.boot.starter.dorive.annotation.RootRepository; +import com.gitee.spring.boot.starter.dorive.repository.MybatisPlusRepository; +import com.gitee.dorive.coating.annotation.CoatingScan; import com.gitee.spring.domain.example.entity.User; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/test/java/com/gitee/spring/domain/example/common/BinderTest.java b/src/test/java/com/gitee/spring/domain/example/common/BinderTest.java index 1d8c898..7d7dca5 100644 --- a/src/test/java/com/gitee/spring/domain/example/common/BinderTest.java +++ b/src/test/java/com/gitee/spring/domain/example/common/BinderTest.java @@ -1,10 +1,10 @@ package com.gitee.spring.domain.example.common; -import com.gitee.spring.domain.core.api.Binder; -import com.gitee.spring.domain.core.impl.binder.ContextBinder; -import com.gitee.spring.domain.core.impl.binder.PropertyBinder; -import com.gitee.spring.domain.core.impl.resolver.BinderResolver; -import com.gitee.spring.domain.core.repository.ConfiguredRepository; +import com.gitee.dorive.core.api.Binder; +import com.gitee.dorive.core.impl.binder.ContextBinder; +import com.gitee.dorive.core.impl.binder.PropertyBinder; +import com.gitee.dorive.core.impl.resolver.BinderResolver; +import com.gitee.dorive.core.repository.ConfiguredRepository; import com.gitee.spring.domain.example.repository.DepartmentRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/com/gitee/spring/domain/example/common/EventTest.java b/src/test/java/com/gitee/spring/domain/example/common/EventTest.java index a020aee..c58bbc0 100644 --- a/src/test/java/com/gitee/spring/domain/example/common/EventTest.java +++ b/src/test/java/com/gitee/spring/domain/example/common/EventTest.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.common; import cn.hutool.json.JSONUtil; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.dorive.core.entity.BoundedContext; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.spring.domain.example.entity.Tenant; import com.gitee.spring.domain.example.impl.listener.TenantListener; import com.gitee.spring.domain.example.repository.TenantRepository; diff --git a/src/test/java/com/gitee/spring/domain/example/common/ProxyTest.java b/src/test/java/com/gitee/spring/domain/example/common/ProxyTest.java index 3a0d17c..a466cde 100644 --- a/src/test/java/com/gitee/spring/domain/example/common/ProxyTest.java +++ b/src/test/java/com/gitee/spring/domain/example/common/ProxyTest.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.common; import cn.hutool.core.util.ReflectUtil; -import com.gitee.spring.domain.core.api.PropertyProxy; -import com.gitee.spring.domain.core.impl.PropertyProxyFactory; +import com.gitee.dorive.core.api.PropertyProxy; +import com.gitee.dorive.core.impl.PropertyProxyFactory; import com.gitee.spring.domain.example.entity.Department; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/com/gitee/spring/domain/example/crud/CreateTest.java b/src/test/java/com/gitee/spring/domain/example/crud/CreateTest.java index 508a3bc..0c05dc5 100644 --- a/src/test/java/com/gitee/spring/domain/example/crud/CreateTest.java +++ b/src/test/java/com/gitee/spring/domain/example/crud/CreateTest.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.crud; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.core.entity.Command; -import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.dorive.core.entity.BoundedContext; +import com.gitee.dorive.core.entity.Command; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.spring.domain.example.entity.Department; import com.gitee.spring.domain.example.entity.Tenant; import com.gitee.spring.domain.example.impl.listener.TenantListener; diff --git a/src/test/java/com/gitee/spring/domain/example/crud/DeleteTest.java b/src/test/java/com/gitee/spring/domain/example/crud/DeleteTest.java index 3d60466..c4fa561 100644 --- a/src/test/java/com/gitee/spring/domain/example/crud/DeleteTest.java +++ b/src/test/java/com/gitee/spring/domain/example/crud/DeleteTest.java @@ -1,7 +1,7 @@ package com.gitee.spring.domain.example.crud; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.dorive.core.entity.BoundedContext; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.spring.domain.example.entity.Tenant; import com.gitee.spring.domain.example.repository.TenantRepository; import lombok.extern.slf4j.Slf4j; diff --git a/src/test/java/com/gitee/spring/domain/example/crud/ReadTest.java b/src/test/java/com/gitee/spring/domain/example/crud/ReadTest.java index 5c8016c..c9012da 100644 --- a/src/test/java/com/gitee/spring/domain/example/crud/ReadTest.java +++ b/src/test/java/com/gitee/spring/domain/example/crud/ReadTest.java @@ -2,11 +2,10 @@ package com.gitee.spring.domain.example.crud; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.dorive.core.entity.BoundedContext; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.spring.domain.example.dal.mapper.SysApiMapper; import com.gitee.spring.domain.example.dal.mapper.SysRoleMenuMapper; import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; @@ -154,10 +153,9 @@ public class ReadTest { @DisplayName("关联准确性测试") public void test07() { BoundedContext boundedContext = new BoundedContext("user.roles", "role.menus", "menu.apis"); - int number = RandomUtil.randomInt(0, 10); - Example example = new Example().eq("userCode", StrUtil.fillBefore(String.valueOf((number + 1)), '0', 6)); + Example example = new Example().eq("isAdmin", 0); List users = userRepository.selectByExample(boundedContext, example); - User user = users.get(0); + User user = users.get(RandomUtil.randomInt(0, users.size())); log.info(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(user))); user.check(); diff --git a/src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java b/src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java index c2bc447..772d089 100644 --- a/src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java +++ b/src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java @@ -1,8 +1,8 @@ package com.gitee.spring.domain.example.crud; -import com.gitee.spring.domain.core.entity.BoundedContext; -import com.gitee.spring.domain.core.entity.Command; -import com.gitee.spring.domain.core.entity.executor.Example; +import com.gitee.dorive.core.entity.BoundedContext; +import com.gitee.dorive.core.entity.Command; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.spring.domain.example.entity.Tenant; import com.gitee.spring.domain.example.repository.TenantRepository; import lombok.extern.slf4j.Slf4j; -- Gitee From 65d183ca008c037ef5268e0e42292405f09b6d33 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 25 Nov 2022 17:59:21 +0800 Subject: [PATCH 41/42] =?UTF-8?q?=E3=80=90=E4=BC=98=E5=8C=96=E3=80=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8C=85=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/Application.java | 4 +- .../config/MybatisPlusConfiguration.java | 2 +- .../example/dal/mapper/SysApiMapper.java | 4 +- .../example/dal/mapper/SysDeptMapper.java | 4 +- .../example/dal/mapper/SysMenuMapper.java | 4 +- .../dal/mapper/SysRoleGroupMapper.java | 4 +- .../example/dal/mapper/SysRoleMapper.java | 4 +- .../example/dal/mapper/SysRoleMenuMapper.java | 4 +- .../example/dal/mapper/SysTenantMapper.java | 4 +- .../example/dal/mapper/SysUserMapper.java | 4 +- .../example/dal/mapper/SysUserRoleMapper.java | 4 +- .../example/dal/pojo/SysApi.java | 2 +- .../example/dal/pojo/SysDept.java | 2 +- .../example/dal/pojo/SysMenu.java | 2 +- .../example/dal/pojo/SysRole.java | 2 +- .../example/dal/pojo/SysRoleGroup.java | 2 +- .../example/dal/pojo/SysRoleMenu.java | 2 +- .../example/dal/pojo/SysTenant.java | 2 +- .../example/dal/pojo/SysUser.java | 2 +- .../example/dal/pojo/SysUserRole.java | 2 +- .../domain => dorive}/example/entity/Api.java | 4 +- .../example/entity/Department.java | 8 ++-- .../example/entity/Menu.java | 6 +-- .../example/entity/Role.java | 8 ++-- .../example/entity/RoleGroup.java | 6 +-- .../example/entity/RoleMenu.java | 4 +- .../example/entity/Tenant.java | 12 +++--- .../example/entity/User.java | 10 ++--- .../example/entity/UserAdmin.java | 6 +-- .../example/entity/UserRole.java | 4 +- .../example/entity/coating/TenantQuery.java | 4 +- .../example/entity/coating/UserQuery.java | 4 +- .../example/impl/factory/UserFactory.java | 6 +-- .../example/impl/listener/TenantListener.java | 4 +- .../example/impl/service/DataService.java | 28 ++++++------- .../repository/DepartmentRepository.java | 4 +- .../example/repository/MenuRepository.java | 4 +- .../repository/RoleGroupRepository.java | 4 +- .../example/repository/RoleRepository.java | 4 +- .../example/repository/TenantRepository.java | 6 +-- .../repository/UserAdminRepository.java | 4 +- .../example/repository/UserRepository.java | 6 +-- src/main/resources/mapper/SysApiMapper.xml | 4 +- src/main/resources/mapper/SysDeptMapper.xml | 4 +- src/main/resources/mapper/SysMenuMapper.xml | 4 +- .../resources/mapper/SysRoleGroupMapper.xml | 4 +- src/main/resources/mapper/SysRoleMapper.xml | 4 +- .../resources/mapper/SysRoleMenuMapper.xml | 4 +- src/main/resources/mapper/SysTenantMapper.xml | 4 +- src/main/resources/mapper/SysUserMapper.xml | 4 +- .../resources/mapper/SysUserRoleMapper.xml | 4 +- .../domain => dorive}/example/DataTest.java | 4 +- .../example/common/BinderTest.java | 4 +- .../example/common/EventTest.java | 8 ++-- .../example/common/ProxyTest.java | 4 +- .../example/crud/CreateTest.java | 12 +++--- .../example/crud/DeleteTest.java | 6 +-- .../example/crud/ReadTest.java | 42 +++++++++---------- .../example/crud/UpdateTest.java | 6 +-- 59 files changed, 164 insertions(+), 164 deletions(-) rename src/main/java/com/gitee/{spring/domain => dorive}/example/Application.java (76%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/config/MybatisPlusConfiguration.java (96%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/mapper/SysApiMapper.java (63%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/mapper/SysDeptMapper.java (63%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/mapper/SysMenuMapper.java (63%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/mapper/SysRoleGroupMapper.java (63%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/mapper/SysRoleMapper.java (63%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/mapper/SysRoleMenuMapper.java (64%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/mapper/SysTenantMapper.java (63%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/mapper/SysUserMapper.java (63%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/mapper/SysUserRoleMapper.java (64%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/pojo/SysApi.java (95%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/pojo/SysDept.java (95%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/pojo/SysMenu.java (95%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/pojo/SysRole.java (95%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/pojo/SysRoleGroup.java (95%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/pojo/SysRoleMenu.java (95%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/pojo/SysTenant.java (95%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/pojo/SysUser.java (96%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/dal/pojo/SysUserRole.java (95%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/entity/Api.java (81%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/entity/Department.java (83%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/entity/Menu.java (86%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/entity/Role.java (86%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/entity/RoleGroup.java (83%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/entity/RoleMenu.java (80%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/entity/Tenant.java (80%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/entity/User.java (84%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/entity/UserAdmin.java (77%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/entity/UserRole.java (76%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/entity/coating/TenantQuery.java (74%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/entity/coating/UserQuery.java (64%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/impl/factory/UserFactory.java (82%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/impl/listener/TenantListener.java (91%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/impl/service/DataService.java (90%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/repository/DepartmentRepository.java (78%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/repository/MenuRepository.java (79%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/repository/RoleGroupRepository.java (78%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/repository/RoleRepository.java (79%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/repository/TenantRepository.java (75%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/repository/UserAdminRepository.java (78%) rename src/main/java/com/gitee/{spring/domain => dorive}/example/repository/UserRepository.java (75%) rename src/test/java/com/gitee/{spring/domain => dorive}/example/DataTest.java (89%) rename src/test/java/com/gitee/{spring/domain => dorive}/example/common/BinderTest.java (93%) rename src/test/java/com/gitee/{spring/domain => dorive}/example/common/EventTest.java (85%) rename src/test/java/com/gitee/{spring/domain => dorive}/example/common/ProxyTest.java (95%) rename src/test/java/com/gitee/{spring/domain => dorive}/example/crud/CreateTest.java (95%) rename src/test/java/com/gitee/{spring/domain => dorive}/example/crud/DeleteTest.java (95%) rename src/test/java/com/gitee/{spring/domain => dorive}/example/crud/ReadTest.java (87%) rename src/test/java/com/gitee/{spring/domain => dorive}/example/crud/UpdateTest.java (93%) diff --git a/src/main/java/com/gitee/spring/domain/example/Application.java b/src/main/java/com/gitee/dorive/example/Application.java similarity index 76% rename from src/main/java/com/gitee/spring/domain/example/Application.java rename to src/main/java/com/gitee/dorive/example/Application.java index 80a22a6..ddfa625 100644 --- a/src/main/java/com/gitee/spring/domain/example/Application.java +++ b/src/main/java/com/gitee/dorive/example/Application.java @@ -1,11 +1,11 @@ -package com.gitee.spring.domain.example; +package com.gitee.dorive.example; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -@MapperScan("com.gitee.spring.domain.example.dal.mapper") +@MapperScan("com.gitee.dorive.example.dal.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); diff --git a/src/main/java/com/gitee/spring/domain/example/config/MybatisPlusConfiguration.java b/src/main/java/com/gitee/dorive/example/config/MybatisPlusConfiguration.java similarity index 96% rename from src/main/java/com/gitee/spring/domain/example/config/MybatisPlusConfiguration.java rename to src/main/java/com/gitee/dorive/example/config/MybatisPlusConfiguration.java index fcb98e2..41f8bbd 100644 --- a/src/main/java/com/gitee/spring/domain/example/config/MybatisPlusConfiguration.java +++ b/src/main/java/com/gitee/dorive/example/config/MybatisPlusConfiguration.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.config; +package com.gitee.dorive.example.config; import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; import com.baomidou.mybatisplus.extension.MybatisMapWrapperFactory; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysApiMapper.java b/src/main/java/com/gitee/dorive/example/dal/mapper/SysApiMapper.java similarity index 63% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/SysApiMapper.java rename to src/main/java/com/gitee/dorive/example/dal/mapper/SysApiMapper.java index a41f5cf..6057b7c 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysApiMapper.java +++ b/src/main/java/com/gitee/dorive/example/dal/mapper/SysApiMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.dal.mapper; +package com.gitee.dorive.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.SysApi; +import com.gitee.dorive.example.dal.pojo.SysApi; /** * 接口表 diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysDeptMapper.java b/src/main/java/com/gitee/dorive/example/dal/mapper/SysDeptMapper.java similarity index 63% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/SysDeptMapper.java rename to src/main/java/com/gitee/dorive/example/dal/mapper/SysDeptMapper.java index 4b6bb73..2715c24 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysDeptMapper.java +++ b/src/main/java/com/gitee/dorive/example/dal/mapper/SysDeptMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.dal.mapper; +package com.gitee.dorive.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.SysDept; +import com.gitee.dorive.example.dal.pojo.SysDept; /** * 部门表 diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysMenuMapper.java b/src/main/java/com/gitee/dorive/example/dal/mapper/SysMenuMapper.java similarity index 63% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/SysMenuMapper.java rename to src/main/java/com/gitee/dorive/example/dal/mapper/SysMenuMapper.java index ccc5c19..b617e9d 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysMenuMapper.java +++ b/src/main/java/com/gitee/dorive/example/dal/mapper/SysMenuMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.dal.mapper; +package com.gitee.dorive.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.SysMenu; +import com.gitee.dorive.example.dal.pojo.SysMenu; /** * 菜单表 diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleGroupMapper.java b/src/main/java/com/gitee/dorive/example/dal/mapper/SysRoleGroupMapper.java similarity index 63% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleGroupMapper.java rename to src/main/java/com/gitee/dorive/example/dal/mapper/SysRoleGroupMapper.java index f04ee6e..87d0690 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleGroupMapper.java +++ b/src/main/java/com/gitee/dorive/example/dal/mapper/SysRoleGroupMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.dal.mapper; +package com.gitee.dorive.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.SysRoleGroup; +import com.gitee.dorive.example.dal.pojo.SysRoleGroup; /** * 角色组表 diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMapper.java b/src/main/java/com/gitee/dorive/example/dal/mapper/SysRoleMapper.java similarity index 63% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMapper.java rename to src/main/java/com/gitee/dorive/example/dal/mapper/SysRoleMapper.java index f7ba626..e5460fd 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMapper.java +++ b/src/main/java/com/gitee/dorive/example/dal/mapper/SysRoleMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.dal.mapper; +package com.gitee.dorive.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.SysRole; +import com.gitee.dorive.example.dal.pojo.SysRole; /** * 角色表 diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMenuMapper.java b/src/main/java/com/gitee/dorive/example/dal/mapper/SysRoleMenuMapper.java similarity index 64% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMenuMapper.java rename to src/main/java/com/gitee/dorive/example/dal/mapper/SysRoleMenuMapper.java index bfba11f..466c964 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysRoleMenuMapper.java +++ b/src/main/java/com/gitee/dorive/example/dal/mapper/SysRoleMenuMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.dal.mapper; +package com.gitee.dorive.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.SysRoleMenu; +import com.gitee.dorive.example.dal.pojo.SysRoleMenu; /** * 角色菜单绑定表 diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysTenantMapper.java b/src/main/java/com/gitee/dorive/example/dal/mapper/SysTenantMapper.java similarity index 63% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/SysTenantMapper.java rename to src/main/java/com/gitee/dorive/example/dal/mapper/SysTenantMapper.java index eab6dc1..75f4824 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysTenantMapper.java +++ b/src/main/java/com/gitee/dorive/example/dal/mapper/SysTenantMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.dal.mapper; +package com.gitee.dorive.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.SysTenant; +import com.gitee.dorive.example.dal.pojo.SysTenant; /** * 租户表 diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserMapper.java b/src/main/java/com/gitee/dorive/example/dal/mapper/SysUserMapper.java similarity index 63% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserMapper.java rename to src/main/java/com/gitee/dorive/example/dal/mapper/SysUserMapper.java index a990505..ab2ae3b 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserMapper.java +++ b/src/main/java/com/gitee/dorive/example/dal/mapper/SysUserMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.dal.mapper; +package com.gitee.dorive.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.SysUser; +import com.gitee.dorive.example.dal.pojo.SysUser; /** * 用户表 diff --git a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserRoleMapper.java b/src/main/java/com/gitee/dorive/example/dal/mapper/SysUserRoleMapper.java similarity index 64% rename from src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserRoleMapper.java rename to src/main/java/com/gitee/dorive/example/dal/mapper/SysUserRoleMapper.java index 462c64c..62c1110 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/mapper/SysUserRoleMapper.java +++ b/src/main/java/com/gitee/dorive/example/dal/mapper/SysUserRoleMapper.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.dal.mapper; +package com.gitee.dorive.example.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.spring.domain.example.dal.pojo.SysUserRole; +import com.gitee.dorive.example.dal.pojo.SysUserRole; /** * 用户角色绑定表 diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysApi.java b/src/main/java/com/gitee/dorive/example/dal/pojo/SysApi.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/SysApi.java rename to src/main/java/com/gitee/dorive/example/dal/pojo/SysApi.java index 02ce3a5..65b92f3 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysApi.java +++ b/src/main/java/com/gitee/dorive/example/dal/pojo/SysApi.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.dal.pojo; +package com.gitee.dorive.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysDept.java b/src/main/java/com/gitee/dorive/example/dal/pojo/SysDept.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/SysDept.java rename to src/main/java/com/gitee/dorive/example/dal/pojo/SysDept.java index c74f37e..a84e0f9 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysDept.java +++ b/src/main/java/com/gitee/dorive/example/dal/pojo/SysDept.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.dal.pojo; +package com.gitee.dorive.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysMenu.java b/src/main/java/com/gitee/dorive/example/dal/pojo/SysMenu.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/SysMenu.java rename to src/main/java/com/gitee/dorive/example/dal/pojo/SysMenu.java index a244a7f..3937c32 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysMenu.java +++ b/src/main/java/com/gitee/dorive/example/dal/pojo/SysMenu.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.dal.pojo; +package com.gitee.dorive.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRole.java b/src/main/java/com/gitee/dorive/example/dal/pojo/SysRole.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRole.java rename to src/main/java/com/gitee/dorive/example/dal/pojo/SysRole.java index a007d82..cca45ac 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRole.java +++ b/src/main/java/com/gitee/dorive/example/dal/pojo/SysRole.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.dal.pojo; +package com.gitee.dorive.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleGroup.java b/src/main/java/com/gitee/dorive/example/dal/pojo/SysRoleGroup.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleGroup.java rename to src/main/java/com/gitee/dorive/example/dal/pojo/SysRoleGroup.java index 48bbd57..bb4317a 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleGroup.java +++ b/src/main/java/com/gitee/dorive/example/dal/pojo/SysRoleGroup.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.dal.pojo; +package com.gitee.dorive.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleMenu.java b/src/main/java/com/gitee/dorive/example/dal/pojo/SysRoleMenu.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleMenu.java rename to src/main/java/com/gitee/dorive/example/dal/pojo/SysRoleMenu.java index 6bcd146..6a1e3ab 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysRoleMenu.java +++ b/src/main/java/com/gitee/dorive/example/dal/pojo/SysRoleMenu.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.dal.pojo; +package com.gitee.dorive.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java b/src/main/java/com/gitee/dorive/example/dal/pojo/SysTenant.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java rename to src/main/java/com/gitee/dorive/example/dal/pojo/SysTenant.java index 9f1096e..9494636 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysTenant.java +++ b/src/main/java/com/gitee/dorive/example/dal/pojo/SysTenant.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.dal.pojo; +package com.gitee.dorive.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUser.java b/src/main/java/com/gitee/dorive/example/dal/pojo/SysUser.java similarity index 96% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUser.java rename to src/main/java/com/gitee/dorive/example/dal/pojo/SysUser.java index 6964e18..3b02f16 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUser.java +++ b/src/main/java/com/gitee/dorive/example/dal/pojo/SysUser.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.dal.pojo; +package com.gitee.dorive.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUserRole.java b/src/main/java/com/gitee/dorive/example/dal/pojo/SysUserRole.java similarity index 95% rename from src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUserRole.java rename to src/main/java/com/gitee/dorive/example/dal/pojo/SysUserRole.java index 4769483..b2a7b84 100644 --- a/src/main/java/com/gitee/spring/domain/example/dal/pojo/SysUserRole.java +++ b/src/main/java/com/gitee/dorive/example/dal/pojo/SysUserRole.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.dal.pojo; +package com.gitee.dorive.example.dal.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Api.java b/src/main/java/com/gitee/dorive/example/entity/Api.java similarity index 81% rename from src/main/java/com/gitee/spring/domain/example/entity/Api.java rename to src/main/java/com/gitee/dorive/example/entity/Api.java index 7940619..697b8f9 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Api.java +++ b/src/main/java/com/gitee/dorive/example/entity/Api.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.entity; +package com.gitee.dorive.example.entity; import com.gitee.dorive.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.SysApiMapper; +import com.gitee.dorive.example.dal.mapper.SysApiMapper; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Department.java b/src/main/java/com/gitee/dorive/example/entity/Department.java similarity index 83% rename from src/main/java/com/gitee/spring/domain/example/entity/Department.java rename to src/main/java/com/gitee/dorive/example/entity/Department.java index 776a640..4ac9cc8 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Department.java +++ b/src/main/java/com/gitee/dorive/example/entity/Department.java @@ -1,11 +1,11 @@ -package com.gitee.spring.domain.example.entity; +package com.gitee.dorive.example.entity; import com.gitee.dorive.core.annotation.Binding; import com.gitee.dorive.core.annotation.Bindings; import com.gitee.dorive.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.SysDeptMapper; -import com.gitee.spring.domain.example.dal.mapper.SysTenantMapper; -import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; +import com.gitee.dorive.example.dal.mapper.SysDeptMapper; +import com.gitee.dorive.example.dal.mapper.SysTenantMapper; +import com.gitee.dorive.example.dal.mapper.SysUserMapper; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java b/src/main/java/com/gitee/dorive/example/entity/Menu.java similarity index 86% rename from src/main/java/com/gitee/spring/domain/example/entity/Menu.java rename to src/main/java/com/gitee/dorive/example/entity/Menu.java index 5c438fc..224457f 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Menu.java +++ b/src/main/java/com/gitee/dorive/example/entity/Menu.java @@ -1,10 +1,10 @@ -package com.gitee.spring.domain.example.entity; +package com.gitee.dorive.example.entity; import com.gitee.dorive.core.annotation.Binding; import com.gitee.dorive.core.annotation.Bindings; import com.gitee.dorive.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.SysApiMapper; -import com.gitee.spring.domain.example.dal.mapper.SysMenuMapper; +import com.gitee.dorive.example.dal.mapper.SysApiMapper; +import com.gitee.dorive.example.dal.mapper.SysMenuMapper; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Role.java b/src/main/java/com/gitee/dorive/example/entity/Role.java similarity index 86% rename from src/main/java/com/gitee/spring/domain/example/entity/Role.java rename to src/main/java/com/gitee/dorive/example/entity/Role.java index d6ec2ba..47a3966 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Role.java +++ b/src/main/java/com/gitee/dorive/example/entity/Role.java @@ -1,10 +1,10 @@ -package com.gitee.spring.domain.example.entity; +package com.gitee.dorive.example.entity; import com.gitee.dorive.core.annotation.Binding; import com.gitee.dorive.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.SysRoleMapper; -import com.gitee.spring.domain.example.dal.mapper.SysRoleMenuMapper; -import com.gitee.spring.domain.example.repository.MenuRepository; +import com.gitee.dorive.example.dal.mapper.SysRoleMapper; +import com.gitee.dorive.example.dal.mapper.SysRoleMenuMapper; +import com.gitee.dorive.example.repository.MenuRepository; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java b/src/main/java/com/gitee/dorive/example/entity/RoleGroup.java similarity index 83% rename from src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java rename to src/main/java/com/gitee/dorive/example/entity/RoleGroup.java index 1495426..f69981b 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleGroup.java +++ b/src/main/java/com/gitee/dorive/example/entity/RoleGroup.java @@ -1,10 +1,10 @@ -package com.gitee.spring.domain.example.entity; +package com.gitee.dorive.example.entity; import com.gitee.dorive.core.annotation.Binding; import com.gitee.dorive.core.annotation.Bindings; import com.gitee.dorive.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.SysRoleGroupMapper; -import com.gitee.spring.domain.example.dal.mapper.SysRoleMapper; +import com.gitee.dorive.example.dal.mapper.SysRoleGroupMapper; +import com.gitee.dorive.example.dal.mapper.SysRoleMapper; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java b/src/main/java/com/gitee/dorive/example/entity/RoleMenu.java similarity index 80% rename from src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java rename to src/main/java/com/gitee/dorive/example/entity/RoleMenu.java index 6181a55..c359164 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/RoleMenu.java +++ b/src/main/java/com/gitee/dorive/example/entity/RoleMenu.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.entity; +package com.gitee.dorive.example.entity; import com.gitee.dorive.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.SysRoleMenuMapper; +import com.gitee.dorive.example.dal.mapper.SysRoleMenuMapper; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java b/src/main/java/com/gitee/dorive/example/entity/Tenant.java similarity index 80% rename from src/main/java/com/gitee/spring/domain/example/entity/Tenant.java rename to src/main/java/com/gitee/dorive/example/entity/Tenant.java index b7162ae..1915927 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/Tenant.java +++ b/src/main/java/com/gitee/dorive/example/entity/Tenant.java @@ -1,13 +1,13 @@ -package com.gitee.spring.domain.example.entity; +package com.gitee.dorive.example.entity; import com.gitee.dorive.core.annotation.Binding; import com.gitee.dorive.core.annotation.Bindings; import com.gitee.dorive.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.SysDeptMapper; -import com.gitee.spring.domain.example.dal.mapper.SysRoleGroupMapper; -import com.gitee.spring.domain.example.dal.mapper.SysRoleMapper; -import com.gitee.spring.domain.example.dal.mapper.SysTenantMapper; -import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; +import com.gitee.dorive.example.dal.mapper.SysDeptMapper; +import com.gitee.dorive.example.dal.mapper.SysRoleGroupMapper; +import com.gitee.dorive.example.dal.mapper.SysRoleMapper; +import com.gitee.dorive.example.dal.mapper.SysTenantMapper; +import com.gitee.dorive.example.dal.mapper.SysUserMapper; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/User.java b/src/main/java/com/gitee/dorive/example/entity/User.java similarity index 84% rename from src/main/java/com/gitee/spring/domain/example/entity/User.java rename to src/main/java/com/gitee/dorive/example/entity/User.java index b0b7290..8ce2892 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/User.java +++ b/src/main/java/com/gitee/dorive/example/entity/User.java @@ -1,11 +1,11 @@ -package com.gitee.spring.domain.example.entity; +package com.gitee.dorive.example.entity; import com.gitee.dorive.core.annotation.Binding; import com.gitee.dorive.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; -import com.gitee.spring.domain.example.dal.mapper.SysUserRoleMapper; -import com.gitee.spring.domain.example.impl.factory.UserFactory; -import com.gitee.spring.domain.example.repository.RoleRepository; +import com.gitee.dorive.example.dal.mapper.SysUserMapper; +import com.gitee.dorive.example.dal.mapper.SysUserRoleMapper; +import com.gitee.dorive.example.impl.factory.UserFactory; +import com.gitee.dorive.example.repository.RoleRepository; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserAdmin.java b/src/main/java/com/gitee/dorive/example/entity/UserAdmin.java similarity index 77% rename from src/main/java/com/gitee/spring/domain/example/entity/UserAdmin.java rename to src/main/java/com/gitee/dorive/example/entity/UserAdmin.java index 9b677ae..0b1d04a 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/UserAdmin.java +++ b/src/main/java/com/gitee/dorive/example/entity/UserAdmin.java @@ -1,9 +1,9 @@ -package com.gitee.spring.domain.example.entity; +package com.gitee.dorive.example.entity; import com.gitee.dorive.core.annotation.Binding; import com.gitee.dorive.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; -import com.gitee.spring.domain.example.repository.RoleRepository; +import com.gitee.dorive.example.dal.mapper.SysUserMapper; +import com.gitee.dorive.example.repository.RoleRepository; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java b/src/main/java/com/gitee/dorive/example/entity/UserRole.java similarity index 76% rename from src/main/java/com/gitee/spring/domain/example/entity/UserRole.java rename to src/main/java/com/gitee/dorive/example/entity/UserRole.java index 6af6c66..313f9b1 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/UserRole.java +++ b/src/main/java/com/gitee/dorive/example/entity/UserRole.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.entity; +package com.gitee.dorive.example.entity; import com.gitee.dorive.core.annotation.Entity; -import com.gitee.spring.domain.example.dal.mapper.SysUserRoleMapper; +import com.gitee.dorive.example.dal.mapper.SysUserRoleMapper; import lombok.Data; import java.util.Date; diff --git a/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java b/src/main/java/com/gitee/dorive/example/entity/coating/TenantQuery.java similarity index 74% rename from src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java rename to src/main/java/com/gitee/dorive/example/entity/coating/TenantQuery.java index 6278997..f6cdacf 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/coating/TenantQuery.java +++ b/src/main/java/com/gitee/dorive/example/entity/coating/TenantQuery.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.entity.coating; +package com.gitee.dorive.example.entity.coating; import com.gitee.dorive.coating.annotation.Coating; -import com.gitee.spring.domain.example.entity.Tenant; +import com.gitee.dorive.example.entity.Tenant; import lombok.Data; @Data diff --git a/src/main/java/com/gitee/spring/domain/example/entity/coating/UserQuery.java b/src/main/java/com/gitee/dorive/example/entity/coating/UserQuery.java similarity index 64% rename from src/main/java/com/gitee/spring/domain/example/entity/coating/UserQuery.java rename to src/main/java/com/gitee/dorive/example/entity/coating/UserQuery.java index 3ff4269..a8cc777 100644 --- a/src/main/java/com/gitee/spring/domain/example/entity/coating/UserQuery.java +++ b/src/main/java/com/gitee/dorive/example/entity/coating/UserQuery.java @@ -1,7 +1,7 @@ -package com.gitee.spring.domain.example.entity.coating; +package com.gitee.dorive.example.entity.coating; import com.gitee.dorive.coating.annotation.Coating; -import com.gitee.spring.domain.example.entity.User; +import com.gitee.dorive.example.entity.User; import lombok.Data; @Data diff --git a/src/main/java/com/gitee/spring/domain/example/impl/factory/UserFactory.java b/src/main/java/com/gitee/dorive/example/impl/factory/UserFactory.java similarity index 82% rename from src/main/java/com/gitee/spring/domain/example/impl/factory/UserFactory.java rename to src/main/java/com/gitee/dorive/example/impl/factory/UserFactory.java index 4630a91..4404e4d 100644 --- a/src/main/java/com/gitee/spring/domain/example/impl/factory/UserFactory.java +++ b/src/main/java/com/gitee/dorive/example/impl/factory/UserFactory.java @@ -1,10 +1,10 @@ -package com.gitee.spring.domain.example.impl.factory; +package com.gitee.dorive.example.impl.factory; import cn.hutool.core.bean.BeanUtil; import com.gitee.dorive.core.entity.BoundedContext; import com.gitee.dorive.core.impl.DefaultEntityFactory; -import com.gitee.spring.domain.example.entity.User; -import com.gitee.spring.domain.example.entity.UserAdmin; +import com.gitee.dorive.example.entity.UserAdmin; +import com.gitee.dorive.example.entity.User; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java b/src/main/java/com/gitee/dorive/example/impl/listener/TenantListener.java similarity index 91% rename from src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java rename to src/main/java/com/gitee/dorive/example/impl/listener/TenantListener.java index 9485bda..04b2708 100644 --- a/src/main/java/com/gitee/spring/domain/example/impl/listener/TenantListener.java +++ b/src/main/java/com/gitee/dorive/example/impl/listener/TenantListener.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.impl.listener; +package com.gitee.dorive.example.impl.listener; import com.gitee.dorive.core.entity.operation.Insert; import com.gitee.dorive.core.entity.operation.Operation; @@ -6,7 +6,7 @@ import com.gitee.dorive.core.entity.operation.Update; import com.gitee.dorive.event.annotation.Listener; import com.gitee.dorive.event.api.EntityListener; import com.gitee.dorive.event.entity.RepositoryEvent; -import com.gitee.spring.domain.example.entity.Tenant; +import com.gitee.dorive.example.entity.Tenant; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java b/src/main/java/com/gitee/dorive/example/impl/service/DataService.java similarity index 90% rename from src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java rename to src/main/java/com/gitee/dorive/example/impl/service/DataService.java index acf7e72..76f9d10 100644 --- a/src/main/java/com/gitee/spring/domain/example/impl/service/DataService.java +++ b/src/main/java/com/gitee/dorive/example/impl/service/DataService.java @@ -1,23 +1,23 @@ -package com.gitee.spring.domain.example.impl.service; +package com.gitee.dorive.example.impl.service; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.core.entity.BoundedContext; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.spring.domain.example.entity.Api; -import com.gitee.spring.domain.example.entity.Department; -import com.gitee.spring.domain.example.entity.Menu; -import com.gitee.spring.domain.example.entity.Role; -import com.gitee.spring.domain.example.entity.RoleGroup; -import com.gitee.spring.domain.example.entity.RoleMenu; -import com.gitee.spring.domain.example.entity.Tenant; -import com.gitee.spring.domain.example.entity.User; -import com.gitee.spring.domain.example.entity.UserRole; -import com.gitee.spring.domain.example.repository.MenuRepository; -import com.gitee.spring.domain.example.repository.RoleRepository; -import com.gitee.spring.domain.example.repository.TenantRepository; -import com.gitee.spring.domain.example.repository.UserRepository; +import com.gitee.dorive.example.entity.RoleMenu; +import com.gitee.dorive.example.entity.UserRole; +import com.gitee.dorive.example.entity.Api; +import com.gitee.dorive.example.entity.Department; +import com.gitee.dorive.example.entity.Menu; +import com.gitee.dorive.example.entity.Role; +import com.gitee.dorive.example.entity.RoleGroup; +import com.gitee.dorive.example.entity.Tenant; +import com.gitee.dorive.example.entity.User; +import com.gitee.dorive.example.repository.MenuRepository; +import com.gitee.dorive.example.repository.RoleRepository; +import com.gitee.dorive.example.repository.TenantRepository; +import com.gitee.dorive.example.repository.UserRepository; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java b/src/main/java/com/gitee/dorive/example/repository/DepartmentRepository.java similarity index 78% rename from src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java rename to src/main/java/com/gitee/dorive/example/repository/DepartmentRepository.java index 5165a5b..b681c14 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/DepartmentRepository.java +++ b/src/main/java/com/gitee/dorive/example/repository/DepartmentRepository.java @@ -1,8 +1,8 @@ -package com.gitee.spring.domain.example.repository; +package com.gitee.dorive.example.repository; +import com.gitee.dorive.example.entity.Department; import com.gitee.spring.boot.starter.dorive.annotation.RootRepository; import com.gitee.spring.boot.starter.dorive.repository.MybatisPlusRepository; -import com.gitee.spring.domain.example.entity.Department; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java b/src/main/java/com/gitee/dorive/example/repository/MenuRepository.java similarity index 79% rename from src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java rename to src/main/java/com/gitee/dorive/example/repository/MenuRepository.java index b6cc697..fb72250 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/MenuRepository.java +++ b/src/main/java/com/gitee/dorive/example/repository/MenuRepository.java @@ -1,8 +1,8 @@ -package com.gitee.spring.domain.example.repository; +package com.gitee.dorive.example.repository; +import com.gitee.dorive.example.entity.Menu; import com.gitee.spring.boot.starter.dorive.annotation.RootRepository; import com.gitee.spring.boot.starter.dorive.repository.MybatisPlusRepository; -import com.gitee.spring.domain.example.entity.Menu; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java b/src/main/java/com/gitee/dorive/example/repository/RoleGroupRepository.java similarity index 78% rename from src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java rename to src/main/java/com/gitee/dorive/example/repository/RoleGroupRepository.java index da5fdfb..e1a2ab6 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/RoleGroupRepository.java +++ b/src/main/java/com/gitee/dorive/example/repository/RoleGroupRepository.java @@ -1,8 +1,8 @@ -package com.gitee.spring.domain.example.repository; +package com.gitee.dorive.example.repository; +import com.gitee.dorive.example.entity.RoleGroup; import com.gitee.spring.boot.starter.dorive.annotation.RootRepository; import com.gitee.spring.boot.starter.dorive.repository.MybatisPlusRepository; -import com.gitee.spring.domain.example.entity.RoleGroup; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java b/src/main/java/com/gitee/dorive/example/repository/RoleRepository.java similarity index 79% rename from src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java rename to src/main/java/com/gitee/dorive/example/repository/RoleRepository.java index 5bba109..2cbae28 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/RoleRepository.java +++ b/src/main/java/com/gitee/dorive/example/repository/RoleRepository.java @@ -1,8 +1,8 @@ -package com.gitee.spring.domain.example.repository; +package com.gitee.dorive.example.repository; +import com.gitee.dorive.example.entity.Role; import com.gitee.spring.boot.starter.dorive.annotation.RootRepository; import com.gitee.spring.boot.starter.dorive.repository.MybatisPlusRepository; -import com.gitee.spring.domain.example.entity.Role; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java b/src/main/java/com/gitee/dorive/example/repository/TenantRepository.java similarity index 75% rename from src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java rename to src/main/java/com/gitee/dorive/example/repository/TenantRepository.java index c2255eb..f53ca31 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/TenantRepository.java +++ b/src/main/java/com/gitee/dorive/example/repository/TenantRepository.java @@ -1,10 +1,10 @@ -package com.gitee.spring.domain.example.repository; +package com.gitee.dorive.example.repository; +import com.gitee.dorive.example.entity.Tenant; import com.gitee.spring.boot.starter.dorive.annotation.RootRepository; import com.gitee.spring.boot.starter.dorive.repository.MybatisPlusRepository; import com.gitee.dorive.coating.annotation.CoatingScan; import com.gitee.dorive.event.annotation.EnableEvent; -import com.gitee.spring.domain.example.entity.Tenant; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -14,6 +14,6 @@ import lombok.EqualsAndHashCode; @RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) -@CoatingScan("com.gitee.spring.domain.example.entity.coating") +@CoatingScan("com.gitee.dorive.example.entity.coating") public class TenantRepository extends MybatisPlusRepository { } diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserAdminRepository.java b/src/main/java/com/gitee/dorive/example/repository/UserAdminRepository.java similarity index 78% rename from src/main/java/com/gitee/spring/domain/example/repository/UserAdminRepository.java rename to src/main/java/com/gitee/dorive/example/repository/UserAdminRepository.java index 5c8837f..48dec25 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/UserAdminRepository.java +++ b/src/main/java/com/gitee/dorive/example/repository/UserAdminRepository.java @@ -1,8 +1,8 @@ -package com.gitee.spring.domain.example.repository; +package com.gitee.dorive.example.repository; +import com.gitee.dorive.example.entity.UserAdmin; import com.gitee.spring.boot.starter.dorive.annotation.RootRepository; import com.gitee.spring.boot.starter.dorive.repository.MybatisPlusRepository; -import com.gitee.spring.domain.example.entity.UserAdmin; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java b/src/main/java/com/gitee/dorive/example/repository/UserRepository.java similarity index 75% rename from src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java rename to src/main/java/com/gitee/dorive/example/repository/UserRepository.java index 4571122..5137b39 100644 --- a/src/main/java/com/gitee/spring/domain/example/repository/UserRepository.java +++ b/src/main/java/com/gitee/dorive/example/repository/UserRepository.java @@ -1,9 +1,9 @@ -package com.gitee.spring.domain.example.repository; +package com.gitee.dorive.example.repository; import com.gitee.spring.boot.starter.dorive.annotation.RootRepository; import com.gitee.spring.boot.starter.dorive.repository.MybatisPlusRepository; import com.gitee.dorive.coating.annotation.CoatingScan; -import com.gitee.spring.domain.example.entity.User; +import com.gitee.dorive.example.entity.User; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -12,7 +12,7 @@ import lombok.EqualsAndHashCode; @RootRepository @AllArgsConstructor @EqualsAndHashCode(callSuper = false) -@CoatingScan("com.gitee.spring.domain.example.entity.coating") +@CoatingScan("com.gitee.dorive.example.entity.coating") public class UserRepository extends MybatisPlusRepository { private final UserAdminRepository userAdminRepository; } diff --git a/src/main/resources/mapper/SysApiMapper.xml b/src/main/resources/mapper/SysApiMapper.xml index b43097a..0d9df47 100644 --- a/src/main/resources/mapper/SysApiMapper.xml +++ b/src/main/resources/mapper/SysApiMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/SysDeptMapper.xml b/src/main/resources/mapper/SysDeptMapper.xml index e02100a..fa5ab8b 100644 --- a/src/main/resources/mapper/SysDeptMapper.xml +++ b/src/main/resources/mapper/SysDeptMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/SysMenuMapper.xml b/src/main/resources/mapper/SysMenuMapper.xml index 9b5086a..2b6e8ab 100644 --- a/src/main/resources/mapper/SysMenuMapper.xml +++ b/src/main/resources/mapper/SysMenuMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/SysRoleGroupMapper.xml b/src/main/resources/mapper/SysRoleGroupMapper.xml index 3096f2c..d92faec 100644 --- a/src/main/resources/mapper/SysRoleGroupMapper.xml +++ b/src/main/resources/mapper/SysRoleGroupMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/SysRoleMapper.xml b/src/main/resources/mapper/SysRoleMapper.xml index de057f5..50a05d8 100644 --- a/src/main/resources/mapper/SysRoleMapper.xml +++ b/src/main/resources/mapper/SysRoleMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/SysRoleMenuMapper.xml b/src/main/resources/mapper/SysRoleMenuMapper.xml index f1e12a4..19a2757 100644 --- a/src/main/resources/mapper/SysRoleMenuMapper.xml +++ b/src/main/resources/mapper/SysRoleMenuMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/SysTenantMapper.xml b/src/main/resources/mapper/SysTenantMapper.xml index 2f08658..e1b2024 100644 --- a/src/main/resources/mapper/SysTenantMapper.xml +++ b/src/main/resources/mapper/SysTenantMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/SysUserMapper.xml b/src/main/resources/mapper/SysUserMapper.xml index 32e0680..92a2cbf 100644 --- a/src/main/resources/mapper/SysUserMapper.xml +++ b/src/main/resources/mapper/SysUserMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/main/resources/mapper/SysUserRoleMapper.xml b/src/main/resources/mapper/SysUserRoleMapper.xml index 1fb5f03..b40c78e 100644 --- a/src/main/resources/mapper/SysUserRoleMapper.xml +++ b/src/main/resources/mapper/SysUserRoleMapper.xml @@ -1,7 +1,7 @@ - - + + diff --git a/src/test/java/com/gitee/spring/domain/example/DataTest.java b/src/test/java/com/gitee/dorive/example/DataTest.java similarity index 89% rename from src/test/java/com/gitee/spring/domain/example/DataTest.java rename to src/test/java/com/gitee/dorive/example/DataTest.java index 2f17999..1383882 100644 --- a/src/test/java/com/gitee/spring/domain/example/DataTest.java +++ b/src/test/java/com/gitee/dorive/example/DataTest.java @@ -1,6 +1,6 @@ -package com.gitee.spring.domain.example; +package com.gitee.dorive.example; -import com.gitee.spring.domain.example.impl.service.DataService; +import com.gitee.dorive.example.impl.service.DataService; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; diff --git a/src/test/java/com/gitee/spring/domain/example/common/BinderTest.java b/src/test/java/com/gitee/dorive/example/common/BinderTest.java similarity index 93% rename from src/test/java/com/gitee/spring/domain/example/common/BinderTest.java rename to src/test/java/com/gitee/dorive/example/common/BinderTest.java index 7d7dca5..8650b6d 100644 --- a/src/test/java/com/gitee/spring/domain/example/common/BinderTest.java +++ b/src/test/java/com/gitee/dorive/example/common/BinderTest.java @@ -1,11 +1,11 @@ -package com.gitee.spring.domain.example.common; +package com.gitee.dorive.example.common; import com.gitee.dorive.core.api.Binder; import com.gitee.dorive.core.impl.binder.ContextBinder; import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.ConfiguredRepository; -import com.gitee.spring.domain.example.repository.DepartmentRepository; +import com.gitee.dorive.example.repository.DepartmentRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/gitee/spring/domain/example/common/EventTest.java b/src/test/java/com/gitee/dorive/example/common/EventTest.java similarity index 85% rename from src/test/java/com/gitee/spring/domain/example/common/EventTest.java rename to src/test/java/com/gitee/dorive/example/common/EventTest.java index c58bbc0..ca90824 100644 --- a/src/test/java/com/gitee/spring/domain/example/common/EventTest.java +++ b/src/test/java/com/gitee/dorive/example/common/EventTest.java @@ -1,11 +1,11 @@ -package com.gitee.spring.domain.example.common; +package com.gitee.dorive.example.common; import cn.hutool.json.JSONUtil; import com.gitee.dorive.core.entity.BoundedContext; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.spring.domain.example.entity.Tenant; -import com.gitee.spring.domain.example.impl.listener.TenantListener; -import com.gitee.spring.domain.example.repository.TenantRepository; +import com.gitee.dorive.example.entity.Tenant; +import com.gitee.dorive.example.impl.listener.TenantListener; +import com.gitee.dorive.example.repository.TenantRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; diff --git a/src/test/java/com/gitee/spring/domain/example/common/ProxyTest.java b/src/test/java/com/gitee/dorive/example/common/ProxyTest.java similarity index 95% rename from src/test/java/com/gitee/spring/domain/example/common/ProxyTest.java rename to src/test/java/com/gitee/dorive/example/common/ProxyTest.java index a466cde..51178ee 100644 --- a/src/test/java/com/gitee/spring/domain/example/common/ProxyTest.java +++ b/src/test/java/com/gitee/dorive/example/common/ProxyTest.java @@ -1,9 +1,9 @@ -package com.gitee.spring.domain.example.common; +package com.gitee.dorive.example.common; import cn.hutool.core.util.ReflectUtil; import com.gitee.dorive.core.api.PropertyProxy; import com.gitee.dorive.core.impl.PropertyProxyFactory; -import com.gitee.spring.domain.example.entity.Department; +import com.gitee.dorive.example.entity.Department; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; diff --git a/src/test/java/com/gitee/spring/domain/example/crud/CreateTest.java b/src/test/java/com/gitee/dorive/example/crud/CreateTest.java similarity index 95% rename from src/test/java/com/gitee/spring/domain/example/crud/CreateTest.java rename to src/test/java/com/gitee/dorive/example/crud/CreateTest.java index 0c05dc5..55ebb02 100644 --- a/src/test/java/com/gitee/spring/domain/example/crud/CreateTest.java +++ b/src/test/java/com/gitee/dorive/example/crud/CreateTest.java @@ -1,13 +1,13 @@ -package com.gitee.spring.domain.example.crud; +package com.gitee.dorive.example.crud; import com.gitee.dorive.core.entity.BoundedContext; import com.gitee.dorive.core.entity.Command; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.spring.domain.example.entity.Department; -import com.gitee.spring.domain.example.entity.Tenant; -import com.gitee.spring.domain.example.impl.listener.TenantListener; -import com.gitee.spring.domain.example.repository.DepartmentRepository; -import com.gitee.spring.domain.example.repository.TenantRepository; +import com.gitee.dorive.example.entity.Department; +import com.gitee.dorive.example.entity.Tenant; +import com.gitee.dorive.example.impl.listener.TenantListener; +import com.gitee.dorive.example.repository.DepartmentRepository; +import com.gitee.dorive.example.repository.TenantRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; diff --git a/src/test/java/com/gitee/spring/domain/example/crud/DeleteTest.java b/src/test/java/com/gitee/dorive/example/crud/DeleteTest.java similarity index 95% rename from src/test/java/com/gitee/spring/domain/example/crud/DeleteTest.java rename to src/test/java/com/gitee/dorive/example/crud/DeleteTest.java index c4fa561..2677b34 100644 --- a/src/test/java/com/gitee/spring/domain/example/crud/DeleteTest.java +++ b/src/test/java/com/gitee/dorive/example/crud/DeleteTest.java @@ -1,9 +1,9 @@ -package com.gitee.spring.domain.example.crud; +package com.gitee.dorive.example.crud; import com.gitee.dorive.core.entity.BoundedContext; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.spring.domain.example.entity.Tenant; -import com.gitee.spring.domain.example.repository.TenantRepository; +import com.gitee.dorive.example.entity.Tenant; +import com.gitee.dorive.example.repository.TenantRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; diff --git a/src/test/java/com/gitee/spring/domain/example/crud/ReadTest.java b/src/test/java/com/gitee/dorive/example/crud/ReadTest.java similarity index 87% rename from src/test/java/com/gitee/spring/domain/example/crud/ReadTest.java rename to src/test/java/com/gitee/dorive/example/crud/ReadTest.java index c9012da..64c61e5 100644 --- a/src/test/java/com/gitee/spring/domain/example/crud/ReadTest.java +++ b/src/test/java/com/gitee/dorive/example/crud/ReadTest.java @@ -1,4 +1,4 @@ -package com.gitee.spring.domain.example.crud; +package com.gitee.dorive.example.crud; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; @@ -6,26 +6,26 @@ import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.gitee.dorive.core.entity.BoundedContext; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.spring.domain.example.dal.mapper.SysApiMapper; -import com.gitee.spring.domain.example.dal.mapper.SysRoleMenuMapper; -import com.gitee.spring.domain.example.dal.mapper.SysUserMapper; -import com.gitee.spring.domain.example.dal.mapper.SysUserRoleMapper; -import com.gitee.spring.domain.example.dal.pojo.SysApi; -import com.gitee.spring.domain.example.dal.pojo.SysRoleMenu; -import com.gitee.spring.domain.example.dal.pojo.SysUser; -import com.gitee.spring.domain.example.dal.pojo.SysUserRole; -import com.gitee.spring.domain.example.entity.Api; -import com.gitee.spring.domain.example.entity.Menu; -import com.gitee.spring.domain.example.entity.Role; -import com.gitee.spring.domain.example.entity.RoleMenu; -import com.gitee.spring.domain.example.entity.Tenant; -import com.gitee.spring.domain.example.entity.User; -import com.gitee.spring.domain.example.entity.UserAdmin; -import com.gitee.spring.domain.example.entity.UserRole; -import com.gitee.spring.domain.example.entity.coating.TenantQuery; -import com.gitee.spring.domain.example.entity.coating.UserQuery; -import com.gitee.spring.domain.example.repository.TenantRepository; -import com.gitee.spring.domain.example.repository.UserRepository; +import com.gitee.dorive.example.dal.mapper.SysApiMapper; +import com.gitee.dorive.example.dal.mapper.SysRoleMenuMapper; +import com.gitee.dorive.example.dal.mapper.SysUserMapper; +import com.gitee.dorive.example.dal.mapper.SysUserRoleMapper; +import com.gitee.dorive.example.dal.pojo.SysApi; +import com.gitee.dorive.example.dal.pojo.SysRoleMenu; +import com.gitee.dorive.example.dal.pojo.SysUser; +import com.gitee.dorive.example.dal.pojo.SysUserRole; +import com.gitee.dorive.example.entity.Api; +import com.gitee.dorive.example.entity.Menu; +import com.gitee.dorive.example.entity.Role; +import com.gitee.dorive.example.entity.RoleMenu; +import com.gitee.dorive.example.entity.Tenant; +import com.gitee.dorive.example.entity.User; +import com.gitee.dorive.example.entity.UserAdmin; +import com.gitee.dorive.example.entity.UserRole; +import com.gitee.dorive.example.entity.coating.TenantQuery; +import com.gitee.dorive.example.entity.coating.UserQuery; +import com.gitee.dorive.example.repository.TenantRepository; +import com.gitee.dorive.example.repository.UserRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; diff --git a/src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java b/src/test/java/com/gitee/dorive/example/crud/UpdateTest.java similarity index 93% rename from src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java rename to src/test/java/com/gitee/dorive/example/crud/UpdateTest.java index 772d089..5bc7553 100644 --- a/src/test/java/com/gitee/spring/domain/example/crud/UpdateTest.java +++ b/src/test/java/com/gitee/dorive/example/crud/UpdateTest.java @@ -1,10 +1,10 @@ -package com.gitee.spring.domain.example.crud; +package com.gitee.dorive.example.crud; import com.gitee.dorive.core.entity.BoundedContext; import com.gitee.dorive.core.entity.Command; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.spring.domain.example.entity.Tenant; -import com.gitee.spring.domain.example.repository.TenantRepository; +import com.gitee.dorive.example.entity.Tenant; +import com.gitee.dorive.example.repository.TenantRepository; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.MethodOrderer; -- Gitee From 390d5b8e5af4bdb6904e414359758fad6c525049 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 25 Nov 2022 18:01:04 +0800 Subject: [PATCH 42/42] =?UTF-8?q?=E3=80=90=E4=BC=98=E5=8C=96=E3=80=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8C=85=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7e945c2..2b67830 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.gitee.digital-engine - spring-domain-example + dorive-example 1.0.0 -- Gitee