From 83a5abea31bf14c78572d3a4c5fdf14afb97c82f Mon Sep 17 00:00:00 2001
From: czt <czt18638530771@163.com>
Date: 星期六, 11 一月 2025 10:58:15 +0800
Subject: [PATCH] 增加登录日志和错误次数校验

---
 src/main/java/com/fzzy/sys/LogLoginService.java                    |  219 ++++++++++
 src/main/java/com/fzzy/api/lic/LicenseCheckModel.java              |   77 +++
 src/main/java/com/fzzy/sys/entity/LogLogin.java                    |   78 +++
 src/main/java/com/fzzy/api/lic/LinuxServerInfos.java               |   97 ++++
 src/main/java/com/fzzy/sys/LogLoginPR.java                         |   78 +++
 src/main/resources/application-pro.yml                             |   23 
 src/main/java/com/fzzy/api/lic/WindowsServerInfos.java             |   89 ++++
 src/main/java/com/fzzy/sys/repository/LogLoginRep.java             |    9 
 src/main/java/com/fzzy/sys/LogLogin.view.xml                       |  169 ++++++++
 src/main/resources/templates/home/home.html                        |    3 
 src/main/java/com/fzzy/push/sx2024/SX2024ApiRemoteService.java     |   16 
 src/main/java/com/fzzy/push/gd2023/GD2023ApiRemoteService2023.java |    3 
 src/main/java/com/fzzy/api/utils/SystemUtil.java                   |  211 ++++++++++
 src/main/java/com/fzzy/api/lic/AbstractServerInfos.java            |  143 ++++++
 src/main/java/com/fzzy/web/LoginController.java                    |   25 +
 src/main/resources/application.yml                                 |    2 
 16 files changed, 1,217 insertions(+), 25 deletions(-)

diff --git a/src/main/java/com/fzzy/api/lic/AbstractServerInfos.java b/src/main/java/com/fzzy/api/lic/AbstractServerInfos.java
new file mode 100644
index 0000000..18d26fa
--- /dev/null
+++ b/src/main/java/com/fzzy/api/lic/AbstractServerInfos.java
@@ -0,0 +1,143 @@
+package com.fzzy.api.lic;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+/**
+ * 鐢ㄤ簬鑾峰彇瀹㈡埛鏈嶅姟鍣ㄧ殑鍩烘湰淇℃伅锛屽锛欼P銆丮ac鍦板潃銆丆PU搴忓垪鍙枫�佷富鏉垮簭鍒楀彿绛�
+ *
+ * @author zifangsky
+ * @date 2018/4/23
+ * @since 1.0.0
+ */
+@Slf4j
+public abstract class AbstractServerInfos {
+
+    /**
+     * 缁勮闇�瑕侀澶栨牎楠岀殑License鍙傛暟
+     * @author zifangsky
+     * @date 2018/4/23 14:23
+     * @since 1.0.0
+     * @return demo.LicenseCheckModel
+     */
+    public LicenseCheckModel getServerInfos(){
+        LicenseCheckModel result = new LicenseCheckModel();
+
+        try {
+            result.setIpAddress(this.getIpAddress());
+            result.setMacAddress(this.getMacAddress());
+            result.setCpuSerial(this.getCPUSerial());
+            result.setMainBoardSerial(this.getMainBoardSerial());
+        }catch (Exception e){
+            log.error("鑾峰彇鏈嶅姟鍣ㄧ‖浠朵俊鎭け璐�",e);
+        }
+
+        return result;
+    }
+
+    /**
+     * 鑾峰彇IP鍦板潃
+     * @author zifangsky
+     * @date 2018/4/23 11:32
+     * @since 1.0.0
+     * @return java.util.List<java.lang.String>
+     */
+    protected abstract List<String> getIpAddress() throws Exception;
+
+    /**
+     * 鑾峰彇Mac鍦板潃
+     * @author zifangsky
+     * @date 2018/4/23 11:32
+     * @since 1.0.0
+     * @return java.util.List<java.lang.String>
+     */
+    protected abstract List<String> getMacAddress() throws Exception;
+
+    /**
+     * 鑾峰彇CPU搴忓垪鍙�
+     * @author zifangsky
+     * @date 2018/4/23 11:35
+     * @since 1.0.0
+     * @return java.lang.String
+     */
+    protected abstract String getCPUSerial() throws Exception;
+
+    /**
+     * 鑾峰彇涓绘澘搴忓垪鍙�
+     * @author zifangsky
+     * @date 2018/4/23 11:35
+     * @since 1.0.0
+     * @return java.lang.String
+     */
+    protected abstract String getMainBoardSerial() throws Exception;
+
+    /**
+     * 鑾峰彇褰撳墠鏈嶅姟鍣ㄦ墍鏈夌鍚堟潯浠剁殑InetAddress
+     * @author zifangsky
+     * @date 2018/4/23 17:38
+     * @since 1.0.0
+     * @return java.util.List<java.net.InetAddress>
+     */
+    protected List<InetAddress> getLocalAllInetAddress() throws Exception {
+        List<InetAddress> result = new ArrayList<>(4);
+
+        // 閬嶅巻鎵�鏈夌殑缃戠粶鎺ュ彛
+        for (Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); networkInterfaces.hasMoreElements(); ) {
+            NetworkInterface iface = (NetworkInterface) networkInterfaces.nextElement();
+            // 鍦ㄦ墍鏈夌殑鎺ュ彛涓嬪啀閬嶅巻IP
+            for (Enumeration inetAddresses = iface.getInetAddresses(); inetAddresses.hasMoreElements(); ) {
+                InetAddress inetAddr = (InetAddress) inetAddresses.nextElement();
+
+                //鎺掗櫎LoopbackAddress銆丼iteLocalAddress銆丩inkLocalAddress銆丮ulticastAddress绫诲瀷鐨処P鍦板潃
+                if(!inetAddr.isLoopbackAddress() /*&& !inetAddr.isSiteLocalAddress()*/
+                        && !inetAddr.isLinkLocalAddress() && !inetAddr.isMulticastAddress()){
+                    result.add(inetAddr);
+                }
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 鑾峰彇鏌愪釜缃戠粶鎺ュ彛鐨凪ac鍦板潃
+     * @author zifangsky
+     * @date 2018/4/23 18:08
+     * @since 1.0.0
+     * @param
+     * @return void
+     */
+    protected String getMacByInetAddress(InetAddress inetAddr){
+        try {
+            byte[] mac = NetworkInterface.getByInetAddress(inetAddr).getHardwareAddress();
+            StringBuffer stringBuffer = new StringBuffer();
+
+            for(int i=0;i<mac.length;i++){
+                if(i != 0) {
+                    stringBuffer.append("-");
+                }
+
+                //灏嗗崄鍏繘鍒禸yte杞寲涓哄瓧绗︿覆
+                String temp = Integer.toHexString(mac[i] & 0xff);
+                if(temp.length() == 1){
+                    stringBuffer.append("0" + temp);
+                }else{
+                    stringBuffer.append(temp);
+                }
+            }
+
+            return stringBuffer.toString().toUpperCase();
+        } catch (SocketException e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+}
diff --git a/src/main/java/com/fzzy/api/lic/LicenseCheckModel.java b/src/main/java/com/fzzy/api/lic/LicenseCheckModel.java
new file mode 100644
index 0000000..62a4009
--- /dev/null
+++ b/src/main/java/com/fzzy/api/lic/LicenseCheckModel.java
@@ -0,0 +1,77 @@
+package com.fzzy.api.lic;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 鑷畾涔夐渶瑕佹牎楠岀殑License鍙傛暟
+ *
+ * @author zifangsky
+ * @date 2018/4/23
+ * @since 1.0.0
+ */
+public class LicenseCheckModel implements Serializable{
+
+    private static final long serialVersionUID = 8600137500316662317L;
+    /**
+     * 鍙鍏佽鐨処P鍦板潃
+     */
+    private List<String> ipAddress;
+
+    /**
+     * 鍙鍏佽鐨凪AC鍦板潃
+     */
+    private List<String> macAddress;
+
+    /**
+     * 鍙鍏佽鐨凜PU搴忓垪鍙�
+     */
+    private String cpuSerial;
+
+    /**
+     * 鍙鍏佽鐨勪富鏉垮簭鍒楀彿
+     */
+    private String mainBoardSerial;
+
+    public List<String> getIpAddress() {
+        return ipAddress;
+    }
+
+    public void setIpAddress(List<String> ipAddress) {
+        this.ipAddress = ipAddress;
+    }
+
+    public List<String> getMacAddress() {
+        return macAddress;
+    }
+
+    public void setMacAddress(List<String> macAddress) {
+        this.macAddress = macAddress;
+    }
+
+    public String getCpuSerial() {
+        return cpuSerial;
+    }
+
+    public void setCpuSerial(String cpuSerial) {
+        this.cpuSerial = cpuSerial;
+    }
+
+    public String getMainBoardSerial() {
+        return mainBoardSerial;
+    }
+
+    public void setMainBoardSerial(String mainBoardSerial) {
+        this.mainBoardSerial = mainBoardSerial;
+    }
+
+    @Override
+    public String toString() {
+        return "LicenseCheckModel{" +
+                "ipAddress=" + ipAddress +
+                ", macAddress=" + macAddress +
+                ", cpuSerial='" + cpuSerial + '\'' +
+                ", mainBoardSerial='" + mainBoardSerial + '\'' +
+                '}';
+    }
+}
diff --git a/src/main/java/com/fzzy/api/lic/LinuxServerInfos.java b/src/main/java/com/fzzy/api/lic/LinuxServerInfos.java
new file mode 100644
index 0000000..89b28c7
--- /dev/null
+++ b/src/main/java/com/fzzy/api/lic/LinuxServerInfos.java
@@ -0,0 +1,97 @@
+package com.fzzy.api.lic;
+
+import org.apache.commons.lang.StringUtils;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.InetAddress;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 鐢ㄤ簬鑾峰彇瀹㈡埛Linux鏈嶅姟鍣ㄧ殑鍩烘湰淇℃伅
+ *
+ * @author zifangsky
+ * @date 2018/4/23
+ * @since 1.0.0
+ */
+public class LinuxServerInfos extends AbstractServerInfos {
+
+    @Override
+    protected List<String> getIpAddress() throws Exception {
+        List<String> result = null;
+
+        //鑾峰彇鎵�鏈夌綉缁滄帴鍙�
+        List<InetAddress> inetAddresses = getLocalAllInetAddress();
+
+        if(inetAddresses != null && inetAddresses.size() > 0){
+            result = inetAddresses.stream().map(InetAddress::getHostAddress).distinct().map(String::toLowerCase).collect(Collectors.toList());
+        }
+
+        return result;
+    }
+
+    @Override
+    protected List<String> getMacAddress() throws Exception {
+        List<String> result = null;
+
+        //1. 鑾峰彇鎵�鏈夌綉缁滄帴鍙�
+        List<InetAddress> inetAddresses = getLocalAllInetAddress();
+
+        if(inetAddresses != null && inetAddresses.size() > 0){
+            //2. 鑾峰彇鎵�鏈夌綉缁滄帴鍙g殑Mac鍦板潃
+            result = inetAddresses.stream().map(this::getMacByInetAddress).distinct().collect(Collectors.toList());
+        }
+
+        return result;
+    }
+
+    @Override
+    protected String getCPUSerial() throws Exception {
+        //搴忓垪鍙�
+        String serialNumber = "";
+
+        //浣跨敤dmidecode鍛戒护鑾峰彇CPU搴忓垪鍙�
+        String[] shell = {"/bin/bash","-c","dmidecode -t processor | grep 'ID' | awk -F ':' '{print $2}' | head -n 1"};
+        Process process = Runtime.getRuntime().exec(shell);
+        process.getOutputStream().close();
+
+        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+
+        String readLine = reader.readLine();
+        if(StringUtils.isNotEmpty(readLine)){
+            String line = readLine.trim();
+            if(StringUtils.isNotBlank(line)){
+                serialNumber = line;
+            }
+        }
+
+        reader.close();
+
+        return serialNumber;
+    }
+
+    @Override
+    protected String getMainBoardSerial() throws Exception {
+        //搴忓垪鍙�
+        String serialNumber = "";
+
+        //浣跨敤dmidecode鍛戒护鑾峰彇涓绘澘搴忓垪鍙�
+        String[] shell = {"/bin/bash","-c","dmidecode | grep 'Serial Number' | awk -F ':' '{print $2}' | head -n 1"};
+        Process process = Runtime.getRuntime().exec(shell);
+        process.getOutputStream().close();
+
+        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+
+        String readLine = reader.readLine();
+        if(StringUtils.isNotEmpty(readLine)){
+            String line = readLine.trim();
+            if(StringUtils.isNotBlank(line)){
+                serialNumber = line;
+            }
+        }
+
+        reader.close();
+        return serialNumber;
+    }
+}
diff --git a/src/main/java/com/fzzy/api/lic/WindowsServerInfos.java b/src/main/java/com/fzzy/api/lic/WindowsServerInfos.java
new file mode 100644
index 0000000..14eb93d
--- /dev/null
+++ b/src/main/java/com/fzzy/api/lic/WindowsServerInfos.java
@@ -0,0 +1,89 @@
+package com.fzzy.api.lic;
+
+import java.net.InetAddress;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Collectors;
+
+/**
+ * 鐢ㄤ簬鑾峰彇瀹㈡埛Windows鏈嶅姟鍣ㄧ殑鍩烘湰淇℃伅
+ *
+ * @author zifangsky
+ * @date 2018/4/23
+ * @since 1.0.0
+ */
+public class WindowsServerInfos extends AbstractServerInfos {
+
+    @Override
+    protected List<String> getIpAddress() throws Exception {
+        List<String> result = null;
+
+        //鑾峰彇鎵�鏈夌綉缁滄帴鍙�
+        List<InetAddress> inetAddresses = getLocalAllInetAddress();
+
+        if(inetAddresses != null && inetAddresses.size() > 0){
+            result = inetAddresses.stream().map(InetAddress::getHostAddress).distinct().map(String::toLowerCase).collect(Collectors.toList());
+        }
+
+        return result;
+    }
+
+    @Override
+    protected List<String> getMacAddress() throws Exception {
+        List<String> result = null;
+
+        //1. 鑾峰彇鎵�鏈夌綉缁滄帴鍙�
+        List<InetAddress> inetAddresses = getLocalAllInetAddress();
+
+        if(inetAddresses != null && inetAddresses.size() > 0){
+            //2. 鑾峰彇鎵�鏈夌綉缁滄帴鍙g殑Mac鍦板潃
+            result = inetAddresses.stream().map(this::getMacByInetAddress).distinct().collect(Collectors.toList());
+        }
+
+        return result;
+    }
+
+    @Override
+    protected String getCPUSerial() throws Exception {
+        //搴忓垪鍙�
+        String serialNumber = "";
+
+        //浣跨敤WMIC鑾峰彇CPU搴忓垪鍙�
+        Process process = Runtime.getRuntime().exec("wmic cpu get processorid");
+        process.getOutputStream().close();
+        Scanner scanner = new Scanner(process.getInputStream());
+
+        if(scanner != null && scanner.hasNext()){
+            scanner.next();
+        }
+
+        if(scanner.hasNext()){
+            serialNumber = scanner.next().trim();
+        }
+
+        scanner.close();
+        return serialNumber;
+    }
+
+    @Override
+    protected String getMainBoardSerial() throws Exception {
+        //搴忓垪鍙�
+        String serialNumber = "";
+
+        //浣跨敤WMIC鑾峰彇涓绘澘搴忓垪鍙�
+        Process process = Runtime.getRuntime().exec("wmic baseboard get serialnumber");
+        process.getOutputStream().close();
+        Scanner scanner = new Scanner(process.getInputStream());
+
+        if(scanner != null && scanner.hasNext()){
+            scanner.next();
+        }
+
+        if(scanner.hasNext()){
+            serialNumber = scanner.next().trim();
+        }
+
+        scanner.close();
+        return serialNumber;
+    }
+}
diff --git a/src/main/java/com/fzzy/api/utils/SystemUtil.java b/src/main/java/com/fzzy/api/utils/SystemUtil.java
new file mode 100644
index 0000000..ba11605
--- /dev/null
+++ b/src/main/java/com/fzzy/api/utils/SystemUtil.java
@@ -0,0 +1,211 @@
+package com.fzzy.api.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.fzzy.api.lic.AbstractServerInfos;
+import com.fzzy.api.lic.LicenseCheckModel;
+import com.fzzy.api.lic.LinuxServerInfos;
+import com.fzzy.api.lic.WindowsServerInfos;
+import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.UnknownHostException;
+import java.util.*;
+
+/**
+ * @Desc: 鑾峰彇瀹㈡埛鐧婚檰淇℃伅
+ * @author: andy.jia
+ * @update-time: 2022/11/10 19:55
+ */
+public class SystemUtil {
+
+    /***
+     * 鑾峰彇瀹㈡埛绔疘P鍦板潃
+     * @param request
+     */
+    public static String getIP(HttpServletRequest request) {
+        if (request == null) {
+            return "127.0.0.1";
+        }
+        String ip = request.getHeader("X-Real-IP");
+        if (ip != null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {
+            return ip;
+        }
+        ip = request.getHeader("X-Forwarded-For");
+        if (ip != null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {
+            // 澶氭鍙嶅悜浠g悊鍚庝細鏈夊涓狪P鍊硷紝绗竴涓负鐪熷疄IP銆�
+            int index = ip.indexOf(',');
+            if (index != -1) {
+                return ip.substring(0, index);
+            } else {
+                return ip;
+            }
+        } else {
+            return request.getRemoteAddr();
+        }
+    }
+
+
+    /**
+     * 鑾峰彇鏉ヨ鑰呯殑娴忚鍣ㄧ増鏈�
+     *
+     * @param request
+     * @return
+     */
+    public static String getBrowserInfo(HttpServletRequest request) {
+        String browserVersion = null;
+        String header = request.getHeader("user-agent");
+        if (header == null || header.equals("")) {
+            return "";
+        }
+        if (header.indexOf("MSIE 6.0") > 0) {
+            browserVersion = "IE 6";
+        } else if (header.indexOf("MSIE 7.0") > 0) {
+            browserVersion = "IE 7";
+        } else if (header.indexOf("MSIE 8.0") > 0) {
+            browserVersion = "IE 8";
+        } else if (header.indexOf("MSIE 9.0") > 0) {
+            browserVersion = "IE 9";
+        } else if (header.indexOf("MSIE 10.0") > 0) {
+            browserVersion = "IE 10";
+        } else if (header.indexOf("rv:11.0") > 0) {
+            browserVersion = "IE 11";
+        } else if (header.indexOf("Firefox") > 0) {
+            browserVersion = "Firefox";
+        } else if (header.indexOf("Chrome") > 0) {
+            browserVersion = "Chrome";
+        } else if (header.indexOf("Safari") > 0) {
+            browserVersion = "Safari";
+        } else if (header.indexOf("Camino") > 0) {
+            browserVersion = "Camino";
+        } else if (header.indexOf("Konqueror") > 0) {
+            browserVersion = "Konqueror";
+        }
+        return browserVersion;
+    }
+
+
+    /**
+     * 鑾峰彇绯荤粺鐗堟湰淇℃伅
+     *
+     * @param request
+     * @return
+     */
+    public static String getSystemInfo(HttpServletRequest request) {
+        String systenInfo = null;
+        String header = request.getHeader("user-agent");
+        if (header == null || header.equals("")) {
+            return "";
+        }
+        // 寰楀埌鐢ㄦ埛鐨勬搷浣滅郴缁�
+        if (header.indexOf("NT 6.0") > 0) {
+            systenInfo = "Windows Vista/Server 2008";
+        } else if (header.indexOf("NT 5.2") > 0) {
+            systenInfo = "Windows Server 2003";
+        } else if (header.indexOf("NT 5.1") > 0) {
+            systenInfo = "Windows XP";
+        } else if (header.indexOf("NT 6.0") > 0) {
+            systenInfo = "Windows Vista";
+        } else if (header.indexOf("NT 6.1") > 0) {
+            systenInfo = "Windows 7";
+        } else if (header.indexOf("NT 6.2") > 0) {
+            systenInfo = "Windows Slate";
+        } else if (header.indexOf("NT 6.3") > 0) {
+            systenInfo = "Windows 9";
+        } else if (header.indexOf("NT 10.0") > 0) {
+            systenInfo = "Windows 10";
+        } else if (header.indexOf("NT 5") > 0) {
+            systenInfo = "Windows 2000";
+        } else if (header.indexOf("NT 4") > 0) {
+            systenInfo = "Windows NT4";
+        } else if (header.indexOf("Me") > 0) {
+            systenInfo = "Windows Me";
+        }  else if (header.indexOf("Mac") > 0) {
+            systenInfo = "Mac";
+        } else if (header.indexOf("Unix") > 0) {
+            systenInfo = "UNIX";
+        } else if (header.indexOf("Linux") > 0) {
+            systenInfo = "Linux";
+        } else if (header.indexOf("SunOS") > 0) {
+            systenInfo = "SunOS";
+        }
+        return systenInfo;
+    }
+
+
+    /**
+     * 鑾峰彇鏉ヨ鑰呯殑涓绘満鍚嶇О
+     *
+     * @param ip
+     * @return
+     */
+    public static String getHostName(String ip) {
+        InetAddress inet;
+        try {
+            inet = InetAddress.getByName(ip);
+            return inet.getHostName();
+        } catch (UnknownHostException e) {
+            e.printStackTrace();
+        }
+        return "鏈煡";
+    }
+
+
+    public static  String getSystemInfo() throws Exception {
+        String os = System.getProperty("os.name").toLowerCase();
+        Map<String ,Object> param =null;
+        AbstractServerInfos abstractServerInfos = null;
+
+        if (os.indexOf("win") >= 0) {
+            param = new HashMap<>();
+            abstractServerInfos = new WindowsServerInfos(); // Windows绯荤粺
+            LicenseCheckModel data = abstractServerInfos.getServerInfos();
+            //param.put("macAddress",data.getMacAddress());
+            param.put("cpuSerial",data.getCpuSerial());
+            param.put("mainBoardSerial",data.getMainBoardSerial());
+        } else if (os.indexOf("mac") >= 0) {
+            // Mac绯荤粺
+        } else if (os.indexOf("nix") >= 0 || os.indexOf("nux") >= 0 || os.indexOf("aix") >= 0) {
+            // Unix/Linux绯荤粺
+            param = new HashMap<>();
+            abstractServerInfos = new LinuxServerInfos();
+            LicenseCheckModel data = abstractServerInfos.getServerInfos();
+            //param.put("macAddress",data.getMacAddress())  ;
+            param.put("cpuSerial",data.getCpuSerial())        ;
+            param.put("mainBoardSerial",data.getMainBoardSerial());
+        } else if (os.indexOf("sunos") >= 0) {
+            // Solaris绯荤粺
+        } else {
+            // 鏈煡鐨勬搷浣滅郴缁�
+        }
+        if(null == param){
+            return "";
+        }else {
+            return JSON.toJSONString(param);
+        }
+
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鏈嶅姟鍣ㄦ墍鏈夌鍚堟潯浠剁殑InetAddress
+     */
+    protected static List<InetAddress> getLocalAllInetAddress() throws Exception {
+        List<InetAddress> result = new ArrayList<>(4);
+
+        // 閬嶅巻鎵�鏈夌殑缃戠粶鎺ュ彛
+        for (Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); networkInterfaces.hasMoreElements(); ) {
+            NetworkInterface iface = (NetworkInterface) networkInterfaces.nextElement();
+            // 鍦ㄦ墍鏈夌殑鎺ュ彛涓嬪啀閬嶅巻IP
+            for (Enumeration inetAddresses = iface.getInetAddresses(); inetAddresses.hasMoreElements(); ) {
+                InetAddress inetAddr = (InetAddress) inetAddresses.nextElement();
+
+                //鎺掗櫎LoopbackAddress銆丼iteLocalAddress銆丩inkLocalAddress銆丮ulticastAddress绫诲瀷鐨処P鍦板潃
+                if(!inetAddr.isLoopbackAddress() /*&& !inetAddr.isSiteLocalAddress()*/
+                        && !inetAddr.isLinkLocalAddress() && !inetAddr.isMulticastAddress()){
+                    result.add(inetAddr);
+                }
+            }
+        }
+
+        return result;
+    }
+}
diff --git a/src/main/java/com/fzzy/push/gd2023/GD2023ApiRemoteService2023.java b/src/main/java/com/fzzy/push/gd2023/GD2023ApiRemoteService2023.java
index d9d12df..5775db7 100644
--- a/src/main/java/com/fzzy/push/gd2023/GD2023ApiRemoteService2023.java
+++ b/src/main/java/com/fzzy/push/gd2023/GD2023ApiRemoteService2023.java
@@ -315,8 +315,7 @@
             BeanUtils.copyProperties(data, api1102);
             //鏍¢獙缁熶竴缂栫爜鏄惁涓虹┖锛屼负绌哄垯鏌ヨ搴撳尯淇℃伅杩涜璧嬪��
             if (StringUtils.isEmpty(api1102.getTydwbm())) {
-                String tydwbm = apiCommonService.getTydwbm(api1102.getDwdm());
-                api1102.setTydwbm(tydwbm);
+                api1102.setTydwbm(api1102.getTykqbm().substring(0, 20));
             }
             api1102.setZhgxsj(DateUtils.addSeconds(new Date(), -10));
             return JSON.toJSONString(api1102);
diff --git a/src/main/java/com/fzzy/push/sx2024/SX2024ApiRemoteService.java b/src/main/java/com/fzzy/push/sx2024/SX2024ApiRemoteService.java
index 629b77c..ed126b8 100644
--- a/src/main/java/com/fzzy/push/sx2024/SX2024ApiRemoteService.java
+++ b/src/main/java/com/fzzy/push/sx2024/SX2024ApiRemoteService.java
@@ -100,14 +100,14 @@
             //鑾峰彇鎸囦护id
             String key = RedisConst.buildKey(RedisConst.KYE_ORDER, conf.getKqdm());
             String orderId = (String) redisUtil.get(key);
-            if (StringUtils.isEmpty(orderId)) {
-                log.error("鎸囦护id澶辨晥");
-                ResponseDto responseDto = new ResponseDto(99, "鎸囦护id澶辨晥");
-                apiLog.setStatus(99);
-                apiLog.setResult("鎸囦护id澶辨晥");
-                apiLogRep.save(apiLog);
-                return responseDto;
-            }
+//            if (StringUtils.isEmpty(orderId)) {
+//                log.error("鎸囦护id澶辨晥");
+//                ResponseDto responseDto = new ResponseDto(99, "鎸囦护id澶辨晥");
+//                apiLog.setStatus(99);
+//                apiLog.setResult("鎸囦护id澶辨晥");
+//                apiLogRep.save(apiLog);
+//                return responseDto;
+//            }
 
             //灏佽鎺ㄩ�佹暟鎹�
             SX2024ReqDto reqData = new SX2024ReqDto();
diff --git a/src/main/java/com/fzzy/sys/LogLogin.view.xml b/src/main/java/com/fzzy/sys/LogLogin.view.xml
new file mode 100644
index 0000000..06c7a43
--- /dev/null
+++ b/src/main/java/com/fzzy/sys/LogLogin.view.xml
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ViewConfig>
+  <Arguments/>
+  <Context/>
+  <Model>
+    <DataType name="dtMain">
+      <Property name="creationType">com.fzzy.sys.entity.LogLogin</Property>
+      <PropertyDef name="id">
+        <Property></Property>
+        <Property name="label">ID</Property>
+      </PropertyDef>
+      <PropertyDef name="companyId">
+        <Property></Property>
+        <Property name="label">缁勭粐缂栫爜</Property>
+      </PropertyDef>
+      <PropertyDef name="loginId">
+        <Property></Property>
+        <Property name="label">鐧婚檰ID</Property>
+      </PropertyDef>
+      <PropertyDef name="loginName">
+        <Property></Property>
+        <Property name="label">鐧婚檰鐢ㄦ埛</Property>
+      </PropertyDef>
+      <PropertyDef name="loginTime">
+        <Property name="dataType">DateTime</Property>
+        <Property name="label">鐧婚檰鏃堕棿</Property>
+      </PropertyDef>
+      <PropertyDef name="errorNum">
+        <Property name="dataType">Integer</Property>
+        <Property name="label">閿欒娆℃暟</Property>
+        <Property name="displayFormat">#0 娆�</Property>
+      </PropertyDef>
+      <PropertyDef name="ip">
+        <Property name="label">鐧婚檰鑰匢P</Property>
+      </PropertyDef>
+      <PropertyDef name="browser">
+        <Property name="label">娴忚鍣�</Property>
+      </PropertyDef>
+      <PropertyDef name="sysName">
+        <Property name="label">鎿嶄綔绯荤粺</Property>
+      </PropertyDef>
+      <PropertyDef name="hostName">
+        <Property name="label">鐧婚檰涓绘満</Property>
+      </PropertyDef>
+      <PropertyDef name="netInfo">
+        <Property name="label">缃戠粶鐘跺喌</Property>
+      </PropertyDef>
+      <PropertyDef name="lastLoginTime">
+        <Property name="dataType">Date</Property>
+        <Property name="label">涓婃鐧婚檰鏃堕棿</Property>
+      </PropertyDef>
+      <PropertyDef name="loginInfo">
+        <Property name="label">鐧婚檰璇存槑</Property>
+      </PropertyDef>
+    </DataType>
+    <DataType name="dtParam">
+      <PropertyDef name="start">
+        <Property name="dataType">Date</Property>
+        <Property name="label">寮�濮嬫棩鏈�</Property>
+      </PropertyDef>
+      <PropertyDef name="end">
+        <Property name="dataType">Date</Property>
+        <Property name="label">鎴鏃ユ湡</Property>
+      </PropertyDef>
+    </DataType>
+  </Model>
+  <View layout="regionPadding:10">
+    <ClientEvent name="onReady">view.get(&quot;#dsParam&quot;).insert({});</ClientEvent>
+    <Property name="packages">font-awesome,css-common</Property>
+    <DataSet id="dsMain">
+      <Property name="dataProvider">logLoginPR#pageLogLogin</Property>
+      <Property name="dataType">[dtMain]</Property>
+      <Property name="pageSize">15</Property>
+    </DataSet>
+    <DataSet id="dsParam">
+      <Property name="dataType">dtParam</Property>
+    </DataSet>
+    <Container layout="regionPadding:10" layoutConstraint="center">
+      <Property name="exClassName">bg-color</Property>
+      <AutoForm>
+        <Property name="dataSet">dsParam</Property>
+        <Property name="cols">*,*,*,*</Property>
+        <AutoFormElement>
+          <Property name="name">start</Property>
+          <Property name="property">start</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">end</Property>
+          <Property name="property">end</Property>
+          <Editor/>
+        </AutoFormElement>
+        <Container layout="regionPadding:10">
+          <Button layoutConstraint="left">
+            <ClientEvent name="onClick">var param = view.get(&quot;#dsParam.data&quot;);&#xD;
+view.get(&quot;#dsMain&quot;).set(&quot;parameter&quot;,param).flushAsync();</ClientEvent>
+            <Property name="caption">鏌ヨ</Property>
+            <Property name="exClassName">btn-normal</Property>
+            <Property name="iconClass">fa fa-search</Property>
+          </Button>
+          <Button layoutConstraint="left">
+            <ClientEvent name="onClick">view.get(&quot;#dsParam&quot;).flushAsync();</ClientEvent>
+            <Property name="caption">閲嶇疆</Property>
+            <Property name="iconClass">fa fa-refresh</Property>
+            <Property name="exClassName">btn-default</Property>
+          </Button>
+        </Container>
+      </AutoForm>
+      <DataGrid id="dgMain">
+        <ClientEvent name="onDataRowDoubleClick">var dialog= view.get(&quot;#dialogMain&quot;);&#xD;
+dialog.show();</ClientEvent>
+        <Property name="dataSet">dsMain</Property>
+        <Property name="readOnly">true</Property>
+        <RowNumColumn/>
+        <DataColumn name="loginName">
+          <Property name="property">loginName</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="loginId">
+          <Property name="property">loginId</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="loginTime">
+          <Property name="property">loginTime</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="errorNum">
+          <Property name="property">errorNum</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="ip">
+          <Property name="property">ip</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="browser">
+          <Property name="property">browser</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="sysName">
+          <Property name="property">sysName</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="hostName">
+          <Property name="property">hostName</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="netInfo">
+          <Property name="property">netInfo</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="loginInfo">
+          <Property name="property">loginInfo</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="lastLoginTime">
+          <Property name="property">lastLoginTime</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+      </DataGrid>
+    </Container>
+    <Container layoutConstraint="bottom">
+      <Property name="exClassName">bg-color</Property>
+      <DataPilot layoutConstraint="right">
+        <Property name="dataSet">dsMain</Property>
+        <Property name="itemCodes">pageSize,pages</Property>
+      </DataPilot>
+    </Container>
+  </View>
+</ViewConfig>
diff --git a/src/main/java/com/fzzy/sys/LogLoginPR.java b/src/main/java/com/fzzy/sys/LogLoginPR.java
new file mode 100644
index 0000000..f44a61e
--- /dev/null
+++ b/src/main/java/com/fzzy/sys/LogLoginPR.java
@@ -0,0 +1,78 @@
+package com.fzzy.sys;
+
+import com.bstek.dorado.annotation.DataProvider;
+import com.fzzy.sys.entity.LogLogin;
+import com.fzzy.api.utils.ContextUtil;
+import com.fzzy.sys.repository.LogLoginRep;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.bstek.dorado.data.provider.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Component;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description 鐧诲綍鏃ュ織
+ * @Author CZT
+ * @Date 2024/5/30 15:53
+ */
+@Component
+public class LogLoginPR {
+
+    @Autowired
+    private LogLoginRep logLoginRep;
+
+    /**
+     * logLoginPR#pageLogLogin
+     *
+     * @param page
+     * @param param
+     * @throws Exception
+     */
+    @DataProvider
+    public void pageLogLogin(Page<LogLogin> page, Map<String, Object> param) {
+        //澶氬弬鏁板垎椤垫煡璇�
+        Pageable pageable = PageRequest.of(page.getPageNo() - 1, page.getPageSize(), Sort.Direction.DESC, LogLogin.SORT_PROP);
+
+        if (null == param) {
+            org.springframework.data.domain.Page<LogLogin> japPage = logLoginRep.findAll(pageable);
+            page.setEntityCount((int) japPage.getTotalElements());
+            page.setEntities(japPage.getContent());
+
+            return;
+        }
+
+        Specification<LogLogin> specification = new Specification<LogLogin>() {
+            private static final long serialVersionUID = 1L;
+
+            public Predicate toPredicate(Root<LogLogin> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                List<Predicate> predicates = new ArrayList<>(); //鎵�鏈夌殑鏂█
+
+                Date date = (Date) param.get("start");
+                if (null != date) {
+                    Predicate predicate3 = cb.greaterThan(root.get("loginTime"), ContextUtil.getCurZero(date));
+                    predicates.add(predicate3);
+                }
+                date = (Date) param.get("end");
+                if (null != date) {
+                    Predicate predicate4 = cb.lessThan(root.get("loginTime"), ContextUtil.getNextZero(date));
+                    predicates.add(predicate4);
+                }
+                return cb.and(predicates.toArray(new Predicate[0]));
+            }
+        };
+
+        org.springframework.data.domain.Page<LogLogin> japPage = logLoginRep.findAll(specification, pageable);
+        page.setEntityCount((int) japPage.getTotalElements());
+        page.setEntities(japPage.getContent());
+    }
+}
diff --git a/src/main/java/com/fzzy/sys/LogLoginService.java b/src/main/java/com/fzzy/sys/LogLoginService.java
new file mode 100644
index 0000000..73523a0
--- /dev/null
+++ b/src/main/java/com/fzzy/sys/LogLoginService.java
@@ -0,0 +1,219 @@
+package com.fzzy.sys;
+
+import com.fzzy.api.utils.ContextUtil;
+import com.fzzy.sys.entity.LogLogin;
+import com.fzzy.api.utils.RedisConst;
+import com.fzzy.api.utils.RedisUtil;
+import com.fzzy.api.utils.SystemUtil;
+import com.fzzy.sys.repository.LogLoginRep;
+import com.fzzy.sys.entity.SysUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+
+/**
+ * @Desc: 鐧婚檰鏃ュ織璁板綍淇℃伅
+ * @author: andy.jia
+ * @update-time: 2023/4/28 8:32
+ */
+@Component
+public class LogLoginService{
+
+    private String KEY_LOGON_LOG = "LOGIN_LOG";
+    private int TIME_ERROR_MIN = 60;
+
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private LogLoginRep logLoginRep;
+
+    /**
+     * 鍒ゆ柇褰撳墠鐧婚檰鏄惁琚檺鍒�
+     *
+     * @param request
+     * @param username
+     * @return
+     */
+    public int checkLoginLimit(HttpServletRequest request, String username) {
+
+        //鑾峰彇閿欒璁板綍缂撳瓨
+        LogLogin errorLog = this.getFromCacheError(username, SystemUtil.getIP(request));
+
+        if (null == errorLog) return 0;
+
+        return errorLog.getErrorNum();
+    }
+
+
+    /**
+     * 瀵嗙爜杈撳叆閿欒璁板綍锛岃繑鍥炶緭鍏ラ敊璇鏁�
+     *
+     * @param request
+     * @param user
+     * @return
+     */
+    public int addPwdError(HttpServletRequest request, SysUser user) {
+        LogLogin log = new LogLogin();
+        log.setCompanyId(user.getCompanyId());
+        log.setLoginId(user.getUsername());
+        log.setLoginName(user.getName());
+        log.setLoginTime(new Date());
+        log.setIp(SystemUtil.getIP(request));
+        log.setBrowser(SystemUtil.getBrowserInfo(request));
+        log.setSysName(SystemUtil.getSystemInfo(request));
+        log.setHostName(SystemUtil.getHostName(log.getIp()));
+        log.setLastLoginTime(new Date());
+        log.setErrorNum(1);
+        log.setLoginInfo("澶辫触锛氬瘑鐮侀敊璇�");
+
+        // 鑾峰彇涓婃閿欒璁板綍
+        LogLogin errorLog = this.getFromCacheError(user.getUsername(), log.getIp());
+        if (null != errorLog) {
+            log.setErrorNum(errorLog.getErrorNum() + 1);
+        }
+
+        //淇濆瓨鏃ュ織
+        addLog(log);
+
+        //淇濆瓨鍒扮紦瀛�
+        addToCacheError(log);
+
+        return log.getErrorNum();
+    }
+
+
+    /**
+     * 鐧婚檰鐢ㄦ埛涓嶅瓨鍦ㄩ敊璇紝杩斿洖杈撳叆涓嶅瓨鍦ㄨ处鍙锋鏁帮紝鐢ㄦ埛涓嶅瓨鍦ㄧ殑璐﹀彿锛屼娇鐢↖P浣滀负鍒ゆ柇鏍囧噯锛岄伩鍏嶆伓鎰忓皾璇�
+     *
+     * @param request
+     * @param username
+     * @return
+     */
+    public int addNoUser(HttpServletRequest request, String username) {
+
+        LogLogin log = new LogLogin();
+        log.setLoginName(username);
+        log.setLoginTime(new Date());
+        log.setIp(SystemUtil.getIP(request));
+        log.setBrowser(SystemUtil.getBrowserInfo(request));
+        log.setSysName(SystemUtil.getSystemInfo(request));
+        log.setHostName(SystemUtil.getHostName(log.getIp()));
+        log.setLastLoginTime(new Date());
+        log.setErrorNum(1);
+        log.setLoginId(log.getIp());
+        log.setLoginInfo("澶辫触锛氭棤鏁堣处鍙�");
+
+        // 鑾峰彇涓婃閿欒璁板綍
+        LogLogin errorLog = this.getFromCacheError(log.getIp(), log.getIp());
+        if (null != errorLog) {
+            log.setErrorNum(errorLog.getErrorNum() + 1);
+        }
+
+        //淇濆瓨鍒扮紦瀛�
+        addToCache(log);
+
+
+        //淇濆瓨鏃ュ織
+        log.setLoginId(username);
+        addLog(log);
+
+        return log.getErrorNum();
+    }
+
+    /**
+     * 澧炲姞鐧婚檰鏃ュ織淇℃伅
+     *
+     * @param request
+     * @param user
+     */
+    public void addLoginInfo(HttpServletRequest request, SysUser user) {
+        LogLogin log = new LogLogin();
+        log.setCompanyId(user.getCompanyId());
+        log.setLoginId(user.getUsername());
+        log.setLoginName(user.getName());
+        log.setLoginTime(new Date());
+        log.setIp(SystemUtil.getIP(request));
+        log.setBrowser(SystemUtil.getBrowserInfo(request));
+        log.setSysName(SystemUtil.getSystemInfo(request));
+        log.setHostName(SystemUtil.getHostName(log.getIp()));
+        log.setErrorNum(0);
+        log.setLoginInfo("鎴愬姛锛氭甯哥櫥闄�");
+
+        // 鑾峰彇涓婃鐧婚檰淇℃伅
+        LogLogin lastLog = this.getFromCache(log.getLoginId());
+        if (null != lastLog) {
+            log.setLastLoginTime(lastLog.getLoginTime());
+        }
+
+        //淇濆瓨缂撳瓨
+        addToCache(log);
+
+        //淇濆瓨鏃ュ織
+        addLog(log);
+    }
+
+    /**
+     * @param log
+     */
+    private void addToCache(LogLogin log) {
+
+        String key = RedisConst.buildKey(KEY_LOGON_LOG, log.getLoginId());
+
+        redisUtil.set(key, log);
+
+
+        this.removeCacheError(log.getLoginId(), log.getIp());
+
+    }
+
+
+    private LogLogin getFromCache(String loginId) {
+        if (null == loginId) return null;
+        try {
+            String key = RedisConst.buildKey(KEY_LOGON_LOG, loginId);
+            return (LogLogin) redisUtil.get(key);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    private void removeCacheError(String loginId, String ip) {
+        String key = RedisConst.buildKey(KEY_LOGON_LOG, loginId, ip);
+
+        redisUtil.del(key);
+    }
+
+    private void addToCacheError(LogLogin log) {
+        String key = RedisConst.buildKey(KEY_LOGON_LOG, log.getLoginId(), log.getIp());
+        redisUtil.set(key, log, (TIME_ERROR_MIN + 1) * 60);
+    }
+
+    private LogLogin getFromCacheError(String loginId, String ip) {
+        if (null == loginId) return null;
+        if (null == ip) return null;
+        try {
+            String key = RedisConst.buildKey(KEY_LOGON_LOG, loginId, ip);
+            return (LogLogin) redisUtil.get(key);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+
+    /**
+     * @Desc: 淇濆瓨鏃ュ織
+     * @author: Andy
+     * @update-time: 2023/4/28
+     */
+    public void addLog(LogLogin log) {
+
+        if (null == log) return;
+
+        if (null == log.getId()) {
+            log.setId(ContextUtil.getUUID());
+        }
+        logLoginRep.save(log);
+    }
+
+}
diff --git a/src/main/java/com/fzzy/sys/entity/LogLogin.java b/src/main/java/com/fzzy/sys/entity/LogLogin.java
new file mode 100644
index 0000000..bb482d6
--- /dev/null
+++ b/src/main/java/com/fzzy/sys/entity/LogLogin.java
@@ -0,0 +1,78 @@
+package com.fzzy.sys.entity;
+
+import com.bstek.dorado.annotation.PropertyDef;
+import lombok.Data;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Desc: 绯荤粺鐧婚檰鏃ュ織
+ * @author: Andy
+ * @update-time: 2023/4/27
+ */
+@Data
+@Entity
+@Table(name = "D_LOG_LOGIN")
+public class LogLogin implements Serializable {
+
+    public static String SORT_PROP = "id";
+
+    @Id
+    @Column(name = "ID_", unique = true, length = 40)
+    @PropertyDef(label = "ID")
+    private String id;
+
+    @Column(name = "COMPANY_ID", length = 10)
+    @PropertyDef(label = "缁勭粐缂栫爜")
+    private String companyId;
+
+    @Column(name = "LOGIN_ID", length = 40)
+    @PropertyDef(label = "鐧婚檰ID")
+    private String loginId;
+
+    @Column(name = "LOGIN_NAME", length = 40)
+    @PropertyDef(label = "鐧婚檰鐢ㄦ埛")
+    private String loginName;
+
+    @Column(name = "LOGIN_TIME")
+    @PropertyDef(label = "鐧婚檰鏃堕棿")
+    private Date loginTime;
+
+    @Column(name = "ERROR_NUM")
+    @PropertyDef(label = "閿欒娆℃暟")
+    private int errorNum;
+
+    @Column(name = "IP_", length = 20)
+    @PropertyDef(label = "鐧婚檰鑰匢P")
+    private String ip;
+
+    @Column(name = "BROSWER_", length = 50)
+    @PropertyDef(label = "娴忚鍣�")
+    private String browser;
+
+    @Column(name = "SYS_NAME", length = 50)
+    @PropertyDef(label = "鎿嶄綔绯荤粺")
+    private String sysName;
+
+    @Column(name = "HOST_NAME", length = 50)
+    @PropertyDef(label = "鐧婚檰涓绘満")
+    private String hostName;
+
+    @Column(name = "NET_INFO", length = 50)
+    @PropertyDef(label = "缃戠粶鐘跺喌")
+    private String netInfo = "姝e父";
+
+    @Column(name = "LAST_LOGIN_TIME")
+    @PropertyDef(label = "涓婃鐧婚檰鏃堕棿")
+    private Date lastLoginTime;
+
+    @Column(name = "LOGIN_INFO")
+    @PropertyDef(label = "鐧婚檰璇存槑")
+    private String loginInfo;
+
+}
diff --git a/src/main/java/com/fzzy/sys/repository/LogLoginRep.java b/src/main/java/com/fzzy/sys/repository/LogLoginRep.java
new file mode 100644
index 0000000..7461a1a
--- /dev/null
+++ b/src/main/java/com/fzzy/sys/repository/LogLoginRep.java
@@ -0,0 +1,9 @@
+package com.fzzy.sys.repository;
+
+import com.fzzy.sys.entity.LogLogin;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+public interface LogLoginRep extends JpaRepository<LogLogin, String>, JpaSpecificationExecutor<LogLogin> {
+
+}
diff --git a/src/main/java/com/fzzy/web/LoginController.java b/src/main/java/com/fzzy/web/LoginController.java
index 7edaff0..09be401 100644
--- a/src/main/java/com/fzzy/web/LoginController.java
+++ b/src/main/java/com/fzzy/web/LoginController.java
@@ -1,5 +1,6 @@
 package com.fzzy.web;
 
+import com.fzzy.sys.LogLoginService;
 import com.fzzy.sys.UserPR;
 import com.fzzy.sys.entity.SysUser;
 import com.wf.captcha.ArithmeticCaptcha;
@@ -26,6 +27,8 @@
 
     @Autowired
     private UserPR userPR;
+    @Autowired
+    private LogLoginService logLoginService;
 
     /**
      * 鐧诲綍楠岃瘉鍏ュ彛
@@ -54,16 +57,32 @@
             return "redirect:/login?tag=04&username=" + username;
         }
 
+        //鍒ゆ柇闄愬埗鐧婚檰
+        int num = logLoginService.checkLoginLimit(request, username);
+        if (num >= 3) {
+            return "redirect:/login?tag=11&username=" + username;
+        }
+
         SysUser user = userPR.listById(username);
         if (null == user) {
+            num = logLoginService.addNoUser(request, username);
+            if (num >= 3) {
+                return "redirect:/login?tag=12&username=" + username;
+            }
             return "redirect:/login?tag=05&username=" + username;
         }
 
         boolean tag = userPR.checkPassword(password, user);
         if (!tag){
+            num = logLoginService.addPwdError(request, user);
+            if (num >= 3) {
+                return "redirect:/login?tag=11&username=" + username;
+            }
             return "redirect:/login?tag=06&username=" + username;
         }
         request.getSession().setAttribute("user", user);
+        //澧炲姞鐧诲綍鏃ュ織
+        logLoginService.addLoginInfo(request, user);
 
         return "redirect:/home";
     }
@@ -103,6 +122,12 @@
             if ("10".equals(tag)) {
                 tag = "鎮ㄧ殑璐﹀彿鍦ㄥ叾浠栧湴鏂圭櫥褰曪紝琚揩涓嬬嚎";
             }
+            if ("11".equals(tag)) {
+                tag = "杩炵画3娆¢敊璇紝闄愬埗鐧婚檰60鍒嗛挓";
+            }
+            if ("12".equals(tag)) {
+                tag = "杩炵画3娆¤緭鍏ヤ笉瀛樺湪璐﹀彿锛岄檺鍒剁櫥闄�60鍒嗛挓";
+            }
             view.addObject("TAG", tag);
             view.addObject("USERNAME", username);
         }
diff --git a/src/main/resources/application-pro.yml b/src/main/resources/application-pro.yml
index 3625350..d5033e8 100644
--- a/src/main/resources/application-pro.yml
+++ b/src/main/resources/application-pro.yml
@@ -1,6 +1,6 @@
-##########################  瀹佸鐭冲槾灞辩孩鏋滃瓙绮簱   ##########################
+##########################  闄曡タ鏌炴按鍘�   ##########################
 server:
-  port: 8090
+  port: 8091
   jetty:
     max-http-post-size: 209715200
   tomcat:
@@ -9,16 +9,16 @@
   datasource:
     #涓绘暟鎹簮
     primary:
-      url: jdbc:mysql://127.0.0.1:3306/igds_api?useUnicode=true&characterEncoding=utf-8
+      url: jdbc:mysql://127.0.0.1:3306/igds_api_2024?useUnicode=true&characterEncoding=utf-8&useSSL=false
       driver-class-name: com.mysql.jdbc.Driver
       username: root
-      password: Abc123..
+      password: Fzzy@#$%5432..K
     #娆℃暟鎹簮
     secondary:
-      url: jdbc:mysql://127.0.0.1:3306/igds_master?useUnicode=true&characterEncoding=utf-8
+      url: jdbc:mysql://127.0.0.1:3306/igds_master?useUnicode=true&characterEncoding=utf-8&useSSL=false
       driver-class-name: com.mysql.jdbc.Driver
       username: root
-      password: Abc123..
+      password: Fzzy@#$%5432..K
   jpa:
     #涓籮pa閰嶇疆
     primary:
@@ -41,7 +41,7 @@
     database: 1
     host: 127.0.0.1
     port: 6379
-    password: Abc123..
+    password: Redispwd..
     # 杩炴帴姹犳渶澶ц繛鎺ユ暟锛堜娇鐢ㄨ礋鍊艰〃绀烘病鏈夐檺鍒讹級
     pool:
       max-active: 200
@@ -51,11 +51,6 @@
       timeout: 6000
 igds:
   default:
-    companyId: 5306
+    companyId: 5348
   file-path: D:/IGDS-API/FILE/
-  img-path: D:/IGDS/FILE/
-  # 鐪佸钩鍙癛SA瀵嗛挜瀵逛俊鎭�
-  #鍏挜锛歁IGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsoiS5Q5CKAT9w5EbZXCxJO/5J2iV3i2HrTW/YcGs2EGeQsQc97EWPdFE1SPXGH5p9TO8nCFRJScj4WeeKUVcuRpzR7czQQ+c6kf6cR9LLQrAiGEMQSk13j/5UsJho23IQDGKWoH18f5aPdX8tJn/o4aR6mMxUY9jdaSKEBck1TQIDAQAB
-  # 鍖虹骇骞冲彴RSA瀵嗛挜瀵逛俊鎭�
-  #鍏挜锛歁IGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMsCJyl6EkjUEfB9Otl0bNmFD0Gr3g/v8DYnoq66EIviDNKT+bo5Aj6BRFngns1aCy1uyWgC5/+PIQ3sxs25nWXxFBYXy7cTiGwCCPfnmmI3rkXRGqRo6uh9K3BsucSE0kyhB8Eq76bQ6BPa5XpMyyq8V2oN2i0LLYpDhV97j3BwIDAQAB
-  #绉侀挜锛歁IICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIywInKXoSSNQR8H062XRs2YUPQaveD+/wNieirroQi+IM0pP5ujkCPoFEWeCezVoLLW7JaALn/48hDezGzbmdZfEUFhfLtxOIbAII9+eaYjeuRdEapGjq6H0rcGy5xITSTKEHwSrvptDoE9rlekzLKrxXag3aLQstikOFX3uPcHAgMBAAECgYAOZvWPz4/ygvdYqt9zlNntsBsRci9f+hq3CPzCqg55K6WF+yQE1dCqrFZu7gfME+54gGIF4idgeGanbXd16WEtFslEJlFKGk3cF62gaX5Y/nZ4zS65CLTjQ650j6SJ7OC2QYjIejTWhJD0k1tSazXdzV70nP+X3DbGyyO3Rm+juQJBANMCi+9RnzcGvltN/AdWD0DgshRBNrqrHtDkmzRFSkFwIqVSL5J7qRvntjhSstQIBB5KCosCmwRYKxGWQ9Ou420CQQCqrz2byBz3w2pkEfPY3rv7T4zE/2CHC74XtW9sEUTieYaxqIKlnwJacactzx4ZOAg21dGCoqOG9Y9RIpH2mMfDAkEAlAucXIt61qOfmPXtFsSVrSI5LybWHEAFPfC2yAS5ZZIkbLNt9ytV6eM3oOq81zDMmue93+wzEOg/R3aTHgj9PQJALNGxUsu8V473y+ku596s6/PamgwZE70QoHcjF/R86x9QMCx4ifb0Dj3T0WKWm7ar6YJB7pS4bgLjLEHwpBlAMwJAUUG2NhfGXFxfyFOC+5BzFTEr7EdSeHPXJl7dIWmRHncHsv8Nl2yvWsIOfDOYKS3ynptMgeSZaJPnXhvFdX0TnQ==
+  img-path: D:/IGDS/FILE/
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 86a70b3..bbeeabd 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,7 +1,7 @@
 ##########################  Server   ##########################
 spring:
   profiles:
-    active: pro
+    active: dev
   application:
     name: igds-api
   main:
diff --git a/src/main/resources/templates/home/home.html b/src/main/resources/templates/home/home.html
index 692acde..42e9954 100644
--- a/src/main/resources/templates/home/home.html
+++ b/src/main/resources/templates/home/home.html
@@ -101,6 +101,9 @@
                             <dd>
                                 <a lay-href="com.fzzy.api.view.GbUnifiedCoding.d">缁熶竴缂栫爜绠$悊</a>
                             </dd>
+                            <dd>
+                                <a lay-href="com.fzzy.sys.LogLogin.d">鐧诲綍鏃ュ織</a>
+                            </dd>
                         </dl>
                     </li>
 

--
Gitblit v1.9.3