From d174064c9c48a409d8ee6cdc1d65a5ffe1b2ed0f Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期二, 05 八月 2025 10:32:04 +0800
Subject: [PATCH] #许可证2.0

---
 src/main/java/com/zy/system/controller/LicenseCreatorController.java  |   11 
 src/main/java/com/zy/system/entity/license/LicenseCheckListener.java  |   23 ++
 src/main/java/com/zy/system/entity/LicenseInfos.java                  |   56 +++++++
 src/main/java/com/zy/system/entity/license/CustomLicenseManager.java  |    2 
 src/main/java/com/zy/system/entity/license/LicenseVerify.java         |   84 ++++------
 src/main/resources/mapper/LicenseInfosMapper.xml                      |   18 ++
 src/main/java/com/zy/system/mapper/LicenseInfosMapper.java            |   14 +
 src/main/java/com/zy/system/entity/license/LinuxServerInfos.java      |   91 +++++++++++
 src/main/webapp/views/index.html                                      |    3 
 src/main/java/com/zy/system/service/LicenseInfosService.java          |   10 +
 src/main/java/com/zy/system/entity/license/AbstractServerInfos.java   |    2 
 src/main/java/com/zy/system/timer/LicenseTimer.java                   |  131 +++++++++++++++
 src/main/java/com/zy/common/service/CommonService.java                |   17 -
 src/main/java/com/zy/system/service/impl/LicenseInfosServiceImpl.java |   16 ++
 14 files changed, 396 insertions(+), 82 deletions(-)

diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index ee856c3..8bede90 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -156,6 +156,8 @@
         return null;
     }
 
+
+
     /**
      * 妫�绱㈠簱浣嶅彿
      *
@@ -290,21 +292,6 @@
             }
         }
 
-//        // 闈犺繎鎽嗘斁瑙勫垯 --- 绌烘墭  //鍒嗙鐗�
-//        if (staDescId == 10 && Utils.BooleanWhsTypeStaIoType(whsType)) {
-//            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow).eq("loc_sts", "O"));
-//            for (LocMast locMast1:locMasts){
-//                if (VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) {
-//                    continue;
-//                }
-//                String shallowLoc = Utils.getDeepLoc(slaveProperties,locMast1.getLocNo());
-//                LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",shallowLoc));
-//                if (!Cools.isEmpty(locMast2) && locMast2.getLocSts().equals("D")){
-//                    locMast = locMast1;
-//                    break;
-//                }
-//            }
-//        }
 
         // 闈犺繎鎽嗘斁瑙勫垯 --- 绌烘墭 //浜掗�氱増
         if (staDescId == 10 && Utils.BooleanWhsTypeStaIoType(rowLastno)) {
diff --git a/src/main/java/com/zy/system/controller/LicenseCreatorController.java b/src/main/java/com/zy/system/controller/LicenseCreatorController.java
index 6d0c904..13e2b1c 100644
--- a/src/main/java/com/zy/system/controller/LicenseCreatorController.java
+++ b/src/main/java/com/zy/system/controller/LicenseCreatorController.java
@@ -4,7 +4,6 @@
 import com.core.common.R;
 import com.zy.system.entity.license.*;
 import com.zy.system.timer.LicenseTimer;
-import de.schlichtherle.license.LicenseContent;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.MediaType;
@@ -15,7 +14,6 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.util.Date;
 
 /**
  *
@@ -27,7 +25,6 @@
 
     @Value("${license.licensePath}")
     private String licensePath;
-
     @Autowired
     private LicenseCheckListener licenseCheckListener;
     @Autowired
@@ -50,7 +47,7 @@
         if (osName.startsWith("windows")) {
             abstractServerInfos = new WindowsServerInfos();
         } else if (osName.startsWith("linux")) {
-//            abstractServerInfos = new LinuxServerInfos();
+            abstractServerInfos = new LinuxServerInfos();
         }else{//鍏朵粬鏈嶅姟鍣ㄧ被鍨�
             abstractServerInfos = new WindowsServerInfos();
         }
@@ -99,4 +96,10 @@
         return R.error("璁稿彲璇佹洿鏂板け璐�");
     }
 
+    @RequestMapping(value = "/activate")
+    public R activate() {
+        licenseTimer.timer();
+        return R.ok();
+    }
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/zy/system/entity/LicenseInfos.java b/src/main/java/com/zy/system/entity/LicenseInfos.java
new file mode 100644
index 0000000..dafec6d
--- /dev/null
+++ b/src/main/java/com/zy/system/entity/LicenseInfos.java
@@ -0,0 +1,56 @@
+package com.zy.system.entity;
+
+import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableField;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+@Data
+@TableName("sys_license_infos")
+public class LicenseInfos implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value= "")
+    private String license;
+
+    @ApiModelProperty(value= "")
+    private String licenseTime;
+
+    @ApiModelProperty(value= "")
+    @TableField("create_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    public LicenseInfos() {}
+
+    public LicenseInfos(String license,Date createTime) {
+        this.license = license;
+        this.createTime = createTime;
+    }
+
+//    LicenseInfos licenseInfos = new LicenseInfos(
+//            null,    // 
+//            null    // 
+//    );
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+
+}
diff --git a/src/main/java/com/zy/system/entity/license/AbstractServerInfos.java b/src/main/java/com/zy/system/entity/license/AbstractServerInfos.java
index f771d16..cb413ae 100644
--- a/src/main/java/com/zy/system/entity/license/AbstractServerInfos.java
+++ b/src/main/java/com/zy/system/entity/license/AbstractServerInfos.java
@@ -23,7 +23,7 @@
         LicenseCheck result = new LicenseCheck();
 
         try {
-            result.setIpAddress(this.getIpAddress());
+//            result.setIpAddress(this.getIpAddress());
             result.setMacAddress(this.getMacAddress());
             result.setCpuSerial(this.getCPUSerial());
             result.setMainBoardSerial(this.getMainBoardSerial());
diff --git a/src/main/java/com/zy/system/entity/license/CustomLicenseManager.java b/src/main/java/com/zy/system/entity/license/CustomLicenseManager.java
index 1ad2cc1..9a7fc6d 100644
--- a/src/main/java/com/zy/system/entity/license/CustomLicenseManager.java
+++ b/src/main/java/com/zy/system/entity/license/CustomLicenseManager.java
@@ -194,7 +194,7 @@
         if (osName.startsWith("windows")) {
             abstractServerInfos = new WindowsServerInfos();
         } else if (osName.startsWith("linux")) {
-//            abstractServerInfos = new LinuxServerInfos();
+            abstractServerInfos = new LinuxServerInfos();
         }else{//鍏朵粬鏈嶅姟鍣ㄧ被鍨�
             abstractServerInfos = new WindowsServerInfos();
         }
diff --git a/src/main/java/com/zy/system/entity/license/LicenseCheckListener.java b/src/main/java/com/zy/system/entity/license/LicenseCheckListener.java
index b3249d7..643ce23 100644
--- a/src/main/java/com/zy/system/entity/license/LicenseCheckListener.java
+++ b/src/main/java/com/zy/system/entity/license/LicenseCheckListener.java
@@ -1,6 +1,8 @@
 package com.zy.system.entity.license;
 
 import com.core.common.Cools;
+import com.zy.system.entity.LicenseInfos;
+import com.zy.system.service.LicenseInfosService;
 import com.zy.system.timer.LicenseTimer;
 import de.schlichtherle.license.LicenseContent;
 import org.apache.logging.log4j.LogManager;
@@ -53,6 +55,8 @@
     private String publicKeysStorePath;
     @Autowired
     private LicenseTimer licenseTimer;
+    @Autowired
+    private LicenseInfosService licenseInfosService;
 
     @Override
     public void onApplicationEvent(ContextRefreshedEvent event) {
@@ -69,12 +73,11 @@
             logger.info("++++++++ 寮�濮嬪姞杞借鍙瘉 ++++++++");
 
             try {
-//                String publicKeysStoreFileName = this.getClass().getClassLoader().getResource(publicKeysStorePath).getPath();
-//                File publicKeysStoreFile = new File(publicKeysStoreFileName);
-//
-//                String licensePathFileName = this.getClass().getClassLoader().getResource(licensePath).getPath();
-//                File licensePathFile = new File(licensePathFileName);
+                licenseTimer.getRemoteLicense();
+            } catch (Exception e) {
+            }
 
+            try {
                 LicenseVerifyParam param = new LicenseVerifyParam();
                 param.setSubject(subject);
                 param.setPublicAlias(publicAlias);
@@ -83,8 +86,15 @@
                 param.setPublicKeysStorePath(publicKeysStorePath);
 
                 LicenseVerify licenseVerify = new LicenseVerify();
+
+                LicenseInfos latestLicense = licenseInfosService.getLatestLicense();
+                if (latestLicense == null) {
+                    logger.info("璁稿彲璇佷笉瀛樺湪");
+                    return false;
+                }
+
                 //瀹夎璇佷功
-                LicenseContent install = licenseVerify.install(param);
+                LicenseContent install = licenseVerify.install(param, latestLicense.getLicense());
 
                 logger.info("++++++++ 璁稿彲璇佸姞杞界粨鏉� ++++++++");
 
@@ -103,6 +113,7 @@
 
                 return install != null;
             } catch (Exception e) {
+                e.printStackTrace();
                 return false;
             }
         }
diff --git a/src/main/java/com/zy/system/entity/license/LicenseVerify.java b/src/main/java/com/zy/system/entity/license/LicenseVerify.java
index fd95fca..da239c0 100644
--- a/src/main/java/com/zy/system/entity/license/LicenseVerify.java
+++ b/src/main/java/com/zy/system/entity/license/LicenseVerify.java
@@ -3,14 +3,15 @@
 import de.schlichtherle.license.*;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.apache.tomcat.util.http.fileupload.IOUtils;
 
 import java.io.File;
-import java.io.FileOutputStream;
-import java.io.InputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.text.DateFormat;
 import java.text.MessageFormat;
 import java.text.SimpleDateFormat;
+import java.util.Base64;
 import java.util.prefs.Preferences;
 
 /**
@@ -22,25 +23,21 @@
     /**
      * 瀹夎License璇佷功
      */
-    public synchronized LicenseContent install(LicenseVerifyParam param){
+    public synchronized LicenseContent install(LicenseVerifyParam param, String license) {
         LicenseContent result = null;
         DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
         //1. 瀹夎璇佷功
-        try{
-            LicenseManager licenseManager = LicenseManagerHolder.getInstance(initLicenseParam(param));
+        try {
+            LicenseParam licenseParam = initLicenseParam(param);
+            LicenseManager licenseManager = LicenseManagerHolder.getInstance(licenseParam);
             licenseManager.uninstall();
 
-            InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(param.getLicensePath());
-            File file = new File(param.getLicensePath());
-            try (FileOutputStream out = new FileOutputStream(file)) {
-                IOUtils.copy(inputStream, out);
-            }
-
-            result = licenseManager.install(new File(param.getLicensePath()));
-            logger.info(MessageFormat.format("璁稿彲璇佸姞杞芥垚鍔燂紝璁稿彲璇佹湁鏁堟湡锛歿0} - {1}",format.format(result.getNotBefore()),format.format(result.getNotAfter())));
-        }catch (Exception e){
-            logger.error("璁稿彲璇佸姞杞藉け璐ワ紒",e);
+            File tempFileFromBase64 = createTempFileFromBase64(license);
+            result = licenseManager.install(tempFileFromBase64);
+            logger.info(MessageFormat.format("璁稿彲璇佸姞杞芥垚鍔燂紝璁稿彲璇佹湁鏁堟湡锛歿0} - {1}", format.format(result.getNotBefore()), format.format(result.getNotAfter())));
+        } catch (Exception e) {
+            logger.error("璁稿彲璇佸姞杞藉け璐ワ紒", e);
         }
 
         return result;
@@ -53,11 +50,6 @@
         try {
             LicenseManager licenseManager = LicenseManagerHolder.getInstance(null);
             DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
-            if (!updateSystemTime()) {
-                //鏃堕棿鏇存柊澶辫触锛岀郴缁熸椂闂磋鏇存敼
-                return false;
-            }
 
             LicenseContent licenseContent = licenseManager.verify();
             logger.info(MessageFormat.format("璁稿彲璇佹牎楠岄�氳繃锛岃鍙瘉鏈夋晥鏈燂細{0} - {1}",format.format(licenseContent.getNotBefore()),format.format(licenseContent.getNotAfter())));
@@ -73,11 +65,6 @@
      */
     public LicenseContent getVerifyInfo(){
         LicenseManager licenseManager = LicenseManagerHolder.getInstance(null);
-
-        if (!updateSystemTime()) {
-            //鏃堕棿鏇存柊澶辫触锛岀郴缁熸椂闂磋鏇存敼
-            return null;
-        }
 
         //鏍¢獙璇佷功
         try {
@@ -112,31 +99,28 @@
     }
 
     /**
-     * 鏇存柊鏃堕棿鍒版敞鍐岃〃涓�
+     * 灏咮ase64瀛楃涓茶浆鎹负涓存椂鏂囦欢
+     * @param base64String Base64缂栫爜鐨勫瓧绗︿覆
+     * @param filePrefix 鏂囦欢鍚嶅墠缂�锛堜緥濡� "license_"锛�
+     * @param fileSuffix 鏂囦欢鍚庣紑锛堜緥濡� ".lic"锛�
+     * @return 鐢熸垚鐨勪复鏃禙ile瀵硅薄锛堣嚜鍔ㄥ湪JVM閫�鍑烘椂鍒犻櫎锛�
+     * @throws IOException
      */
-    private boolean updateSystemTime() {
-        // 鑾峰彇鐢ㄦ埛鏍硅妭鐐�
-        Preferences userRoot = Preferences.userRoot();
-        // 鑾峰彇鎸囧畾璺緞涓嬬殑鑺傜偣
-        Preferences node = userRoot.node("/zhongyang");
-        String key = "time";
-        // 璇诲彇娉ㄥ唽琛�
-        String value = node.get(key, null);
-        if (value != null) {
-            long originTime = Long.parseLong(value);
-            long now = System.currentTimeMillis();
-            long diff = now - originTime;//鐜板湪鏃堕棿 - 婧愭椂闂� = 鏃堕棿宸�
-            if (diff > 0) {
-                //鏃堕棿宸ぇ浜�0鎵嶅厑璁告洿鏂版敞鍐岃〃鏃堕棿
-                node.put(key, String.valueOf(System.currentTimeMillis()));
-                return true;
-            }
-        }else {
-            // 鍐欏叆娉ㄥ唽琛�
-            node.put(key, String.valueOf(System.currentTimeMillis()));
-            return true;
-        }
-        return false;
+    public File base64ToTempFile(String base64String, String filePrefix, String fileSuffix)
+            throws IOException {
+        // 瑙g爜Base64
+        byte[] decodedBytes = Base64.getDecoder().decode(base64String);
+        // 鍒涘缓涓存椂鏂囦欢
+        Path tempPath = Files.createTempFile(filePrefix, fileSuffix);
+        // 鍐欏叆鍐呭
+        Files.write(tempPath, decodedBytes);
+        // 璁剧疆JVM閫�鍑烘椂鑷姩鍒犻櫎
+        tempPath.toFile().deleteOnExit();
+        return tempPath.toFile();
+    }
+
+    public File createTempFileFromBase64(String base64Data) throws IOException {
+        return base64ToTempFile(base64Data, "temp_license_", ".bin");
     }
 
 }
\ No newline at end of file
diff --git a/src/main/java/com/zy/system/entity/license/LinuxServerInfos.java b/src/main/java/com/zy/system/entity/license/LinuxServerInfos.java
new file mode 100644
index 0000000..0f40daf
--- /dev/null
+++ b/src/main/java/com/zy/system/entity/license/LinuxServerInfos.java
@@ -0,0 +1,91 @@
+package com.zy.system.entity.license;
+
+import com.core.common.Cools;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.InetAddress;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 鐢ㄤ簬鑾峰彇瀹㈡埛Linux鏈嶅姟鍣ㄧ殑鍩烘湰淇℃伅
+ */
+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()));
+
+        if (null == reader.readLine()) {
+            return serialNumber;
+        }
+        String line = reader.readLine().trim();
+        if (!Cools.isEmpty(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()));
+        if (null == reader.readLine()) {
+            return serialNumber;
+        }
+        String line = reader.readLine().trim();
+        if (!Cools.isEmpty(line)) {
+            serialNumber = line;
+        }
+
+        reader.close();
+        return serialNumber;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/system/mapper/LicenseInfosMapper.java b/src/main/java/com/zy/system/mapper/LicenseInfosMapper.java
new file mode 100644
index 0000000..2e51ff1
--- /dev/null
+++ b/src/main/java/com/zy/system/mapper/LicenseInfosMapper.java
@@ -0,0 +1,14 @@
+package com.zy.system.mapper;
+
+import com.zy.system.entity.LicenseInfos;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface LicenseInfosMapper extends BaseMapper<LicenseInfos> {
+
+    LicenseInfos getLatestLicense();
+
+}
diff --git a/src/main/java/com/zy/system/service/LicenseInfosService.java b/src/main/java/com/zy/system/service/LicenseInfosService.java
new file mode 100644
index 0000000..dc3dc04
--- /dev/null
+++ b/src/main/java/com/zy/system/service/LicenseInfosService.java
@@ -0,0 +1,10 @@
+package com.zy.system.service;
+
+import com.zy.system.entity.LicenseInfos;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface LicenseInfosService extends IService<LicenseInfos> {
+
+    LicenseInfos getLatestLicense();
+
+}
diff --git a/src/main/java/com/zy/system/service/impl/LicenseInfosServiceImpl.java b/src/main/java/com/zy/system/service/impl/LicenseInfosServiceImpl.java
new file mode 100644
index 0000000..2a6b9b3
--- /dev/null
+++ b/src/main/java/com/zy/system/service/impl/LicenseInfosServiceImpl.java
@@ -0,0 +1,16 @@
+package com.zy.system.service.impl;
+
+import com.zy.system.mapper.LicenseInfosMapper;
+import com.zy.system.entity.LicenseInfos;
+import com.zy.system.service.LicenseInfosService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("licenseInfosService")
+public class LicenseInfosServiceImpl extends ServiceImpl<LicenseInfosMapper, LicenseInfos> implements LicenseInfosService {
+
+    @Override
+    public LicenseInfos getLatestLicense() {
+        return this.baseMapper.getLatestLicense();
+    }
+}
diff --git a/src/main/java/com/zy/system/timer/LicenseTimer.java b/src/main/java/com/zy/system/timer/LicenseTimer.java
index a56a24c..985ace4 100644
--- a/src/main/java/com/zy/system/timer/LicenseTimer.java
+++ b/src/main/java/com/zy/system/timer/LicenseTimer.java
@@ -1,8 +1,20 @@
 package com.zy.system.timer;
 
-import com.zy.system.entity.license.LicenseVerify;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.core.common.Cools;
+import com.zy.common.utils.HttpHandler;
+import com.zy.system.entity.LicenseInfos;
+import com.zy.system.entity.license.*;
+import com.zy.system.service.LicenseInfosService;
+import de.schlichtherle.license.LicenseContent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.HashMap;
 
 @Component
 public class LicenseTimer {
@@ -11,14 +23,125 @@
 
     private static int LICENSE_DAYS = 0;//璁稿彲璇佸ぉ鏁�
 
+    /**
+     * 璇佷功subject
+     */
+    @Value("${license.subject}")
+    private String subject;
+
+    /**
+     * 鍏挜鍒О
+     */
+    @Value("${license.publicAlias}")
+    private String publicAlias;
+
+    /**
+     * 璁块棶鍏挜搴撶殑瀵嗙爜
+     */
+    @Value("${license.storePass}")
+    private String storePass;
+
+    /**
+     * 璇佷功鐢熸垚璺緞
+     */
+    @Value("${license.licensePath}")
+    private String licensePath;
+
+    /**
+     * 瀵嗛挜搴撳瓨鍌ㄨ矾寰�
+     */
+    @Value("${license.publicKeysStorePath}")
+    private String publicKeysStorePath;
+
+    @Autowired
+    private LicenseInfosService licenseInfosService;
+
     //姣忓ぉ鏅氫笂11鐐规洿鏂扮郴缁熸縺娲荤姸鎬�
     @Scheduled(cron = "0 0 23 * * ? ")
     public void timer() {
-//        System.out.println(SYSTEM_SUPPORT);
+        try {
+            getRemoteLicense();
+        } catch (Exception e) {
+
+        }
+
+        try {
+            verify();
+        } catch (Exception e) {
+
+        }
+    }
+
+    public void getRemoteLicense() {
+        try {
+            AbstractServerInfos abstractServerInfos = null;
+            String osName = System.getProperty("os.name");
+            //鏍规嵁涓嶅悓鎿嶄綔绯荤粺绫诲瀷閫夋嫨涓嶅悓鐨勬暟鎹幏鍙栨柟娉�
+            if (osName.startsWith("windows")) {
+                abstractServerInfos = new WindowsServerInfos();
+            } else if (osName.startsWith("linux")) {
+                abstractServerInfos = new LinuxServerInfos();
+            }else{//鍏朵粬鏈嶅姟鍣ㄧ被鍨�
+                abstractServerInfos = new WindowsServerInfos();
+            }
+            LicenseCheck serverInfos = abstractServerInfos.getServerInfos();
+
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("subject", subject);
+            map.put("licenseCheck", serverInfos);
+
+            String response = new HttpHandler.Builder()
+                    .setUri("http://net.zoneyung.net:9999/license")
+                    .setPath("/remoteQueryLicense")
+                    .setJson(JSON.toJSONString(map))
+                    .build()
+                    .doPost();
+            JSONObject jsonObject = JSON.parseObject(response);
+            if (jsonObject.getString("result").equals("ok")) {
+                LicenseInfos licenseInfos = new LicenseInfos();
+                licenseInfos.setLicense(jsonObject.getString("data"));
+                licenseInfos.setCreateTime(new Date());
+                licenseInfos.setLicenseTime(jsonObject.getString("licenseTime"));
+                licenseInfosService.insert(licenseInfos);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void verify() {
+        LicenseInfos latestLicense = licenseInfosService.getLatestLicense();
+        if (latestLicense == null) {
+            setLicenseDays(0);
+            setSystemSupport(false);
+            return;
+        }
+
+        LicenseVerifyParam param = new LicenseVerifyParam();
+        param.setSubject(subject);
+        param.setPublicAlias(publicAlias);
+        param.setStorePass(storePass);
+        param.setLicensePath(licensePath);
+        param.setPublicKeysStorePath(publicKeysStorePath);
+
         //楠岃瘉璁稿彲璇佹槸鍚︽湁鏁�
         LicenseVerify licenseVerify = new LicenseVerify();
-        boolean verify = licenseVerify.verify();
-        setSystemSupport(verify);//鏇存柊绯荤粺婵�娲荤姸鎬�
+        //瀹夎璇佷功
+        LicenseContent install = licenseVerify.install(param, latestLicense.getLicense());
+
+        if (install != null) {
+            Date start = new Date();
+            Date end = install.getNotAfter();
+            Long starTime = start.getTime();
+            Long endTime = end.getTime();
+            long num = endTime - starTime;//鏃堕棿鎴崇浉宸殑姣鏁�
+            int day = (int) (num / 24 / 60 / 60 / 1000);
+            setLicenseDays(day);
+            setSystemSupport(true);
+        }else {
+            setLicenseDays(0);
+            setSystemSupport(false);
+        }
     }
 
     public boolean getSystemSupport() {
diff --git a/src/main/resources/mapper/LicenseInfosMapper.xml b/src/main/resources/mapper/LicenseInfosMapper.xml
new file mode 100644
index 0000000..6274069
--- /dev/null
+++ b/src/main/resources/mapper/LicenseInfosMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.system.mapper.LicenseInfosMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.system.entity.LicenseInfos">
+        <id column="id" property="id" />
+        <result column="license" property="license" />
+        <result column="license_time" property="licenseTime" />
+        <result column="create_time" property="createTime" />
+
+    </resultMap>
+
+    <select id="getLatestLicense" resultMap="BaseResultMap">
+        select top 1 * from sys_license_infos order by create_time desc
+    </select>
+
+</mapper>
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index bf617ad..834ff6c 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -42,7 +42,7 @@
     </ul>
     <ul class="layui-nav layui-layout-right">
       <li class="layui-nav-item" lay-unselect id="licenseShow" style="display: none;user-select: none;">
-        <div style="color: red;">璁稿彲璇佹湁鏁堟湡锛�<span id="licenseDays">29</span>澶�</div>
+        <div style="color: red;">涓存椂璁稿彲璇佹湁鏁堟湡锛�<span id="licenseDays">29</span>澶�</div>
       </li>
       <li class="layui-nav-item layui-hide-xs" lay-unselect>
         <a ew-event="fullScreen" title="鍏ㄥ睆"><i class="layui-icon layui-icon-screen-full"></i></a>
@@ -150,6 +150,7 @@
           if (days <= 30) {
             $("#licenseShow").show()
             $("#licenseDays").html(days)
+            alert("涓存椂璁稿彲鏈夋晥鏈燂細" + days + "澶�")
           }
         }else {
           top.location.href = baseUrl + "/login";

--
Gitblit v1.9.1