From 3b87239aa2c123ef392aab0a9ffad09980799c27 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Tue, 23 Mar 2021 13:58:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=AA=E8=A1=A8=E6=9D=BF=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E8=A7=86=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/mapper/ext/ExtPanelViewMapper.java | 13 + .../base/mapper/ext/ExtPanelViewMapper.xml | 47 ++ .../controller/panel/api/ViewApi.java | 21 + .../controller/panel/server/ViewServer.java | 43 ++ .../io/dataease/dto/panel/PanelViewDto.java | 26 + .../io/dataease/dto/panel/po/PanelViewPo.java | 15 + .../service/panel/PanelViewService.java | 69 ++ frontend/src/api/panel/view.js | 10 + frontend/src/views/panel/ViewSelect/index.vue | 122 ++++ frontend/src/views/panel/edit/index.vue | 10 +- frontend/src/views/panel/list/PanelView.vue | 624 +++++++++--------- 11 files changed, 686 insertions(+), 314 deletions(-) create mode 100644 backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.java create mode 100644 backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.xml create mode 100644 backend/src/main/java/io/dataease/controller/panel/api/ViewApi.java create mode 100644 backend/src/main/java/io/dataease/controller/panel/server/ViewServer.java create mode 100644 backend/src/main/java/io/dataease/dto/panel/PanelViewDto.java create mode 100644 backend/src/main/java/io/dataease/dto/panel/po/PanelViewPo.java create mode 100644 backend/src/main/java/io/dataease/service/panel/PanelViewService.java create mode 100644 frontend/src/api/panel/view.js create mode 100644 frontend/src/views/panel/ViewSelect/index.vue diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.java new file mode 100644 index 0000000000..58aa8aa7fe --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.java @@ -0,0 +1,13 @@ +package io.dataease.base.mapper.ext; + +import io.dataease.base.mapper.ext.query.GridExample; +import io.dataease.dto.panel.po.PanelViewPo; + +import java.util.List; + +public interface ExtPanelViewMapper { + + List groups(GridExample example); + + List views(GridExample example); +} diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.xml new file mode 100644 index 0000000000..e5ca5bc850 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/src/main/java/io/dataease/controller/panel/api/ViewApi.java b/backend/src/main/java/io/dataease/controller/panel/api/ViewApi.java new file mode 100644 index 0000000000..59d1edede9 --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/panel/api/ViewApi.java @@ -0,0 +1,21 @@ +package io.dataease.controller.panel.api; + + +import io.dataease.controller.sys.base.BaseGridRequest; +import io.dataease.dto.panel.PanelViewDto; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.List; + +@Api(tags = "仪表板:视图管理") +@RequestMapping("/api/panelView") +public interface ViewApi { + + + @ApiOperation("视图树") + @PostMapping("/tree") + List tree(BaseGridRequest request); +} diff --git a/backend/src/main/java/io/dataease/controller/panel/server/ViewServer.java b/backend/src/main/java/io/dataease/controller/panel/server/ViewServer.java new file mode 100644 index 0000000000..acf7e6bb12 --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/panel/server/ViewServer.java @@ -0,0 +1,43 @@ +package io.dataease.controller.panel.server; + +import io.dataease.commons.utils.AuthUtils; +import io.dataease.controller.panel.api.ViewApi; +import io.dataease.controller.sys.base.BaseGridRequest; +import io.dataease.controller.sys.base.ConditionEntity; +import io.dataease.dto.panel.PanelViewDto; +import io.dataease.dto.panel.po.PanelViewPo; +import io.dataease.service.panel.PanelViewService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + +@RestController +public class ViewServer implements ViewApi { + + @Autowired + private PanelViewService panelViewService; + + /** + * 为什么查两次? + * 因为left join 会导致全表扫描 + * 查两次在索引合理情况下 效率比查询一次高 + * @return + */ + @Override + public List tree(@RequestBody BaseGridRequest request) { + List conditions = new ArrayList<>(); + ConditionEntity condition = new ConditionEntity(); + condition.setField("create_by"); + condition.setOperator("eq"); + condition.setValue(AuthUtils.getUser().getUsername()); + conditions.add(condition); + request.setConditions(conditions); + List groups = panelViewService.groups(request); + List views = panelViewService.views(request); + List panelViewDtos = panelViewService.buildTree(groups, views); + return panelViewDtos; + } +} diff --git a/backend/src/main/java/io/dataease/dto/panel/PanelViewDto.java b/backend/src/main/java/io/dataease/dto/panel/PanelViewDto.java new file mode 100644 index 0000000000..240064c6ad --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/panel/PanelViewDto.java @@ -0,0 +1,26 @@ +package io.dataease.dto.panel; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +@Data +public class PanelViewDto { + + private String id; + + private String pid; + + private String type; + + private String name; + + private List children; + + public void addChild(PanelViewDto dto){ + children = Optional.ofNullable(children).orElse(new ArrayList<>()); + children.add(dto); + } +} diff --git a/backend/src/main/java/io/dataease/dto/panel/po/PanelViewPo.java b/backend/src/main/java/io/dataease/dto/panel/po/PanelViewPo.java new file mode 100644 index 0000000000..661069b136 --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/panel/po/PanelViewPo.java @@ -0,0 +1,15 @@ +package io.dataease.dto.panel.po; + +import lombok.Data; + +@Data +public class PanelViewPo { + + private String id; + + private String pid; + + private String type; + + private String name; +} diff --git a/backend/src/main/java/io/dataease/service/panel/PanelViewService.java b/backend/src/main/java/io/dataease/service/panel/PanelViewService.java new file mode 100644 index 0000000000..5a7de852c6 --- /dev/null +++ b/backend/src/main/java/io/dataease/service/panel/PanelViewService.java @@ -0,0 +1,69 @@ +package io.dataease.service.panel; + +import io.dataease.base.mapper.ext.ExtPanelViewMapper; +import io.dataease.base.mapper.ext.query.GridExample; +import io.dataease.commons.utils.BeanUtils; +import io.dataease.controller.sys.base.BaseGridRequest; +import io.dataease.dto.panel.PanelViewDto; +import io.dataease.dto.panel.po.PanelViewPo; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +public class PanelViewService { + + @Autowired(required = false) + private ExtPanelViewMapper extPanelViewMapper; + + private final static String SCENE_TYPE = "scene"; + + public List groups(BaseGridRequest request){ + GridExample example = request.convertExample(); + return extPanelViewMapper.groups(example); + } + + public List views(BaseGridRequest request){ + GridExample example = request.convertExample(); + return extPanelViewMapper.views(example); + } + + public List buildTree(List groups, List views){ + + if (CollectionUtils.isEmpty(groups) || CollectionUtils.isEmpty(views)) return null; + + Map> viewsMap = views.stream().collect(Collectors.groupingBy(PanelViewPo::getPid)); + List dtos = groups.stream().map(group -> BeanUtils.copyBean(new PanelViewDto(), group)).collect(Collectors.toList()); + List roots = new ArrayList<>(); + dtos.forEach(group -> { + // 查找跟节点 + if (ObjectUtils.isEmpty(group.getPid())){ + roots.add(group); + } + // 查找当前节点的子节点 + // 当前group是场景 + if (StringUtils.equals(group.getType(), SCENE_TYPE)){ + Optional.ofNullable(viewsMap.get(group.getId())).ifPresent(lists -> lists.forEach(view -> { + PanelViewDto dto = BeanUtils.copyBean(new PanelViewDto(), view); + group.addChild(dto); + })); + return; + } + // 当前group是分组 + dtos.forEach(item -> { + if (StringUtils.equals(item.getPid(), group.getId())){ + group.addChild(item); + } + }); + }); + // 最后 没有孩子的老东西淘汰 + return roots.stream().filter(item -> CollectionUtils.isNotEmpty(item.getChildren())).collect(Collectors.toList()); + } +} diff --git a/frontend/src/api/panel/view.js b/frontend/src/api/panel/view.js new file mode 100644 index 0000000000..35b71a64ac --- /dev/null +++ b/frontend/src/api/panel/view.js @@ -0,0 +1,10 @@ +import request from '@/utils/request' + +export function tree(data) { + return request({ + url: '/api/panelView/tree', + method: 'post', + loading: true, + data + }) +} diff --git a/frontend/src/views/panel/ViewSelect/index.vue b/frontend/src/views/panel/ViewSelect/index.vue new file mode 100644 index 0000000000..a8ca178ca7 --- /dev/null +++ b/frontend/src/views/panel/ViewSelect/index.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/frontend/src/views/panel/edit/index.vue b/frontend/src/views/panel/edit/index.vue index 4b1edac472..c4a2288c43 100644 --- a/frontend/src/views/panel/edit/index.vue +++ b/frontend/src/views/panel/edit/index.vue @@ -73,7 +73,8 @@
- + +
@@ -92,6 +93,7 @@ import DeContainer from '@/components/dataease/DeContainer' import DeAsideContainer from '@/components/dataease/DeAsideContainer' import { addClass, removeClass } from '@/utils' import FilterGroup from '../filter' +import ViewSelect from '../ViewSelect' import DrawingBoard from '../DrawingBoard' export default { components: { @@ -99,13 +101,15 @@ export default { DeContainer, DeAsideContainer, FilterGroup, + ViewSelect, DrawingBoard }, data() { return { show: false, - clickNotClose: false + clickNotClose: false, + showIndex: -1 } }, watch: { @@ -136,6 +140,7 @@ export default { }, showPanel(type) { this.show = !this.show + this.showIndex = type }, addEventClick() { window.addEventListener('click', this.closeSidebar) @@ -146,6 +151,7 @@ export default { if (!parent && !self) { this.show = false window.removeEventListener('click', this.closeSidebar) + this.showIndex = -1 } }, insertToBody() { diff --git a/frontend/src/views/panel/list/PanelView.vue b/frontend/src/views/panel/list/PanelView.vue index dee4a6d5f2..f2ff68f4d1 100644 --- a/frontend/src/views/panel/list/PanelView.vue +++ b/frontend/src/views/panel/list/PanelView.vue @@ -1,348 +1,348 @@