소스 검색

优化分组逻辑

AE86 2 년 전
부모
커밋
1672227f72

+ 18 - 12
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/group/ProjectGroupChecker.java

@@ -1,6 +1,7 @@
 package org.dbsyncer.biz.checker.impl.group;
 
 import org.dbsyncer.biz.checker.AbstractChecker;
+import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.manager.Manager;
 import org.dbsyncer.parser.model.ConfigModel;
@@ -14,9 +15,6 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.Map;
 
-import static org.dbsyncer.storage.constant.ConfigConstant.CONFIG_MODEL_ID;
-import static org.dbsyncer.storage.constant.ConfigConstant.PROJECT_GROUP;
-
 /**
  * @author xinpeng.Fu
  * @version 1.0.0
@@ -36,15 +34,13 @@ public class ProjectGroupChecker extends AbstractChecker {
      */
     @Override
     public ConfigModel checkAddConfigModel(Map<String, String> params) {
-        String mappingIds = params.get("mappingIds");
-        String connectorIds = params.get("connectorIds");
         String name = params.get(ConfigConstant.CONFIG_MODEL_NAME);
         ProjectGroup projectGroup = new ProjectGroup();
-        projectGroup.setMappingIds(StringUtil.isBlank(mappingIds) ? Collections.emptyList() : Arrays.asList(mappingIds.split(",")));
-        projectGroup.setConnectorIds(StringUtil.isBlank(connectorIds) ? Collections.emptyList() : Arrays.asList(connectorIds.split(",")));
-        projectGroup.setType(PROJECT_GROUP);
+        projectGroup.setType(ConfigConstant.PROJECT_GROUP);
         projectGroup.setName(name);
 
+        modifyProjectGroup(projectGroup, params);
+
         // 修改基本配置
         this.modifyConfigModel(projectGroup, params);
 
@@ -59,15 +55,25 @@ public class ProjectGroupChecker extends AbstractChecker {
      */
     @Override
     public ConfigModel checkEditConfigModel(Map<String, String> params) {
-        String id = params.get(CONFIG_MODEL_ID);
+        String id = params.get(ConfigConstant.CONFIG_MODEL_ID);
         ProjectGroup projectGroup = manager.getProjectGroup(id);
         Assert.notNull(projectGroup, "Can not find project group.");
 
-        // TODO
+        modifyProjectGroup(projectGroup, params);
 
         // 修改基本配置
         this.modifyConfigModel(projectGroup, params);
-
         return projectGroup;
     }
-}
+
+    private void modifyProjectGroup(ProjectGroup projectGroup, Map<String, String> params) {
+        String[] connectorIds = StringUtil.split(params.get("connectorIds"), "|");
+        String[] mappingIds = StringUtil.split(params.get("mappingIds"), "|");
+        boolean exist = (connectorIds != null && connectorIds.length > 0) | (mappingIds != null && mappingIds.length > 0);
+        Assert.isTrue(exist, "请选择连接或驱动.");
+
+        projectGroup.setConnectorIds(CollectionUtils.isEmpty(connectorIds) ? Collections.EMPTY_LIST : Arrays.asList(connectorIds));
+        projectGroup.setMappingIds(CollectionUtils.isEmpty(mappingIds) ? Collections.EMPTY_LIST : Arrays.asList(mappingIds));
+    }
+
+}

+ 7 - 7
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/ProjectGroupServiceImpl.java

@@ -13,14 +13,12 @@ import org.dbsyncer.parser.logger.LogType;
 import org.dbsyncer.parser.model.ConfigModel;
 import org.dbsyncer.parser.model.Connector;
 import org.dbsyncer.parser.model.ProjectGroup;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -81,6 +79,9 @@ public class ProjectGroupServiceImpl extends BaseServiceImpl implements ProjectG
 
         ProjectGroup projectGroup = manager.getProjectGroup(id);
         Assert.notNull(projectGroup, "该分组已被删除");
+        BeanUtils.copyProperties(projectGroup, vo);
+        vo.setConnectors(Collections.EMPTY_LIST);
+        vo.setMappings(Collections.EMPTY_LIST);
 
         // 过滤连接器
         List<String> connectorIds = projectGroup.getConnectorIds();
@@ -112,8 +113,7 @@ public class ProjectGroupServiceImpl extends BaseServiceImpl implements ProjectG
 
     @Override
     public List<ProjectGroup> getProjectGroupAll() {
-        List<ProjectGroup> list = manager.getProjectGroupAll();
-        return list;
+        return manager.getProjectGroupAll();
     }
 
-}
+}

+ 3 - 2
dbsyncer-biz/src/main/java/org/dbsyncer/biz/vo/ProjectGroupVo.java

@@ -1,6 +1,7 @@
 package org.dbsyncer.biz.vo;
 
 import org.dbsyncer.parser.model.Connector;
+import org.dbsyncer.parser.model.ProjectGroup;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -10,7 +11,7 @@ import java.util.List;
  * @version 1.0.0
  * @date 2022/7/18 0:25
  */
-public class ProjectGroupVo {
+public class ProjectGroupVo extends ProjectGroup {
 
     private List<Connector> connectors = new ArrayList<>();
 
@@ -31,4 +32,4 @@ public class ProjectGroupVo {
     public void setMappings(List<MappingVo> mappings) {
         this.mappings = mappings;
     }
-}
+}

+ 8 - 16
dbsyncer-web/src/main/java/org/dbsyncer/web/controller/index/ProjectGroupController.java

@@ -29,16 +29,17 @@ public class ProjectGroupController extends BaseController {
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     @Autowired
-    private ConnectorService connectorService;
+    private ProjectGroupService projectGroupService;
 
     @Autowired
-    private MappingService mappingService;
+    private ConnectorService connectorService;
 
     @Autowired
-    private ProjectGroupService projectGroupService;
+    private MappingService mappingService;
 
     @GetMapping("/page/add")
     public String pageAdd(HttpServletRequest request, ModelMap model) {
+        model.put("projectGroup", projectGroupService.getProjectGroup(null));
         model.put("connectors", connectorService.getConnectorAll());
         model.put("mappings", mappingService.getMappingAll());
         return "group/save";
@@ -46,18 +47,14 @@ public class ProjectGroupController extends BaseController {
 
     @GetMapping("/page/edit")
     public String pageEdit(HttpServletRequest request, ModelMap model, String id) {
-        ProjectGroupVo projectGroup = projectGroupService.getProjectGroup(id);
-        model.put("projectGroup", projectGroup);
+        model.put("projectGroup", projectGroupService.getProjectGroup(id));
         model.put("connectors", connectorService.getConnectorAll());
         model.put("mappings", mappingService.getMappingAll());
         return "group/save";
     }
 
     /**
-     * 参数:
-     * name(必)
-     * mappingIds
-     * connectorIds
+     * 参数: name(必) mappingIds connectorIds
      *
      * @param request
      * @return org.dbsyncer.biz.vo.RestResult
@@ -77,11 +74,7 @@ public class ProjectGroupController extends BaseController {
     }
 
     /**
-     * 参数:
-     * id(必)
-     * name(必)
-     * mappingIds
-     * connectorIds
+     * 参数: id(必) name(必) mappingIds connectorIds
      *
      * @param request
      * @return org.dbsyncer.biz.vo.RestResult
@@ -101,8 +94,7 @@ public class ProjectGroupController extends BaseController {
     }
 
     /**
-     * 参数:
-     * id(必)
+     * 参数: id(必)
      *
      * @param request
      * @return org.dbsyncer.biz.vo.RestResult

+ 11 - 10
dbsyncer-web/src/main/resources/public/group/save.html

@@ -4,7 +4,7 @@ xmlns:th="http://www.thymeleaf.org" lang="zh-CN">
 
 <div class="container-fluid">
   <div class="container">
-    <form id="groupAddForm" class="form-horizontal" role="form" method="post">
+    <form id="projectGroupAddForm" class="form-horizontal" role="form" method="post">
       <!-- 标题 -->
       <div class="row text-center">
         <div class="page-header">
@@ -16,10 +16,10 @@ xmlns:th="http://www.thymeleaf.org" lang="zh-CN">
       <div class="form-group">
         <div class="col-md-10"></div>
         <div class="col-md-2 text-right">
-          <button id="groupSubmitBtn" type="button" class="btn btn-primary">
+          <button id="projectGroupSubmitBtn" type="button" class="btn btn-primary">
             <span class="fa fa-save"></span>保存
           </button>
-          <button id="groupBackBtn" type="button" class="btn btn-default">
+          <button id="projectGroupBackBtn" type="button" class="btn btn-default">
             <span class="fa fa-reply"></span>返回
           </button>
         </div>
@@ -36,31 +36,32 @@ xmlns:th="http://www.thymeleaf.org" lang="zh-CN">
             <div class="panel-body">
               <!-- 名称 -->
               <div class="form-group">
-                <label class="col-sm-2 control-label">名称 <strong
-                        class="driverVerifcateRequired">*</strong></label>
+                <label class="col-sm-2 control-label">名称 <strong class="driverVerifcateRequired">*</strong></label>
                 <div class="col-sm-10">
                   <input type="hidden" name="id" id="id" th:value="${projectGroup?.id}">
                   <input class="form-control" name="name" type="text" maxlength="50" dbsyncer-valid="require" placeholder="名称" th:value="${projectGroup?.name}"/>
                 </div>
               </div>
+
               <!-- 选择连接 -->
               <div class="form-group">
                 <label class="col-sm-2 control-label">连接</label>
                 <div class="col-sm-10">
                   <select id="connectorIds" name="connectorIds" class="form-control select-control-table" multiple="multiple">
-                    <option th:each="t,s:${connectors}" th:value="${t?.id}" th:text="${t?.name}" />
+                    <option th:each="c,s:${connectors}" th:value="${c?.id}" th:text="${c?.name}" />
                   </select>
-                  <input id="selectedConnectors" type="hidden" th:value="${selectedConnectors}"/>
+                  <input id="selectedConnectorIds" type="hidden" th:value="${#strings.listJoin(projectGroup?.connectorIds,',')}"/>
                 </div>
               </div>
+
               <!-- 选择驱动 -->
               <div class="form-group">
                 <label class="col-sm-2 control-label">驱动</label>
                 <div class="col-sm-10">
                   <select id="mappingIds" name="mappingIds" class="form-control select-control-table" multiple="multiple">
-                    <option th:each="t,s:${mappings}" th:value="${t?.id}" th:text="${t?.name}" />
+                    <option th:each="m,s:${mappings}" th:value="${m?.id}" th:text="${m?.name}" />
                   </select>
-                  <input id="selectedMappings" type="hidden" th:value="${selectedMappings}"/>
+                  <input id="selectedMappingIds" type="hidden" th:value="${#strings.listJoin(projectGroup?.mappingIds,',')}"/>
                 </div>
               </div>
 
@@ -74,4 +75,4 @@ xmlns:th="http://www.thymeleaf.org" lang="zh-CN">
 </div>
 
 <script th:src="@{/js/group/addOrEdit.js}"></script>
-</html>
+</html>

+ 12 - 11
dbsyncer-web/src/main/resources/public/index/index.html

@@ -26,19 +26,20 @@
                                         <select id="projectGroup" name="projectGroup"
                                                 class="form-control select-control">
                                             <option value="" th:text="全部" selected/>
-                                            <option th:each="t,s:${projectGroups}" th:value="${t?.id}"
-                                                    th:text="${t?.name}"/>
+                                            <option th:each="g,s:${projectGroups}" th:value="${g?.id}" th:text="${g?.name}" th:selected="${g?.id eq projectGroupId}"/>
                                         </select>
                                     </div>
-                                    <div class="col-md-4">
-                                        <button type="button" class="btn btn-primary" id="editProjectGroupBtn">
-                                            <span class="fa fa-pencil"></span>修改
-                                        </button>
-                                        <button type="button" class="btn btn-primary" id="removeProjectGroupBtn">
-                                            <span class="fa fa-times"></span>删除
-                                        </button>
+                                    <div class="col-md-6"></div>
+                                    <div class="col-md-2 text-right">
+                                        <div th:if="${not #strings.isEmpty(projectGroupId) }">
+                                            <button type="button" class="btn btn-primary" id="editProjectGroupBtn">
+                                                <span class="fa fa-pencil"></span>修改
+                                            </button>
+                                            <button type="button" class="btn btn-default" id="removeProjectGroupBtn">
+                                                <span class="fa fa-times"></span>删除
+                                            </button>
+                                        </div>
                                     </div>
-                                    <div class="col-md-4"></div>
                                 </div>
                             </div>
                         </div>
@@ -203,7 +204,7 @@
                                                 <!-- 运行中 -->
                                                 <li th:if="${m?.meta?.state eq 1}" th:url="'/mapping/stop?id='+${m?.id}"><a href="javascript:;"><i class="fa fa-times-circle-o well-sign-red"></i>&nbsp;&nbsp;停止</a></li>
                                                 <!-- 未运行 -->
-                                                <li th:if="${m?.meta?.state ne 1}" th:url="'/mapping/remove?id='+${m?.id}" confirm="true" confirmMessage="确认删除?"><a href="javascript:;"><i class="fa fa-trash well-sign-red"></i>&nbsp;&nbsp;删除</a></li>
+                                                <li th:if="${m?.meta?.state ne 1}" th:url="'/mapping/remove?id='+${m?.id}" confirm="true" confirmMessage="确认删除驱动?"><a href="javascript:;"><i class="fa fa-trash well-sign-red"></i>&nbsp;&nbsp;删除</a></li>
                                             </ul>
                                         </div>
                                     </div>

+ 13 - 54
dbsyncer-web/src/main/resources/static/css/index/index.css

@@ -12,57 +12,16 @@
 .mappingList .jumbotron .line .running-state{position: absolute;left: calc(50% - 22px);;top: 45px;font-weight: bold;}
 .mappingList .jumbotron .well-sign-left{position: absolute;top: -10px;left: 3px;}
 .mappingList .jumbotron .well-sign-right{position: absolute;top: -31px;left: -7px;}
-.mappingList .well { word-wrap: break-word;word-break: normal;overflow:hidden;}
-.mappingList .well img {
-    float: left;
-    padding: 8px 2px;
-    border-radius: 20%;
-}
-
-.mappingList .well span {
-    float: left;
-    margin: 21px 10px;
-}
-
-.mappingList .well-sign-green {
-    color: #808040;
-}
-
-.mappingList .well-sign-red {
-    color: #ff0000;
-}
-
-.mappingList .well-sign-operation {
-    position: absolute;
-    right: 12px;
-    color: #999999;
-    border-radius: 50%;
-}
-
-.mappingList .well-sign-operation:hover {
-    color: #333333;
-}
-
-.mappingList .dropdown {
-    position: absolute;
-    right: 0px;
-    top: 0px;
-}
-
-.mappingList .dropdown-menu {
-    right: 12px;
-    left: auto;
-    top: 28px;
-}
-
-.mappingList .dropdown-menu i {
-    font-size: 20px;
-}
-
-.dbsyncer_block_increment {
-    background: -webkit-linear-gradient(left, #ffffff, #dffbdc);
-}
-
-.dbsyncer_block_full {
-    background: -webkit-linear-gradient(left, #ffffff, #dcf5fb);
-}
+.mappingList .well {word-wrap: break-word;word-break: normal;overflow:hidden;}
+.mappingList .well img{float:left;padding:8px 2px; border-radius: 20%;}
+.mappingList .well span{float:left;margin:21px 10px;}
+.mappingList .well-sign-green{color: #808040;}
+.mappingList .well-sign-red{color: #ff0000;}
+.mappingList .well-sign-operation{position: absolute; right:12px; color: #999999; border-radius: 50%;}
+.mappingList .well-sign-operation:hover { color: #333333;}
+.mappingList .dropdown {position: absolute; right:0px; top: 0px;}
+.mappingList .dropdown-menu {right: 12px;left: auto; top: 28px;}
+.mappingList .dropdown-menu i{font-size: 20px;}
+
+.dbsyncer_block_increment { background: -webkit-linear-gradient(left, #ffffff, #dffbdc);}
+.dbsyncer_block_full { background: -webkit-linear-gradient(left, #ffffff, #dcf5fb);}

+ 4 - 6
dbsyncer-web/src/main/resources/static/js/common.js

@@ -150,10 +150,10 @@ function doGetWithoutLoading(url, params, action) {
  * @eg '' true
  * @eg ' ' true
  * @eg '1' false
- *
+ * @return Boolean
  */
 function isBlank(str) {
-    return str === undefined || str === null || str === false || str.length === 0 || str.replace(' ', '').length === 0;
+    return str === undefined || str === null || str === false || str.length === 0;
 }
 
 /**
@@ -164,7 +164,5 @@ function isBlank(str) {
  * @return Array
  */
 function splitStrByDelimiter(str, delimiter) {
-    if (!isBlank(str)) {
-        return str.split(delimiter);
-    }
-}
+    return isBlank(str) ? [] : str.split(delimiter);
+}

+ 12 - 18
dbsyncer-web/src/main/resources/static/js/group/addOrEdit.js

@@ -24,36 +24,30 @@ function submit(data) {
     }
 }
 
-function initSelectByValueOrDefault($select, $selectedValue) {
-
-    $.each($select, function () {
-        var values = splitStrByDelimiter($selectedValue, ",");
-        $(this).selectpicker('val', values);
-    });
-}
-
 $(function () {
     // 初始化select插件
     initSelect($(".select-control-table"));
 
-    initSelectByValueOrDefault($("#connectorIds"), $("#selectedConnectors").val());
-    initSelectByValueOrDefault($("#mappingIds"), $("#selectedMappings").val());
+    $("#connectorIds").selectpicker('val', splitStrByDelimiter($("#selectedConnectorIds").val(), ","));
+    $("#mappingIds").selectpicker('val', splitStrByDelimiter($("#selectedMappingIds").val(), ","));
 
     //保存
-    $("#groupSubmitBtn").click(function () {
-        var $form = $("#groupAddForm");
+    $("#projectGroupSubmitBtn").click(function () {
+        var $form = $("#projectGroupAddForm");
         if ($form.formValidate() == true) {
             var data = $form.serializeJson();
-            var connectorIds = data['connectorIds'];
-            var mappingIds = data['mappingIds'];
-            data['connectorIds'] = (connectorIds instanceof Array) ? connectorIds.join(',') : connectorIds;
-            data['mappingIds'] = (mappingIds instanceof Array) ? mappingIds.join(',') : mappingIds;
+            if (data.connectorIds instanceof Array) {
+                data.connectorIds = data.connectorIds.join('|');
+            }
+            if (data.mappingIds instanceof Array) {
+                data.mappingIds = data.mappingIds.join('|');
+            }
             submit(data);
         }
     });
 
     //返回
-    $("#groupBackBtn").click(function () {
+    $("#projectGroupBackBtn").click(function () {
         backIndexPage();
     });
-})
+})

+ 6 - 6
dbsyncer-web/src/main/resources/static/js/index/index.js

@@ -13,7 +13,7 @@ function bindEditProjectGroup($projectGroupSelect) {
             doLoader('/projectGroup/page/edit?id=' + $id);
             return;
         }
-        bootGrowl("请选择有效分组", "danger");
+        bootGrowl("请选择分组", "danger");
     });
 }
 
@@ -26,9 +26,9 @@ function bindRemoveProjectGroup($projectGroupSelect) {
             return;
         }
         BootstrapDialog.show({
-            title: "警告",
-            type: BootstrapDialog.TYPE_DANGER,
-            message: "确认删除?",
+            title: "提示",
+            type: BootstrapDialog.TYPE_INFO,
+            message: "确认删除分组?",
             size: BootstrapDialog.SIZE_NORMAL,
             buttons: [{
                 label: "确定",
@@ -115,7 +115,7 @@ function bindConnectorDropdownMenu() {
         BootstrapDialog.show({
             title: "警告",
             type: BootstrapDialog.TYPE_DANGER,
-            message: "确认删除?",
+            message: "确认删除连接?",
             size: BootstrapDialog.SIZE_NORMAL,
             buttons: [{
                 label: "确定",
@@ -198,4 +198,4 @@ $(function () {
     bindConnectorDropdownMenu();
     bindMappingDropdownMenu();
 
-});
+});