From bd7a77d11975ede7e6e01bd76a7eb6aea1b7a129 Mon Sep 17 00:00:00 2001 From: zhouhao Date: Fri, 28 Jul 2017 16:54:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hsweb-examples/hsweb-examples-simple/pom.xml | 10 +- .../web/example/simple/SpringBootExample.java | 19 ++- .../web/example/simple/TestController.java | 7 +- .../authorization/PersonnelAuthorization.java | 22 +++ .../authorization/relation/Relations.java | 125 +++++++++++++++--- .../relation/SimpleRelations.java | 18 +-- .../organizational/RelationInfoMapper.xml | 20 +-- .../simple/SimplePersonService.java | 5 +- 8 files changed, 173 insertions(+), 53 deletions(-) diff --git a/hsweb-examples/hsweb-examples-simple/pom.xml b/hsweb-examples/hsweb-examples-simple/pom.xml index d6f02ed5b..c01bde1bd 100644 --- a/hsweb-examples/hsweb-examples-simple/pom.xml +++ b/hsweb-examples/hsweb-examples-simple/pom.xml @@ -109,11 +109,11 @@ ${project.version} - - - - - + + org.hswebframework.web + hsweb-authorization-shiro + ${project.version} + diff --git a/hsweb-examples/hsweb-examples-simple/src/main/java/org/hswebframework/web/example/simple/SpringBootExample.java b/hsweb-examples/hsweb-examples-simple/src/main/java/org/hswebframework/web/example/simple/SpringBootExample.java index deb9f4830..59d627e5e 100644 --- a/hsweb-examples/hsweb-examples-simple/src/main/java/org/hswebframework/web/example/simple/SpringBootExample.java +++ b/hsweb-examples/hsweb-examples-simple/src/main/java/org/hswebframework/web/example/simple/SpringBootExample.java @@ -35,10 +35,7 @@ import org.hswebframework.web.service.authorization.AuthorizationSettingService; import org.hswebframework.web.service.authorization.PermissionService; import org.hswebframework.web.service.authorization.RoleService; import org.hswebframework.web.service.authorization.UserService; -import org.hswebframework.web.service.organizational.DepartmentService; -import org.hswebframework.web.service.organizational.OrganizationalService; -import org.hswebframework.web.service.organizational.PersonService; -import org.hswebframework.web.service.organizational.PositionService; +import org.hswebframework.web.service.organizational.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; @@ -143,6 +140,9 @@ public class SpringBootExample @Autowired AuthorizationSettingService authorizationSettingService; + @Autowired + RelationInfoService relationInfoService; + public static void main(String[] args) { SpringApplication.run(SpringBootExample.class); } @@ -269,5 +269,16 @@ public class SpringBootExample personEntity.setPersonUser(personUserEntity); personService.insert(personEntity); + + RelationInfoEntity relationInfo = relationInfoService.createEntity(); + + relationInfo.setRelationFrom(personEntity.getId()); + relationInfo.setRelationTo("zhangsan"); + relationInfo.setRelationTypeFrom("person"); + relationInfo.setRelationTypeTo("person"); + relationInfo.setStatus(DataStatus.STATUS_ENABLED); + relationInfo.setRelationId("leader"); + relationInfoService.insert(relationInfo); + } } diff --git a/hsweb-examples/hsweb-examples-simple/src/main/java/org/hswebframework/web/example/simple/TestController.java b/hsweb-examples/hsweb-examples-simple/src/main/java/org/hswebframework/web/example/simple/TestController.java index e2492f3d9..0a66cbf95 100644 --- a/hsweb-examples/hsweb-examples-simple/src/main/java/org/hswebframework/web/example/simple/TestController.java +++ b/hsweb-examples/hsweb-examples-simple/src/main/java/org/hswebframework/web/example/simple/TestController.java @@ -37,7 +37,12 @@ public class TestController implements QueryController relations.findPos("leader")) + .orElse(null)); } @GetMapping("/test2") diff --git a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/PersonnelAuthorization.java b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/PersonnelAuthorization.java index ce969b53a..a5329c085 100644 --- a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/PersonnelAuthorization.java +++ b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/PersonnelAuthorization.java @@ -35,7 +35,29 @@ public interface PersonnelAuthorization extends Serializable { Personnel getPersonnel(); /** + * 获取人员的关系信息 + *
+     *     boolean isLeader = PersonnelAuthorization
+     *     .current().get()
+     *     .getRelations()
+     *     // 和张三的人员为leader关系, 我是张三的leader
+     *     .has("leader","人员","张三");
+     *     //我是开发部的leader
+     *     //.has("leader","部门","开发部");
+     *     //反转关系: 张三是我的leader
+     *     //.has("leader","人员","张三","PRE");
+     * 
+ *
+     *     List relations= PersonnelAuthorization.current()
+     *     //查找用户关系
+     *     .map(PersonnelAuthorization::getRelations)
+     *     .map(relations -> relations.findAll("leader"))
+     *     .orElse(null)
+     * 
+ * * @return 人员关系信息 + * @see Relations + * @see org.hswebframework.web.organizational.authorization.relation.Relation */ Relations getRelations(); diff --git a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/Relations.java b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/Relations.java index c36f738a2..5075f23c3 100644 --- a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/Relations.java +++ b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/Relations.java @@ -35,13 +35,27 @@ public interface Relations extends Serializable { * @return 是否存在关系 */ default boolean has(String relation, String type, String to, Relation.Direction direction) { - return getAllRelations().stream().anyMatch(rel -> + return getAll().stream().anyMatch(rel -> rel.getRelation().equals(relation) && rel.getType().equals(type) && rel.getTarget().equals(to) && rel.matchDirection(direction)); } + default boolean has(String relation, String type, Relation.Direction direction) { + return getAll().stream().anyMatch(rel -> + rel.getRelation().equals(relation) + && rel.getType().equals(type) + && rel.matchDirection(direction)); + } + + + default boolean has(String relation, Relation.Direction direction) { + return getAll().stream().anyMatch(rel -> + rel.getRelation().equals(relation) + && rel.matchDirection(direction)); + } + /** * @see this#has(String, String, String, Relation.Direction) */ @@ -54,19 +68,63 @@ public interface Relations extends Serializable { * * @see this#has(String, String, String, Relation.Direction) */ - default boolean has(String relation, String type, String to) { + default boolean has(String relation) { + return !findAll(relation).isEmpty(); + } + + default boolean hasRev(String relation, String type, String to) { + return has(relation, type, to, Relation.Direction.REVERSE); + } + + default boolean hasPos(String relation, String type, String to) { return has(relation, type, to, Relation.Direction.POSITIVE); } + default boolean hasRev(String relation, String type) { + return has(relation, type, Relation.Direction.REVERSE); + } + + default boolean hasPos(String relation, String type) { + return has(relation, type, Relation.Direction.POSITIVE); + } + + default boolean hasPos(String relation) { + return has(relation, Relation.Direction.POSITIVE); + } + + default boolean hasRev(String relation) { + return has(relation, Relation.Direction.REVERSE); + } + /** * 获取指定关系的全部关系信息 * - * @param relation 关系标识 + * @param relation 关系标识,如: leader * @return 关系信息集合,如果关系不存在,返回空集合 - * @see this#findRelations(Predicate) + * @see this#find(Predicate) */ - default List getRelations(String relation) { - return findRelations(rel -> rel.getRelation().equals(relation)); + default List findAll(String relation) { + return find(rel -> rel.getRelation().equals(relation)); + } + + /** + * 获取正向关系,如: 我是xxx的relation + * + * @param relation 关系标识,如: leader + * @return 关系信息集合,如果关系不存在,返回空集合 + */ + default List findRev(String relation) { + return find(relation, Relation.Direction.REVERSE); + } + + /** + * 获取反向关系,如: xxx是我的relation + * + * @param relation 关系标识,如: leader + * @return 关系信息集合,如果关系不存在,返回空集合 + */ + default List findPos(String relation) { + return find(relation, Relation.Direction.REVERSE); } /** @@ -76,8 +134,8 @@ public interface Relations extends Serializable { * @param direction 关系方向 * @return 关系信息集合,如果关系不存在,返回空集合 */ - default List getRelations(String relation, Relation.Direction direction) { - return findRelations(rel -> rel.getRelation().equals(relation) && rel.matchDirection(direction)); + default List find(String relation, Relation.Direction direction) { + return find(rel -> rel.getRelation().equals(relation) && rel.matchDirection(direction)); } /** @@ -86,10 +144,34 @@ public interface Relations extends Serializable { * @param relation 关系标识,例如: leader * @param type 关系类型,例如:person * @return 关系信息集合,如果关系不存在,返回空集合 - * @see this#findRelations(Predicate) + * @see this#find(Predicate) */ - default List getRelations(String relation, String type) { - return findRelations(rel -> rel.getRelation().equals(relation) && rel.getType().equals(type)); + default List findAll(String relation, String type) { + return find(rel -> rel.getRelation().equals(relation) && rel.getType().equals(type)); + } + + /** + * 获取指定关系和类型以及方向反向关系 + * + * @param relation 关系标识,例如: leader + * @param type 关系类型,例如:person + * @return 关系信息集合,如果关系不存在,返回空集合 + * @see this#find(String, String, Relation.Direction) + */ + default List findRev(String relation, String type) { + return find(relation, type, Relation.Direction.REVERSE); + } + + /** + * 获取指定关系和类型以及方向正向关系 + * + * @param relation 关系标识,例如: leader + * @param type 关系类型,例如:person + * @return 关系信息集合,如果关系不存在,返回空集合 + * @see this#find(String, String, Relation.Direction) + */ + default List findPos(String relation, String type) { + return find(relation, type, Relation.Direction.POSITIVE); } /** @@ -99,38 +181,37 @@ public interface Relations extends Serializable { * @param type 关系类型,例如:person * @param direction 关系方向 * @return 关系信息集合,如果关系不存在,返回空集合 - * @see this#findRelations(Predicate) + * @see this#find(Predicate) */ - default List getRelations(String relation, String type, Relation.Direction direction) { - return findRelations(rel -> + default List find(String relation, String type, Relation.Direction direction) { + return find(rel -> rel.getRelation().equals(relation) && rel.getType().equals(type) && rel.matchDirection(direction)); } /** - * @see this#getRelations(String, String, Relation.Direction) + * @see this#find(String, String, Relation.Direction) */ - default List getRelations(String relation, String type,String direction) { - return getRelations(relation,type, Relation.Direction.fromString(direction)); + default List find(String relation, String type, String direction) { + return find(relation, type, Relation.Direction.fromString(direction)); } /** * 查找关系 *
-     *     findRelations(rel->rel.getType().equals("person"))
+     *     findAll(rel->rel.getType().equals("person"))
      * 
* * @param predicate 查找的判断逻辑 * @return 满足条件的关系信息集合,如果全部不满足则返回空集合 */ - default List findRelations(Predicate predicate) { - return getAllRelations().stream().filter(predicate).collect(Collectors.toList()); + default List find(Predicate predicate) { + return getAll().stream().filter(predicate).collect(Collectors.toList()); } /** - * * @return 全部关系信息,如果一个也没有返回空集合 */ - List getAllRelations(); + List getAll(); } diff --git a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/SimpleRelations.java b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/SimpleRelations.java index a200f5f38..8d6f3df0e 100644 --- a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/SimpleRelations.java +++ b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/SimpleRelations.java @@ -8,23 +8,23 @@ import java.util.Objects; * @author zhouhao */ public class SimpleRelations implements Relations { - private List relations; + private List all; @Override - public List getAllRelations() { - if (null == relations) relations = new ArrayList<>(); - return relations; + public List getAll() { + if (null == all) all = new ArrayList<>(); + return all; } - public void setRelations(List relations) { - Objects.requireNonNull(relations); - this.relations = relations; + public void setAll(List all) { + Objects.requireNonNull(all); + this.all = all; } public SimpleRelations() { } - public SimpleRelations(List relations) { - this.relations = relations; + public SimpleRelations(List all) { + this.all = all; } } diff --git a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-dao/hsweb-system-organizational-dao-mybatis/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/organizational/RelationInfoMapper.xml b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-dao/hsweb-system-organizational-dao-mybatis/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/organizational/RelationInfoMapper.xml index a09af3c7d..98cb0b9de 100644 --- a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-dao/hsweb-system-organizational-dao-mybatis/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/organizational/RelationInfoMapper.xml +++ b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-dao/hsweb-system-organizational-dao-mybatis/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/organizational/RelationInfoMapper.xml @@ -3,14 +3,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://www.mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - + + + + + + + + @@ -18,8 +18,8 @@ - - + + diff --git a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-simple/src/main/java/org/hswebframework/web/service/organizational/simple/SimplePersonService.java b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-simple/src/main/java/org/hswebframework/web/service/organizational/simple/SimplePersonService.java index c2dabb320..4ed419545 100644 --- a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-simple/src/main/java/org/hswebframework/web/service/organizational/simple/SimplePersonService.java +++ b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-simple/src/main/java/org/hswebframework/web/service/organizational/simple/SimplePersonService.java @@ -31,6 +31,7 @@ import org.hswebframework.web.organizational.authorization.TreeNode; import org.hswebframework.web.organizational.authorization.relation.Relation; import org.hswebframework.web.organizational.authorization.relation.SimpleRelation; import org.hswebframework.web.organizational.authorization.relation.SimpleRelations; +import org.hswebframework.web.organizational.authorization.simple.SimplePersonnel; import org.hswebframework.web.organizational.authorization.simple.SimplePersonnelAuthorization; import org.hswebframework.web.service.DefaultDSLQueryService; import org.hswebframework.web.service.EnableCacheGenericEntityService; @@ -225,7 +226,7 @@ public class SimplePersonService extends EnableCacheGenericEntityService - //relation.setName(info.getRelationId()); + relation.setRelation(info.getRelationId()); if (personId.equals(info.getRelationFrom())) { relation.setDirection(Relation.Direction.POSITIVE); } else {