From d7d99af35f7a304bba700ca7cb8a3330237cc8ea Mon Sep 17 00:00:00 2001 From: Junjie <540245094@qq.com> Date: 星期一, 04 八月 2025 15:44:26 +0800 Subject: [PATCH] # --- src/main/java/com/zy/system/controller/LicenseCreatorController.java | 37 +-- src/main/java/com/zy/system/entity/license/LicenseCheckListener.java | 44 +++ src/main/java/com/zy/system/entity/LicenseInfos.java | 56 +++++ src/main/java/com/zy/system/entity/license/CustomLicenseManager.java | 13 src/main/java/com/zy/system/entity/license/LicenseVerify.java | 83 +++---- 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/java/com/zy/common/web/AuthController.java | 7 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 | 163 ++++++++++++++++ src/main/java/com/zy/system/service/impl/LicenseInfosServiceImpl.java | 16 + 14 files changed, 460 insertions(+), 97 deletions(-) diff --git a/src/main/java/com/zy/common/web/AuthController.java b/src/main/java/com/zy/common/web/AuthController.java index ba50e08..a91fa14 100644 --- a/src/main/java/com/zy/common/web/AuthController.java +++ b/src/main/java/com/zy/common/web/AuthController.java @@ -16,6 +16,7 @@ import com.zy.system.entity.*; import com.zy.system.entity.license.LicenseVerify; import com.zy.system.service.*; +import com.zy.system.timer.LicenseTimer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.transaction.annotation.Transactional; @@ -46,14 +47,14 @@ private PermissionService permissionService; @Autowired private RolePermissionService rolePermissionService; + @Autowired + private LicenseTimer licenseTimer; @RequestMapping("/login.action") @ManagerAuth(value = ManagerAuth.Auth.NONE, memo = "鐧诲綍") public R loginAction(String username, String password){ //楠岃瘉璁稿彲璇佹槸鍚︽湁鏁� - LicenseVerify licenseVerify = new LicenseVerify(); - boolean verify = licenseVerify.verify(); - if (!verify) {//璁稿彲璇佸凡澶辨晥 + if (!licenseTimer.getSystemSupport()) {//璁稿彲璇佸凡澶辨晥 return R.parse(CodeRes.SYSTEM_20001); } if (username.equals("super") && password.equals(Cools.md5(superPwd))) { diff --git a/src/main/java/com/zy/system/controller/LicenseCreatorController.java b/src/main/java/com/zy/system/controller/LicenseCreatorController.java index b8862a7..13e2b1c 100644 --- a/src/main/java/com/zy/system/controller/LicenseCreatorController.java +++ b/src/main/java/com/zy/system/controller/LicenseCreatorController.java @@ -1,15 +1,12 @@ package com.zy.system.controller; -import com.core.annotations.ManagerAuth; 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; -import org.springframework.util.ClassUtils; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -17,12 +14,6 @@ import java.io.File; import java.io.IOException; -import java.text.SimpleDateFormat; -import java.time.temporal.ChronoUnit; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.prefs.Preferences; /** * @@ -34,10 +25,10 @@ @Value("${license.licensePath}") private String licensePath; - @Autowired private LicenseCheckListener licenseCheckListener; - + @Autowired + private LicenseTimer licenseTimer; /** * 鑾峰彇鏈嶅姟鍣ㄧ‖浠朵俊鎭� * @param osName 鎿嶄綔绯荤粺绫诲瀷锛屽鏋滀负绌哄垯鑷姩鍒ゆ柇 @@ -56,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(); } @@ -69,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") @@ -117,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 0181b33..9a7fc6d 100644 --- a/src/main/java/com/zy/system/entity/license/CustomLicenseManager.java +++ b/src/main/java/com/zy/system/entity/license/CustomLicenseManager.java @@ -1,12 +1,7 @@ package com.zy.system.entity.license; import com.core.common.Cools; -import de.schlichtherle.license.LicenseContent; -import de.schlichtherle.license.LicenseContentException; -import de.schlichtherle.license.LicenseManager; -import de.schlichtherle.license.LicenseNotary; -import de.schlichtherle.license.LicenseParam; -import de.schlichtherle.license.NoLicenseInstalledException; +import de.schlichtherle.license.*; import de.schlichtherle.xml.GenericCertificate; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -134,12 +129,12 @@ if(expectedCheckModel != null && serverCheckModel != null){ //鏍¢獙IP鍦板潃 if(!checkIpAddress(expectedCheckModel.getIpAddress(),serverCheckModel.getIpAddress())){ - //throw new LicenseContentException("褰撳墠鏈嶅姟鍣ㄧ殑IP娌″湪鎺堟潈鑼冨洿鍐�"); + throw new LicenseContentException("褰撳墠鏈嶅姟鍣ㄧ殑IP娌″湪鎺堟潈鑼冨洿鍐�"); } //鏍¢獙Mac鍦板潃 if(!checkIpAddress(expectedCheckModel.getMacAddress(),serverCheckModel.getMacAddress())){ - //throw new LicenseContentException("褰撳墠鏈嶅姟鍣ㄧ殑Mac鍦板潃娌″湪鎺堟潈鑼冨洿鍐�"); + throw new LicenseContentException("褰撳墠鏈嶅姟鍣ㄧ殑Mac鍦板潃娌″湪鎺堟潈鑼冨洿鍐�"); } //鏍¢獙涓绘澘搴忓垪鍙� @@ -199,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 e268997..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,7 +15,7 @@ import org.springframework.stereotype.Component; import java.io.File; -import java.io.InputStream; +import java.util.Date; /** * 鍦ㄩ」鐩惎鍔ㄦ椂瀹夎璇佷功 @@ -49,6 +53,10 @@ */ @Value("${license.publicKeysStorePath}") private String publicKeysStorePath; + @Autowired + private LicenseTimer licenseTimer; + @Autowired + private LicenseInfosService licenseInfosService; @Override public void onApplicationEvent(ContextRefreshedEvent event) { @@ -65,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); @@ -79,17 +86,38 @@ 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 597648a..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.poi.util.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,24 +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(file); - 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; @@ -52,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()))); @@ -72,11 +65,6 @@ */ public LicenseContent getVerifyInfo(){ LicenseManager licenseManager = LicenseManagerHolder.getInstance(null); - - if (!updateSystemTime()) { - //鏃堕棿鏇存柊澶辫触锛岀郴缁熸椂闂磋鏇存敼 - return null; - } //鏍¢獙璇佷功 try { @@ -111,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/views/index.html b/src/main/webapp/views/index.html index 872d1aa..d1fad04 100644 --- a/src/main/webapp/views/index.html +++ b/src/main/webapp/views/index.html @@ -44,7 +44,7 @@ <!-- <a ew-event="note" title="渚跨"><i class="layui-icon layui-icon-note"></i></a>--> <!-- </li>--> <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> @@ -152,6 +152,7 @@ if (days <= 30) { $("#licenseShow").show() $("#licenseDays").html(days) + alert("涓存椂璁稿彲鏈夋晥鏈燂細" + days + "澶�") } }else { top.location.href = baseUrl + "/login"; -- Gitblit v1.9.1