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>
|
<version>${roses.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!--资源模块-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.stylefeng.roses</groupId>
|
||||||
|
<artifactId>system-business-resource</artifactId>
|
||||||
|
<version>${roses.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!--web模块-->
|
<!--web模块-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<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;
|
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.menu.entity.SysMenuResource;
|
||||||
|
import cn.stylefeng.roses.kernel.system.modular.resource.pojo.ResourceTreeNode;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
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> {
|
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.entity.SysMenuResource;
|
||||||
import cn.stylefeng.roses.kernel.system.modular.menu.mapper.SysMenuResourceMapper;
|
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.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 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.springframework.stereotype.Service;
|
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
|
@Service
|
||||||
public class SysMenuResourceServiceImpl extends ServiceImpl<SysMenuResourceMapper, SysMenuResource> implements SysMenuResourceService {
|
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.ApiResource;
|
||||||
import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
|
import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
|
||||||
import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource;
|
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.ExternalResourceRequest;
|
||||||
import cn.stylefeng.roses.kernel.system.api.pojo.resource.ResourceRequest;
|
import cn.stylefeng.roses.kernel.system.api.pojo.resource.ResourceRequest;
|
||||||
import cn.stylefeng.roses.kernel.system.api.pojo.role.request.SysRoleRequest;
|
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.pojo.ResourceTreeNode;
|
||||||
import cn.stylefeng.roses.kernel.system.modular.resource.service.SysResourceService;
|
import cn.stylefeng.roses.kernel.system.modular.resource.service.SysResourceService;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import org.springframework.validation.annotation.Validated;
|
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@ -92,7 +90,7 @@ public class ResourceController {
|
||||||
*/
|
*/
|
||||||
@GetResource(name = "Layui版本--获取资源树列表,用于角色分配接口权限", path = "/resource/getRoleResourceTree", responseClass = ResourceTreeNode.class)
|
@GetResource(name = "Layui版本--获取资源树列表,用于角色分配接口权限", path = "/resource/getRoleResourceTree", responseClass = ResourceTreeNode.class)
|
||||||
public List<ResourceTreeNode> getLateralTree(SysRoleRequest sysRoleRequest) {
|
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)
|
@GetResource(name = "AntdVue版本--获取资源树列表,用于角色分配接口权限", path = "/resource/getRoleResourceTreeAntdv", responseClass = ResourceTreeNode.class)
|
||||||
public ResponseData getLateralTreeChildren(SysRoleRequest sysRoleRequest) {
|
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);
|
return new SuccessResponseData(resourceLateralTree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -66,14 +66,24 @@ public interface SysResourceService extends IService<SysResource> {
|
||||||
List<SysResource> findList(ResourceRequest resourceRequest);
|
List<SysResource> findList(ResourceRequest resourceRequest);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取资源平级树列表,用于分配接口权限
|
* 获取角色绑定的资源树列表,用于分配接口权限
|
||||||
*
|
*
|
||||||
* @param roleId 角色id
|
* @param roleId 角色id
|
||||||
* @param treeBuildFlag true-带树形结构,false-不组装树形结构的
|
* @param treeBuildFlag true-带树形结构,false-不组装树形结构的
|
||||||
* @author majianguo
|
* @author majianguo
|
||||||
* @date 2021/1/9 15:08
|
* @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接口
|
* 获取资源树列表,用于生成api接口
|
||||||
|
|
|
@ -111,8 +111,22 @@ public class SysResourceServiceImpl extends ServiceImpl<SysResourceMapper, SysRe
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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<>();
|
List<ResourceTreeNode> res = new ArrayList<>();
|
||||||
|
|
||||||
// 获取所有的资源
|
// 获取所有的资源
|
||||||
|
@ -134,15 +148,6 @@ public class SysResourceServiceImpl extends ServiceImpl<SysResourceMapper, SysRe
|
||||||
|
|
||||||
List<SysResource> allResource = this.list(sysResourceLambdaQueryWrapper);
|
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<>();
|
Map<String, List<SysResource>> modularMap = new HashMap<>();
|
||||||
for (SysResource sysResource : allResource) {
|
for (SysResource sysResource : allResource) {
|
||||||
|
@ -170,8 +175,7 @@ public class SysResourceServiceImpl extends ServiceImpl<SysResourceMapper, SysRe
|
||||||
for (SysResource resource : entry.getValue()) {
|
for (SysResource resource : entry.getValue()) {
|
||||||
ResourceTreeNode subItem = new ResourceTreeNode();
|
ResourceTreeNode subItem = new ResourceTreeNode();
|
||||||
// 判断是否已经拥有
|
// 判断是否已经拥有
|
||||||
SysRoleResourceDTO resourceResponse = alreadyHave.get(resource.getResourceCode());
|
if (!resourceCodes.contains(resource.getResourceCode())) {
|
||||||
if (ObjectUtil.isEmpty(resourceResponse)) {
|
|
||||||
subItem.setChecked(false);
|
subItem.setChecked(false);
|
||||||
} else {
|
} else {
|
||||||
// 让父类也选择
|
// 让父类也选择
|
||||||
|
@ -206,9 +210,9 @@ public class SysResourceServiceImpl extends ServiceImpl<SysResourceMapper, SysRe
|
||||||
// 查询条件
|
// 查询条件
|
||||||
if (ObjectUtil.isNotEmpty(resourceRequest.getResourceName())) {
|
if (ObjectUtil.isNotEmpty(resourceRequest.getResourceName())) {
|
||||||
sysResourceLambdaQueryWrapper
|
sysResourceLambdaQueryWrapper
|
||||||
.like(SysResource::getUrl, resourceRequest.getResourceName())
|
.like(SysResource::getUrl, resourceRequest.getResourceName())
|
||||||
.or()
|
.or()
|
||||||
.like(SysResource::getResourceName, resourceRequest.getResourceName());
|
.like(SysResource::getResourceName, resourceRequest.getResourceName());
|
||||||
}
|
}
|
||||||
|
|
||||||
List<SysResource> allResource = this.list(sysResourceLambdaQueryWrapper);
|
List<SysResource> allResource = this.list(sysResourceLambdaQueryWrapper);
|
||||||
|
|
Loading…
Reference in New Issue