diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/controller/ResourceController.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/controller/ResourceController.java index 1db67b4e4..324582b33 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/controller/ResourceController.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/controller/ResourceController.java @@ -30,15 +30,12 @@ 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.resource.ResourceRequest; -import cn.stylefeng.roses.kernel.system.api.pojo.role.request.SysRoleRequest; -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 cn.stylefeng.roses.kernel.sys.modular.resource.entity.SysResource; +import cn.stylefeng.roses.kernel.sys.modular.resource.pojo.ResourceRequest; +import cn.stylefeng.roses.kernel.sys.modular.resource.service.SysResourceService; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; -import java.util.List; /** * 资源管理控制器 @@ -65,38 +62,4 @@ public class ResourceController { return new SuccessResponseData<>(result); } - /** - * 获取资源下拉列表(获取菜单资源) - * - * @author fengshuonan - * @since 2020/11/24 19:51 - */ - @GetResource(name = "获取资源下拉列表", path = "/resource/getMenuResourceList") - public ResponseData> getMenuResourceList(ResourceRequest resourceRequest) { - List menuResourceList = this.sysResourceService.findList(resourceRequest); - return new SuccessResponseData<>(menuResourceList); - } - - /** - * Layui版本--获取资源树列表,用于角色分配接口权限 - * - * @author majianguo - * @since 2021/1/9 15:07 - */ - @GetResource(name = "Layui版本--获取资源树列表,用于角色分配接口权限", path = "/resource/getRoleResourceTree") - public List getLateralTree(SysRoleRequest sysRoleRequest) { - return sysResourceService.getRoleResourceTree(sysRoleRequest.getRoleId(), false, null); - } - - /** - * AntdVue版本--获取资源树列表,用于角色分配接口权限 - * - * @author majianguo - * @since 2021/1/9 15:07 - */ - @GetResource(name = "AntdVue版本--获取资源树列表,用于角色分配接口权限", path = "/resource/getRoleResourceTreeAntdv") - public ResponseData> getLateralTreeChildren(SysRoleRequest sysRoleRequest) { - List resourceLateralTree = sysResourceService.getRoleResourceTree(sysRoleRequest.getRoleId(), true, sysRoleRequest.getResourceBizType()); - return new SuccessResponseData<>(resourceLateralTree); - } } diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/controller/ResourceReportController.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/controller/ResourceReportController.java deleted file mode 100644 index 133bd8aa4..000000000 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/controller/ResourceReportController.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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.sys.modular.resource.controller; - -import cn.stylefeng.roses.kernel.rule.enums.ResBizTypeEnum; -import cn.stylefeng.roses.kernel.scanner.api.ResourceReportApi; -import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource; -import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource; -import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ReportResourceParam; -import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.SysResourcePersistencePojo; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 微服务汇报资源接口 - * - * @author fengshuonan - * @since 2021/9/25 17:55 - */ -@RestController -@ApiResource(name = "微服务汇报资源接口", resBizType = ResBizTypeEnum.SYSTEM) -public class ResourceReportController { - - @Resource - private ResourceReportApi resourceReportApi; - - /** - * 接收远程服务资源 - * - * @author fengshuonan - * @since 2021/9/25 17:55 - */ - @PostResource(path = "/resourceService/reportResources", name = "汇报资源") - public void reportResources(@RequestBody ReportResourceParam reportResourceReq) { - resourceReportApi.reportResources(reportResourceReq); - } - - /** - * 接收远程服务资源 - * - * @author fengshuonan - * @since 2021/9/25 17:55 - */ - @PostResource(path = "/resourceService/reportResourcesAndGetResult", name = "汇报资源") - public List reportResourcesAndGetResult(@RequestBody ReportResourceParam reportResourceReq) { - return resourceReportApi.reportResourcesAndGetResult(reportResourceReq); - } - -} diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/mapper/mapping/SysResourceMapper.xml b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/mapper/mapping/SysResourceMapper.xml index 392f2e62a..67f940156 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/mapper/mapping/SysResourceMapper.xml +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/mapper/mapping/SysResourceMapper.xml @@ -1,5 +1,5 @@ - + diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/pojo/ResourceRequest.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/pojo/ResourceRequest.java new file mode 100644 index 000000000..21f280db0 --- /dev/null +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/pojo/ResourceRequest.java @@ -0,0 +1,176 @@ +/* + * 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.sys.modular.resource.pojo; + +import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription; +import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; + +/** + * 资源请求封装 + * + * @author fengshuonan + * @since 2019-09-10 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class ResourceRequest extends BaseRequest { + + private static final long serialVersionUID = 1L; + + /** + * 资源id + */ + @ChineseDescription("资源id") + private Long resourceId; + + /** + * 应用编码 + */ + @ChineseDescription("应用编码") + private String appCode; + + /** + * 资源编码 + */ + @ChineseDescription("资源编码") + @NotBlank(message = "资源编码为空", groups = detail.class) + private String resourceCode; + + /** + * 资源名称 + */ + @ChineseDescription("资源名称") + private String resourceName; + + /** + * 项目编码 + */ + @ChineseDescription("项目编码") + private String projectCode; + + /** + * 类名称 + */ + @ChineseDescription("类名称") + private String className; + + /** + * 方法名称 + */ + @ChineseDescription("方法名称") + private String methodName; + + /** + * 资源模块编码 + */ + @ChineseDescription("资源模块编码") + private String modularCode; + + /** + * 资源模块名称 + */ + @ChineseDescription("资源模块名称") + private String modularName; + + /** + * 资源初始化的服务器ip地址 + */ + @ChineseDescription("资源初始化的服务器ip地址") + private String ipAddress; + + /** + * 是否是视图类型:Y-是,N-否 + * 如果是视图类型,url需要以 '/view' 开头, + * 视图类型的接口会渲染出html界面,而不是json数据, + * 视图层一般会在前后端不分离项目出现 + */ + @ChineseDescription("是否是视图类型") + private String viewFlag; + + /** + * 资源url + */ + @ChineseDescription("资源url") + private String url; + + /** + * http请求方法 + */ + @ChineseDescription("http请求方法") + private String httpMethod; + + /** + * 资源的业务类型:1-业务类型,2-系统类型 + */ + @ChineseDescription("资源的业务类型:1-业务类型,2-系统类型") + private Integer resourceBizType; + + /** + * 是否需要登录:Y-是,N-否 + */ + @ChineseDescription("是否需要登录:Y-是,N-否") + private String requiredLoginFlag; + + /** + * 是否需要鉴权:Y-是,N-否 + */ + @ChineseDescription("是否需要鉴权:Y-是,N-否") + private String requiredPermissionFlag; + + /** + * 需要进行参数校验的分组 + *

+ * json形式存储 + */ + @ChineseDescription("需要进行参数校验的分组") + private String validateGroups; + + /** + * 接口参数的字段描述 + *

+ * json形式存储 + */ + @ChineseDescription("接口参数的字段描述") + private String paramFieldDescriptions; + + /** + * 接口返回结果的字段描述 + *

+ * json形式存储 + */ + @ChineseDescription("接口返回结果的字段描述") + private String responseFieldDescriptions; + + /** + * 是否是菜单(Y-是,N-否) + */ + @ChineseDescription("是否是菜单(Y-是,N-否)") + private String menuFlag; + +} diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/SysResourceService.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/SysResourceService.java index 63c0535b5..68f573b58 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/SysResourceService.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/SysResourceService.java @@ -25,13 +25,9 @@ package cn.stylefeng.roses.kernel.sys.modular.resource.service; import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; -import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ResourceDefinition; import cn.stylefeng.roses.kernel.sys.modular.resource.entity.SysResource; -import cn.stylefeng.roses.kernel.sys.modular.resource.pojo.ResourceTreeNode; +import cn.stylefeng.roses.kernel.sys.modular.resource.pojo.ResourceRequest; import com.baomidou.mybatisplus.extension.service.IService; -import jdk.management.resource.ResourceRequest; - -import java.util.List; /** * 资源服务类 @@ -51,65 +47,4 @@ public interface SysResourceService extends IService { */ PageResult findPage(ResourceRequest resourceRequest); - /** - * 通过应用code获取获取资源下拉列表 - *

- * 只获取菜单资源 - * - * @param resourceRequest 请求参数 - * @return 响应下拉结果 - * @author fengshuonan - * @since 2020/11/24 20:45 - */ - List findList(ResourceRequest resourceRequest); - - /** - * 获取角色绑定的资源树列表,用于分配接口权限 - * - * @param roleId 角色id - * @param treeBuildFlag true-带树形结构,false-不组装树形结构的 - * @param resourceBizType 资源的类型,1-业务类,2-系统类 - * @author fengshuonan - * @since 2022/9/28 23:46 - */ - List getRoleResourceTree(Long roleId, Boolean treeBuildFlag, Integer resourceBizType); - - /** - * 获取资源绑定列表(业务通用) - * - * @param resourceCodes 业务已经绑定的资源的编码集合 - * @param treeBuildFlag 是否要构建成树 - * @param resourceBizType 资源的类型,1-业务类,2-系统类 - * @author fengshuonan - * @since 2021/8/8 22:24 - */ - List getResourceList(List resourceCodes, Boolean treeBuildFlag, Integer resourceBizType); - - /** - * 获取资源的详情 - * - * @param resourceRequest 请求参数 - * @return 资源详情 - * @author fengshuonan - * @since 2020/12/18 16:04 - */ - ResourceDefinition getApiResourceDetail(ResourceRequest resourceRequest); - - /** - * 删除某个项目的所有资源 - * - * @param projectCode 项目编码,一般为spring application name - * @author fengshuonan - * @since 2020/11/24 20:46 - */ - void deleteResourceByProjectCode(String projectCode); - - /** - * 更新资源编码前缀,将guns$前缀改为新的 - * - * @author fengshuonan - * @since 2022/11/17 0:17 - */ - void updateResourceAppCode(String newAppCode); - } diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/impl/SysResourceServiceImpl.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/impl/SysResourceServiceImpl.java index ea22ad820..586dc7a96 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/impl/SysResourceServiceImpl.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/resource/service/impl/SysResourceServiceImpl.java @@ -24,50 +24,20 @@ */ package cn.stylefeng.roses.kernel.sys.modular.resource.service.impl; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; -import cn.stylefeng.roses.kernel.auth.api.LoginUserApi; -import cn.stylefeng.roses.kernel.auth.api.context.LoginContext; -import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleRoleInfo; -import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; -import cn.stylefeng.roses.kernel.db.api.context.DbOperatorContext; import cn.stylefeng.roses.kernel.db.api.factory.PageFactory; import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory; +import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity; import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; -import cn.stylefeng.roses.kernel.rule.constants.RuleConstants; -import cn.stylefeng.roses.kernel.rule.constants.TreeConstants; -import cn.stylefeng.roses.kernel.rule.enums.DbTypeEnum; -import cn.stylefeng.roses.kernel.rule.enums.ResBizTypeEnum; -import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum; -import cn.stylefeng.roses.kernel.rule.tree.factory.DefaultTreeBuildFactory; -import cn.stylefeng.roses.kernel.rule.util.GunsResourceCodeUtil; -import cn.stylefeng.roses.kernel.scanner.api.ResourceReportApi; -import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ReportResourceParam; -import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ResourceDefinition; -import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ResourceUrlParam; -import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.SysResourcePersistencePojo; import cn.stylefeng.roses.kernel.sys.modular.resource.entity.SysResource; -import cn.stylefeng.roses.kernel.sys.modular.resource.factory.ResourceFactory; import cn.stylefeng.roses.kernel.sys.modular.resource.mapper.SysResourceMapper; -import cn.stylefeng.roses.kernel.sys.modular.resource.pojo.ResourceTreeNode; +import cn.stylefeng.roses.kernel.sys.modular.resource.pojo.ResourceRequest; import cn.stylefeng.roses.kernel.sys.modular.resource.service.SysResourceService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import jdk.management.resource.ResourceRequest; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.RequestBody; - -import javax.annotation.Resource; -import java.util.*; -import java.util.stream.Collectors; /** * 资源表 服务实现类 @@ -77,375 +47,21 @@ import java.util.stream.Collectors; */ @Service @Slf4j -public class SysResourceServiceImpl extends ServiceImpl implements SysResourceService, ResourceReportApi, ResourceServiceApi { - - @Resource - private SysResourceMapper resourceMapper; - - @Resource - private RoleServiceApi roleServiceApi; - - @Resource(name = "resourceCache") - private CacheOperatorApi resourceCache; +public class SysResourceServiceImpl extends ServiceImpl implements SysResourceService { @Override public PageResult findPage(ResourceRequest resourceRequest) { LambdaQueryWrapper wrapper = createWrapper(resourceRequest); + + // 只查询有用字段 + wrapper.select(SysResource::getResourceName, SysResource::getUrl, SysResource::getClassName, SysResource::getHttpMethod, + SysResource::getRequiredLoginFlag, SysResource::getRequiredPermissionFlag, SysResource::getIpAddress, + BaseEntity::getCreateTime); + Page page = this.page(PageFactory.defaultPage(), wrapper); return PageResultFactory.createPageResult(page); } - @Override - public List findList(ResourceRequest resourceRequest) { - - LambdaQueryWrapper wrapper = createWrapper(resourceRequest); - - // 只查询code和name - wrapper.select(SysResource::getResourceCode, SysResource::getResourceName); - - List menuResourceList = this.list(wrapper); - - // 增加返回虚拟菜单的情况 - SysResource sysResource = new SysResource(); - sysResource.setResourceCode(""); - sysResource.setResourceName("虚拟目录(空)"); - menuResourceList.add(0, sysResource); - - return menuResourceList; - } - - @Override - public List getRoleResourceTree(Long roleId, Boolean treeBuildFlag, Integer resourceBizType) { - - // 查询当前角色已有的接口 - List resourceList = roleServiceApi.getRoleResourceList(Collections.singletonList(roleId)); - - // 该角色已拥有权限 - List alreadyList = new ArrayList<>(); - for (SysRoleResourceDTO sysRoleResponse : resourceList) { - alreadyList.add(sysRoleResponse.getResourceCode()); - } - - return this.getResourceList(alreadyList, treeBuildFlag, resourceBizType); - } - - @Override - public List getResourceList(List resourceCodes, Boolean treeBuildFlag, Integer resourceBizType) { - List res = new ArrayList<>(); - - // 获取所有的资源 - LambdaQueryWrapper sysResourceLambdaQueryWrapper = new LambdaQueryWrapper<>(); - sysResourceLambdaQueryWrapper.select(SysResource::getAppCode, SysResource::getModularCode, SysResource::getModularName, SysResource::getResourceCode, SysResource::getUrl, - SysResource::getResourceName); - - // 只查询需要授权的接口 - sysResourceLambdaQueryWrapper.eq(SysResource::getRequiredPermissionFlag, YesOrNotEnum.Y.getCode()); - - // 查询指定范围的资源 - sysResourceLambdaQueryWrapper.eq(ObjectUtil.isNotEmpty(resourceBizType), SysResource::getResourceBizType, resourceBizType); - - LoginUserApi loginUserApi = LoginContext.me(); - if (!loginUserApi.getSuperAdminFlag()) { - // 获取权限列表 - List roleIds = loginUserApi.getLoginUser().getSimpleRoleInfoList().parallelStream().map(SimpleRoleInfo::getRoleId).collect(Collectors.toList()); - Set resourceCodeList = roleServiceApi.getRoleResourceCodeList(roleIds); - if (!resourceCodeList.isEmpty()) { - sysResourceLambdaQueryWrapper.in(SysResource::getResourceCode, resourceCodeList); - } - } - - List allResource = this.list(sysResourceLambdaQueryWrapper); - - // 根据模块名称把资源分类 - Map> modularMap = new HashMap<>(); - for (SysResource sysResource : allResource) { - List sysResources = modularMap.get(sysResource.getModularName()); - - // 没有就新建一个 - if (ObjectUtil.isEmpty(sysResources)) { - sysResources = new ArrayList<>(); - modularMap.put(sysResource.getModularName(), sysResources); - } - // 把自己加入进去 - sysResources.add(sysResource); - } - - // 创建一级节点 - for (Map.Entry> entry : modularMap.entrySet()) { - ResourceTreeNode item = new ResourceTreeNode(); - item.setResourceFlag(false); - String id = IdWorker.get32UUID(); - item.setCode(id); - item.setParentCode(RuleConstants.TREE_ROOT_ID.toString()); - item.setNodeName(entry.getKey()); - - // 设置临时变量,统计半开状态 - int checkedNumber = 0; - - //创建二级节点 - for (SysResource resource : entry.getValue()) { - ResourceTreeNode subItem = new ResourceTreeNode(); - // 判断是否已经拥有 - if (!resourceCodes.contains(resource.getResourceCode())) { - subItem.setChecked(false); - } else { - checkedNumber++; - - // 让父类也选择 - item.setChecked(true); - subItem.setChecked(true); - } - subItem.setResourceFlag(true); - subItem.setNodeName(resource.getResourceName()); - subItem.setCode(resource.getResourceCode()); - subItem.setParentCode(id); - res.add(subItem); - } - - // 统计选中的数量 - if (checkedNumber == 0) { - item.setChecked(false); - item.setIndeterminate(false); - } else if (checkedNumber == entry.getValue().size()) { - item.setChecked(true); - item.setIndeterminate(false); - } else { - item.setChecked(false); - item.setIndeterminate(true); - } - - res.add(item); - } - - // 根据map组装资源树 - if (treeBuildFlag) { - return new DefaultTreeBuildFactory().doTreeBuild(res); - } else { - return res; - } - } - - @Override - public List getApiResourceTree(ResourceRequest resourceRequest) { - - // 1. 获取所有的资源 - LambdaQueryWrapper sysResourceLambdaQueryWrapper = new LambdaQueryWrapper<>(); - sysResourceLambdaQueryWrapper.eq(SysResource::getViewFlag, YesOrNotEnum.N.getCode()); - sysResourceLambdaQueryWrapper.select(SysResource::getAppCode, SysResource::getModularCode, SysResource::getModularName, SysResource::getResourceCode, SysResource::getUrl, - SysResource::getResourceName); - - // 查询条件 - if (ObjectUtil.isNotEmpty(resourceRequest.getResourceName())) { - sysResourceLambdaQueryWrapper.like(SysResource::getUrl, resourceRequest.getResourceName()).or().like(SysResource::getResourceName, resourceRequest.getResourceName()); - } - - List allResource = this.list(sysResourceLambdaQueryWrapper); - - // 2. 按应用和模块编码设置map - Map>> appModularResources = divideResources(allResource); - - // 3. 创建模块code和模块name的映射 - Map modularCodeName = createModularCodeName(allResource); - - // 4. 根据map组装资源树 - return createResourceTree(appModularResources, modularCodeName); - } - - @Override - public ResourceDefinition getApiResourceDetail(ResourceRequest resourceRequest) { - LambdaQueryWrapper sysResourceLambdaQueryWrapper = new LambdaQueryWrapper<>(); - sysResourceLambdaQueryWrapper.eq(SysResource::getResourceCode, resourceRequest.getResourceCode()); - SysResource sysResource = this.getOne(sysResourceLambdaQueryWrapper); - if (sysResource != null) { - - // 实体转化为ResourceDefinition - ResourceDefinition resourceDefinition = ResourceFactory.createResourceDefinition(sysResource); - - // 填充具体的提示信息 - return ResourceFactory.fillResourceDetail(resourceDefinition); - } else { - return null; - } - } - - @Override - public void deleteResourceByProjectCode(String projectCode) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SysResource::getProjectCode, projectCode); - this.remove(wrapper); - } - - @Override - public void updateResourceAppCode(String newAppCode) { - // 获取所有资源表信息 - List list = this.list(); - - // 批量更新资源编码 - for (SysResource sysResource : list) { - String newResourceCode = GunsResourceCodeUtil.replace(sysResource.getResourceCode(), newAppCode); - sysResource.setResourceCode(newResourceCode); - } - - this.updateBatchById(list); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void reportResources(@RequestBody ReportResourceParam reportResourceReq) { - this.reportResourcesAndGetResult(reportResourceReq); - } - - @Override - public List reportResourcesAndGetResult(ReportResourceParam reportResourceReq) { - String projectCode = reportResourceReq.getProjectCode(); - Map> resourceDefinitions = reportResourceReq.getResourceDefinitions(); - - if (ObjectUtil.isEmpty(projectCode) || resourceDefinitions == null) { - return new ArrayList<>(); - } - - // 根据project删除该项目下的所有资源 - this.deleteResourceByProjectCode(projectCode); - - // 获取当前应用的所有资源 - ArrayList allResources = new ArrayList<>(); - ArrayList resourceDefinitionArrayList = new ArrayList<>(); - for (Map.Entry> appModularResources : resourceDefinitions.entrySet()) { - Map value = appModularResources.getValue(); - for (Map.Entry modularResources : value.entrySet()) { - resourceDefinitionArrayList.add(modularResources.getValue()); - SysResource resource = ResourceFactory.createResource(modularResources.getValue()); - allResources.add(resource); - } - } - - // 将资源存入库中 - DbTypeEnum currentDbType = DbOperatorContext.me().getCurrentDbType(); - if (DbTypeEnum.MYSQL.equals(currentDbType)) { - // 分批插入记录 - List> split = ListUtil.split(allResources, RuleConstants.DEFAULT_BATCH_INSERT_SIZE); - for (List sysResources : split) { - this.getBaseMapper().insertBatchSomeColumn(sysResources); - } - } else { - this.saveBatch(allResources, allResources.size()); - } - - // 将资源存入缓存一份 - Map resourceDefinitionMap = ResourceFactory.orderedResourceDefinition(resourceDefinitionArrayList); - for (Map.Entry entry : resourceDefinitionMap.entrySet()) { - resourceCache.put(entry.getKey(), entry.getValue()); - } - - // 组装返回结果 - ArrayList finalResult = new ArrayList<>(); - for (SysResource item : allResources) { - SysResourcePersistencePojo sysResourcePersistencePojo = new SysResourcePersistencePojo(); - BeanUtil.copyProperties(item, sysResourcePersistencePojo); - finalResult.add(sysResourcePersistencePojo); - } - - return finalResult; - } - - @Override - public ResourceDefinition getResourceByUrl(@RequestBody ResourceUrlParam resourceUrlReq) { - if (ObjectUtil.isEmpty(resourceUrlReq.getUrl())) { - return null; - } else { - - // 先从缓存中查询 - ResourceDefinition tempCachedResourceDefinition = resourceCache.get(resourceUrlReq.getUrl()); - if (tempCachedResourceDefinition != null) { - return tempCachedResourceDefinition; - } - - // 缓存中没有去数据库查询 - List resources = resourceMapper.selectList(new QueryWrapper().eq("url", resourceUrlReq.getUrl())); - - if (resources == null || resources.isEmpty()) { - return null; - } else { - - // 获取接口资源信息 - SysResource resource = resources.get(0); - ResourceDefinition resourceDefinition = new ResourceDefinition(); - BeanUtils.copyProperties(resource, resourceDefinition); - - // 获取是否需要登录的标记, 判断是否需要登录,如果是则设置为true,否则为false - String requiredLoginFlag = resource.getRequiredLoginFlag(); - resourceDefinition.setRequiredLoginFlag(YesOrNotEnum.Y.name().equals(requiredLoginFlag)); - - // 获取请求权限的标记,判断是否有权限,如果有则设置为true,否则为false - String requiredPermissionFlag = resource.getRequiredPermissionFlag(); - resourceDefinition.setRequiredPermissionFlag(YesOrNotEnum.Y.name().equals(requiredPermissionFlag)); - - // 查询结果添加到缓存 - resourceCache.put(resourceDefinition.getUrl(), resourceDefinition); - - return resourceDefinition; - } - } - } - - @Override - public Set getResourceUrlsListByCodes(Set resourceCodes) { - - if (resourceCodes == null || resourceCodes.isEmpty()) { - return new HashSet<>(); - } - - // 拼接in条件 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(SysResource::getResourceCode, resourceCodes); - queryWrapper.select(SysResource::getUrl); - - // 获取资源详情 - List list = this.list(queryWrapper); - return list.stream().map(SysResource::getUrl).collect(Collectors.toSet()); - } - - @Override - public Integer getResourceCount() { - long count = this.count(); - return Convert.toInt(count); - } - - @Override - public List getTotalResourceCode(ResBizTypeEnum resBizTypeEnum) { - - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.select(SysResource::getResourceCode, SysResource::getResourceBizType); - - // 根据资源类型查询 - queryWrapper.eq(ObjectUtil.isNotEmpty(resBizTypeEnum), SysResource::getResourceBizType, resBizTypeEnum.getCode()); - - List list = this.list(queryWrapper); - - ArrayList results = new ArrayList<>(); - for (SysResource sysResource : list) { - SysRoleResourceDTO sysRoleResourceDTO = new SysRoleResourceDTO(); - sysRoleResourceDTO.setResourceCode(sysResource.getResourceCode()); - sysRoleResourceDTO.setResourceBizType(sysResource.getResourceBizType()); - results.add(sysRoleResourceDTO); - } - - return results; - } - - @Override - public Integer getResourceBizTypeByCode(String resCode) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.select(SysResource::getResourceBizType); - queryWrapper.eq(SysResource::getResourceCode, resCode); - SysResource one = this.getOne(queryWrapper, false); - if (one == null) { - return ResBizTypeEnum.DEFAULT.getCode(); - } else { - return one.getResourceBizType(); - } - } - /** * 创建wrapper * @@ -459,119 +75,16 @@ public class SysResourceServiceImpl extends ServiceImpl>> divideResources(List sysResources) { - HashMap>> appModularResources = new HashMap<>(); - for (SysResource sysResource : sysResources) { - - // 查询应用下有无资源 - String appCode = sysResource.getAppCode(); - Map> modularResource = appModularResources.get(appCode); - - // 该应用下没资源就创建一个map - if (modularResource == null) { - modularResource = new HashMap<>(); - } - - // 查询当前资源的模块,有没有在appModularResources存在 - List resourceTreeNodes = modularResource.get(sysResource.getModularCode()); - if (resourceTreeNodes == null) { - resourceTreeNodes = new ArrayList<>(); - } - - // 将当前资源放入资源集合 - LayuiApiResourceTreeNode resourceTreeNode = new LayuiApiResourceTreeNode(); - resourceTreeNode.setResourceFlag(true); - resourceTreeNode.setTitle(sysResource.getResourceName()); - resourceTreeNode.setId(sysResource.getResourceCode()); - resourceTreeNode.setParentId(sysResource.getModularCode()); - resourceTreeNode.setUrl(sysResource.getUrl()); - resourceTreeNode.setSpread(false); - resourceTreeNodes.add(resourceTreeNode); - - modularResource.put(sysResource.getModularCode(), resourceTreeNodes); - appModularResources.put(appCode, modularResource); - } - return appModularResources; - } - - /** - * 创建模块code和name的映射 - * - * @author fengshuonan - * @since 2020/12/21 11:23 - */ - private Map createModularCodeName(List resources) { - HashMap modularCodeName = new HashMap<>(); - for (SysResource resource : resources) { - modularCodeName.put(resource.getModularCode(), resource.getModularName()); - } - return modularCodeName; - } - - /** - * 根据归好类的资源,创建资源树 - * - * @author fengshuonan - * @since 2020/12/18 15:45 - */ - private List createResourceTree(Map>> appModularResources, Map modularCodeName) { - - List finalTree = new ArrayList<>(); - - // 按应用遍历应用模块资源集合 - for (String appName : appModularResources.keySet()) { - - // 创建当前应用节点 - LayuiApiResourceTreeNode appNode = new LayuiApiResourceTreeNode(); - appNode.setId(appName); - appNode.setTitle(appName); - appNode.setSpread(true); - appNode.setResourceFlag(false); - appNode.setParentId(TreeConstants.DEFAULT_PARENT_ID.toString()); - - // 遍历当前应用下的模块资源 - Map> modularResources = appModularResources.get(appName); - - // 创建模块节点 - ArrayList modularNodes = new ArrayList<>(); - for (String modularCode : modularResources.keySet()) { - LayuiApiResourceTreeNode modularNode = new LayuiApiResourceTreeNode(); - modularNode.setId(modularCode); - modularNode.setTitle(modularCodeName.get(modularCode)); - modularNode.setParentId(appName); - modularNode.setSpread(false); - modularNode.setResourceFlag(false); - modularNode.setChildren(modularResources.get(modularCode)); - modularNodes.add(modularNode); - } - - // 当前应用下添加模块的资源 - appNode.setChildren(modularNodes); - - // 添加到最终结果 - finalTree.add(appNode); - } - - return finalTree; - } - }