1. 迁移角色相关逻辑

2. admin-web 接入角色新接口
This commit is contained in:
YunaiV
2020-04-29 00:42:33 +08:00
parent 4e5b6ff2cf
commit 0763551d6d
16 changed files with 174 additions and 126 deletions

View File

@@ -6,16 +6,22 @@ import cn.iocoder.mall.security.core.context.AdminSecurityContextHolder;
import cn.iocoder.mall.system.biz.bo.authorization.ResourceBO;
import cn.iocoder.mall.system.biz.bo.authorization.ResourceTreeNodeBO;
import cn.iocoder.mall.system.biz.dto.authorization.AuthorizationGetResourcesByAccountIdDTO;
import cn.iocoder.mall.system.biz.dto.authorization.AuthorizationGetRoleResourcesDTO;
import cn.iocoder.mall.system.biz.dto.authorization.ResourceGetTreeDTO;
import cn.iocoder.mall.system.biz.enums.authorization.ResourceTypeEnum;
import cn.iocoder.mall.system.biz.service.authorization.AuthorizationService;
import cn.iocoder.mall.system.biz.service.authorization.ResourceService;
import cn.iocoder.mall.system.rest.convert.authorization.AdminsAuthorizationConvert;
import cn.iocoder.mall.system.rest.response.authorization.AdminsAuthorizationMenuTreeResponse;
import cn.iocoder.mall.system.rest.response.authorization.AdminsAuthorizationRoleResourceTreeResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@@ -30,6 +36,8 @@ public class AdminsAuthorizationController {
@Autowired
private AuthorizationService authorizationService;
@Autowired
private ResourceService resourceService;
@GetMapping("/menu-resource-tree")
@ApiOperation(value = "获得当前账号的菜单资源树", notes = "以树结构返回")
@@ -47,4 +55,16 @@ public class AdminsAuthorizationController {
return CommonResult.success(resources.stream().map(ResourceBO::getRoute).collect(Collectors.toSet()));
}
@GetMapping("/role_tree")
@ApiOperation(value = "获得角色拥有的菜单权限", notes = "以树结构返回。注意,返回的资源树是完整的结构,会标记每个资源节点是否被角色所拥有")
@ApiImplicitParam(name = "roleId", value = "角色编号", required = true, example = "1")
public CommonResult<List<AdminsAuthorizationRoleResourceTreeResponse>> roleTree(@RequestParam("roleId") Integer roleId) {
// 1. 获得完整的资源树
List<ResourceTreeNodeBO> resourceTreeNodeBOs = resourceService.getResourceTree(new ResourceGetTreeDTO());
// 2. 获得角色拥有的子树
Set<Integer> roleResourceIds = authorizationService.getRoleResources(new AuthorizationGetRoleResourcesDTO().setRoleId(roleId));
// 3. 拼接,返回结果
return CommonResult.success(AdminsAuthorizationConvert.INSTANCE.convertList(resourceTreeNodeBOs, roleResourceIds));
}
}

View File

@@ -69,40 +69,7 @@ public class AdminsRoleController {
return CommonResult.success(true);
}
// @GetMapping("/role_tree")
// @ApiOperation(value = "获得角色拥有的菜单权限", notes = "以树结构返回")
// @ApiImplicitParam(name = "id", value = "角色编号", required = true, example = "1")
// public CommonResult<List<RoleRoleTreeNodeVO>> roleTree(@RequestParam("id") Integer id) {
// // 芋艿:此处,严格来说可以在校验下角色是否存在。不过呢,校验了也没啥意义,因为一般不存在这个情况,且不会有业务上的影响。并且,反倒多了一次 rpc 调用。
// // 第一步,获得角色拥有的资源数组
// Set<Integer> roleRoles = roleService.getRolesByTypeAndRoleIds(null, CollectionUtil.asSet(id))
// .stream().map(RoleBO::getId).collect(Collectors.toSet());
// // 第二步,获得资源树
// List<RoleBO> allRoles = roleService.getRolesByType(null);
// // 创建 AdminMenuTreeNodeVO Map
// Map<Integer, RoleRoleTreeNodeVO> treeNodeMap = allRoles.stream().collect(Collectors.toMap(RoleBO::getId, RoleConvert.INSTANCE::convert4));
// // 处理父子关系
// treeNodeMap.values().stream()
// .filter(node -> !node.getPid().equals(RoleConstants.PID_ROOT))
// .forEach((childNode) -> {
// // 获得父节点
// RoleRoleTreeNodeVO parentNode = treeNodeMap.get(childNode.getPid());
// if (parentNode.getChildren() == null) { // 初始化 children 数组
// parentNode.setChildren(new ArrayList<>());
// }
// // 将自己添加到父节点中
// parentNode.getChildren().add(childNode);
// });
// // 获得到所有的根节点
// List<RoleRoleTreeNodeVO> rootNodes = treeNodeMap.values().stream()
// .filter(node -> node.getPid().equals(RoleConstants.PID_ROOT))
// .sorted(Comparator.comparing(RoleRoleTreeNodeVO::getSort))
// .collect(Collectors.toList());
// // 第三步,设置角色是否有该角色
// treeNodeMap.values().forEach(nodeVO -> nodeVO.setAssigned(roleRoles.contains(nodeVO.getId())));
// // 返回结果
// return success(rootNodes);
// }
//
// @PostMapping("/assign_role")
// @ApiOperation(value = "分配角色资源")

View File

@@ -3,11 +3,14 @@ package cn.iocoder.mall.system.rest.convert.authorization;
import cn.iocoder.mall.system.biz.bo.authorization.ResourceBO;
import cn.iocoder.mall.system.biz.bo.authorization.ResourceTreeNodeBO;
import cn.iocoder.mall.system.rest.response.authorization.AdminsAuthorizationMenuTreeResponse;
import cn.iocoder.mall.system.rest.response.authorization.AdminsAuthorizationRoleResourceTreeResponse;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@Mapper
public interface AdminsAuthorizationConvert {
@@ -22,6 +25,25 @@ public interface AdminsAuthorizationConvert {
@Mapping(source = "node.icon", target = "icon")
AdminsAuthorizationMenuTreeResponse convert(ResourceTreeNodeBO bean);
@Mapping(source = "node.id", target = "id")
@Mapping(source = "node.name", target = "name")
AdminsAuthorizationRoleResourceTreeResponse convert2(ResourceTreeNodeBO bean);
List<AdminsAuthorizationMenuTreeResponse> convertList(List<ResourceTreeNodeBO> beans);
default List<AdminsAuthorizationRoleResourceTreeResponse> convertList(List<ResourceTreeNodeBO> beans, Set<Integer> roleResourceIds) {
List<AdminsAuthorizationRoleResourceTreeResponse> responses = new ArrayList<>(beans.size());
for (ResourceTreeNodeBO bean : beans) {
// 转换
AdminsAuthorizationRoleResourceTreeResponse response = this.convert2(bean);
response.setAssign(roleResourceIds.contains(bean.getNode().getId()));
// 递归子节点
this.convertList(bean.getChildren(), roleResourceIds);
// 添加到结果
responses.add(response);
}
return responses;
}
}

View File

@@ -7,7 +7,7 @@ import lombok.experimental.Accessors;
import java.util.List;
@ApiModel("管理员 - 授权模块 - 菜单资源树")
@ApiModel(value = "管理员 - 授权模块 - 菜单资源树", description = "一般用于首页菜单树")
@Data
@Accessors(chain = true)
public class AdminsAuthorizationMenuTreeResponse {
@@ -20,7 +20,9 @@ public class AdminsAuthorizationMenuTreeResponse {
private String route;
@ApiModelProperty(value = "菜单图标", required = true, example = "user")
private String icon;
@ApiModelProperty(value = "子节点数组")
/**
* 子节点数组
*/
private List<AdminsAuthorizationMenuTreeResponse> children;
}

View File

@@ -0,0 +1,26 @@
package cn.iocoder.mall.system.rest.response.authorization;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@ApiModel(value = "管理员 - 授权模块 - 角色拥有的资源树")
@Data
@Accessors(chain = true)
public class AdminsAuthorizationRoleResourceTreeResponse {
@ApiModelProperty(value = "菜单编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "菜单名", required = true, example = "商品管理")
private String name;
@ApiModelProperty(value = "是否分配", required = true, notes = "即角色是否拥有该资源")
private Boolean assign;
/**
* 子节点数组
*/
private List<AdminsAuthorizationRoleResourceTreeResponse> children;
}