mirror of https://gitee.com/stylefeng/roses
【7.1.1】【menu】增加菜单绑定资源的获取
parent
503842bfbc
commit
379fa63118
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* Copyright [2020-2030] [https://www.stylefeng.cn]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
|
||||
*
|
||||
* 1.请不要删除和修改根目录下的LICENSE文件。
|
||||
* 2.请不要删除和修改Guns源码头部的版权声明。
|
||||
* 3.请保留源码和相关描述文件的项目出处,作者声明等。
|
||||
* 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns
|
||||
* 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
|
||||
* 6.若您的项目无法满足以上几点,可申请商业授权
|
||||
*/
|
||||
package cn.stylefeng.roses.kernel.system.api.pojo.menu;
|
||||
|
||||
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
|
||||
import cn.stylefeng.roses.kernel.scanner.api.annotation.field.ChineseDescription;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* 菜单资源的请求
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/8/8 22:40
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class SysMenuResourceRequest extends BaseRequest {
|
||||
|
||||
/**
|
||||
* 业务id不能为空
|
||||
*/
|
||||
@NotNull(message = "业务id不能为空")
|
||||
@ChineseDescription("业务id")
|
||||
private Long businessId;
|
||||
|
||||
}
|
|
@ -56,6 +56,13 @@
|
|||
<version>${roses.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!--资源模块-->
|
||||
<dependency>
|
||||
<groupId>cn.stylefeng.roses</groupId>
|
||||
<artifactId>system-business-resource</artifactId>
|
||||
<version>${roses.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!--web模块-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* Copyright [2020-2030] [https://www.stylefeng.cn]
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
|
||||
*
|
||||
* 1.请不要删除和修改根目录下的LICENSE文件。
|
||||
* 2.请不要删除和修改Guns源码头部的版权声明。
|
||||
* 3.请保留源码和相关描述文件的项目出处,作者声明等。
|
||||
* 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns
|
||||
* 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
|
||||
* 6.若您的项目无法满足以上几点,可申请商业授权
|
||||
*/
|
||||
package cn.stylefeng.roses.kernel.system.modular.menu.controller;
|
||||
|
||||
import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
|
||||
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
|
||||
import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
|
||||
import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.menu.SysMenuResourceRequest;
|
||||
import cn.stylefeng.roses.kernel.system.modular.menu.service.SysMenuResourceService;
|
||||
import cn.stylefeng.roses.kernel.system.modular.resource.pojo.ResourceTreeNode;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 菜单资源控制器
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/8/8 22:38
|
||||
*/
|
||||
@RestController
|
||||
@ApiResource(name = "菜单资源控制器")
|
||||
public class SysMenuResourceController {
|
||||
|
||||
@Resource
|
||||
private SysMenuResourceService sysMenuResourceService;
|
||||
|
||||
/**
|
||||
* 获取菜单的资源分配列表
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2021/8/8 22:38
|
||||
*/
|
||||
@GetResource(name = "获取菜单的资源分配列表", path = "/sysMenuResource/getMenuResourceList")
|
||||
public ResponseData getMenuResourceList(@Validated SysMenuResourceRequest sysMenuResourceRequest) {
|
||||
List<ResourceTreeNode> menuResourceTree = sysMenuResourceService.getMenuResourceTree(sysMenuResourceRequest.getBusinessId());
|
||||
return new SuccessResponseData(menuResourceTree);
|
||||
}
|
||||
|
||||
}
|
|
@ -25,8 +25,11 @@
|
|||
package cn.stylefeng.roses.kernel.system.modular.menu.service;
|
||||
|
||||
import cn.stylefeng.roses.kernel.system.modular.menu.entity.SysMenuResource;
|
||||
import cn.stylefeng.roses.kernel.system.modular.resource.pojo.ResourceTreeNode;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 菜单资源信息
|
||||
*
|
||||
|
@ -35,5 +38,14 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
|||
*/
|
||||
public interface SysMenuResourceService extends IService<SysMenuResource> {
|
||||
|
||||
/**
|
||||
* 获取菜单或菜单按钮绑定资源的树
|
||||
*
|
||||
* @param businessId 业务id,菜单或按钮id
|
||||
* @return 资源树列表
|
||||
* @author fengshuonan
|
||||
* @date 2021/8/8 21:56
|
||||
*/
|
||||
List<ResourceTreeNode> getMenuResourceTree(Long businessId);
|
||||
|
||||
}
|
||||
|
|
|
@ -27,9 +27,16 @@ package cn.stylefeng.roses.kernel.system.modular.menu.service.impl;
|
|||
import cn.stylefeng.roses.kernel.system.modular.menu.entity.SysMenuResource;
|
||||
import cn.stylefeng.roses.kernel.system.modular.menu.mapper.SysMenuResourceMapper;
|
||||
import cn.stylefeng.roses.kernel.system.modular.menu.service.SysMenuResourceService;
|
||||
import cn.stylefeng.roses.kernel.system.modular.resource.pojo.ResourceTreeNode;
|
||||
import cn.stylefeng.roses.kernel.system.modular.resource.service.SysResourceService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 系统资源信息关联
|
||||
*
|
||||
|
@ -39,4 +46,17 @@ import org.springframework.stereotype.Service;
|
|||
@Service
|
||||
public class SysMenuResourceServiceImpl extends ServiceImpl<SysMenuResourceMapper, SysMenuResource> implements SysMenuResourceService {
|
||||
|
||||
@Resource
|
||||
private SysResourceService sysResourceService;
|
||||
|
||||
@Override
|
||||
public List<ResourceTreeNode> getMenuResourceTree(Long businessId) {
|
||||
LambdaQueryWrapper<SysMenuResource> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(SysMenuResource::getBusinessId, businessId);
|
||||
List<SysMenuResource> list = this.list(wrapper);
|
||||
|
||||
List<String> resourceCodes = list.stream().map(SysMenuResource::getResourceCode).collect(Collectors.toList());
|
||||
return sysResourceService.getResourceList(resourceCodes, true);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -31,7 +31,6 @@ import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
|
|||
import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
|
||||
import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
|
||||
import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource;
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.resource.ApiGroupRequest;
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.resource.ExternalResourceRequest;
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.resource.ResourceRequest;
|
||||
import cn.stylefeng.roses.kernel.system.api.pojo.role.request.SysRoleRequest;
|
||||
|
@ -39,7 +38,6 @@ import cn.stylefeng.roses.kernel.system.modular.resource.entity.SysResource;
|
|||
import cn.stylefeng.roses.kernel.system.modular.resource.pojo.ResourceTreeNode;
|
||||
import cn.stylefeng.roses.kernel.system.modular.resource.service.SysResourceService;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
|
@ -92,7 +90,7 @@ public class ResourceController {
|
|||
*/
|
||||
@GetResource(name = "Layui版本--获取资源树列表,用于角色分配接口权限", path = "/resource/getRoleResourceTree", responseClass = ResourceTreeNode.class)
|
||||
public List<ResourceTreeNode> getLateralTree(SysRoleRequest sysRoleRequest) {
|
||||
return sysResourceService.getResourceTree(sysRoleRequest.getRoleId(), false);
|
||||
return sysResourceService.getRoleResourceTree(sysRoleRequest.getRoleId(), false);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -103,7 +101,7 @@ public class ResourceController {
|
|||
*/
|
||||
@GetResource(name = "AntdVue版本--获取资源树列表,用于角色分配接口权限", path = "/resource/getRoleResourceTreeAntdv", responseClass = ResourceTreeNode.class)
|
||||
public ResponseData getLateralTreeChildren(SysRoleRequest sysRoleRequest) {
|
||||
List<ResourceTreeNode> resourceLateralTree = sysResourceService.getResourceTree(sysRoleRequest.getRoleId(), true);
|
||||
List<ResourceTreeNode> resourceLateralTree = sysResourceService.getRoleResourceTree(sysRoleRequest.getRoleId(), true);
|
||||
return new SuccessResponseData(resourceLateralTree);
|
||||
}
|
||||
|
||||
|
|
|
@ -66,14 +66,24 @@ public interface SysResourceService extends IService<SysResource> {
|
|||
List<SysResource> findList(ResourceRequest resourceRequest);
|
||||
|
||||
/**
|
||||
* 获取资源平级树列表,用于分配接口权限
|
||||
* 获取角色绑定的资源树列表,用于分配接口权限
|
||||
*
|
||||
* @param roleId 角色id
|
||||
* @param treeBuildFlag true-带树形结构,false-不组装树形结构的
|
||||
* @author majianguo
|
||||
* @date 2021/1/9 15:08
|
||||
*/
|
||||
List<ResourceTreeNode> getResourceTree(Long roleId, Boolean treeBuildFlag);
|
||||
List<ResourceTreeNode> getRoleResourceTree(Long roleId, Boolean treeBuildFlag);
|
||||
|
||||
/**
|
||||
* 获取资源绑定列表(业务通用)
|
||||
*
|
||||
* @param resourceCodes 业务已经绑定的资源的编码集合
|
||||
* @param treeBuildFlag 是否要构建成树
|
||||
* @author fengshuonan
|
||||
* @date 2021/8/8 22:24
|
||||
*/
|
||||
List<ResourceTreeNode> getResourceList(List<String> resourceCodes, Boolean treeBuildFlag);
|
||||
|
||||
/**
|
||||
* 获取资源树列表,用于生成api接口
|
||||
|
|
|
@ -111,8 +111,22 @@ public class SysResourceServiceImpl extends ServiceImpl<SysResourceMapper, SysRe
|
|||
}
|
||||
|
||||
@Override
|
||||
public List<ResourceTreeNode> getResourceTree(Long roleId, Boolean treeBuildFlag) {
|
||||
public List<ResourceTreeNode> getRoleResourceTree(Long roleId, Boolean treeBuildFlag) {
|
||||
|
||||
// 查询当前角色已有的接口
|
||||
List<SysRoleResourceDTO> resourceList = roleServiceApi.getRoleResourceList(Collections.singletonList(roleId));
|
||||
|
||||
// 该角色已拥有权限
|
||||
List<String> alreadyList = new ArrayList<>();
|
||||
for (SysRoleResourceDTO sysRoleResponse : resourceList) {
|
||||
alreadyList.add(sysRoleResponse.getResourceCode());
|
||||
}
|
||||
|
||||
return this.getResourceList(alreadyList, treeBuildFlag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ResourceTreeNode> getResourceList(List<String> resourceCodes, Boolean treeBuildFlag) {
|
||||
List<ResourceTreeNode> res = new ArrayList<>();
|
||||
|
||||
// 获取所有的资源
|
||||
|
@ -134,15 +148,6 @@ public class SysResourceServiceImpl extends ServiceImpl<SysResourceMapper, SysRe
|
|||
|
||||
List<SysResource> allResource = this.list(sysResourceLambdaQueryWrapper);
|
||||
|
||||
// 查询当前角色已有的接口
|
||||
List<SysRoleResourceDTO> resourceList = roleServiceApi.getRoleResourceList(Collections.singletonList(roleId));
|
||||
|
||||
// 该角色已拥有权限
|
||||
Map<String, SysRoleResourceDTO> alreadyHave = new HashMap<>(resourceList.size());
|
||||
for (SysRoleResourceDTO sysRoleResponse : resourceList) {
|
||||
alreadyHave.put(sysRoleResponse.getResourceCode(), sysRoleResponse);
|
||||
}
|
||||
|
||||
// 根据模块名称把资源分类
|
||||
Map<String, List<SysResource>> modularMap = new HashMap<>();
|
||||
for (SysResource sysResource : allResource) {
|
||||
|
@ -170,8 +175,7 @@ public class SysResourceServiceImpl extends ServiceImpl<SysResourceMapper, SysRe
|
|||
for (SysResource resource : entry.getValue()) {
|
||||
ResourceTreeNode subItem = new ResourceTreeNode();
|
||||
// 判断是否已经拥有
|
||||
SysRoleResourceDTO resourceResponse = alreadyHave.get(resource.getResourceCode());
|
||||
if (ObjectUtil.isEmpty(resourceResponse)) {
|
||||
if (!resourceCodes.contains(resource.getResourceCode())) {
|
||||
subItem.setChecked(false);
|
||||
} else {
|
||||
// 让父类也选择
|
||||
|
@ -206,9 +210,9 @@ public class SysResourceServiceImpl extends ServiceImpl<SysResourceMapper, SysRe
|
|||
// 查询条件
|
||||
if (ObjectUtil.isNotEmpty(resourceRequest.getResourceName())) {
|
||||
sysResourceLambdaQueryWrapper
|
||||
.like(SysResource::getUrl, resourceRequest.getResourceName())
|
||||
.or()
|
||||
.like(SysResource::getResourceName, resourceRequest.getResourceName());
|
||||
.like(SysResource::getUrl, resourceRequest.getResourceName())
|
||||
.or()
|
||||
.like(SysResource::getResourceName, resourceRequest.getResourceName());
|
||||
}
|
||||
|
||||
List<SysResource> allResource = this.list(sysResourceLambdaQueryWrapper);
|
||||
|
|
Loading…
Reference in New Issue