1
0
AE86 4 жил өмнө
parent
commit
732d073896
17 өөрчлөгдсөн 276 нэмэгдсэн , 87 устгасан
  1. 3 2
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/MonitorService.java
  2. 22 15
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/MonitorServiceImpl.java
  3. 50 0
      dbsyncer-common/src/main/java/org/dbsyncer/common/model/Paging.java
  4. 3 2
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/Manager.java
  5. 3 2
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/ManagerFactory.java
  6. 2 1
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/template/impl/DataTemplate.java
  7. 18 5
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/template/impl/PreloadTemplate.java
  8. 3 2
      dbsyncer-storage/src/main/java/org/dbsyncer/storage/AbstractStorageService.java
  9. 2 1
      dbsyncer-storage/src/main/java/org/dbsyncer/storage/StorageService.java
  10. 8 3
      dbsyncer-storage/src/main/java/org/dbsyncer/storage/lucene/Shard.java
  11. 8 0
      dbsyncer-storage/src/main/java/org/dbsyncer/storage/query/Query.java
  12. 5 5
      dbsyncer-storage/src/main/java/org/dbsyncer/storage/support/DiskStorageServiceImpl.java
  13. 36 19
      dbsyncer-storage/src/main/java/org/dbsyncer/storage/support/MysqlStorageServiceImpl.java
  14. 3 2
      dbsyncer-storage/src/main/test/LuceneFactoryTest.java
  15. 2 2
      dbsyncer-web/src/main/java/org/dbsyncer/web/controller/monitor/MonitorController.java
  16. 17 2
      dbsyncer-web/src/main/resources/public/monitor/monitor.html
  17. 91 24
      dbsyncer-web/src/main/resources/static/js/monitor/index.js

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

@@ -3,6 +3,7 @@ package org.dbsyncer.biz;
 import org.dbsyncer.biz.vo.DataVo;
 import org.dbsyncer.biz.vo.LogVo;
 import org.dbsyncer.biz.vo.MetaVo;
+import org.dbsyncer.common.model.Paging;
 
 import java.util.List;
 import java.util.Map;
@@ -41,7 +42,7 @@ public interface MonitorService {
      * @return
      * @param params
      */
-    List<DataVo> queryData(Map<String, String> params);
+    Paging queryData(Map<String, String> params);
 
     /**
      * 清空驱动同步数据
@@ -57,7 +58,7 @@ public interface MonitorService {
      * @param params
      * @return
      */
-    List<LogVo> queryLog(Map<String, String> params);
+    Paging queryLog(Map<String, String> params);
 
     /**
      * 清空操作日志

+ 22 - 15
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/MonitorServiceImpl.java

@@ -6,6 +6,7 @@ import org.dbsyncer.biz.MonitorService;
 import org.dbsyncer.biz.vo.DataVo;
 import org.dbsyncer.biz.vo.LogVo;
 import org.dbsyncer.biz.vo.MetaVo;
+import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.JsonUtil;
 import org.dbsyncer.manager.Manager;
@@ -22,7 +23,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 
-import java.util.*;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -66,31 +69,33 @@ public class MonitorServiceImpl implements MonitorService {
     }
 
     @Override
-    public List<DataVo> queryData(Map<String, String> params) {
+    public Paging queryData(Map<String, String> params) {
         String id = params.get(ConfigConstant.CONFIG_MODEL_ID);
         // 获取默认驱动元信息
         if (StringUtils.isBlank(id)) {
             id = getDefaultMetaId();
         }
 
+        int pageNum = NumberUtils.toInt(params.get("pageNum"), 1);
+        int pageSize = NumberUtils.toInt(params.get("pageSize"), 10);
         // 没有驱动
         if (StringUtils.isBlank(id)) {
-            return Collections.EMPTY_LIST;
+            return new Paging(pageNum, pageSize);
         }
 
-        int pageNum = NumberUtils.toInt(params.get("pageNum"), 1);
-        int pageSize = NumberUtils.toInt(params.get("pageSize"), 10);
         Query query = new Query(pageNum, pageSize);
         // 查询异常信息
         String error = params.get(ConfigConstant.DATA_ERROR);
-        if(StringUtils.isNotBlank(error)){
+        if (StringUtils.isNotBlank(error)) {
             query.put(ConfigConstant.DATA_ERROR, error, true);
         }
 
-        List<DataVo> list = manager.queryData(query, id).stream()
+        Paging paging = manager.queryData(query, id);
+        List<Map> data = (List<Map>) paging.getData();
+        paging.setData(data.stream()
                 .map(m -> convert2Vo(m, DataVo.class))
-                .collect(Collectors.toList());
-        return list;
+                .collect(Collectors.toList()));
+        return paging;
     }
 
     @Override
@@ -101,19 +106,21 @@ public class MonitorServiceImpl implements MonitorService {
     }
 
     @Override
-    public List<LogVo> queryLog(Map<String, String> params) {
+    public Paging queryLog(Map<String, String> params) {
         int pageNum = NumberUtils.toInt(params.get("pageNum"), 1);
         int pageSize = NumberUtils.toInt(params.get("pageSize"), 10);
         Query query = new Query(pageNum, pageSize);
         // 查询日志内容
         String json = params.get(ConfigConstant.CONFIG_MODEL_JSON);
-        if(StringUtils.isNotBlank(json)){
+        if (StringUtils.isNotBlank(json)) {
             query.put(ConfigConstant.CONFIG_MODEL_JSON, json, true);
         }
-        List<LogVo> list = manager.queryLog(query).stream()
+        Paging paging = manager.queryLog(query);
+        List<Map> data = (List<Map>) paging.getData();
+        paging.setData(data.stream()
                 .map(m -> convert2Vo(m, LogVo.class))
-                .collect(Collectors.toList());
-        return list;
+                .collect(Collectors.toList()));
+        return paging;
     }
 
     @Override
@@ -134,7 +141,7 @@ public class MonitorServiceImpl implements MonitorService {
 
     private <T> T convert2Vo(Map map, Class<T> clazz) {
         String json = JsonUtil.objToJson(map);
-        return (T) JsonUtil.jsonToObj(json, clazz);
+        return JsonUtil.jsonToObj(json, clazz);
     }
 
     private String getDefaultMetaId() {

+ 50 - 0
dbsyncer-common/src/main/java/org/dbsyncer/common/model/Paging.java

@@ -0,0 +1,50 @@
+package org.dbsyncer.common.model;
+
+import java.util.Collection;
+import java.util.Collections;
+
+public class Paging {
+
+    private long          total;
+    private int           pageNum;
+    private int           pageSize;
+    private Collection data;
+
+    public Paging(int pageNum, int pageSize) {
+        this.pageNum = pageNum;
+        this.pageSize = pageSize;
+        this.data = Collections.EMPTY_LIST;
+    }
+
+    public long getTotal() {
+        return total;
+    }
+
+    public void setTotal(long total) {
+        this.total = total;
+    }
+
+    public int getPageNum() {
+        return pageNum;
+    }
+
+    public void setPageNum(int pageNum) {
+        this.pageNum = pageNum;
+    }
+
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public Collection getData() {
+        return data;
+    }
+
+    public void setData(Collection data) {
+        this.data = data;
+    }
+}

+ 3 - 2
dbsyncer-manager/src/main/java/org/dbsyncer/manager/Manager.java

@@ -1,5 +1,6 @@
 package org.dbsyncer.manager;
 
+import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.connector.config.ConnectorConfig;
 import org.dbsyncer.connector.config.MetaInfo;
 import org.dbsyncer.connector.enums.ConnectorEnum;
@@ -89,12 +90,12 @@ public interface Manager extends Executor {
     List<Config> getConfigAll();
 
     // Data
-    List<Map> queryData(Query query, String collectionId);
+    Paging queryData(Query query, String collectionId);
 
     void clearData(String collectionId);
 
     // Log
-    List<Map> queryLog(Query query);
+    Paging queryLog(Query query);
 
     void clearLog();
 

+ 3 - 2
dbsyncer-manager/src/main/java/org/dbsyncer/manager/ManagerFactory.java

@@ -1,6 +1,7 @@
 package org.dbsyncer.manager;
 
 import org.dbsyncer.common.event.ClosedEvent;
+import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.connector.config.ConnectorConfig;
 import org.dbsyncer.connector.config.MetaInfo;
 import org.dbsyncer.connector.enums.ConnectorEnum;
@@ -236,7 +237,7 @@ public class ManagerFactory implements Manager, ApplicationContextAware, Applica
     }
 
     @Override
-    public List<Map> queryData(Query query, String collectionId) {
+    public Paging queryData(Query query, String collectionId) {
         query.setType(StorageEnum.DATA);
         query.setCollection(collectionId);
         return dataTemplate.query(query);
@@ -248,7 +249,7 @@ public class ManagerFactory implements Manager, ApplicationContextAware, Applica
     }
 
     @Override
-    public List<Map> queryLog(Query query) {
+    public Paging queryLog(Query query) {
         query.setType(StorageEnum.LOG);
         return dataTemplate.query(query);
     }

+ 2 - 1
dbsyncer-manager/src/main/java/org/dbsyncer/manager/template/impl/DataTemplate.java

@@ -1,5 +1,6 @@
 package org.dbsyncer.manager.template.impl;
 
+import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.storage.StorageService;
 import org.dbsyncer.storage.enums.StorageEnum;
 import org.dbsyncer.storage.query.Query;
@@ -26,7 +27,7 @@ public final class DataTemplate {
     @Autowired
     private StorageService storageService;
 
-    public List<Map> query(Query query) {
+    public Paging query(Query query) {
         return storageService.query(query);
     }
 

+ 18 - 5
dbsyncer-manager/src/main/java/org/dbsyncer/manager/template/impl/PreloadTemplate.java

@@ -1,5 +1,6 @@
 package org.dbsyncer.manager.template.impl;
 
+import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.manager.Manager;
 import org.dbsyncer.manager.config.PreloadCallBack;
@@ -57,20 +58,32 @@ public final class PreloadTemplate extends AbstractTemplate implements Applicati
         query.setType(StorageEnum.CONFIG);
         String filterType = config.getFilterType();
         query.put(ConfigConstant.CONFIG_MODEL_TYPE, filterType);
-        List<Map> list = storageService.query(query);
-        boolean empty = CollectionUtils.isEmpty(list);
-        logger.info("PreLoad {}:{}", filterType, empty ? 0 : list.size());
-        if (!empty) {
+
+        int pageNum = 1;
+        int pageSize = 20;
+        long total = 0;
+        for(;;){
+            query.setPageNum(pageNum);
+            query.setPageSize(pageSize);
+            Paging paging = storageService.query(query);
+            List<Map> data = (List<Map>) paging.getData();
+            if (CollectionUtils.isEmpty(data)) {
+                break;
+            }
             Handler handler = config.getHandlerEnum().getHandler();
             GroupStrategyEnum strategy = getDefaultStrategy(config);
-            list.forEach(map -> {
+            data.forEach(map -> {
                 String json = (String) map.get(ConfigConstant.CONFIG_MODEL_JSON);
                 ConfigModel model = (ConfigModel) handler.execute(new PreloadCallBack(parser, json));
                 if (null != model) {
                     operationTemplate.cache(model, strategy);
                 }
             });
+            total += paging.getTotal();
+            pageNum ++;
         }
+
+        logger.info("PreLoad {}:{}", filterType, total);
     }
 
     @Override

+ 3 - 2
dbsyncer-storage/src/main/java/org/dbsyncer/storage/AbstractStorageService.java

@@ -1,5 +1,6 @@
 package org.dbsyncer.storage;
 
+import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.storage.enums.StorageEnum;
 import org.dbsyncer.storage.query.Query;
 import org.dbsyncer.storage.strategy.Strategy;
@@ -27,7 +28,7 @@ public abstract class AbstractStorageService implements StorageService, Applicat
 
     private Map<String, Strategy> map;
 
-    public abstract List<Map> select(Query query) throws IOException;
+    public abstract Paging select(Query query) throws IOException;
 
     public abstract void insert(StorageEnum type, String collection, Map params) throws IOException;
 
@@ -59,7 +60,7 @@ public abstract class AbstractStorageService implements StorageService, Applicat
     }
 
     @Override
-    public List<Map> query(Query query) {
+    public Paging query(Query query) {
         try {
             String collection = getCollection(query.getType(), query.getCollection());
             query.setCollection(collection);

+ 2 - 1
dbsyncer-storage/src/main/java/org/dbsyncer/storage/StorageService.java

@@ -1,5 +1,6 @@
 package org.dbsyncer.storage;
 
+import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.storage.enums.StorageEnum;
 import org.dbsyncer.storage.query.Query;
 
@@ -13,7 +14,7 @@ import java.util.Map;
  */
 public interface StorageService {
 
-    List<Map> query(Query query);
+    Paging query(Query query);
 
     void add(StorageEnum type, Map params);
 

+ 8 - 3
dbsyncer-storage/src/main/java/org/dbsyncer/storage/lucene/Shard.java

@@ -10,6 +10,7 @@ import org.apache.lucene.search.*;
 import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
+import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.storage.query.Option;
 
 import java.io.File;
@@ -124,14 +125,18 @@ public class Shard {
         return search(searcher, topDocs, new Option(), 1, 20);
     }
 
-    public List<Map> query(Query query, Sort sort) throws IOException {
+    public Paging query(Query query, Sort sort) throws IOException {
         return query(new Option(query), 1, 20, sort);
     }
 
-    public List<Map> query(Option option, int pageNum, int pageSize, Sort sort) throws IOException {
+    public Paging query(Option option, int pageNum, int pageSize, Sort sort) throws IOException {
         final IndexSearcher searcher = getSearcher();
         final TopDocs topDocs = searcher.search(option.getQuery(), MAX_SIZE, sort);
-        return search(searcher, topDocs, option, pageNum, pageSize);
+        Paging paging = new Paging(pageNum, pageSize);
+        List<Map> data = search(searcher, topDocs, option, pageNum, pageSize);
+        paging.setTotal(topDocs.scoreDocs.length);
+        paging.setData(data);
+        return paging;
     }
 
     /**

+ 8 - 0
dbsyncer-storage/src/main/java/org/dbsyncer/storage/query/Query.java

@@ -74,10 +74,18 @@ public class Query {
         return pageNum;
     }
 
+    public void setPageNum(int pageNum) {
+        this.pageNum = pageNum;
+    }
+
     public int getPageSize() {
         return pageSize;
     }
 
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+
     public boolean isEnableHighLightSearch() {
         return enableHighLightSearch;
     }

+ 5 - 5
dbsyncer-storage/src/main/java/org/dbsyncer/storage/support/DiskStorageServiceImpl.java

@@ -4,6 +4,7 @@ import org.apache.lucene.document.Document;
 import org.apache.lucene.index.IndexableField;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.*;
+import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.storage.AbstractStorageService;
 import org.dbsyncer.storage.StorageException;
@@ -22,7 +23,6 @@ import org.springframework.stereotype.Component;
 import javax.annotation.PostConstruct;
 import java.io.File;
 import java.io.IOException;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -59,7 +59,7 @@ public class DiskStorageServiceImpl extends AbstractStorageService {
     }
 
     @Override
-    public List<Map> select(Query query) throws IOException {
+    public Paging select(Query query) throws IOException {
         Shard shard = map.get(query.getCollection());
 
         // 检查是否存在历史
@@ -84,7 +84,7 @@ public class DiskStorageServiceImpl extends AbstractStorageService {
 
             return shard.query(new Option(new MatchAllDocsQuery()), pageNum, pageSize, sort);
         }
-        return Collections.emptyList();
+        return new Paging(query.getPageNum(), query.getPageSize());
     }
 
     @Override
@@ -110,7 +110,7 @@ public class DiskStorageServiceImpl extends AbstractStorageService {
 
     @Override
     public void deleteAll(StorageEnum type, String collection) throws IOException {
-        synchronized (this){
+        synchronized (this) {
             Shard shard = map.get(collection);
             if (null != shard) {
                 shard.deleteAll();
@@ -162,7 +162,7 @@ public class DiskStorageServiceImpl extends AbstractStorageService {
 
     @Override
     public void destroy() throws Exception {
-        for (Map.Entry<String, Shard> m: map.entrySet()) {
+        for (Map.Entry<String, Shard> m : map.entrySet()) {
             m.getValue().close();
         }
     }

+ 36 - 19
dbsyncer-storage/src/main/java/org/dbsyncer/storage/support/MysqlStorageServiceImpl.java

@@ -2,6 +2,7 @@ package org.dbsyncer.storage.support;
 
 import org.apache.commons.dbcp.DelegatingDatabaseMetaData;
 import org.apache.commons.lang.StringUtils;
+import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.connector.config.DatabaseConfig;
 import org.dbsyncer.connector.config.SqlBuilderConfig;
@@ -98,16 +99,21 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
     }
 
     @Override
-    public List<Map> select(Query query) {
+    public Paging select(Query query) {
         Executor executor = getExecutor(query.getType(), query.getCollection());
-        List<Object> args = new ArrayList<>();
-        String sql = buildQuerySql(query, executor, args);
-
-        List<Map> result = new ArrayList<>();
-        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, args.toArray());
-        replaceHighLight(query, list);
-        result.addAll(list);
-        return result;
+        List<Object> queryArgs = new ArrayList<>();
+        List<Object> queryCountArgs = new ArrayList<>();
+        String querySql = buildQuerySql(query, executor, queryArgs);
+        String queryCountSql = buildQueryCountSql(query, executor, queryCountArgs);
+
+        List<Map<String, Object>> data = jdbcTemplate.queryForList(querySql, queryArgs.toArray());
+        replaceHighLight(query, data);
+        Long total = jdbcTemplate.queryForObject(queryCountSql, queryCountArgs.toArray(), Long.class);
+
+        Paging paging = new Paging(query.getPageNum(), query.getPageSize());
+        paging.setData(data);
+        paging.setTotal(total);
+        return paging;
     }
 
     @Override
@@ -214,6 +220,27 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
 
     private String buildQuerySql(Query query, Executor executor, List<Object> args) {
         StringBuilder sql = new StringBuilder(executor.getQuery());
+        buildQuerySqlWithParams(query, args, sql);
+        // order by updateTime,createTime desc
+        sql.append(" order by ");
+        if (executor.isOrderByUpdateTime()) {
+            sql.append(ConfigConstant.CONFIG_MODEL_UPDATE_TIME).append(",");
+        }
+        sql.append(ConfigConstant.CONFIG_MODEL_CREATE_TIME).append(" desc");
+        sql.append(DatabaseConstant.MYSQL_PAGE_SQL);
+        args.add((query.getPageNum() - 1) * query.getPageSize());
+        args.add(query.getPageSize());
+        return sql.toString();
+    }
+
+    private String buildQueryCountSql(Query query, Executor executor, List<Object> args) {
+        StringBuilder sql = new StringBuilder("SELECT COUNT(*) FROM (").append(executor.getQuery());
+        buildQuerySqlWithParams(query, args, sql);
+        sql.append(") _T");
+        return sql.toString();
+    }
+
+    private void buildQuerySqlWithParams(Query query, List<Object> args, StringBuilder sql) {
         List<Param> params = query.getParams();
         if (!CollectionUtils.isEmpty(params)) {
             sql.append(" WHERE ");
@@ -228,16 +255,6 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
                 flag.compareAndSet(false, true);
             });
         }
-        // order by updateTime,createTime desc
-        sql.append(" order by ");
-        if (executor.isOrderByUpdateTime()) {
-            sql.append(ConfigConstant.CONFIG_MODEL_UPDATE_TIME).append(",");
-        }
-        sql.append(ConfigConstant.CONFIG_MODEL_CREATE_TIME).append(" desc");
-        sql.append(DatabaseConstant.MYSQL_PAGE_SQL);
-        args.add((query.getPageNum() - 1) * query.getPageSize());
-        args.add(query.getPageSize());
-        return sql.toString();
     }
 
     private void initTable() {

+ 3 - 2
dbsyncer-storage/src/main/test/LuceneFactoryTest.java

@@ -13,6 +13,7 @@ import org.apache.lucene.search.highlight.Highlighter;
 import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
 import org.apache.lucene.search.highlight.QueryScorer;
 import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
+import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.storage.lucene.Shard;
 import org.junit.After;
 import org.junit.Before;
@@ -72,8 +73,8 @@ public class LuceneFactoryTest {
         BooleanQuery query = new BooleanQuery.Builder()
                 .add(IntPoint.newRangeQuery("age", 1, 100), BooleanClause.Occur.MUST)
                 .build();
-        List<Map> maps = shard.query(query, new Sort(new SortField("createTime", SortField.Type.LONG, true)));
-        maps.forEach(m -> System.out.println(m));
+        Paging paging = shard.query(query, new Sort(new SortField("createTime", SortField.Type.LONG, true)));
+        paging.getData().forEach(m -> System.out.println(m));
 
         // 清空
         shard.deleteAll();

+ 2 - 2
dbsyncer-web/src/main/java/org/dbsyncer/web/controller/monitor/MonitorController.java

@@ -28,8 +28,8 @@ public class MonitorController extends BaseController {
         model.put("threadInfo", monitorService.getThreadInfo());
         model.put("metaId", monitorService.getDefaultMetaId(params));
         model.put("meta", monitorService.getMetaAll());
-        model.put("data", monitorService.queryData(params));
-        model.put("log", monitorService.queryLog(params));
+        model.put("pagingData", monitorService.queryData(params));
+        model.put("pagingLog", monitorService.queryLog(params));
         return "monitor/monitor.html";
     }
 

+ 17 - 2
dbsyncer-web/src/main/resources/public/monitor/monitor.html

@@ -39,7 +39,7 @@
                     </tr>
                     </thead>
                     <tbody id="dataList">
-                        <tr th:each="d,s : ${data}">
+                        <tr th:each="d,s : ${pagingData?.data}">
                             <td th:text="${s.index}+1"></td>
                             <td th:text="${d?.event}"></td>
                             <td>
@@ -52,6 +52,14 @@
                         </tr>
                     </tbody>
                 </table>
+
+                <div class="form-group">
+                    <div class="col-md-5">共计: <span id="dataTotal">[[${pagingData?.total}]]</span>条</div>
+                    <div class="col-md-7">
+                        <a href="javascript:void(0);" id="queryDataMore" num="1">显示更多<i class="fa fa-angle-double-down" aria-hidden="true"></i></a>
+                    </div>
+                </div>
+
             </div>
 
             <!-- 性能指标 -->
@@ -124,13 +132,20 @@
                     </tr>
                     </thead>
                     <tbody id="logList">
-                    <tr th:each="l,s : ${log}">
+                    <tr th:each="l,s : ${pagingLog?.data}">
                         <td th:text="${s.index}+1"></td>
                         <td th:text="${l?.json}"></td>
                         <td th:text="${#dates.format(l?.createTime, 'yyyy-MM-dd HH:mm:ss')}"></td>
                     </tr>
                     </tbody>
                 </table>
+
+                <div class="form-group">
+                    <div class="col-md-5">共计: <span id="logTotal">[[${pagingLog?.total}]]</span>条</div>
+                    <div class="col-md-7">
+                        <a href="javascript:void(0);" id="queryLogMore" num="1">显示更多<i class="fa fa-angle-double-down" aria-hidden="true"></i></a>
+                    </div>
+                </div>
             </div>
 
         </form>

+ 91 - 24
dbsyncer-web/src/main/resources/static/js/monitor/index.js

@@ -12,7 +12,9 @@ function formatDate(time) {
 
 // 查看详细数据
 function bindQueryDataDetailEvent() {
-    $(".metaDataList .queryData").click(function () {
+    var $queryData = $(".queryData");
+    $queryData.unbind("click");
+    $queryData.click(function () {
         var json = $(this).attr("json");
         var html = '<div class="row driver_break_word">' + json + '</div>';
         BootstrapDialog.show({
@@ -64,6 +66,22 @@ function bindClearEvent($btn, $title, $msg, $url){
     });
 }
 
+// 显示更多
+function showMore($this, $url, $params, $call){
+    $params.pageNum = parseInt($this.attr("num")) + 1;
+    $params.pageSize = 10;
+    doGetter($url, $params, function (data) {
+        if (data.success == true) {
+            if(data.resultValue.data.length > 0){
+                $this.attr("num", $params.pageNum);
+            }
+            $call(data.resultValue);
+        } else {
+            bootGrowl(data.resultValue, "danger");
+        }
+    });
+}
+
 // 查看数据
 function bindQueryDataEvent() {
     $("#queryDataBtn").click(function () {
@@ -71,29 +89,53 @@ function bindQueryDataEvent() {
         var id = $("select[name='metaData']").select2("val");
         doGetter('/monitor/queryData', {"error": keyword, "id" : id, "pageNum" : 1, "pageSize" : 10}, function (data) {
             if (data.success == true) {
-                showDataList(data.resultValue);
+                refreshDataList(data.resultValue);
             } else {
                 bootGrowl(data.resultValue, "danger");
             }
         });
     });
 }
-function showDataList(arr){
-    var size = arr.length;
-    var html = '';
-    for(i = 0; i < size; i++) {
-        html += '<tr>';
-        html += '<td>' + (i + 1) + '</td>';
-        html += '<td>' + arr[i].event + '</td>';
-        html += '<td>' + (arr[i].success ? '<span class="label label-success">成功</span>' : '<span class="label label-warning">失败</span>') + '</td>';
-        html += '<td>' + arr[i].error + '</td>';
-        html += '<td>' + formatDate(arr[i].createTime) + '</td>';
-        html += '<td><a json=' + arr[i].json + ' href="javascript:;" class="label label-info queryData">查看数据</a></td>';
-        html += '</tr>';
+function bindQueryDataMoreEvent() {
+    $("#queryDataMore").click(function () {
+        var keyword = $("#searchDataKeyword").val();
+        var id = $("select[name='metaData']").select2("val");
+        showMore($(this), '/monitor/queryData', {"error": keyword, "id" : id}, function(resultValue){
+            refreshDataList(resultValue, true)
+        });
+    });
+}
+function refreshDataList(resultValue, append){
+    var $dataList = $("#dataList");
+    var $dataTotal = $("#dataTotal");
+    var html = showData($dataList, resultValue.data, append);
+    if(append){
+        $dataList.append(html);
+    }else{
+        $dataList.html(html);
+        $("#queryDataMore").attr("num", 1);
     }
-    $("#dataList").html(html);
+    $dataTotal.html(resultValue.total);
     bindQueryDataDetailEvent();
 }
+function showData($dataList, arr, append){
+    var html = '';
+    var size = arr.length;
+    if(size > 0){
+        var start = append ? $dataList.find("tr").size() : 0;
+        for(i = 0; i < size; i++) {
+            html += '<tr>';
+            html += '<td>' + (start + i + 1) + '</td>';
+            html += '<td>' + arr[i].event + '</td>';
+            html += '<td>' + (arr[i].success ? '<span class="label label-success">成功</span>' : '<span class="label label-warning">失败</span>') + '</td>';
+            html += '<td>' + arr[i].error + '</td>';
+            html += '<td>' + formatDate(arr[i].createTime) + '</td>';
+            html += '<td><a json=' + arr[i].json + ' href="javascript:;" class="label label-info queryData">查看数据</a></td>';
+            html += '</tr>';
+        }
+    }
+    return html;
+}
 
 // 查看日志
 function bindQueryLogEvent() {
@@ -101,24 +143,47 @@ function bindQueryLogEvent() {
         var keyword = $("#searchLogKeyword").val();
         doGetter('/monitor/queryLog', {"json": keyword, "pageNum" : 1, "pageSize" : 10}, function (data) {
             if (data.success == true) {
-                showLogList(data.resultValue);
+                refreshLogList(data.resultValue);
             } else {
                 bootGrowl(data.resultValue, "danger");
             }
         });
     });
 }
-function showLogList(arr){
+function bindQueryLogMoreEvent() {
+    $("#queryLogMore").click(function () {
+        var keyword = $("#searchLogKeyword").val();
+        showMore($(this), '/monitor/queryLog', {"json": keyword}, function(resultValue){
+            refreshLogList(resultValue, true)
+        });
+    });
+}
+function refreshLogList(resultValue, append){
+    var $logList = $("#logList");
+    var $logTotal = $("#logTotal");
+    var html = showLog($logList, resultValue.data, append);
+    if(append){
+        $logList.append(html);
+    }else{
+        $logList.html(html);
+        $("#queryLogMore").attr("num", 1);
+    }
+    $logTotal.html(resultValue.total);
+}
+function showLog($logList, arr, append){
     var size = arr.length;
     var html = '';
-    for(i = 0; i < size; i++) {
-        html += '<tr>';
-        html += '<td>' + (i + 1) + '</td>';
-        html += '<td>' + arr[i].json + '</td>';
-        html += '<td>' + formatDate(arr[i].createTime) + '</td>';
-        html += '</tr>';
+    if(size > 0){
+        var start = append ? $logList.find("tr").size() : 0;
+        for(i = 0; i < size; i++) {
+            html += '<tr>';
+            html += '<td>' + (start + i + 1) + '</td>';
+            html += '<td>' + arr[i].json + '</td>';
+            html += '<td>' + formatDate(arr[i].createTime) + '</td>';
+            html += '</tr>';
+        }
     }
-    $("#logList").html(html);
+    return html;
 }
 
 // 查看系统指标
@@ -307,7 +372,9 @@ $(function () {
     });
 
     bindQueryLogEvent();
+    bindQueryLogMoreEvent();
     bindQueryDataEvent();
+    bindQueryDataMoreEvent();
     bindQueryDataDetailEvent();
     bindClearEvent($(".clearDataBtn"), "确认清空数据?", "清空数据成功!", "/monitor/clearData");
     bindClearEvent($(".clearLogBtn"), "确认清空日志?", "清空日志成功!", "/monitor/clearLog");