From 5b6e33867d337b6aaeaf91b2fcd1b6e94c07de6c Mon Sep 17 00:00:00 2001
From: dubin <bindu_bean@163.com>
Date: 星期三, 22 十月 2025 11:02:11 +0800
Subject: [PATCH] 许可证2.0
---
src/main/java/com/zy/system/controller/LicenseCreatorController.java | 29 +--
src/main/java/com/zy/system/entity/license/LicenseCheckListener.java | 47 ++++-
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 | 75 +++----
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/static/js/locDetl/locDetl.js | 2
src/main/java/com/zy/system/entity/license/CustomKeyStoreParam.java | 6
src/main/webapp/views/index.html | 9
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 | 163 ++++++++++++++++++
src/main/java/com/zy/system/service/impl/LicenseInfosServiceImpl.java | 16 +
15 files changed, 463 insertions(+), 77 deletions(-)
diff --git a/src/main/java/com/zy/system/controller/LicenseCreatorController.java b/src/main/java/com/zy/system/controller/LicenseCreatorController.java
index 0aafb3b..13e2b1c 100644
--- a/src/main/java/com/zy/system/controller/LicenseCreatorController.java
+++ b/src/main/java/com/zy/system/controller/LicenseCreatorController.java
@@ -3,7 +3,7 @@
import com.core.common.Cools;
import com.core.common.R;
import com.zy.system.entity.license.*;
-import de.schlichtherle.license.LicenseContent;
+import com.zy.system.timer.LicenseTimer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
@@ -14,7 +14,6 @@
import java.io.File;
import java.io.IOException;
-import java.util.Date;
/**
*
@@ -26,10 +25,10 @@
@Value("${license.licensePath}")
private String licensePath;
-
@Autowired
private LicenseCheckListener licenseCheckListener;
-
+ @Autowired
+ private LicenseTimer licenseTimer;
/**
* 鑾峰彇鏈嶅姟鍣ㄧ‖浠朵俊鎭�
* @param osName 鎿嶄綔绯荤粺绫诲瀷锛屽鏋滀负绌哄垯鑷姩鍒ゆ柇
@@ -48,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();
}
@@ -61,19 +60,7 @@
*/
@RequestMapping(value = "/getLicenseDays")
public R getLicenseDays() {
- LicenseVerify licenseVerify = new LicenseVerify();
- LicenseContent verifyInfo = licenseVerify.getVerifyInfo();
- if (verifyInfo == null) {
- return R.error();
- }
-
- Date start = new Date();
- Date end = verifyInfo.getNotAfter();
- Long starTime = start.getTime();
- Long endTime = end.getTime();
- Long num = endTime - starTime;//鏃堕棿鎴崇浉宸殑姣鏁�
- int day = (int) (num / 24 / 60 / 60 / 1000);
- return R.ok().add(day);
+ return R.ok(licenseTimer.getLicenseDays());
}
@RequestMapping(value = "/updateLicense")
@@ -109,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/CustomKeyStoreParam.java b/src/main/java/com/zy/system/entity/license/CustomKeyStoreParam.java
index 3d4e4b9..f1cab8b 100644
--- a/src/main/java/com/zy/system/entity/license/CustomKeyStoreParam.java
+++ b/src/main/java/com/zy/system/entity/license/CustomKeyStoreParam.java
@@ -2,7 +2,9 @@
import de.schlichtherle.license.AbstractKeyStoreParam;
-import java.io.*;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
/**
* 鑷畾涔塊eyStoreParam锛岀敤浜庡皢鍏閽ュ瓨鍌ㄦ枃浠跺瓨鏀惧埌鍏朵粬纾佺洏浣嶇疆鑰屼笉鏄」鐩腑
@@ -47,7 +49,7 @@
*/
@Override
public InputStream getStream() throws IOException {
- final InputStream in = new FileInputStream(new File(storePath));
+ final InputStream in = this.getClass().getClassLoader().getResourceAsStream(storePath);
if (null == in) {
throw new FileNotFoundException(storePath);
}
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 1659df2..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,9 +1,13 @@
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;
import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
@@ -11,6 +15,7 @@
import org.springframework.stereotype.Component;
import java.io.File;
+import java.util.Date;
/**
* 鍦ㄩ」鐩惎鍔ㄦ椂瀹夎璇佷功
@@ -48,6 +53,10 @@
*/
@Value("${license.publicKeysStorePath}")
private String publicKeysStorePath;
+ @Autowired
+ private LicenseTimer licenseTimer;
+ @Autowired
+ private LicenseInfosService licenseInfosService;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
@@ -64,31 +73,51 @@
logger.info("++++++++ 寮�濮嬪姞杞借鍙瘉 ++++++++");
try {
- String publicKeysStoreFileName = this.getClass().getClassLoader().getResource(publicKeysStorePath).getPath();
- File publicKeysStoreFile = new File(publicKeysStoreFileName);
+ licenseTimer.getRemoteLicense();
+ } catch (Exception e) {
+ }
- String licensePathFileName = this.getClass().getClassLoader().getResource(licensePath).getPath();
- File licensePathFile = new File(licensePathFileName);
-
+ try {
LicenseVerifyParam param = new LicenseVerifyParam();
param.setSubject(subject);
param.setPublicAlias(publicAlias);
param.setStorePass(storePass);
- param.setLicensePath(licensePathFile.getPath());
- param.setPublicKeysStorePath(publicKeysStoreFile.getPath());
+ param.setLicensePath(licensePath);
+ 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("++++++++ 璁稿彲璇佸姞杞界粨鏉� ++++++++");
+ licenseTimer.setSystemSupport(install!=null);
+
+ 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);
+ licenseTimer.setLicenseDays(day);
+ }
+
+
return install != null;
} catch (Exception e) {
+ e.printStackTrace();
return false;
}
}
-
+ licenseTimer.setSystemSupport(false);
return false;
}
}
\ No newline at end of file
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 2175930..da239c0 100644
--- a/src/main/java/com/zy/system/entity/license/LicenseVerify.java
+++ b/src/main/java/com/zy/system/entity/license/LicenseVerify.java
@@ -5,9 +5,13 @@
import org.apache.logging.log4j.Logger;
import java.io.File;
+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;
/**
@@ -19,19 +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();
- 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;
@@ -44,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())));
@@ -64,11 +65,6 @@
*/
public LicenseContent getVerifyInfo(){
LicenseManager licenseManager = LicenseManagerHolder.getInstance(null);
-
- if (!updateSystemTime()) {
- //鏃堕棿鏇存柊澶辫触锛岀郴缁熸椂闂磋鏇存敼
- return null;
- }
//鏍¢獙璇佷功
try {
@@ -103,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
new file mode 100644
index 0000000..985ace4
--- /dev/null
+++ b/src/main/java/com/zy/system/timer/LicenseTimer.java
@@ -0,0 +1,163 @@
+package com.zy.system.timer;
+
+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 {
+
+ private static boolean SYSTEM_SUPPORT = false;//绯荤粺婵�娲荤姸鎬侊紝榛樿鍏抽棴
+
+ 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() {
+ 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();
+ //瀹夎璇佷功
+ 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() {
+ return SYSTEM_SUPPORT;
+ }
+
+ public void setSystemSupport(boolean systemSupport) {
+ SYSTEM_SUPPORT = systemSupport;
+ }
+
+ public int getLicenseDays() {
+ return LICENSE_DAYS;
+ }
+
+ public void setLicenseDays(int licenseDays) {
+ LICENSE_DAYS = licenseDays;
+ }
+
+}
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/static/js/locDetl/locDetl.js b/src/main/webapp/static/js/locDetl/locDetl.js
index d46cb7c..e54a513 100644
--- a/src/main/webapp/static/js/locDetl/locDetl.js
+++ b/src/main/webapp/static/js/locDetl/locDetl.js
@@ -17,7 +17,7 @@
,{field: 'brand', align: 'center',title: '鍝佺墝', hide: true}
,{field: 'unit', align: 'center',title: '鍗曚綅', hide: true}
,{field: 'price', align: 'center',title: '鍗曚环', hide: true}
- ,{field: 'sku', align: 'center',title: '绠�鍥�', hide: false}
+ ,{field: 'sku', align: 'center',title: '绠�鍥�', hide: true}
,{field: 'units', align: 'center',title: '鍗曚綅閲�', hide: true}
,{field: 'barcode', align: 'center',title: '鏉$爜', hide: true}
,{field: 'origin', align: 'center',title: '浜у湴', hide: true}
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index 8118450..834ff6c 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -8,7 +8,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="icon" type="image/x-icon" href="../static/image/favicon.ico" />
<link rel="stylesheet" href="../static/layui/css/layui.css" media="all">
- <link rel="stylesheet" href="../static/css/admin.css?v=319" media="all">
+ <link rel="stylesheet" href="../static/css/admin.css?v=318" media="all">
<link rel="stylesheet" href="../static/css/loader.css" media="all">
<style>
.layui-logo img {
@@ -24,9 +24,9 @@
<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
<!-- 澶撮儴 -->
- <div class="layui-header" style=" height: 80px;">
+ <div class="layui-header">
<div class="layui-logo">
- <img src="../static/image/logo.png" style="display: inline-block; width: 95%;height: auto">
+ <img src="../static/image/zy_logo_dark_color.png" style="display: inline-block; width: 40%;height: auto">
<!-- <span style="margin-top: 0; letter-spacing: 10px">涓壃绔嬪簱</span>-->
<!-- <img src="../static/image/logo.svg"/>-->
<!-- <cite>涓壃 - Zoneyung</cite>-->
@@ -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