diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysMenuMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysMenuMapper.java new file mode 100644 index 0000000000..147e44e607 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysMenuMapper.java @@ -0,0 +1,13 @@ +package io.dataease.base.mapper.ext; + +import io.dataease.base.mapper.ext.query.GridExample; +import io.dataease.controller.sys.request.SimpleTreeNode; + +import java.util.List; + +public interface ExtSysMenuMapper { + + List allNodes(); + + List nodesByExample(GridExample example); +} diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysMenuMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysMenuMapper.xml new file mode 100644 index 0000000000..5314bba41d --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysMenuMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + diff --git a/backend/src/main/java/io/dataease/controller/sys/SysMenuController.java b/backend/src/main/java/io/dataease/controller/sys/SysMenuController.java index e99b4963c7..f24e883f43 100644 --- a/backend/src/main/java/io/dataease/controller/sys/SysMenuController.java +++ b/backend/src/main/java/io/dataease/controller/sys/SysMenuController.java @@ -5,8 +5,11 @@ import io.dataease.base.domain.SysMenu; import io.dataease.commons.utils.BeanUtils; import io.dataease.controller.handler.annotation.I18n; +import io.dataease.controller.sys.base.BaseGridRequest; import io.dataease.controller.sys.request.MenuCreateRequest; import io.dataease.controller.sys.request.MenuDeleteRequest; +import io.dataease.controller.sys.request.SimpleTreeNode; +import io.dataease.controller.sys.response.DeptNodeResponse; import io.dataease.controller.sys.response.MenuNodeResponse; import io.dataease.controller.sys.response.MenuTreeNode; import io.dataease.service.sys.MenuService; @@ -37,6 +40,20 @@ public class SysMenuController { return menuService.convert(nodes); } + @ApiOperation("搜索菜单树") + @I18n + @PostMapping("/search") + public List search(@RequestBody BaseGridRequest request) { + List nodes = menuService.nodesTreeByCondition(request); + List nodeResponses = nodes.stream().map(node -> { + MenuNodeResponse menuNodeResponse = BeanUtils.copyBean(new MenuNodeResponse(), node); + menuNodeResponse.setHasChildren(node.getSubCount() > 0); + menuNodeResponse.setTop(node.getPid() == menuService.MENU_ROOT_PID); + return menuNodeResponse; + }).collect(Collectors.toList()); + return nodeResponses; + } + @ApiOperation("新增菜单") diff --git a/backend/src/main/java/io/dataease/service/sys/MenuService.java b/backend/src/main/java/io/dataease/service/sys/MenuService.java index 725fa7b390..361d98d768 100644 --- a/backend/src/main/java/io/dataease/service/sys/MenuService.java +++ b/backend/src/main/java/io/dataease/service/sys/MenuService.java @@ -1,26 +1,24 @@ package io.dataease.service.sys; -import io.dataease.base.domain.SysDept; + import io.dataease.base.domain.SysMenu; import io.dataease.base.domain.SysMenuExample; import io.dataease.base.mapper.SysMenuMapper; import io.dataease.base.mapper.ext.ExtMenuMapper; +import io.dataease.base.mapper.ext.ExtSysMenuMapper; import io.dataease.commons.utils.BeanUtils; +import io.dataease.controller.sys.base.BaseGridRequest; import io.dataease.controller.sys.request.MenuCreateRequest; import io.dataease.controller.sys.request.MenuDeleteRequest; -import io.dataease.controller.sys.response.DeptTreeNode; +import io.dataease.controller.sys.request.SimpleTreeNode; import io.dataease.controller.sys.response.MenuNodeResponse; - import io.dataease.controller.sys.response.MenuTreeNode; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.HashSet; -import java.util.List; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @Service @@ -34,6 +32,8 @@ public class MenuService { @Resource private SysMenuMapper sysMenuMapper; + @Resource + private ExtSysMenuMapper extSysMenuMapper; @Resource private ExtMenuMapper extMenuMapper; @@ -173,4 +173,54 @@ public class MenuService { } + + public List nodesTreeByCondition(BaseGridRequest request){ + List allNodes = allNodes(); + List targetNodes = nodeByCondition(request); + if(org.apache.commons.collections.CollectionUtils.isEmpty(targetNodes)){ + return new ArrayList<>(); + } + List ids = upTree(allNodes, targetNodes); + SysMenuExample example = new SysMenuExample(); + if (org.apache.commons.collections.CollectionUtils.isNotEmpty(ids)){ + SysMenuExample.Criteria criteria = example.createCriteria(); + criteria.andMenuIdIn(ids); + } + List sysMenus = sysMenuMapper.selectByExample(example); + return sysMenus; + } + + public List allNodes() { + List allNodes = extSysMenuMapper.allNodes(); + return allNodes; + } + + public List nodeByCondition(BaseGridRequest request) { + List simpleTreeNodes = extSysMenuMapper.nodesByExample(request.convertExample()); + return simpleTreeNodes; + } + + /** + * 找出目标节点所在路径上的所有节点 向上找 + * @param allNodes 所有节点 + * @param targetNodes 目标节点 + * @return + */ + private List upTree(List allNodes, List targetNodes){ + final Map map = allNodes.stream().collect(Collectors.toMap(SimpleTreeNode::getId, node -> node)); + List results = targetNodes.parallelStream().flatMap(targetNode -> { + //向上逐级找爹 + List ids = new ArrayList<>(); + SimpleTreeNode node = targetNode; + while (node != null) { + ids.add(node.getId()); + Long pid = node.getPid(); + node = map.get(pid); + } + return ids.stream(); + }).distinct().collect(Collectors.toList()); + return results; + } + + } diff --git a/frontend/public/link.html b/frontend/public/link.html index 49f14a454c..c56ef18665 100644 --- a/frontend/public/link.html +++ b/frontend/public/link.html @@ -7,7 +7,7 @@ DataEase - + diff --git a/frontend/src/api/chart/chart.js b/frontend/src/api/chart/chart.js index 696ccb44b5..ab528b0aaa 100644 --- a/frontend/src/api/chart/chart.js +++ b/frontend/src/api/chart/chart.js @@ -9,6 +9,15 @@ export function post(url, data) { }) } +export function ajaxGetData(id, data) { + return request({ + url: '/chart/view/getData/' + id, + method: 'post', + loading: true, + hideMsg: true, + data + }) +} export function getChartTree(data) { return request({ diff --git a/frontend/src/api/system/menu.js b/frontend/src/api/system/menu.js index 2aef84616e..b7df138446 100644 --- a/frontend/src/api/system/menu.js +++ b/frontend/src/api/system/menu.js @@ -53,4 +53,12 @@ export function treeByMenuId(menuId) { }) } -export default { addMenu, editMenu, delMenu, getMenusTree, getChild, treeByMenuId } +export function queryCondition(data) { + return request({ + url: '/api/menu/search', + method: 'post', + data + }) +} + +export default { addMenu, editMenu, delMenu, getMenusTree, getChild, treeByMenuId, queryCondition } diff --git a/frontend/src/components/canvas/components/Editor/Preview.vue b/frontend/src/components/canvas/components/Editor/Preview.vue index ca235ed72e..0d2e07ce34 100644 --- a/frontend/src/components/canvas/components/Editor/Preview.vue +++ b/frontend/src/components/canvas/components/Editor/Preview.vue @@ -1,7 +1,7 @@