feat:优化权限和角色
This commit is contained in:
parent
2b995f5d56
commit
8e058eb5c3
@ -1,7 +1,7 @@
|
||||
package com.flyfish.framework.domain;
|
||||
|
||||
import com.flyfish.framework.domain.tree.TreeQo;
|
||||
import com.flyfish.framework.domain.po.Department;
|
||||
import com.flyfish.framework.domain.tree.TreeQo;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@ -14,4 +14,8 @@ import lombok.Setter;
|
||||
@Setter
|
||||
public class DepartmentQo extends TreeQo<Department> {
|
||||
|
||||
/**
|
||||
* 额外的参数,仅针对getList指定,一般用于回显父级部门
|
||||
*/
|
||||
private String additional;
|
||||
}
|
||||
|
@ -6,6 +6,8 @@ import com.flyfish.framework.domain.po.Role;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 角色查询实体
|
||||
*
|
||||
@ -15,10 +17,21 @@ import lombok.Setter;
|
||||
@Setter
|
||||
public class RoleQo extends NameLikeQo<Role> {
|
||||
|
||||
/**
|
||||
* 是否仅管理员可选
|
||||
*/
|
||||
private Boolean admin;
|
||||
|
||||
/**
|
||||
* 是否系统内置
|
||||
*/
|
||||
private Boolean system;
|
||||
|
||||
/**
|
||||
* 额外的查询拼接,仅用于getList,用于查询回显
|
||||
*/
|
||||
private List<String> additions;
|
||||
|
||||
@Override
|
||||
public CriteriaBuilder<Role> criteriaBuilder() {
|
||||
return super.criteriaBuilder().with("admin", "system");
|
||||
|
@ -10,6 +10,7 @@ import com.flyfish.framework.service.impl.BaseReactiveServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.BooleanUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.data.mongodb.core.ReactiveMongoOperations;
|
||||
import org.springframework.data.mongodb.core.aggregation.Aggregation;
|
||||
import org.springframework.data.mongodb.core.query.Criteria;
|
||||
@ -19,10 +20,14 @@ import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.apache.commons.lang3.ObjectUtils.defaultIfNull;
|
||||
|
||||
/**
|
||||
* 部门服务
|
||||
*
|
||||
@ -65,7 +70,9 @@ public class DepartmentService extends BaseReactiveServiceImpl<Department> {
|
||||
*/
|
||||
private Mono<Integer> getMinDepthInIds(Collection<String> codes) {
|
||||
return reactiveMongoOperations.aggregate(
|
||||
Aggregation.newAggregation(Aggregation.group().min("depth").as("depth")),
|
||||
Aggregation.newAggregation(
|
||||
Aggregation.match(Criteria.where("_id").in(codes)),
|
||||
Aggregation.group().min("depth").as("depth")),
|
||||
Department.class, Department.class)
|
||||
.single()
|
||||
.map(TreeDomain::getDepth);
|
||||
@ -104,6 +111,12 @@ public class DepartmentService extends BaseReactiveServiceImpl<Department> {
|
||||
if (null == qo.getParentId() && CollectionUtils.isEmpty(qo.getParentIds())) {
|
||||
qo.setIds(userDetails.getVisibleDeparts());
|
||||
}
|
||||
// 如果存在额外的id,追加记录
|
||||
if (StringUtils.isNotBlank(qo.getAdditional())) {
|
||||
Collection<String> ids = defaultIfNull(qo.getIds(), new HashSet<>());
|
||||
ids.add(qo.getAdditional());
|
||||
qo.setIds(ids);
|
||||
}
|
||||
return mono;
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,10 @@ import com.flyfish.framework.domain.po.Permission;
|
||||
import com.flyfish.framework.service.impl.BaseReactiveServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* 权限服务
|
||||
* @author wangyu
|
||||
*/
|
||||
@Service
|
||||
public class PermissionService extends BaseReactiveServiceImpl<Permission> {
|
||||
|
||||
|
@ -2,16 +2,29 @@ package com.flyfish.framework.service;
|
||||
|
||||
|
||||
import com.flyfish.framework.domain.PermissionQo;
|
||||
import com.flyfish.framework.domain.RoleQo;
|
||||
import com.flyfish.framework.domain.base.Domain;
|
||||
import com.flyfish.framework.domain.base.IUser;
|
||||
import com.flyfish.framework.domain.base.Qo;
|
||||
import com.flyfish.framework.domain.po.Permission;
|
||||
import com.flyfish.framework.domain.po.Role;
|
||||
import com.flyfish.framework.enums.RoleType;
|
||||
import com.flyfish.framework.enums.UserType;
|
||||
import com.flyfish.framework.service.impl.BaseReactiveServiceImpl;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.BooleanUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.data.mongodb.core.ReactiveMongoOperations;
|
||||
import org.springframework.data.mongodb.core.query.Criteria;
|
||||
import org.springframework.data.mongodb.core.query.Query;
|
||||
import org.springframework.stereotype.Service;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@ -19,6 +32,8 @@ public class RoleService extends BaseReactiveServiceImpl<Role> {
|
||||
|
||||
private final PermissionService permissionService;
|
||||
|
||||
private final ReactiveMongoOperations reactiveMongoOperations;
|
||||
|
||||
/**
|
||||
* 如果是管理员,设置拥有所有权限
|
||||
*
|
||||
@ -46,4 +61,42 @@ public class RoleService extends BaseReactiveServiceImpl<Role> {
|
||||
return super.create(role);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取创建的主键集合
|
||||
*
|
||||
* @param user 用户
|
||||
* @return 结果
|
||||
*/
|
||||
private Mono<Set<String>> getOwnedIds(IUser user) {
|
||||
Query query = Query.query(Criteria.where("creatorId").is(user.getId()));
|
||||
query.fields().include("_id");
|
||||
return reactiveMongoOperations.find(query, Role.class).map(Domain::getId).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询时,根据用户过滤可见项
|
||||
*
|
||||
* @param query 查询
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public Flux<Role> getList(Qo<Role> query) {
|
||||
// 基于创建者进行筛选
|
||||
if (query instanceof RoleQo) {
|
||||
IUser user = query.getUser();
|
||||
if (user.getType() != UserType.SUPER_ADMIN) {
|
||||
return getOwnedIds(user)
|
||||
.flatMapMany(ids -> {
|
||||
RoleQo qo = (RoleQo) query;
|
||||
qo.setIds(ids);
|
||||
if (CollectionUtils.isEmpty(qo.getAdditions())) {
|
||||
qo.getIds().addAll(qo.getAdditions());
|
||||
}
|
||||
return super.getList(qo);
|
||||
});
|
||||
}
|
||||
}
|
||||
return super.getList(query);
|
||||
}
|
||||
}
|
||||
|
@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.PathVariable;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
@ -69,9 +70,17 @@ public abstract class ReactiveTreeController<T extends TreeDomain<T>, Q extends
|
||||
List<T> roots = filtered.stream()
|
||||
.filter(item -> null != item && TreeDomain.ROOT.equals(item.getParentId()))
|
||||
.collect(Collectors.toList());
|
||||
// 不是从根开始,直接查出
|
||||
// 不是从根开始,找到最小深度结果,直接放在根下
|
||||
if (CollectionUtils.isEmpty(roots)) {
|
||||
return filtered;
|
||||
int depth = filtered.stream()
|
||||
.min(Comparator.comparing(TreeDomain::getDepth))
|
||||
.map(TreeDomain::getDepth)
|
||||
.orElse(0);
|
||||
roots = filtered.stream().filter(d -> d.getDepth() == depth).collect(Collectors.toList());
|
||||
// 如果仍然为空,舍弃,直接返回
|
||||
if (CollectionUtils.isEmpty(roots)) {
|
||||
return filtered;
|
||||
}
|
||||
}
|
||||
// 第四步,根据父id的map填充根tree
|
||||
return applyChildren(roots, group);
|
||||
|
Loading…
Reference in New Issue
Block a user