From 86c35136ce94ed81d6f2bf99162b7fec0af0d10e Mon Sep 17 00:00:00 2001 From: zhou-hao Date: Thu, 13 May 2021 16:48:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0DimensionTerm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...AuthorizationServiceAutoConfiguration.java | 6 +- .../defaults/service/terms/DimensionTerm.java | 87 +++++++++++++++++++ .../service/terms/UserDimensionTerm.java | 2 +- 3 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/terms/DimensionTerm.java diff --git a/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/configuration/AuthorizationServiceAutoConfiguration.java b/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/configuration/AuthorizationServiceAutoConfiguration.java index 5526487b9..92c3ad910 100644 --- a/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/configuration/AuthorizationServiceAutoConfiguration.java +++ b/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/configuration/AuthorizationServiceAutoConfiguration.java @@ -7,8 +7,8 @@ import org.hswebframework.web.authorization.simple.DefaultAuthorizationAutoConfi import org.hswebframework.web.system.authorization.api.UserDimensionProvider; import org.hswebframework.web.system.authorization.api.service.reactive.ReactiveUserService; import org.hswebframework.web.system.authorization.defaults.service.*; +import org.hswebframework.web.system.authorization.defaults.service.terms.DimensionTerm; import org.hswebframework.web.system.authorization.defaults.service.terms.UserDimensionTerm; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Bean; @@ -76,6 +76,10 @@ public class AuthorizationServiceAutoConfiguration { return new UserDimensionTerm(); } + @Bean + public DimensionTerm dimensionTerm(){ + return new DimensionTerm(); + } @Bean public PermissionProperties permissionProperties(){ return new PermissionProperties(); diff --git a/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/terms/DimensionTerm.java b/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/terms/DimensionTerm.java new file mode 100644 index 000000000..9760376d2 --- /dev/null +++ b/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/terms/DimensionTerm.java @@ -0,0 +1,87 @@ +package org.hswebframework.web.system.authorization.defaults.service.terms; + +import org.apache.commons.collections4.CollectionUtils; +import org.hswebframework.ezorm.core.Conditional; +import org.hswebframework.ezorm.core.dsl.Query; +import org.hswebframework.ezorm.core.param.QueryParam; +import org.hswebframework.ezorm.core.param.Term; +import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata; +import org.hswebframework.ezorm.rdb.operator.builder.fragments.EmptySqlFragments; +import org.hswebframework.ezorm.rdb.operator.builder.fragments.PrepareSqlFragments; +import org.hswebframework.ezorm.rdb.operator.builder.fragments.SqlFragments; +import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.AbstractTermFragmentBuilder; + +import java.util.List; +import java.util.StringJoiner; +import java.util.stream.Collectors; + +/** + * 查询和用户维度绑定的数据,如: 查询某个用户的机构 + * where id$dimension$org = userID + * + * @author zhouhao + * @since 4.0.10 + */ +public class DimensionTerm extends AbstractTermFragmentBuilder { + public DimensionTerm() { + super("dimension", "和维度关联的数据"); + } + + public static > T inject(T query, + String column, + String dimensionType, + List userId) { + return inject(query, column, dimensionType, false, false, userId); + } + + public static > T inject(T query, + String column, + String dimensionType, + boolean not, + boolean any, + List userId) { + return (T)query.accept(column, createTermType(dimensionType, not, any), userId); + } + + public static String createTermType(String dimensionType, boolean not, boolean any) { + StringJoiner joiner = new StringJoiner("$"); + joiner.add("dimension"); + joiner.add(dimensionType); + if (not) { + joiner.add("not"); + } + if (any) { + joiner.add("any"); + } + return joiner.toString(); + } + + @Override + public SqlFragments createFragments(String columnFullName, RDBColumnMetadata column, Term term) { + + List values = convertList(column, term); + if (values.isEmpty()) { + return EmptySqlFragments.INSTANCE; + } + List options = term.getOptions(); + if (CollectionUtils.isEmpty(options)) { + throw new IllegalArgumentException("查询条件错误,正确格式:" + column.getAlias() + "$dimension${type}$[not]"); + } + PrepareSqlFragments fragments = PrepareSqlFragments.of(); + + if (options.contains("not")) { + fragments.addSql("not "); + } + fragments + .addSql("exists(select 1 from s_dimension_user d where d.dimension_type_id = ? and d.dimension_id =", columnFullName) + .addParameter(options.get(0)); + + if (!options.contains("any")) { + fragments.addSql("and d.user_id in(", values.stream().map(r -> "?").collect(Collectors.joining(",")), ")") + .addParameter(values); + } + + fragments.addSql(")"); + return fragments; + } +} \ No newline at end of file diff --git a/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/terms/UserDimensionTerm.java b/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/terms/UserDimensionTerm.java index 6d952d180..e73bc8028 100644 --- a/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/terms/UserDimensionTerm.java +++ b/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/terms/UserDimensionTerm.java @@ -12,7 +12,7 @@ import java.util.stream.Collectors; public class UserDimensionTerm extends AbstractTermFragmentBuilder { public UserDimensionTerm() { - super("in-dimension", "在维度中的用户"); + super("in-dimension", "在维度中的用户数据"); } @Override