From e7c92127657a8c4df97b00cadcc7f965223a59c4 Mon Sep 17 00:00:00 2001 From: hiparker Date: Wed, 21 Apr 2021 19:24:20 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8F=9C=E5=8D=95=E6=96=B0=E5=A2=9E=E4=B8=8A?= =?UTF-8?q?=E7=BA=A7=E8=8F=9C=E5=8D=95=E9=80=89=E9=A1=B9=20-=20=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E5=8F=98=E6=9B=B4=E4=BC=9A=E6=9B=B4=E7=81=B5=E6=B4=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opsli/api/web/system/menu/MenuApi.java | 19 +- .../system/menu/mapper/MenuMapper.java | 15 ++ .../system/menu/mapper/xml/MenuMapper.xml | 9 + .../system/menu/service/IMenuService.java | 23 +- .../menu/service/impl/MenuServiceImpl.java | 62 ++++- .../system/menu/web/MenuRestController.java | 219 +++++++++++++++++- .../system/org/mapper/SysOrgMapper.java | 5 +- .../system/org/service/ISysOrgService.java | 3 +- 8 files changed, 331 insertions(+), 24 deletions(-) diff --git a/opsli-api/src/main/java/org/opsli/api/web/system/menu/MenuApi.java b/opsli-api/src/main/java/org/opsli/api/web/system/menu/MenuApi.java index 73ab30fe..c3fbe522 100644 --- a/opsli-api/src/main/java/org/opsli/api/web/system/menu/MenuApi.java +++ b/opsli-api/src/main/java/org/opsli/api/web/system/menu/MenuApi.java @@ -51,12 +51,29 @@ public interface MenuApi { /** - * 获得菜单 + * 获得列表菜单 * @return ResultVo */ @GetMapping("/findMenuTreePage") ResultVo findMenuTreePage(HttpServletRequest request); + /** + * 懒加载列表菜单 + * @param parentId 父节点ID + * @return + */ + @GetMapping("/findMenuTreePageByLazy") + ResultVo findMenuTreePageByLazy(String parentId); + + /** + * 懒加载菜单 + * @param parentId 父节点ID + * @return + */ + @GetMapping("/findMenuTreeByLazy") + ResultVo findMenuTreeByLazy(String parentId); + + /** * 获得当前用户登录菜单 * @return ResultVo diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/mapper/MenuMapper.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/mapper/MenuMapper.java index 095f5d5c..4e9d3ad0 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/mapper/MenuMapper.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/mapper/MenuMapper.java @@ -15,10 +15,16 @@ */ package org.opsli.modulars.system.menu.mapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.opsli.core.base.entity.HasChildren; import org.opsli.modulars.system.menu.entity.SysMenu; +import java.util.List; + /** * @BelongsProject: opsli-boot * @BelongsPackage: org.opsli.modulars.test.mapper @@ -29,4 +35,13 @@ import org.opsli.modulars.system.menu.entity.SysMenu; @Mapper public interface MenuMapper extends BaseMapper { + /** + * 是否有下级 + * @param wrapper 条件查询器 + * @return List + */ + List hasChildren(@Param(Constants.WRAPPER) Wrapper wrapper); + + + } diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/mapper/xml/MenuMapper.xml b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/mapper/xml/MenuMapper.xml index c1350aa1..cdebd29f 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/mapper/xml/MenuMapper.xml +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/mapper/xml/MenuMapper.xml @@ -3,4 +3,13 @@ + + diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/service/IMenuService.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/service/IMenuService.java index 8c0bbd6a..d0cf952d 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/service/IMenuService.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/service/IMenuService.java @@ -16,9 +16,13 @@ package org.opsli.modulars.system.menu.service; import org.opsli.api.wrapper.system.menu.MenuModel; +import org.opsli.core.base.entity.HasChildren; import org.opsli.core.base.service.interfaces.CrudServiceInterface; import org.opsli.modulars.system.menu.entity.SysMenu; +import java.util.List; +import java.util.Set; + /** * @BelongsProject: opsli-boot @@ -32,9 +36,24 @@ public interface IMenuService extends CrudServiceInterface { /** * 根据菜单权限 获得菜单 - * @param permissions - * @return + * @param permissions 权限 + * @return MenuModel */ MenuModel getByPermissions(String permissions); + + /** + * 是否有下级 + * @param parentIds 父节点Id Set + * @return List + */ + List hasChildren(Set parentIds); + + /** + * 是否有下级 - 选择控件 + * @param parentIds 父节点Id Set + * @return List + */ + List hasChildrenByChoose(Set parentIds); + } diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/service/impl/MenuServiceImpl.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/service/impl/MenuServiceImpl.java index d19b991a..4bd9b0b2 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/service/impl/MenuServiceImpl.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/service/impl/MenuServiceImpl.java @@ -25,6 +25,7 @@ import org.opsli.common.constants.MyBatisConstants; import org.opsli.common.enums.DictType; import org.opsli.common.exception.ServiceException; import org.opsli.common.utils.HumpUtil; +import org.opsli.core.base.entity.HasChildren; import org.opsli.core.base.service.impl.CrudServiceImpl; import org.opsli.core.msg.CoreMsg; import org.opsli.core.persistence.querybuilder.GenQueryBuilder; @@ -35,6 +36,7 @@ import org.opsli.modulars.system.SystemMsg; import org.opsli.modulars.system.menu.entity.SysMenu; import org.opsli.modulars.system.menu.mapper.MenuMapper; import org.opsli.modulars.system.menu.service.IMenuService; +import org.opsli.modulars.system.org.entity.SysOrg; import org.opsli.modulars.system.role.service.IRoleMenuRefService; import org.opsli.modulars.system.user.service.IUserRoleRefService; import org.springframework.beans.factory.annotation.Autowired; @@ -42,6 +44,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Set; /** @@ -84,11 +87,11 @@ public class MenuServiceImpl extends CrudServiceImpl 0){ - // 重复 - throw new ServiceException(SystemMsg.EXCEPTION_MENU_PERMISSIONS_UNIQUE); - } +// Integer count = this.uniqueVerificationByPermissions(model); +// if(count != null && count > 0){ +// // 重复 +// throw new ServiceException(SystemMsg.EXCEPTION_MENU_PERMISSIONS_UNIQUE); +// } // 如果上级ID 为空 则默认为 0 if(StringUtils.isEmpty(model.getParentId())){ @@ -128,11 +131,11 @@ public class MenuServiceImpl extends CrudServiceImpl 0){ - // 重复 - throw new ServiceException(SystemMsg.EXCEPTION_MENU_PERMISSIONS_UNIQUE); - } +// Integer count = this.uniqueVerificationByPermissions(model); +// if(count != null && count > 0){ +// // 重复 +// throw new ServiceException(SystemMsg.EXCEPTION_MENU_PERMISSIONS_UNIQUE); +// } MenuModel menuModel = super.update(model); if(menuModel != null){ @@ -213,6 +216,45 @@ public class MenuServiceImpl extends CrudServiceImpl hasChildren(Set parentIds){ + if(CollUtil.isEmpty(parentIds)){ + return null; + } + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.in(HumpUtil.humpToUnderline(MyBatisConstants.FIELD_PARENT_ID), parentIds) + .eq(MyBatisConstants.FIELD_DELETE_LOGIC, DictType.NO_YES_NO.getValue()) + .groupBy(HumpUtil.humpToUnderline(MyBatisConstants.FIELD_PARENT_ID)); + + return mapper.hasChildren(wrapper); + } + + /** + * 是否有下级 + * @param parentIds + * @return + */ + @Override + @Transactional(readOnly = true) + public List hasChildrenByChoose(Set parentIds){ + if(CollUtil.isEmpty(parentIds)){ + return null; + } + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.in(HumpUtil.humpToUnderline(MyBatisConstants.FIELD_PARENT_ID), parentIds) + .eq(MyBatisConstants.FIELD_DELETE_LOGIC, DictType.NO_YES_NO.getValue()) + .eq("type", "1") + .groupBy(HumpUtil.humpToUnderline(MyBatisConstants.FIELD_PARENT_ID)); + + return mapper.hasChildren(wrapper); + } + // ============ /** diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/web/MenuRestController.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/web/MenuRestController.java index ec62ea2c..a185c9c7 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/web/MenuRestController.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/web/MenuRestController.java @@ -26,6 +26,7 @@ import cn.hutool.core.util.ReflectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -39,9 +40,12 @@ import org.opsli.common.annotation.ApiRestController; import org.opsli.common.annotation.EnableLog; import org.opsli.common.annotation.RequiresPermissionsCus; import org.opsli.common.constants.MenuConstants; +import org.opsli.common.constants.MyBatisConstants; import org.opsli.common.exception.ServiceException; +import org.opsli.common.utils.HumpUtil; import org.opsli.common.utils.WrapperUtil; import org.opsli.core.base.controller.BaseRestController; +import org.opsli.core.base.entity.HasChildren; import org.opsli.core.general.StartPrint; import org.opsli.core.persistence.Page; import org.opsli.core.persistence.querybuilder.GenQueryBuilder; @@ -61,6 +65,7 @@ import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Method; import java.util.List; import java.util.Map; +import java.util.Set; /** @@ -79,7 +84,17 @@ public class MenuRestController extends BaseRestController findMenuTreeByLazy(String parentId) { + List menuModelList; + if(StringUtils.isEmpty(parentId)){ + menuModelList = Lists.newArrayList(); + parentId = VIRTUAL_TOTAL_NODE; + MenuModel model = new MenuModel(); + model.setId(BASE_NODE); + model.setMenuName("根节点"); + model.setHidden("0"); + model.setSortNo(-1); + model.setType("1"); + model.setParentId(parentId); + menuModelList.add(model); + }else{ + // 只查菜单 + QueryBuilder queryBuilder = new GenQueryBuilder<>(); + QueryWrapper queryWrapper = queryBuilder.build(); + queryWrapper.eq(HumpUtil.humpToUnderline(MyBatisConstants.FIELD_PARENT_ID), parentId); + queryWrapper.eq("type", "1"); + + // 获得菜单 + List menuList = IService.findList(queryWrapper); + menuModelList = WrapperUtil.transformInstance(menuList, MenuModel.class); + } + + // 获得菜单树 + List> treeNodes = getMenuTrees(menuModelList, parentId,1); + + // 处理是否包含子集 + this.handleTreeIsLeafByChoose(treeNodes); + + return ResultVo.success(treeNodes); + } + + /** + * 获得列表菜单树 懒加载 + * @return ResultVo + */ + @ApiOperation(value = "获得列表菜单树 懒加载", notes = "获得列表菜单树 懒加载") + @RequiresPermissions("system_menu_select") + @Override + public ResultVo findMenuTreePageByLazy(String parentId) { + List menuModelList; + if(StringUtils.isEmpty(parentId)){ + menuModelList = Lists.newArrayList(); + parentId = VIRTUAL_TOTAL_NODE; + MenuModel model = new MenuModel(); + model.setId(BASE_NODE); + model.setMenuName("根节点"); + model.setHidden("0"); + model.setSortNo(-1); + model.setType("1"); + model.setParentId(parentId); + menuModelList.add(model); + }else{ + QueryBuilder queryBuilder = new GenQueryBuilder<>(); + QueryWrapper queryWrapper = queryBuilder.build(); + queryWrapper.eq(HumpUtil.humpToUnderline(MyBatisConstants.FIELD_PARENT_ID), parentId); + + // 获得菜单 + List menuList = IService.findList(queryWrapper); + menuModelList = WrapperUtil.transformInstance(menuList, MenuModel.class); + } + // 获得菜单树 + List> treeNodes = getMenuTrees(menuModelList, parentId,1); + + // 处理是否包含子集 + this.handleTreeHasChildren(treeNodes); + + return ResultVo.success(treeNodes); + } + + /** + * 获得列表菜单树 * @return ResultVo */ - @ApiOperation(value = "获得菜单树", notes = "获得菜单树") + @ApiOperation(value = "获得列表菜单树", notes = "获得列表菜单树") @RequiresPermissions("system_menu_select") @Override public ResultVo findMenuTreePage(HttpServletRequest request) { @@ -164,7 +259,7 @@ public class MenuRestController extends BaseRestController menuList = IService.findList(queryBuilder.build()); List menuModelList = WrapperUtil.transformInstance(menuList, MenuModel.class); @@ -198,10 +293,21 @@ public class MenuRestController extends BaseRestController get(MenuModel model) { - // 如果系统内部调用 则直接查数据库 - if(model != null && model.getIzApi() != null && model.getIzApi()){ - model = IService.get(model); + if(model != null){ + if(StringUtils.equals(BASE_NODE, model.getId())){ + model.setMenuName("根节点"); + model.setHidden("0"); + model.setSortNo(-1); + model.setType("1"); + model.setParentId(VIRTUAL_TOTAL_NODE); + }else{ + // 如果系统内部调用 则直接查数据库 + if (model.getIzApi() != null && model.getIzApi()){ + model = IService.get(model); + } + } } + return ResultVo.success(model); } @@ -429,7 +535,17 @@ public class MenuRestController extends BaseRestController> getMenuTrees(List menuList) { //转换器 - return this.getMenuTrees(menuList, null); + return this.getMenuTrees(menuList, null,4 ); + } + + /** + * 获得菜单树 + * @param menuList 菜单集合 + * @return List + */ + private List> getMenuTrees(List menuList, String parentId, int deep) { + //转换器 + return this.getMenuTrees(menuList, null, parentId, deep); } /** @@ -439,10 +555,25 @@ public class MenuRestController extends BaseRestController> getMenuTrees(List menuList, String[] exclusionFields) { + return getMenuTrees(menuList, exclusionFields, null, 4); + } + + /** + * 获得菜单树 + * @param menuList 菜单集合 + * @param exclusionFields 排除字段 + * @return List + */ + private List> getMenuTrees(List menuList, String[] exclusionFields, + String parentId, int deep) { if(CollUtil.isEmpty(menuList)){ return ListUtil.empty(); } + // 如果层级等于 0 默认为4层 + if(deep == 0){ + deep = 4; + } // 获得BeanMapList List> beanMapList = this.getBeanMapList(menuList, exclusionFields); @@ -452,10 +583,82 @@ public class MenuRestController extends BaseRestController> treeNodes) { + if(CollUtil.isEmpty(treeNodes)){ + return; + } + + Set parentIds = Sets.newHashSet(); + for (Tree treeNode : treeNodes) { + parentIds.add(Convert.toStr(treeNode.getId())); + } + + // 数据排查是否存在下级 + List hasChildrenList = IService.hasChildren(parentIds); + if (CollUtil.isNotEmpty(hasChildrenList)) { + Map tmp = Maps.newHashMap(); + for (HasChildren hasChildren : hasChildrenList) { + if (hasChildren.getCount() != null && hasChildren.getCount() > 0) { + tmp.put(hasChildren.getParentId(), true); + } + } + + for (Tree treeNode : treeNodes) { + Boolean tmpFlag = tmp.get(Convert.toStr(treeNode.getId())); + if (tmpFlag != null && tmpFlag) { + treeNode.putExtra(HAS_CHILDREN, true); + } + } + } + } + + + /** + * 处理是否包含子集 + * @param treeNodes 树节点 + */ + private void handleTreeIsLeafByChoose(List> treeNodes) { + if(CollUtil.isEmpty(treeNodes)){ + return; + } + + Set parentIds = Sets.newHashSet(); + for (Tree treeNode : treeNodes) { + parentIds.add(Convert.toStr(treeNode.getId())); + } + + // 数据排查是否存在下级 + List hasChildrenList = IService.hasChildrenByChoose(parentIds); + Map tmp = Maps.newHashMap(); + for (HasChildren hasChildren : hasChildrenList) { + if (hasChildren.getCount() != null && hasChildren.getCount() > 0) { + tmp.put(hasChildren.getParentId(), false); + } + } + + for (Tree treeNode : treeNodes) { + Boolean tmpFlag = tmp.get(Convert.toStr(treeNode.getId())); + if (tmpFlag == null || tmpFlag) { + treeNode.putExtra(IS_LEAF, true); + }else { + treeNode.putExtra(IS_LEAF, false); + } + } + } } diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/org/mapper/SysOrgMapper.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/org/mapper/SysOrgMapper.java index 9cd6a347..a6fc08d5 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/org/mapper/SysOrgMapper.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/org/mapper/SysOrgMapper.java @@ -38,14 +38,15 @@ public interface SysOrgMapper extends BaseMapper { /** * 是否有下级 - * @return + * @param wrapper 条件查询器 + * @return List */ List hasChildren(@Param(Constants.WRAPPER) Wrapper wrapper); /** * 是否被引用 - * @return + * @return Integer */ Integer hasUse(@Param(Constants.WRAPPER) Wrapper wrapper); diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/org/service/ISysOrgService.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/org/service/ISysOrgService.java index 1d9a87b3..48330a7e 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/org/service/ISysOrgService.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/org/service/ISysOrgService.java @@ -36,7 +36,8 @@ public interface ISysOrgService extends CrudServiceInterface hasChildren(Set parentIds);