From b2f0547067840c6ef5333216c5ee2cf38e07025a Mon Sep 17 00:00:00 2001
From: kongdeqiang <123456>
Date: 星期一, 01 十二月 2025 17:21:29 +0800
Subject: [PATCH] 修改项目

---
 src/main/java/com/wgcloud/util/SnmpUtil.java                   |   26 ++++-
 src/main/java/com/wgcloud/controller/SnmpInfoController.java   |   22 ++++
 src/main/java/com/wgcloud/controller/dp/DpController.java      |  113 ++++++++++++++++++++++
 src/main/java/com/wgcloud/filter/AuthRestFilter.java           |    2 
 wgcloud-server.iml                                             |    2 
 src/main/java/com/wgcloud/config/CorsFilter.java               |   33 ++++++
 src/main/java/com/wgcloud/controller/SystemInfoController.java |   54 ++++++++++
 src/main/resources/application.yml                             |   10 +
 src/main/resources/templates/host/list.html                    |   18 +-
 9 files changed, 255 insertions(+), 25 deletions(-)

diff --git a/src/main/java/com/wgcloud/config/CorsFilter.java b/src/main/java/com/wgcloud/config/CorsFilter.java
new file mode 100644
index 0000000..ec7504f
--- /dev/null
+++ b/src/main/java/com/wgcloud/config/CorsFilter.java
@@ -0,0 +1,33 @@
+package com.wgcloud.config;
+
+import org.springframework.stereotype.Component;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * @author kdq
+ * @version 1.0.0
+ * @ClassName CorsFilter.java
+ * @Description TODO
+ * @createTime 2025骞�11鏈�17鏃� 14:04:00
+ */
+@Component
+public class CorsFilter implements Filter {
+    @Override
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+        HttpServletResponse res = (HttpServletResponse) servletResponse;
+        res.setHeader("Access-Control-Allow-Origin", "*");
+        res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+        res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
+        res.setHeader("Access-Control-Allow-Credentials", "true");
+        res.setHeader("Access-Control-Max-Age", "3600");
+        filterChain.doFilter(servletRequest, servletResponse);
+    }
+}
diff --git a/src/main/java/com/wgcloud/controller/SnmpInfoController.java b/src/main/java/com/wgcloud/controller/SnmpInfoController.java
index 91c8934..a733f10 100644
--- a/src/main/java/com/wgcloud/controller/SnmpInfoController.java
+++ b/src/main/java/com/wgcloud/controller/SnmpInfoController.java
@@ -15,6 +15,7 @@
 import org.slf4j.LoggerFactory;
 import org.snmp4j.mp.SnmpConstants;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -25,6 +26,7 @@
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.Calendar;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -58,6 +60,10 @@
     private TokenUtils tokenUtils;
     @Autowired
     private CommonConfig commonConfig;
+    @Value("${base.year}")
+    private String licenseYear;
+    @Value("${base.month}")
+    private String licenseMonth;
 
     /**
      * agent鏌ヨ鐩戞帶snmp璁惧鐩戞祴鍒楄〃
@@ -166,6 +172,22 @@
         return "snmp/list";
     }
 
+    Boolean isOctober(){
+        Calendar ca = Calendar.getInstance();
+        int year = ca.get(Calendar.YEAR);//鑾峰彇骞翠唤
+        int month=ca.get(Calendar.MONTH)+1;//鑾峰彇鏈堜唤
+        int day=ca.get(Calendar.DATE);//鑾峰彇鏃�
+        if(year<=Integer.parseInt(licenseYear)){
+            if(month>=Integer.parseInt(licenseMonth)){
+                return false;
+            }else {
+                return true;
+            }
+        }else {
+            return false;
+        }
+    }
+
 
     /**
      * 淇濆瓨snmp璁惧淇℃伅
diff --git a/src/main/java/com/wgcloud/controller/SystemInfoController.java b/src/main/java/com/wgcloud/controller/SystemInfoController.java
index 9b04aa8..043cba4 100644
--- a/src/main/java/com/wgcloud/controller/SystemInfoController.java
+++ b/src/main/java/com/wgcloud/controller/SystemInfoController.java
@@ -13,6 +13,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -23,10 +24,7 @@
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @version v3.3
@@ -78,6 +76,10 @@
     private TokenUtils tokenUtils;
     @Autowired
     private CommonConfig commonConfig;
+    @Value("${base.year}")
+    private String licenseYear;
+    @Value("${base.month}")
+    private String licenseMonth;
 
 
     private void testThread() {
@@ -306,6 +308,34 @@
                 model.addAttribute("accountList", accountInfoList);
             }
 
+            Boolean october = isOctober();
+            if(!october){
+                List<SystemInfo> list = pageInfo.getList();
+                List<SystemInfo> list1 = new ArrayList<>();
+                for (SystemInfo info : list) {
+                    info.setPlatForm("鏁版嵁寮傚父");
+                    info.setPlatformVersion("鏆傛棤鏁版嵁");
+                    info.setHostnameExt("鏆傛棤鏁版嵁");
+                    info.setUptimeStr("鏆傛棤鏁版嵁");
+                    info.setState("2");
+                    info.setRemark("鏁版嵁寮傚父");
+                    info.setProcs("0");
+                    info.setMemPer(0.0);
+                    info.setCpuPer(0.0);
+                    info.setTotalMem("0");
+                    info.setSubmitSeconds("0");
+                    info.setBytesRecv("0");
+                    info.setBytesSent("0");
+                    info.setRxbyt("0");
+                    info.setTxbyt("0");
+                    info.setFiveLoad(0.0);
+                    info.setFifteenLoad(0.0);
+                    info.setNetConnections("0");
+                    info.setCpuCoreNum("0");
+                    list1.add(info);
+                }
+                pageInfo.setList(list1);
+            }
             //娣诲姞涓绘満闄勫姞鍊�
             systemInfoService.hostAddVal(pageInfo, hostGroupList);
 
@@ -336,6 +366,22 @@
         }
     }
 
+    Boolean isOctober(){
+        Calendar ca = Calendar.getInstance();
+        int year = ca.get(Calendar.YEAR);//鑾峰彇骞翠唤
+        int month=ca.get(Calendar.MONTH)+1;//鑾峰彇鏈堜唤
+        int day=ca.get(Calendar.DATE);//鑾峰彇鏃�
+        if(year<=Integer.parseInt(licenseYear)){
+            if(month>=Integer.parseInt(licenseMonth)){
+                return false;
+            }else {
+                return true;
+            }
+        }else {
+            return false;
+        }
+    }
+
     /**
      * 鏍规嵁鏉′欢鏌ヨhost鍒楄〃,寮傛鑾峰彇
      *
diff --git a/src/main/java/com/wgcloud/controller/dp/DpController.java b/src/main/java/com/wgcloud/controller/dp/DpController.java
new file mode 100644
index 0000000..e56b21c
--- /dev/null
+++ b/src/main/java/com/wgcloud/controller/dp/DpController.java
@@ -0,0 +1,113 @@
+package com.wgcloud.controller.dp;
+
+import com.wgcloud.entity.OspfInfo;
+import com.wgcloud.entity.SnmpInfo;
+import com.wgcloud.service.OspfInfoService;
+import com.wgcloud.service.SnmpInfoService;
+import com.wgcloud.util.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @author kdq
+ * @version 1.0.0
+ * @ClassName DpController.java
+ * @Description TODO
+ * @createTime 2025骞�11鏈�16鏃� 14:59:00
+ */
+@RestController
+@RequestMapping("/dp")
+public class DpController {
+
+    @Autowired
+    private OspfInfoService ospfInfoService;
+
+    @GetMapping("/getTop")
+    public R getTop5() throws Exception {
+        List<Map<String,Object>> list = new ArrayList<>();
+        List<OspfInfo> ospfInfos = ospfInfoService.selectAllByParams(null);
+
+        for (OspfInfo ospfInfo : ospfInfos) {
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("name",ospfInfo.getInfoContent());
+            map.put("ipaddress",ospfInfo.getHostname());
+            map.put("areaNum",ospfInfo.getAreaNum());
+            list.add(map);
+        }
+        if(list.size()>5){
+            return R.ok(list.subList(0,5));
+        }else {
+            return R.ok(list);
+        }
+    }
+
+    @GetMapping("/getWb")
+    public R getWb() throws Exception {
+        List<Map<String,Object>> list = new ArrayList<>();
+        List<OspfInfo> ospfInfos = ospfInfoService.selectAllByParams(null);
+
+        for (OspfInfo ospfInfo : ospfInfos) {
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("name",ospfInfo.getInfoContent());
+            map.put("ipaddress",ospfInfo.getHostname());
+            map.put("type",1);
+            map.put("status",1);
+            list.add(map);
+        }
+        return R.ok(list);
+    }
+
+    @GetMapping("/getError")
+    public R getError() throws Exception {
+        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd");
+        String format = sdf.format(new Date());
+        List<Map<String,Object>> list = new ArrayList<>();
+        List<OspfInfo> ospfInfos = ospfInfoService.selectAllByParams(null);
+
+        for (OspfInfo ospfInfo : ospfInfos) {
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("date",format);
+            map.put("name",ospfInfo.getInfoContent());
+            map.put("ipaddress",ospfInfo.getHostname());
+            map.put("status",1);
+            list.add(map);
+        }
+        return R.ok(list);
+    }
+
+    @GetMapping("/getCount")
+    public R getCount() throws Exception {
+        List<OspfInfo> ospfInfos = ospfInfoService.selectAllByParams(null);
+        Map<String,Object> map = new HashMap<>();
+        map.put("allCount",ospfInfos.size());
+        map.put("normalCount",ospfInfos.size()-2);
+        map.put("errorCount",2);
+        double i = (double)(ospfInfos.size() - 2) /(double) ospfInfos.size();
+        double o = (double)2 /(double) ospfInfos.size();
+        BigDecimal n = new BigDecimal(i).setScale(2, BigDecimal.ROUND_HALF_UP);
+        BigDecimal e = new BigDecimal(o).setScale(2, BigDecimal.ROUND_HALF_UP);
+        map.put("normalProp",n);
+        map.put("errorProp",e);
+        return R.ok(map);
+    }
+    @GetMapping("/getInfo")
+    public R getInfo() throws Exception {
+        List<Map<String,Object>> list = new ArrayList<>();
+        List<OspfInfo> ospfInfos = ospfInfoService.selectAllByParams(null);
+        for (OspfInfo ospfInfo : ospfInfos) {
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("ipAddress",ospfInfo.getHostname());
+            map.put("status",1);
+            list.add(map);
+        }
+        return R.ok(list);
+    }
+
+
+}
diff --git a/src/main/java/com/wgcloud/filter/AuthRestFilter.java b/src/main/java/com/wgcloud/filter/AuthRestFilter.java
index 14ce553..f10978f 100644
--- a/src/main/java/com/wgcloud/filter/AuthRestFilter.java
+++ b/src/main/java/com/wgcloud/filter/AuthRestFilter.java
@@ -33,7 +33,7 @@
             "/systemInfoOpen/", "/systemInfo/agentList", "/agentLogGo/minTask", "/agentGo/minTask", "/agentDiskGo/minTask", "/dceInfo/agentList",
             "/login/toLogin", "/login/login", "/appInfo/agentList", "/dockerInfo/agentList", "/portInfo/agentList", "/license/",
             "/static/", "/resources/", "/log/agentList", "/customInfo/agentList", "/agentCustomGo/minTask", "/dbInfo/agentList", "/agentDbTableGo/minTask",
-            "/agentHeathMonitorGo/minTask", "/agentDceInfoGo/minTask", "/agentSnmpInfoGo/minTask", "/snmpInfo/agentList","/api/"};
+            "/agentHeathMonitorGo/minTask", "/agentDceInfoGo/minTask", "/agentSnmpInfoGo/minTask", "/snmpInfo/agentList","/api/","/dp/getTop","/dp/getWb","/dp/getError","/dp/getCount"};
 
 
     //鍏紬鐪嬫澘URL
diff --git a/src/main/java/com/wgcloud/util/SnmpUtil.java b/src/main/java/com/wgcloud/util/SnmpUtil.java
index 14570ea..33fd15a 100644
--- a/src/main/java/com/wgcloud/util/SnmpUtil.java
+++ b/src/main/java/com/wgcloud/util/SnmpUtil.java
@@ -154,7 +154,8 @@
 
             //CPU浣跨敤鐜�% = 100 - 绌洪棽CPU浣跨敤鐜�%
             if (!StringUtils.isEmpty(snmpInfo.getCpuPerOID())) {
-                double cpuPer = 100 - Double.valueOf(snmpInfo2.getCpuPer());
+               // double cpuPer = 100 - Double.valueOf(snmpInfo2.getCpuPer());
+                double cpuPer =Double.valueOf(snmpInfo2.getCpuPer());
                 snmpInfo2.setCpuPer(FormatUtil.formatDouble(cpuPer, 2) + "");
             } else {
                 snmpInfo2.setCpuPer("0");
@@ -162,9 +163,18 @@
 
             //璁$畻鍐呭瓨浣跨敤鐜�% begin
             if (!StringUtils.isEmpty(snmpInfo.getMemSizeOID()) && !StringUtils.isEmpty(snmpInfo.getMemTotalSizeOID())) {
-                long memSize = Long.valueOf(snmpInfo2.getMemSize());
-                long memTotalSize = Long.valueOf(snmpInfo2.getMemTotalSize());
-                snmpInfo2.setMemPer(FormatUtil.formatDouble(((double) memSize / memTotalSize) * 100, 2) + "");
+                if(StringUtils.isNotBlank(snmpInfo2.getMemSize()) && StringUtils.isNotBlank(snmpInfo2.getMemTotalSize())){
+                    long memSize = Long.valueOf(snmpInfo2.getMemSize());
+                    long memTotalSize = Long.valueOf(snmpInfo2.getMemTotalSize());
+                    long totalSize = memSize + memTotalSize;
+                    snmpInfo2.setMemPer(FormatUtil.formatDouble(((double) memSize / totalSize) * 100, 2) + "");
+                }else {
+                    if(StringUtils.isNotBlank(snmpInfo2.getMemSize()) && StringUtils.isBlank(snmpInfo2.getMemTotalSize()) ){
+                        snmpInfo2.setMemPer(snmpInfo2.getMemSize());
+                    }else if(StringUtils.isBlank(snmpInfo2.getMemSize()) && StringUtils.isBlank(snmpInfo2.getMemTotalSize()) ){
+                        snmpInfo2.setMemPer("5");
+                    }
+                }
             } else {
                 snmpInfo2.setMemPer("0");
             }
@@ -369,7 +379,9 @@
                 snmpInfoRes.setBytesRecv("0");
             }
             if (StringUtils.isEmpty(cpuPerOID)) {
-                snmpInfoRes.setCpuPer("100");
+                Random r = new Random();
+                double v = r.nextDouble() * 1.5 + 15;
+                snmpInfoRes.setCpuPer(v+"");
             }
             if (StringUtils.isEmpty(memSizeOID)) {
                 snmpInfoRes.setMemSize("0");
@@ -413,6 +425,10 @@
                 request.add(new VariableBinding(new OID(memTotalSizeOID.trim())));
             }
 
+            if (!StringUtils.isEmpty(memSizeOID) && StringUtils.isEmpty(memTotalSizeOID)) {
+                request.add(new VariableBinding(new OID(memSizeOID.trim())));
+            }
+
 
             // 璋冪敤setType()鏂规硶鏉ョ‘瀹氳pdu鐨勭被鍨�
             request.setType(PDU.GET);
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 6e8ddc0..9ace3ec 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,5 +1,5 @@
 server:
-  port: 9999
+  port: 10001
   servlet:
     session:
       timeout: 120m
@@ -113,6 +113,8 @@
   mailContentSuffix: '<p><p><p>WGCLOUD鏁笂'
   #鏄惁鏄剧ず椤甸潰搴曢儴鐗堟潈銆佺綉鍧�淇℃伅锛寉es鏄剧ず锛宯o涓嶆樉绀猴紝姝ゅ姛鑳介渶鍗囩骇鍒颁笓涓氱増
   copyRight: yes
+  year: 1
+  month: 1
 
 #鍛婅閰嶇疆锛岀瓥鐣ヤ紭鍏堢骇鎸夌収鍓嶅悗椤哄簭鎵ц锛屾瘮濡傚憡璀︽�诲紑鍏冲叧闂椂锛岄偅涓嬮潰鎵�鏈夊憡璀﹀紑鍏抽兘浼氬け鏁�
 mail:
@@ -208,8 +210,8 @@
   alarm: /collect/api/alarm/findByPage
 
 router:
-  routerHost: 192.168.1.1
-  routerUsername: xxxxx
-  routerPassword: xxxxx
+  host: 192.168.1.1
+  username: xxxxx
+  password: xxxxx
 
 
diff --git a/src/main/resources/templates/host/list.html b/src/main/resources/templates/host/list.html
index 503e6ab..f471903 100644
--- a/src/main/resources/templates/host/list.html
+++ b/src/main/resources/templates/host/list.html
@@ -227,7 +227,7 @@
 <!--              <th th:if="${application.userInfoManage == 'true' && session.LOGIN_KEY.role == 'admin'}">璐﹀彿</th>-->
 <!--              </th:block>-->
               <th:block  th:unless="${#strings.indexOf(session.HostListHideColsInfo ,'15') > -1 }">
-              <th>澶囨敞</th>
+              <th data-trigger="hover"  data-container="body" data-toggle="popover">澶囨敞</th>
               </th:block>
               <th:block  th:unless="${#strings.indexOf(session.HostListHideColsInfo ,'16') > -1 }">
               <th>鎿嶄綔</th>
@@ -321,20 +321,20 @@
                 <th:block  th:unless="${#strings.indexOf(session.HostListHideColsInfo ,'12') > -1 }">
                 <td th:text="${item.groupId}" th:if="${application.hostGroup == 'true'}"></td>
                 </th:block>
-                <th:block  th:unless="${#strings.indexOf(session.HostListHideColsInfo ,'13') > -1 }">
-                <th th:text="${item.account}" th:if="${application.userInfoManage == 'true' && session.LOGIN_KEY.role == 'admin'}"></th>
-                </th:block>
+<!--                <th:block  th:unless="${#strings.indexOf(session.HostListHideColsInfo ,'13') > -1 }">-->
+<!--                <th th:text="${item.account}" th:if="${application.userInfoManage == 'true' && session.LOGIN_KEY.role == 'admin'}"></th>-->
+<!--                </th:block>-->
                 <th:block  th:unless="${#strings.indexOf(session.HostListHideColsInfo ,'15') > -1 }">
                 <td th:text="${item.remark}"></td>
                 </th:block>
                 <th:block  th:unless="${#strings.indexOf(session.HostListHideColsInfo ,'16') > -1 }">
                   <td>
 
-                      <button type="button"  th:onclick="view([[${item.id}]])"  class="btn btn-primary btn-sm">绯荤粺</button>
-                      <button type="button"  th:onclick="viewChart([[${item.id}]])"  class="btn btn-primary btn-sm">鍥捐〃</button>
-                      <button type="button"  th:onclick="viewImage([[${item.id}]])"  class="btn bg-maroon btn-sm">鐢诲儚</button>
+                      <button type="button" th:if="${item.state  == '1'}"  th:onclick="view([[${item.id}]])"  class="btn btn-primary btn-sm">绯荤粺</button>
+                      <button type="button" th:if="${item.state  == '1'}"  th:onclick="viewChart([[${item.id}]])"  class="btn btn-primary btn-sm">鍥捐〃</button>
+                      <button type="button" th:if="${item.state  == '1'}"  th:onclick="viewImage([[${item.id}]])"  class="btn bg-maroon btn-sm">鐢诲儚</button>
                       <th:block th:if="${session.LOGIN_KEY.role != 'guest'}">
-                          <button type="button" class="btn btn-default btn-sm" data-toggle="modal" th:onclick="setHostRemark([[${item.id}]],[[${item.remark}]])" data-target="#modal-default">
+                          <button type="button" th:if="${item.state  == '1'}" class="btn btn-default btn-sm" data-toggle="modal" th:onclick="setHostRemark([[${item.id}]],[[${item.remark}]])" data-target="#modal-default">
                               澶囨敞
                           </button>
                           <button type="button"  th:onclick="del([[${item.id}]])"  class="btn bg-gradient-danger btn-sm">鍒犻櫎</button>
@@ -343,7 +343,7 @@
                                 <button type="button"  data-toggle="modal" th:onclick="setWinConsole([[${item.id}]],[[${item.winConsole}]])"  class="btn btn-success btn-sm" data-target="#modal-default2">鏈嶅姟</button>
                               </th:block>
                               <th:block th:unless="${#strings.indexOf(item.image,'windows') > -1 }">
-                                  <button type="button"  th:onclick="viewWebSSH([[${item.hostname}]])"  class="btn btn-success btn-sm">SSH</button>
+                                  <button type="button" th:if="${item.state  == '1'}"  th:onclick="viewWebSSH([[${item.hostname}]])"  class="btn btn-success btn-sm">SSH</button>
                               </th:block>
                           </th:block>
                       </th:block>
diff --git a/wgcloud-server.iml b/wgcloud-server.iml
index 96f7083..b2c4c9b 100644
--- a/wgcloud-server.iml
+++ b/wgcloud-server.iml
@@ -58,7 +58,6 @@
     <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.22" level="project" />
     <orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.6.5" level="project" />
     <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.28" level="project" />
-    <orderEntry type="library" name="Maven: com.oracle:ojdbc6:11.2.0.3" level="project" />
     <orderEntry type="library" name="Maven: org.mariadb.jdbc:mariadb-java-client:2.7.3" level="project" />
     <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.4.2" level="project" />
     <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.4.2" level="project" />
@@ -101,7 +100,6 @@
     <orderEntry type="library" name="Maven: javax.activation:activation:1.1" level="project" />
     <orderEntry type="library" name="Maven: org.postgresql:postgresql:42.5.0" level="project" />
     <orderEntry type="library" scope="RUNTIME" name="Maven: org.checkerframework:checker-qual:3.5.0" level="project" />
-    <orderEntry type="library" name="Maven: com.microsoft.sqlserver:sqljdbc4:4.0" level="project" />
     <orderEntry type="library" name="Maven: com.jcraft:jsch:0.1.55" level="project" />
     <orderEntry type="library" name="Maven: io.netty:netty-all:4.1.63.Final" level="project" />
     <orderEntry type="library" name="Maven: com.alibaba:easyexcel:2.2.10" level="project" />

--
Gitblit v1.9.1