From 87a210ddccd104cae61d4608825c9702db870ecc Mon Sep 17 00:00:00 2001 From: panyehong <2655992392@qq.com> Date: Mon, 22 Sep 2025 10:59:51 +0800 Subject: [PATCH 1/6] =?UTF-8?q?[feat]Terrabase=E6=A1=86?= =?UTF-8?q?=E6=9E=B6=E5=88=9D=E6=AD=A5=E5=AE=9E=E7=8E=B0=EF=BC=8C=E5=8A=A0?= =?UTF-8?q?=E8=A7=A3=E5=AF=86=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business-app/pom.xml | 25 +- .../business/BusinessApplication.java | 84 +++ .../business/config/EnterpriseConfig.java | 27 + .../controller/EnterpriseController.java | 233 ++++++++ .../terrabase/business/util/JarLoadUtil.java | 286 ++++++++++ .../src/main/resources/application.properties | 40 ++ .../enterprise/api/CryptoAlgorithm.java | 139 +++++ .../enterprise/api/EnterpriseService.java | 69 +++ enterprise-impl-commercial/pom.xml | 12 - .../CommercialEnterpriseServiceImpl.java | 159 ++++++ enterprise-impl-open/pom.xml | 38 ++ .../impl/open/OpenEnterpriseServiceImpl.java | 156 ++++++ .../impl/open/config/KmcConfig.java | 186 +++++++ .../impl/open/util/KmcCryptoUtil.java | 504 ++++++++++++++++++ .../impl/open/KmcCryptoUtilTest.java | 254 +++++++++ .../OpenEnterpriseServiceImplKmcTest.java | 418 +++++++++++++++ .../impl/open/TestConfiguration.java | 28 + pom.xml | 85 ++- 18 files changed, 2704 insertions(+), 39 deletions(-) create mode 100644 business-app/src/main/java/com/terrabase/business/BusinessApplication.java create mode 100644 business-app/src/main/java/com/terrabase/business/config/EnterpriseConfig.java create mode 100644 business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java create mode 100644 business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java create mode 100644 business-app/src/main/resources/application.properties create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/CryptoAlgorithm.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java create mode 100644 enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java create mode 100644 enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/config/KmcConfig.java create mode 100644 enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/util/KmcCryptoUtil.java create mode 100644 enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/KmcCryptoUtilTest.java create mode 100644 enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java create mode 100644 enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/TestConfiguration.java diff --git a/business-app/pom.xml b/business-app/pom.xml index 13bb97e..a74d412 100644 --- a/business-app/pom.xml +++ b/business-app/pom.xml @@ -30,18 +30,6 @@ spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - - org.springframework.boot - spring-boot-starter-security - - org.springframework.boot @@ -55,11 +43,11 @@ ${project.version} - + - mysql - mysql-connector-java - runtime + com.terrabase + enterprise-impl-open + ${project.version} @@ -69,11 +57,6 @@ test - - org.springframework.security - spring-security-test - test - diff --git a/business-app/src/main/java/com/terrabase/business/BusinessApplication.java b/business-app/src/main/java/com/terrabase/business/BusinessApplication.java new file mode 100644 index 0000000..fab5c51 --- /dev/null +++ b/business-app/src/main/java/com/terrabase/business/BusinessApplication.java @@ -0,0 +1,84 @@ +package com.terrabase.business; + +import com.terrabase.business.util.JarLoadUtil; +import com.terrabase.enterprise.api.EnterpriseService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +/** + * Terrabase 业务应用主启动类 + * 基于Spring Boot框架,支持动态加载企业服务实现 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@SpringBootApplication +public class BusinessApplication { + + private static final Logger logger = LoggerFactory.getLogger(BusinessApplication.class); + + @Autowired + private JarLoadUtil jarLoadUtil; + + // 动态加载企业服务 - 延迟初始化 + private EnterpriseService enterpriseService; + + public static void main(String[] args) { + logger.info("正在启动 Terrabase 业务应用..."); + SpringApplication.run(BusinessApplication.class, args); + } + + /** + * 应用启动后执行初始化逻辑 + */ + @Bean + public CommandLineRunner init() { + return args -> { + logger.info("=== Terrabase 业务应用初始化开始 ==="); + + try { + // 延迟加载企业服务 + if (enterpriseService == null) { + logger.info("正在加载企业服务..."); + enterpriseService = jarLoadUtil.loadEnterpriseService(); + } + + if (enterpriseService != null) { + logger.info("企业服务加载成功:"); + logger.info(" 服务名称: {}", enterpriseService.getServiceName()); + logger.info(" 服务版本: {}", enterpriseService.getServiceVersion()); + logger.info(" 服务类型: {}", enterpriseService.getServiceType()); + + // 启动企业服务 + logger.info("正在启动企业服务..."); + enterpriseService.start(); + + // 检查服务是否成功启动 + if (enterpriseService.isRunning()) { + logger.info("企业服务启动成功"); + } else { + logger.warn("企业服务启动失败"); + } + + // 获取健康状态 + String healthStatus = enterpriseService.getHealthStatus(); + logger.info("企业服务健康状态: {}", healthStatus); + } else { + logger.error("企业服务加载失败,应用可能无法正常工作"); + } + + } catch (Exception e) { + logger.error("应用初始化过程中发生错误", e); + // 不抛出异常,让应用继续启动 + logger.warn("应用将在没有企业服务的情况下继续运行"); + } + + logger.info("=== Terrabase 业务应用初始化完成 ==="); + }; + } +} diff --git a/business-app/src/main/java/com/terrabase/business/config/EnterpriseConfig.java b/business-app/src/main/java/com/terrabase/business/config/EnterpriseConfig.java new file mode 100644 index 0000000..75b7dea --- /dev/null +++ b/business-app/src/main/java/com/terrabase/business/config/EnterpriseConfig.java @@ -0,0 +1,27 @@ +package com.terrabase.business.config; + +import com.terrabase.enterprise.impl.open.config.KmcConfig; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 企业服务配置类 + * 管理企业服务相关的Bean配置 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Configuration +public class EnterpriseConfig { + + /** + * 创建KmcConfig Bean,确保Spring容器中有这个配置 + * 使用@ConfigurationProperties自动绑定配置文件中的属性 + */ + @Bean + @ConfigurationProperties(prefix = "terrabase.kmc") + public KmcConfig kmcConfig() { + return new KmcConfig(); + } +} diff --git a/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java b/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java new file mode 100644 index 0000000..049a398 --- /dev/null +++ b/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java @@ -0,0 +1,233 @@ +package com.terrabase.business.controller; + +import com.terrabase.business.util.JarLoadUtil; +import com.terrabase.enterprise.api.EnterpriseService; +import com.terrabase.enterprise.api.CryptoAlgorithm; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * 企业服务控制器 + * 提供REST API接口来演示动态加载的企业服务功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@RestController +@RequestMapping("/api/enterprise") +@CrossOrigin(origins = "*") +public class EnterpriseController { + + private static final Logger logger = LoggerFactory.getLogger(EnterpriseController.class); + + @Autowired + private JarLoadUtil jarLoadUtil; + + /** + * 获取企业服务信息 + */ + @GetMapping("/info") + public ResponseEntity> getServiceInfo() { + try { + EnterpriseService service = jarLoadUtil.loadEnterpriseService(); + + Map info = new HashMap<>(); + info.put("serviceName", service.getServiceName()); + info.put("serviceVersion", service.getServiceVersion()); + info.put("serviceType", service.getServiceType()); + info.put("enterpriseMode", jarLoadUtil.getEnterpriseMode()); + info.put("healthStatus", service.getHealthStatus()); + + return ResponseEntity.ok(info); + + } catch (Exception e) { + logger.error("获取企业服务信息失败", e); + Map error = new HashMap<>(); + error.put("error", "获取企业服务信息失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取健康状态 + */ + @GetMapping("/health") + public ResponseEntity> getHealthStatus() { + try { + EnterpriseService service = jarLoadUtil.loadEnterpriseService(); + + Map health = new HashMap<>(); + health.put("status", "UP"); + health.put("serviceName", service.getServiceName()); + health.put("serviceType", service.getServiceType()); + health.put("healthStatus", service.getHealthStatus()); + health.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(health); + + } catch (Exception e) { + logger.error("获取健康状态失败", e); + Map error = new HashMap<>(); + error.put("status", "DOWN"); + error.put("error", "获取健康状态失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 重新加载企业服务 + */ + @PostMapping("/reload") + public ResponseEntity> reloadService() { + try { + logger.info("开始重新加载企业服务..."); + + // 清理缓存 + jarLoadUtil.clearCache(); + + // 重新加载服务 + EnterpriseService service = jarLoadUtil.loadEnterpriseService(); + service.start(); + + Map response = new HashMap<>(); + response.put("message", "企业服务重新加载成功"); + response.put("serviceName", service.getServiceName()); + response.put("serviceType", service.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("重新加载企业服务失败", e); + Map error = new HashMap<>(); + error.put("error", "重新加载企业服务失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取当前配置 + */ + @GetMapping("/config") + public ResponseEntity> getConfig() { + try { + Map config = new HashMap<>(); + config.put("enterpriseMode", jarLoadUtil.getEnterpriseMode()); + config.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(config); + + } catch (Exception e) { + logger.error("获取配置信息失败", e); + Map error = new HashMap<>(); + error.put("error", "获取配置信息失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 数据加密接口 + */ + @PostMapping("/encrypt") + public ResponseEntity> encrypt(@RequestBody Map request) { + try { + String plaintext = request.get("plaintext"); + String algorithmName = request.get("algorithm"); + + if (plaintext == null || plaintext.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "明文数据不能为空"); + return ResponseEntity.badRequest().body(error); + } + + EnterpriseService service = jarLoadUtil.loadEnterpriseService(); + + // 解析算法参数,如果未提供则使用默认AES + CryptoAlgorithm algorithm = CryptoAlgorithm.fromString(algorithmName); + String result = service.encrypt(plaintext, algorithm); + + Map response = new HashMap<>(); + response.put("success", true); + response.put("result", result); + response.put("serviceType", service.getServiceType()); + response.put("algorithm", algorithm.getAlgorithm()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("数据加密失败", e); + Map error = new HashMap<>(); + error.put("success", false); + error.put("error", "数据加密失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 数据解密接口 + */ + @PostMapping("/decrypt") + public ResponseEntity> decrypt(@RequestBody Map request) { + try { + String ciphertext = request.get("ciphertext"); + String algorithmName = request.get("algorithm"); + + if (ciphertext == null || ciphertext.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "密文数据不能为空"); + return ResponseEntity.badRequest().body(error); + } + + EnterpriseService service = jarLoadUtil.loadEnterpriseService(); + + // 解析算法参数,如果未提供则使用默认AES + CryptoAlgorithm algorithm = CryptoAlgorithm.fromString(algorithmName); + String result = service.decrypt(ciphertext, algorithm); + + Map response = new HashMap<>(); + response.put("success", true); + response.put("result", result); + response.put("serviceType", service.getServiceType()); + response.put("algorithm", algorithm.getAlgorithm()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("数据解密失败", e); + Map error = new HashMap<>(); + error.put("success", false); + error.put("error", "数据解密失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取支持的加密算法列表 + */ + @GetMapping("/algorithms") + public ResponseEntity> getSupportedAlgorithms() { + try { + Map response = new HashMap<>(); + response.put("success", true); + response.put("algorithms", CryptoAlgorithm.values()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("获取支持的加密算法列表失败", e); + Map error = new HashMap<>(); + error.put("success", false); + error.put("error", "获取支持的加密算法列表失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } +} diff --git a/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java b/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java new file mode 100644 index 0000000..66d93d4 --- /dev/null +++ b/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java @@ -0,0 +1,286 @@ +package com.terrabase.business.util; + +import com.terrabase.enterprise.api.EnterpriseService; +import com.terrabase.enterprise.impl.open.OpenEnterpriseServiceImpl; +import com.terrabase.enterprise.impl.open.config.KmcConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.lang.reflect.Constructor; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 企业服务加载工具类 + * 用于根据配置加载商业版(JAR包)或开源版(直接依赖)的企业服务实现 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Component +public class JarLoadUtil { + + private static final Logger logger = LoggerFactory.getLogger(JarLoadUtil.class); + + @Value("${enterprise.jar.path:./lib}") + private String jarPath; + + @Autowired + private ApplicationContext applicationContext; + + // 缓存已加载的实例 + private final ConcurrentHashMap serviceInstances = new ConcurrentHashMap<>(); + + /** + * 根据lib目录下是否存在JAR包动态加载企业服务实现 + * @return 企业服务实例,如果加载失败则返回开源版服务作为降级方案 + */ + public EnterpriseService loadEnterpriseService() { + try { + String cacheKey = "enterprise_service"; + + // 先检查缓存 + EnterpriseService cachedService = serviceInstances.get(cacheKey); + if (cachedService != null) { + logger.info("从缓存中获取企业服务实例"); + return cachedService; + } + + logger.info("开始检测并加载企业服务实现"); + + EnterpriseService service; + if (isCommercialJarAvailable()) { + logger.info("检测到商业版JAR包,加载商业版企业服务"); + service = loadCommercialService(); + } else { + logger.info("未检测到商业版JAR包,使用开源版企业服务"); + service = loadOpenSourceService(); + } + + // 如果服务加载失败,使用开源版作为降级方案 + if (service == null) { + logger.warn("企业服务加载失败,使用开源版作为降级方案"); + service = loadOpenSourceService(); + } + + // 如果开源版也加载失败,抛出异常 + if (service == null) { + throw new RuntimeException("无法加载任何企业服务实现"); + } + + // 缓存服务实例 + serviceInstances.put(cacheKey, service); + logger.info("企业服务加载成功: {}", service.getServiceName()); + + return service; + + } catch (Exception e) { + logger.error("加载企业服务失败,尝试使用开源版作为降级方案", e); + try { + // 最后的降级方案:直接实例化开源版服务 + OpenEnterpriseServiceImpl fallbackService = new OpenEnterpriseServiceImpl(); + + // 从Spring容器中获取KmcConfig并手动注入 + try { + KmcConfig kmcConfig = applicationContext.getBean(KmcConfig.class); + if (kmcConfig != null) { + logger.info("降级方案:从Spring容器中获取KmcConfig并注入到开源版服务"); + java.lang.reflect.Field kmcConfigField = OpenEnterpriseServiceImpl.class.getDeclaredField("kmcConfig"); + kmcConfigField.setAccessible(true); + kmcConfigField.set(fallbackService, kmcConfig); + } else { + logger.warn("降级方案:Spring容器中没有找到KmcConfig Bean"); + } + } catch (Exception fallbackException) { + logger.warn("降级方案:注入KmcConfig失败: {}", fallbackException.getMessage()); + } + + serviceInstances.put("enterprise_service", fallbackService); + logger.warn("使用开源版企业服务作为降级方案"); + return fallbackService; + } catch (Exception fallbackException) { + logger.error("降级方案也失败了", fallbackException); + throw new RuntimeException("无法加载任何企业服务实现,应用无法启动", fallbackException); + } + } + } + + /** + * 检测商业版JAR包是否可用 + * @return true如果JAR包存在且可加载 + */ + private boolean isCommercialJarAvailable() { + try { + String jarFileName = "enterprise-impl-commercial-1.0.0.jar"; + File jarFile = new File(jarPath, jarFileName); + + if (!jarFile.exists()) { + logger.debug("商业版JAR文件不存在: {}", jarFile.getAbsolutePath()); + return false; + } + + // 尝试加载JAR包中的类来验证JAR包是否有效 + URL jarUrl = jarFile.toURI().toURL(); + URLClassLoader classLoader = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader()); + + // 尝试加载商业版实现类 + Class clazz = classLoader.loadClass("com.terrabase.enterprise.impl.commercial.CommercialEnterpriseServiceImpl"); + if (clazz != null) { + logger.debug("商业版JAR包验证成功: {}", jarFile.getAbsolutePath()); + return true; + } + + } catch (Exception e) { + logger.debug("商业版JAR包检测失败: {}", e.getMessage()); + } + + return false; + } + + /** + * 加载商业版服务 + * @return 商业版服务实例 + */ + private EnterpriseService loadCommercialService() throws Exception { + logger.info("正在加载商业版企业服务..."); + + // 尝试从JAR包加载 + EnterpriseService service = loadFromJar("com.terrabase.enterprise.impl.commercial.CommercialEnterpriseServiceImpl"); + + if (service == null) { + // 如果JAR包加载失败,尝试从类路径加载 + service = loadFromClasspath("com.terrabase.enterprise.impl.commercial.CommercialEnterpriseServiceImpl"); + } + + if (service == null) { + throw new RuntimeException("无法加载商业版企业服务"); + } + + return service; + } + + /** + * 加载开源版服务 + * @return 开源版服务实例 + */ + private EnterpriseService loadOpenSourceService() throws Exception { + logger.info("正在加载开源版企业服务..."); + + // 直接实例化开源版实现(通过直接依赖) + OpenEnterpriseServiceImpl service = new OpenEnterpriseServiceImpl(); + + // 从Spring容器中获取KmcConfig并手动注入 + try { + KmcConfig kmcConfig = applicationContext.getBean(KmcConfig.class); + if (kmcConfig != null) { + logger.info("从Spring容器中获取KmcConfig并注入到开源版服务"); + // 使用反射注入KmcConfig + java.lang.reflect.Field kmcConfigField = OpenEnterpriseServiceImpl.class.getDeclaredField("kmcConfig"); + kmcConfigField.setAccessible(true); + kmcConfigField.set(service, kmcConfig); + } else { + logger.warn("Spring容器中没有找到KmcConfig Bean"); + } + } catch (Exception e) { + logger.warn("注入KmcConfig失败: {}", e.getMessage()); + } + + if (service == null) { + throw new RuntimeException("无法加载开源版企业服务"); + } + + return service; + } + + /** + * 从JAR包加载服务 + * @param className 类名 + * @return 服务实例 + */ + private EnterpriseService loadFromJar(String className) { + try { + String jarFileName = getJarFileName(className); + File jarFile = new File(jarPath, jarFileName); + + if (!jarFile.exists()) { + logger.warn("JAR文件不存在: {}", jarFile.getAbsolutePath()); + return null; + } + + logger.info("从JAR文件加载: {}", jarFile.getAbsolutePath()); + + URL jarUrl = jarFile.toURI().toURL(); + URLClassLoader classLoader = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader()); + + Class clazz = classLoader.loadClass(className); + Constructor constructor = clazz.getDeclaredConstructor(); + constructor.setAccessible(true); + + Object instance = constructor.newInstance(); + return (EnterpriseService) instance; + + } catch (Exception e) { + logger.warn("从JAR包加载失败: {}", e.getMessage()); + return null; + } + } + + /** + * 从类路径加载服务 + * @param className 类名 + * @return 服务实例 + */ + private EnterpriseService loadFromClasspath(String className) { + try { + logger.info("从类路径加载: {}", className); + + Class clazz = Class.forName(className); + Constructor constructor = clazz.getDeclaredConstructor(); + constructor.setAccessible(true); + + Object instance = constructor.newInstance(); + return (EnterpriseService) instance; + + } catch (Exception e) { + logger.warn("从类路径加载失败: {}", e.getMessage()); + return null; + } + } + + /** + * 根据类名获取JAR文件名 + * @param className 类名 + * @return JAR文件名 + */ + private String getJarFileName(String className) { + if (className.contains("commercial")) { + return "enterprise-impl-commercial-1.0.0.jar"; + } else if (className.contains("open")) { + return "enterprise-impl-open-1.0.0.jar"; + } + return "unknown.jar"; + } + + + /** + * 清理缓存 + */ + public void clearCache() { + logger.info("清理服务缓存"); + serviceInstances.clear(); + } + + /** + * 获取当前企业模式 + * @return 企业模式 + */ + public String getEnterpriseMode() { + return isCommercialJarAvailable() ? "commercial" : "open"; + } +} diff --git a/business-app/src/main/resources/application.properties b/business-app/src/main/resources/application.properties new file mode 100644 index 0000000..d73e245 --- /dev/null +++ b/business-app/src/main/resources/application.properties @@ -0,0 +1,40 @@ +# Terrabase Business Application 配置文件 + +# 应用基本信息 +spring.application.name=terrabase-business-app +server.port=8080 + +# JAR包路径配置 +# 企业服务实现JAR包的存放路径 +enterprise.jar.path=./lib + +# 日志配置 +logging.level.com.terrabase=INFO +logging.level.org.springframework.web=DEBUG +logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n + +# 企业服务缓存配置 +enterprise.service.cache.enabled=true +enterprise.service.cache.ttl=3600 + +# KMC (Key Management Center) 配置 +terrabase.kmc.enabled=true +terrabase.kmc.default-key-id=default +terrabase.kmc.key-caching=true +terrabase.kmc.max-cache-size=100 +terrabase.kmc.key-expiration-time=86400000 +terrabase.kmc.enable-key-rotation=false +terrabase.kmc.key-rotation-interval=604800000 +terrabase.kmc.enable-audit-log=true + +# 监控配置 +management.endpoints.web.exposure.include=health,info,metrics +management.endpoint.health.show-details=always +management.info.env.enabled=true + +# 应用信息 +info.app.name=Terrabase Business Application +info.app.description=企业级数据使能平台 - 业务应用模块 +info.app.version=1.0.0 +info.app.encoding=UTF-8 +info.app.java.version=17 diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/CryptoAlgorithm.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/CryptoAlgorithm.java new file mode 100644 index 0000000..5221271 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/CryptoAlgorithm.java @@ -0,0 +1,139 @@ +package com.terrabase.enterprise.api; + +/** + * 加密算法枚举 + * 定义系统支持的各种加密算法 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public enum CryptoAlgorithm { + + /** + * AES加密算法 - 高级加密标准 + * 支持128、192、256位密钥长度 + */ + AES("AES", "AES/GCM/NoPadding", 256), + + /** + * RSA加密算法 - 非对称加密 + * 支持1024、2048、4096位密钥长度 + */ + RSA("RSA", "RSA/ECB/PKCS1Padding", 2048), + + /** + * DES加密算法 - 数据加密标准 + * 支持56位密钥长度 + */ + DES("DES", "DES/CBC/PKCS5Padding", 56), + + /** + * 3DES加密算法 - 三重数据加密标准 + * 支持112、168位密钥长度 + */ + TRIPLE_DES("DESede", "DESede/CBC/PKCS5Padding", 168), + + /** + * Blowfish加密算法 + * 支持32-448位可变密钥长度 + */ + BLOWFISH("Blowfish", "Blowfish/CBC/PKCS5Padding", 128), + + /** + * ChaCha20加密算法 + * 流密码算法 + */ + CHACHA20("ChaCha20", "ChaCha20-Poly1305", 256); + + private final String algorithm; + private final String transformation; + private final int defaultKeyLength; + + /** + * 构造函数 + * @param algorithm 算法名称 + * @param transformation 转换模式 + * @param defaultKeyLength 默认密钥长度(位) + */ + CryptoAlgorithm(String algorithm, String transformation, int defaultKeyLength) { + this.algorithm = algorithm; + this.transformation = transformation; + this.defaultKeyLength = defaultKeyLength; + } + + /** + * 获取算法名称 + * @return 算法名称 + */ + public String getAlgorithm() { + return algorithm; + } + + /** + * 获取转换模式 + * @return 转换模式 + */ + public String getTransformation() { + return transformation; + } + + /** + * 获取默认密钥长度 + * @return 默认密钥长度(位) + */ + public int getDefaultKeyLength() { + return defaultKeyLength; + } + + /** + * 根据算法名称获取枚举值 + * @param algorithmName 算法名称 + * @return 对应的枚举值,如果未找到则返回AES + */ + public static CryptoAlgorithm fromString(String algorithmName) { + if (algorithmName == null || algorithmName.trim().isEmpty()) { + return AES; // 默认使用AES + } + + for (CryptoAlgorithm algorithm : values()) { + if (algorithm.getAlgorithm().equalsIgnoreCase(algorithmName.trim())) { + return algorithm; + } + } + + // 如果未找到匹配的算法,返回AES作为默认值 + return AES; + } + + /** + * 检查是否为对称加密算法 + * @return true如果是对称加密算法 + */ + public boolean isSymmetric() { + return this != RSA; + } + + /** + * 检查是否为非对称加密算法 + * @return true如果是非对称加密算法 + */ + public boolean isAsymmetric() { + return this == RSA; + } + + /** + * 检查是否为流密码算法 + * @return true如果是流密码算法 + */ + public boolean isStreamCipher() { + return this == CHACHA20; + } + + /** + * 检查是否为分组密码算法 + * @return true如果是分组密码算法 + */ + public boolean isBlockCipher() { + return this != CHACHA20; + } +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java new file mode 100644 index 0000000..718dd0c --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java @@ -0,0 +1,69 @@ +package com.terrabase.enterprise.api; + +/** + * 企业级服务接口 + * 定义企业级功能的核心接口,包括数据使能、模型引擎等功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public interface EnterpriseService { + + /** + * 获取服务名称 + * @return 服务名称 + */ + String getServiceName(); + + /** + * 获取服务版本 + * @return 服务版本 + */ + String getServiceVersion(); + + /** + * 获取服务类型(commercial 或 open) + * @return 服务类型 + */ + String getServiceType(); + + /** + * 获取服务健康状态 + * @return 健康状态信息 + */ + String getHealthStatus(); + + /** + * 启动服务 + * 将服务的running状态设置为true + */ + void start(); + + /** + * 停止服务 + * 将服务的running状态设置为false + */ + void stop(); + + /** + * 检查服务是否正在运行 + * @return true如果服务正在运行 + */ + boolean isRunning(); + + /** + * 加密接口 + * @param plaintext 明文数据 + * @param algorithm 加密算法,如果为null则使用默认AES算法 + * @return 密文数据 + */ + String encrypt(String plaintext, CryptoAlgorithm algorithm); + + /** + * 解密接口 + * @param ciphertext 密文数据 + * @param algorithm 解密算法,如果为null则使用默认AES算法 + * @return 明文数据 + */ + String decrypt(String ciphertext, CryptoAlgorithm algorithm); +} diff --git a/enterprise-impl-commercial/pom.xml b/enterprise-impl-commercial/pom.xml index 41d62ef..80fecb7 100644 --- a/enterprise-impl-commercial/pom.xml +++ b/enterprise-impl-commercial/pom.xml @@ -43,12 +43,6 @@ spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-security - - org.springframework.boot @@ -93,12 +87,6 @@ test - - org.springframework.security - spring-security-test - test - - junit junit diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java new file mode 100644 index 0000000..de8beb2 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java @@ -0,0 +1,159 @@ +package com.terrabase.enterprise.impl.commercial; + +import com.terrabase.enterprise.api.EnterpriseService; +import com.terrabase.enterprise.api.CryptoAlgorithm; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 商业版企业服务实现 + * 集成 Nexent 和 ModelEngine 等商业组件 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Service +public class CommercialEnterpriseServiceImpl implements EnterpriseService { + + private static final Logger logger = LoggerFactory.getLogger(CommercialEnterpriseServiceImpl.class); + + private final AtomicBoolean running = new AtomicBoolean(false); + + @Override + public String getServiceName() { + return "Commercial Enterprise Service"; + } + + @Override + public String getServiceVersion() { + return "1.0.0-commercial"; + } + + @Override + public String getServiceType() { + return "commercial"; + } + + @Override + public String getHealthStatus() { + if (!running.get()) { + return "服务未运行"; + } + + return String.format("商业版企业服务健康状态: 正常 (版本: %s, 类型: %s)", + getServiceVersion(), getServiceType()); + } + + @Override + public void start() { + if (running.compareAndSet(false, true)) { + logger.info("商业版企业服务已启动"); + } else { + logger.warn("商业版企业服务已经在运行中"); + } + } + + @Override + public void stop() { + if (running.compareAndSet(true, false)) { + logger.info("商业版企业服务已停止"); + } else { + logger.warn("商业版企业服务已经停止"); + } + } + + @Override + public boolean isRunning() { + return running.get(); + } + + @Override + public String encrypt(String plaintext, CryptoAlgorithm algorithm) { + if (!running.get()) { + return "服务未运行,无法执行加密操作"; + } + + if (plaintext == null || plaintext.trim().isEmpty()) { + return "明文数据不能为空"; + } + + if (algorithm == null) { + algorithm = CryptoAlgorithm.AES; // 默认使用AES + } + + try { + logger.info("商业版执行数据加密,原文长度: {}, 算法: {}", plaintext.length(), algorithm.getAlgorithm()); + + // 商业版模拟加密过程(实际项目中这里会调用商业加密库) + String ciphertext = simulateCommercialEncryption(plaintext, algorithm); + + return String.format("商业版加密成功 [%s]: %s", algorithm.getAlgorithm(), ciphertext); + + } catch (Exception e) { + logger.error("商业版加密失败,算法: {}", algorithm, e); + return "加密失败: " + e.getMessage(); + } + } + + @Override + public String decrypt(String ciphertext, CryptoAlgorithm algorithm) { + if (!running.get()) { + return "服务未运行,无法执行解密操作"; + } + + if (ciphertext == null || ciphertext.trim().isEmpty()) { + return "密文数据不能为空"; + } + + if (algorithm == null) { + algorithm = CryptoAlgorithm.AES; // 默认使用AES + } + + try { + logger.info("商业版执行数据解密,密文长度: {}, 算法: {}", ciphertext.length(), algorithm.getAlgorithm()); + + // 商业版模拟解密过程(实际项目中这里会调用商业解密库) + String plaintext = simulateCommercialDecryption(ciphertext, algorithm); + + return String.format("商业版解密成功 [%s]: %s", algorithm.getAlgorithm(), plaintext); + + } catch (Exception e) { + logger.error("商业版解密失败,算法: {}", algorithm, e); + return "解密失败: " + e.getMessage(); + } + } + + /** + * 模拟商业版加密过程 + * 实际项目中这里会调用Nexent或其他商业加密库 + */ + private String simulateCommercialEncryption(String plaintext, CryptoAlgorithm algorithm) { + // 模拟商业加密库的处理过程 + StringBuilder result = new StringBuilder(); + result.append("COMMERCIAL_").append(algorithm.getAlgorithm()).append("_"); + + // 简单的Base64编码作为模拟 + String encoded = java.util.Base64.getEncoder().encodeToString(plaintext.getBytes()); + result.append(encoded); + + return result.toString(); + } + + /** + * 模拟商业版解密过程 + * 实际项目中这里会调用Nexent或其他商业解密库 + */ + private String simulateCommercialDecryption(String ciphertext, CryptoAlgorithm algorithm) { + // 模拟商业解密库的处理过程 + if (ciphertext.startsWith("COMMERCIAL_" + algorithm.getAlgorithm() + "_")) { + String encoded = ciphertext.substring(("COMMERCIAL_" + algorithm.getAlgorithm() + "_").length()); + return new String(java.util.Base64.getDecoder().decode(encoded)); + } else { + // 如果不是商业版格式,直接返回原文(向后兼容) + return ciphertext; + } + } +} diff --git a/enterprise-impl-open/pom.xml b/enterprise-impl-open/pom.xml index c96f1ee..e3cfc50 100644 --- a/enterprise-impl-open/pom.xml +++ b/enterprise-impl-open/pom.xml @@ -88,6 +88,33 @@ 1.10.0 + + + org.bouncycastle + bcprov-jdk15on + 1.70 + + + + org.bouncycastle + bcpkix-jdk15on + 1.70 + + + + + commons-codec + commons-codec + 1.15 + + + + + javax.annotation + javax.annotation-api + 1.3.2 + + org.springframework.boot @@ -119,6 +146,17 @@ 17 + + org.apache.maven.plugins + maven-surefire-plugin + 3.1.2 + + + **/*Test.java + **/*Tests.java + + + \ No newline at end of file diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java new file mode 100644 index 0000000..59e943c --- /dev/null +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java @@ -0,0 +1,156 @@ +package com.terrabase.enterprise.impl.open; + +import com.terrabase.enterprise.api.EnterpriseService; +import com.terrabase.enterprise.api.CryptoAlgorithm; +import com.terrabase.enterprise.impl.open.config.KmcConfig; +import com.terrabase.enterprise.impl.open.util.KmcCryptoUtil; +import org.apache.commons.text.similarity.LevenshteinDistance; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.Map; + +/** + * 开源版企业服务实现 + * 基于开源数据使能技术实现 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Service +public class OpenEnterpriseServiceImpl implements EnterpriseService { + + private static final Logger logger = LoggerFactory.getLogger(OpenEnterpriseServiceImpl.class); + + private final AtomicBoolean running = new AtomicBoolean(false); + + @Autowired + private KmcConfig kmcConfig; + + @Override + public String getServiceName() { + return "Open Source Enterprise Service"; + } + + @Override + public String getServiceVersion() { + return "1.0.0-open"; + } + + @Override + public String getServiceType() { + return "open"; + } + + @Override + public String getHealthStatus() { + if (!running.get()) { + return "服务未运行"; + } + + return String.format("开源版企业服务健康状态: 正常 (版本: %s, 类型: %s)", + getServiceVersion(), getServiceType()); + } + + @Override + public void start() { + if (running.compareAndSet(false, true)) { + logger.info("开源版企业服务已启动"); + } else { + logger.warn("开源版企业服务已经在运行中"); + } + } + + @Override + public void stop() { + if (running.compareAndSet(true, false)) { + logger.info("开源版企业服务已停止"); + } else { + logger.warn("开源版企业服务已经停止"); + } + } + + @Override + public boolean isRunning() { + return running.get(); + } + + @Override + public String encrypt(String plaintext, CryptoAlgorithm algorithm) { + if (!running.get()) { + return "服务未运行,无法执行加密操作"; + } + + if (!kmcConfig.isEnabled()) { + return "KMC功能未启用,无法执行加密操作"; + } + + if (plaintext == null || plaintext.trim().isEmpty()) { + return "明文数据不能为空"; + } + + if (algorithm == null) { + algorithm = CryptoAlgorithm.AES; // 默认使用AES + } + + try { + logger.info("开源版执行数据加密,原文长度: {}, 算法: {}", plaintext.length(), algorithm.getAlgorithm()); + + // 使用KMC工具进行加密 + String ciphertext = KmcCryptoUtil.encrypt(plaintext, kmcConfig.getDefaultKeyId(), algorithm); + + // 记录审计日志 + if (kmcConfig.isEnableAuditLog()) { + logger.info("KMC加密审计 - 密钥ID: {}, 算法: {}, 原文长度: {}, 密文长度: {}", + kmcConfig.getDefaultKeyId(), algorithm.getAlgorithm(), plaintext.length(), ciphertext.length()); + } + + return String.format("开源版KMC加密成功 [%s]: %s", algorithm.getAlgorithm(), ciphertext); + + } catch (Exception e) { + logger.error("开源版KMC加密失败,算法: {}", algorithm, e); + return "KMC加密失败: " + e.getMessage(); + } + } + + @Override + public String decrypt(String ciphertext, CryptoAlgorithm algorithm) { + if (!running.get()) { + return "服务未运行,无法执行解密操作"; + } + + if (!kmcConfig.isEnabled()) { + return "KMC功能未启用,无法执行解密操作"; + } + + if (ciphertext == null || ciphertext.trim().isEmpty()) { + return "密文数据不能为空"; + } + + if (algorithm == null) { + algorithm = CryptoAlgorithm.AES; // 默认使用AES + } + + try { + logger.info("开源版执行数据解密,密文长度: {}, 算法: {}", ciphertext.length(), algorithm.getAlgorithm()); + + // 使用KMC工具进行解密 + String plaintext = KmcCryptoUtil.decrypt(ciphertext, kmcConfig.getDefaultKeyId(), algorithm); + + // 记录审计日志 + if (kmcConfig.isEnableAuditLog()) { + logger.info("KMC解密审计 - 密钥ID: {}, 算法: {}, 密文长度: {}, 原文长度: {}", + kmcConfig.getDefaultKeyId(), algorithm.getAlgorithm(), ciphertext.length(), plaintext.length()); + } + + return String.format("开源版KMC解密成功 [%s]: %s", algorithm.getAlgorithm(), plaintext); + + } catch (Exception e) { + logger.error("开源版KMC解密失败,算法: {}", algorithm, e); + return "KMC解密失败: " + e.getMessage(); + } + } +} \ No newline at end of file diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/config/KmcConfig.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/config/KmcConfig.java new file mode 100644 index 0000000..74a0952 --- /dev/null +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/config/KmcConfig.java @@ -0,0 +1,186 @@ +package com.terrabase.enterprise.impl.open.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.concurrent.ConcurrentHashMap; +import java.util.Map; + +/** + * KMC配置管理类 + * 管理密钥管理中心的配置信息 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Component +public class KmcConfig { + + private static final Logger logger = LoggerFactory.getLogger(KmcConfig.class); + + // 默认配置 + private boolean enabled = true; + private String defaultKeyId = "default"; + private boolean keyCaching = true; + private int maxCacheSize = 100; + private long keyExpirationTime = 24 * 60 * 60 * 1000; // 24小时 + + // 自定义密钥配置 + private Map customKeys = new ConcurrentHashMap<>(); + + // 安全配置 + private boolean enableKeyRotation = false; + private long keyRotationInterval = 7 * 24 * 60 * 60 * 1000; // 7天 + private boolean enableAuditLog = true; + + @PostConstruct + public void init() { + logger.info("初始化KMC配置..."); + logger.info("KMC启用状态: {}", enabled); + logger.info("默认密钥ID: {}", defaultKeyId); + logger.info("密钥缓存: {}", keyCaching); + logger.info("最大缓存大小: {}", maxCacheSize); + logger.info("密钥过期时间: {} ms", keyExpirationTime); + logger.info("密钥轮换: {}", enableKeyRotation); + logger.info("密钥轮换间隔: {} ms", keyRotationInterval); + logger.info("审计日志: {}", enableAuditLog); + logger.info("自定义密钥数量: {}", customKeys.size()); + + if (customKeys.isEmpty()) { + logger.info("未配置自定义密钥,将使用默认密钥"); + } else { + logger.info("已配置自定义密钥: {}", customKeys.keySet()); + } + } + + // Getter和Setter方法 + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public String getDefaultKeyId() { + return defaultKeyId; + } + + public void setDefaultKeyId(String defaultKeyId) { + this.defaultKeyId = defaultKeyId; + } + + + public boolean isKeyCaching() { + return keyCaching; + } + + public void setKeyCaching(boolean keyCaching) { + this.keyCaching = keyCaching; + } + + public int getMaxCacheSize() { + return maxCacheSize; + } + + public void setMaxCacheSize(int maxCacheSize) { + this.maxCacheSize = maxCacheSize; + } + + public long getKeyExpirationTime() { + return keyExpirationTime; + } + + public void setKeyExpirationTime(long keyExpirationTime) { + this.keyExpirationTime = keyExpirationTime; + } + + public Map getCustomKeys() { + return customKeys; + } + + public void setCustomKeys(Map customKeys) { + this.customKeys = customKeys; + } + + public boolean isEnableKeyRotation() { + return enableKeyRotation; + } + + public void setEnableKeyRotation(boolean enableKeyRotation) { + this.enableKeyRotation = enableKeyRotation; + } + + public long getKeyRotationInterval() { + return keyRotationInterval; + } + + public void setKeyRotationInterval(long keyRotationInterval) { + this.keyRotationInterval = keyRotationInterval; + } + + public boolean isEnableAuditLog() { + return enableAuditLog; + } + + public void setEnableAuditLog(boolean enableAuditLog) { + this.enableAuditLog = enableAuditLog; + } + + /** + * 添加自定义密钥 + * @param keyId 密钥ID + * @param keyValue 密钥值(Base64编码) + */ + public void addCustomKey(String keyId, String keyValue) { + customKeys.put(keyId, keyValue); + logger.info("添加自定义密钥: {}", keyId); + } + + /** + * 移除自定义密钥 + * @param keyId 密钥ID + * @return 是否移除成功 + */ + public boolean removeCustomKey(String keyId) { + String removed = customKeys.remove(keyId); + if (removed != null) { + logger.info("移除自定义密钥: {}", keyId); + return true; + } + return false; + } + + /** + * 获取自定义密钥 + * @param keyId 密钥ID + * @return 密钥值 + */ + public String getCustomKey(String keyId) { + return customKeys.get(keyId); + } + + /** + * 检查是否为自定义密钥 + * @param keyId 密钥ID + * @return 是否为自定义密钥 + */ + public boolean isCustomKey(String keyId) { + return customKeys.containsKey(keyId); + } + + /** + * 获取配置摘要 + * @return 配置摘要字符串 + */ + public String getConfigSummary() { + return String.format( + "KMC配置摘要 - 启用: %s, 默认密钥: %s, 缓存: %s, 自定义密钥: %d", + enabled, defaultKeyId, keyCaching, customKeys.size() + ); + } +} diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/util/KmcCryptoUtil.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/util/KmcCryptoUtil.java new file mode 100644 index 0000000..2a74c40 --- /dev/null +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/util/KmcCryptoUtil.java @@ -0,0 +1,504 @@ +package com.terrabase.enterprise.impl.open.util; + +import com.terrabase.enterprise.api.CryptoAlgorithm; +import org.apache.commons.codec.binary.Base64; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.GCMParameterSpec; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.concurrent.ConcurrentHashMap; +import java.util.Map; + +/** + * KMC (Key Management Center) 加解密工具类 + * 基于开源算法实现数据加解密功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class KmcCryptoUtil { + + private static final Logger logger = LoggerFactory.getLogger(KmcCryptoUtil.class); + + // 加密算法 + private static final String ALGORITHM = "AES"; + private static final String TRANSFORMATION = "AES/GCM/NoPadding"; + private static final int GCM_IV_LENGTH = 12; // 96位 + private static final int GCM_TAG_LENGTH = 16; // 128位 + private static final int KEY_LENGTH = 256; // 256位密钥 + + // 密钥缓存 + private static final Map keyCache = new ConcurrentHashMap<>(); + private static final Map keyPairCache = new ConcurrentHashMap<>(); + + // 随机数生成器 + private static final SecureRandom secureRandom = new SecureRandom(); + + static { + // 添加BouncyCastle安全提供者 + if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) { + Security.addProvider(new BouncyCastleProvider()); + } + } + + /** + * 生成AES密钥(不缓存) + * @param keyId 密钥ID + * @return 生成的密钥 + */ + public static SecretKey generateKey(String keyId) { + try { + KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM); + keyGenerator.init(KEY_LENGTH); + SecretKey key = keyGenerator.generateKey(); + logger.info("成功生成密钥: {}", keyId); + return key; + } catch (NoSuchAlgorithmException e) { + logger.error("生成密钥失败", e); + throw new RuntimeException("生成密钥失败", e); + } + } + + /** + * 生成并缓存AES密钥 + * @param keyId 密钥ID + * @return 生成的密钥 + */ + public static SecretKey generateAndCacheKey(String keyId) { + SecretKey key = generateKey(keyId); + keyCache.put(keyId, key); + return key; + } + + /** + * 从字节数组创建密钥 + * @param keyBytes 密钥字节数组 + * @return SecretKey对象 + */ + public static SecretKey createKeyFromBytes(byte[] keyBytes) { + return new SecretKeySpec(keyBytes, ALGORITHM); + } + + /** + * 获取或创建密钥 + * @param keyId 密钥ID + * @return 密钥对象 + */ + public static SecretKey getOrCreateKey(String keyId) { + return keyCache.computeIfAbsent(keyId, KmcCryptoUtil::generateKey); + } + + /** + * 加密数据 + * @param plaintext 明文数据 + * @param keyId 密钥ID + * @return 加密后的Base64编码字符串 + */ + public static String encrypt(String plaintext, String keyId) { + if (plaintext == null || plaintext.isEmpty()) { + throw new IllegalArgumentException("明文数据不能为空"); + } + + try { + SecretKey key = getOrCreateKey(keyId); + + // 生成随机IV + byte[] iv = new byte[GCM_IV_LENGTH]; + secureRandom.nextBytes(iv); + + // 创建GCM参数规范 + GCMParameterSpec gcmSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv); + + // 初始化加密器 + Cipher cipher = Cipher.getInstance(TRANSFORMATION); + cipher.init(Cipher.ENCRYPT_MODE, key, gcmSpec); + + // 执行加密 + byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); + + // 将IV和密文组合 + byte[] encryptedData = new byte[GCM_IV_LENGTH + ciphertext.length]; + System.arraycopy(iv, 0, encryptedData, 0, GCM_IV_LENGTH); + System.arraycopy(ciphertext, 0, encryptedData, GCM_IV_LENGTH, ciphertext.length); + + // 返回Base64编码的结果 + String result = Base64.encodeBase64String(encryptedData); + logger.debug("数据加密成功,密钥ID: {}, 原文长度: {}, 密文长度: {}", + keyId, plaintext.length(), result.length()); + + return result; + + } catch (Exception e) { + logger.error("数据加密失败,密钥ID: {}", keyId, e); + throw new RuntimeException("数据加密失败", e); + } + } + + /** + * 解密数据 + * @param ciphertext 密文数据(Base64编码) + * @param keyId 密钥ID + * @return 解密后的明文数据 + */ + public static String decrypt(String ciphertext, String keyId) { + if (ciphertext == null || ciphertext.isEmpty()) { + throw new IllegalArgumentException("密文数据不能为空"); + } + + try { + SecretKey key = getOrCreateKey(keyId); + + // 解码Base64 + byte[] encryptedData = Base64.decodeBase64(ciphertext); + + // 检查数据长度 + if (encryptedData.length < GCM_IV_LENGTH) { + throw new IllegalArgumentException("密文数据格式错误"); + } + + // 提取IV和密文 + byte[] iv = new byte[GCM_IV_LENGTH]; + byte[] cipherBytes = new byte[encryptedData.length - GCM_IV_LENGTH]; + System.arraycopy(encryptedData, 0, iv, 0, GCM_IV_LENGTH); + System.arraycopy(encryptedData, GCM_IV_LENGTH, cipherBytes, 0, cipherBytes.length); + + // 创建GCM参数规范 + GCMParameterSpec gcmSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv); + + // 初始化解密器 + Cipher cipher = Cipher.getInstance(TRANSFORMATION); + cipher.init(Cipher.DECRYPT_MODE, key, gcmSpec); + + // 执行解密 + byte[] plaintext = cipher.doFinal(cipherBytes); + String result = new String(plaintext, StandardCharsets.UTF_8); + + logger.debug("数据解密成功,密钥ID: {}, 密文长度: {}, 原文长度: {}", + keyId, ciphertext.length(), result.length()); + + return result; + + } catch (Exception e) { + logger.error("数据解密失败,密钥ID: {}", keyId, e); + throw new RuntimeException("数据解密失败", e); + } + } + + /** + * 使用默认密钥加密 + * @param plaintext 明文数据 + * @return 加密后的Base64编码字符串 + */ + public static String encrypt(String plaintext) { + return encrypt(plaintext, "default"); + } + + /** + * 使用默认密钥解密 + * @param ciphertext 密文数据(Base64编码) + * @return 解密后的明文数据 + */ + public static String decrypt(String ciphertext) { + return decrypt(ciphertext, "default"); + } + + /** + * 验证密钥是否存在 + * @param keyId 密钥ID + * @return 密钥是否存在 + */ + public static boolean hasKey(String keyId) { + return keyCache.containsKey(keyId); + } + + /** + * 删除密钥 + * @param keyId 密钥ID + * @return 是否删除成功 + */ + public static boolean removeKey(String keyId) { + SecretKey removed = keyCache.remove(keyId); + if (removed != null) { + logger.info("密钥已删除: {}", keyId); + return true; + } + return false; + } + + /** + * 清空所有密钥 + */ + public static void clearAllKeys() { + int count = keyCache.size(); + keyCache.clear(); + logger.info("已清空所有密钥,共删除 {} 个密钥", count); + } + + /** + * 获取密钥数量 + * @return 当前缓存的密钥数量 + */ + public static int getKeyCount() { + return keyCache.size(); + } + + /** + * 获取密钥信息 + * @param keyId 密钥ID + * @return 密钥信息字符串 + */ + public static String getKeyInfo(String keyId) { + SecretKey key = keyCache.get(keyId); + if (key == null) { + return "密钥不存在: " + keyId; + } + + return String.format("密钥ID: %s, 算法: %s, 长度: %d bits", + keyId, key.getAlgorithm(), key.getEncoded().length * 8); + } + + // ==================== 多算法支持方法 ==================== + + /** + * 使用指定算法加密数据 + * @param plaintext 明文数据 + * @param keyId 密钥ID + * @param algorithm 加密算法 + * @return 加密后的Base64编码字符串 + */ + public static String encrypt(String plaintext, String keyId, CryptoAlgorithm algorithm) { + if (plaintext == null || plaintext.isEmpty()) { + throw new IllegalArgumentException("明文数据不能为空"); + } + + if (algorithm == null) { + algorithm = CryptoAlgorithm.AES; // 默认使用AES + } + + try { + if (algorithm.isSymmetric()) { + return encryptSymmetric(plaintext, keyId, algorithm); + } else if (algorithm.isAsymmetric()) { + return encryptAsymmetric(plaintext, keyId, algorithm); + } else { + throw new IllegalArgumentException("不支持的加密算法: " + algorithm); + } + } catch (Exception e) { + logger.error("数据加密失败,密钥ID: {}, 算法: {}", keyId, algorithm, e); + throw new RuntimeException("数据加密失败", e); + } + } + + /** + * 使用指定算法解密数据 + * @param ciphertext 密文数据(Base64编码) + * @param keyId 密钥ID + * @param algorithm 解密算法 + * @return 解密后的明文数据 + */ + public static String decrypt(String ciphertext, String keyId, CryptoAlgorithm algorithm) { + if (ciphertext == null || ciphertext.isEmpty()) { + throw new IllegalArgumentException("密文数据不能为空"); + } + + if (algorithm == null) { + algorithm = CryptoAlgorithm.AES; // 默认使用AES + } + + try { + if (algorithm.isSymmetric()) { + return decryptSymmetric(ciphertext, keyId, algorithm); + } else if (algorithm.isAsymmetric()) { + return decryptAsymmetric(ciphertext, keyId, algorithm); + } else { + throw new IllegalArgumentException("不支持的解密算法: " + algorithm); + } + } catch (Exception e) { + logger.error("数据解密失败,密钥ID: {}, 算法: {}", keyId, algorithm, e); + throw new RuntimeException("数据解密失败", e); + } + } + + /** + * 对称加密 + */ + private static String encryptSymmetric(String plaintext, String keyId, CryptoAlgorithm algorithm) throws Exception { + SecretKey key = getOrCreateSymmetricKey(keyId, algorithm); + + Cipher cipher = Cipher.getInstance(algorithm.getTransformation()); + + if (algorithm == CryptoAlgorithm.AES) { + // AES使用GCM模式 + byte[] iv = new byte[12]; // GCM IV长度 + secureRandom.nextBytes(iv); + GCMParameterSpec gcmSpec = new GCMParameterSpec(128, iv); + cipher.init(Cipher.ENCRYPT_MODE, key, gcmSpec); + + byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); + + // 将IV和密文组合 + byte[] encryptedData = new byte[iv.length + ciphertext.length]; + System.arraycopy(iv, 0, encryptedData, 0, iv.length); + System.arraycopy(ciphertext, 0, encryptedData, iv.length, ciphertext.length); + + return Base64.encodeBase64String(encryptedData); + } else if (algorithm == CryptoAlgorithm.CHACHA20) { + // ChaCha20使用特殊的IV处理 + byte[] iv = new byte[12]; // ChaCha20需要12字节的nonce + secureRandom.nextBytes(iv); + IvParameterSpec ivSpec = new IvParameterSpec(iv); + cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); + + byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); + + // 将IV和密文组合 + byte[] encryptedData = new byte[iv.length + ciphertext.length]; + System.arraycopy(iv, 0, encryptedData, 0, iv.length); + System.arraycopy(ciphertext, 0, encryptedData, iv.length, ciphertext.length); + + return Base64.encodeBase64String(encryptedData); + } else { + // 其他对称算法使用CBC模式 + cipher.init(Cipher.ENCRYPT_MODE, key); + byte[] iv = cipher.getIV(); + byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); + + // 将IV和密文组合 + byte[] encryptedData = new byte[iv.length + ciphertext.length]; + System.arraycopy(iv, 0, encryptedData, 0, iv.length); + System.arraycopy(ciphertext, 0, encryptedData, iv.length, ciphertext.length); + + return Base64.encodeBase64String(encryptedData); + } + } + + /** + * 对称解密 + */ + private static String decryptSymmetric(String ciphertext, String keyId, CryptoAlgorithm algorithm) throws Exception { + SecretKey key = getOrCreateSymmetricKey(keyId, algorithm); + + byte[] encryptedData = Base64.decodeBase64(ciphertext); + Cipher cipher = Cipher.getInstance(algorithm.getTransformation()); + + if (algorithm == CryptoAlgorithm.AES) { + // AES使用GCM模式 + byte[] iv = new byte[12]; + byte[] cipherBytes = new byte[encryptedData.length - 12]; + System.arraycopy(encryptedData, 0, iv, 0, 12); + System.arraycopy(encryptedData, 12, cipherBytes, 0, cipherBytes.length); + + GCMParameterSpec gcmSpec = new GCMParameterSpec(128, iv); + cipher.init(Cipher.DECRYPT_MODE, key, gcmSpec); + + byte[] plaintext = cipher.doFinal(cipherBytes); + return new String(plaintext, StandardCharsets.UTF_8); + } else if (algorithm == CryptoAlgorithm.CHACHA20) { + // ChaCha20使用特殊的IV处理 + byte[] iv = new byte[12]; // ChaCha20需要12字节的nonce + byte[] cipherBytes = new byte[encryptedData.length - 12]; + System.arraycopy(encryptedData, 0, iv, 0, 12); + System.arraycopy(encryptedData, 12, cipherBytes, 0, cipherBytes.length); + + IvParameterSpec ivSpec = new IvParameterSpec(iv); + cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); + + byte[] plaintext = cipher.doFinal(cipherBytes); + return new String(plaintext, StandardCharsets.UTF_8); + } else { + // 其他对称算法使用CBC模式 + byte[] iv = new byte[cipher.getBlockSize()]; + byte[] cipherBytes = new byte[encryptedData.length - iv.length]; + System.arraycopy(encryptedData, 0, iv, 0, iv.length); + System.arraycopy(encryptedData, iv.length, cipherBytes, 0, cipherBytes.length); + + IvParameterSpec ivSpec = new IvParameterSpec(iv); + cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); + + byte[] plaintext = cipher.doFinal(cipherBytes); + return new String(plaintext, StandardCharsets.UTF_8); + } + } + + /** + * 非对称加密(RSA) + */ + private static String encryptAsymmetric(String plaintext, String keyId, CryptoAlgorithm algorithm) throws Exception { + KeyPair keyPair = getOrCreateKeyPair(keyId, algorithm); + PublicKey publicKey = keyPair.getPublic(); + + Cipher cipher = Cipher.getInstance(algorithm.getTransformation()); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + + byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); + return Base64.encodeBase64String(ciphertext); + } + + /** + * 非对称解密(RSA) + */ + private static String decryptAsymmetric(String ciphertext, String keyId, CryptoAlgorithm algorithm) throws Exception { + KeyPair keyPair = getOrCreateKeyPair(keyId, algorithm); + PrivateKey privateKey = keyPair.getPrivate(); + + Cipher cipher = Cipher.getInstance(algorithm.getTransformation()); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + + byte[] encryptedData = Base64.decodeBase64(ciphertext); + byte[] plaintext = cipher.doFinal(encryptedData); + return new String(plaintext, StandardCharsets.UTF_8); + } + + /** + * 获取或创建对称密钥 + */ + private static SecretKey getOrCreateSymmetricKey(String keyId, CryptoAlgorithm algorithm) throws Exception { + String cacheKey = keyId + "_" + algorithm.name(); + return keyCache.computeIfAbsent(cacheKey, k -> { + try { + KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm.getAlgorithm()); + keyGenerator.init(algorithm.getDefaultKeyLength()); + return keyGenerator.generateKey(); + } catch (Exception e) { + throw new RuntimeException("生成对称密钥失败", e); + } + }); + } + + /** + * 获取或创建密钥对 + */ + private static KeyPair getOrCreateKeyPair(String keyId, CryptoAlgorithm algorithm) throws Exception { + String cacheKey = keyId + "_" + algorithm.name(); + return keyPairCache.computeIfAbsent(cacheKey, k -> { + try { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm.getAlgorithm()); + keyPairGenerator.initialize(algorithm.getDefaultKeyLength()); + return keyPairGenerator.generateKeyPair(); + } catch (Exception e) { + throw new RuntimeException("生成密钥对失败", e); + } + }); + } + + /** + * 清空所有密钥缓存 + */ + public static void clearAllCaches() { + int symmetricCount = keyCache.size(); + int asymmetricCount = keyPairCache.size(); + keyCache.clear(); + keyPairCache.clear(); + logger.info("已清空所有密钥缓存,对称密钥: {}, 非对称密钥: {}", symmetricCount, asymmetricCount); + } +} diff --git a/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/KmcCryptoUtilTest.java b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/KmcCryptoUtilTest.java new file mode 100644 index 0000000..9f59ecc --- /dev/null +++ b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/KmcCryptoUtilTest.java @@ -0,0 +1,254 @@ +package com.terrabase.enterprise.impl.open; + +import com.terrabase.enterprise.impl.open.util.KmcCryptoUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.DisplayName; +import static org.junit.jupiter.api.Assertions.*; + +/** + * KMC加解密工具类测试 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@DisplayName("KMC加解密工具类测试") +public class KmcCryptoUtilTest { + + private static final String TEST_KEY_ID = "test_key"; + private static final String TEST_PLAINTEXT = "Hello, Terrabase KMC!"; + + @BeforeEach + void setUp() { + // 清空密钥缓存 + KmcCryptoUtil.clearAllKeys(); + } + + @Test + @DisplayName("测试密钥生成") + void testGenerateKey() { + // 生成密钥 + var key = KmcCryptoUtil.generateAndCacheKey(TEST_KEY_ID); + + // 验证密钥不为空 + assertNotNull(key); + + // 验证密钥已缓存 + assertTrue(KmcCryptoUtil.hasKey(TEST_KEY_ID)); + + // 验证密钥信息 + String keyInfo = KmcCryptoUtil.getKeyInfo(TEST_KEY_ID); + assertTrue(keyInfo.contains(TEST_KEY_ID)); + assertTrue(keyInfo.contains("AES")); + } + + @Test + @DisplayName("测试基本加解密功能") + void testBasicEncryptDecrypt() { + // 生成密钥 + KmcCryptoUtil.generateAndCacheKey(TEST_KEY_ID); + + // 加密 + String ciphertext = KmcCryptoUtil.encrypt(TEST_PLAINTEXT, TEST_KEY_ID); + + // 验证加密结果 + assertNotNull(ciphertext); + assertNotEquals(TEST_PLAINTEXT, ciphertext); + assertTrue(ciphertext.length() > 0); + + // 解密 + String decryptedText = KmcCryptoUtil.decrypt(ciphertext, TEST_KEY_ID); + + // 验证解密结果 + assertNotNull(decryptedText); + assertEquals(TEST_PLAINTEXT, decryptedText); + } + + @Test + @DisplayName("测试默认密钥加解密") + void testDefaultKeyEncryptDecrypt() { + // 使用默认密钥加密 + String ciphertext = KmcCryptoUtil.encrypt(TEST_PLAINTEXT); + + // 验证加密结果 + assertNotNull(ciphertext); + assertNotEquals(TEST_PLAINTEXT, ciphertext); + + // 使用默认密钥解密 + String decryptedText = KmcCryptoUtil.decrypt(ciphertext); + + // 验证解密结果 + assertEquals(TEST_PLAINTEXT, decryptedText); + } + + @Test + @DisplayName("测试不同密钥的加解密") + void testDifferentKeys() { + String keyId1 = "key1"; + String keyId2 = "key2"; + + // 生成两个不同的密钥 + KmcCryptoUtil.generateAndCacheKey(keyId1); + KmcCryptoUtil.generateAndCacheKey(keyId2); + + // 使用第一个密钥加密 + String ciphertext1 = KmcCryptoUtil.encrypt(TEST_PLAINTEXT, keyId1); + + // 使用第二个密钥加密 + String ciphertext2 = KmcCryptoUtil.encrypt(TEST_PLAINTEXT, keyId2); + + // 验证不同密钥产生的密文不同 + assertNotEquals(ciphertext1, ciphertext2); + + // 验证只能用对应的密钥解密 + assertEquals(TEST_PLAINTEXT, KmcCryptoUtil.decrypt(ciphertext1, keyId1)); + assertEquals(TEST_PLAINTEXT, KmcCryptoUtil.decrypt(ciphertext2, keyId2)); + + // 验证用错误的密钥解密会失败 + assertThrows(RuntimeException.class, () -> { + KmcCryptoUtil.decrypt(ciphertext1, keyId2); + }); + } + + @Test + @DisplayName("测试空字符串和null值处理") + void testEmptyAndNullValues() { + KmcCryptoUtil.generateAndCacheKey(TEST_KEY_ID); + + // 测试空字符串 + assertThrows(IllegalArgumentException.class, () -> { + KmcCryptoUtil.encrypt("", TEST_KEY_ID); + }); + + assertThrows(IllegalArgumentException.class, () -> { + KmcCryptoUtil.decrypt("", TEST_KEY_ID); + }); + + // 测试null值 + assertThrows(IllegalArgumentException.class, () -> { + KmcCryptoUtil.encrypt(null, TEST_KEY_ID); + }); + + assertThrows(IllegalArgumentException.class, () -> { + KmcCryptoUtil.decrypt(null, TEST_KEY_ID); + }); + } + + @Test + @DisplayName("测试长文本加解密") + void testLongTextEncryptDecrypt() { + KmcCryptoUtil.generateAndCacheKey(TEST_KEY_ID); + + // 生成长文本 + StringBuilder longText = new StringBuilder(); + for (int i = 0; i < 1000; i++) { + longText.append("This is a long text for testing KMC encryption and decryption. "); + } + String longPlaintext = longText.toString(); + + // 加密长文本 + String ciphertext = KmcCryptoUtil.encrypt(longPlaintext, TEST_KEY_ID); + + // 验证加密成功 + assertNotNull(ciphertext); + assertNotEquals(longPlaintext, ciphertext); + + // 解密长文本 + String decryptedText = KmcCryptoUtil.decrypt(ciphertext, TEST_KEY_ID); + + // 验证解密成功 + assertEquals(longPlaintext, decryptedText); + } + + @Test + @DisplayName("测试特殊字符加解密") + void testSpecialCharactersEncryptDecrypt() { + KmcCryptoUtil.generateAndCacheKey(TEST_KEY_ID); + + // 包含特殊字符的文本 + String specialText = "特殊字符测试: !@#$%^&*()_+-=[]{}|;':\",./<>?`~ 中文测试 1234567890"; + + // 加密 + String ciphertext = KmcCryptoUtil.encrypt(specialText, TEST_KEY_ID); + + // 验证加密成功 + assertNotNull(ciphertext); + assertNotEquals(specialText, ciphertext); + + // 解密 + String decryptedText = KmcCryptoUtil.decrypt(ciphertext, TEST_KEY_ID); + + // 验证解密成功 + assertEquals(specialText, decryptedText); + } + + @Test + @DisplayName("测试密钥管理功能") + void testKeyManagement() { + String keyId1 = "key1"; + String keyId2 = "key2"; + + // 初始状态应该没有密钥 + assertEquals(0, KmcCryptoUtil.getKeyCount()); + + // 生成密钥 + KmcCryptoUtil.generateAndCacheKey(keyId1); + KmcCryptoUtil.generateAndCacheKey(keyId2); + + // 验证密钥数量 + assertEquals(2, KmcCryptoUtil.getKeyCount()); + + // 验证密钥存在 + assertTrue(KmcCryptoUtil.hasKey(keyId1)); + assertTrue(KmcCryptoUtil.hasKey(keyId2)); + + // 删除一个密钥 + assertTrue(KmcCryptoUtil.removeKey(keyId1)); + assertFalse(KmcCryptoUtil.hasKey(keyId1)); + assertTrue(KmcCryptoUtil.hasKey(keyId2)); + assertEquals(1, KmcCryptoUtil.getKeyCount()); + + // 清空所有密钥 + KmcCryptoUtil.clearAllKeys(); + assertEquals(0, KmcCryptoUtil.getKeyCount()); + assertFalse(KmcCryptoUtil.hasKey(keyId2)); + } + + @Test + @DisplayName("测试无效密文解密") + void testInvalidCiphertextDecrypt() { + KmcCryptoUtil.generateAndCacheKey(TEST_KEY_ID); + + // 测试无效的Base64字符串 + assertThrows(RuntimeException.class, () -> { + KmcCryptoUtil.decrypt("invalid_base64_string", TEST_KEY_ID); + }); + + // 测试太短的密文 + assertThrows(RuntimeException.class, () -> { + KmcCryptoUtil.decrypt("short", TEST_KEY_ID); + }); + + // 测试不存在的密钥 + assertThrows(RuntimeException.class, () -> { + KmcCryptoUtil.decrypt("some_ciphertext", "non_existent_key"); + }); + } + + @Test + @DisplayName("测试多次加密同一明文") + void testMultipleEncryptionOfSamePlaintext() { + KmcCryptoUtil.generateAndCacheKey(TEST_KEY_ID); + + // 多次加密同一明文 + String ciphertext1 = KmcCryptoUtil.encrypt(TEST_PLAINTEXT, TEST_KEY_ID); + String ciphertext2 = KmcCryptoUtil.encrypt(TEST_PLAINTEXT, TEST_KEY_ID); + + // 验证每次加密的结果都不同(由于随机IV) + assertNotEquals(ciphertext1, ciphertext2); + + // 验证都能正确解密 + assertEquals(TEST_PLAINTEXT, KmcCryptoUtil.decrypt(ciphertext1, TEST_KEY_ID)); + assertEquals(TEST_PLAINTEXT, KmcCryptoUtil.decrypt(ciphertext2, TEST_KEY_ID)); + } +} diff --git a/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java new file mode 100644 index 0000000..37cd6d2 --- /dev/null +++ b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java @@ -0,0 +1,418 @@ +package com.terrabase.enterprise.impl.open; + +import com.terrabase.enterprise.api.CryptoAlgorithm; +import com.terrabase.enterprise.impl.open.config.KmcConfig; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.DisplayName; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import static org.junit.jupiter.api.Assertions.*; + +/** + * 开源版企业服务KMC功能集成测试 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@SpringBootTest(classes = TestConfiguration.class) +@TestPropertySource(properties = { + "terrabase.kmc.enabled=true", + "terrabase.kmc.default-key-id=test_default", + "terrabase.kmc.enable-audit-log=true" +}) +@DisplayName("开源版企业服务KMC功能集成测试") +public class OpenEnterpriseServiceImplKmcTest { + + private OpenEnterpriseServiceImpl service; + private KmcConfig kmcConfig; + + @BeforeEach + void setUp() { + service = new OpenEnterpriseServiceImpl(); + kmcConfig = new KmcConfig(); + kmcConfig.setEnabled(true); + kmcConfig.setDefaultKeyId("test_default"); + kmcConfig.setEnableAuditLog(true); + + // 使用反射设置私有字段 + try { + var field = service.getClass().getDeclaredField("kmcConfig"); + field.setAccessible(true); + field.set(service, kmcConfig); + + // 启动服务 + var runningField = service.getClass().getDeclaredField("running"); + runningField.setAccessible(true); + var running = (java.util.concurrent.atomic.AtomicBoolean) runningField.get(service); + running.set(true); + } catch (Exception e) { + throw new RuntimeException("设置KMC配置失败", e); + } + } + + @Test + @DisplayName("测试服务初始化") + void testServiceInitialization() { + // 验证服务信息 + assertEquals("Open Source Enterprise Service", service.getServiceName()); + assertEquals("1.0.0-open", service.getServiceVersion()); + assertEquals("open", service.getServiceType()); + + // 验证健康状态 + String healthStatus = service.getHealthStatus(); + assertTrue(healthStatus.contains("正常")); + assertTrue(healthStatus.contains("开源版")); + } + + @Test + @DisplayName("测试KMC加密功能") + void testKmcEncryption() { + String plaintext = "测试KMC加密功能"; + + // 执行加密(使用默认AES算法) + String result = service.encrypt(plaintext, CryptoAlgorithm.AES); + + // 验证结果 + assertNotNull(result); + assertTrue(result.contains("开源版KMC加密成功")); + assertTrue(result.contains("[AES]")); + + // 提取密文部分进行验证 + String ciphertext = result.substring(result.indexOf(": ") + 2); + assertNotNull(ciphertext); + assertTrue(ciphertext.length() > 0); + } + + @Test + @DisplayName("测试KMC解密功能") + void testKmcDecryption() { + String plaintext = "测试KMC解密功能"; + + // 先加密 + String encryptResult = service.encrypt(plaintext, CryptoAlgorithm.AES); + assertTrue(encryptResult.contains("开源版KMC加密成功")); + assertTrue(encryptResult.contains("[AES]")); + + // 提取密文 + String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + + // 执行解密 + String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.AES); + + // 验证结果 + assertNotNull(decryptResult); + assertTrue(decryptResult.contains("开源版KMC解密成功")); + assertTrue(decryptResult.contains("[AES]")); + assertTrue(decryptResult.contains(plaintext)); + } + + @Test + @DisplayName("测试完整的加解密流程") + void testCompleteEncryptDecryptFlow() { + String originalText = "完整的KMC加解密流程测试数据"; + + // 加密 + String encryptResult = service.encrypt(originalText, CryptoAlgorithm.AES); + assertTrue(encryptResult.contains("开源版KMC加密成功")); + assertTrue(encryptResult.contains("[AES]")); + + // 提取密文 + String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + + // 解密 + String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.AES); + assertTrue(decryptResult.contains("开源版KMC解密成功")); + assertTrue(decryptResult.contains("[AES]")); + + // 验证原文和最终解密结果一致 + String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); + assertEquals(originalText, finalDecryptedText); + } + + @Test + @DisplayName("测试空字符串处理") + void testEmptyStringHandling() { + // 测试空字符串加密 + String emptyResult = service.encrypt("", CryptoAlgorithm.AES); + assertTrue(emptyResult.contains("明文数据不能为空")); + + // 测试空字符串解密 + String emptyDecryptResult = service.decrypt("", CryptoAlgorithm.AES); + assertTrue(emptyDecryptResult.contains("密文数据不能为空")); + } + + @Test + @DisplayName("测试null值处理") + void testNullValueHandling() { + // 测试null值加密 + String nullResult = service.encrypt(null, CryptoAlgorithm.AES); + assertTrue(nullResult.contains("明文数据不能为空")); + + // 测试null值解密 + String nullDecryptResult = service.decrypt(null, CryptoAlgorithm.AES); + assertTrue(nullDecryptResult.contains("密文数据不能为空")); + } + + @Test + @DisplayName("测试KMC功能禁用时的行为") + void testKmcDisabledBehavior() { + // 禁用KMC功能 + kmcConfig.setEnabled(false); + + // 测试加密 + String encryptResult = service.encrypt("测试数据", CryptoAlgorithm.AES); + assertTrue(encryptResult.contains("KMC功能未启用")); + + // 测试解密 + String decryptResult = service.decrypt("测试密文", CryptoAlgorithm.AES); + assertTrue(decryptResult.contains("KMC功能未启用")); + } + + @Test + @DisplayName("测试服务未运行时的行为") + void testServiceNotRunningBehavior() { + // 创建一个未启动的服务实例 + OpenEnterpriseServiceImpl stoppedService = new OpenEnterpriseServiceImpl(); + try { + var field = stoppedService.getClass().getDeclaredField("kmcConfig"); + field.setAccessible(true); + field.set(stoppedService, kmcConfig); + } catch (Exception e) { + throw new RuntimeException("设置KMC配置失败", e); + } + + // 测试加密 + String encryptResult = stoppedService.encrypt("测试数据", CryptoAlgorithm.AES); + assertTrue(encryptResult.contains("服务未运行")); + + // 测试解密 + String decryptResult = stoppedService.decrypt("测试密文", CryptoAlgorithm.AES); + assertTrue(decryptResult.contains("服务未运行")); + } + + @Test + @DisplayName("测试特殊字符加解密") + void testSpecialCharactersEncryptDecrypt() { + String specialText = "特殊字符测试: !@#$%^&*()_+-=[]{}|;':\",./<>?`~ 中文测试 1234567890"; + + // 加密 + String encryptResult = service.encrypt(specialText, CryptoAlgorithm.AES); + assertTrue(encryptResult.contains("开源版KMC加密成功")); + assertTrue(encryptResult.contains("[AES]")); + + // 提取密文 + String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + + // 解密 + String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.AES); + assertTrue(decryptResult.contains("开源版KMC解密成功")); + assertTrue(decryptResult.contains("[AES]")); + + // 验证原文和最终解密结果一致 + String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); + assertEquals(specialText, finalDecryptedText); + } + + @Test + @DisplayName("测试长文本加解密") + void testLongTextEncryptDecrypt() { + // 生成长文本 + StringBuilder longText = new StringBuilder(); + for (int i = 0; i < 100; i++) { + longText.append("这是一个用于测试KMC加解密功能的长文本数据。"); + } + String longPlaintext = longText.toString(); + + // 加密 + String encryptResult = service.encrypt(longPlaintext, CryptoAlgorithm.AES); + assertTrue(encryptResult.contains("开源版KMC加密成功")); + assertTrue(encryptResult.contains("[AES]")); + + // 提取密文 + String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + + // 解密 + String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.AES); + assertTrue(decryptResult.contains("开源版KMC解密成功")); + assertTrue(decryptResult.contains("[AES]")); + + // 验证原文和最终解密结果一致 + String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); + assertEquals(longPlaintext, finalDecryptedText); + } + + @Test + @DisplayName("测试多次加密同一明文") + void testMultipleEncryptionOfSamePlaintext() { + String plaintext = "多次加密测试数据"; + + // 第一次加密 + String encryptResult1 = service.encrypt(plaintext, CryptoAlgorithm.AES); + assertTrue(encryptResult1.contains("开源版KMC加密成功")); + assertTrue(encryptResult1.contains("[AES]")); + String ciphertext1 = encryptResult1.substring(encryptResult1.indexOf(": ") + 2); + + // 第二次加密 + String encryptResult2 = service.encrypt(plaintext, CryptoAlgorithm.AES); + assertTrue(encryptResult2.contains("开源版KMC加密成功")); + assertTrue(encryptResult2.contains("[AES]")); + String ciphertext2 = encryptResult2.substring(encryptResult2.indexOf(": ") + 2); + + // 验证两次加密的结果不同(由于随机IV) + assertNotEquals(ciphertext1, ciphertext2); + + // 验证两次加密都能正确解密 + String decryptResult1 = service.decrypt(ciphertext1, CryptoAlgorithm.AES); + String decryptResult2 = service.decrypt(ciphertext2, CryptoAlgorithm.AES); + + assertTrue(decryptResult1.contains("开源版KMC解密成功")); + assertTrue(decryptResult1.contains("[AES]")); + assertTrue(decryptResult2.contains("开源版KMC解密成功")); + assertTrue(decryptResult2.contains("[AES]")); + + String finalDecryptedText1 = decryptResult1.substring(decryptResult1.indexOf(": ") + 2); + String finalDecryptedText2 = decryptResult2.substring(decryptResult2.indexOf(": ") + 2); + + assertEquals(plaintext, finalDecryptedText1); + assertEquals(plaintext, finalDecryptedText2); + } + + @Test + @DisplayName("测试RSA加密算法") + void testRsaEncryption() { + String plaintext = "RSA加密测试数据"; + + // 加密 + String encryptResult = service.encrypt(plaintext, CryptoAlgorithm.RSA); + assertTrue(encryptResult.contains("开源版KMC加密成功")); + assertTrue(encryptResult.contains("[RSA]")); + + // 提取密文 + String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + + // 解密 + String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.RSA); + assertTrue(decryptResult.contains("开源版KMC解密成功")); + assertTrue(decryptResult.contains("[RSA]")); + + // 验证原文和最终解密结果一致 + String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); + assertEquals(plaintext, finalDecryptedText); + } + + @Test + @DisplayName("测试DES加密算法") + void testDesEncryption() { + String plaintext = "DES加密测试数据"; + + // 加密 + String encryptResult = service.encrypt(plaintext, CryptoAlgorithm.DES); + assertTrue(encryptResult.contains("开源版KMC加密成功")); + assertTrue(encryptResult.contains("[DES]")); + + // 提取密文 + String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + + // 解密 + String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.DES); + assertTrue(decryptResult.contains("开源版KMC解密成功")); + assertTrue(decryptResult.contains("[DES]")); + + // 验证原文和最终解密结果一致 + String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); + assertEquals(plaintext, finalDecryptedText); + } + + @Test + @DisplayName("测试3DES加密算法") + void testTripleDesEncryption() { + String plaintext = "3DES加密测试数据"; + + // 加密 + String encryptResult = service.encrypt(plaintext, CryptoAlgorithm.TRIPLE_DES); + assertTrue(encryptResult.contains("开源版KMC加密成功")); + assertTrue(encryptResult.contains("[DESede]")); + + // 提取密文 + String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + + // 解密 + String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.TRIPLE_DES); + assertTrue(decryptResult.contains("开源版KMC解密成功")); + assertTrue(decryptResult.contains("[DESede]")); + + // 验证原文和最终解密结果一致 + String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); + assertEquals(plaintext, finalDecryptedText); + } + + @Test + @DisplayName("测试Blowfish加密算法") + void testBlowfishEncryption() { + String plaintext = "Blowfish加密测试数据"; + + // 加密 + String encryptResult = service.encrypt(plaintext, CryptoAlgorithm.BLOWFISH); + assertTrue(encryptResult.contains("开源版KMC加密成功")); + assertTrue(encryptResult.contains("[Blowfish]")); + + // 提取密文 + String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + + // 解密 + String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.BLOWFISH); + assertTrue(decryptResult.contains("开源版KMC解密成功")); + assertTrue(decryptResult.contains("[Blowfish]")); + + // 验证原文和最终解密结果一致 + String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); + assertEquals(plaintext, finalDecryptedText); + } + + @Test + @DisplayName("测试ChaCha20加密算法") + void testChaCha20Encryption() { + String plaintext = "ChaCha20加密测试数据"; + + // 加密 + String encryptResult = service.encrypt(plaintext, CryptoAlgorithm.CHACHA20); + assertTrue(encryptResult.contains("开源版KMC加密成功")); + assertTrue(encryptResult.contains("[ChaCha20]")); + + // 提取密文 + String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + + // 解密 + String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.CHACHA20); + assertTrue(decryptResult.contains("开源版KMC解密成功")); + assertTrue(decryptResult.contains("[ChaCha20]")); + + // 验证原文和最终解密结果一致 + String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); + assertEquals(plaintext, finalDecryptedText); + } + + @Test + @DisplayName("测试null算法参数(应该使用默认AES)") + void testNullAlgorithmParameter() { + String plaintext = "测试null算法参数"; + + // 加密(传递null算法参数) + String encryptResult = service.encrypt(plaintext, null); + assertTrue(encryptResult.contains("开源版KMC加密成功")); + assertTrue(encryptResult.contains("[AES]")); // 应该使用默认AES + + // 提取密文 + String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + + // 解密(传递null算法参数) + String decryptResult = service.decrypt(ciphertext, null); + assertTrue(decryptResult.contains("开源版KMC解密成功")); + assertTrue(decryptResult.contains("[AES]")); // 应该使用默认AES + + // 验证原文和最终解密结果一致 + String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); + assertEquals(plaintext, finalDecryptedText); + } +} diff --git a/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/TestConfiguration.java b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/TestConfiguration.java new file mode 100644 index 0000000..4fe17ef --- /dev/null +++ b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/TestConfiguration.java @@ -0,0 +1,28 @@ +package com.terrabase.enterprise.impl.open; + +import com.terrabase.enterprise.impl.open.config.KmcConfig; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.context.annotation.Bean; + +/** + * 测试配置类 + * 为Spring Boot测试提供必要的配置 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@SpringBootConfiguration +public class TestConfiguration { + + /** + * KMC配置Bean + */ + @Bean + public KmcConfig kmcConfig() { + KmcConfig config = new KmcConfig(); + config.setEnabled(true); + config.setDefaultKeyId("test_default"); + config.setEnableAuditLog(true); + return config; + } +} diff --git a/pom.xml b/pom.xml index 36fb8ab..101204e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,17 +5,17 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.example - project-name + com.terrabase + terrabase 1.0.0 - jar + pom - Project Name - Project description + Terrabase + Terrabase - 企业级数据使能平台 business-app - enterprise-app + enterprise-api enterprise-impl-commercial enterprise-impl-open @@ -24,5 +24,78 @@ 17 17 UTF-8 + 3.2.0 + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + + + aliyun-maven + Aliyun Maven Repository + https://maven.aliyun.com/repository/public + + true + + + false + + + + central + Maven Central Repository + https://repo1.maven.org/maven2 + + true + + + false + + + + + + + aliyun-maven + Aliyun Maven Plugin Repository + https://maven.aliyun.com/repository/public + + true + + + false + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 17 + 17 + + + + + From 4d3b01b4f72927e7da99e397ecfa1adfe4b5a22b Mon Sep 17 00:00:00 2001 From: panyehong <2655992392@qq.com> Date: Mon, 29 Sep 2025 21:02:04 +0800 Subject: [PATCH 2/6] =?UTF-8?q?[feat]Terrabase=E6=8B=86?= =?UTF-8?q?=E5=88=86=E6=8E=A5=E5=8F=A3=E5=90=8E=E7=9A=84=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/BusinessApplication.java | 9 + .../controller/CertificateController.java | 340 ++++++++++++++ .../business/controller/CryptoController.java | 243 ++++++++++ .../controller/EnterpriseController.java | 109 +---- .../controller/LogManagementController.java | 273 +++++++++++ .../controller/MonitoringController.java | 380 +++++++++++++++ .../controller/UserManagementController.java | 264 +++++++++++ .../terrabase/business/util/JarLoadUtil.java | 297 +++++++++++- .../src/main/resources/application.properties | 4 + .../enterprise/api/CertificateService.java | 88 ++++ .../enterprise/api/CryptoService.java | 71 +++ .../enterprise/api/EnterpriseService.java | 17 +- .../enterprise/api/LogManagementService.java | 69 +++ .../enterprise/api/MonitoringService.java | 84 ++++ .../enterprise/api/UserManagementService.java | 89 ++++ .../enterprise/api/dto/AlarmDetail.java | 240 ++++++++++ .../enterprise/api/dto/AlarmInfo.java | 170 +++++++ .../enterprise/api/dto/AuthorityInfos.java | 161 +++++++ .../enterprise/api/dto/CaCertificate.java | 140 ++++++ .../enterprise/api/dto/CertCollectInfo.java | 183 ++++++++ .../enterprise/api/dto/CertificateDetail.java | 110 +++++ .../enterprise/api/dto/EventDefine.java | 155 ++++++ .../enterprise/api/dto/EventInfo.java | 183 ++++++++ .../enterprise/api/dto/EventQueryParams.java | 154 ++++++ .../enterprise/api/dto/ForbiddenBody.java | 114 +++++ .../enterprise/api/dto/LicenseInfo.java | 168 +++++++ .../enterprise/api/dto/LogI18NS.java | 133 ++++++ .../terrabase/enterprise/api/dto/Logs.java | 219 +++++++++ .../enterprise/api/dto/MenuRegisterInfo.java | 203 ++++++++ .../enterprise/api/dto/PageResult.java | 133 ++++++ .../api/dto/RegisterCertificate.java | 113 +++++ .../enterprise/api/dto/RoleRegister.java | 112 +++++ .../enterprise/api/dto/Subscribe.java | 114 +++++ .../CommercialCertificateServiceImpl.java | 401 ++++++++++++++++ .../CommercialCryptoServiceImpl.java | 218 +++++++++ .../CommercialEnterpriseServiceImpl.java | 91 +--- .../CommercialLogManagementServiceImpl.java | 210 +++++++++ .../CommercialMonitoringServiceImpl.java | 374 +++++++++++++++ .../CommercialUserManagementServiceImpl.java | 380 +++++++++++++++ enterprise-impl-open/KMC_README.md | 234 ++++++++++ .../impl/open/OpenCertificateServiceImpl.java | 211 +++++++++ .../impl/open/OpenCryptoServiceImpl.java | 154 ++++++ .../impl/open/OpenEnterpriseServiceImpl.java | 89 +--- .../open/OpenLogManagementServiceImpl.java | 129 +++++ .../impl/open/OpenMonitoringServiceImpl.java | 219 +++++++++ .../open/OpenUserManagementServiceImpl.java | 225 +++++++++ ...nEnterpriseServiceImplIntegrationTest.java | 223 +++++++++ .../OpenEnterpriseServiceImplKmcTest.java | 441 ++++++------------ 48 files changed, 8136 insertions(+), 605 deletions(-) create mode 100644 business-app/src/main/java/com/terrabase/business/controller/CertificateController.java create mode 100644 business-app/src/main/java/com/terrabase/business/controller/CryptoController.java create mode 100644 business-app/src/main/java/com/terrabase/business/controller/LogManagementController.java create mode 100644 business-app/src/main/java/com/terrabase/business/controller/MonitoringController.java create mode 100644 business-app/src/main/java/com/terrabase/business/controller/UserManagementController.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/CertificateService.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/CryptoService.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/LogManagementService.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/MonitoringService.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/UserManagementService.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmDetail.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmInfo.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AuthorityInfos.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CaCertificate.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertCollectInfo.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertificateDetail.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventDefine.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventInfo.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventQueryParams.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/ForbiddenBody.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LicenseInfo.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LogI18NS.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Logs.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/MenuRegisterInfo.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/PageResult.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RegisterCertificate.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleRegister.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Subscribe.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCertificateServiceImpl.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCryptoServiceImpl.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialLogManagementServiceImpl.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialMonitoringServiceImpl.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialUserManagementServiceImpl.java create mode 100644 enterprise-impl-open/KMC_README.md create mode 100644 enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCertificateServiceImpl.java create mode 100644 enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCryptoServiceImpl.java create mode 100644 enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenLogManagementServiceImpl.java create mode 100644 enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenMonitoringServiceImpl.java create mode 100644 enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenUserManagementServiceImpl.java create mode 100644 enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplIntegrationTest.java diff --git a/business-app/src/main/java/com/terrabase/business/BusinessApplication.java b/business-app/src/main/java/com/terrabase/business/BusinessApplication.java index fab5c51..1536d58 100644 --- a/business-app/src/main/java/com/terrabase/business/BusinessApplication.java +++ b/business-app/src/main/java/com/terrabase/business/BusinessApplication.java @@ -9,6 +9,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import org.springframework.web.client.RestTemplate; /** * Terrabase 业务应用主启动类 @@ -33,6 +34,14 @@ public static void main(String[] args) { SpringApplication.run(BusinessApplication.class, args); } + /** + * 配置RestTemplate Bean + */ + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + /** * 应用启动后执行初始化逻辑 */ diff --git a/business-app/src/main/java/com/terrabase/business/controller/CertificateController.java b/business-app/src/main/java/com/terrabase/business/controller/CertificateController.java new file mode 100644 index 0000000..3b69c52 --- /dev/null +++ b/business-app/src/main/java/com/terrabase/business/controller/CertificateController.java @@ -0,0 +1,340 @@ +package com.terrabase.business.controller; + +import com.terrabase.business.util.JarLoadUtil; +import com.terrabase.enterprise.api.CertificateService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * 证书管理服务控制器 + * 负责提供证书管理相关的REST API接口 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@RestController +@RequestMapping("/api/enterprise/certificate") +@CrossOrigin(origins = "*") +public class CertificateController { + + private static final Logger logger = LoggerFactory.getLogger(CertificateController.class); + + @Autowired + private JarLoadUtil jarLoadUtil; + + /** + * 获取证书管理服务信息 + */ + @GetMapping("/info") + public ResponseEntity> getCertificateServiceInfo() { + try { + CertificateService certService = jarLoadUtil.loadCertificateService(); + + Map info = new HashMap<>(); + info.put("serviceName", certService.getServiceName()); + info.put("serviceVersion", certService.getServiceVersion()); + info.put("serviceType", certService.getServiceType()); + info.put("healthStatus", certService.getHealthStatus()); + + return ResponseEntity.ok(info); + + } catch (Exception e) { + logger.error("获取证书管理服务信息失败", e); + Map error = new HashMap<>(); + error.put("error", "获取证书管理服务信息失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 生成证书 + */ + @PostMapping("/generate") + public ResponseEntity> generateCertificate(@RequestBody Map request) { + try { + String commonName = (String) request.get("commonName"); + String organization = (String) request.get("organization"); + String validityDays = (String) request.get("validityDays"); + String keySize = (String) request.get("keySize"); + + if (commonName == null || commonName.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "通用名称(CN)不能为空"); + return ResponseEntity.badRequest().body(error); + } + + CertificateService certService = jarLoadUtil.loadCertificateService(); + + // 这里应该调用实际的证书生成方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "证书生成成功"); + response.put("certificateId", "cert_" + System.currentTimeMillis()); + response.put("commonName", commonName); + response.put("organization", organization); + response.put("validityDays", validityDays != null ? validityDays : "365"); + response.put("keySize", keySize != null ? keySize : "2048"); + response.put("serviceType", certService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("生成证书失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "生成证书失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取证书信息 + */ + @GetMapping("/{certificateId}") + public ResponseEntity> getCertificateInfo(@PathVariable String certificateId) { + try { + if (certificateId == null || certificateId.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "证书ID不能为空"); + return ResponseEntity.badRequest().body(error); + } + + CertificateService certService = jarLoadUtil.loadCertificateService(); + + // 这里应该调用实际的证书信息获取方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("certificateId", certificateId); + response.put("commonName", "example.com"); + response.put("organization", "Example Organization"); + response.put("validFrom", "2024-01-01T00:00:00Z"); + response.put("validTo", "2025-01-01T00:00:00Z"); + response.put("status", "ACTIVE"); + response.put("serviceType", certService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("获取证书信息失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "获取证书信息失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 验证证书 + */ + @PostMapping("/validate") + public ResponseEntity> validateCertificate(@RequestBody Map request) { + try { + String certificateData = request.get("certificateData"); + String certificateId = request.get("certificateId"); + + if (certificateData == null && certificateId == null) { + Map error = new HashMap<>(); + error.put("error", "证书数据或证书ID必须提供其中一个"); + return ResponseEntity.badRequest().body(error); + } + + CertificateService certService = jarLoadUtil.loadCertificateService(); + + // 这里应该调用实际的证书验证方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("valid", true); + response.put("message", "证书验证通过"); + response.put("certificateId", certificateId); + response.put("serviceType", certService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("验证证书失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "验证证书失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取证书列表 + */ + @GetMapping("/list") + public ResponseEntity> getCertificateList(@RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size, + @RequestParam(required = false) String status) { + try { + CertificateService certService = jarLoadUtil.loadCertificateService(); + + // 这里应该调用实际的证书列表查询方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("certificates", new java.util.ArrayList<>()); // 模拟空列表 + response.put("page", page); + response.put("size", size); + response.put("total", 0); + response.put("filters", Map.of("status", status)); + response.put("serviceType", certService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("获取证书列表失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "获取证书列表失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 撤销证书 + */ + @PostMapping("/{certificateId}/revoke") + public ResponseEntity> revokeCertificate(@PathVariable String certificateId, + @RequestBody Map request) { + try { + if (certificateId == null || certificateId.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "证书ID不能为空"); + return ResponseEntity.badRequest().body(error); + } + + String reason = request.get("reason"); + + CertificateService certService = jarLoadUtil.loadCertificateService(); + + // 这里应该调用实际的证书撤销方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "证书撤销成功"); + response.put("certificateId", certificateId); + response.put("reason", reason); + response.put("revokedAt", System.currentTimeMillis()); + response.put("serviceType", certService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("撤销证书失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "撤销证书失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 更新证书 + */ + @PutMapping("/{certificateId}") + public ResponseEntity> updateCertificate(@PathVariable String certificateId, + @RequestBody Map request) { + try { + if (certificateId == null || certificateId.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "证书ID不能为空"); + return ResponseEntity.badRequest().body(error); + } + + CertificateService certService = jarLoadUtil.loadCertificateService(); + + // 这里应该调用实际的证书更新方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "证书更新成功"); + response.put("certificateId", certificateId); + response.put("serviceType", certService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("更新证书失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "更新证书失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 删除证书 + */ + @DeleteMapping("/{certificateId}") + public ResponseEntity> deleteCertificate(@PathVariable String certificateId) { + try { + if (certificateId == null || certificateId.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "证书ID不能为空"); + return ResponseEntity.badRequest().body(error); + } + + CertificateService certService = jarLoadUtil.loadCertificateService(); + + // 这里应该调用实际的证书删除方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "证书删除成功"); + response.put("certificateId", certificateId); + response.put("serviceType", certService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("删除证书失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "删除证书失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取证书统计信息 + */ + @GetMapping("/statistics") + public ResponseEntity> getCertificateStatistics() { + try { + CertificateService certService = jarLoadUtil.loadCertificateService(); + + // 这里应该调用实际的证书统计方法 + Map statistics = new HashMap<>(); + statistics.put("totalCertificates", 0); + statistics.put("activeCertificates", 0); + statistics.put("expiredCertificates", 0); + statistics.put("revokedCertificates", 0); + statistics.put("expiringSoon", 0); + + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("statistics", statistics); + response.put("serviceType", certService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("获取证书统计信息失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "获取证书统计信息失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } +} diff --git a/business-app/src/main/java/com/terrabase/business/controller/CryptoController.java b/business-app/src/main/java/com/terrabase/business/controller/CryptoController.java new file mode 100644 index 0000000..1dfaab5 --- /dev/null +++ b/business-app/src/main/java/com/terrabase/business/controller/CryptoController.java @@ -0,0 +1,243 @@ +package com.terrabase.business.controller; + +import com.terrabase.business.util.JarLoadUtil; +import com.terrabase.enterprise.api.CryptoService; +import com.terrabase.enterprise.api.CryptoAlgorithm; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * 加解密服务控制器 + * 负责提供数据加解密相关的REST API接口 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@RestController +@RequestMapping("/api/enterprise/crypto") +@CrossOrigin(origins = "*") +public class CryptoController { + + private static final Logger logger = LoggerFactory.getLogger(CryptoController.class); + + @Autowired + private JarLoadUtil jarLoadUtil; + + /** + * 获取加解密服务信息 + */ + @GetMapping("/info") + public ResponseEntity> getCryptoServiceInfo() { + try { + CryptoService cryptoService = jarLoadUtil.loadCryptoService(); + + Map info = new HashMap<>(); + info.put("serviceName", cryptoService.getServiceName()); + info.put("serviceVersion", cryptoService.getServiceVersion()); + info.put("serviceType", cryptoService.getServiceType()); + info.put("healthStatus", cryptoService.getHealthStatus()); + + return ResponseEntity.ok(info); + + } catch (Exception e) { + logger.error("获取加解密服务信息失败", e); + Map error = new HashMap<>(); + error.put("error", "获取加解密服务信息失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 数据加密接口 + */ + @PostMapping("/encrypt") + public ResponseEntity> encrypt(@RequestBody Map request) { + try { + String plaintext = request.get("plaintext"); + String algorithmName = request.get("algorithm"); + + if (plaintext == null || plaintext.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "明文数据不能为空"); + return ResponseEntity.badRequest().body(error); + } + + CryptoService cryptoService = jarLoadUtil.loadCryptoService(); + + // 解析算法参数,如果未提供则使用默认AES + CryptoAlgorithm algorithm = CryptoAlgorithm.fromString(algorithmName); + String result = cryptoService.encrypt(plaintext, algorithm); + + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("ciphertext", result); + response.put("serviceType", cryptoService.getServiceType()); + response.put("algorithm", algorithm.getAlgorithm()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("数据加密失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "数据加密失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 数据解密接口 + */ + @PostMapping("/decrypt") + public ResponseEntity> decrypt(@RequestBody Map request) { + try { + String ciphertext = request.get("ciphertext"); + String algorithmName = request.get("algorithm"); + + if (ciphertext == null || ciphertext.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "密文数据不能为空"); + return ResponseEntity.badRequest().body(error); + } + + CryptoService cryptoService = jarLoadUtil.loadCryptoService(); + + // 解析算法参数,如果未提供则使用默认AES + CryptoAlgorithm algorithm = CryptoAlgorithm.fromString(algorithmName); + String result = cryptoService.decrypt(ciphertext, algorithm); + + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("result", result); + response.put("serviceType", cryptoService.getServiceType()); + response.put("algorithm", algorithm.getAlgorithm()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("数据解密失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "数据解密失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取支持的加密算法列表 + */ + @GetMapping("/algorithms") + public ResponseEntity> getSupportedAlgorithms() { + try { + Map response = new HashMap<>(); + response.put("success", true); + response.put("algorithms", CryptoAlgorithm.values()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("获取支持的加密算法列表失败", e); + Map error = new HashMap<>(); + error.put("success", false); + error.put("error", "获取支持的加密算法列表失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 批量加密接口 + */ + @PostMapping("/encrypt/batch") + public ResponseEntity> batchEncrypt(@RequestBody Map request) { + try { + @SuppressWarnings("unchecked") + java.util.List plaintexts = (java.util.List) request.get("plaintexts"); + String algorithmName = (String) request.get("algorithm"); + + if (plaintexts == null || plaintexts.isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "明文数据列表不能为空"); + return ResponseEntity.badRequest().body(error); + } + + CryptoService cryptoService = jarLoadUtil.loadCryptoService(); + CryptoAlgorithm algorithm = CryptoAlgorithm.fromString(algorithmName); + + java.util.List results = new java.util.ArrayList<>(); + for (String plaintext : plaintexts) { + String encrypted = cryptoService.encrypt(plaintext, algorithm); + results.add(encrypted); + } + + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("ciphertexts", results); + response.put("serviceType", cryptoService.getServiceType()); + response.put("algorithm", algorithm.getAlgorithm()); + response.put("count", results.size()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("批量加密失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "批量加密失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 批量解密接口 + */ + @PostMapping("/decrypt/batch") + public ResponseEntity> batchDecrypt(@RequestBody Map request) { + try { + @SuppressWarnings("unchecked") + java.util.List ciphertexts = (java.util.List) request.get("ciphertexts"); + String algorithmName = (String) request.get("algorithm"); + + if (ciphertexts == null || ciphertexts.isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "密文数据列表不能为空"); + return ResponseEntity.badRequest().body(error); + } + + CryptoService cryptoService = jarLoadUtil.loadCryptoService(); + CryptoAlgorithm algorithm = CryptoAlgorithm.fromString(algorithmName); + + java.util.List results = new java.util.ArrayList<>(); + for (String ciphertext : ciphertexts) { + String decrypted = cryptoService.decrypt(ciphertext, algorithm); + results.add(decrypted); + } + + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("results", results); + response.put("serviceType", cryptoService.getServiceType()); + response.put("algorithm", algorithm.getAlgorithm()); + response.put("count", results.size()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("批量解密失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "批量解密失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } +} diff --git a/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java b/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java index 049a398..5990fca 100644 --- a/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java +++ b/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java @@ -2,7 +2,6 @@ import com.terrabase.business.util.JarLoadUtil; import com.terrabase.enterprise.api.EnterpriseService; -import com.terrabase.enterprise.api.CryptoAlgorithm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -13,8 +12,8 @@ import java.util.Map; /** - * 企业服务控制器 - * 提供REST API接口来演示动态加载的企业服务功能 + * 企业服务主控制器 + * 负责企业服务的基础功能:服务信息、健康状态、配置管理、服务重载等 * * @author Terrabase Team * @version 1.0.0 @@ -132,102 +131,26 @@ public ResponseEntity> getConfig() { } /** - * 数据加密接口 + * 获取所有子服务信息概览 */ - @PostMapping("/encrypt") - public ResponseEntity> encrypt(@RequestBody Map request) { + @GetMapping("/services/overview") + public ResponseEntity> getServicesOverview() { try { - String plaintext = request.get("plaintext"); - String algorithmName = request.get("algorithm"); + Map overview = new HashMap<>(); + overview.put("enterpriseMode", jarLoadUtil.getEnterpriseMode()); + overview.put("availableServices", new String[]{ + "crypto", "userManagement", "logManagement", + "certificate", "monitoring" + }); + overview.put("timestamp", System.currentTimeMillis()); - if (plaintext == null || plaintext.trim().isEmpty()) { - Map error = new HashMap<>(); - error.put("error", "明文数据不能为空"); - return ResponseEntity.badRequest().body(error); - } - - EnterpriseService service = jarLoadUtil.loadEnterpriseService(); - - // 解析算法参数,如果未提供则使用默认AES - CryptoAlgorithm algorithm = CryptoAlgorithm.fromString(algorithmName); - String result = service.encrypt(plaintext, algorithm); - - Map response = new HashMap<>(); - response.put("success", true); - response.put("result", result); - response.put("serviceType", service.getServiceType()); - response.put("algorithm", algorithm.getAlgorithm()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("数据加密失败", e); - Map error = new HashMap<>(); - error.put("success", false); - error.put("error", "数据加密失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 数据解密接口 - */ - @PostMapping("/decrypt") - public ResponseEntity> decrypt(@RequestBody Map request) { - try { - String ciphertext = request.get("ciphertext"); - String algorithmName = request.get("algorithm"); - - if (ciphertext == null || ciphertext.trim().isEmpty()) { - Map error = new HashMap<>(); - error.put("error", "密文数据不能为空"); - return ResponseEntity.badRequest().body(error); - } - - EnterpriseService service = jarLoadUtil.loadEnterpriseService(); - - // 解析算法参数,如果未提供则使用默认AES - CryptoAlgorithm algorithm = CryptoAlgorithm.fromString(algorithmName); - String result = service.decrypt(ciphertext, algorithm); - - Map response = new HashMap<>(); - response.put("success", true); - response.put("result", result); - response.put("serviceType", service.getServiceType()); - response.put("algorithm", algorithm.getAlgorithm()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("数据解密失败", e); - Map error = new HashMap<>(); - error.put("success", false); - error.put("error", "数据解密失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 获取支持的加密算法列表 - */ - @GetMapping("/algorithms") - public ResponseEntity> getSupportedAlgorithms() { - try { - Map response = new HashMap<>(); - response.put("success", true); - response.put("algorithms", CryptoAlgorithm.values()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); + return ResponseEntity.ok(overview); } catch (Exception e) { - logger.error("获取支持的加密算法列表失败", e); + logger.error("获取服务概览失败", e); Map error = new HashMap<>(); - error.put("success", false); - error.put("error", "获取支持的加密算法列表失败: " + e.getMessage()); + error.put("error", "获取服务概览失败: " + e.getMessage()); return ResponseEntity.internalServerError().body(error); } } -} +} \ No newline at end of file diff --git a/business-app/src/main/java/com/terrabase/business/controller/LogManagementController.java b/business-app/src/main/java/com/terrabase/business/controller/LogManagementController.java new file mode 100644 index 0000000..bca810f --- /dev/null +++ b/business-app/src/main/java/com/terrabase/business/controller/LogManagementController.java @@ -0,0 +1,273 @@ +package com.terrabase.business.controller; + +import com.terrabase.business.util.JarLoadUtil; +import com.terrabase.enterprise.api.LogManagementService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * 日志管理服务控制器 + * 负责提供日志管理相关的REST API接口 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@RestController +@RequestMapping("/api/enterprise/log") +@CrossOrigin(origins = "*") +public class LogManagementController { + + private static final Logger logger = LoggerFactory.getLogger(LogManagementController.class); + + @Autowired + private JarLoadUtil jarLoadUtil; + + /** + * 获取日志管理服务信息 + */ + @GetMapping("/info") + public ResponseEntity> getLogManagementServiceInfo() { + try { + LogManagementService logService = jarLoadUtil.loadLogManagementService(); + + Map info = new HashMap<>(); + info.put("serviceName", logService.getServiceName()); + info.put("serviceVersion", logService.getServiceVersion()); + info.put("serviceType", logService.getServiceType()); + info.put("healthStatus", logService.getHealthStatus()); + + return ResponseEntity.ok(info); + + } catch (Exception e) { + logger.error("获取日志管理服务信息失败", e); + Map error = new HashMap<>(); + error.put("error", "获取日志管理服务信息失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 记录日志 + */ + @PostMapping("/record") + public ResponseEntity> recordLog(@RequestBody Map request) { + try { + String level = (String) request.get("level"); + String message = (String) request.get("message"); + String category = (String) request.get("category"); + String userId = (String) request.get("userId"); + + if (message == null || message.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "日志消息不能为空"); + return ResponseEntity.badRequest().body(error); + } + + LogManagementService logService = jarLoadUtil.loadLogManagementService(); + + // 这里应该调用实际的日志记录方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "日志记录成功"); + response.put("level", level != null ? level : "INFO"); + response.put("category", category); + response.put("serviceType", logService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("记录日志失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "记录日志失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 查询日志 + */ + @GetMapping("/query") + public ResponseEntity> queryLogs(@RequestParam(required = false) String level, + @RequestParam(required = false) String category, + @RequestParam(required = false) String startTime, + @RequestParam(required = false) String endTime, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size) { + try { + LogManagementService logService = jarLoadUtil.loadLogManagementService(); + + // 这里应该调用实际的日志查询方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("logs", new java.util.ArrayList<>()); // 模拟空列表 + response.put("filters", Map.of( + "level", level, + "category", category, + "startTime", startTime, + "endTime", endTime + )); + response.put("page", page); + response.put("size", size); + response.put("total", 0); + response.put("serviceType", logService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("查询日志失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "查询日志失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取日志统计信息 + */ + @GetMapping("/statistics") + public ResponseEntity> getLogStatistics(@RequestParam(required = false) String startTime, + @RequestParam(required = false) String endTime) { + try { + LogManagementService logService = jarLoadUtil.loadLogManagementService(); + + // 这里应该调用实际的日志统计方法 + Map statistics = new HashMap<>(); + statistics.put("totalLogs", 0); + statistics.put("errorLogs", 0); + statistics.put("warningLogs", 0); + statistics.put("infoLogs", 0); + statistics.put("debugLogs", 0); + statistics.put("categories", new java.util.HashMap<>()); + + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("statistics", statistics); + response.put("period", Map.of("startTime", startTime, "endTime", endTime)); + response.put("serviceType", logService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("获取日志统计信息失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "获取日志统计信息失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 导出日志 + */ + @PostMapping("/export") + public ResponseEntity> exportLogs(@RequestBody Map request) { + try { + String level = (String) request.get("level"); + String category = (String) request.get("category"); + String startTime = (String) request.get("startTime"); + String endTime = (String) request.get("endTime"); + String format = (String) request.getOrDefault("format", "json"); + + LogManagementService logService = jarLoadUtil.loadLogManagementService(); + + // 这里应该调用实际的日志导出方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "日志导出任务已创建"); + response.put("exportId", "export_" + System.currentTimeMillis()); + response.put("format", format); + response.put("filters", Map.of( + "level", level, + "category", category, + "startTime", startTime, + "endTime", endTime + )); + response.put("serviceType", logService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("导出日志失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "导出日志失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 清理日志 + */ + @DeleteMapping("/cleanup") + public ResponseEntity> cleanupLogs(@RequestParam(required = false) String beforeDate, + @RequestParam(required = false) String level) { + try { + LogManagementService logService = jarLoadUtil.loadLogManagementService(); + + // 这里应该调用实际的日志清理方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "日志清理任务已创建"); + response.put("cleanupId", "cleanup_" + System.currentTimeMillis()); + response.put("filters", Map.of( + "beforeDate", beforeDate, + "level", level + )); + response.put("serviceType", logService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("清理日志失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "清理日志失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取日志配置 + */ + @GetMapping("/config") + public ResponseEntity> getLogConfig() { + try { + LogManagementService logService = jarLoadUtil.loadLogManagementService(); + + // 这里应该调用实际的日志配置获取方法 + Map config = new HashMap<>(); + config.put("maxLogSize", "100MB"); + config.put("retentionDays", 30); + config.put("logLevels", new String[]{"DEBUG", "INFO", "WARN", "ERROR"}); + config.put("categories", new String[]{"SYSTEM", "USER", "SECURITY", "AUDIT"}); + + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("config", config); + response.put("serviceType", logService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("获取日志配置失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "获取日志配置失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } +} diff --git a/business-app/src/main/java/com/terrabase/business/controller/MonitoringController.java b/business-app/src/main/java/com/terrabase/business/controller/MonitoringController.java new file mode 100644 index 0000000..256ff7a --- /dev/null +++ b/business-app/src/main/java/com/terrabase/business/controller/MonitoringController.java @@ -0,0 +1,380 @@ +package com.terrabase.business.controller; + +import com.terrabase.business.util.JarLoadUtil; +import com.terrabase.enterprise.api.MonitoringService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * 监控告警服务控制器 + * 负责提供监控告警相关的REST API接口 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@RestController +@RequestMapping("/api/enterprise/monitoring") +@CrossOrigin(origins = "*") +public class MonitoringController { + + private static final Logger logger = LoggerFactory.getLogger(MonitoringController.class); + + @Autowired + private JarLoadUtil jarLoadUtil; + + /** + * 获取监控告警服务信息 + */ + @GetMapping("/info") + public ResponseEntity> getMonitoringServiceInfo() { + try { + MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); + + Map info = new HashMap<>(); + info.put("serviceName", monitoringService.getServiceName()); + info.put("serviceVersion", monitoringService.getServiceVersion()); + info.put("serviceType", monitoringService.getServiceType()); + info.put("healthStatus", monitoringService.getHealthStatus()); + + return ResponseEntity.ok(info); + + } catch (Exception e) { + logger.error("获取监控告警服务信息失败", e); + Map error = new HashMap<>(); + error.put("error", "获取监控告警服务信息失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取系统指标 + */ + @GetMapping("/metrics") + public ResponseEntity> getMetrics(@RequestParam(required = false) String metricType, + @RequestParam(required = false) String timeRange) { + try { + MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); + + // 这里应该调用实际的指标获取方法 + Map metrics = new HashMap<>(); + metrics.put("cpuUsage", 45.2); + metrics.put("memoryUsage", 67.8); + metrics.put("diskUsage", 23.1); + metrics.put("networkIn", 1024.5); + metrics.put("networkOut", 2048.3); + metrics.put("activeConnections", 156); + metrics.put("responseTime", 125.6); + + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("metrics", metrics); + response.put("metricType", metricType); + response.put("timeRange", timeRange); + response.put("serviceType", monitoringService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("获取系统指标失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "获取系统指标失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取告警列表 + */ + @GetMapping("/alerts") + public ResponseEntity> getAlerts(@RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size, + @RequestParam(required = false) String severity, + @RequestParam(required = false) String status) { + try { + MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); + + // 这里应该调用实际的告警查询方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("alerts", new java.util.ArrayList<>()); // 模拟空列表 + response.put("page", page); + response.put("size", size); + response.put("total", 0); + response.put("filters", Map.of( + "severity", severity, + "status", status + )); + response.put("serviceType", monitoringService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("获取告警列表失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "获取告警列表失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 创建告警规则 + */ + @PostMapping("/rules") + public ResponseEntity> createAlertRule(@RequestBody Map request) { + try { + String name = (String) request.get("name"); + String metric = (String) request.get("metric"); + String condition = (String) request.get("condition"); + String threshold = (String) request.get("threshold"); + String severity = (String) request.get("severity"); + + if (name == null || name.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "告警规则名称不能为空"); + return ResponseEntity.badRequest().body(error); + } + + if (metric == null || metric.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "监控指标不能为空"); + return ResponseEntity.badRequest().body(error); + } + + MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); + + // 这里应该调用实际的告警规则创建方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "告警规则创建成功"); + response.put("ruleId", "rule_" + System.currentTimeMillis()); + response.put("name", name); + response.put("metric", metric); + response.put("condition", condition); + response.put("threshold", threshold); + response.put("severity", severity); + response.put("serviceType", monitoringService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("创建告警规则失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "创建告警规则失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取告警规则列表 + */ + @GetMapping("/rules") + public ResponseEntity> getAlertRules(@RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size) { + try { + MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); + + // 这里应该调用实际的告警规则查询方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("rules", new java.util.ArrayList<>()); // 模拟空列表 + response.put("page", page); + response.put("size", size); + response.put("total", 0); + response.put("serviceType", monitoringService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("获取告警规则列表失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "获取告警规则列表失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 更新告警规则 + */ + @PutMapping("/rules/{ruleId}") + public ResponseEntity> updateAlertRule(@PathVariable String ruleId, + @RequestBody Map request) { + try { + if (ruleId == null || ruleId.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "告警规则ID不能为空"); + return ResponseEntity.badRequest().body(error); + } + + MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); + + // 这里应该调用实际的告警规则更新方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "告警规则更新成功"); + response.put("ruleId", ruleId); + response.put("serviceType", monitoringService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("更新告警规则失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "更新告警规则失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 删除告警规则 + */ + @DeleteMapping("/rules/{ruleId}") + public ResponseEntity> deleteAlertRule(@PathVariable String ruleId) { + try { + if (ruleId == null || ruleId.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "告警规则ID不能为空"); + return ResponseEntity.badRequest().body(error); + } + + MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); + + // 这里应该调用实际的告警规则删除方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "告警规则删除成功"); + response.put("ruleId", ruleId); + response.put("serviceType", monitoringService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("删除告警规则失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "删除告警规则失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 确认告警 + */ + @PostMapping("/alerts/{alertId}/acknowledge") + public ResponseEntity> acknowledgeAlert(@PathVariable String alertId, + @RequestBody Map request) { + try { + if (alertId == null || alertId.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "告警ID不能为空"); + return ResponseEntity.badRequest().body(error); + } + + String comment = request.get("comment"); + + MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); + + // 这里应该调用实际的告警确认方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "告警确认成功"); + response.put("alertId", alertId); + response.put("comment", comment); + response.put("acknowledgedAt", System.currentTimeMillis()); + response.put("serviceType", monitoringService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("确认告警失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "确认告警失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取监控仪表板数据 + */ + @GetMapping("/dashboard") + public ResponseEntity> getDashboardData(@RequestParam(required = false) String timeRange) { + try { + MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); + + // 这里应该调用实际的仪表板数据获取方法 + Map dashboard = new HashMap<>(); + dashboard.put("systemHealth", "HEALTHY"); + dashboard.put("activeAlerts", 0); + dashboard.put("totalMetrics", 15); + dashboard.put("uptime", "99.9%"); + dashboard.put("lastUpdate", System.currentTimeMillis()); + + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("dashboard", dashboard); + response.put("timeRange", timeRange); + response.put("serviceType", monitoringService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("获取监控仪表板数据失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "获取监控仪表板数据失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取监控配置 + */ + @GetMapping("/config") + public ResponseEntity> getMonitoringConfig() { + try { + MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); + + // 这里应该调用实际的监控配置获取方法 + Map config = new HashMap<>(); + config.put("collectionInterval", "60s"); + config.put("retentionPeriod", "30d"); + config.put("alertChannels", new String[]{"email", "webhook", "sms"}); + config.put("metricsEnabled", true); + config.put("alertsEnabled", true); + + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("config", config); + response.put("serviceType", monitoringService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("获取监控配置失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "获取监控配置失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } +} diff --git a/business-app/src/main/java/com/terrabase/business/controller/UserManagementController.java b/business-app/src/main/java/com/terrabase/business/controller/UserManagementController.java new file mode 100644 index 0000000..5568b30 --- /dev/null +++ b/business-app/src/main/java/com/terrabase/business/controller/UserManagementController.java @@ -0,0 +1,264 @@ +package com.terrabase.business.controller; + +import com.terrabase.business.util.JarLoadUtil; +import com.terrabase.enterprise.api.UserManagementService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * 用户管理服务控制器 + * 负责提供用户管理相关的REST API接口 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@RestController +@RequestMapping("/api/enterprise/user") +@CrossOrigin(origins = "*") +public class UserManagementController { + + private static final Logger logger = LoggerFactory.getLogger(UserManagementController.class); + + @Autowired + private JarLoadUtil jarLoadUtil; + + /** + * 获取用户管理服务信息 + */ + @GetMapping("/info") + public ResponseEntity> getUserManagementServiceInfo() { + try { + UserManagementService userService = jarLoadUtil.loadUserManagementService(); + + Map info = new HashMap<>(); + info.put("serviceName", userService.getServiceName()); + info.put("serviceVersion", userService.getServiceVersion()); + info.put("serviceType", userService.getServiceType()); + info.put("healthStatus", userService.getHealthStatus()); + + return ResponseEntity.ok(info); + + } catch (Exception e) { + logger.error("获取用户管理服务信息失败", e); + Map error = new HashMap<>(); + error.put("error", "获取用户管理服务信息失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 创建用户 + */ + @PostMapping("/create") + public ResponseEntity> createUser(@RequestBody Map request) { + try { + String username = request.get("username"); + String password = request.get("password"); + String email = request.get("email"); + String role = request.get("role"); + + if (username == null || username.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "用户名不能为空"); + return ResponseEntity.badRequest().body(error); + } + + UserManagementService userService = jarLoadUtil.loadUserManagementService(); + + // 这里应该调用实际的用户创建方法 + // 由于UserManagementService接口可能还没有具体的实现方法,这里先返回模拟数据 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "用户创建成功"); + response.put("username", username); + response.put("serviceType", userService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("创建用户失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "创建用户失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取用户信息 + */ + @GetMapping("/{username}") + public ResponseEntity> getUserInfo(@PathVariable String username) { + try { + if (username == null || username.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "用户名不能为空"); + return ResponseEntity.badRequest().body(error); + } + + UserManagementService userService = jarLoadUtil.loadUserManagementService(); + + // 这里应该调用实际的用户查询方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("username", username); + response.put("serviceType", userService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("获取用户信息失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "获取用户信息失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 更新用户信息 + */ + @PutMapping("/{username}") + public ResponseEntity> updateUser(@PathVariable String username, + @RequestBody Map request) { + try { + if (username == null || username.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "用户名不能为空"); + return ResponseEntity.badRequest().body(error); + } + + UserManagementService userService = jarLoadUtil.loadUserManagementService(); + + // 这里应该调用实际的用户更新方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "用户信息更新成功"); + response.put("username", username); + response.put("serviceType", userService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("更新用户信息失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "更新用户信息失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 删除用户 + */ + @DeleteMapping("/{username}") + public ResponseEntity> deleteUser(@PathVariable String username) { + try { + if (username == null || username.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "用户名不能为空"); + return ResponseEntity.badRequest().body(error); + } + + UserManagementService userService = jarLoadUtil.loadUserManagementService(); + + // 这里应该调用实际的用户删除方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "用户删除成功"); + response.put("username", username); + response.put("serviceType", userService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("删除用户失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "删除用户失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 获取用户列表 + */ + @GetMapping("/list") + public ResponseEntity> getUserList(@RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size) { + try { + UserManagementService userService = jarLoadUtil.loadUserManagementService(); + + // 这里应该调用实际的用户列表查询方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("users", new java.util.ArrayList<>()); // 模拟空列表 + response.put("page", page); + response.put("size", size); + response.put("total", 0); + response.put("serviceType", userService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("获取用户列表失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "获取用户列表失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } + + /** + * 用户认证 + */ + @PostMapping("/authenticate") + public ResponseEntity> authenticateUser(@RequestBody Map request) { + try { + String username = request.get("username"); + String password = request.get("password"); + + if (username == null || username.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "用户名不能为空"); + return ResponseEntity.badRequest().body(error); + } + + if (password == null || password.trim().isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "密码不能为空"); + return ResponseEntity.badRequest().body(error); + } + + UserManagementService userService = jarLoadUtil.loadUserManagementService(); + + // 这里应该调用实际的用户认证方法 + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("authenticated", true); + response.put("username", username); + response.put("serviceType", userService.getServiceType()); + response.put("timestamp", System.currentTimeMillis()); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + logger.error("用户认证失败", e); + Map error = new HashMap<>(); + error.put("status", "failed"); + error.put("error", "用户认证失败: " + e.getMessage()); + return ResponseEntity.internalServerError().body(error); + } + } +} diff --git a/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java b/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java index 66d93d4..d959fdc 100644 --- a/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java +++ b/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java @@ -1,6 +1,6 @@ package com.terrabase.business.util; -import com.terrabase.enterprise.api.EnterpriseService; +import com.terrabase.enterprise.api.*; import com.terrabase.enterprise.impl.open.OpenEnterpriseServiceImpl; import com.terrabase.enterprise.impl.open.config.KmcConfig; import org.slf4j.Logger; @@ -31,11 +31,172 @@ public class JarLoadUtil { @Value("${enterprise.jar.path:./lib}") private String jarPath; + @Value("${terrabase.commercial.oms.base.url}") + private String omsBaseUrl; + + @Value("${terrabase.commercial.timeout:30000}") + private int timeout; + @Autowired private ApplicationContext applicationContext; // 缓存已加载的实例 - private final ConcurrentHashMap serviceInstances = new ConcurrentHashMap<>(); + private final ConcurrentHashMap serviceInstances = new ConcurrentHashMap<>(); + + /** + * 加载加解密服务 + * @return 加解密服务实例 + */ + public CryptoService loadCryptoService() { + return (CryptoService) loadService("crypto_service", + "com.terrabase.enterprise.impl.commercial.CommercialCryptoServiceImpl", + "com.terrabase.enterprise.impl.open.OpenCryptoServiceImpl"); + } + + /** + * 加载用户管理服务 + * @return 用户管理服务实例 + */ + public UserManagementService loadUserManagementService() { + return (UserManagementService) loadService("user_management_service", + "com.terrabase.enterprise.impl.commercial.CommercialUserManagementServiceImpl", + "com.terrabase.enterprise.impl.open.OpenUserManagementServiceImpl"); + } + + /** + * 加载日志管理服务 + * @return 日志管理服务实例 + */ + public LogManagementService loadLogManagementService() { + return (LogManagementService) loadService("log_management_service", + "com.terrabase.enterprise.impl.commercial.CommercialLogManagementServiceImpl", + "com.terrabase.enterprise.impl.open.OpenLogManagementServiceImpl"); + } + + /** + * 加载证书管理服务 + * @return 证书管理服务实例 + */ + public CertificateService loadCertificateService() { + return (CertificateService) loadService("certificate_service", + "com.terrabase.enterprise.impl.commercial.CommercialCertificateServiceImpl", + "com.terrabase.enterprise.impl.open.OpenCertificateServiceImpl"); + } + + /** + * 加载监控告警服务 + * @return 监控告警服务实例 + */ + public MonitoringService loadMonitoringService() { + return (MonitoringService) loadService("monitoring_service", + "com.terrabase.enterprise.impl.commercial.CommercialMonitoringServiceImpl", + "com.terrabase.enterprise.impl.open.OpenMonitoringServiceImpl"); + } + + /** + * 通用服务加载方法 + * @param cacheKey 缓存键 + * @param commercialClassName 商业版类名 + * @param openClassName 开源版类名 + * @return 服务实例 + */ + private Object loadService(String cacheKey, String commercialClassName, String openClassName) { + try { + // 先检查缓存 + Object cachedService = serviceInstances.get(cacheKey); + if (cachedService != null) { + logger.info("从缓存中获取服务实例: {}", cacheKey); + return cachedService; + } + + logger.info("开始检测并加载服务: {}", cacheKey); + + Object service; + if (isCommercialJarAvailable()) { + logger.info("检测到商业版JAR包,加载商业版服务: {}", commercialClassName); + service = loadServiceFromJar(commercialClassName); + } else { + logger.info("未检测到商业版JAR包,使用开源版服务: {}", openClassName); + service = loadServiceFromClasspath(openClassName); + } + + // 如果服务加载失败,使用开源版作为降级方案 + if (service == null) { + logger.warn("服务加载失败,使用开源版作为降级方案: {}", openClassName); + service = loadServiceFromClasspath(openClassName); + } + + // 如果开源版也加载失败,抛出异常 + if (service == null) { + throw new RuntimeException("无法加载任何服务实现: " + cacheKey); + } + + // 缓存服务实例 + serviceInstances.put(cacheKey, service); + + // 自动启动服务 + if (service instanceof com.terrabase.enterprise.api.EnterpriseService) { + ((com.terrabase.enterprise.api.EnterpriseService) service).start(); + logger.info("企业服务已自动启动: {}", cacheKey); + } else if (service instanceof com.terrabase.enterprise.api.CryptoService) { + ((com.terrabase.enterprise.api.CryptoService) service).start(); + logger.info("加密服务已自动启动: {}", cacheKey); + } else if (service instanceof com.terrabase.enterprise.api.UserManagementService) { + ((com.terrabase.enterprise.api.UserManagementService) service).start(); + logger.info("用户管理服务已自动启动: {}", cacheKey); + } else if (service instanceof com.terrabase.enterprise.api.LogManagementService) { + ((com.terrabase.enterprise.api.LogManagementService) service).start(); + logger.info("日志管理服务已自动启动: {}", cacheKey); + } else if (service instanceof com.terrabase.enterprise.api.CertificateService) { + ((com.terrabase.enterprise.api.CertificateService) service).start(); + logger.info("证书管理服务已自动启动: {}", cacheKey); + } else if (service instanceof com.terrabase.enterprise.api.MonitoringService) { + ((com.terrabase.enterprise.api.MonitoringService) service).start(); + logger.info("监控告警服务已自动启动: {}", cacheKey); + } + + logger.info("服务加载成功: {}", cacheKey); + + return service; + + } catch (Exception e) { + logger.error("加载服务失败: {}, 尝试使用开源版作为降级方案", cacheKey, e); + try { + // 最后的降级方案:直接实例化开源版服务 + Object fallbackService = loadServiceFromClasspath(openClassName); + if (fallbackService != null) { + serviceInstances.put(cacheKey, fallbackService); + + // 自动启动降级服务 + if (fallbackService instanceof com.terrabase.enterprise.api.EnterpriseService) { + ((com.terrabase.enterprise.api.EnterpriseService) fallbackService).start(); + logger.info("降级企业服务已自动启动: {}", cacheKey); + } else if (fallbackService instanceof com.terrabase.enterprise.api.CryptoService) { + ((com.terrabase.enterprise.api.CryptoService) fallbackService).start(); + logger.info("降级加密服务已自动启动: {}", cacheKey); + } else if (fallbackService instanceof com.terrabase.enterprise.api.UserManagementService) { + ((com.terrabase.enterprise.api.UserManagementService) fallbackService).start(); + logger.info("降级用户管理服务已自动启动: {}", cacheKey); + } else if (fallbackService instanceof com.terrabase.enterprise.api.LogManagementService) { + ((com.terrabase.enterprise.api.LogManagementService) fallbackService).start(); + logger.info("降级日志管理服务已自动启动: {}", cacheKey); + } else if (fallbackService instanceof com.terrabase.enterprise.api.CertificateService) { + ((com.terrabase.enterprise.api.CertificateService) fallbackService).start(); + logger.info("降级证书管理服务已自动启动: {}", cacheKey); + } else if (fallbackService instanceof com.terrabase.enterprise.api.MonitoringService) { + ((com.terrabase.enterprise.api.MonitoringService) fallbackService).start(); + logger.info("降级监控告警服务已自动启动: {}", cacheKey); + } + + logger.warn("使用开源版服务作为降级方案: {}", cacheKey); + return fallbackService; + } + } catch (Exception fallbackException) { + logger.error("降级方案也失败了: {}", cacheKey, fallbackException); + } + throw new RuntimeException("无法加载任何服务实现: " + cacheKey, e); + } + } /** * 根据lib目录下是否存在JAR包动态加载企业服务实现 @@ -46,7 +207,7 @@ public EnterpriseService loadEnterpriseService() { String cacheKey = "enterprise_service"; // 先检查缓存 - EnterpriseService cachedService = serviceInstances.get(cacheKey); + EnterpriseService cachedService = (EnterpriseService) serviceInstances.get(cacheKey); if (cachedService != null) { logger.info("从缓存中获取企业服务实例"); return cachedService; @@ -102,6 +263,11 @@ public EnterpriseService loadEnterpriseService() { } serviceInstances.put("enterprise_service", fallbackService); + + // 自动启动降级企业服务 + fallbackService.start(); + logger.info("降级企业服务已自动启动"); + logger.warn("使用开源版企业服务作为降级方案"); return fallbackService; } catch (Exception fallbackException) { @@ -199,11 +365,11 @@ private EnterpriseService loadOpenSourceService() throws Exception { } /** - * 从JAR包加载服务 + * 从JAR包加载服务(通用方法) * @param className 类名 * @return 服务实例 */ - private EnterpriseService loadFromJar(String className) { + private Object loadServiceFromJar(String className) { try { String jarFileName = getJarFileName(className); File jarFile = new File(jarPath, jarFileName); @@ -219,11 +385,35 @@ private EnterpriseService loadFromJar(String className) { URLClassLoader classLoader = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader()); Class clazz = classLoader.loadClass(className); - Constructor constructor = clazz.getDeclaredConstructor(); - constructor.setAccessible(true); - Object instance = constructor.newInstance(); - return (EnterpriseService) instance; + // 尝试使用带配置参数的构造函数 + Object instance = null; + try { + // 首先尝试带配置参数的构造函数 + Constructor configConstructor = clazz.getDeclaredConstructor( + Class.forName("org.springframework.web.client.RestTemplate"), + String.class, + int.class + ); + configConstructor.setAccessible(true); + + // 创建RestTemplate实例 + Object restTemplate = Class.forName("org.springframework.web.client.RestTemplate").newInstance(); + + instance = configConstructor.newInstance(restTemplate, omsBaseUrl, timeout); + logger.info("使用配置参数创建商业版服务实例: omsBaseUrl={}, timeout={}", omsBaseUrl, timeout); + + } catch (Exception configException) { + logger.debug("带配置参数的构造函数不可用,尝试默认构造函数: {}", configException.getMessage()); + + // 如果带配置参数的构造函数不可用,使用默认构造函数 + Constructor defaultConstructor = clazz.getDeclaredConstructor(); + defaultConstructor.setAccessible(true); + instance = defaultConstructor.newInstance(); + logger.info("使用默认构造函数创建商业版服务实例"); + } + + return instance; } catch (Exception e) { logger.warn("从JAR包加载失败: {}", e.getMessage()); @@ -232,20 +422,47 @@ private EnterpriseService loadFromJar(String className) { } /** - * 从类路径加载服务 + * 从类路径加载服务(通用方法) * @param className 类名 * @return 服务实例 */ - private EnterpriseService loadFromClasspath(String className) { + private Object loadServiceFromClasspath(String className) { try { logger.info("从类路径加载: {}", className); Class clazz = Class.forName(className); - Constructor constructor = clazz.getDeclaredConstructor(); - constructor.setAccessible(true); - Object instance = constructor.newInstance(); - return (EnterpriseService) instance; + // 尝试使用带配置参数的构造函数 + Object instance = null; + try { + // 首先尝试带配置参数的构造函数 + Constructor configConstructor = clazz.getDeclaredConstructor( + Class.forName("org.springframework.web.client.RestTemplate"), + String.class, + int.class + ); + configConstructor.setAccessible(true); + + // 创建RestTemplate实例 + Object restTemplate = Class.forName("org.springframework.web.client.RestTemplate").newInstance(); + + instance = configConstructor.newInstance(restTemplate, omsBaseUrl, timeout); + logger.info("使用配置参数创建商业版服务实例: omsBaseUrl={}, timeout={}", omsBaseUrl, timeout); + + } catch (Exception configException) { + logger.debug("带配置参数的构造函数不可用,尝试默认构造函数: {}", configException.getMessage()); + + // 如果带配置参数的构造函数不可用,使用默认构造函数 + Constructor defaultConstructor = clazz.getDeclaredConstructor(); + defaultConstructor.setAccessible(true); + instance = defaultConstructor.newInstance(); + logger.info("使用默认构造函数创建服务实例"); + } + + // 手动注入依赖 + injectDependencies(instance, className); + + return instance; } catch (Exception e) { logger.warn("从类路径加载失败: {}", e.getMessage()); @@ -253,6 +470,56 @@ private EnterpriseService loadFromClasspath(String className) { } } + /** + * 从JAR包加载服务 + * @param className 类名 + * @return 服务实例 + */ + private EnterpriseService loadFromJar(String className) { + return (EnterpriseService) loadServiceFromJar(className); + } + + /** + * 从类路径加载服务 + * @param className 类名 + * @return 服务实例 + */ + private EnterpriseService loadFromClasspath(String className) { + return (EnterpriseService) loadServiceFromClasspath(className); + } + + /** + * 手动注入依赖 + * @param instance 服务实例 + * @param className 类名 + */ + private void injectDependencies(Object instance, String className) { + try { + // 为 OpenCryptoServiceImpl 注入 KmcConfig + if (className.contains("OpenCryptoServiceImpl")) { + try { + KmcConfig kmcConfig = applicationContext.getBean(KmcConfig.class); + if (kmcConfig != null) { + java.lang.reflect.Field kmcConfigField = instance.getClass().getDeclaredField("kmcConfig"); + kmcConfigField.setAccessible(true); + kmcConfigField.set(instance, kmcConfig); + logger.info("成功注入 KmcConfig 到 OpenCryptoServiceImpl"); + } else { + logger.warn("Spring容器中没有找到 KmcConfig Bean"); + } + } catch (Exception e) { + logger.warn("注入 KmcConfig 失败: {}", e.getMessage()); + } + } + + // 为其他服务注入依赖(如果需要) + // 可以在这里添加其他服务的依赖注入逻辑 + + } catch (Exception e) { + logger.warn("依赖注入失败: {}", e.getMessage()); + } + } + /** * 根据类名获取JAR文件名 * @param className 类名 diff --git a/business-app/src/main/resources/application.properties b/business-app/src/main/resources/application.properties index d73e245..fe41c59 100644 --- a/business-app/src/main/resources/application.properties +++ b/business-app/src/main/resources/application.properties @@ -38,3 +38,7 @@ info.app.description=企业级数据使能平台 - 业务应用模块 info.app.version=1.0.0 info.app.encoding=UTF-8 info.app.java.version=17 + +# 商业版加解密REST接口配置 +terrabase.commercial.oms.base.url=http://localhost:8081/api/ +terrabase.commercial.timeout=30000 diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/CertificateService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/CertificateService.java new file mode 100644 index 0000000..44d4652 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/CertificateService.java @@ -0,0 +1,88 @@ +package com.terrabase.enterprise.api; + +import com.terrabase.enterprise.api.dto.*; +import java.util.List; + +/** + * 证书管理服务接口 + * 提供证书注册、导入、查询等功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public interface CertificateService { + + /** + * 获取服务名称 + * @return 服务名称 + */ + String getServiceName(); + + /** + * 获取服务版本 + * @return 服务版本 + */ + String getServiceVersion(); + + /** + * 获取服务类型(commercial 或 open) + * @return 服务类型 + */ + String getServiceType(); + + /** + * 获取服务健康状态 + * @return 健康状态信息 + */ + String getHealthStatus(); + + /** + * 启动服务 + * 将服务的running状态设置为true + */ + void start(); + + /** + * 停止服务 + * 将服务的running状态设置为false + */ + void stop(); + + /** + * 检查服务是否正在运行 + * @return true如果服务正在运行 + */ + boolean isRunning(); + + // ========== 证书管理相关接口 ========== + + /** + * 证书注册接口 + * @param certificate 证书信息对象 + */ + void registerCertificate(RegisterCertificate certificate); + + /** + * 导入/更新证书接口 + * @param certificate 证书详细信息对象 + */ + void importOrUpdateCertificate(CertificateDetail certificate); + + /** + * 导入信任CA证书接口 + * @param caCertificate CA证书对象 + */ + void importTrustedCaCertificate(CaCertificate caCertificate); + + /** + * 查询所有证书信息接口 + * @return 证书收集信息列表 + */ + List queryAllCertificates(); + + /** + * License信息查询接口 + * @return License信息对象 + */ + LicenseInfo queryLicenseInfo(); +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/CryptoService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/CryptoService.java new file mode 100644 index 0000000..2912b52 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/CryptoService.java @@ -0,0 +1,71 @@ +package com.terrabase.enterprise.api; + +import com.terrabase.enterprise.api.dto.*; + +/** + * 加解密服务接口 + * 提供数据加密和解密功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public interface CryptoService { + + /** + * 获取服务名称 + * @return 服务名称 + */ + String getServiceName(); + + /** + * 获取服务版本 + * @return 服务版本 + */ + String getServiceVersion(); + + /** + * 获取服务类型(commercial 或 open) + * @return 服务类型 + */ + String getServiceType(); + + /** + * 获取服务健康状态 + * @return 健康状态信息 + */ + String getHealthStatus(); + + /** + * 启动服务 + * 将服务的running状态设置为true + */ + void start(); + + /** + * 停止服务 + * 将服务的running状态设置为false + */ + void stop(); + + /** + * 检查服务是否正在运行 + * @return true如果服务正在运行 + */ + boolean isRunning(); + + /** + * 加密接口 + * @param plaintext 明文数据 + * @param algorithm 加密算法,如果为null则使用默认AES算法 + * @return 密文数据 + */ + String encrypt(String plaintext, CryptoAlgorithm algorithm); + + /** + * 解密接口 + * @param ciphertext 密文数据 + * @param algorithm 解密算法,如果为null则使用默认AES算法 + * @return 明文数据 + */ + String decrypt(String ciphertext, CryptoAlgorithm algorithm); +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java index 718dd0c..969971c 100644 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java @@ -2,7 +2,7 @@ /** * 企业级服务接口 - * 定义企业级功能的核心接口,包括数据使能、模型引擎等功能 + * 定义企业级功能的核心接口,组合各个子服务 * * @author Terrabase Team * @version 1.0.0 @@ -51,19 +51,4 @@ public interface EnterpriseService { */ boolean isRunning(); - /** - * 加密接口 - * @param plaintext 明文数据 - * @param algorithm 加密算法,如果为null则使用默认AES算法 - * @return 密文数据 - */ - String encrypt(String plaintext, CryptoAlgorithm algorithm); - - /** - * 解密接口 - * @param ciphertext 密文数据 - * @param algorithm 解密算法,如果为null则使用默认AES算法 - * @return 明文数据 - */ - String decrypt(String ciphertext, CryptoAlgorithm algorithm); } diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/LogManagementService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/LogManagementService.java new file mode 100644 index 0000000..ad2ab1c --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/LogManagementService.java @@ -0,0 +1,69 @@ +package com.terrabase.enterprise.api; + +import com.terrabase.enterprise.api.dto.*; + +/** + * 日志管理服务接口 + * 提供操作日志的国际化注册和上报功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public interface LogManagementService { + + /** + * 获取服务名称 + * @return 服务名称 + */ + String getServiceName(); + + /** + * 获取服务版本 + * @return 服务版本 + */ + String getServiceVersion(); + + /** + * 获取服务类型(commercial 或 open) + * @return 服务类型 + */ + String getServiceType(); + + /** + * 获取服务健康状态 + * @return 健康状态信息 + */ + String getHealthStatus(); + + /** + * 启动服务 + * 将服务的running状态设置为true + */ + void start(); + + /** + * 停止服务 + * 将服务的running状态设置为false + */ + void stop(); + + /** + * 检查服务是否正在运行 + * @return true如果服务正在运行 + */ + boolean isRunning(); + + // ========== 日志与监控相关接口 ========== + + /** + * 操作日志国际化信息注册接口 + * @param logI18NS 国际化日志信息对象 + */ + void registerOperateLogI18N(LogI18NS logI18NS); + + /** + * 上报操作日志接口 + * @param logs 操作日志信息对象 + */ + void reportOperateLog(Logs logs); +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/MonitoringService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/MonitoringService.java new file mode 100644 index 0000000..7cf0420 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/MonitoringService.java @@ -0,0 +1,84 @@ +package com.terrabase.enterprise.api; + +import com.terrabase.enterprise.api.dto.*; +import java.util.List; + +/** + * 监控告警服务接口 + * 提供告警定义注册、告警上报、告警查询等功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public interface MonitoringService { + + /** + * 获取服务名称 + * @return 服务名称 + */ + String getServiceName(); + + /** + * 获取服务版本 + * @return 服务版本 + */ + String getServiceVersion(); + + /** + * 获取服务类型(commercial 或 open) + * @return 服务类型 + */ + String getServiceType(); + + /** + * 获取服务健康状态 + * @return 健康状态信息 + */ + String getHealthStatus(); + + /** + * 启动服务 + * 将服务的running状态设置为true + */ + void start(); + + /** + * 停止服务 + * 将服务的running状态设置为false + */ + void stop(); + + /** + * 检查服务是否正在运行 + * @return true如果服务正在运行 + */ + boolean isRunning(); + + // ========== 告警系统相关接口 ========== + + /** + * 注册告警定义接口 + * @param eventDefine 告警定义对象 + */ + void registerEventDefine(EventDefine eventDefine); + + /** + * 告警上报接口 + * @param alarms 告警信息列表 + */ + void sendAlarmsBatch(List alarms); + + /** + * 分页查询告警接口 + * @param queryParams 查询参数 + * @return 告警信息分页结果 + */ + PageResult getEventsByPage(EventQueryParams queryParams); + + /** + * 根据ID查询告警详情接口 + * @param alarmId 告警ID + * @return 告警详细信息 + */ + AlarmDetail getAlarmDetailById(String alarmId); +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/UserManagementService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/UserManagementService.java new file mode 100644 index 0000000..18c8cce --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/UserManagementService.java @@ -0,0 +1,89 @@ +package com.terrabase.enterprise.api; + +import com.terrabase.enterprise.api.dto.*; + +/** + * 用户管理服务接口 + * 提供角色、权限、菜单等用户管理功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public interface UserManagementService { + + /** + * 获取服务名称 + * @return 服务名称 + */ + String getServiceName(); + + /** + * 获取服务版本 + * @return 服务版本 + */ + String getServiceVersion(); + + /** + * 获取服务类型(commercial 或 open) + * @return 服务类型 + */ + String getServiceType(); + + /** + * 获取服务健康状态 + * @return 健康状态信息 + */ + String getHealthStatus(); + + /** + * 启动服务 + * 将服务的running状态设置为true + */ + void start(); + + /** + * 停止服务 + * 将服务的running状态设置为false + */ + void stop(); + + /** + * 检查服务是否正在运行 + * @return true如果服务正在运行 + */ + boolean isRunning(); + + // ========== 用户注册相关接口 ========== + + /** + * 角色注册接口 + * @param roleRegister 角色注册对象 + */ + void registerRole(RoleRegister roleRegister); + + /** + * 权限注册接口 + * @param authorityInfos 权限信息对象 + */ + void registerAuthority(AuthorityInfos authorityInfos); + + /** + * 菜单注册接口 + * @param menuRegisterInfo 菜单注册信息对象 + */ + void registerMenu(MenuRegisterInfo menuRegisterInfo); + + /** + * 菜单屏蔽注册接口 + * @param forbiddenBody 菜单屏蔽信息对象 + */ + void registerMenuForbidden(ForbiddenBody forbiddenBody); + + // ========== 时间管理相关接口 ========== + + /** + * 时间配置变更事件订阅接口 + * @param subscribe 订阅信息对象 + */ + void subscribeTimeConfigChange(Subscribe subscribe); +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmDetail.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmDetail.java new file mode 100644 index 0000000..11a8910 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmDetail.java @@ -0,0 +1,240 @@ +package com.terrabase.enterprise.api.dto; + +/** + * 告警详细信息对象 + * 用于查询告警详情功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class AlarmDetail { + + /** + * 告警ID + */ + private String alarmId; + + /** + * 告警定义ID + */ + private String eventDefineId; + + /** + * 告警名称 + */ + private String alarmName; + + /** + * 告警描述 + */ + private String alarmDescription; + + /** + * 告警级别 + */ + private String alarmLevel; + + /** + * 告警状态 + */ + private String alarmStatus; + + /** + * 触发时间 + */ + private Long triggerTime; + + /** + * 告警来源 + */ + private String alarmSource; + + /** + * 告警详情 + */ + private String alarmDetails; + + /** + * 告警数据 + */ + private String alarmData; + + /** + * 处理时间 + */ + private Long handleTime; + + /** + * 处理人 + */ + private String handler; + + /** + * 处理备注 + */ + private String handleRemark; + + /** + * 创建时间 + */ + private Long createTime; + + /** + * 更新时间 + */ + private Long updateTime; + + public AlarmDetail() {} + + public AlarmDetail(String alarmId, String alarmName, String alarmLevel) { + this.alarmId = alarmId; + this.alarmName = alarmName; + this.alarmLevel = alarmLevel; + this.createTime = System.currentTimeMillis(); + } + + public String getAlarmId() { + return alarmId; + } + + public void setAlarmId(String alarmId) { + this.alarmId = alarmId; + } + + public String getEventDefineId() { + return eventDefineId; + } + + public void setEventDefineId(String eventDefineId) { + this.eventDefineId = eventDefineId; + } + + public String getAlarmName() { + return alarmName; + } + + public void setAlarmName(String alarmName) { + this.alarmName = alarmName; + } + + public String getAlarmDescription() { + return alarmDescription; + } + + public void setAlarmDescription(String alarmDescription) { + this.alarmDescription = alarmDescription; + } + + public String getAlarmLevel() { + return alarmLevel; + } + + public void setAlarmLevel(String alarmLevel) { + this.alarmLevel = alarmLevel; + } + + public String getAlarmStatus() { + return alarmStatus; + } + + public void setAlarmStatus(String alarmStatus) { + this.alarmStatus = alarmStatus; + } + + public Long getTriggerTime() { + return triggerTime; + } + + public void setTriggerTime(Long triggerTime) { + this.triggerTime = triggerTime; + } + + public String getAlarmSource() { + return alarmSource; + } + + public void setAlarmSource(String alarmSource) { + this.alarmSource = alarmSource; + } + + public String getAlarmDetails() { + return alarmDetails; + } + + public void setAlarmDetails(String alarmDetails) { + this.alarmDetails = alarmDetails; + } + + public String getAlarmData() { + return alarmData; + } + + public void setAlarmData(String alarmData) { + this.alarmData = alarmData; + } + + public Long getHandleTime() { + return handleTime; + } + + public void setHandleTime(Long handleTime) { + this.handleTime = handleTime; + } + + public String getHandler() { + return handler; + } + + public void setHandler(String handler) { + this.handler = handler; + } + + public String getHandleRemark() { + return handleRemark; + } + + public void setHandleRemark(String handleRemark) { + this.handleRemark = handleRemark; + } + + public Long getCreateTime() { + return createTime; + } + + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + + public Long getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Long updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "AlarmDetail{" + + "alarmId='" + alarmId + '\'' + + ", eventDefineId='" + eventDefineId + '\'' + + ", alarmName='" + alarmName + '\'' + + ", alarmDescription='" + alarmDescription + '\'' + + ", alarmLevel='" + alarmLevel + '\'' + + ", alarmStatus='" + alarmStatus + '\'' + + ", triggerTime=" + triggerTime + + ", alarmSource='" + alarmSource + '\'' + + ", alarmDetails='" + alarmDetails + '\'' + + ", alarmData='" + alarmData + '\'' + + ", handleTime=" + handleTime + + ", handler='" + handler + '\'' + + ", handleRemark='" + handleRemark + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmInfo.java new file mode 100644 index 0000000..49e6df4 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmInfo.java @@ -0,0 +1,170 @@ +package com.terrabase.enterprise.api.dto; + +/** + * 告警信息对象 + * 用于告警上报功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class AlarmInfo { + + /** + * 告警ID + */ + private String alarmId; + + /** + * 告警定义ID + */ + private String eventDefineId; + + /** + * 告警名称 + */ + private String alarmName; + + /** + * 告警描述 + */ + private String alarmDescription; + + /** + * 告警级别 + */ + private String alarmLevel; + + /** + * 告警状态 + */ + private String alarmStatus; + + /** + * 触发时间 + */ + private Long triggerTime; + + /** + * 告警来源 + */ + private String alarmSource; + + /** + * 告警详情 + */ + private String alarmDetails; + + /** + * 告警数据 + */ + private String alarmData; + + public AlarmInfo() {} + + public AlarmInfo(String alarmId, String eventDefineId, String alarmName) { + this.alarmId = alarmId; + this.eventDefineId = eventDefineId; + this.alarmName = alarmName; + this.triggerTime = System.currentTimeMillis(); + } + + public String getAlarmId() { + return alarmId; + } + + public void setAlarmId(String alarmId) { + this.alarmId = alarmId; + } + + public String getEventDefineId() { + return eventDefineId; + } + + public void setEventDefineId(String eventDefineId) { + this.eventDefineId = eventDefineId; + } + + public String getAlarmName() { + return alarmName; + } + + public void setAlarmName(String alarmName) { + this.alarmName = alarmName; + } + + public String getAlarmDescription() { + return alarmDescription; + } + + public void setAlarmDescription(String alarmDescription) { + this.alarmDescription = alarmDescription; + } + + public String getAlarmLevel() { + return alarmLevel; + } + + public void setAlarmLevel(String alarmLevel) { + this.alarmLevel = alarmLevel; + } + + public String getAlarmStatus() { + return alarmStatus; + } + + public void setAlarmStatus(String alarmStatus) { + this.alarmStatus = alarmStatus; + } + + public Long getTriggerTime() { + return triggerTime; + } + + public void setTriggerTime(Long triggerTime) { + this.triggerTime = triggerTime; + } + + public String getAlarmSource() { + return alarmSource; + } + + public void setAlarmSource(String alarmSource) { + this.alarmSource = alarmSource; + } + + public String getAlarmDetails() { + return alarmDetails; + } + + public void setAlarmDetails(String alarmDetails) { + this.alarmDetails = alarmDetails; + } + + public String getAlarmData() { + return alarmData; + } + + public void setAlarmData(String alarmData) { + this.alarmData = alarmData; + } + + @Override + public String toString() { + return "AlarmInfo{" + + "alarmId='" + alarmId + '\'' + + ", eventDefineId='" + eventDefineId + '\'' + + ", alarmName='" + alarmName + '\'' + + ", alarmDescription='" + alarmDescription + '\'' + + ", alarmLevel='" + alarmLevel + '\'' + + ", alarmStatus='" + alarmStatus + '\'' + + ", triggerTime=" + triggerTime + + ", alarmSource='" + alarmSource + '\'' + + ", alarmDetails='" + alarmDetails + '\'' + + ", alarmData='" + alarmData + '\'' + + '}'; + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AuthorityInfos.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AuthorityInfos.java new file mode 100644 index 0000000..6129ac3 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AuthorityInfos.java @@ -0,0 +1,161 @@ +package com.terrabase.enterprise.api.dto; + +import java.util.List; + +/** + * 权限信息对象 + * 用于权限注册功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class AuthorityInfos { + + /** + * 权限列表 + */ + private List authorityList; + + /** + * 应用场景 + */ + private String applicationScenario; + + public AuthorityInfos() {} + + public AuthorityInfos(List authorityList) { + this.authorityList = authorityList; + } + + public List getAuthorityList() { + return authorityList; + } + + public void setAuthorityList(List authorityList) { + this.authorityList = authorityList; + } + + public String getApplicationScenario() { + return applicationScenario; + } + + public void setApplicationScenario(String applicationScenario) { + this.applicationScenario = applicationScenario; + } + + @Override + public String toString() { + return "AuthorityInfos{" + + "authorityList=" + authorityList + + ", applicationScenario='" + applicationScenario + '\'' + + '}'; + } + + /** + * 单个权限信息 + */ + public static class AuthorityInfo { + + /** + * 权限ID + */ + private String authorityId; + + /** + * 权限名称 + */ + private String authorityName; + + /** + * 权限描述 + */ + private String authorityDescription; + + /** + * 权限类型 + */ + private String authorityType; + + /** + * 资源路径 + */ + private String resourcePath; + + /** + * 操作类型 + */ + private String operationType; + + public AuthorityInfo() {} + + public AuthorityInfo(String authorityId, String authorityName, String authorityDescription) { + this.authorityId = authorityId; + this.authorityName = authorityName; + this.authorityDescription = authorityDescription; + } + + public String getAuthorityId() { + return authorityId; + } + + public void setAuthorityId(String authorityId) { + this.authorityId = authorityId; + } + + public String getAuthorityName() { + return authorityName; + } + + public void setAuthorityName(String authorityName) { + this.authorityName = authorityName; + } + + public String getAuthorityDescription() { + return authorityDescription; + } + + public void setAuthorityDescription(String authorityDescription) { + this.authorityDescription = authorityDescription; + } + + public String getAuthorityType() { + return authorityType; + } + + public void setAuthorityType(String authorityType) { + this.authorityType = authorityType; + } + + public String getResourcePath() { + return resourcePath; + } + + public void setResourcePath(String resourcePath) { + this.resourcePath = resourcePath; + } + + public String getOperationType() { + return operationType; + } + + public void setOperationType(String operationType) { + this.operationType = operationType; + } + + @Override + public String toString() { + return "AuthorityInfo{" + + "authorityId='" + authorityId + '\'' + + ", authorityName='" + authorityName + '\'' + + ", authorityDescription='" + authorityDescription + '\'' + + ", authorityType='" + authorityType + '\'' + + ", resourcePath='" + resourcePath + '\'' + + ", operationType='" + operationType + '\'' + + '}'; + } + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CaCertificate.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CaCertificate.java new file mode 100644 index 0000000..129149b --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CaCertificate.java @@ -0,0 +1,140 @@ +package com.terrabase.enterprise.api.dto; + +/** + * CA证书对象 + * 用于导入信任CA证书功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class CaCertificate { + + /** + * CA证书ID + */ + private String caCertificateId; + + /** + * CA证书名称 + */ + private String caCertificateName; + + /** + * CA证书内容 + */ + private String caCertificateContent; + + /** + * CA证书格式 + */ + private String caCertificateFormat; + + /** + * 证书颁发者 + */ + private String issuer; + + /** + * 证书主题 + */ + private String subject; + + /** + * 有效期开始时间 + */ + private Long validFrom; + + /** + * 有效期结束时间 + */ + private Long validTo; + + public CaCertificate() {} + + public CaCertificate(String caCertificateId, String caCertificateName, String caCertificateContent) { + this.caCertificateId = caCertificateId; + this.caCertificateName = caCertificateName; + this.caCertificateContent = caCertificateContent; + } + + public String getCaCertificateId() { + return caCertificateId; + } + + public void setCaCertificateId(String caCertificateId) { + this.caCertificateId = caCertificateId; + } + + public String getCaCertificateName() { + return caCertificateName; + } + + public void setCaCertificateName(String caCertificateName) { + this.caCertificateName = caCertificateName; + } + + public String getCaCertificateContent() { + return caCertificateContent; + } + + public void setCaCertificateContent(String caCertificateContent) { + this.caCertificateContent = caCertificateContent; + } + + public String getCaCertificateFormat() { + return caCertificateFormat; + } + + public void setCaCertificateFormat(String caCertificateFormat) { + this.caCertificateFormat = caCertificateFormat; + } + + public String getIssuer() { + return issuer; + } + + public void setIssuer(String issuer) { + this.issuer = issuer; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public Long getValidFrom() { + return validFrom; + } + + public void setValidFrom(Long validFrom) { + this.validFrom = validFrom; + } + + public Long getValidTo() { + return validTo; + } + + public void setValidTo(Long validTo) { + this.validTo = validTo; + } + + @Override + public String toString() { + return "CaCertificate{" + + "caCertificateId='" + caCertificateId + '\'' + + ", caCertificateName='" + caCertificateName + '\'' + + ", caCertificateFormat='" + caCertificateFormat + '\'' + + ", issuer='" + issuer + '\'' + + ", subject='" + subject + '\'' + + ", validFrom=" + validFrom + + ", validTo=" + validTo + + '}'; + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertCollectInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertCollectInfo.java new file mode 100644 index 0000000..271ecd7 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertCollectInfo.java @@ -0,0 +1,183 @@ +package com.terrabase.enterprise.api.dto; + +/** + * 证书收集信息对象 + * 用于查询所有证书信息功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class CertCollectInfo { + + /** + * 证书ID + */ + private String certificateId; + + /** + * 证书名称 + */ + private String certificateName; + + /** + * 证书类型 + */ + private String certificateType; + + /** + * 证书状态 + */ + private String certificateStatus; + + /** + * 有效期开始时间 + */ + private Long validFrom; + + /** + * 有效期结束时间 + */ + private Long validTo; + + /** + * 证书颁发者 + */ + private String issuer; + + /** + * 证书主题 + */ + private String subject; + + /** + * 证书用途 + */ + private String certificateUsage; + + /** + * 创建时间 + */ + private Long createTime; + + /** + * 更新时间 + */ + private Long updateTime; + + public CertCollectInfo() {} + + public CertCollectInfo(String certificateId, String certificateName, String certificateType) { + this.certificateId = certificateId; + this.certificateName = certificateName; + this.certificateType = certificateType; + } + + public String getCertificateId() { + return certificateId; + } + + public void setCertificateId(String certificateId) { + this.certificateId = certificateId; + } + + public String getCertificateName() { + return certificateName; + } + + public void setCertificateName(String certificateName) { + this.certificateName = certificateName; + } + + public String getCertificateType() { + return certificateType; + } + + public void setCertificateType(String certificateType) { + this.certificateType = certificateType; + } + + public String getCertificateStatus() { + return certificateStatus; + } + + public void setCertificateStatus(String certificateStatus) { + this.certificateStatus = certificateStatus; + } + + public Long getValidFrom() { + return validFrom; + } + + public void setValidFrom(Long validFrom) { + this.validFrom = validFrom; + } + + public Long getValidTo() { + return validTo; + } + + public void setValidTo(Long validTo) { + this.validTo = validTo; + } + + public String getIssuer() { + return issuer; + } + + public void setIssuer(String issuer) { + this.issuer = issuer; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getCertificateUsage() { + return certificateUsage; + } + + public void setCertificateUsage(String certificateUsage) { + this.certificateUsage = certificateUsage; + } + + public Long getCreateTime() { + return createTime; + } + + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + + public Long getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Long updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "CertCollectInfo{" + + "certificateId='" + certificateId + '\'' + + ", certificateName='" + certificateName + '\'' + + ", certificateType='" + certificateType + '\'' + + ", certificateStatus='" + certificateStatus + '\'' + + ", validFrom=" + validFrom + + ", validTo=" + validTo + + ", issuer='" + issuer + '\'' + + ", subject='" + subject + '\'' + + ", certificateUsage='" + certificateUsage + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertificateDetail.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertificateDetail.java new file mode 100644 index 0000000..0a86832 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertificateDetail.java @@ -0,0 +1,110 @@ +package com.terrabase.enterprise.api.dto; + +/** + * 证书详细信息对象 + * 用于证书导入/更新功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class CertificateDetail { + + /** + * 证书ID + */ + private String certificateId; + + /** + * 证书内容 + */ + private String certificateContent; + + /** + * 私钥内容 + */ + private String privateKeyContent; + + /** + * 证书格式 + */ + private String certificateFormat; + + /** + * 密码 + */ + private String password; + + /** + * 证书链 + */ + private String[] certificateChain; + + public CertificateDetail() {} + + public CertificateDetail(String certificateId, String certificateContent) { + this.certificateId = certificateId; + this.certificateContent = certificateContent; + } + + public String getCertificateId() { + return certificateId; + } + + public void setCertificateId(String certificateId) { + this.certificateId = certificateId; + } + + public String getCertificateContent() { + return certificateContent; + } + + public void setCertificateContent(String certificateContent) { + this.certificateContent = certificateContent; + } + + public String getPrivateKeyContent() { + return privateKeyContent; + } + + public void setPrivateKeyContent(String privateKeyContent) { + this.privateKeyContent = privateKeyContent; + } + + public String getCertificateFormat() { + return certificateFormat; + } + + public void setCertificateFormat(String certificateFormat) { + this.certificateFormat = certificateFormat; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String[] getCertificateChain() { + return certificateChain; + } + + public void setCertificateChain(String[] certificateChain) { + this.certificateChain = certificateChain; + } + + @Override + public String toString() { + return "CertificateDetail{" + + "certificateId='" + certificateId + '\'' + + ", certificateFormat='" + certificateFormat + '\'' + + ", password='" + (password != null ? "***" : null) + '\'' + + ", certificateChain=" + (certificateChain != null ? certificateChain.length + " items" : null) + + '}'; + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventDefine.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventDefine.java new file mode 100644 index 0000000..4a18c80 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventDefine.java @@ -0,0 +1,155 @@ +package com.terrabase.enterprise.api.dto; + +/** + * 告警定义对象 + * 用于注册告警定义功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class EventDefine { + + /** + * 告警定义ID + */ + private String eventDefineId; + + /** + * 告警名称 + */ + private String eventName; + + /** + * 告警描述 + */ + private String eventDescription; + + /** + * 告警类型 + */ + private String eventType; + + /** + * 告警级别 + */ + private String eventLevel; + + /** + * 告警分类 + */ + private String eventCategory; + + /** + * 触发条件 + */ + private String triggerCondition; + + /** + * 告警模板 + */ + private String eventTemplate; + + /** + * 是否启用 + */ + private Boolean enabled; + + public EventDefine() {} + + public EventDefine(String eventDefineId, String eventName, String eventDescription) { + this.eventDefineId = eventDefineId; + this.eventName = eventName; + this.eventDescription = eventDescription; + } + + public String getEventDefineId() { + return eventDefineId; + } + + public void setEventDefineId(String eventDefineId) { + this.eventDefineId = eventDefineId; + } + + public String getEventName() { + return eventName; + } + + public void setEventName(String eventName) { + this.eventName = eventName; + } + + public String getEventDescription() { + return eventDescription; + } + + public void setEventDescription(String eventDescription) { + this.eventDescription = eventDescription; + } + + public String getEventType() { + return eventType; + } + + public void setEventType(String eventType) { + this.eventType = eventType; + } + + public String getEventLevel() { + return eventLevel; + } + + public void setEventLevel(String eventLevel) { + this.eventLevel = eventLevel; + } + + public String getEventCategory() { + return eventCategory; + } + + public void setEventCategory(String eventCategory) { + this.eventCategory = eventCategory; + } + + public String getTriggerCondition() { + return triggerCondition; + } + + public void setTriggerCondition(String triggerCondition) { + this.triggerCondition = triggerCondition; + } + + public String getEventTemplate() { + return eventTemplate; + } + + public void setEventTemplate(String eventTemplate) { + this.eventTemplate = eventTemplate; + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + @Override + public String toString() { + return "EventDefine{" + + "eventDefineId='" + eventDefineId + '\'' + + ", eventName='" + eventName + '\'' + + ", eventDescription='" + eventDescription + '\'' + + ", eventType='" + eventType + '\'' + + ", eventLevel='" + eventLevel + '\'' + + ", eventCategory='" + eventCategory + '\'' + + ", triggerCondition='" + triggerCondition + '\'' + + ", eventTemplate='" + eventTemplate + '\'' + + ", enabled=" + enabled + + '}'; + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventInfo.java new file mode 100644 index 0000000..6c2ec97 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventInfo.java @@ -0,0 +1,183 @@ +package com.terrabase.enterprise.api.dto; + +/** + * 告警信息对象 + * 用于告警查询功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class EventInfo { + + /** + * 告警ID + */ + private String alarmId; + + /** + * 告警定义ID + */ + private String eventDefineId; + + /** + * 告警名称 + */ + private String alarmName; + + /** + * 告警描述 + */ + private String alarmDescription; + + /** + * 告警级别 + */ + private String alarmLevel; + + /** + * 告警状态 + */ + private String alarmStatus; + + /** + * 触发时间 + */ + private Long triggerTime; + + /** + * 告警来源 + */ + private String alarmSource; + + /** + * 处理时间 + */ + private Long handleTime; + + /** + * 处理人 + */ + private String handler; + + /** + * 处理备注 + */ + private String handleRemark; + + public EventInfo() {} + + public EventInfo(String alarmId, String alarmName, String alarmLevel) { + this.alarmId = alarmId; + this.alarmName = alarmName; + this.alarmLevel = alarmLevel; + } + + public String getAlarmId() { + return alarmId; + } + + public void setAlarmId(String alarmId) { + this.alarmId = alarmId; + } + + public String getEventDefineId() { + return eventDefineId; + } + + public void setEventDefineId(String eventDefineId) { + this.eventDefineId = eventDefineId; + } + + public String getAlarmName() { + return alarmName; + } + + public void setAlarmName(String alarmName) { + this.alarmName = alarmName; + } + + public String getAlarmDescription() { + return alarmDescription; + } + + public void setAlarmDescription(String alarmDescription) { + this.alarmDescription = alarmDescription; + } + + public String getAlarmLevel() { + return alarmLevel; + } + + public void setAlarmLevel(String alarmLevel) { + this.alarmLevel = alarmLevel; + } + + public String getAlarmStatus() { + return alarmStatus; + } + + public void setAlarmStatus(String alarmStatus) { + this.alarmStatus = alarmStatus; + } + + public Long getTriggerTime() { + return triggerTime; + } + + public void setTriggerTime(Long triggerTime) { + this.triggerTime = triggerTime; + } + + public String getAlarmSource() { + return alarmSource; + } + + public void setAlarmSource(String alarmSource) { + this.alarmSource = alarmSource; + } + + public Long getHandleTime() { + return handleTime; + } + + public void setHandleTime(Long handleTime) { + this.handleTime = handleTime; + } + + public String getHandler() { + return handler; + } + + public void setHandler(String handler) { + this.handler = handler; + } + + public String getHandleRemark() { + return handleRemark; + } + + public void setHandleRemark(String handleRemark) { + this.handleRemark = handleRemark; + } + + @Override + public String toString() { + return "EventInfo{" + + "alarmId='" + alarmId + '\'' + + ", eventDefineId='" + eventDefineId + '\'' + + ", alarmName='" + alarmName + '\'' + + ", alarmDescription='" + alarmDescription + '\'' + + ", alarmLevel='" + alarmLevel + '\'' + + ", alarmStatus='" + alarmStatus + '\'' + + ", triggerTime=" + triggerTime + + ", alarmSource='" + alarmSource + '\'' + + ", handleTime=" + handleTime + + ", handler='" + handler + '\'' + + ", handleRemark='" + handleRemark + '\'' + + '}'; + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventQueryParams.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventQueryParams.java new file mode 100644 index 0000000..821a8a2 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventQueryParams.java @@ -0,0 +1,154 @@ +package com.terrabase.enterprise.api.dto; + +/** + * 告警查询参数对象 + * 用于分页查询告警功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class EventQueryParams { + + /** + * 页码 + */ + private Integer pageNum; + + /** + * 每页大小 + */ + private Integer pageSize; + + /** + * 告警级别 + */ + private String alarmLevel; + + /** + * 告警状态 + */ + private String alarmStatus; + + /** + * 告警类型 + */ + private String alarmType; + + /** + * 开始时间 + */ + private Long startTime; + + /** + * 结束时间 + */ + private Long endTime; + + /** + * 告警来源 + */ + private String alarmSource; + + /** + * 关键字搜索 + */ + private String keyword; + + public EventQueryParams() {} + + public EventQueryParams(Integer pageNum, Integer pageSize) { + this.pageNum = pageNum; + this.pageSize = pageSize; + } + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public String getAlarmLevel() { + return alarmLevel; + } + + public void setAlarmLevel(String alarmLevel) { + this.alarmLevel = alarmLevel; + } + + public String getAlarmStatus() { + return alarmStatus; + } + + public void setAlarmStatus(String alarmStatus) { + this.alarmStatus = alarmStatus; + } + + public String getAlarmType() { + return alarmType; + } + + public void setAlarmType(String alarmType) { + this.alarmType = alarmType; + } + + public Long getStartTime() { + return startTime; + } + + public void setStartTime(Long startTime) { + this.startTime = startTime; + } + + public Long getEndTime() { + return endTime; + } + + public void setEndTime(Long endTime) { + this.endTime = endTime; + } + + public String getAlarmSource() { + return alarmSource; + } + + public void setAlarmSource(String alarmSource) { + this.alarmSource = alarmSource; + } + + public String getKeyword() { + return keyword; + } + + public void setKeyword(String keyword) { + this.keyword = keyword; + } + + @Override + public String toString() { + return "EventQueryParams{" + + "pageNum=" + pageNum + + ", pageSize=" + pageSize + + ", alarmLevel='" + alarmLevel + '\'' + + ", alarmStatus='" + alarmStatus + '\'' + + ", alarmType='" + alarmType + '\'' + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", alarmSource='" + alarmSource + '\'' + + ", keyword='" + keyword + '\'' + + '}'; + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/ForbiddenBody.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/ForbiddenBody.java new file mode 100644 index 0000000..413a5ea --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/ForbiddenBody.java @@ -0,0 +1,114 @@ +package com.terrabase.enterprise.api.dto; + +import java.util.List; + +/** + * 菜单屏蔽信息对象 + * 用于菜单屏蔽注册功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class ForbiddenBody { + + /** + * 屏蔽的菜单列表 + */ + private List forbiddenMenuIds; + + /** + * 屏蔽原因 + */ + private String reason; + + /** + * 应用场景 + */ + private String applicationScenario; + + /** + * 是否永久屏蔽 + */ + private Boolean permanent; + + /** + * 屏蔽开始时间 + */ + private Long startTime; + + /** + * 屏蔽结束时间 + */ + private Long endTime; + + public ForbiddenBody() {} + + public ForbiddenBody(List forbiddenMenuIds, String reason) { + this.forbiddenMenuIds = forbiddenMenuIds; + this.reason = reason; + } + + public List getForbiddenMenuIds() { + return forbiddenMenuIds; + } + + public void setForbiddenMenuIds(List forbiddenMenuIds) { + this.forbiddenMenuIds = forbiddenMenuIds; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getApplicationScenario() { + return applicationScenario; + } + + public void setApplicationScenario(String applicationScenario) { + this.applicationScenario = applicationScenario; + } + + public Boolean getPermanent() { + return permanent; + } + + public void setPermanent(Boolean permanent) { + this.permanent = permanent; + } + + public Long getStartTime() { + return startTime; + } + + public void setStartTime(Long startTime) { + this.startTime = startTime; + } + + public Long getEndTime() { + return endTime; + } + + public void setEndTime(Long endTime) { + this.endTime = endTime; + } + + @Override + public String toString() { + return "ForbiddenBody{" + + "forbiddenMenuIds=" + forbiddenMenuIds + + ", reason='" + reason + '\'' + + ", applicationScenario='" + applicationScenario + '\'' + + ", permanent=" + permanent + + ", startTime=" + startTime + + ", endTime=" + endTime + + '}'; + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LicenseInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LicenseInfo.java new file mode 100644 index 0000000..3fabe97 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LicenseInfo.java @@ -0,0 +1,168 @@ +package com.terrabase.enterprise.api.dto; + +/** + * License信息对象 + * 用于License信息查询功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class LicenseInfo { + + /** + * License ID + */ + private String licenseId; + + /** + * License类型 + */ + private String licenseType; + + /** + * 有效期开始时间 + */ + private Long validFrom; + + /** + * 有效期结束时间 + */ + private Long validTo; + + /** + * 功能模块列表 + */ + private String[] featureModules; + + /** + * 用户数量限制 + */ + private Integer userLimit; + + /** + * 并发连接数限制 + */ + private Integer concurrentLimit; + + /** + * 数据存储限制(GB) + */ + private Long storageLimit; + + /** + * License状态 + */ + private String licenseStatus; + + /** + * 剩余天数 + */ + private Integer remainingDays; + + public LicenseInfo() {} + + public LicenseInfo(String licenseId, String licenseType) { + this.licenseId = licenseId; + this.licenseType = licenseType; + } + + public String getLicenseId() { + return licenseId; + } + + public void setLicenseId(String licenseId) { + this.licenseId = licenseId; + } + + public String getLicenseType() { + return licenseType; + } + + public void setLicenseType(String licenseType) { + this.licenseType = licenseType; + } + + public Long getValidFrom() { + return validFrom; + } + + public void setValidFrom(Long validFrom) { + this.validFrom = validFrom; + } + + public Long getValidTo() { + return validTo; + } + + public void setValidTo(Long validTo) { + this.validTo = validTo; + } + + public String[] getFeatureModules() { + return featureModules; + } + + public void setFeatureModules(String[] featureModules) { + this.featureModules = featureModules; + } + + public Integer getUserLimit() { + return userLimit; + } + + public void setUserLimit(Integer userLimit) { + this.userLimit = userLimit; + } + + public Integer getConcurrentLimit() { + return concurrentLimit; + } + + public void setConcurrentLimit(Integer concurrentLimit) { + this.concurrentLimit = concurrentLimit; + } + + public Long getStorageLimit() { + return storageLimit; + } + + public void setStorageLimit(Long storageLimit) { + this.storageLimit = storageLimit; + } + + public String getLicenseStatus() { + return licenseStatus; + } + + public void setLicenseStatus(String licenseStatus) { + this.licenseStatus = licenseStatus; + } + + public Integer getRemainingDays() { + return remainingDays; + } + + public void setRemainingDays(Integer remainingDays) { + this.remainingDays = remainingDays; + } + + @Override + public String toString() { + return "LicenseInfo{" + + "licenseId='" + licenseId + '\'' + + ", licenseType='" + licenseType + '\'' + + ", validFrom=" + validFrom + + ", validTo=" + validTo + + ", featureModules=" + (featureModules != null ? java.util.Arrays.toString(featureModules) : null) + + ", userLimit=" + userLimit + + ", concurrentLimit=" + concurrentLimit + + ", storageLimit=" + storageLimit + + ", licenseStatus='" + licenseStatus + '\'' + + ", remainingDays=" + remainingDays + + '}'; + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LogI18NS.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LogI18NS.java new file mode 100644 index 0000000..810920d --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LogI18NS.java @@ -0,0 +1,133 @@ +package com.terrabase.enterprise.api.dto; + +import java.util.List; +import java.util.Map; + +/** + * 国际化日志信息对象 + * 用于操作日志国际化信息注册功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class LogI18NS { + + /** + * 日志国际化信息列表 + */ + private List logI18NList; + + /** + * 应用场景 + */ + private String applicationScenario; + + public LogI18NS() {} + + public LogI18NS(List logI18NList) { + this.logI18NList = logI18NList; + } + + public List getLogI18NList() { + return logI18NList; + } + + public void setLogI18NList(List logI18NList) { + this.logI18NList = logI18NList; + } + + public String getApplicationScenario() { + return applicationScenario; + } + + public void setApplicationScenario(String applicationScenario) { + this.applicationScenario = applicationScenario; + } + + @Override + public String toString() { + return "LogI18NS{" + + "logI18NList=" + logI18NList + + ", applicationScenario='" + applicationScenario + '\'' + + '}'; + } + + /** + * 单个日志国际化信息 + */ + public static class LogI18NInfo { + + /** + * 操作代码 + */ + private String operationCode; + + /** + * 操作名称 + */ + private String operationName; + + /** + * 国际化信息映射 (语言代码 -> 描述) + */ + private Map i18nMessages; + + /** + * 默认语言 + */ + private String defaultLanguage; + + public LogI18NInfo() {} + + public LogI18NInfo(String operationCode, String operationName) { + this.operationCode = operationCode; + this.operationName = operationName; + } + + public String getOperationCode() { + return operationCode; + } + + public void setOperationCode(String operationCode) { + this.operationCode = operationCode; + } + + public String getOperationName() { + return operationName; + } + + public void setOperationName(String operationName) { + this.operationName = operationName; + } + + public Map getI18nMessages() { + return i18nMessages; + } + + public void setI18nMessages(Map i18nMessages) { + this.i18nMessages = i18nMessages; + } + + public String getDefaultLanguage() { + return defaultLanguage; + } + + public void setDefaultLanguage(String defaultLanguage) { + this.defaultLanguage = defaultLanguage; + } + + @Override + public String toString() { + return "LogI18NInfo{" + + "operationCode='" + operationCode + '\'' + + ", operationName='" + operationName + '\'' + + ", i18nMessages=" + i18nMessages + + ", defaultLanguage='" + defaultLanguage + '\'' + + '}'; + } + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Logs.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Logs.java new file mode 100644 index 0000000..972c58d --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Logs.java @@ -0,0 +1,219 @@ +package com.terrabase.enterprise.api.dto; + +import java.util.List; + +/** + * 操作日志信息对象 + * 用于上报操作日志功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class Logs { + + /** + * 日志列表 + */ + private List logList; + + /** + * 应用场景 + */ + private String applicationScenario; + + public Logs() {} + + public Logs(List logList) { + this.logList = logList; + } + + public List getLogList() { + return logList; + } + + public void setLogList(List logList) { + this.logList = logList; + } + + public String getApplicationScenario() { + return applicationScenario; + } + + public void setApplicationScenario(String applicationScenario) { + this.applicationScenario = applicationScenario; + } + + @Override + public String toString() { + return "Logs{" + + "logList=" + logList + + ", applicationScenario='" + applicationScenario + '\'' + + '}'; + } + + /** + * 单个日志信息 + */ + public static class LogInfo { + + /** + * 日志ID + */ + private String logId; + + /** + * 用户ID + */ + private String userId; + + /** + * 用户名 + */ + private String userName; + + /** + * 操作类型 + */ + private String operationType; + + /** + * 操作描述 + */ + private String operationDescription; + + /** + * 操作时间 + */ + private Long operationTime; + + /** + * 操作结果 + */ + private String operationResult; + + /** + * IP地址 + */ + private String ipAddress; + + /** + * 用户代理 + */ + private String userAgent; + + /** + * 操作详情 + */ + private String operationDetails; + + public LogInfo() {} + + public LogInfo(String logId, String userId, String operationType, String operationDescription) { + this.logId = logId; + this.userId = userId; + this.operationType = operationType; + this.operationDescription = operationDescription; + this.operationTime = System.currentTimeMillis(); + } + + public String getLogId() { + return logId; + } + + public void setLogId(String logId) { + this.logId = logId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getOperationType() { + return operationType; + } + + public void setOperationType(String operationType) { + this.operationType = operationType; + } + + public String getOperationDescription() { + return operationDescription; + } + + public void setOperationDescription(String operationDescription) { + this.operationDescription = operationDescription; + } + + public Long getOperationTime() { + return operationTime; + } + + public void setOperationTime(Long operationTime) { + this.operationTime = operationTime; + } + + public String getOperationResult() { + return operationResult; + } + + public void setOperationResult(String operationResult) { + this.operationResult = operationResult; + } + + public String getIpAddress() { + return ipAddress; + } + + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } + + public String getUserAgent() { + return userAgent; + } + + public void setUserAgent(String userAgent) { + this.userAgent = userAgent; + } + + public String getOperationDetails() { + return operationDetails; + } + + public void setOperationDetails(String operationDetails) { + this.operationDetails = operationDetails; + } + + @Override + public String toString() { + return "LogInfo{" + + "logId='" + logId + '\'' + + ", userId='" + userId + '\'' + + ", userName='" + userName + '\'' + + ", operationType='" + operationType + '\'' + + ", operationDescription='" + operationDescription + '\'' + + ", operationTime=" + operationTime + + ", operationResult='" + operationResult + '\'' + + ", ipAddress='" + ipAddress + '\'' + + ", userAgent='" + userAgent + '\'' + + ", operationDetails='" + operationDetails + '\'' + + '}'; + } + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/MenuRegisterInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/MenuRegisterInfo.java new file mode 100644 index 0000000..ca87bc8 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/MenuRegisterInfo.java @@ -0,0 +1,203 @@ +package com.terrabase.enterprise.api.dto; + +import java.util.List; + +/** + * 菜单注册信息对象 + * 用于菜单注册功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class MenuRegisterInfo { + + /** + * 菜单列表 + */ + private List menuList; + + /** + * 应用场景 + */ + private String applicationScenario; + + public MenuRegisterInfo() {} + + public MenuRegisterInfo(List menuList) { + this.menuList = menuList; + } + + public List getMenuList() { + return menuList; + } + + public void setMenuList(List menuList) { + this.menuList = menuList; + } + + public String getApplicationScenario() { + return applicationScenario; + } + + public void setApplicationScenario(String applicationScenario) { + this.applicationScenario = applicationScenario; + } + + @Override + public String toString() { + return "MenuRegisterInfo{" + + "menuList=" + menuList + + ", applicationScenario='" + applicationScenario + '\'' + + '}'; + } + + /** + * 单个菜单信息 + */ + public static class MenuInfo { + + /** + * 菜单ID + */ + private String menuId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 菜单描述 + */ + private String menuDescription; + + /** + * 父菜单ID + */ + private String parentMenuId; + + /** + * 菜单路径 + */ + private String menuPath; + + /** + * 菜单图标 + */ + private String menuIcon; + + /** + * 菜单排序 + */ + private Integer menuOrder; + + /** + * 菜单类型 + */ + private String menuType; + + /** + * 是否启用 + */ + private Boolean enabled; + + public MenuInfo() {} + + public MenuInfo(String menuId, String menuName, String menuPath) { + this.menuId = menuId; + this.menuName = menuName; + this.menuPath = menuPath; + } + + public String getMenuId() { + return menuId; + } + + public void setMenuId(String menuId) { + this.menuId = menuId; + } + + public String getMenuName() { + return menuName; + } + + public void setMenuName(String menuName) { + this.menuName = menuName; + } + + public String getMenuDescription() { + return menuDescription; + } + + public void setMenuDescription(String menuDescription) { + this.menuDescription = menuDescription; + } + + public String getParentMenuId() { + return parentMenuId; + } + + public void setParentMenuId(String parentMenuId) { + this.parentMenuId = parentMenuId; + } + + public String getMenuPath() { + return menuPath; + } + + public void setMenuPath(String menuPath) { + this.menuPath = menuPath; + } + + public String getMenuIcon() { + return menuIcon; + } + + public void setMenuIcon(String menuIcon) { + this.menuIcon = menuIcon; + } + + public Integer getMenuOrder() { + return menuOrder; + } + + public void setMenuOrder(Integer menuOrder) { + this.menuOrder = menuOrder; + } + + public String getMenuType() { + return menuType; + } + + public void setMenuType(String menuType) { + this.menuType = menuType; + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + @Override + public String toString() { + return "MenuInfo{" + + "menuId='" + menuId + '\'' + + ", menuName='" + menuName + '\'' + + ", menuDescription='" + menuDescription + '\'' + + ", parentMenuId='" + parentMenuId + '\'' + + ", menuPath='" + menuPath + '\'' + + ", menuIcon='" + menuIcon + '\'' + + ", menuOrder=" + menuOrder + + ", menuType='" + menuType + '\'' + + ", enabled=" + enabled + + '}'; + } + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/PageResult.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/PageResult.java new file mode 100644 index 0000000..8e2086b --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/PageResult.java @@ -0,0 +1,133 @@ +package com.terrabase.enterprise.api.dto; + +import java.util.List; + +/** + * 分页结果对象 + * 用于分页查询功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class PageResult { + + /** + * 数据列表 + */ + private List records; + + /** + * 总记录数 + */ + private Long total; + + /** + * 当前页码 + */ + private Integer pageNum; + + /** + * 每页大小 + */ + private Integer pageSize; + + /** + * 总页数 + */ + private Integer totalPages; + + /** + * 是否有下一页 + */ + private Boolean hasNext; + + /** + * 是否有上一页 + */ + private Boolean hasPrevious; + + public PageResult() {} + + public PageResult(List records, Long total, Integer pageNum, Integer pageSize) { + this.records = records; + this.total = total; + this.pageNum = pageNum; + this.pageSize = pageSize; + this.totalPages = (int) Math.ceil((double) total / pageSize); + this.hasNext = pageNum < totalPages; + this.hasPrevious = pageNum > 1; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public Integer getTotalPages() { + return totalPages; + } + + public void setTotalPages(Integer totalPages) { + this.totalPages = totalPages; + } + + public Boolean getHasNext() { + return hasNext; + } + + public void setHasNext(Boolean hasNext) { + this.hasNext = hasNext; + } + + public Boolean getHasPrevious() { + return hasPrevious; + } + + public void setHasPrevious(Boolean hasPrevious) { + this.hasPrevious = hasPrevious; + } + + @Override + public String toString() { + return "PageResult{" + + "records=" + records + + ", total=" + total + + ", pageNum=" + pageNum + + ", pageSize=" + pageSize + + ", totalPages=" + totalPages + + ", hasNext=" + hasNext + + ", hasPrevious=" + hasPrevious + + '}'; + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RegisterCertificate.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RegisterCertificate.java new file mode 100644 index 0000000..bff93d4 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RegisterCertificate.java @@ -0,0 +1,113 @@ +package com.terrabase.enterprise.api.dto; + +/** + * 证书注册对象 + * 用于证书注册功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class RegisterCertificate { + + /** + * 证书ID + */ + private String certificateId; + + /** + * 证书名称 + */ + private String certificateName; + + /** + * 证书类型 + */ + private String certificateType; + + /** + * 证书用途 + */ + private String certificateUsage; + + /** + * 证书描述 + */ + private String certificateDescription; + + /** + * 有效期(天数) + */ + private Integer validityDays; + + public RegisterCertificate() {} + + public RegisterCertificate(String certificateId, String certificateName, String certificateType) { + this.certificateId = certificateId; + this.certificateName = certificateName; + this.certificateType = certificateType; + } + + public String getCertificateId() { + return certificateId; + } + + public void setCertificateId(String certificateId) { + this.certificateId = certificateId; + } + + public String getCertificateName() { + return certificateName; + } + + public void setCertificateName(String certificateName) { + this.certificateName = certificateName; + } + + public String getCertificateType() { + return certificateType; + } + + public void setCertificateType(String certificateType) { + this.certificateType = certificateType; + } + + public String getCertificateUsage() { + return certificateUsage; + } + + public void setCertificateUsage(String certificateUsage) { + this.certificateUsage = certificateUsage; + } + + public String getCertificateDescription() { + return certificateDescription; + } + + public void setCertificateDescription(String certificateDescription) { + this.certificateDescription = certificateDescription; + } + + public Integer getValidityDays() { + return validityDays; + } + + public void setValidityDays(Integer validityDays) { + this.validityDays = validityDays; + } + + @Override + public String toString() { + return "RegisterCertificate{" + + "certificateId='" + certificateId + '\'' + + ", certificateName='" + certificateName + '\'' + + ", certificateType='" + certificateType + '\'' + + ", certificateUsage='" + certificateUsage + '\'' + + ", certificateDescription='" + certificateDescription + '\'' + + ", validityDays=" + validityDays + + '}'; + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleRegister.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleRegister.java new file mode 100644 index 0000000..77a56a6 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleRegister.java @@ -0,0 +1,112 @@ +package com.terrabase.enterprise.api.dto; + +/** + * 角色注册对象 + * 用于角色注册功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class RoleRegister { + + /** + * 角色ID + */ + private String roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色描述 + */ + private String roleDescription; + + /** + * 角色类型 + */ + private String roleType; + + /** + * 权限列表 + */ + private String[] permissions; + + /** + * 应用场景 + */ + private String applicationScenario; + + public RoleRegister() {} + + public RoleRegister(String roleId, String roleName, String roleDescription) { + this.roleId = roleId; + this.roleName = roleName; + this.roleDescription = roleDescription; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getRoleDescription() { + return roleDescription; + } + + public void setRoleDescription(String roleDescription) { + this.roleDescription = roleDescription; + } + + public String getRoleType() { + return roleType; + } + + public void setRoleType(String roleType) { + this.roleType = roleType; + } + + public String[] getPermissions() { + return permissions; + } + + public void setPermissions(String[] permissions) { + this.permissions = permissions; + } + + public String getApplicationScenario() { + return applicationScenario; + } + + public void setApplicationScenario(String applicationScenario) { + this.applicationScenario = applicationScenario; + } + + @Override + public String toString() { + return "RoleRegister{" + + "roleId='" + roleId + '\'' + + ", roleName='" + roleName + '\'' + + ", roleDescription='" + roleDescription + '\'' + + ", roleType='" + roleType + '\'' + + ", applicationScenario='" + applicationScenario + '\'' + + '}'; + } +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Subscribe.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Subscribe.java new file mode 100644 index 0000000..85ea387 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Subscribe.java @@ -0,0 +1,114 @@ +package com.terrabase.enterprise.api.dto; + +/** + * 订阅信息对象 + * 用于时间配置变更事件订阅功能的数据传输对象 + * + * @author Terrabase Team + * @version 1.0.0 + */ +public class Subscribe { + + /** + * 订阅ID + */ + private String subscribeId; + + /** + * 服务名称 + */ + private String serviceName; + + /** + * 通知地址 + */ + private String notifyAddress; + + /** + * 事件类型 + */ + private String eventType; + + /** + * 订阅状态 + */ + private String status; + + /** + * 创建时间 + */ + private Long createTime; + + public Subscribe() {} + + public Subscribe(String subscribeId, String serviceName, String notifyAddress) { + this.subscribeId = subscribeId; + this.serviceName = serviceName; + this.notifyAddress = notifyAddress; + this.createTime = System.currentTimeMillis(); + } + + public String getSubscribeId() { + return subscribeId; + } + + public void setSubscribeId(String subscribeId) { + this.subscribeId = subscribeId; + } + + public String getServiceName() { + return serviceName; + } + + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } + + public String getNotifyAddress() { + return notifyAddress; + } + + public void setNotifyAddress(String notifyAddress) { + this.notifyAddress = notifyAddress; + } + + public String getEventType() { + return eventType; + } + + public void setEventType(String eventType) { + this.eventType = eventType; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Long getCreateTime() { + return createTime; + } + + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "Subscribe{" + + "subscribeId='" + subscribeId + '\'' + + ", serviceName='" + serviceName + '\'' + + ", notifyAddress='" + notifyAddress + '\'' + + ", eventType='" + eventType + '\'' + + ", status='" + status + '\'' + + ", createTime=" + createTime + + '}'; + } +} + + + + diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCertificateServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCertificateServiceImpl.java new file mode 100644 index 0000000..f160405 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCertificateServiceImpl.java @@ -0,0 +1,401 @@ +package com.terrabase.enterprise.impl.commercial; + +import com.terrabase.enterprise.api.CertificateService; +import com.terrabase.enterprise.api.dto.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClientException; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 商业版证书管理服务实现 + * 集成商业组件实现证书管理功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Service +public class CommercialCertificateServiceImpl implements CertificateService { + + private static final Logger logger = LoggerFactory.getLogger(CommercialCertificateServiceImpl.class); + + private final AtomicBoolean running = new AtomicBoolean(false); + + private final RestTemplate restTemplate; + + private String omsBaseUrl; + private int timeout; + + public CommercialCertificateServiceImpl(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + // 设置默认值 + this.omsBaseUrl = "http://localhost:8081/api/"; + this.timeout = 30000; + } + + public CommercialCertificateServiceImpl(RestTemplate restTemplate, String omsBaseUrl, int timeout) { + this.restTemplate = restTemplate; + this.omsBaseUrl = omsBaseUrl; + this.timeout = timeout; + } + + @Override + public String getServiceName() { + return "Commercial Certificate Service"; + } + + @Override + public String getServiceVersion() { + return "1.0.0-commercial"; + } + + @Override + public String getServiceType() { + return "commercial"; + } + + @Override + public String getHealthStatus() { + if (!running.get()) { + return "服务未运行"; + } + + return String.format("商业版证书管理服务健康状态: 正常 (版本: %s, 类型: %s)", + getServiceVersion(), getServiceType()); + } + + @Override + public void start() { + if (running.compareAndSet(false, true)) { + logger.info("商业版证书管理服务已启动"); + } else { + logger.warn("商业版证书管理服务已经在运行中"); + } + } + + @Override + public void stop() { + if (running.compareAndSet(true, false)) { + logger.info("商业版证书管理服务已停止"); + } else { + logger.warn("商业版证书管理服务已经停止"); + } + } + + @Override + public boolean isRunning() { + return running.get(); + } + + // ========== 证书管理相关接口实现 ========== + + @Override + public void registerCertificate(RegisterCertificate certificate) { + if (!running.get()) { + logger.warn("服务未运行,无法执行证书注册操作"); + return; + } + + if (certificate == null) { + logger.warn("证书注册对象不能为空"); + return; + } + + try { + logger.info("商业版执行证书注册: {}", certificate); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("certificateId", certificate.getCertificateId()); + requestBody.put("certificateName", certificate.getCertificateName()); + requestBody.put("certificateType", certificate.getCertificateType()); + requestBody.put("description", certificate.getCertificateDescription()); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建证书注册接口URL + String registerCertificateUrl = omsBaseUrl + "/framework/v1/certificate/action/register/type/internal"; + + // 调用REST接口进行证书注册 + ResponseEntity response = restTemplate.postForEntity(registerCertificateUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + logger.info("商业版REST接口证书注册成功 - 证书ID: {}, 证书名称: {}, 证书类型: {}", + certificate.getCertificateId(), certificate.getCertificateName(), certificate.getCertificateType()); + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口证书注册失败: {}", errorMsg); + } + } else { + logger.error("商业版REST接口证书注册失败,HTTP状态码: {}", response.getStatusCode()); + } + + } catch (RestClientException e) { + logger.error("商业版REST接口证书注册调用异常", e); + } catch (Exception e) { + logger.error("商业版证书注册失败: {}", certificate, e); + } + } + + @Override + public void importOrUpdateCertificate(CertificateDetail certificate) { + if (!running.get()) { + logger.warn("服务未运行,无法执行证书导入/更新操作"); + return; + } + + if (certificate == null) { + logger.warn("证书详细信息对象不能为空"); + return; + } + + try { + logger.info("商业版执行证书导入/更新,证书ID: {}", certificate.getCertificateId()); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("certificateId", certificate.getCertificateId()); + requestBody.put("certificateFormat", certificate.getCertificateFormat()); + requestBody.put("certificateContent", certificate.getCertificateContent()); + requestBody.put("privateKey", certificate.getPrivateKeyContent()); + requestBody.put("password", certificate.getPassword()); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建证书导入/更新接口URL + String importCertificateUrl = omsBaseUrl + "/framework/v1/certificate/action/import/om"; + + // 调用REST接口进行证书导入/更新 + ResponseEntity response = restTemplate.postForEntity(importCertificateUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + logger.info("商业版REST接口证书导入/更新成功 - 证书ID: {}, 证书格式: {}", + certificate.getCertificateId(), certificate.getCertificateFormat()); + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口证书导入/更新失败: {}", errorMsg); + } + } else { + logger.error("商业版REST接口证书导入/更新失败,HTTP状态码: {}", response.getStatusCode()); + } + + } catch (RestClientException e) { + logger.error("商业版REST接口证书导入/更新调用异常", e); + } catch (Exception e) { + logger.error("商业版证书导入/更新失败: {}", certificate, e); + } + } + + @Override + public void importTrustedCaCertificate(CaCertificate caCertificate) { + if (!running.get()) { + logger.warn("服务未运行,无法执行CA证书导入操作"); + return; + } + + if (caCertificate == null) { + logger.warn("CA证书对象不能为空"); + return; + } + + try { + logger.info("商业版执行CA证书导入: {}", caCertificate); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("caCertificateId", caCertificate.getCaCertificateId()); + requestBody.put("caCertificateName", caCertificate.getCaCertificateName()); + requestBody.put("issuer", caCertificate.getIssuer()); + requestBody.put("certificateContent", caCertificate.getCaCertificateContent()); + requestBody.put("validFrom", caCertificate.getValidFrom()); + requestBody.put("validTo", caCertificate.getValidTo()); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建CA证书导入接口URL + String importCaCertificateUrl = omsBaseUrl + "/framework/v1/certificate/action/import"; + + // 调用REST接口进行CA证书导入 + ResponseEntity response = restTemplate.postForEntity(importCaCertificateUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + logger.info("商业版REST接口CA证书导入成功 - CA证书ID: {}, CA证书名称: {}, 颁发者: {}", + caCertificate.getCaCertificateId(), caCertificate.getCaCertificateName(), caCertificate.getIssuer()); + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口CA证书导入失败: {}", errorMsg); + } + } else { + logger.error("商业版REST接口CA证书导入失败,HTTP状态码: {}", response.getStatusCode()); + } + + } catch (RestClientException e) { + logger.error("商业版REST接口CA证书导入调用异常", e); + } catch (Exception e) { + logger.error("商业版CA证书导入失败: {}", caCertificate, e); + } + } + + @Override + public List queryAllCertificates() { + if (!running.get()) { + logger.warn("服务未运行,无法执行证书信息查询操作"); + return null; + } + + try { + logger.info("商业版执行证书信息查询"); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity requestEntity = new HttpEntity<>(headers); + + // 构建证书信息查询接口URL + String queryCertificatesUrl = omsBaseUrl + "/framework/v1/certificate/action/cert/collect"; + + // 调用REST接口进行证书信息查询 + ResponseEntity response = restTemplate.exchange(queryCertificatesUrl, HttpMethod.GET, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + @SuppressWarnings("unchecked") + List> certificateList = (List>) responseBody.get("certificateList"); + + List certificates = new java.util.ArrayList<>(); + if (certificateList != null) { + for (Map certMap : certificateList) { + CertCollectInfo cert = new CertCollectInfo( + (String) certMap.get("certificateId"), + (String) certMap.get("certificateName"), + (String) certMap.get("certificateType") + ); + cert.setCertificateStatus((String) certMap.get("certificateStatus")); + cert.setValidFrom((Long) certMap.get("validFrom")); + cert.setValidTo((Long) certMap.get("validTo")); + cert.setIssuer((String) certMap.get("issuer")); + cert.setSubject((String) certMap.get("subject")); + certificates.add(cert); + } + } + + logger.info("商业版REST接口证书信息查询成功,查询到证书数量: {}", certificates.size()); + return certificates; + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口证书信息查询失败: {}", errorMsg); + return null; + } + } else { + logger.error("商业版REST接口证书信息查询失败,HTTP状态码: {}", response.getStatusCode()); + return null; + } + + } catch (RestClientException e) { + logger.error("商业版REST接口证书信息查询调用异常", e); + return null; + } catch (Exception e) { + logger.error("商业版证书信息查询失败", e); + return null; + } + } + + @Override + public LicenseInfo queryLicenseInfo() { + if (!running.get()) { + logger.warn("服务未运行,无法执行License信息查询操作"); + return null; + } + + try { + logger.info("商业版执行License信息查询"); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity requestEntity = new HttpEntity<>(headers); + + // 构建License信息查询接口URL + String queryLicenseUrl = omsBaseUrl + "/framework/v1/license/info"; + + // 调用REST接口进行License信息查询 + ResponseEntity response = restTemplate.exchange(queryLicenseUrl, HttpMethod.GET, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + LicenseInfo licenseInfo = new LicenseInfo( + (String) responseBody.get("licenseId"), + (String) responseBody.get("licenseType") + ); + licenseInfo.setValidFrom((Long) responseBody.get("validFrom")); + licenseInfo.setValidTo((Long) responseBody.get("validTo")); + licenseInfo.setFeatureModules((String[]) responseBody.get("featureModules")); + licenseInfo.setUserLimit((Integer) responseBody.get("userLimit")); + licenseInfo.setConcurrentLimit((Integer) responseBody.get("concurrentLimit")); + licenseInfo.setStorageLimit((Long) responseBody.get("storageLimit")); + licenseInfo.setLicenseStatus((String) responseBody.get("licenseStatus")); + licenseInfo.setRemainingDays((Integer) responseBody.get("remainingDays")); + + logger.info("商业版REST接口License信息查询成功 - License ID: {}, License类型: {}, 剩余天数: {}", + licenseInfo.getLicenseId(), licenseInfo.getLicenseType(), licenseInfo.getRemainingDays()); + + return licenseInfo; + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口License信息查询失败: {}", errorMsg); + return null; + } + } else { + logger.error("商业版REST接口License信息查询失败,HTTP状态码: {}", response.getStatusCode()); + return null; + } + + } catch (RestClientException e) { + logger.error("商业版REST接口License信息查询调用异常", e); + return null; + } catch (Exception e) { + logger.error("商业版License信息查询失败", e); + return null; + } + } +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCryptoServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCryptoServiceImpl.java new file mode 100644 index 0000000..44b214e --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCryptoServiceImpl.java @@ -0,0 +1,218 @@ +package com.terrabase.enterprise.impl.commercial; + +import com.terrabase.enterprise.api.CryptoService; +import com.terrabase.enterprise.api.CryptoAlgorithm; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClientException; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 商业版加解密服务实现 + * 集成商业组件实现加解密功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Service +public class CommercialCryptoServiceImpl implements CryptoService { + + private static final Logger logger = LoggerFactory.getLogger(CommercialCryptoServiceImpl.class); + + private final AtomicBoolean running = new AtomicBoolean(false); + + private final RestTemplate restTemplate; + + private String omsBaseUrl; + private int timeout; + + public CommercialCryptoServiceImpl(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + // 设置默认值 + this.omsBaseUrl = "http://localhost:8081/api/"; + this.timeout = 30000; + } + + public CommercialCryptoServiceImpl(RestTemplate restTemplate, String omsBaseUrl, int timeout) { + this.restTemplate = restTemplate; + this.omsBaseUrl = omsBaseUrl; + this.timeout = timeout; + } + + @Override + public String getServiceName() { + return "Commercial Crypto Service"; + } + + @Override + public String getServiceVersion() { + return "1.0.0-commercial"; + } + + @Override + public String getServiceType() { + return "commercial"; + } + + @Override + public String getHealthStatus() { + if (!running.get()) { + return "服务未运行"; + } + + return String.format("商业版加解密服务健康状态: 正常 (版本: %s, 类型: %s)", + getServiceVersion(), getServiceType()); + } + + @Override + public void start() { + if (running.compareAndSet(false, true)) { + logger.info("商业版加解密服务已启动"); + } else { + logger.warn("商业版加解密服务已经在运行中"); + } + } + + @Override + public void stop() { + if (running.compareAndSet(true, false)) { + logger.info("商业版加解密服务已停止"); + } else { + logger.warn("商业版加解密服务已经停止"); + } + } + + @Override + public boolean isRunning() { + return running.get(); + } + + @Override + public String encrypt(String plaintext, CryptoAlgorithm algorithm) { + if (!running.get()) { + return "服务未运行,无法执行加密操作"; + } + + if (plaintext == null || plaintext.trim().isEmpty()) { + return "明文数据不能为空"; + } + + if (algorithm == null) { + algorithm = CryptoAlgorithm.AES; // 默认使用AES + } + + try { + logger.info("商业版执行数据加密,原文长度: {}, 算法: {}", plaintext.length(), algorithm.getAlgorithm()); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("plaintext", plaintext); + requestBody.put("algorithm", algorithm.getAlgorithm()); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建加密接口URL + String encryptUrl = omsBaseUrl + "/enterprise/encrypt"; + + // 调用REST接口进行加密 + ResponseEntity response = restTemplate.postForEntity(encryptUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String ciphertext = (String) responseBody.get("ciphertext"); + String status = (String) responseBody.get("status"); + + if ("success".equals(status) && ciphertext != null) { + logger.info("商业版REST接口加密成功,算法: {}", algorithm.getAlgorithm()); + return ciphertext; + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口加密失败: {}", errorMsg); + return "加密失败: " + (errorMsg != null ? errorMsg : "未知错误"); + } + } else { + logger.error("商业版REST接口加密失败,HTTP状态码: {}", response.getStatusCode()); + return "加密失败: HTTP请求失败,状态码: " + response.getStatusCode(); + } + + } catch (RestClientException e) { + logger.error("商业版REST接口加密调用异常,算法: {}", algorithm, e); + return "加密失败: REST接口调用异常 - " + e.getMessage(); + } catch (Exception e) { + logger.error("商业版加密失败,算法: {}", algorithm, e); + return "加密失败: " + e.getMessage(); + } + } + + @Override + public String decrypt(String ciphertext, CryptoAlgorithm algorithm) { + if (!running.get()) { + return "服务未运行,无法执行解密操作"; + } + + if (ciphertext == null || ciphertext.trim().isEmpty()) { + return "密文数据不能为空"; + } + + if (algorithm == null) { + algorithm = CryptoAlgorithm.AES; // 默认使用AES + } + + try { + logger.info("商业版执行数据解密,密文长度: {}, 算法: {}", ciphertext.length(), algorithm.getAlgorithm()); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("ciphertext", ciphertext); + requestBody.put("algorithm", algorithm.getAlgorithm()); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建解密接口URL + String decryptUrl = omsBaseUrl + "/enterprise/decrypt"; + + // 调用REST接口进行解密 + ResponseEntity response = restTemplate.postForEntity(decryptUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String plaintext = (String) responseBody.get("plaintext"); + String status = (String) responseBody.get("status"); + + if ("success".equals(status) && plaintext != null) { + logger.info("商业版REST接口解密成功,算法: {}", algorithm.getAlgorithm()); + return plaintext; + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口解密失败: {}", errorMsg); + return "解密失败: " + (errorMsg != null ? errorMsg : "未知错误"); + } + } else { + logger.error("商业版REST接口解密失败,HTTP状态码: {}", response.getStatusCode()); + return "解密失败: HTTP请求失败,状态码: " + response.getStatusCode(); + } + + } catch (RestClientException e) { + logger.error("商业版REST接口解密调用异常,算法: {}", algorithm, e); + return "解密失败: REST接口调用异常 - " + e.getMessage(); + } catch (Exception e) { + logger.error("商业版解密失败,算法: {}", algorithm, e); + return "解密失败: " + e.getMessage(); + } + } +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java index de8beb2..a2bd3ac 100644 --- a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java @@ -1,7 +1,6 @@ package com.terrabase.enterprise.impl.commercial; import com.terrabase.enterprise.api.EnterpriseService; -import com.terrabase.enterprise.api.CryptoAlgorithm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -10,7 +9,7 @@ /** * 商业版企业服务实现 - * 集成 Nexent 和 ModelEngine 等商业组件 + * 提供企业级服务的基本功能,子服务通过JarLoadUtil独立管理 * * @author Terrabase Team * @version 1.0.0 @@ -51,6 +50,7 @@ public String getHealthStatus() { public void start() { if (running.compareAndSet(false, true)) { logger.info("商业版企业服务已启动"); + // 注意:子服务现在通过JarLoadUtil独立管理,不再在此处启动 } else { logger.warn("商业版企业服务已经在运行中"); } @@ -60,6 +60,7 @@ public void start() { public void stop() { if (running.compareAndSet(true, false)) { logger.info("商业版企业服务已停止"); + // 注意:子服务现在通过JarLoadUtil独立管理,不再在此处停止 } else { logger.warn("商业版企业服务已经停止"); } @@ -70,90 +71,4 @@ public boolean isRunning() { return running.get(); } - @Override - public String encrypt(String plaintext, CryptoAlgorithm algorithm) { - if (!running.get()) { - return "服务未运行,无法执行加密操作"; - } - - if (plaintext == null || plaintext.trim().isEmpty()) { - return "明文数据不能为空"; - } - - if (algorithm == null) { - algorithm = CryptoAlgorithm.AES; // 默认使用AES - } - - try { - logger.info("商业版执行数据加密,原文长度: {}, 算法: {}", plaintext.length(), algorithm.getAlgorithm()); - - // 商业版模拟加密过程(实际项目中这里会调用商业加密库) - String ciphertext = simulateCommercialEncryption(plaintext, algorithm); - - return String.format("商业版加密成功 [%s]: %s", algorithm.getAlgorithm(), ciphertext); - - } catch (Exception e) { - logger.error("商业版加密失败,算法: {}", algorithm, e); - return "加密失败: " + e.getMessage(); - } - } - - @Override - public String decrypt(String ciphertext, CryptoAlgorithm algorithm) { - if (!running.get()) { - return "服务未运行,无法执行解密操作"; - } - - if (ciphertext == null || ciphertext.trim().isEmpty()) { - return "密文数据不能为空"; - } - - if (algorithm == null) { - algorithm = CryptoAlgorithm.AES; // 默认使用AES - } - - try { - logger.info("商业版执行数据解密,密文长度: {}, 算法: {}", ciphertext.length(), algorithm.getAlgorithm()); - - // 商业版模拟解密过程(实际项目中这里会调用商业解密库) - String plaintext = simulateCommercialDecryption(ciphertext, algorithm); - - return String.format("商业版解密成功 [%s]: %s", algorithm.getAlgorithm(), plaintext); - - } catch (Exception e) { - logger.error("商业版解密失败,算法: {}", algorithm, e); - return "解密失败: " + e.getMessage(); - } - } - - /** - * 模拟商业版加密过程 - * 实际项目中这里会调用Nexent或其他商业加密库 - */ - private String simulateCommercialEncryption(String plaintext, CryptoAlgorithm algorithm) { - // 模拟商业加密库的处理过程 - StringBuilder result = new StringBuilder(); - result.append("COMMERCIAL_").append(algorithm.getAlgorithm()).append("_"); - - // 简单的Base64编码作为模拟 - String encoded = java.util.Base64.getEncoder().encodeToString(plaintext.getBytes()); - result.append(encoded); - - return result.toString(); - } - - /** - * 模拟商业版解密过程 - * 实际项目中这里会调用Nexent或其他商业解密库 - */ - private String simulateCommercialDecryption(String ciphertext, CryptoAlgorithm algorithm) { - // 模拟商业解密库的处理过程 - if (ciphertext.startsWith("COMMERCIAL_" + algorithm.getAlgorithm() + "_")) { - String encoded = ciphertext.substring(("COMMERCIAL_" + algorithm.getAlgorithm() + "_").length()); - return new String(java.util.Base64.getDecoder().decode(encoded)); - } else { - // 如果不是商业版格式,直接返回原文(向后兼容) - return ciphertext; - } - } } diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialLogManagementServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialLogManagementServiceImpl.java new file mode 100644 index 0000000..b4e8fbb --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialLogManagementServiceImpl.java @@ -0,0 +1,210 @@ +package com.terrabase.enterprise.impl.commercial; + +import com.terrabase.enterprise.api.LogManagementService; +import com.terrabase.enterprise.api.dto.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClientException; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 商业版日志管理服务实现 + * 集成商业组件实现日志管理功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Service +public class CommercialLogManagementServiceImpl implements LogManagementService { + + private static final Logger logger = LoggerFactory.getLogger(CommercialLogManagementServiceImpl.class); + + private final AtomicBoolean running = new AtomicBoolean(false); + + private final RestTemplate restTemplate; + + private String omsBaseUrl; + private int timeout; + + public CommercialLogManagementServiceImpl(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + // 设置默认值 + this.omsBaseUrl = "http://localhost:8081/api/"; + this.timeout = 30000; + } + + public CommercialLogManagementServiceImpl(RestTemplate restTemplate, String omsBaseUrl, int timeout) { + this.restTemplate = restTemplate; + this.omsBaseUrl = omsBaseUrl; + this.timeout = timeout; + } + + @Override + public String getServiceName() { + return "Commercial Log Management Service"; + } + + @Override + public String getServiceVersion() { + return "1.0.0-commercial"; + } + + @Override + public String getServiceType() { + return "commercial"; + } + + @Override + public String getHealthStatus() { + if (!running.get()) { + return "服务未运行"; + } + + return String.format("商业版日志管理服务健康状态: 正常 (版本: %s, 类型: %s)", + getServiceVersion(), getServiceType()); + } + + @Override + public void start() { + if (running.compareAndSet(false, true)) { + logger.info("商业版日志管理服务已启动"); + } else { + logger.warn("商业版日志管理服务已经在运行中"); + } + } + + @Override + public void stop() { + if (running.compareAndSet(true, false)) { + logger.info("商业版日志管理服务已停止"); + } else { + logger.warn("商业版日志管理服务已经停止"); + } + } + + @Override + public boolean isRunning() { + return running.get(); + } + + // ========== 日志与监控相关接口实现 ========== + + @Override + public void registerOperateLogI18N(LogI18NS logI18NS) { + if (!running.get()) { + logger.warn("服务未运行,无法执行操作日志国际化信息注册操作"); + return; + } + + if (logI18NS == null || logI18NS.getLogI18NList() == null) { + logger.warn("操作日志国际化信息对象不能为空"); + return; + } + + try { + logger.info("商业版执行操作日志国际化信息注册,国际化信息数量: {}", logI18NS.getLogI18NList().size()); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("logI18NList", logI18NS.getLogI18NList()); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建操作日志国际化信息注册接口URL + String registerLogI18NUrl = omsBaseUrl + "/framework/v1/log/operateLogs/actions/register/internation/internal"; + + // 调用REST接口进行操作日志国际化信息注册 + ResponseEntity response = restTemplate.postForEntity(registerLogI18NUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + logger.info("商业版REST接口操作日志国际化信息注册成功,国际化信息数量: {}", logI18NS.getLogI18NList().size()); + for (LogI18NS.LogI18NInfo logI18NInfo : logI18NS.getLogI18NList()) { + logger.info("商业版操作日志国际化信息注册成功 - 操作代码: {}, 操作名称: {}, 默认语言: {}", + logI18NInfo.getOperationCode(), logI18NInfo.getOperationName(), logI18NInfo.getDefaultLanguage()); + } + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口操作日志国际化信息注册失败: {}", errorMsg); + } + } else { + logger.error("商业版REST接口操作日志国际化信息注册失败,HTTP状态码: {}", response.getStatusCode()); + } + + } catch (RestClientException e) { + logger.error("商业版REST接口操作日志国际化信息注册调用异常", e); + } catch (Exception e) { + logger.error("商业版操作日志国际化信息注册失败: {}", logI18NS, e); + } + } + + @Override + public void reportOperateLog(Logs logs) { + if (!running.get()) { + logger.warn("服务未运行,无法执行操作日志上报操作"); + return; + } + + if (logs == null || logs.getLogList() == null) { + logger.warn("操作日志对象不能为空"); + return; + } + + try { + logger.info("商业版执行操作日志上报,日志数量: {}", logs.getLogList().size()); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("logList", logs.getLogList()); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建操作日志上报接口URL + String reportLogUrl = omsBaseUrl + "/framework/v1/log/operateLogs/actions/register/internal"; + + // 调用REST接口进行操作日志上报 + ResponseEntity response = restTemplate.postForEntity(reportLogUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + logger.info("商业版REST接口操作日志上报成功,日志数量: {}", logs.getLogList().size()); + for (Logs.LogInfo logInfo : logs.getLogList()) { + logger.info("商业版操作日志上报成功 - 日志ID: {}, 用户ID: {}, 操作类型: {}, 操作描述: {}", + logInfo.getLogId(), logInfo.getUserId(), logInfo.getOperationType(), logInfo.getOperationDescription()); + } + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口操作日志上报失败: {}", errorMsg); + } + } else { + logger.error("商业版REST接口操作日志上报失败,HTTP状态码: {}", response.getStatusCode()); + } + + } catch (RestClientException e) { + logger.error("商业版REST接口操作日志上报调用异常", e); + } catch (Exception e) { + logger.error("商业版操作日志上报失败: {}", logs, e); + } + } +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialMonitoringServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialMonitoringServiceImpl.java new file mode 100644 index 0000000..f9d0fc5 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialMonitoringServiceImpl.java @@ -0,0 +1,374 @@ +package com.terrabase.enterprise.impl.commercial; + +import com.terrabase.enterprise.api.MonitoringService; +import com.terrabase.enterprise.api.dto.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClientException; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 商业版监控告警服务实现 + * 集成商业组件实现监控告警功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Service +public class CommercialMonitoringServiceImpl implements MonitoringService { + + private static final Logger logger = LoggerFactory.getLogger(CommercialMonitoringServiceImpl.class); + + private final AtomicBoolean running = new AtomicBoolean(false); + + private final RestTemplate restTemplate; + + private String omsBaseUrl; + private int timeout; + + public CommercialMonitoringServiceImpl(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + // 设置默认值 + this.omsBaseUrl = "http://localhost:8081/api/"; + this.timeout = 30000; + } + + public CommercialMonitoringServiceImpl(RestTemplate restTemplate, String omsBaseUrl, int timeout) { + this.restTemplate = restTemplate; + this.omsBaseUrl = omsBaseUrl; + this.timeout = timeout; + } + + @Override + public String getServiceName() { + return "Commercial Monitoring Service"; + } + + @Override + public String getServiceVersion() { + return "1.0.0-commercial"; + } + + @Override + public String getServiceType() { + return "commercial"; + } + + @Override + public String getHealthStatus() { + if (!running.get()) { + return "服务未运行"; + } + + return String.format("商业版监控告警服务健康状态: 正常 (版本: %s, 类型: %s)", + getServiceVersion(), getServiceType()); + } + + @Override + public void start() { + if (running.compareAndSet(false, true)) { + logger.info("商业版监控告警服务已启动"); + } else { + logger.warn("商业版监控告警服务已经在运行中"); + } + } + + @Override + public void stop() { + if (running.compareAndSet(true, false)) { + logger.info("商业版监控告警服务已停止"); + } else { + logger.warn("商业版监控告警服务已经停止"); + } + } + + @Override + public boolean isRunning() { + return running.get(); + } + + // ========== 告警系统相关接口实现 ========== + + @Override + public void registerEventDefine(EventDefine eventDefine) { + if (!running.get()) { + logger.warn("服务未运行,无法执行告警定义注册操作"); + return; + } + + if (eventDefine == null) { + logger.warn("告警定义对象不能为空"); + return; + } + + try { + logger.info("商业版执行告警定义注册: {}", eventDefine); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("eventDefineId", eventDefine.getEventDefineId()); + requestBody.put("eventName", eventDefine.getEventName()); + requestBody.put("eventLevel", eventDefine.getEventLevel()); + requestBody.put("eventDescription", eventDefine.getEventDescription()); + requestBody.put("eventType", eventDefine.getEventType()); + requestBody.put("threshold", eventDefine.getTriggerCondition()); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建告警定义注册接口URL + String registerEventDefineUrl = omsBaseUrl + "/monitor/v1/events/defines"; + + // 调用REST接口进行告警定义注册 + ResponseEntity response = restTemplate.postForEntity(registerEventDefineUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + logger.info("商业版REST接口告警定义注册成功 - 告警定义ID: {}, 告警名称: {}, 告警级别: {}", + eventDefine.getEventDefineId(), eventDefine.getEventName(), eventDefine.getEventLevel()); + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口告警定义注册失败: {}", errorMsg); + } + } else { + logger.error("商业版REST接口告警定义注册失败,HTTP状态码: {}", response.getStatusCode()); + } + + } catch (RestClientException e) { + logger.error("商业版REST接口告警定义注册调用异常", e); + } catch (Exception e) { + logger.error("商业版告警定义注册失败: {}", eventDefine, e); + } + } + + @Override + public void sendAlarmsBatch(List alarms) { + if (!running.get()) { + logger.warn("服务未运行,无法执行告警上报操作"); + return; + } + + if (alarms == null || alarms.isEmpty()) { + logger.warn("告警信息列表不能为空"); + return; + } + + try { + logger.info("商业版执行告警批量上报,告警数量: {}", alarms.size()); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("alarms", alarms); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建告警上报接口URL + String sendAlarmsUrl = omsBaseUrl + "/monitor/v1/events/service/send-alarm/internal"; + + // 调用REST接口进行告警上报 + ResponseEntity response = restTemplate.postForEntity(sendAlarmsUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + logger.info("商业版REST接口告警批量上报成功,告警数量: {}", alarms.size()); + for (AlarmInfo alarmInfo : alarms) { + logger.info("商业版告警上报成功 - 告警ID: {}, 告警名称: {}, 告警级别: {}", + alarmInfo.getAlarmId(), alarmInfo.getAlarmName(), alarmInfo.getAlarmLevel()); + } + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口告警批量上报失败: {}", errorMsg); + } + } else { + logger.error("商业版REST接口告警批量上报失败,HTTP状态码: {}", response.getStatusCode()); + } + + } catch (RestClientException e) { + logger.error("商业版REST接口告警批量上报调用异常", e); + } catch (Exception e) { + logger.error("商业版告警批量上报失败", e); + } + } + + @Override + public PageResult getEventsByPage(EventQueryParams queryParams) { + if (!running.get()) { + logger.warn("服务未运行,无法执行告警查询操作"); + return null; + } + + if (queryParams == null) { + logger.warn("告警查询参数对象不能为空"); + return null; + } + + try { + logger.info("商业版执行告警分页查询,页码: {}, 每页大小: {}", queryParams.getPageNum(), queryParams.getPageSize()); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("pageNum", queryParams.getPageNum()); + requestBody.put("pageSize", queryParams.getPageSize()); + requestBody.put("eventLevel", queryParams.getAlarmLevel()); + requestBody.put("alarmStatus", queryParams.getAlarmStatus()); + requestBody.put("startTime", queryParams.getStartTime()); + requestBody.put("endTime", queryParams.getEndTime()); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建告警分页查询接口URL + String getEventsUrl = omsBaseUrl + "/monitor/v1/events"; + + // 调用REST接口进行告警分页查询 + ResponseEntity response = restTemplate.postForEntity(getEventsUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + @SuppressWarnings("unchecked") + List> eventList = (List>) responseBody.get("eventList"); + Long total = (Long) responseBody.get("total"); + + List events = new java.util.ArrayList<>(); + if (eventList != null) { + for (Map eventMap : eventList) { + EventInfo event = new EventInfo( + (String) eventMap.get("alarmId"), + (String) eventMap.get("alarmName"), + (String) eventMap.get("alarmLevel") + ); + event.setEventDefineId((String) eventMap.get("eventDefineId")); + event.setAlarmDescription((String) eventMap.get("alarmDescription")); + event.setAlarmStatus((String) eventMap.get("alarmStatus")); + event.setTriggerTime((Long) eventMap.get("triggerTime")); + event.setAlarmSource((String) eventMap.get("alarmSource")); + event.setHandleTime((Long) eventMap.get("handleTime")); + event.setHandler((String) eventMap.get("handler")); + event.setHandleRemark((String) eventMap.get("handleRemark")); + events.add(event); + } + } + + PageResult result = new PageResult<>(events, total, queryParams.getPageNum(), queryParams.getPageSize()); + + logger.info("商业版REST接口告警分页查询成功,查询到告警数量: {}, 总记录数: {}", events.size(), result.getTotal()); + + return result; + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口告警分页查询失败: {}", errorMsg); + return null; + } + } else { + logger.error("商业版REST接口告警分页查询失败,HTTP状态码: {}", response.getStatusCode()); + return null; + } + + } catch (RestClientException e) { + logger.error("商业版REST接口告警分页查询调用异常", e); + return null; + } catch (Exception e) { + logger.error("商业版告警分页查询失败", e); + return null; + } + } + + @Override + public AlarmDetail getAlarmDetailById(String alarmId) { + if (!running.get()) { + logger.warn("服务未运行,无法执行告警详情查询操作"); + return null; + } + + if (alarmId == null || alarmId.trim().isEmpty()) { + logger.warn("告警ID不能为空"); + return null; + } + + try { + logger.info("商业版执行告警详情查询,告警ID: {}", alarmId); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity requestEntity = new HttpEntity<>(headers); + + // 构建告警详情查询接口URL + String getAlarmDetailUrl = omsBaseUrl + "/monitor/v1/events/" + alarmId; + + // 调用REST接口进行告警详情查询 + ResponseEntity response = restTemplate.exchange(getAlarmDetailUrl, HttpMethod.GET, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + Map alarmData = (Map) responseBody.get("alarmDetail"); + + AlarmDetail alarmDetail = new AlarmDetail( + (String) alarmData.get("alarmId"), + (String) alarmData.get("alarmName"), + (String) alarmData.get("alarmLevel") + ); + alarmDetail.setEventDefineId((String) alarmData.get("eventDefineId")); + alarmDetail.setAlarmDescription((String) alarmData.get("alarmDescription")); + alarmDetail.setAlarmStatus((String) alarmData.get("alarmStatus")); + alarmDetail.setTriggerTime((Long) alarmData.get("triggerTime")); + alarmDetail.setAlarmSource((String) alarmData.get("alarmSource")); + alarmDetail.setAlarmDetails((String) alarmData.get("alarmDetails")); + alarmDetail.setAlarmData((String) alarmData.get("alarmData")); + alarmDetail.setCreateTime((Long) alarmData.get("createTime")); + alarmDetail.setUpdateTime((Long) alarmData.get("updateTime")); + + logger.info("商业版REST接口告警详情查询成功 - 告警ID: {}, 告警名称: {}, 告警级别: {}", + alarmDetail.getAlarmId(), alarmDetail.getAlarmName(), alarmDetail.getAlarmLevel()); + + return alarmDetail; + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口告警详情查询失败: {}", errorMsg); + return null; + } + } else { + logger.error("商业版REST接口告警详情查询失败,HTTP状态码: {}", response.getStatusCode()); + return null; + } + + } catch (RestClientException e) { + logger.error("商业版REST接口告警详情查询调用异常,告警ID: {}", alarmId, e); + return null; + } catch (Exception e) { + logger.error("商业版告警详情查询失败,告警ID: {}", alarmId, e); + return null; + } + } +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialUserManagementServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialUserManagementServiceImpl.java new file mode 100644 index 0000000..c7edf96 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialUserManagementServiceImpl.java @@ -0,0 +1,380 @@ +package com.terrabase.enterprise.impl.commercial; + +import com.terrabase.enterprise.api.UserManagementService; +import com.terrabase.enterprise.api.dto.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.RestClientException; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 商业版用户管理服务实现 + * 集成商业组件实现用户管理功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Service +public class CommercialUserManagementServiceImpl implements UserManagementService { + + private static final Logger logger = LoggerFactory.getLogger(CommercialUserManagementServiceImpl.class); + + private final AtomicBoolean running = new AtomicBoolean(false); + + private final RestTemplate restTemplate; + + private String omsBaseUrl; + private int timeout; + + public CommercialUserManagementServiceImpl(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + // 设置默认值 + this.omsBaseUrl = "http://localhost:8081/api/"; + this.timeout = 30000; + } + + public CommercialUserManagementServiceImpl(RestTemplate restTemplate, String omsBaseUrl, int timeout) { + this.restTemplate = restTemplate; + this.omsBaseUrl = omsBaseUrl; + this.timeout = timeout; + } + + @Override + public String getServiceName() { + return "Commercial User Management Service"; + } + + @Override + public String getServiceVersion() { + return "1.0.0-commercial"; + } + + @Override + public String getServiceType() { + return "commercial"; + } + + @Override + public String getHealthStatus() { + if (!running.get()) { + return "服务未运行"; + } + + return String.format("商业版用户管理服务健康状态: 正常 (版本: %s, 类型: %s)", + getServiceVersion(), getServiceType()); + } + + @Override + public void start() { + if (running.compareAndSet(false, true)) { + logger.info("商业版用户管理服务已启动"); + } else { + logger.warn("商业版用户管理服务已经在运行中"); + } + } + + @Override + public void stop() { + if (running.compareAndSet(true, false)) { + logger.info("商业版用户管理服务已停止"); + } else { + logger.warn("商业版用户管理服务已经停止"); + } + } + + @Override + public boolean isRunning() { + return running.get(); + } + + // ========== 用户注册相关接口实现 ========== + + @Override + public void registerRole(RoleRegister roleRegister) { + if (!running.get()) { + logger.warn("服务未运行,无法执行角色注册操作"); + return; + } + + if (roleRegister == null) { + logger.warn("角色注册对象不能为空"); + return; + } + + try { + logger.info("商业版执行角色注册: {}", roleRegister); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("roleId", roleRegister.getRoleId()); + requestBody.put("roleName", roleRegister.getRoleName()); + requestBody.put("applicationScenario", roleRegister.getApplicationScenario()); + requestBody.put("roleDescription", roleRegister.getRoleDescription()); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建角色注册接口URL + String registerRoleUrl = omsBaseUrl + "/framework/v1/iam/roles/batch/register/internal"; + + // 调用REST接口进行角色注册 + ResponseEntity response = restTemplate.postForEntity(registerRoleUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + logger.info("商业版REST接口角色注册成功 - 角色ID: {}, 角色名称: {}, 应用场景: {}", + roleRegister.getRoleId(), roleRegister.getRoleName(), roleRegister.getApplicationScenario()); + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口角色注册失败: {}", errorMsg); + } + } else { + logger.error("商业版REST接口角色注册失败,HTTP状态码: {}", response.getStatusCode()); + } + + } catch (RestClientException e) { + logger.error("商业版REST接口角色注册调用异常", e); + } catch (Exception e) { + logger.error("商业版角色注册失败: {}", roleRegister, e); + } + } + + @Override + public void registerAuthority(AuthorityInfos authorityInfos) { + if (!running.get()) { + logger.warn("服务未运行,无法执行权限注册操作"); + return; + } + + if (authorityInfos == null || authorityInfos.getAuthorityList() == null) { + logger.warn("权限注册对象不能为空"); + return; + } + + try { + logger.info("商业版执行权限注册,权限数量: {}", authorityInfos.getAuthorityList().size()); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("authorityList", authorityInfos.getAuthorityList()); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建权限注册接口URL + String registerAuthorityUrl = omsBaseUrl + "/framework/v1/iam/permission/batch/register/internal"; + + // 调用REST接口进行权限注册 + ResponseEntity response = restTemplate.postForEntity(registerAuthorityUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + logger.info("商业版REST接口权限注册成功,权限数量: {}", authorityInfos.getAuthorityList().size()); + for (AuthorityInfos.AuthorityInfo authorityInfo : authorityInfos.getAuthorityList()) { + logger.info("商业版权限注册成功 - 权限ID: {}, 权限名称: {}, 权限类型: {}", + authorityInfo.getAuthorityId(), authorityInfo.getAuthorityName(), authorityInfo.getAuthorityType()); + } + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口权限注册失败: {}", errorMsg); + } + } else { + logger.error("商业版REST接口权限注册失败,HTTP状态码: {}", response.getStatusCode()); + } + + } catch (RestClientException e) { + logger.error("商业版REST接口权限注册调用异常", e); + } catch (Exception e) { + logger.error("商业版权限注册失败: {}", authorityInfos, e); + } + } + + @Override + public void registerMenu(MenuRegisterInfo menuRegisterInfo) { + if (!running.get()) { + logger.warn("服务未运行,无法执行菜单注册操作"); + return; + } + + if (menuRegisterInfo == null || menuRegisterInfo.getMenuList() == null) { + logger.warn("菜单注册对象不能为空"); + return; + } + + try { + logger.info("商业版执行菜单注册,菜单数量: {}", menuRegisterInfo.getMenuList().size()); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("menuList", menuRegisterInfo.getMenuList()); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建菜单注册接口URL + String registerMenuUrl = omsBaseUrl + "/framework/v1/customize/menu/register/internal"; + + // 调用REST接口进行菜单注册 + ResponseEntity response = restTemplate.postForEntity(registerMenuUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + logger.info("商业版REST接口菜单注册成功,菜单数量: {}", menuRegisterInfo.getMenuList().size()); + for (MenuRegisterInfo.MenuInfo menuInfo : menuRegisterInfo.getMenuList()) { + logger.info("商业版菜单注册成功 - 菜单ID: {}, 菜单名称: {}, 菜单路径: {}", + menuInfo.getMenuId(), menuInfo.getMenuName(), menuInfo.getMenuPath()); + } + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口菜单注册失败: {}", errorMsg); + } + } else { + logger.error("商业版REST接口菜单注册失败,HTTP状态码: {}", response.getStatusCode()); + } + + } catch (RestClientException e) { + logger.error("商业版REST接口菜单注册调用异常", e); + } catch (Exception e) { + logger.error("商业版菜单注册失败: {}", menuRegisterInfo, e); + } + } + + @Override + public void registerMenuForbidden(ForbiddenBody forbiddenBody) { + if (!running.get()) { + logger.warn("服务未运行,无法执行菜单屏蔽注册操作"); + return; + } + + if (forbiddenBody == null || forbiddenBody.getForbiddenMenuIds() == null) { + logger.warn("菜单屏蔽对象不能为空"); + return; + } + + try { + logger.info("商业版执行菜单屏蔽注册,屏蔽菜单数量: {}", forbiddenBody.getForbiddenMenuIds().size()); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("forbiddenMenuIds", forbiddenBody.getForbiddenMenuIds()); + requestBody.put("reason", forbiddenBody.getReason()); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建菜单屏蔽注册接口URL + String registerMenuForbiddenUrl = omsBaseUrl + "/framework/v1/customize/menu/register/forbidden/item/internal"; + + // 调用REST接口进行菜单屏蔽注册 + ResponseEntity response = restTemplate.postForEntity(registerMenuForbiddenUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + logger.info("商业版REST接口菜单屏蔽注册成功,屏蔽菜单数量: {}", forbiddenBody.getForbiddenMenuIds().size()); + for (String menuId : forbiddenBody.getForbiddenMenuIds()) { + logger.info("商业版菜单屏蔽注册成功 - 菜单ID: {}, 屏蔽原因: {}", menuId, forbiddenBody.getReason()); + } + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口菜单屏蔽注册失败: {}", errorMsg); + } + } else { + logger.error("商业版REST接口菜单屏蔽注册失败,HTTP状态码: {}", response.getStatusCode()); + } + + } catch (RestClientException e) { + logger.error("商业版REST接口菜单屏蔽注册调用异常", e); + } catch (Exception e) { + logger.error("商业版菜单屏蔽注册失败: {}", forbiddenBody, e); + } + } + + // ========== 时间管理相关接口实现 ========== + + @Override + public void subscribeTimeConfigChange(Subscribe subscribe) { + if (!running.get()) { + logger.warn("服务未运行,无法执行时间配置变更事件订阅操作"); + return; + } + + if (subscribe == null) { + logger.warn("订阅信息对象不能为空"); + return; + } + + try { + logger.info("商业版执行时间配置变更事件订阅: {}", subscribe); + + // 构建请求参数 + Map requestBody = new HashMap<>(); + requestBody.put("subscribeId", subscribe.getSubscribeId()); + requestBody.put("serviceName", subscribe.getServiceName()); + requestBody.put("notifyAddress", subscribe.getNotifyAddress()); + requestBody.put("eventType", subscribe.getEventType()); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); + + // 构建时间配置变更事件订阅接口URL + String subscribeTimeConfigUrl = omsBaseUrl + "/framework/v1/iam/subscribe/internal"; + + // 调用REST接口进行时间配置变更事件订阅 + ResponseEntity response = restTemplate.postForEntity(subscribeTimeConfigUrl, requestEntity, Map.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map responseBody = response.getBody(); + String status = (String) responseBody.get("status"); + + if ("success".equals(status)) { + logger.info("商业版REST接口时间配置变更事件订阅成功 - 订阅ID: {}, 服务名称: {}, 通知地址: {}", + subscribe.getSubscribeId(), subscribe.getServiceName(), subscribe.getNotifyAddress()); + } else { + String errorMsg = (String) responseBody.get("message"); + logger.error("商业版REST接口时间配置变更事件订阅失败: {}", errorMsg); + } + } else { + logger.error("商业版REST接口时间配置变更事件订阅失败,HTTP状态码: {}", response.getStatusCode()); + } + + } catch (RestClientException e) { + logger.error("商业版REST接口时间配置变更事件订阅调用异常", e); + } catch (Exception e) { + logger.error("商业版时间配置变更事件订阅失败: {}", subscribe, e); + } + } +} diff --git a/enterprise-impl-open/KMC_README.md b/enterprise-impl-open/KMC_README.md new file mode 100644 index 0000000..6babaa4 --- /dev/null +++ b/enterprise-impl-open/KMC_README.md @@ -0,0 +1,234 @@ +# Terrabase 开源版 KMC 加解密功能 + +## 概述 + +本文档介绍了 Terrabase 开源版企业服务中集成的 KMC (Key Management Center) 加解密功能。该功能基于开源算法实现,使用 AES-GCM 加密模式,提供安全可靠的数据加解密服务。 + +## 功能特性 + +### 核心功能 +- **AES-GCM 加密**: 使用 256 位密钥的 AES-GCM 模式进行加解密 +- **随机 IV 生成**: 每次加密都生成随机的初始化向量,确保密文唯一性 +- **密钥管理**: 支持多密钥管理,包括默认密钥和自定义密钥 +- **安全存储**: 密钥在内存中安全缓存,支持动态管理 + +### 安全特性 +- **认证加密**: GCM 模式提供数据完整性和真实性验证 +- **密钥隔离**: 不同密钥的密文无法相互解密 +- **随机性**: 使用安全随机数生成器确保加密的随机性 +- **审计日志**: 可选的加解密操作审计记录 + +## 技术实现 + +### 依赖库 +- **BouncyCastle**: 提供加密算法实现 +- **Apache Commons Codec**: Base64 编码/解码 +- **Spring Boot**: 配置管理和依赖注入 + +### 加密算法 +- **算法**: AES (Advanced Encryption Standard) +- **模式**: GCM (Galois/Counter Mode) +- **密钥长度**: 256 位 +- **IV 长度**: 96 位 (12 字节) +- **标签长度**: 128 位 (16 字节) + +## 配置说明 + +### application.properties 配置 + +```properties +# KMC 基本配置 +terrabase.kmc.enabled=true # 启用 KMC 功能 +terrabase.kmc.default-key-id=default # 默认密钥 ID +terrabase.kmc.algorithm=AES # 加密算法 +terrabase.kmc.key-length=256 # 密钥长度(位) +terrabase.kmc.transformation=AES/GCM/NoPadding # 转换模式 + +# GCM 参数配置 +terrabase.kmc.gcm-iv-length=12 # GCM IV 长度(字节) +terrabase.kmc.gcm-tag-length=16 # GCM 标签长度(字节) + +# 缓存配置 +terrabase.kmc.key-caching=true # 启用密钥缓存 +terrabase.kmc.max-cache-size=100 # 最大缓存密钥数量 +terrabase.kmc.key-expiration-time=86400000 # 密钥过期时间(毫秒) + +# 高级功能 +terrabase.kmc.enable-key-rotation=false # 启用密钥轮换 +terrabase.kmc.key-rotation-interval=604800000 # 密钥轮换间隔(毫秒) +terrabase.kmc.enable-audit-log=true # 启用审计日志 +``` + +## 使用方法 + +### 1. 基本加解密 + +```java +// 获取企业服务实例 +@Autowired +private EnterpriseService enterpriseService; + +// 加密数据 +String plaintext = "需要加密的敏感数据"; +String encryptResult = enterpriseService.encrypt(plaintext); +// 返回格式: "开源版KMC加密成功: " + +// 解密数据 +String ciphertext = "<从加密结果中提取的Base64密文>"; +String decryptResult = enterpriseService.decrypt(ciphertext); +// 返回格式: "开源版KMC解密成功: <原始明文>" +``` + +### 2. 直接使用工具类 + +```java +import com.terrabase.enterprise.impl.open.util.KmcCryptoUtil; + +// 生成密钥 +String keyId = "my_custom_key"; +KmcCryptoUtil.generateKey(keyId); + +// 使用指定密钥加密 +String ciphertext = KmcCryptoUtil.encrypt(plaintext, keyId); + +// 使用指定密钥解密 +String decryptedText = KmcCryptoUtil.decrypt(ciphertext, keyId); + +// 使用默认密钥 +String defaultCiphertext = KmcCryptoUtil.encrypt(plaintext); +String defaultDecryptedText = KmcCryptoUtil.decrypt(defaultCiphertext); +``` + +### 3. 密钥管理 + +```java +// 检查密钥是否存在 +boolean exists = KmcCryptoUtil.hasKey("my_key"); + +// 获取密钥信息 +String keyInfo = KmcCryptoUtil.getKeyInfo("my_key"); + +// 删除指定密钥 +boolean removed = KmcCryptoUtil.removeKey("my_key"); + +// 获取当前密钥数量 +int keyCount = KmcCryptoUtil.getKeyCount(); + +// 清空所有密钥 +KmcCryptoUtil.clearAllKeys(); +``` + +## API 接口 + +### REST API 端点 + +通过企业服务的 REST API 可以使用 KMC 功能: + +```bash +# 加密数据 +curl -X POST http://localhost:8080/api/enterprise/encrypt \ + -H "Content-Type: application/json" \ + -d '{"data": "需要加密的数据"}' + +# 解密数据 +curl -X POST http://localhost:8080/api/enterprise/decrypt \ + -H "Content-Type: application/json" \ + -d '{"data": "Base64编码的密文"}' +``` + +## 安全注意事项 + +### 1. 密钥管理 +- 密钥仅在内存中存储,应用重启后需要重新生成 +- 生产环境建议使用外部密钥管理系统 +- 定期轮换密钥以提高安全性 + +### 2. 数据保护 +- 密文使用 Base64 编码,便于传输和存储 +- 每次加密都使用随机 IV,确保相同明文产生不同密文 +- GCM 模式提供数据完整性验证 + +### 3. 性能考虑 +- 密钥缓存可提高性能,但需注意内存使用 +- 长文本加密可能影响性能,建议分批处理 +- 审计日志可能影响性能,生产环境可考虑异步记录 + +## 测试 + +### 运行单元测试 + +```bash +# 运行 KMC 工具类测试 +mvn test -Dtest=KmcCryptoUtilTest + +# 运行集成测试 +mvn test -Dtest=OpenEnterpriseServiceImplKmcTest + +# 运行所有测试 +mvn test +``` + +### 测试覆盖范围 + +- 基本加解密功能 +- 密钥管理功能 +- 错误处理 +- 边界条件测试 +- 性能测试 +- 安全测试 + +## 故障排除 + +### 常见问题 + +1. **加密失败** + - 检查 KMC 功能是否启用 + - 验证服务是否正常运行 + - 检查输入数据是否为空 + +2. **解密失败** + - 验证密文格式是否正确 + - 检查密钥是否存在 + - 确认使用相同的密钥进行解密 + +3. **性能问题** + - 检查密钥缓存配置 + - 考虑禁用审计日志 + - 优化长文本处理 + +### 日志分析 + +启用 DEBUG 日志级别可以查看详细的加解密过程: + +```properties +logging.level.com.terrabase.enterprise.impl.open.util=DEBUG +logging.level.com.terrabase.enterprise.impl.open.config=DEBUG +``` + +## 扩展开发 + +### 添加新的加密算法 + +1. 在 `KmcCryptoUtil` 中添加新的算法支持 +2. 更新 `KmcConfig` 配置类 +3. 添加相应的测试用例 +4. 更新文档 + +### 集成外部密钥管理 + +1. 实现密钥提供者接口 +2. 修改密钥获取逻辑 +3. 添加密钥同步机制 +4. 更新配置管理 + +## 版本历史 + +- **v1.0.0**: 初始版本,支持基本的 AES-GCM 加解密功能 + +## 许可证 + +本功能基于开源许可证,遵循项目的整体许可证条款。 + +## 支持 + +如有问题或建议,请联系 Terrabase 开发团队。 diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCertificateServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCertificateServiceImpl.java new file mode 100644 index 0000000..78cb399 --- /dev/null +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCertificateServiceImpl.java @@ -0,0 +1,211 @@ +package com.terrabase.enterprise.impl.open; + +import com.terrabase.enterprise.api.CertificateService; +import com.terrabase.enterprise.api.dto.*; +import com.terrabase.enterprise.impl.open.config.KmcConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 开源版证书管理服务实现 + * 基于开源技术实现证书管理功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Service +public class OpenCertificateServiceImpl implements CertificateService { + + private static final Logger logger = LoggerFactory.getLogger(OpenCertificateServiceImpl.class); + + private final AtomicBoolean running = new AtomicBoolean(false); + + @Autowired + private KmcConfig kmcConfig; + + @Override + public String getServiceName() { + return "Open Source Certificate Service"; + } + + @Override + public String getServiceVersion() { + return "1.0.0-open"; + } + + @Override + public String getServiceType() { + return "open"; + } + + @Override + public String getHealthStatus() { + if (!running.get()) { + return "服务未运行"; + } + + return String.format("开源版证书管理服务健康状态: 正常 (版本: %s, 类型: %s)", + getServiceVersion(), getServiceType()); + } + + @Override + public void start() { + if (running.compareAndSet(false, true)) { + logger.info("开源版证书管理服务已启动"); + } else { + logger.warn("开源版证书管理服务已经在运行中"); + } + } + + @Override + public void stop() { + if (running.compareAndSet(true, false)) { + logger.info("开源版证书管理服务已停止"); + } else { + logger.warn("开源版证书管理服务已经停止"); + } + } + + @Override + public boolean isRunning() { + return running.get(); + } + + // ========== 证书管理相关接口实现 ========== + + @Override + public void registerCertificate(RegisterCertificate certificate) { + if (!running.get()) { + logger.warn("服务未运行,无法执行证书注册操作"); + return; + } + + if (certificate == null) { + logger.warn("证书注册对象不能为空"); + return; + } + + try { + logger.info("开源版执行证书注册: {}", certificate); + + logger.info("开源版证书注册成功 - 证书ID: {}, 证书名称: {}, 证书类型: {}", + certificate.getCertificateId(), certificate.getCertificateName(), certificate.getCertificateType()); + + } catch (Exception e) { + logger.error("开源版证书注册失败: {}", certificate, e); + } + } + + @Override + public void importOrUpdateCertificate(CertificateDetail certificate) { + if (!running.get()) { + logger.warn("服务未运行,无法执行证书导入/更新操作"); + return; + } + + if (certificate == null) { + logger.warn("证书详细信息对象不能为空"); + return; + } + + try { + logger.info("开源版执行证书导入/更新,证书ID: {}", certificate.getCertificateId()); + + logger.info("开源版证书导入/更新成功 - 证书ID: {}, 证书格式: {}", + certificate.getCertificateId(), certificate.getCertificateFormat()); + + } catch (Exception e) { + logger.error("开源版证书导入/更新失败: {}", certificate, e); + } + } + + @Override + public void importTrustedCaCertificate(CaCertificate caCertificate) { + if (!running.get()) { + logger.warn("服务未运行,无法执行CA证书导入操作"); + return; + } + + if (caCertificate == null) { + logger.warn("CA证书对象不能为空"); + return; + } + + try { + logger.info("开源版执行CA证书导入: {}", caCertificate); + + logger.info("开源版CA证书导入成功 - CA证书ID: {}, CA证书名称: {}, 颁发者: {}", + caCertificate.getCaCertificateId(), caCertificate.getCaCertificateName(), caCertificate.getIssuer()); + + } catch (Exception e) { + logger.error("开源版CA证书导入失败: {}", caCertificate, e); + } + } + + @Override + public List queryAllCertificates() { + if (!running.get()) { + logger.warn("服务未运行,无法执行证书信息查询操作"); + return null; + } + + try { + logger.info("开源版执行证书信息查询"); + + // 返回模拟数据 + List certificates = new java.util.ArrayList<>(); + + CertCollectInfo cert1 = new CertCollectInfo("cert_001", "数据使能证书", "SSL"); + cert1.setCertificateStatus("有效"); + cert1.setValidFrom(System.currentTimeMillis() - 86400000L); // 1天前 + cert1.setValidTo(System.currentTimeMillis() + 86400000L * 365); // 1年后 + cert1.setIssuer("Terrabase CA"); + cert1.setSubject("CN=terrabase-data-enable"); + certificates.add(cert1); + + logger.info("开源版证书信息查询成功,查询到证书数量: {}", certificates.size()); + return certificates; + + } catch (Exception e) { + logger.error("开源版证书信息查询失败", e); + return null; + } + } + + @Override + public LicenseInfo queryLicenseInfo() { + if (!running.get()) { + logger.warn("服务未运行,无法执行License信息查询操作"); + return null; + } + + try { + logger.info("开源版执行License信息查询"); + + // 返回模拟数据 + LicenseInfo licenseInfo = new LicenseInfo("license_001", "开源版"); + licenseInfo.setValidFrom(System.currentTimeMillis() - 86400000L * 30); // 30天前 + licenseInfo.setValidTo(System.currentTimeMillis() + 86400000L * 365); // 1年后 + licenseInfo.setFeatureModules(new String[]{"数据使能", "KMC加解密", "基础监控"}); + licenseInfo.setUserLimit(1000); + licenseInfo.setConcurrentLimit(100); + licenseInfo.setStorageLimit(1000L); // 1TB + licenseInfo.setLicenseStatus("有效"); + licenseInfo.setRemainingDays(365); + + logger.info("开源版License信息查询成功 - License ID: {}, License类型: {}, 剩余天数: {}", + licenseInfo.getLicenseId(), licenseInfo.getLicenseType(), licenseInfo.getRemainingDays()); + + return licenseInfo; + + } catch (Exception e) { + logger.error("开源版License信息查询失败", e); + return null; + } + } +} diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCryptoServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCryptoServiceImpl.java new file mode 100644 index 0000000..0223d23 --- /dev/null +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCryptoServiceImpl.java @@ -0,0 +1,154 @@ +package com.terrabase.enterprise.impl.open; + +import com.terrabase.enterprise.api.CryptoService; +import com.terrabase.enterprise.api.CryptoAlgorithm; +import com.terrabase.enterprise.impl.open.config.KmcConfig; +import com.terrabase.enterprise.impl.open.util.KmcCryptoUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 开源版加解密服务实现 + * 基于开源KMC技术实现 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Service +public class OpenCryptoServiceImpl implements CryptoService { + + private static final Logger logger = LoggerFactory.getLogger(OpenCryptoServiceImpl.class); + + private final AtomicBoolean running = new AtomicBoolean(false); + + @Autowired + private KmcConfig kmcConfig; + + @Override + public String getServiceName() { + return "Open Source Crypto Service"; + } + + @Override + public String getServiceVersion() { + return "1.0.0-open"; + } + + @Override + public String getServiceType() { + return "open"; + } + + @Override + public String getHealthStatus() { + if (!running.get()) { + return "服务未运行"; + } + + return String.format("开源版加解密服务健康状态: 正常 (版本: %s, 类型: %s)", + getServiceVersion(), getServiceType()); + } + + @Override + public void start() { + if (running.compareAndSet(false, true)) { + logger.info("开源版加解密服务已启动"); + } else { + logger.warn("开源版加解密服务已经在运行中"); + } + } + + @Override + public void stop() { + if (running.compareAndSet(true, false)) { + logger.info("开源版加解密服务已停止"); + } else { + logger.warn("开源版加解密服务已经停止"); + } + } + + @Override + public boolean isRunning() { + return running.get(); + } + + @Override + public String encrypt(String plaintext, CryptoAlgorithm algorithm) { + if (!running.get()) { + return "服务未运行,无法执行加密操作"; + } + + if (!kmcConfig.isEnabled()) { + return "KMC功能未启用,无法执行加密操作"; + } + + if (plaintext == null || plaintext.trim().isEmpty()) { + return "明文数据不能为空"; + } + + if (algorithm == null) { + algorithm = CryptoAlgorithm.AES; // 默认使用AES + } + + try { + logger.info("开源版执行数据加密,原文长度: {}, 算法: {}", plaintext.length(), algorithm.getAlgorithm()); + + // 使用KMC工具进行加密 + String ciphertext = KmcCryptoUtil.encrypt(plaintext, kmcConfig.getDefaultKeyId(), algorithm); + + // 记录审计日志 + if (kmcConfig.isEnableAuditLog()) { + logger.info("KMC加密审计 - 密钥ID: {}, 算法: {}, 原文长度: {}, 密文长度: {}", + kmcConfig.getDefaultKeyId(), algorithm.getAlgorithm(), plaintext.length(), ciphertext.length()); + } + + return ciphertext; + + } catch (Exception e) { + logger.error("开源版KMC加密失败,算法: {}", algorithm, e); + return "KMC加密失败: " + e.getMessage(); + } + } + + @Override + public String decrypt(String ciphertext, CryptoAlgorithm algorithm) { + if (!running.get()) { + return "服务未运行,无法执行解密操作"; + } + + if (!kmcConfig.isEnabled()) { + return "KMC功能未启用,无法执行解密操作"; + } + + if (ciphertext == null || ciphertext.trim().isEmpty()) { + return "密文数据不能为空"; + } + + if (algorithm == null) { + algorithm = CryptoAlgorithm.AES; // 默认使用AES + } + + try { + logger.info("开源版执行数据解密,密文长度: {}, 算法: {}", ciphertext.length(), algorithm.getAlgorithm()); + + // 使用KMC工具进行解密 + String plaintext = KmcCryptoUtil.decrypt(ciphertext, kmcConfig.getDefaultKeyId(), algorithm); + + // 记录审计日志 + if (kmcConfig.isEnableAuditLog()) { + logger.info("KMC解密审计 - 密钥ID: {}, 算法: {}, 密文长度: {}, 原文长度: {}", + kmcConfig.getDefaultKeyId(), algorithm.getAlgorithm(), ciphertext.length(), plaintext.length()); + } + + return plaintext; + + } catch (Exception e) { + logger.error("开源版KMC解密失败,算法: {}", algorithm, e); + return "KMC解密失败: " + e.getMessage(); + } + } +} diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java index 59e943c..57a8cef 100644 --- a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java @@ -1,21 +1,15 @@ package com.terrabase.enterprise.impl.open; import com.terrabase.enterprise.api.EnterpriseService; -import com.terrabase.enterprise.api.CryptoAlgorithm; -import com.terrabase.enterprise.impl.open.config.KmcConfig; -import com.terrabase.enterprise.impl.open.util.KmcCryptoUtil; -import org.apache.commons.text.similarity.LevenshteinDistance; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.Map; /** * 开源版企业服务实现 - * 基于开源数据使能技术实现 + * 提供企业级服务的基本功能,子服务通过JarLoadUtil独立管理 * * @author Terrabase Team * @version 1.0.0 @@ -27,9 +21,6 @@ public class OpenEnterpriseServiceImpl implements EnterpriseService { private final AtomicBoolean running = new AtomicBoolean(false); - @Autowired - private KmcConfig kmcConfig; - @Override public String getServiceName() { return "Open Source Enterprise Service"; @@ -59,6 +50,7 @@ public String getHealthStatus() { public void start() { if (running.compareAndSet(false, true)) { logger.info("开源版企业服务已启动"); + // 注意:子服务现在通过JarLoadUtil独立管理,不再在此处启动 } else { logger.warn("开源版企业服务已经在运行中"); } @@ -68,6 +60,7 @@ public void start() { public void stop() { if (running.compareAndSet(true, false)) { logger.info("开源版企业服务已停止"); + // 注意:子服务现在通过JarLoadUtil独立管理,不再在此处停止 } else { logger.warn("开源版企业服务已经停止"); } @@ -77,80 +70,4 @@ public void stop() { public boolean isRunning() { return running.get(); } - - @Override - public String encrypt(String plaintext, CryptoAlgorithm algorithm) { - if (!running.get()) { - return "服务未运行,无法执行加密操作"; - } - - if (!kmcConfig.isEnabled()) { - return "KMC功能未启用,无法执行加密操作"; - } - - if (plaintext == null || plaintext.trim().isEmpty()) { - return "明文数据不能为空"; - } - - if (algorithm == null) { - algorithm = CryptoAlgorithm.AES; // 默认使用AES - } - - try { - logger.info("开源版执行数据加密,原文长度: {}, 算法: {}", plaintext.length(), algorithm.getAlgorithm()); - - // 使用KMC工具进行加密 - String ciphertext = KmcCryptoUtil.encrypt(plaintext, kmcConfig.getDefaultKeyId(), algorithm); - - // 记录审计日志 - if (kmcConfig.isEnableAuditLog()) { - logger.info("KMC加密审计 - 密钥ID: {}, 算法: {}, 原文长度: {}, 密文长度: {}", - kmcConfig.getDefaultKeyId(), algorithm.getAlgorithm(), plaintext.length(), ciphertext.length()); - } - - return String.format("开源版KMC加密成功 [%s]: %s", algorithm.getAlgorithm(), ciphertext); - - } catch (Exception e) { - logger.error("开源版KMC加密失败,算法: {}", algorithm, e); - return "KMC加密失败: " + e.getMessage(); - } - } - - @Override - public String decrypt(String ciphertext, CryptoAlgorithm algorithm) { - if (!running.get()) { - return "服务未运行,无法执行解密操作"; - } - - if (!kmcConfig.isEnabled()) { - return "KMC功能未启用,无法执行解密操作"; - } - - if (ciphertext == null || ciphertext.trim().isEmpty()) { - return "密文数据不能为空"; - } - - if (algorithm == null) { - algorithm = CryptoAlgorithm.AES; // 默认使用AES - } - - try { - logger.info("开源版执行数据解密,密文长度: {}, 算法: {}", ciphertext.length(), algorithm.getAlgorithm()); - - // 使用KMC工具进行解密 - String plaintext = KmcCryptoUtil.decrypt(ciphertext, kmcConfig.getDefaultKeyId(), algorithm); - - // 记录审计日志 - if (kmcConfig.isEnableAuditLog()) { - logger.info("KMC解密审计 - 密钥ID: {}, 算法: {}, 密文长度: {}, 原文长度: {}", - kmcConfig.getDefaultKeyId(), algorithm.getAlgorithm(), ciphertext.length(), plaintext.length()); - } - - return String.format("开源版KMC解密成功 [%s]: %s", algorithm.getAlgorithm(), plaintext); - - } catch (Exception e) { - logger.error("开源版KMC解密失败,算法: {}", algorithm, e); - return "KMC解密失败: " + e.getMessage(); - } - } } \ No newline at end of file diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenLogManagementServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenLogManagementServiceImpl.java new file mode 100644 index 0000000..fbc1a92 --- /dev/null +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenLogManagementServiceImpl.java @@ -0,0 +1,129 @@ +package com.terrabase.enterprise.impl.open; + +import com.terrabase.enterprise.api.LogManagementService; +import com.terrabase.enterprise.api.dto.*; +import com.terrabase.enterprise.impl.open.config.KmcConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 开源版日志管理服务实现 + * 基于开源技术实现日志管理功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Service +public class OpenLogManagementServiceImpl implements LogManagementService { + + private static final Logger logger = LoggerFactory.getLogger(OpenLogManagementServiceImpl.class); + + private final AtomicBoolean running = new AtomicBoolean(false); + + @Autowired + private KmcConfig kmcConfig; + + @Override + public String getServiceName() { + return "Open Source Log Management Service"; + } + + @Override + public String getServiceVersion() { + return "1.0.0-open"; + } + + @Override + public String getServiceType() { + return "open"; + } + + @Override + public String getHealthStatus() { + if (!running.get()) { + return "服务未运行"; + } + + return String.format("开源版日志管理服务健康状态: 正常 (版本: %s, 类型: %s)", + getServiceVersion(), getServiceType()); + } + + @Override + public void start() { + if (running.compareAndSet(false, true)) { + logger.info("开源版日志管理服务已启动"); + } else { + logger.warn("开源版日志管理服务已经在运行中"); + } + } + + @Override + public void stop() { + if (running.compareAndSet(true, false)) { + logger.info("开源版日志管理服务已停止"); + } else { + logger.warn("开源版日志管理服务已经停止"); + } + } + + @Override + public boolean isRunning() { + return running.get(); + } + + // ========== 日志与监控相关接口实现 ========== + + @Override + public void registerOperateLogI18N(LogI18NS logI18NS) { + if (!running.get()) { + logger.warn("服务未运行,无法执行操作日志国际化信息注册操作"); + return; + } + + if (logI18NS == null || logI18NS.getLogI18NList() == null) { + logger.warn("操作日志国际化信息对象不能为空"); + return; + } + + try { + logger.info("开源版执行操作日志国际化信息注册,国际化信息数量: {}", logI18NS.getLogI18NList().size()); + + for (LogI18NS.LogI18NInfo logI18NInfo : logI18NS.getLogI18NList()) { + logger.info("开源版操作日志国际化信息注册成功 - 操作代码: {}, 操作名称: {}, 默认语言: {}", + logI18NInfo.getOperationCode(), logI18NInfo.getOperationName(), logI18NInfo.getDefaultLanguage()); + } + + } catch (Exception e) { + logger.error("开源版操作日志国际化信息注册失败: {}", logI18NS, e); + } + } + + @Override + public void reportOperateLog(Logs logs) { + if (!running.get()) { + logger.warn("服务未运行,无法执行操作日志上报操作"); + return; + } + + if (logs == null || logs.getLogList() == null) { + logger.warn("操作日志对象不能为空"); + return; + } + + try { + logger.info("开源版执行操作日志上报,日志数量: {}", logs.getLogList().size()); + + for (Logs.LogInfo logInfo : logs.getLogList()) { + logger.info("开源版操作日志上报成功 - 日志ID: {}, 用户ID: {}, 操作类型: {}, 操作描述: {}", + logInfo.getLogId(), logInfo.getUserId(), logInfo.getOperationType(), logInfo.getOperationDescription()); + } + + } catch (Exception e) { + logger.error("开源版操作日志上报失败: {}", logs, e); + } + } +} diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenMonitoringServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenMonitoringServiceImpl.java new file mode 100644 index 0000000..c59d7d1 --- /dev/null +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenMonitoringServiceImpl.java @@ -0,0 +1,219 @@ +package com.terrabase.enterprise.impl.open; + +import com.terrabase.enterprise.api.MonitoringService; +import com.terrabase.enterprise.api.dto.*; +import com.terrabase.enterprise.impl.open.config.KmcConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 开源版监控告警服务实现 + * 基于开源技术实现监控告警功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Service +public class OpenMonitoringServiceImpl implements MonitoringService { + + private static final Logger logger = LoggerFactory.getLogger(OpenMonitoringServiceImpl.class); + + private final AtomicBoolean running = new AtomicBoolean(false); + + @Autowired + private KmcConfig kmcConfig; + + @Override + public String getServiceName() { + return "Open Source Monitoring Service"; + } + + @Override + public String getServiceVersion() { + return "1.0.0-open"; + } + + @Override + public String getServiceType() { + return "open"; + } + + @Override + public String getHealthStatus() { + if (!running.get()) { + return "服务未运行"; + } + + return String.format("开源版监控告警服务健康状态: 正常 (版本: %s, 类型: %s)", + getServiceVersion(), getServiceType()); + } + + @Override + public void start() { + if (running.compareAndSet(false, true)) { + logger.info("开源版监控告警服务已启动"); + } else { + logger.warn("开源版监控告警服务已经在运行中"); + } + } + + @Override + public void stop() { + if (running.compareAndSet(true, false)) { + logger.info("开源版监控告警服务已停止"); + } else { + logger.warn("开源版监控告警服务已经停止"); + } + } + + @Override + public boolean isRunning() { + return running.get(); + } + + // ========== 告警系统相关接口实现 ========== + + @Override + public void registerEventDefine(EventDefine eventDefine) { + if (!running.get()) { + logger.warn("服务未运行,无法执行告警定义注册操作"); + return; + } + + if (eventDefine == null) { + logger.warn("告警定义对象不能为空"); + return; + } + + try { + logger.info("开源版执行告警定义注册: {}", eventDefine); + + // 模拟调用POST /monitor/v1/events/defines + logger.info("开源版告警定义注册成功 - 告警定义ID: {}, 告警名称: {}, 告警级别: {}", + eventDefine.getEventDefineId(), eventDefine.getEventName(), eventDefine.getEventLevel()); + + } catch (Exception e) { + logger.error("开源版告警定义注册失败: {}", eventDefine, e); + } + } + + @Override + public void sendAlarmsBatch(List alarms) { + if (!running.get()) { + logger.warn("服务未运行,无法执行告警上报操作"); + return; + } + + if (alarms == null || alarms.isEmpty()) { + logger.warn("告警信息列表不能为空"); + return; + } + + try { + logger.info("开源版执行告警批量上报,告警数量: {}", alarms.size()); + + // 模拟调用POST /monitor/v1/events/service/send-alarm/internal + for (AlarmInfo alarmInfo : alarms) { + logger.info("开源版告警上报成功 - 告警ID: {}, 告警名称: {}, 告警级别: {}", + alarmInfo.getAlarmId(), alarmInfo.getAlarmName(), alarmInfo.getAlarmLevel()); + } + + } catch (Exception e) { + logger.error("开源版告警批量上报失败", e); + } + } + + @Override + public PageResult getEventsByPage(EventQueryParams queryParams) { + if (!running.get()) { + logger.warn("服务未运行,无法执行告警查询操作"); + return null; + } + + if (queryParams == null) { + logger.warn("告警查询参数对象不能为空"); + return null; + } + + try { + logger.info("开源版执行告警分页查询,页码: {}, 每页大小: {}", queryParams.getPageNum(), queryParams.getPageSize()); + + // 模拟调用POST /monitor/v1/events + // 返回模拟数据 + List events = new java.util.ArrayList<>(); + + EventInfo event1 = new EventInfo("alarm_001", "数据使能服务异常", "严重"); + event1.setEventDefineId("event_def_001"); + event1.setAlarmDescription("数据使能服务响应超时"); + event1.setAlarmStatus("未处理"); + event1.setTriggerTime(System.currentTimeMillis()); + event1.setAlarmSource("数据使能模块"); + events.add(event1); + + EventInfo event2 = new EventInfo("alarm_002", "KMC加密失败", "警告"); + event2.setEventDefineId("event_def_002"); + event2.setAlarmDescription("KMC加密操作失败"); + event2.setAlarmStatus("已处理"); + event2.setTriggerTime(System.currentTimeMillis() - 3600000L); // 1小时前 + event2.setAlarmSource("KMC模块"); + event2.setHandleTime(System.currentTimeMillis() - 1800000L); // 30分钟前 + event2.setHandler("admin"); + event2.setHandleRemark("已修复密钥配置问题"); + events.add(event2); + + PageResult result = new PageResult<>(events, 2L, queryParams.getPageNum(), queryParams.getPageSize()); + + logger.info("开源版告警分页查询成功,查询到告警数量: {}, 总记录数: {}", events.size(), result.getTotal()); + + return result; + + } catch (Exception e) { + logger.error("开源版告警分页查询失败", e); + return null; + } + } + + @Override + public AlarmDetail getAlarmDetailById(String alarmId) { + if (!running.get()) { + logger.warn("服务未运行,无法执行告警详情查询操作"); + return null; + } + + if (alarmId == null || alarmId.trim().isEmpty()) { + logger.warn("告警ID不能为空"); + return null; + } + + try { + logger.info("开源版执行告警详情查询,告警ID: {}", alarmId); + + // 模拟调用告警详情查询接口 + // 返回模拟数据 + AlarmDetail alarmDetail = new AlarmDetail(alarmId, "数据使能服务异常", "严重"); + alarmDetail.setEventDefineId("event_def_001"); + alarmDetail.setAlarmDescription("数据使能服务响应超时,影响数据处理功能"); + alarmDetail.setAlarmStatus("未处理"); + alarmDetail.setTriggerTime(System.currentTimeMillis()); + alarmDetail.setAlarmSource("数据使能模块"); + alarmDetail.setAlarmDetails("服务响应时间超过5秒,可能由于数据量过大或网络延迟导致"); + alarmDetail.setAlarmData("{\"responseTime\": 5000, \"dataSize\": \"100MB\", \"networkLatency\": \"200ms\"}"); + alarmDetail.setCreateTime(System.currentTimeMillis()); + alarmDetail.setUpdateTime(System.currentTimeMillis()); + + logger.info("开源版告警详情查询成功 - 告警ID: {}, 告警名称: {}, 告警级别: {}", + alarmDetail.getAlarmId(), alarmDetail.getAlarmName(), alarmDetail.getAlarmLevel()); + + return alarmDetail; + + } catch (Exception e) { + logger.error("开源版告警详情查询失败,告警ID: {}", alarmId, e); + return null; + } + } +} diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenUserManagementServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenUserManagementServiceImpl.java new file mode 100644 index 0000000..9bc4f9a --- /dev/null +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenUserManagementServiceImpl.java @@ -0,0 +1,225 @@ +package com.terrabase.enterprise.impl.open; + +import com.terrabase.enterprise.api.UserManagementService; +import com.terrabase.enterprise.api.dto.*; +import com.terrabase.enterprise.impl.open.config.KmcConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 开源版用户管理服务实现 + * 基于开源技术实现用户管理功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@Service +public class OpenUserManagementServiceImpl implements UserManagementService { + + private static final Logger logger = LoggerFactory.getLogger(OpenUserManagementServiceImpl.class); + + private final AtomicBoolean running = new AtomicBoolean(false); + + @Autowired + private KmcConfig kmcConfig; + + @Override + public String getServiceName() { + return "Open Source User Management Service"; + } + + @Override + public String getServiceVersion() { + return "1.0.0-open"; + } + + @Override + public String getServiceType() { + return "open"; + } + + @Override + public String getHealthStatus() { + if (!running.get()) { + return "服务未运行"; + } + + return String.format("开源版用户管理服务健康状态: 正常 (版本: %s, 类型: %s)", + getServiceVersion(), getServiceType()); + } + + @Override + public void start() { + if (running.compareAndSet(false, true)) { + logger.info("开源版用户管理服务已启动"); + } else { + logger.warn("开源版用户管理服务已经在运行中"); + } + } + + @Override + public void stop() { + if (running.compareAndSet(true, false)) { + logger.info("开源版用户管理服务已停止"); + } else { + logger.warn("开源版用户管理服务已经停止"); + } + } + + @Override + public boolean isRunning() { + return running.get(); + } + + // ========== 用户注册相关接口实现 ========== + + @Override + public void registerRole(RoleRegister roleRegister) { + if (!running.get()) { + logger.warn("服务未运行,无法执行角色注册操作"); + return; + } + + if (roleRegister == null) { + logger.warn("角色注册对象不能为空"); + return; + } + + try { + logger.info("开源版执行角色注册: {}", roleRegister); + + logger.info("开源版角色注册成功 - 角色ID: {}, 角色名称: {}, 应用场景: {}", + roleRegister.getRoleId(), roleRegister.getRoleName(), roleRegister.getApplicationScenario()); + + // 记录审计日志 + if (kmcConfig.isEnableAuditLog()) { + logger.info("角色注册审计 - 角色ID: {}, 角色名称: {}, 角色类型: {}", + roleRegister.getRoleId(), roleRegister.getRoleName(), roleRegister.getRoleType()); + } + + } catch (Exception e) { + logger.error("开源版角色注册失败: {}", roleRegister, e); + } + } + + @Override + public void registerAuthority(AuthorityInfos authorityInfos) { + if (!running.get()) { + logger.warn("服务未运行,无法执行权限注册操作"); + return; + } + + if (authorityInfos == null || authorityInfos.getAuthorityList() == null) { + logger.warn("权限注册对象不能为空"); + return; + } + + try { + logger.info("开源版执行权限注册,权限数量: {}", authorityInfos.getAuthorityList().size()); + + for (AuthorityInfos.AuthorityInfo authorityInfo : authorityInfos.getAuthorityList()) { + logger.info("开源版权限注册成功 - 权限ID: {}, 权限名称: {}, 权限类型: {}", + authorityInfo.getAuthorityId(), authorityInfo.getAuthorityName(), authorityInfo.getAuthorityType()); + } + + // 记录审计日志 + if (kmcConfig.isEnableAuditLog()) { + logger.info("权限注册审计 - 权限数量: {}, 应用场景: {}", + authorityInfos.getAuthorityList().size(), authorityInfos.getApplicationScenario()); + } + + } catch (Exception e) { + logger.error("开源版权限注册失败: {}", authorityInfos, e); + } + } + + @Override + public void registerMenu(MenuRegisterInfo menuRegisterInfo) { + if (!running.get()) { + logger.warn("服务未运行,无法执行菜单注册操作"); + return; + } + + if (menuRegisterInfo == null || menuRegisterInfo.getMenuList() == null) { + logger.warn("菜单注册对象不能为空"); + return; + } + + try { + logger.info("开源版执行菜单注册,菜单数量: {}", menuRegisterInfo.getMenuList().size()); + + for (MenuRegisterInfo.MenuInfo menuInfo : menuRegisterInfo.getMenuList()) { + logger.info("开源版菜单注册成功 - 菜单ID: {}, 菜单名称: {}, 菜单路径: {}", + menuInfo.getMenuId(), menuInfo.getMenuName(), menuInfo.getMenuPath()); + } + + // 记录审计日志 + if (kmcConfig.isEnableAuditLog()) { + logger.info("菜单注册审计 - 菜单数量: {}, 应用场景: {}", + menuRegisterInfo.getMenuList().size(), menuRegisterInfo.getApplicationScenario()); + } + + } catch (Exception e) { + logger.error("开源版菜单注册失败: {}", menuRegisterInfo, e); + } + } + + @Override + public void registerMenuForbidden(ForbiddenBody forbiddenBody) { + if (!running.get()) { + logger.warn("服务未运行,无法执行菜单屏蔽注册操作"); + return; + } + + if (forbiddenBody == null || forbiddenBody.getForbiddenMenuIds() == null) { + logger.warn("菜单屏蔽对象不能为空"); + return; + } + + try { + logger.info("开源版执行菜单屏蔽注册,屏蔽菜单数量: {}", forbiddenBody.getForbiddenMenuIds().size()); + + for (String menuId : forbiddenBody.getForbiddenMenuIds()) { + logger.info("开源版菜单屏蔽注册成功 - 菜单ID: {}, 屏蔽原因: {}", menuId, forbiddenBody.getReason()); + } + + // 记录审计日志 + if (kmcConfig.isEnableAuditLog()) { + logger.info("菜单屏蔽注册审计 - 屏蔽菜单数量: {}, 屏蔽原因: {}, 是否永久屏蔽: {}", + forbiddenBody.getForbiddenMenuIds().size(), forbiddenBody.getReason(), forbiddenBody.getPermanent()); + } + + } catch (Exception e) { + logger.error("开源版菜单屏蔽注册失败: {}", forbiddenBody, e); + } + } + + // ========== 时间管理相关接口实现 ========== + + @Override + public void subscribeTimeConfigChange(Subscribe subscribe) { + if (!running.get()) { + logger.warn("服务未运行,无法执行时间配置变更事件订阅操作"); + return; + } + + if (subscribe == null) { + logger.warn("订阅信息对象不能为空"); + return; + } + + try { + logger.info("开源版执行时间配置变更事件订阅: {}", subscribe); + + logger.info("开源版时间配置变更事件订阅成功 - 订阅ID: {}, 服务名称: {}, 通知地址: {}", + subscribe.getSubscribeId(), subscribe.getServiceName(), subscribe.getNotifyAddress()); + + } catch (Exception e) { + logger.error("开源版时间配置变更事件订阅失败: {}", subscribe, e); + } + } +} diff --git a/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplIntegrationTest.java b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplIntegrationTest.java new file mode 100644 index 0000000..00bed1b --- /dev/null +++ b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplIntegrationTest.java @@ -0,0 +1,223 @@ +package com.terrabase.enterprise.impl.open; + +import com.terrabase.enterprise.impl.open.config.KmcConfig; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * 开源版企业服务集成测试 + * 测试企业服务的基本功能 + * + * @author Terrabase Team + * @version 1.0.0 + */ +@ExtendWith(MockitoExtension.class) +class OpenEnterpriseServiceImplIntegrationTest { + + @Mock + private KmcConfig kmcConfig; + + @InjectMocks + private OpenEnterpriseServiceImpl enterpriseService; + + @BeforeEach + void setUp() { + // 启动服务 + enterpriseService.start(); + } + + @Test + void testBasicServiceOperations() { + // 测试基本服务操作 + assertEquals("Open Source Enterprise Service", enterpriseService.getServiceName()); + assertEquals("1.0.0-open", enterpriseService.getServiceVersion()); + assertEquals("open", enterpriseService.getServiceType()); + assertTrue(enterpriseService.isRunning()); + + // 测试健康状态 + String healthStatus = enterpriseService.getHealthStatus(); + assertNotNull(healthStatus); + assertTrue(healthStatus.contains("正常")); + } + + @Test + void testServiceStartStop() { + // 测试服务启动和停止 + assertTrue(enterpriseService.isRunning()); + + enterpriseService.stop(); + assertFalse(enterpriseService.isRunning()); + + enterpriseService.start(); + assertTrue(enterpriseService.isRunning()); + } + + @Test + void testServiceMetadata() { + // 测试服务元数据 + assertEquals("Open Source Enterprise Service", enterpriseService.getServiceName()); + assertEquals("1.0.0-open", enterpriseService.getServiceVersion()); + assertEquals("open", enterpriseService.getServiceType()); + + // 验证元数据不为空 + assertNotNull(enterpriseService.getServiceName()); + assertNotNull(enterpriseService.getServiceVersion()); + assertNotNull(enterpriseService.getServiceType()); + } + + @Test + void testHealthStatus() { + // 测试健康状态 + String healthStatus = enterpriseService.getHealthStatus(); + assertNotNull(healthStatus); + assertTrue(healthStatus.contains("开源版")); + + // 停止服务后测试健康状态 + enterpriseService.stop(); + String stoppedHealthStatus = enterpriseService.getHealthStatus(); + assertTrue(stoppedHealthStatus.contains("停止")); + } + + @Test + void testServiceStateConsistency() { + // 测试服务状态一致性 + assertTrue(enterpriseService.isRunning()); + + // 多次调用应该返回相同结果 + assertTrue(enterpriseService.isRunning()); + assertTrue(enterpriseService.isRunning()); + + enterpriseService.stop(); + assertFalse(enterpriseService.isRunning()); + assertFalse(enterpriseService.isRunning()); + } + + @Test + void testServiceLifecycle() { + // 测试服务生命周期 + // 初始状态 + assertFalse(enterpriseService.isRunning()); + + // 启动服务 + enterpriseService.start(); + assertTrue(enterpriseService.isRunning()); + + // 停止服务 + enterpriseService.stop(); + assertFalse(enterpriseService.isRunning()); + + // 重启服务 + enterpriseService.start(); + assertTrue(enterpriseService.isRunning()); + } + + @Test + void testConcurrentOperations() throws InterruptedException { + // 测试并发操作 + Thread[] threads = new Thread[5]; + boolean[] results = new boolean[5]; + + for (int i = 0; i < 5; i++) { + final int index = i; + threads[i] = new Thread(() -> { + try { + // 模拟并发操作 + String serviceName = enterpriseService.getServiceName(); + String serviceVersion = enterpriseService.getServiceVersion(); + String serviceType = enterpriseService.getServiceType(); + boolean isRunning = enterpriseService.isRunning(); + String healthStatus = enterpriseService.getHealthStatus(); + + results[index] = serviceName != null && + serviceVersion != null && + serviceType != null && + healthStatus != null; + } catch (Exception e) { + results[index] = false; + } + }); + } + + // 启动所有线程 + for (Thread thread : threads) { + thread.start(); + } + + // 等待所有线程完成 + for (Thread thread : threads) { + thread.join(); + } + + // 验证所有线程都成功执行 + for (boolean result : results) { + assertTrue(result, "并发操作应该成功"); + } + } + + @Test + void testServiceRestart() { + // 测试服务重启 + assertTrue(enterpriseService.isRunning()); + + // 停止服务 + enterpriseService.stop(); + assertFalse(enterpriseService.isRunning()); + + // 重启服务 + enterpriseService.start(); + assertTrue(enterpriseService.isRunning()); + + // 验证健康状态 + String healthStatus = enterpriseService.getHealthStatus(); + assertTrue(healthStatus.contains("正常")); + } + + @Test + void testServiceErrorHandling() { + // 测试服务错误处理 + // 多次启动应该不会出错 + assertDoesNotThrow(() -> enterpriseService.start()); + assertDoesNotThrow(() -> enterpriseService.start()); + + // 多次停止应该不会出错 + assertDoesNotThrow(() -> enterpriseService.stop()); + assertDoesNotThrow(() -> enterpriseService.stop()); + } + + @Test + void testServiceInformationConsistency() { + // 测试服务信息一致性 + String serviceName1 = enterpriseService.getServiceName(); + String serviceName2 = enterpriseService.getServiceName(); + assertEquals(serviceName1, serviceName2); + + String serviceVersion1 = enterpriseService.getServiceVersion(); + String serviceVersion2 = enterpriseService.getServiceVersion(); + assertEquals(serviceVersion1, serviceVersion2); + + String serviceType1 = enterpriseService.getServiceType(); + String serviceType2 = enterpriseService.getServiceType(); + assertEquals(serviceType1, serviceType2); + } + + @Test + void testServiceHealthStatusChanges() { + // 测试健康状态变化 + String runningHealthStatus = enterpriseService.getHealthStatus(); + assertTrue(runningHealthStatus.contains("正常")); + + enterpriseService.stop(); + String stoppedHealthStatus = enterpriseService.getHealthStatus(); + assertTrue(stoppedHealthStatus.contains("停止")); + + enterpriseService.start(); + String restartedHealthStatus = enterpriseService.getHealthStatus(); + assertTrue(restartedHealthStatus.contains("正常")); + } +} \ No newline at end of file diff --git a/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java index 37cd6d2..7f30a38 100644 --- a/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java +++ b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java @@ -1,6 +1,5 @@ package com.terrabase.enterprise.impl.open; -import com.terrabase.enterprise.api.CryptoAlgorithm; import com.terrabase.enterprise.impl.open.config.KmcConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -66,353 +65,181 @@ void testServiceInitialization() { } @Test - @DisplayName("测试KMC加密功能") - void testKmcEncryption() { - String plaintext = "测试KMC加密功能"; + @DisplayName("测试服务启动") + void testServiceStart() { + // 停止服务 + service.stop(); + assertFalse(service.isRunning()); - // 执行加密(使用默认AES算法) - String result = service.encrypt(plaintext, CryptoAlgorithm.AES); + // 启动服务 + service.start(); + assertTrue(service.isRunning()); - // 验证结果 - assertNotNull(result); - assertTrue(result.contains("开源版KMC加密成功")); - assertTrue(result.contains("[AES]")); - - // 提取密文部分进行验证 - String ciphertext = result.substring(result.indexOf(": ") + 2); - assertNotNull(ciphertext); - assertTrue(ciphertext.length() > 0); + // 验证健康状态 + String healthStatus = service.getHealthStatus(); + assertTrue(healthStatus.contains("正常")); } @Test - @DisplayName("测试KMC解密功能") - void testKmcDecryption() { - String plaintext = "测试KMC解密功能"; - - // 先加密 - String encryptResult = service.encrypt(plaintext, CryptoAlgorithm.AES); - assertTrue(encryptResult.contains("开源版KMC加密成功")); - assertTrue(encryptResult.contains("[AES]")); - - // 提取密文 - String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + @DisplayName("测试服务停止") + void testServiceStop() { + // 启动服务 + service.start(); + assertTrue(service.isRunning()); - // 执行解密 - String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.AES); + // 停止服务 + service.stop(); + assertFalse(service.isRunning()); - // 验证结果 - assertNotNull(decryptResult); - assertTrue(decryptResult.contains("开源版KMC解密成功")); - assertTrue(decryptResult.contains("[AES]")); - assertTrue(decryptResult.contains(plaintext)); + // 验证健康状态 + String healthStatus = service.getHealthStatus(); + assertTrue(healthStatus.contains("停止")); } @Test - @DisplayName("测试完整的加解密流程") - void testCompleteEncryptDecryptFlow() { - String originalText = "完整的KMC加解密流程测试数据"; - - // 加密 - String encryptResult = service.encrypt(originalText, CryptoAlgorithm.AES); - assertTrue(encryptResult.contains("开源版KMC加密成功")); - assertTrue(encryptResult.contains("[AES]")); + @DisplayName("测试服务重启") + void testServiceRestart() { + // 启动服务 + service.start(); + assertTrue(service.isRunning()); - // 提取密文 - String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + // 停止服务 + service.stop(); + assertFalse(service.isRunning()); - // 解密 - String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.AES); - assertTrue(decryptResult.contains("开源版KMC解密成功")); - assertTrue(decryptResult.contains("[AES]")); + // 重启服务 + service.start(); + assertTrue(service.isRunning()); - // 验证原文和最终解密结果一致 - String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); - assertEquals(originalText, finalDecryptedText); - } - - @Test - @DisplayName("测试空字符串处理") - void testEmptyStringHandling() { - // 测试空字符串加密 - String emptyResult = service.encrypt("", CryptoAlgorithm.AES); - assertTrue(emptyResult.contains("明文数据不能为空")); - - // 测试空字符串解密 - String emptyDecryptResult = service.decrypt("", CryptoAlgorithm.AES); - assertTrue(emptyDecryptResult.contains("密文数据不能为空")); + // 验证健康状态 + String healthStatus = service.getHealthStatus(); + assertTrue(healthStatus.contains("正常")); } @Test - @DisplayName("测试null值处理") - void testNullValueHandling() { - // 测试null值加密 - String nullResult = service.encrypt(null, CryptoAlgorithm.AES); - assertTrue(nullResult.contains("明文数据不能为空")); - - // 测试null值解密 - String nullDecryptResult = service.decrypt(null, CryptoAlgorithm.AES); - assertTrue(nullDecryptResult.contains("密文数据不能为空")); + @DisplayName("测试KMC配置") + void testKmcConfiguration() { + // 验证KMC配置已设置 + assertNotNull(kmcConfig); + assertTrue(kmcConfig.isEnabled()); + assertEquals("test_default", kmcConfig.getDefaultKeyId()); + assertTrue(kmcConfig.isEnableAuditLog()); } @Test - @DisplayName("测试KMC功能禁用时的行为") - void testKmcDisabledBehavior() { - // 禁用KMC功能 - kmcConfig.setEnabled(false); + @DisplayName("测试服务状态一致性") + void testServiceStateConsistency() { + // 测试多次调用状态的一致性 + assertTrue(service.isRunning()); + assertTrue(service.isRunning()); - // 测试加密 - String encryptResult = service.encrypt("测试数据", CryptoAlgorithm.AES); - assertTrue(encryptResult.contains("KMC功能未启用")); + service.stop(); + assertFalse(service.isRunning()); + assertFalse(service.isRunning()); - // 测试解密 - String decryptResult = service.decrypt("测试密文", CryptoAlgorithm.AES); - assertTrue(decryptResult.contains("KMC功能未启用")); + service.start(); + assertTrue(service.isRunning()); + assertTrue(service.isRunning()); } @Test - @DisplayName("测试服务未运行时的行为") - void testServiceNotRunningBehavior() { - // 创建一个未启动的服务实例 - OpenEnterpriseServiceImpl stoppedService = new OpenEnterpriseServiceImpl(); - try { - var field = stoppedService.getClass().getDeclaredField("kmcConfig"); - field.setAccessible(true); - field.set(stoppedService, kmcConfig); - } catch (Exception e) { - throw new RuntimeException("设置KMC配置失败", e); - } + @DisplayName("测试健康状态信息") + void testHealthStatusInformation() { + String healthStatus = service.getHealthStatus(); - // 测试加密 - String encryptResult = stoppedService.encrypt("测试数据", CryptoAlgorithm.AES); - assertTrue(encryptResult.contains("服务未运行")); + // 验证健康状态包含必要信息 + assertNotNull(healthStatus); + assertTrue(healthStatus.contains("开源版")); + assertTrue(healthStatus.contains("正常")); - // 测试解密 - String decryptResult = stoppedService.decrypt("测试密文", CryptoAlgorithm.AES); - assertTrue(decryptResult.contains("服务未运行")); + // 停止服务后验证健康状态变化 + service.stop(); + String stoppedHealthStatus = service.getHealthStatus(); + assertTrue(stoppedHealthStatus.contains("停止")); } @Test - @DisplayName("测试特殊字符加解密") - void testSpecialCharactersEncryptDecrypt() { - String specialText = "特殊字符测试: !@#$%^&*()_+-=[]{}|;':\",./<>?`~ 中文测试 1234567890"; - - // 加密 - String encryptResult = service.encrypt(specialText, CryptoAlgorithm.AES); - assertTrue(encryptResult.contains("开源版KMC加密成功")); - assertTrue(encryptResult.contains("[AES]")); + @DisplayName("测试服务元数据") + void testServiceMetadata() { + // 验证服务名称 + assertEquals("Open Source Enterprise Service", service.getServiceName()); - // 提取密文 - String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + // 验证服务版本 + assertEquals("1.0.0-open", service.getServiceVersion()); - // 解密 - String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.AES); - assertTrue(decryptResult.contains("开源版KMC解密成功")); - assertTrue(decryptResult.contains("[AES]")); + // 验证服务类型 + assertEquals("open", service.getServiceType()); - // 验证原文和最终解密结果一致 - String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); - assertEquals(specialText, finalDecryptedText); - } - - @Test - @DisplayName("测试长文本加解密") - void testLongTextEncryptDecrypt() { - // 生成长文本 - StringBuilder longText = new StringBuilder(); - for (int i = 0; i < 100; i++) { - longText.append("这是一个用于测试KMC加解密功能的长文本数据。"); + // 验证元数据一致性 + assertNotNull(service.getServiceName()); + assertNotNull(service.getServiceVersion()); + assertNotNull(service.getServiceType()); + } + + @Test + @DisplayName("测试并发访问") + void testConcurrentAccess() throws InterruptedException { + // 创建多个线程同时访问服务 + Thread[] threads = new Thread[10]; + boolean[] results = new boolean[10]; + + for (int i = 0; i < 10; i++) { + final int index = i; + threads[i] = new Thread(() -> { + try { + // 模拟并发访问 + String serviceName = service.getServiceName(); + String serviceVersion = service.getServiceVersion(); + String serviceType = service.getServiceType(); + boolean isRunning = service.isRunning(); + String healthStatus = service.getHealthStatus(); + + results[index] = serviceName != null && + serviceVersion != null && + serviceType != null && + healthStatus != null; + } catch (Exception e) { + results[index] = false; + } + }); } - String longPlaintext = longText.toString(); - - // 加密 - String encryptResult = service.encrypt(longPlaintext, CryptoAlgorithm.AES); - assertTrue(encryptResult.contains("开源版KMC加密成功")); - assertTrue(encryptResult.contains("[AES]")); - - // 提取密文 - String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); - - // 解密 - String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.AES); - assertTrue(decryptResult.contains("开源版KMC解密成功")); - assertTrue(decryptResult.contains("[AES]")); - - // 验证原文和最终解密结果一致 - String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); - assertEquals(longPlaintext, finalDecryptedText); - } - - @Test - @DisplayName("测试多次加密同一明文") - void testMultipleEncryptionOfSamePlaintext() { - String plaintext = "多次加密测试数据"; - - // 第一次加密 - String encryptResult1 = service.encrypt(plaintext, CryptoAlgorithm.AES); - assertTrue(encryptResult1.contains("开源版KMC加密成功")); - assertTrue(encryptResult1.contains("[AES]")); - String ciphertext1 = encryptResult1.substring(encryptResult1.indexOf(": ") + 2); - - // 第二次加密 - String encryptResult2 = service.encrypt(plaintext, CryptoAlgorithm.AES); - assertTrue(encryptResult2.contains("开源版KMC加密成功")); - assertTrue(encryptResult2.contains("[AES]")); - String ciphertext2 = encryptResult2.substring(encryptResult2.indexOf(": ") + 2); - // 验证两次加密的结果不同(由于随机IV) - assertNotEquals(ciphertext1, ciphertext2); - - // 验证两次加密都能正确解密 - String decryptResult1 = service.decrypt(ciphertext1, CryptoAlgorithm.AES); - String decryptResult2 = service.decrypt(ciphertext2, CryptoAlgorithm.AES); - - assertTrue(decryptResult1.contains("开源版KMC解密成功")); - assertTrue(decryptResult1.contains("[AES]")); - assertTrue(decryptResult2.contains("开源版KMC解密成功")); - assertTrue(decryptResult2.contains("[AES]")); - - String finalDecryptedText1 = decryptResult1.substring(decryptResult1.indexOf(": ") + 2); - String finalDecryptedText2 = decryptResult2.substring(decryptResult2.indexOf(": ") + 2); - - assertEquals(plaintext, finalDecryptedText1); - assertEquals(plaintext, finalDecryptedText2); - } - - @Test - @DisplayName("测试RSA加密算法") - void testRsaEncryption() { - String plaintext = "RSA加密测试数据"; - - // 加密 - String encryptResult = service.encrypt(plaintext, CryptoAlgorithm.RSA); - assertTrue(encryptResult.contains("开源版KMC加密成功")); - assertTrue(encryptResult.contains("[RSA]")); - - // 提取密文 - String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); - - // 解密 - String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.RSA); - assertTrue(decryptResult.contains("开源版KMC解密成功")); - assertTrue(decryptResult.contains("[RSA]")); - - // 验证原文和最终解密结果一致 - String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); - assertEquals(plaintext, finalDecryptedText); - } - - @Test - @DisplayName("测试DES加密算法") - void testDesEncryption() { - String plaintext = "DES加密测试数据"; - - // 加密 - String encryptResult = service.encrypt(plaintext, CryptoAlgorithm.DES); - assertTrue(encryptResult.contains("开源版KMC加密成功")); - assertTrue(encryptResult.contains("[DES]")); - - // 提取密文 - String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); - - // 解密 - String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.DES); - assertTrue(decryptResult.contains("开源版KMC解密成功")); - assertTrue(decryptResult.contains("[DES]")); - - // 验证原文和最终解密结果一致 - String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); - assertEquals(plaintext, finalDecryptedText); - } - - @Test - @DisplayName("测试3DES加密算法") - void testTripleDesEncryption() { - String plaintext = "3DES加密测试数据"; - - // 加密 - String encryptResult = service.encrypt(plaintext, CryptoAlgorithm.TRIPLE_DES); - assertTrue(encryptResult.contains("开源版KMC加密成功")); - assertTrue(encryptResult.contains("[DESede]")); - - // 提取密文 - String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); - - // 解密 - String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.TRIPLE_DES); - assertTrue(decryptResult.contains("开源版KMC解密成功")); - assertTrue(decryptResult.contains("[DESede]")); - - // 验证原文和最终解密结果一致 - String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); - assertEquals(plaintext, finalDecryptedText); - } - - @Test - @DisplayName("测试Blowfish加密算法") - void testBlowfishEncryption() { - String plaintext = "Blowfish加密测试数据"; - - // 加密 - String encryptResult = service.encrypt(plaintext, CryptoAlgorithm.BLOWFISH); - assertTrue(encryptResult.contains("开源版KMC加密成功")); - assertTrue(encryptResult.contains("[Blowfish]")); - - // 提取密文 - String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); - - // 解密 - String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.BLOWFISH); - assertTrue(decryptResult.contains("开源版KMC解密成功")); - assertTrue(decryptResult.contains("[Blowfish]")); - - // 验证原文和最终解密结果一致 - String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); - assertEquals(plaintext, finalDecryptedText); - } - - @Test - @DisplayName("测试ChaCha20加密算法") - void testChaCha20Encryption() { - String plaintext = "ChaCha20加密测试数据"; - - // 加密 - String encryptResult = service.encrypt(plaintext, CryptoAlgorithm.CHACHA20); - assertTrue(encryptResult.contains("开源版KMC加密成功")); - assertTrue(encryptResult.contains("[ChaCha20]")); - - // 提取密文 - String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + // 启动所有线程 + for (Thread thread : threads) { + thread.start(); + } - // 解密 - String decryptResult = service.decrypt(ciphertext, CryptoAlgorithm.CHACHA20); - assertTrue(decryptResult.contains("开源版KMC解密成功")); - assertTrue(decryptResult.contains("[ChaCha20]")); + // 等待所有线程完成 + for (Thread thread : threads) { + thread.join(); + } - // 验证原文和最终解密结果一致 - String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); - assertEquals(plaintext, finalDecryptedText); + // 验证所有线程都成功访问了服务 + for (boolean result : results) { + assertTrue(result, "并发访问应该成功"); + } } @Test - @DisplayName("测试null算法参数(应该使用默认AES)") - void testNullAlgorithmParameter() { - String plaintext = "测试null算法参数"; + @DisplayName("测试服务生命周期") + void testServiceLifecycle() { + // 初始状态应该是停止的 + assertFalse(service.isRunning()); - // 加密(传递null算法参数) - String encryptResult = service.encrypt(plaintext, null); - assertTrue(encryptResult.contains("开源版KMC加密成功")); - assertTrue(encryptResult.contains("[AES]")); // 应该使用默认AES + // 启动服务 + service.start(); + assertTrue(service.isRunning()); - // 提取密文 - String ciphertext = encryptResult.substring(encryptResult.indexOf(": ") + 2); + // 再次启动应该不会出错 + assertDoesNotThrow(() -> service.start()); + assertTrue(service.isRunning()); - // 解密(传递null算法参数) - String decryptResult = service.decrypt(ciphertext, null); - assertTrue(decryptResult.contains("开源版KMC解密成功")); - assertTrue(decryptResult.contains("[AES]")); // 应该使用默认AES + // 停止服务 + service.stop(); + assertFalse(service.isRunning()); - // 验证原文和最终解密结果一致 - String finalDecryptedText = decryptResult.substring(decryptResult.indexOf(": ") + 2); - assertEquals(plaintext, finalDecryptedText); + // 再次停止应该不会出错 + assertDoesNotThrow(() -> service.stop()); + assertFalse(service.isRunning()); } -} +} \ No newline at end of file From c4357374e25baaf384e3f5cf2a0a76bfd8729c2f Mon Sep 17 00:00:00 2001 From: panyehong <2655992392@qq.com> Date: Wed, 22 Oct 2025 19:54:54 +0800 Subject: [PATCH 3/6] =?UTF-8?q?[feat]Terrabase=E7=9A=84SDK?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E3=80=82=20[=E5=85=B7=E4=BD=93=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0]=201.=E6=89=80=E6=9C=89=E7=9A=84DTO=EF=BC=8C=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=92=8C=E8=BF=94=E5=9B=9E=E5=AE=9A=E4=B9=89=E3=80=82?= =?UTF-8?q?=202.=E6=95=B0=E6=8D=AE=E4=BD=BF=E8=83=BD=E6=89=80=E6=9C=89?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=BC=80=E6=BA=90=E5=92=8C=E5=95=86=E4=B8=9A?= =?UTF-8?q?=E7=89=88=E5=AE=9E=E7=8E=B0=E3=80=82=203.=E5=95=86=E4=B8=9A?= =?UTF-8?q?=E7=89=88=E5=AF=B9=E6=8E=A5oms=E7=9A=84=E6=89=80=E6=9C=89client?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E3=80=82=204.nacos=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=8F=8A=E5=AF=86=E7=A0=81=E5=92=8C=E6=9C=BA=E6=9C=BA=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3token=E8=8E=B7=E5=8F=96=E8=84=9A=E6=9C=AC=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business-app/pom.xml | 97 ++++ .../business/BusinessApplication.java | 22 +- .../controller/CertificateController.java | 306 ++---------- .../business/controller/CryptoController.java | 126 +---- .../controller/EnterpriseController.java | 3 +- .../controller/LogManagementController.java | 250 ++-------- .../controller/MonitoringController.java | 347 +++---------- .../controller/UserManagementController.java | 199 +++----- .../terrabase/business/util/JarLoadUtil.java | 117 +---- .../terrabase/sdk/StandaloneJarLoadUtil.java | 465 ++++++++++++++++++ .../java/com/terrabase/sdk/TerrabaseSDK.java | 324 ++++++++++++ .../sdk/example/SDKUsageExample.java | 160 ++++++ .../src/main/resources/application.properties | 18 +- enterprise-api/pom.xml | 7 + .../enterprise/api/CertificateService.java | 72 +-- .../enterprise/api/CryptoService.java | 50 +- .../enterprise/api/EnterpriseService.java | 19 +- .../enterprise/api/LogManagementService.java | 69 +-- .../terrabase/enterprise/api/MenuService.java | 18 + .../enterprise/api/MonitoringService.java | 78 +-- .../enterprise/api/UserManagementService.java | 85 +--- .../enterprise/api/dto/AlarmDetail.java | 240 --------- .../enterprise/api/dto/AlarmInfo.java | 170 ------- .../enterprise/api/dto/AuthorityInfo.java | 46 ++ .../enterprise/api/dto/AuthorityInfos.java | 161 ------ .../enterprise/api/dto/CaCertificate.java | 140 ------ .../enterprise/api/dto/CertCollectInfo.java | 201 ++------ .../enterprise/api/dto/CertificateDetail.java | 110 ----- .../enterprise/api/dto/Ciphertext.java | 14 + .../enterprise/api/dto/EventDefine.java | 192 ++------ .../enterprise/api/dto/EventInfo.java | 303 +++++------- .../enterprise/api/dto/EventObject.java | 66 +++ .../enterprise/api/dto/EventQueryParams.java | 154 ------ .../enterprise/api/dto/EventsCollection.java | 18 + .../enterprise/api/dto/ForbiddenBody.java | 114 ----- .../enterprise/api/dto/LicenseInfo.java | 173 +------ .../enterprise/api/dto/LicenseInfoEx.java | 18 + .../enterprise/api/dto/LogI18NS.java | 133 ----- .../terrabase/enterprise/api/dto/LogI18n.java | 22 + .../enterprise/api/dto/LoginUserDto.java | 20 + .../terrabase/enterprise/api/dto/Logs.java | 219 --------- .../enterprise/api/dto/MenuInfo.java | 24 + .../enterprise/api/dto/MenuRegisterInfo.java | 225 ++------- .../enterprise/api/dto/PageResult.java | 133 ----- .../enterprise/api/dto/Plaintext.java | 14 + .../api/dto/RegisterCertificate.java | 113 ----- .../enterprise/api/dto/ResourceGroup.java | 9 + .../enterprise/api/dto/RoleI18nInfo.java | 34 ++ .../enterprise/api/dto/RoleRegister.java | 112 ----- .../enterprise/api/dto/RoleRegisterInfo.java | 41 ++ .../enterprise/api/dto/RoleScenInfo.java | 22 + .../enterprise/api/dto/Subscribe.java | 114 ----- .../api/request/GetEventsParams.java | 101 ++++ .../api/request/LogAttributeVo.java | 30 ++ .../api/request/RegisterEventDefineReq.java | 33 ++ .../api/request/RoleRegisterVo.java | 20 + .../enterprise/api/response/ResultVo.java | 109 ++++ enterprise-impl-commercial/pom.xml | 38 ++ .../CommercialCertificateServiceImpl.java | 382 ++------------ .../CommercialCryptoServiceImpl.java | 211 ++------ .../CommercialEnterpriseServiceImpl.java | 32 +- .../CommercialLogManagementServiceImpl.java | 202 ++------ .../commercial/CommercialMenuServiceImpl.java | 57 +++ .../CommercialMonitoringServiceImpl.java | 373 +++----------- .../CommercialUserManagementServiceImpl.java | 412 +++++----------- .../commercial/client/AlarmFeignClient.java | 49 ++ .../commercial/client/CertFeignClient.java | 26 + .../commercial/client/CryptoFeighClient.java | 33 ++ .../impl/commercial/client/LicenseClient.java | 17 + .../client/ManualAuthenticationClient.java | 33 ++ .../commercial/client/MenuFeignClient.java | 23 + .../commercial/client/OmsExtensionClient.java | 19 + .../client/OperateLogFeignClient.java | 36 ++ .../client/PermissionFeignClient.java | 28 ++ .../commercial/client/RoleFeignClient.java | 26 + .../config/CommercialNacosConfig.java | 116 +++++ .../FeignInnerRequestAuthInterceptor.java | 26 + .../config/HttpsFeignClientConfig.java | 52 ++ .../LoadBalancerClientFactoryConfig.java | 101 ++++ .../commercial/config/MachineTokenConfig.java | 122 +++++ .../impl/commercial/config/NacosListener.java | 34 ++ .../impl/open/OpenCertificateServiceImpl.java | 196 ++------ .../impl/open/OpenCryptoServiceImpl.java | 67 +-- .../impl/open/OpenEnterpriseServiceImpl.java | 32 +- .../open/OpenLogManagementServiceImpl.java | 125 ++--- .../impl/open/OpenMenuServiceImpl.java | 36 ++ .../impl/open/OpenMonitoringServiceImpl.java | 305 ++++++------ .../open/OpenUserManagementServiceImpl.java | 256 ++++------ .../impl/open/util/KmcCryptoUtil.java | 397 ++++++++------- ...nEnterpriseServiceImplIntegrationTest.java | 163 +----- .../OpenEnterpriseServiceImplKmcTest.java | 211 +------- pom.xml | 17 + .../sdk/config/TerrabaseSDKConfig.java | 360 ++++++++++++++ 93 files changed, 4368 insertions(+), 6725 deletions(-) create mode 100644 business-app/src/main/java/com/terrabase/sdk/StandaloneJarLoadUtil.java create mode 100644 business-app/src/main/java/com/terrabase/sdk/TerrabaseSDK.java create mode 100644 business-app/src/main/java/com/terrabase/sdk/example/SDKUsageExample.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/MenuService.java delete mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmDetail.java delete mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmInfo.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AuthorityInfo.java delete mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AuthorityInfos.java delete mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CaCertificate.java delete mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertificateDetail.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Ciphertext.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventObject.java delete mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventQueryParams.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventsCollection.java delete mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/ForbiddenBody.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LicenseInfoEx.java delete mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LogI18NS.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LogI18n.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LoginUserDto.java delete mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Logs.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/MenuInfo.java delete mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/PageResult.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Plaintext.java delete mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RegisterCertificate.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/ResourceGroup.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleI18nInfo.java delete mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleRegister.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleRegisterInfo.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleScenInfo.java delete mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Subscribe.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/request/GetEventsParams.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/request/LogAttributeVo.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/request/RegisterEventDefineReq.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/request/RoleRegisterVo.java create mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/response/ResultVo.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialMenuServiceImpl.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/AlarmFeignClient.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/CertFeignClient.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/CryptoFeighClient.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/LicenseClient.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/ManualAuthenticationClient.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/MenuFeignClient.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/OmsExtensionClient.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/OperateLogFeignClient.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/PermissionFeignClient.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/RoleFeignClient.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/CommercialNacosConfig.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/FeignInnerRequestAuthInterceptor.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/HttpsFeignClientConfig.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/LoadBalancerClientFactoryConfig.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/MachineTokenConfig.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/NacosListener.java create mode 100644 enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenMenuServiceImpl.java create mode 100644 sdk-config/src/main/java/com/terrabase/sdk/config/TerrabaseSDKConfig.java diff --git a/business-app/pom.xml b/business-app/pom.xml index a74d412..ae03d0c 100644 --- a/business-app/pom.xml +++ b/business-app/pom.xml @@ -36,6 +36,13 @@ spring-boot-starter-validation + + + com.terrabase + sdk-config + ${project.version} + + com.terrabase @@ -57,16 +64,106 @@ test + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + 2023.0.3.2 + + + org.springframework.boot spring-boot-maven-plugin com.terrabase.business.BusinessApplication + + + repackage + + repackage + + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.4.1 + + + create-sdk + package + + shade + + + terrabase-sdk-${project.version} + + + com.terrabase.sdk.TerrabaseSDK + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + true + sdk + + + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.1 + + + attach-sources + + jar + + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.6.3 + + + attach-javadocs + + jar + + + + + 17 + 17 + UTF-8 + UTF-8 + UTF-8 + none + true + diff --git a/business-app/src/main/java/com/terrabase/business/BusinessApplication.java b/business-app/src/main/java/com/terrabase/business/BusinessApplication.java index 1536d58..50eb13f 100644 --- a/business-app/src/main/java/com/terrabase/business/BusinessApplication.java +++ b/business-app/src/main/java/com/terrabase/business/BusinessApplication.java @@ -1,5 +1,6 @@ package com.terrabase.business; +import com.alibaba.nacos.common.tls.TlsSystemConfig; import com.terrabase.business.util.JarLoadUtil; import com.terrabase.enterprise.api.EnterpriseService; import org.slf4j.Logger; @@ -15,11 +16,18 @@ * Terrabase 业务应用主启动类 * 基于Spring Boot框架,支持动态加载企业服务实现 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @SpringBootApplication public class BusinessApplication { +// static { +// // configure nacos SSL +// System.setProperty(TlsSystemConfig.TLS_ENABLE, "true"); +// System.setProperty(TlsSystemConfig.CLIENT_AUTH, "true"); +// System.setProperty(TlsSystemConfig.CLIENT_TRUST_CERT, +// "/opt/huawei/fce/runtime/security/server_cert/nacos/nacos.crt"); +// } private static final Logger logger = LoggerFactory.getLogger(BusinessApplication.class); @@ -63,16 +71,8 @@ public CommandLineRunner init() { logger.info(" 服务版本: {}", enterpriseService.getServiceVersion()); logger.info(" 服务类型: {}", enterpriseService.getServiceType()); - // 启动企业服务 - logger.info("正在启动企业服务..."); - enterpriseService.start(); - - // 检查服务是否成功启动 - if (enterpriseService.isRunning()) { - logger.info("企业服务启动成功"); - } else { - logger.warn("企业服务启动失败"); - } + // 企业服务已加载完成,无需手动启动 + logger.info("企业服务加载完成"); // 获取健康状态 String healthStatus = enterpriseService.getHealthStatus(); diff --git a/business-app/src/main/java/com/terrabase/business/controller/CertificateController.java b/business-app/src/main/java/com/terrabase/business/controller/CertificateController.java index 3b69c52..1ceafbb 100644 --- a/business-app/src/main/java/com/terrabase/business/controller/CertificateController.java +++ b/business-app/src/main/java/com/terrabase/business/controller/CertificateController.java @@ -2,6 +2,9 @@ import com.terrabase.business.util.JarLoadUtil; import com.terrabase.enterprise.api.CertificateService; +import com.terrabase.enterprise.api.dto.CertCollectInfo; +import com.terrabase.enterprise.api.dto.LicenseInfo; +import com.terrabase.enterprise.api.response.ResultVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -9,13 +12,14 @@ import org.springframework.web.bind.annotation.*; import java.util.HashMap; +import java.util.List; import java.util.Map; /** * 证书管理服务控制器 * 负责提供证书管理相关的REST API接口 - * - * @author Terrabase Team + * + * @author Yehong Pan * @version 1.0.0 */ @RestController @@ -28,166 +32,26 @@ public class CertificateController { @Autowired private JarLoadUtil jarLoadUtil; - /** - * 获取证书管理服务信息 - */ - @GetMapping("/info") - public ResponseEntity> getCertificateServiceInfo() { - try { - CertificateService certService = jarLoadUtil.loadCertificateService(); - - Map info = new HashMap<>(); - info.put("serviceName", certService.getServiceName()); - info.put("serviceVersion", certService.getServiceVersion()); - info.put("serviceType", certService.getServiceType()); - info.put("healthStatus", certService.getHealthStatus()); - - return ResponseEntity.ok(info); - - } catch (Exception e) { - logger.error("获取证书管理服务信息失败", e); - Map error = new HashMap<>(); - error.put("error", "获取证书管理服务信息失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 生成证书 - */ - @PostMapping("/generate") - public ResponseEntity> generateCertificate(@RequestBody Map request) { - try { - String commonName = (String) request.get("commonName"); - String organization = (String) request.get("organization"); - String validityDays = (String) request.get("validityDays"); - String keySize = (String) request.get("keySize"); - - if (commonName == null || commonName.trim().isEmpty()) { - Map error = new HashMap<>(); - error.put("error", "通用名称(CN)不能为空"); - return ResponseEntity.badRequest().body(error); - } - - CertificateService certService = jarLoadUtil.loadCertificateService(); - - // 这里应该调用实际的证书生成方法 - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("message", "证书生成成功"); - response.put("certificateId", "cert_" + System.currentTimeMillis()); - response.put("commonName", commonName); - response.put("organization", organization); - response.put("validityDays", validityDays != null ? validityDays : "365"); - response.put("keySize", keySize != null ? keySize : "2048"); - response.put("serviceType", certService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("生成证书失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "生成证书失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 获取证书信息 - */ - @GetMapping("/{certificateId}") - public ResponseEntity> getCertificateInfo(@PathVariable String certificateId) { - try { - if (certificateId == null || certificateId.trim().isEmpty()) { - Map error = new HashMap<>(); - error.put("error", "证书ID不能为空"); - return ResponseEntity.badRequest().body(error); - } - - CertificateService certService = jarLoadUtil.loadCertificateService(); - - // 这里应该调用实际的证书信息获取方法 - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("certificateId", certificateId); - response.put("commonName", "example.com"); - response.put("organization", "Example Organization"); - response.put("validFrom", "2024-01-01T00:00:00Z"); - response.put("validTo", "2025-01-01T00:00:00Z"); - response.put("status", "ACTIVE"); - response.put("serviceType", certService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("获取证书信息失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "获取证书信息失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 验证证书 - */ - @PostMapping("/validate") - public ResponseEntity> validateCertificate(@RequestBody Map request) { - try { - String certificateData = request.get("certificateData"); - String certificateId = request.get("certificateId"); - - if (certificateData == null && certificateId == null) { - Map error = new HashMap<>(); - error.put("error", "证书数据或证书ID必须提供其中一个"); - return ResponseEntity.badRequest().body(error); - } - - CertificateService certService = jarLoadUtil.loadCertificateService(); - - // 这里应该调用实际的证书验证方法 - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("valid", true); - response.put("message", "证书验证通过"); - response.put("certificateId", certificateId); - response.put("serviceType", certService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("验证证书失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "验证证书失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - /** * 获取证书列表 */ @GetMapping("/list") - public ResponseEntity> getCertificateList(@RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "10") int size, - @RequestParam(required = false) String status) { + public ResponseEntity> getCertificateList() { try { CertificateService certService = jarLoadUtil.loadCertificateService(); + ResultVo> result = certService.listCertificateServiceList(); - // 这里应该调用实际的证书列表查询方法 Map response = new HashMap<>(); - response.put("status", "success"); - response.put("certificates", new java.util.ArrayList<>()); // 模拟空列表 - response.put("page", page); - response.put("size", size); - response.put("total", 0); - response.put("filters", Map.of("status", status)); - response.put("serviceType", certService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); + if ("200".equals(result.getCode())) { + response.put("status", "success"); + response.put("certificates", result.getData()); + response.put("total", result.getData() != null ? result.getData().size() : 0); + response.put("timestamp", System.currentTimeMillis()); + } else { + response.put("status", "failed"); + response.put("error", result.getMsg()); + response.put("code", result.getCode()); + } return ResponseEntity.ok(response); @@ -201,140 +65,34 @@ public ResponseEntity> getCertificateList(@RequestParam(defa } /** - * 撤销证书 + * 获取License信息 */ - @PostMapping("/{certificateId}/revoke") - public ResponseEntity> revokeCertificate(@PathVariable String certificateId, - @RequestBody Map request) { + @GetMapping("/license") + public ResponseEntity> getLicenseInfo() { try { - if (certificateId == null || certificateId.trim().isEmpty()) { - Map error = new HashMap<>(); - error.put("error", "证书ID不能为空"); - return ResponseEntity.badRequest().body(error); - } - - String reason = request.get("reason"); - CertificateService certService = jarLoadUtil.loadCertificateService(); + ResultVo result = certService.getLicenseInfo(); - // 这里应该调用实际的证书撤销方法 Map response = new HashMap<>(); - response.put("status", "success"); - response.put("message", "证书撤销成功"); - response.put("certificateId", certificateId); - response.put("reason", reason); - response.put("revokedAt", System.currentTimeMillis()); - response.put("serviceType", certService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("撤销证书失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "撤销证书失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 更新证书 - */ - @PutMapping("/{certificateId}") - public ResponseEntity> updateCertificate(@PathVariable String certificateId, - @RequestBody Map request) { - try { - if (certificateId == null || certificateId.trim().isEmpty()) { - Map error = new HashMap<>(); - error.put("error", "证书ID不能为空"); - return ResponseEntity.badRequest().body(error); - } - - CertificateService certService = jarLoadUtil.loadCertificateService(); - - // 这里应该调用实际的证书更新方法 - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("message", "证书更新成功"); - response.put("certificateId", certificateId); - response.put("serviceType", certService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("更新证书失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "更新证书失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 删除证书 - */ - @DeleteMapping("/{certificateId}") - public ResponseEntity> deleteCertificate(@PathVariable String certificateId) { - try { - if (certificateId == null || certificateId.trim().isEmpty()) { - Map error = new HashMap<>(); - error.put("error", "证书ID不能为空"); - return ResponseEntity.badRequest().body(error); + if ("200".equals(result.getCode())) { + response.put("status", "success"); + response.put("license", result.getData()); + response.put("timestamp", System.currentTimeMillis()); + } else { + response.put("status", "failed"); + response.put("error", result.getMsg()); + response.put("code", result.getCode()); } - CertificateService certService = jarLoadUtil.loadCertificateService(); - - // 这里应该调用实际的证书删除方法 - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("message", "证书删除成功"); - response.put("certificateId", certificateId); - response.put("serviceType", certService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - return ResponseEntity.ok(response); } catch (Exception e) { - logger.error("删除证书失败", e); + logger.error("获取License信息失败", e); Map error = new HashMap<>(); error.put("status", "failed"); - error.put("error", "删除证书失败: " + e.getMessage()); + error.put("error", "获取License信息失败: " + e.getMessage()); return ResponseEntity.internalServerError().body(error); } } - /** - * 获取证书统计信息 - */ - @GetMapping("/statistics") - public ResponseEntity> getCertificateStatistics() { - try { - CertificateService certService = jarLoadUtil.loadCertificateService(); - - // 这里应该调用实际的证书统计方法 - Map statistics = new HashMap<>(); - statistics.put("totalCertificates", 0); - statistics.put("activeCertificates", 0); - statistics.put("expiredCertificates", 0); - statistics.put("revokedCertificates", 0); - statistics.put("expiringSoon", 0); - - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("statistics", statistics); - response.put("serviceType", certService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("获取证书统计信息失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "获取证书统计信息失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } } diff --git a/business-app/src/main/java/com/terrabase/business/controller/CryptoController.java b/business-app/src/main/java/com/terrabase/business/controller/CryptoController.java index 1dfaab5..e5ea8cf 100644 --- a/business-app/src/main/java/com/terrabase/business/controller/CryptoController.java +++ b/business-app/src/main/java/com/terrabase/business/controller/CryptoController.java @@ -16,7 +16,7 @@ * 加解密服务控制器 * 负责提供数据加解密相关的REST API接口 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @RestController @@ -29,30 +29,6 @@ public class CryptoController { @Autowired private JarLoadUtil jarLoadUtil; - /** - * 获取加解密服务信息 - */ - @GetMapping("/info") - public ResponseEntity> getCryptoServiceInfo() { - try { - CryptoService cryptoService = jarLoadUtil.loadCryptoService(); - - Map info = new HashMap<>(); - info.put("serviceName", cryptoService.getServiceName()); - info.put("serviceVersion", cryptoService.getServiceVersion()); - info.put("serviceType", cryptoService.getServiceType()); - info.put("healthStatus", cryptoService.getHealthStatus()); - - return ResponseEntity.ok(info); - - } catch (Exception e) { - logger.error("获取加解密服务信息失败", e); - Map error = new HashMap<>(); - error.put("error", "获取加解密服务信息失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - /** * 数据加密接口 */ @@ -61,6 +37,7 @@ public ResponseEntity> encrypt(@RequestBody Map error = new HashMap<>(); @@ -72,13 +49,13 @@ public ResponseEntity> encrypt(@RequestBody Map response = new HashMap<>(); response.put("status", "success"); response.put("ciphertext", result); - response.put("serviceType", cryptoService.getServiceType()); - response.put("algorithm", algorithm.getAlgorithm()); + // 不再返回服务类型 + response.put("algorithm", algorithm != null ? algorithm.getAlgorithm() : null); response.put("timestamp", System.currentTimeMillis()); return ResponseEntity.ok(response); @@ -100,6 +77,7 @@ public ResponseEntity> decrypt(@RequestBody Map error = new HashMap<>(); @@ -111,13 +89,13 @@ public ResponseEntity> decrypt(@RequestBody Map response = new HashMap<>(); response.put("status", "success"); response.put("result", result); - response.put("serviceType", cryptoService.getServiceType()); - response.put("algorithm", algorithm.getAlgorithm()); + // 不再返回服务类型 + response.put("algorithm", algorithm != null ? algorithm.getAlgorithm() : null); response.put("timestamp", System.currentTimeMillis()); return ResponseEntity.ok(response); @@ -153,91 +131,5 @@ public ResponseEntity> getSupportedAlgorithms() { } } - /** - * 批量加密接口 - */ - @PostMapping("/encrypt/batch") - public ResponseEntity> batchEncrypt(@RequestBody Map request) { - try { - @SuppressWarnings("unchecked") - java.util.List plaintexts = (java.util.List) request.get("plaintexts"); - String algorithmName = (String) request.get("algorithm"); - - if (plaintexts == null || plaintexts.isEmpty()) { - Map error = new HashMap<>(); - error.put("error", "明文数据列表不能为空"); - return ResponseEntity.badRequest().body(error); - } - - CryptoService cryptoService = jarLoadUtil.loadCryptoService(); - CryptoAlgorithm algorithm = CryptoAlgorithm.fromString(algorithmName); - - java.util.List results = new java.util.ArrayList<>(); - for (String plaintext : plaintexts) { - String encrypted = cryptoService.encrypt(plaintext, algorithm); - results.add(encrypted); - } - - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("ciphertexts", results); - response.put("serviceType", cryptoService.getServiceType()); - response.put("algorithm", algorithm.getAlgorithm()); - response.put("count", results.size()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("批量加密失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "批量加密失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - /** - * 批量解密接口 - */ - @PostMapping("/decrypt/batch") - public ResponseEntity> batchDecrypt(@RequestBody Map request) { - try { - @SuppressWarnings("unchecked") - java.util.List ciphertexts = (java.util.List) request.get("ciphertexts"); - String algorithmName = (String) request.get("algorithm"); - - if (ciphertexts == null || ciphertexts.isEmpty()) { - Map error = new HashMap<>(); - error.put("error", "密文数据列表不能为空"); - return ResponseEntity.badRequest().body(error); - } - - CryptoService cryptoService = jarLoadUtil.loadCryptoService(); - CryptoAlgorithm algorithm = CryptoAlgorithm.fromString(algorithmName); - - java.util.List results = new java.util.ArrayList<>(); - for (String ciphertext : ciphertexts) { - String decrypted = cryptoService.decrypt(ciphertext, algorithm); - results.add(decrypted); - } - - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("results", results); - response.put("serviceType", cryptoService.getServiceType()); - response.put("algorithm", algorithm.getAlgorithm()); - response.put("count", results.size()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("批量解密失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "批量解密失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } } diff --git a/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java b/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java index 5990fca..224f487 100644 --- a/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java +++ b/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java @@ -15,7 +15,7 @@ * 企业服务主控制器 * 负责企业服务的基础功能:服务信息、健康状态、配置管理、服务重载等 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @RestController @@ -92,7 +92,6 @@ public ResponseEntity> reloadService() { // 重新加载服务 EnterpriseService service = jarLoadUtil.loadEnterpriseService(); - service.start(); Map response = new HashMap<>(); response.put("message", "企业服务重新加载成功"); diff --git a/business-app/src/main/java/com/terrabase/business/controller/LogManagementController.java b/business-app/src/main/java/com/terrabase/business/controller/LogManagementController.java index bca810f..112341d 100644 --- a/business-app/src/main/java/com/terrabase/business/controller/LogManagementController.java +++ b/business-app/src/main/java/com/terrabase/business/controller/LogManagementController.java @@ -2,6 +2,9 @@ import com.terrabase.business.util.JarLoadUtil; import com.terrabase.enterprise.api.LogManagementService; +import com.terrabase.enterprise.api.dto.LogI18n; +import com.terrabase.enterprise.api.request.LogAttributeVo; +import com.terrabase.enterprise.api.response.ResultVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -9,13 +12,14 @@ import org.springframework.web.bind.annotation.*; import java.util.HashMap; +import java.util.List; import java.util.Map; /** * 日志管理服务控制器 * 负责提供日志管理相关的REST API接口 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @RestController @@ -29,245 +33,79 @@ public class LogManagementController { private JarLoadUtil jarLoadUtil; /** - * 获取日志管理服务信息 + * 上报审计日志 */ - @GetMapping("/info") - public ResponseEntity> getLogManagementServiceInfo() { + @PostMapping("/register") + public ResponseEntity> registerLogs(@RequestBody List logs) { try { - LogManagementService logService = jarLoadUtil.loadLogManagementService(); - - Map info = new HashMap<>(); - info.put("serviceName", logService.getServiceName()); - info.put("serviceVersion", logService.getServiceVersion()); - info.put("serviceType", logService.getServiceType()); - info.put("healthStatus", logService.getHealthStatus()); - - return ResponseEntity.ok(info); - - } catch (Exception e) { - logger.error("获取日志管理服务信息失败", e); - Map error = new HashMap<>(); - error.put("error", "获取日志管理服务信息失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 记录日志 - */ - @PostMapping("/record") - public ResponseEntity> recordLog(@RequestBody Map request) { - try { - String level = (String) request.get("level"); - String message = (String) request.get("message"); - String category = (String) request.get("category"); - String userId = (String) request.get("userId"); - - if (message == null || message.trim().isEmpty()) { + if (logs == null || logs.isEmpty()) { Map error = new HashMap<>(); - error.put("error", "日志消息不能为空"); + error.put("error", "日志列表不能为空"); return ResponseEntity.badRequest().body(error); } LogManagementService logService = jarLoadUtil.loadLogManagementService(); - - // 这里应该调用实际的日志记录方法 - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("message", "日志记录成功"); - response.put("level", level != null ? level : "INFO"); - response.put("category", category); - response.put("serviceType", logService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("记录日志失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "记录日志失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 查询日志 - */ - @GetMapping("/query") - public ResponseEntity> queryLogs(@RequestParam(required = false) String level, - @RequestParam(required = false) String category, - @RequestParam(required = false) String startTime, - @RequestParam(required = false) String endTime, - @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "10") int size) { - try { - LogManagementService logService = jarLoadUtil.loadLogManagementService(); - - // 这里应该调用实际的日志查询方法 - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("logs", new java.util.ArrayList<>()); // 模拟空列表 - response.put("filters", Map.of( - "level", level, - "category", category, - "startTime", startTime, - "endTime", endTime - )); - response.put("page", page); - response.put("size", size); - response.put("total", 0); - response.put("serviceType", logService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("查询日志失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "查询日志失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 获取日志统计信息 - */ - @GetMapping("/statistics") - public ResponseEntity> getLogStatistics(@RequestParam(required = false) String startTime, - @RequestParam(required = false) String endTime) { - try { - LogManagementService logService = jarLoadUtil.loadLogManagementService(); - - // 这里应该调用实际的日志统计方法 - Map statistics = new HashMap<>(); - statistics.put("totalLogs", 0); - statistics.put("errorLogs", 0); - statistics.put("warningLogs", 0); - statistics.put("infoLogs", 0); - statistics.put("debugLogs", 0); - statistics.put("categories", new java.util.HashMap<>()); + ResultVo result = logService.registerLogs(logs); Map response = new HashMap<>(); - response.put("status", "success"); - response.put("statistics", statistics); - response.put("period", Map.of("startTime", startTime, "endTime", endTime)); - response.put("serviceType", logService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); + if ("200".equals(result.getCode())) { + response.put("status", "success"); + response.put("message", "日志上报成功"); + response.put("logCount", result.getData()); + response.put("timestamp", System.currentTimeMillis()); + } else { + response.put("status", "failed"); + response.put("error", result.getMsg()); + response.put("code", result.getCode()); + } return ResponseEntity.ok(response); } catch (Exception e) { - logger.error("获取日志统计信息失败", e); + logger.error("上报审计日志失败", e); Map error = new HashMap<>(); error.put("status", "failed"); - error.put("error", "获取日志统计信息失败: " + e.getMessage()); + error.put("error", "上报审计日志失败: " + e.getMessage()); return ResponseEntity.internalServerError().body(error); } } /** - * 导出日志 + * 注册审计日志国际化 */ - @PostMapping("/export") - public ResponseEntity> exportLogs(@RequestBody Map request) { + @PostMapping("/i18n") + public ResponseEntity> registryInternational(@RequestBody List logI18ns) { try { - String level = (String) request.get("level"); - String category = (String) request.get("category"); - String startTime = (String) request.get("startTime"); - String endTime = (String) request.get("endTime"); - String format = (String) request.getOrDefault("format", "json"); - - LogManagementService logService = jarLoadUtil.loadLogManagementService(); - - // 这里应该调用实际的日志导出方法 - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("message", "日志导出任务已创建"); - response.put("exportId", "export_" + System.currentTimeMillis()); - response.put("format", format); - response.put("filters", Map.of( - "level", level, - "category", category, - "startTime", startTime, - "endTime", endTime - )); - response.put("serviceType", logService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); + if (logI18ns == null || logI18ns.isEmpty()) { + Map error = new HashMap<>(); + error.put("error", "国际化信息列表不能为空"); + return ResponseEntity.badRequest().body(error); + } - } catch (Exception e) { - logger.error("导出日志失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "导出日志失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 清理日志 - */ - @DeleteMapping("/cleanup") - public ResponseEntity> cleanupLogs(@RequestParam(required = false) String beforeDate, - @RequestParam(required = false) String level) { - try { LogManagementService logService = jarLoadUtil.loadLogManagementService(); + ResultVo result = logService.registryInternational(logI18ns); - // 这里应该调用实际的日志清理方法 Map response = new HashMap<>(); - response.put("status", "success"); - response.put("message", "日志清理任务已创建"); - response.put("cleanupId", "cleanup_" + System.currentTimeMillis()); - response.put("filters", Map.of( - "beforeDate", beforeDate, - "level", level - )); - response.put("serviceType", logService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); + if ("200".equals(result.getCode())) { + response.put("status", "success"); + response.put("message", "审计日志国际化注册成功"); + response.put("registered", result.getData()); + response.put("timestamp", System.currentTimeMillis()); + } else { + response.put("status", "failed"); + response.put("error", result.getMsg()); + response.put("code", result.getCode()); + } return ResponseEntity.ok(response); } catch (Exception e) { - logger.error("清理日志失败", e); + logger.error("注册审计日志国际化失败", e); Map error = new HashMap<>(); error.put("status", "failed"); - error.put("error", "清理日志失败: " + e.getMessage()); + error.put("error", "注册审计日志国际化失败: " + e.getMessage()); return ResponseEntity.internalServerError().body(error); } } - /** - * 获取日志配置 - */ - @GetMapping("/config") - public ResponseEntity> getLogConfig() { - try { - LogManagementService logService = jarLoadUtil.loadLogManagementService(); - - // 这里应该调用实际的日志配置获取方法 - Map config = new HashMap<>(); - config.put("maxLogSize", "100MB"); - config.put("retentionDays", 30); - config.put("logLevels", new String[]{"DEBUG", "INFO", "WARN", "ERROR"}); - config.put("categories", new String[]{"SYSTEM", "USER", "SECURITY", "AUDIT"}); - - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("config", config); - response.put("serviceType", logService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("获取日志配置失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "获取日志配置失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } } diff --git a/business-app/src/main/java/com/terrabase/business/controller/MonitoringController.java b/business-app/src/main/java/com/terrabase/business/controller/MonitoringController.java index 256ff7a..7bdba71 100644 --- a/business-app/src/main/java/com/terrabase/business/controller/MonitoringController.java +++ b/business-app/src/main/java/com/terrabase/business/controller/MonitoringController.java @@ -2,6 +2,11 @@ import com.terrabase.business.util.JarLoadUtil; import com.terrabase.enterprise.api.MonitoringService; +import com.terrabase.enterprise.api.dto.EventInfo; +import com.terrabase.enterprise.api.dto.EventsCollection; +import com.terrabase.enterprise.api.request.GetEventsParams; +import com.terrabase.enterprise.api.request.RegisterEventDefineReq; +import com.terrabase.enterprise.api.response.ResultVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -9,13 +14,14 @@ import org.springframework.web.bind.annotation.*; import java.util.HashMap; +import java.util.List; import java.util.Map; /** * 监控告警服务控制器 * 负责提供监控告警相关的REST API接口 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @RestController @@ -29,352 +35,115 @@ public class MonitoringController { private JarLoadUtil jarLoadUtil; /** - * 获取监控告警服务信息 + * 注册事件定义 */ - @GetMapping("/info") - public ResponseEntity> getMonitoringServiceInfo() { + @PostMapping("/event-define") + public ResponseEntity> registerEventDefine(@RequestBody RegisterEventDefineReq request) { try { - MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); - - Map info = new HashMap<>(); - info.put("serviceName", monitoringService.getServiceName()); - info.put("serviceVersion", monitoringService.getServiceVersion()); - info.put("serviceType", monitoringService.getServiceType()); - info.put("healthStatus", monitoringService.getHealthStatus()); - - return ResponseEntity.ok(info); - - } catch (Exception e) { - logger.error("获取监控告警服务信息失败", e); - Map error = new HashMap<>(); - error.put("error", "获取监控告警服务信息失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 获取系统指标 - */ - @GetMapping("/metrics") - public ResponseEntity> getMetrics(@RequestParam(required = false) String metricType, - @RequestParam(required = false) String timeRange) { - try { - MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); - - // 这里应该调用实际的指标获取方法 - Map metrics = new HashMap<>(); - metrics.put("cpuUsage", 45.2); - metrics.put("memoryUsage", 67.8); - metrics.put("diskUsage", 23.1); - metrics.put("networkIn", 1024.5); - metrics.put("networkOut", 2048.3); - metrics.put("activeConnections", 156); - metrics.put("responseTime", 125.6); - - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("metrics", metrics); - response.put("metricType", metricType); - response.put("timeRange", timeRange); - response.put("serviceType", monitoringService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("获取系统指标失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "获取系统指标失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 获取告警列表 - */ - @GetMapping("/alerts") - public ResponseEntity> getAlerts(@RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "10") int size, - @RequestParam(required = false) String severity, - @RequestParam(required = false) String status) { - try { - MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); - - // 这里应该调用实际的告警查询方法 - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("alerts", new java.util.ArrayList<>()); // 模拟空列表 - response.put("page", page); - response.put("size", size); - response.put("total", 0); - response.put("filters", Map.of( - "severity", severity, - "status", status - )); - response.put("serviceType", monitoringService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("获取告警列表失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "获取告警列表失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 创建告警规则 - */ - @PostMapping("/rules") - public ResponseEntity> createAlertRule(@RequestBody Map request) { - try { - String name = (String) request.get("name"); - String metric = (String) request.get("metric"); - String condition = (String) request.get("condition"); - String threshold = (String) request.get("threshold"); - String severity = (String) request.get("severity"); - - if (name == null || name.trim().isEmpty()) { - Map error = new HashMap<>(); - error.put("error", "告警规则名称不能为空"); - return ResponseEntity.badRequest().body(error); - } - - if (metric == null || metric.trim().isEmpty()) { + if (request == null) { Map error = new HashMap<>(); - error.put("error", "监控指标不能为空"); + error.put("error", "事件定义请求不能为空"); return ResponseEntity.badRequest().body(error); } MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); + ResultVo result = monitoringService.registerEventDefine(request); - // 这里应该调用实际的告警规则创建方法 - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("message", "告警规则创建成功"); - response.put("ruleId", "rule_" + System.currentTimeMillis()); - response.put("name", name); - response.put("metric", metric); - response.put("condition", condition); - response.put("threshold", threshold); - response.put("severity", severity); - response.put("serviceType", monitoringService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("创建告警规则失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "创建告警规则失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 获取告警规则列表 - */ - @GetMapping("/rules") - public ResponseEntity> getAlertRules(@RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "10") int size) { - try { - MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); - - // 这里应该调用实际的告警规则查询方法 Map response = new HashMap<>(); - response.put("status", "success"); - response.put("rules", new java.util.ArrayList<>()); // 模拟空列表 - response.put("page", page); - response.put("size", size); - response.put("total", 0); - response.put("serviceType", monitoringService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("获取告警规则列表失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "获取告警规则列表失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 更新告警规则 - */ - @PutMapping("/rules/{ruleId}") - public ResponseEntity> updateAlertRule(@PathVariable String ruleId, - @RequestBody Map request) { - try { - if (ruleId == null || ruleId.trim().isEmpty()) { - Map error = new HashMap<>(); - error.put("error", "告警规则ID不能为空"); - return ResponseEntity.badRequest().body(error); + if ("200".equals(result.getCode())) { + response.put("status", "success"); + response.put("message", "事件定义注册成功"); + response.put("timestamp", System.currentTimeMillis()); + } else { + response.put("status", "failed"); + response.put("error", result.getMsg()); + response.put("code", result.getCode()); } - MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); - - // 这里应该调用实际的告警规则更新方法 - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("message", "告警规则更新成功"); - response.put("ruleId", ruleId); - response.put("serviceType", monitoringService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - return ResponseEntity.ok(response); } catch (Exception e) { - logger.error("更新告警规则失败", e); + logger.error("注册事件定义失败", e); Map error = new HashMap<>(); error.put("status", "failed"); - error.put("error", "更新告警规则失败: " + e.getMessage()); + error.put("error", "注册事件定义失败: " + e.getMessage()); return ResponseEntity.internalServerError().body(error); } } /** - * 删除告警规则 + * 上报事件 */ - @DeleteMapping("/rules/{ruleId}") - public ResponseEntity> deleteAlertRule(@PathVariable String ruleId) { + @PostMapping("/events") + public ResponseEntity> sendEvents(@RequestBody List eventInfos) { try { - if (ruleId == null || ruleId.trim().isEmpty()) { + if (eventInfos == null || eventInfos.isEmpty()) { Map error = new HashMap<>(); - error.put("error", "告警规则ID不能为空"); + error.put("error", "事件信息列表不能为空"); return ResponseEntity.badRequest().body(error); } MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); + ResultVo result = monitoringService.sendEvents(eventInfos); - // 这里应该调用实际的告警规则删除方法 Map response = new HashMap<>(); - response.put("status", "success"); - response.put("message", "告警规则删除成功"); - response.put("ruleId", ruleId); - response.put("serviceType", monitoringService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); + if ("200".equals(result.getCode())) { + response.put("status", "success"); + response.put("message", "事件上报成功"); + response.put("success", result.getData()); + response.put("timestamp", System.currentTimeMillis()); + } else { + response.put("status", "failed"); + response.put("error", result.getMsg()); + response.put("code", result.getCode()); + } return ResponseEntity.ok(response); } catch (Exception e) { - logger.error("删除告警规则失败", e); + logger.error("上报事件失败", e); Map error = new HashMap<>(); error.put("status", "failed"); - error.put("error", "删除告警规则失败: " + e.getMessage()); + error.put("error", "上报事件失败: " + e.getMessage()); return ResponseEntity.internalServerError().body(error); } } /** - * 确认告警 + * 分页查询事件 */ - @PostMapping("/alerts/{alertId}/acknowledge") - public ResponseEntity> acknowledgeAlert(@PathVariable String alertId, - @RequestBody Map request) { + @PostMapping("/events/query") + public ResponseEntity> getEventsByPage(@RequestBody GetEventsParams getEventsParams) { try { - if (alertId == null || alertId.trim().isEmpty()) { + if (getEventsParams == null) { Map error = new HashMap<>(); - error.put("error", "告警ID不能为空"); + error.put("error", "查询参数不能为空"); return ResponseEntity.badRequest().body(error); } - String comment = request.get("comment"); - MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); + ResultVo result = monitoringService.getEventsByPage(getEventsParams); - // 这里应该调用实际的告警确认方法 Map response = new HashMap<>(); - response.put("status", "success"); - response.put("message", "告警确认成功"); - response.put("alertId", alertId); - response.put("comment", comment); - response.put("acknowledgedAt", System.currentTimeMillis()); - response.put("serviceType", monitoringService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("确认告警失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "确认告警失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 获取监控仪表板数据 - */ - @GetMapping("/dashboard") - public ResponseEntity> getDashboardData(@RequestParam(required = false) String timeRange) { - try { - MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); - - // 这里应该调用实际的仪表板数据获取方法 - Map dashboard = new HashMap<>(); - dashboard.put("systemHealth", "HEALTHY"); - dashboard.put("activeAlerts", 0); - dashboard.put("totalMetrics", 15); - dashboard.put("uptime", "99.9%"); - dashboard.put("lastUpdate", System.currentTimeMillis()); - - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("dashboard", dashboard); - response.put("timeRange", timeRange); - response.put("serviceType", monitoringService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); + if ("200".equals(result.getCode())) { + response.put("status", "success"); + response.put("events", result.getData()); + response.put("timestamp", System.currentTimeMillis()); + } else { + response.put("status", "failed"); + response.put("error", result.getMsg()); + response.put("code", result.getCode()); + } return ResponseEntity.ok(response); } catch (Exception e) { - logger.error("获取监控仪表板数据失败", e); + logger.error("查询事件失败", e); Map error = new HashMap<>(); error.put("status", "failed"); - error.put("error", "获取监控仪表板数据失败: " + e.getMessage()); + error.put("error", "查询事件失败: " + e.getMessage()); return ResponseEntity.internalServerError().body(error); } } - /** - * 获取监控配置 - */ - @GetMapping("/config") - public ResponseEntity> getMonitoringConfig() { - try { - MonitoringService monitoringService = jarLoadUtil.loadMonitoringService(); - - // 这里应该调用实际的监控配置获取方法 - Map config = new HashMap<>(); - config.put("collectionInterval", "60s"); - config.put("retentionPeriod", "30d"); - config.put("alertChannels", new String[]{"email", "webhook", "sms"}); - config.put("metricsEnabled", true); - config.put("alertsEnabled", true); - - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("config", config); - response.put("serviceType", monitoringService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("获取监控配置失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "获取监控配置失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } } diff --git a/business-app/src/main/java/com/terrabase/business/controller/UserManagementController.java b/business-app/src/main/java/com/terrabase/business/controller/UserManagementController.java index 5568b30..1e03aa6 100644 --- a/business-app/src/main/java/com/terrabase/business/controller/UserManagementController.java +++ b/business-app/src/main/java/com/terrabase/business/controller/UserManagementController.java @@ -2,6 +2,11 @@ import com.terrabase.business.util.JarLoadUtil; import com.terrabase.enterprise.api.UserManagementService; +import com.terrabase.enterprise.api.dto.AuthorityInfo; +import com.terrabase.enterprise.api.dto.LoginUserDto; +import com.terrabase.enterprise.api.dto.ResourceGroup; +import com.terrabase.enterprise.api.request.RoleRegisterVo; +import com.terrabase.enterprise.api.response.ResultVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -9,13 +14,14 @@ import org.springframework.web.bind.annotation.*; import java.util.HashMap; +import java.util.List; import java.util.Map; /** * 用户管理服务控制器 * 负责提供用户管理相关的REST API接口 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @RestController @@ -29,106 +35,73 @@ public class UserManagementController { private JarLoadUtil jarLoadUtil; /** - * 获取用户管理服务信息 + * 批量角色注册 */ - @GetMapping("/info") - public ResponseEntity> getUserManagementServiceInfo() { + @PostMapping("/roles/register") + public ResponseEntity> batchRegisterRole(@RequestBody RoleRegisterVo roleRegister) { try { - UserManagementService userService = jarLoadUtil.loadUserManagementService(); - - Map info = new HashMap<>(); - info.put("serviceName", userService.getServiceName()); - info.put("serviceVersion", userService.getServiceVersion()); - info.put("serviceType", userService.getServiceType()); - info.put("healthStatus", userService.getHealthStatus()); - - return ResponseEntity.ok(info); - - } catch (Exception e) { - logger.error("获取用户管理服务信息失败", e); - Map error = new HashMap<>(); - error.put("error", "获取用户管理服务信息失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 创建用户 - */ - @PostMapping("/create") - public ResponseEntity> createUser(@RequestBody Map request) { - try { - String username = request.get("username"); - String password = request.get("password"); - String email = request.get("email"); - String role = request.get("role"); - - if (username == null || username.trim().isEmpty()) { + if (roleRegister == null) { Map error = new HashMap<>(); - error.put("error", "用户名不能为空"); + error.put("error", "角色注册信息不能为空"); return ResponseEntity.badRequest().body(error); } UserManagementService userService = jarLoadUtil.loadUserManagementService(); + userService.batchRegisterRole(roleRegister); - // 这里应该调用实际的用户创建方法 - // 由于UserManagementService接口可能还没有具体的实现方法,这里先返回模拟数据 Map response = new HashMap<>(); response.put("status", "success"); - response.put("message", "用户创建成功"); - response.put("username", username); - response.put("serviceType", userService.getServiceType()); + response.put("message", "角色批量注册成功"); response.put("timestamp", System.currentTimeMillis()); return ResponseEntity.ok(response); } catch (Exception e) { - logger.error("创建用户失败", e); + logger.error("批量角色注册失败", e); Map error = new HashMap<>(); error.put("status", "failed"); - error.put("error", "创建用户失败: " + e.getMessage()); + error.put("error", "批量角色注册失败: " + e.getMessage()); return ResponseEntity.internalServerError().body(error); } } /** - * 获取用户信息 + * 批量权限注册 */ - @GetMapping("/{username}") - public ResponseEntity> getUserInfo(@PathVariable String username) { + @PostMapping("/permissions/register") + public ResponseEntity> registerPermission(@RequestBody List authorityInfos) { try { - if (username == null || username.trim().isEmpty()) { + if (authorityInfos == null || authorityInfos.isEmpty()) { Map error = new HashMap<>(); - error.put("error", "用户名不能为空"); + error.put("error", "权限信息列表不能为空"); return ResponseEntity.badRequest().body(error); } UserManagementService userService = jarLoadUtil.loadUserManagementService(); + userService.registerPermission(authorityInfos); - // 这里应该调用实际的用户查询方法 Map response = new HashMap<>(); response.put("status", "success"); - response.put("username", username); - response.put("serviceType", userService.getServiceType()); + response.put("message", "权限批量注册成功"); + response.put("permissionCount", authorityInfos.size()); response.put("timestamp", System.currentTimeMillis()); return ResponseEntity.ok(response); } catch (Exception e) { - logger.error("获取用户信息失败", e); + logger.error("批量权限注册失败", e); Map error = new HashMap<>(); error.put("status", "failed"); - error.put("error", "获取用户信息失败: " + e.getMessage()); + error.put("error", "批量权限注册失败: " + e.getMessage()); return ResponseEntity.internalServerError().body(error); } } /** - * 更新用户信息 + * 获取用户资源组列表 */ - @PutMapping("/{username}") - public ResponseEntity> updateUser(@PathVariable String username, - @RequestBody Map request) { + @GetMapping("/{username}/groups") + public ResponseEntity> getUserGroups(@PathVariable String username) { try { if (username == null || username.trim().isEmpty()) { Map error = new HashMap<>(); @@ -137,128 +110,88 @@ public ResponseEntity> updateUser(@PathVariable String usern } UserManagementService userService = jarLoadUtil.loadUserManagementService(); + List resourceGroups = userService.getUserGroups(username); - // 这里应该调用实际的用户更新方法 Map response = new HashMap<>(); response.put("status", "success"); - response.put("message", "用户信息更新成功"); response.put("username", username); - response.put("serviceType", userService.getServiceType()); + response.put("resourceGroups", resourceGroups); + response.put("groupCount", resourceGroups != null ? resourceGroups.size() : 0); response.put("timestamp", System.currentTimeMillis()); return ResponseEntity.ok(response); } catch (Exception e) { - logger.error("更新用户信息失败", e); + logger.error("获取用户资源组列表失败", e); Map error = new HashMap<>(); error.put("status", "failed"); - error.put("error", "更新用户信息失败: " + e.getMessage()); + error.put("error", "获取用户资源组列表失败: " + e.getMessage()); return ResponseEntity.internalServerError().body(error); } } /** - * 删除用户 + * 根据token查询角色名 */ - @DeleteMapping("/{username}") - public ResponseEntity> deleteUser(@PathVariable String username) { + @GetMapping("/roles/by-token") + public ResponseEntity> queryRolesByToken() { try { - if (username == null || username.trim().isEmpty()) { - Map error = new HashMap<>(); - error.put("error", "用户名不能为空"); - return ResponseEntity.badRequest().body(error); - } - UserManagementService userService = jarLoadUtil.loadUserManagementService(); + ResultVo> result = userService.queryRolesByToken(); - // 这里应该调用实际的用户删除方法 Map response = new HashMap<>(); - response.put("status", "success"); - response.put("message", "用户删除成功"); - response.put("username", username); - response.put("serviceType", userService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); + if ("200".equals(result.getCode())) { + response.put("status", "success"); + response.put("roles", result.getData()); + response.put("roleCount", result.getData() != null ? result.getData().size() : 0); + response.put("timestamp", System.currentTimeMillis()); + } else { + response.put("status", "failed"); + response.put("error", result.getMsg()); + response.put("code", result.getCode()); + } return ResponseEntity.ok(response); } catch (Exception e) { - logger.error("删除用户失败", e); + logger.error("根据token查询角色名失败", e); Map error = new HashMap<>(); error.put("status", "failed"); - error.put("error", "删除用户失败: " + e.getMessage()); + error.put("error", "根据token查询角色名失败: " + e.getMessage()); return ResponseEntity.internalServerError().body(error); } } /** - * 获取用户列表 + * 获取当前用户信息 */ - @GetMapping("/list") - public ResponseEntity> getUserList(@RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "10") int size) { + @GetMapping("/current-user") + public ResponseEntity> getCurrentUserInfo() { try { UserManagementService userService = jarLoadUtil.loadUserManagementService(); + ResultVo> result = userService.getCurrentUserInfo(); - // 这里应该调用实际的用户列表查询方法 Map response = new HashMap<>(); - response.put("status", "success"); - response.put("users", new java.util.ArrayList<>()); // 模拟空列表 - response.put("page", page); - response.put("size", size); - response.put("total", 0); - response.put("serviceType", userService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.ok(response); - - } catch (Exception e) { - logger.error("获取用户列表失败", e); - Map error = new HashMap<>(); - error.put("status", "failed"); - error.put("error", "获取用户列表失败: " + e.getMessage()); - return ResponseEntity.internalServerError().body(error); - } - } - - /** - * 用户认证 - */ - @PostMapping("/authenticate") - public ResponseEntity> authenticateUser(@RequestBody Map request) { - try { - String username = request.get("username"); - String password = request.get("password"); - - if (username == null || username.trim().isEmpty()) { - Map error = new HashMap<>(); - error.put("error", "用户名不能为空"); - return ResponseEntity.badRequest().body(error); - } - - if (password == null || password.trim().isEmpty()) { - Map error = new HashMap<>(); - error.put("error", "密码不能为空"); - return ResponseEntity.badRequest().body(error); + if ("200".equals(result.getCode())) { + response.put("status", "success"); + response.put("users", result.getData()); + response.put("userCount", result.getData() != null ? result.getData().size() : 0); + response.put("timestamp", System.currentTimeMillis()); + } else { + response.put("status", "failed"); + response.put("error", result.getMsg()); + response.put("code", result.getCode()); } - UserManagementService userService = jarLoadUtil.loadUserManagementService(); - - // 这里应该调用实际的用户认证方法 - Map response = new HashMap<>(); - response.put("status", "success"); - response.put("authenticated", true); - response.put("username", username); - response.put("serviceType", userService.getServiceType()); - response.put("timestamp", System.currentTimeMillis()); - return ResponseEntity.ok(response); } catch (Exception e) { - logger.error("用户认证失败", e); + logger.error("获取当前用户信息失败", e); Map error = new HashMap<>(); error.put("status", "failed"); - error.put("error", "用户认证失败: " + e.getMessage()); + error.put("error", "获取当前用户信息失败: " + e.getMessage()); return ResponseEntity.internalServerError().body(error); } } + } diff --git a/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java b/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java index d959fdc..88032af 100644 --- a/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java +++ b/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java @@ -20,7 +20,7 @@ * 企业服务加载工具类 * 用于根据配置加载商业版(JAR包)或开源版(直接依赖)的企业服务实现 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @Component @@ -31,12 +31,6 @@ public class JarLoadUtil { @Value("${enterprise.jar.path:./lib}") private String jarPath; - @Value("${terrabase.commercial.oms.base.url}") - private String omsBaseUrl; - - @Value("${terrabase.commercial.timeout:30000}") - private int timeout; - @Autowired private ApplicationContext applicationContext; @@ -134,26 +128,7 @@ private Object loadService(String cacheKey, String commercialClassName, String o // 缓存服务实例 serviceInstances.put(cacheKey, service); - // 自动启动服务 - if (service instanceof com.terrabase.enterprise.api.EnterpriseService) { - ((com.terrabase.enterprise.api.EnterpriseService) service).start(); - logger.info("企业服务已自动启动: {}", cacheKey); - } else if (service instanceof com.terrabase.enterprise.api.CryptoService) { - ((com.terrabase.enterprise.api.CryptoService) service).start(); - logger.info("加密服务已自动启动: {}", cacheKey); - } else if (service instanceof com.terrabase.enterprise.api.UserManagementService) { - ((com.terrabase.enterprise.api.UserManagementService) service).start(); - logger.info("用户管理服务已自动启动: {}", cacheKey); - } else if (service instanceof com.terrabase.enterprise.api.LogManagementService) { - ((com.terrabase.enterprise.api.LogManagementService) service).start(); - logger.info("日志管理服务已自动启动: {}", cacheKey); - } else if (service instanceof com.terrabase.enterprise.api.CertificateService) { - ((com.terrabase.enterprise.api.CertificateService) service).start(); - logger.info("证书管理服务已自动启动: {}", cacheKey); - } else if (service instanceof com.terrabase.enterprise.api.MonitoringService) { - ((com.terrabase.enterprise.api.MonitoringService) service).start(); - logger.info("监控告警服务已自动启动: {}", cacheKey); - } + // 服务已加载完成,无需手动启动 logger.info("服务加载成功: {}", cacheKey); @@ -167,26 +142,7 @@ private Object loadService(String cacheKey, String commercialClassName, String o if (fallbackService != null) { serviceInstances.put(cacheKey, fallbackService); - // 自动启动降级服务 - if (fallbackService instanceof com.terrabase.enterprise.api.EnterpriseService) { - ((com.terrabase.enterprise.api.EnterpriseService) fallbackService).start(); - logger.info("降级企业服务已自动启动: {}", cacheKey); - } else if (fallbackService instanceof com.terrabase.enterprise.api.CryptoService) { - ((com.terrabase.enterprise.api.CryptoService) fallbackService).start(); - logger.info("降级加密服务已自动启动: {}", cacheKey); - } else if (fallbackService instanceof com.terrabase.enterprise.api.UserManagementService) { - ((com.terrabase.enterprise.api.UserManagementService) fallbackService).start(); - logger.info("降级用户管理服务已自动启动: {}", cacheKey); - } else if (fallbackService instanceof com.terrabase.enterprise.api.LogManagementService) { - ((com.terrabase.enterprise.api.LogManagementService) fallbackService).start(); - logger.info("降级日志管理服务已自动启动: {}", cacheKey); - } else if (fallbackService instanceof com.terrabase.enterprise.api.CertificateService) { - ((com.terrabase.enterprise.api.CertificateService) fallbackService).start(); - logger.info("降级证书管理服务已自动启动: {}", cacheKey); - } else if (fallbackService instanceof com.terrabase.enterprise.api.MonitoringService) { - ((com.terrabase.enterprise.api.MonitoringService) fallbackService).start(); - logger.info("降级监控告警服务已自动启动: {}", cacheKey); - } + // 降级服务已加载完成,无需手动启动 logger.warn("使用开源版服务作为降级方案: {}", cacheKey); return fallbackService; @@ -264,9 +220,8 @@ public EnterpriseService loadEnterpriseService() { serviceInstances.put("enterprise_service", fallbackService); - // 自动启动降级企业服务 - fallbackService.start(); - logger.info("降级企业服务已自动启动"); + // 降级企业服务已加载完成,无需手动启动 + logger.info("降级企业服务已加载完成"); logger.warn("使用开源版企业服务作为降级方案"); return fallbackService; @@ -386,32 +341,11 @@ private Object loadServiceFromJar(String className) { Class clazz = classLoader.loadClass(className); - // 尝试使用带配置参数的构造函数 - Object instance = null; - try { - // 首先尝试带配置参数的构造函数 - Constructor configConstructor = clazz.getDeclaredConstructor( - Class.forName("org.springframework.web.client.RestTemplate"), - String.class, - int.class - ); - configConstructor.setAccessible(true); - - // 创建RestTemplate实例 - Object restTemplate = Class.forName("org.springframework.web.client.RestTemplate").newInstance(); - - instance = configConstructor.newInstance(restTemplate, omsBaseUrl, timeout); - logger.info("使用配置参数创建商业版服务实例: omsBaseUrl={}, timeout={}", omsBaseUrl, timeout); - - } catch (Exception configException) { - logger.debug("带配置参数的构造函数不可用,尝试默认构造函数: {}", configException.getMessage()); - - // 如果带配置参数的构造函数不可用,使用默认构造函数 - Constructor defaultConstructor = clazz.getDeclaredConstructor(); - defaultConstructor.setAccessible(true); - instance = defaultConstructor.newInstance(); - logger.info("使用默认构造函数创建商业版服务实例"); - } + // 仅使用默认构造函数创建实例 + Constructor defaultConstructor = clazz.getDeclaredConstructor(); + defaultConstructor.setAccessible(true); + Object instance = defaultConstructor.newInstance(); + logger.info("使用默认构造函数创建商业版服务实例"); return instance; @@ -432,32 +366,11 @@ private Object loadServiceFromClasspath(String className) { Class clazz = Class.forName(className); - // 尝试使用带配置参数的构造函数 - Object instance = null; - try { - // 首先尝试带配置参数的构造函数 - Constructor configConstructor = clazz.getDeclaredConstructor( - Class.forName("org.springframework.web.client.RestTemplate"), - String.class, - int.class - ); - configConstructor.setAccessible(true); - - // 创建RestTemplate实例 - Object restTemplate = Class.forName("org.springframework.web.client.RestTemplate").newInstance(); - - instance = configConstructor.newInstance(restTemplate, omsBaseUrl, timeout); - logger.info("使用配置参数创建商业版服务实例: omsBaseUrl={}, timeout={}", omsBaseUrl, timeout); - - } catch (Exception configException) { - logger.debug("带配置参数的构造函数不可用,尝试默认构造函数: {}", configException.getMessage()); - - // 如果带配置参数的构造函数不可用,使用默认构造函数 - Constructor defaultConstructor = clazz.getDeclaredConstructor(); - defaultConstructor.setAccessible(true); - instance = defaultConstructor.newInstance(); - logger.info("使用默认构造函数创建服务实例"); - } + // 仅使用默认构造函数创建实例 + Constructor defaultConstructor = clazz.getDeclaredConstructor(); + defaultConstructor.setAccessible(true); + Object instance = defaultConstructor.newInstance(); + logger.info("使用默认构造函数创建服务实例"); // 手动注入依赖 injectDependencies(instance, className); diff --git a/business-app/src/main/java/com/terrabase/sdk/StandaloneJarLoadUtil.java b/business-app/src/main/java/com/terrabase/sdk/StandaloneJarLoadUtil.java new file mode 100644 index 0000000..b4834f8 --- /dev/null +++ b/business-app/src/main/java/com/terrabase/sdk/StandaloneJarLoadUtil.java @@ -0,0 +1,465 @@ +package com.terrabase.sdk; + +import com.terrabase.enterprise.api.*; +import com.terrabase.enterprise.impl.open.OpenEnterpriseServiceImpl; +import com.terrabase.enterprise.impl.open.config.KmcConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.lang.reflect.Constructor; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 独立的企业服务加载工具类(不依赖Spring容器) + * 用于SDK中动态加载企业服务实现 + * + * @author Yehong Pan + * @version 1.0.0 + */ +public class StandaloneJarLoadUtil { + + private static final Logger logger = LoggerFactory.getLogger(StandaloneJarLoadUtil.class); + + private final String jarPath; + + // 缓存已加载的实例 + private final ConcurrentHashMap serviceInstances = new ConcurrentHashMap<>(); + + /** + * 构造函数 + * + * @param jarPath JAR包路径 + */ + public StandaloneJarLoadUtil(String jarPath) { + this.jarPath = jarPath != null ? jarPath : "./lib"; + } + + /** + * 默认构造函数,使用默认路径 + */ + public StandaloneJarLoadUtil() { + this("./lib"); + } + + /** + * 加载加解密服务 + * @return 加解密服务实例 + */ + public CryptoService loadCryptoService() { + return (CryptoService) loadService("crypto_service", + "com.terrabase.enterprise.impl.commercial.CommercialCryptoServiceImpl", + "com.terrabase.enterprise.impl.open.OpenCryptoServiceImpl"); + } + + /** + * 加载用户管理服务 + * @return 用户管理服务实例 + */ + public UserManagementService loadUserManagementService() { + return (UserManagementService) loadService("user_management_service", + "com.terrabase.enterprise.impl.commercial.CommercialUserManagementServiceImpl", + "com.terrabase.enterprise.impl.open.OpenUserManagementServiceImpl"); + } + + /** + * 加载日志管理服务 + * @return 日志管理服务实例 + */ + public LogManagementService loadLogManagementService() { + return (LogManagementService) loadService("log_management_service", + "com.terrabase.enterprise.impl.commercial.CommercialLogManagementServiceImpl", + "com.terrabase.enterprise.impl.open.OpenLogManagementServiceImpl"); + } + + /** + * 加载证书管理服务 + * @return 证书管理服务实例 + */ + public CertificateService loadCertificateService() { + return (CertificateService) loadService("certificate_service", + "com.terrabase.enterprise.impl.commercial.CommercialCertificateServiceImpl", + "com.terrabase.enterprise.impl.open.OpenCertificateServiceImpl"); + } + + /** + * 加载监控告警服务 + * @return 监控告警服务实例 + */ + public MonitoringService loadMonitoringService() { + return (MonitoringService) loadService("monitoring_service", + "com.terrabase.enterprise.impl.commercial.CommercialMonitoringServiceImpl", + "com.terrabase.enterprise.impl.open.OpenMonitoringServiceImpl"); + } + + /** + * 通用服务加载方法 + * @param cacheKey 缓存键 + * @param commercialClassName 商业版类名 + * @param openClassName 开源版类名 + * @return 服务实例 + */ + private Object loadService(String cacheKey, String commercialClassName, String openClassName) { + try { + // 先检查缓存 + Object cachedService = serviceInstances.get(cacheKey); + if (cachedService != null) { + logger.info("从缓存中获取服务实例: {}", cacheKey); + return cachedService; + } + + logger.info("开始检测并加载服务: {}", cacheKey); + + Object service; + if (isCommercialJarAvailable()) { + logger.info("检测到商业版JAR包,加载商业版服务: {}", commercialClassName); + service = loadServiceFromJar(commercialClassName); + } else { + logger.info("未检测到商业版JAR包,使用开源版服务: {}", openClassName); + service = loadServiceFromClasspath(openClassName); + } + + // 如果服务加载失败,使用开源版作为降级方案 + if (service == null) { + logger.warn("服务加载失败,使用开源版作为降级方案: {}", openClassName); + service = loadServiceFromClasspath(openClassName); + } + + // 如果开源版也加载失败,抛出异常 + if (service == null) { + throw new RuntimeException("无法加载任何服务实现: " + cacheKey); + } + + // 缓存服务实例 + serviceInstances.put(cacheKey, service); + + logger.info("服务加载成功: {}", cacheKey); + + return service; + + } catch (Exception e) { + logger.error("加载服务失败: {}, 尝试使用开源版作为降级方案", cacheKey, e); + try { + // 最后的降级方案:直接实例化开源版服务 + Object fallbackService = loadServiceFromClasspath(openClassName); + if (fallbackService != null) { + serviceInstances.put(cacheKey, fallbackService); + logger.warn("使用开源版服务作为降级方案: {}", cacheKey); + return fallbackService; + } + } catch (Exception fallbackException) { + logger.error("降级方案也失败了: {}", cacheKey, fallbackException); + } + throw new RuntimeException("无法加载任何服务实现: " + cacheKey, e); + } + } + + /** + * 根据lib目录下是否存在JAR包动态加载企业服务实现 + * @return 企业服务实例,如果加载失败则返回开源版服务作为降级方案 + */ + public EnterpriseService loadEnterpriseService() { + try { + String cacheKey = "enterprise_service"; + + // 先检查缓存 + EnterpriseService cachedService = (EnterpriseService) serviceInstances.get(cacheKey); + if (cachedService != null) { + logger.info("从缓存中获取企业服务实例"); + return cachedService; + } + + logger.info("开始检测并加载企业服务实现"); + + EnterpriseService service; + if (isCommercialJarAvailable()) { + logger.info("检测到商业版JAR包,加载商业版企业服务"); + service = loadCommercialService(); + } else { + logger.info("未检测到商业版JAR包,使用开源版企业服务"); + service = loadOpenSourceService(); + } + + // 如果服务加载失败,使用开源版作为降级方案 + if (service == null) { + logger.warn("企业服务加载失败,使用开源版作为降级方案"); + service = loadOpenSourceService(); + } + + // 如果开源版也加载失败,抛出异常 + if (service == null) { + throw new RuntimeException("无法加载任何企业服务实现"); + } + + // 缓存服务实例 + serviceInstances.put(cacheKey, service); + logger.info("企业服务加载成功: {}", service.getServiceName()); + + return service; + + } catch (Exception e) { + logger.error("加载企业服务失败,尝试使用开源版作为降级方案", e); + try { + // 最后的降级方案:直接实例化开源版服务 + OpenEnterpriseServiceImpl fallbackService = new OpenEnterpriseServiceImpl(); + + // 尝试创建默认的KmcConfig + try { + KmcConfig kmcConfig = createDefaultKmcConfig(); + if (kmcConfig != null) { + logger.info("降级方案:创建默认KmcConfig并注入到开源版服务"); + java.lang.reflect.Field kmcConfigField = OpenEnterpriseServiceImpl.class.getDeclaredField("kmcConfig"); + kmcConfigField.setAccessible(true); + kmcConfigField.set(fallbackService, kmcConfig); + } + } catch (Exception fallbackException) { + logger.warn("降级方案:注入KmcConfig失败: {}", fallbackException.getMessage()); + } + + serviceInstances.put("enterprise_service", fallbackService); + + logger.warn("使用开源版企业服务作为降级方案"); + return fallbackService; + } catch (Exception fallbackException) { + logger.error("降级方案也失败了", fallbackException); + throw new RuntimeException("无法加载任何企业服务实现,应用无法启动", fallbackException); + } + } + } + + /** + * 检测商业版JAR包是否可用 + * @return true如果JAR包存在且可加载 + */ + private boolean isCommercialJarAvailable() { + try { + String jarFileName = "enterprise-impl-commercial-1.0.0.jar"; + File jarFile = new File(jarPath, jarFileName); + + if (!jarFile.exists()) { + logger.debug("商业版JAR文件不存在: {}", jarFile.getAbsolutePath()); + return false; + } + + // 尝试加载JAR包中的类来验证JAR包是否有效 + URL jarUrl = jarFile.toURI().toURL(); + URLClassLoader classLoader = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader()); + + // 尝试加载商业版实现类 + Class clazz = classLoader.loadClass("com.terrabase.enterprise.impl.commercial.CommercialEnterpriseServiceImpl"); + if (clazz != null) { + logger.debug("商业版JAR包验证成功: {}", jarFile.getAbsolutePath()); + return true; + } + + } catch (Exception e) { + logger.debug("商业版JAR包检测失败: {}", e.getMessage()); + } + + return false; + } + + /** + * 加载商业版服务 + * @return 商业版服务实例 + */ + private EnterpriseService loadCommercialService() throws Exception { + logger.info("正在加载商业版企业服务..."); + + // 尝试从JAR包加载 + EnterpriseService service = loadFromJar("com.terrabase.enterprise.impl.commercial.CommercialEnterpriseServiceImpl"); + + if (service == null) { + // 如果JAR包加载失败,尝试从类路径加载 + service = loadFromClasspath("com.terrabase.enterprise.impl.commercial.CommercialEnterpriseServiceImpl"); + } + + if (service == null) { + throw new RuntimeException("无法加载商业版企业服务"); + } + + return service; + } + + /** + * 加载开源版服务 + * @return 开源版服务实例 + */ + private EnterpriseService loadOpenSourceService() throws Exception { + logger.info("正在加载开源版企业服务..."); + + // 直接实例化开源版实现(通过直接依赖) + OpenEnterpriseServiceImpl service = new OpenEnterpriseServiceImpl(); + + // 注意:OpenEnterpriseServiceImpl本身不需要KmcConfig + // KmcConfig是子服务(如OpenCryptoServiceImpl)需要的 + // 子服务会在需要时通过JarLoadUtil独立加载和配置 + + logger.info("开源版企业服务加载完成,子服务将在需要时独立加载"); + + if (service == null) { + throw new RuntimeException("无法加载开源版企业服务"); + } + + return service; + } + + /** + * 创建默认的KmcConfig + * @return KmcConfig实例 + */ + private KmcConfig createDefaultKmcConfig() { + try { + KmcConfig config = new KmcConfig(); + // 设置默认配置 + config.setEnabled(true); + config.setDefaultKeyId("sdk_default"); + config.setKeyCaching(true); + return config; + } catch (Exception e) { + logger.warn("创建默认KmcConfig失败: {}", e.getMessage()); + return null; + } + } + + /** + * 从JAR包加载服务(通用方法) + * @param className 类名 + * @return 服务实例 + */ + private Object loadServiceFromJar(String className) { + try { + String jarFileName = getJarFileName(className); + File jarFile = new File(jarPath, jarFileName); + + if (!jarFile.exists()) { + logger.warn("JAR文件不存在: {}", jarFile.getAbsolutePath()); + return null; + } + + logger.info("从JAR文件加载: {}", jarFile.getAbsolutePath()); + + URL jarUrl = jarFile.toURI().toURL(); + URLClassLoader classLoader = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader()); + + Class clazz = classLoader.loadClass(className); + + // 仅使用默认构造函数创建实例 + Constructor defaultConstructor = clazz.getDeclaredConstructor(); + defaultConstructor.setAccessible(true); + Object instance = defaultConstructor.newInstance(); + logger.info("使用默认构造函数创建商业版服务实例"); + + return instance; + + } catch (Exception e) { + logger.warn("从JAR包加载失败: {}", e.getMessage()); + return null; + } + } + + /** + * 从类路径加载服务(通用方法) + * @param className 类名 + * @return 服务实例 + */ + private Object loadServiceFromClasspath(String className) { + try { + logger.info("从类路径加载: {}", className); + + Class clazz = Class.forName(className); + + // 仅使用默认构造函数创建实例 + Constructor defaultConstructor = clazz.getDeclaredConstructor(); + defaultConstructor.setAccessible(true); + Object instance = defaultConstructor.newInstance(); + logger.info("使用默认构造函数创建服务实例"); + + // 手动注入依赖 + injectDependencies(instance, className); + + return instance; + + } catch (Exception e) { + logger.warn("从类路径加载失败: {}", e.getMessage()); + return null; + } + } + + /** + * 从JAR包加载服务 + * @param className 类名 + * @return 服务实例 + */ + private EnterpriseService loadFromJar(String className) { + return (EnterpriseService) loadServiceFromJar(className); + } + + /** + * 从类路径加载服务 + * @param className 类名 + * @return 服务实例 + */ + private EnterpriseService loadFromClasspath(String className) { + return (EnterpriseService) loadServiceFromClasspath(className); + } + + /** + * 手动注入依赖 + * @param instance 服务实例 + * @param className 类名 + */ + private void injectDependencies(Object instance, String className) { + try { + // 只为OpenCryptoServiceImpl注入KmcConfig(其他服务不需要) + if (className.contains("OpenCryptoServiceImpl")) { + try { + KmcConfig kmcConfig = createDefaultKmcConfig(); + if (kmcConfig != null) { + java.lang.reflect.Field kmcConfigField = instance.getClass().getDeclaredField("kmcConfig"); + kmcConfigField.setAccessible(true); + kmcConfigField.set(instance, kmcConfig); + logger.info("成功注入 KmcConfig 到 {}", className); + } + } catch (Exception e) { + logger.warn("注入 KmcConfig 到 {} 失败: {}", className, e.getMessage()); + } + } + + } catch (Exception e) { + logger.warn("依赖注入失败: {}", e.getMessage()); + } + } + + /** + * 根据类名获取JAR文件名 + * @param className 类名 + * @return JAR文件名 + */ + private String getJarFileName(String className) { + if (className.contains("commercial")) { + return "enterprise-impl-commercial-1.0.0.jar"; + } else if (className.contains("open")) { + return "enterprise-impl-open-1.0.0.jar"; + } + return "unknown.jar"; + } + + /** + * 清理缓存 + */ + public void clearCache() { + logger.info("清理服务缓存"); + serviceInstances.clear(); + } + + /** + * 获取当前企业模式 + * @return 企业模式 + */ + public String getEnterpriseMode() { + return isCommercialJarAvailable() ? "commercial" : "open"; + } +} diff --git a/business-app/src/main/java/com/terrabase/sdk/TerrabaseSDK.java b/business-app/src/main/java/com/terrabase/sdk/TerrabaseSDK.java new file mode 100644 index 0000000..2be0dc9 --- /dev/null +++ b/business-app/src/main/java/com/terrabase/sdk/TerrabaseSDK.java @@ -0,0 +1,324 @@ +package com.terrabase.sdk; + +import com.terrabase.enterprise.api.*; +import com.terrabase.enterprise.api.CryptoAlgorithm; +import com.terrabase.enterprise.api.dto.*; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.sdk.config.TerrabaseSDKConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Terrabase SDK 主入口类 + * 提供统一的静态调用接口,支持所有企业服务功能 + * + * 使用示例: + *
+ * // 初始化SDK
+ * TerrabaseSDK.init();
+ * 
+ * // 调用加解密服务
+ * String encrypted = TerrabaseSDK.crypto().encrypt("hello", CryptoAlgorithm.AES, "user1");
+ * String decrypted = TerrabaseSDK.crypto().decrypt(encrypted, CryptoAlgorithm.AES, "user1");
+ * 
+ * // 调用用户管理服务
+ * ResultVo<List<LoginUserDto>> users = TerrabaseSDK.userManagement().getCurrentUserInfo();
+ * 
+ * + * @author Yehong Pan + * @version 1.0.0 + */ +public class TerrabaseSDK { + + private static final Logger logger = LoggerFactory.getLogger(TerrabaseSDK.class); + + // SDK实例缓存 + private static volatile TerrabaseSDK instance; + private static final Object lock = new Object(); + + // 服务实例缓存 + private final Map serviceCache = new ConcurrentHashMap<>(); + + // 服务加载器 + private final StandaloneJarLoadUtil jarLoadUtil; + + // SDK配置 + private final TerrabaseSDKConfig config; + + /** + * 私有构造函数,防止外部实例化 + */ + private TerrabaseSDK() { + this.config = TerrabaseSDKConfig.createDefault(); + this.jarLoadUtil = new StandaloneJarLoadUtil(config.getJarPath()); + logger.info("TerrabaseSDK 实例已创建"); + } + + /** + * 带配置的私有构造函数 + * @param config SDK配置 + */ + private TerrabaseSDK(TerrabaseSDKConfig config) { + this.config = config != null ? config : TerrabaseSDKConfig.createDefault(); + this.jarLoadUtil = new StandaloneJarLoadUtil(this.config.getJarPath()); + + // 如果是商业版且启用了Nacos,则初始化Nacos配置 + initializeNacosIfNeeded(); + + logger.info("TerrabaseSDK 实例已创建,配置: {}", this.config); + } + + /** + * 初始化SDK + * 此方法会检测并加载企业服务实现 + * + * @return SDK实例 + */ + public static TerrabaseSDK init() { + if (instance == null) { + synchronized (lock) { + if (instance == null) { + instance = new TerrabaseSDK(); + logger.info("TerrabaseSDK 初始化完成"); + } + } + } + return instance; + } + + /** + * 使用配置初始化SDK + * 此方法会检测并加载企业服务实现 + * + * @param config SDK配置 + * @return SDK实例 + */ + public static TerrabaseSDK init(TerrabaseSDKConfig config) { + if (instance == null) { + synchronized (lock) { + if (instance == null) { + instance = new TerrabaseSDK(config); + logger.info("TerrabaseSDK 初始化完成,配置: {}", config); + } + } + } + return instance; + } + + /** + * 获取SDK实例(如果未初始化会自动初始化) + * + * @return SDK实例 + */ + public static TerrabaseSDK getInstance() { + if (instance == null) { + return init(); + } + return instance; + } + + /** + * 获取加解密服务 + * + * @return 加解密服务实例 + */ + public CryptoService crypto() { + return getService("crypto_service", jarLoadUtil::loadCryptoService); + } + + /** + * 获取用户管理服务 + * + * @return 用户管理服务实例 + */ + public UserManagementService userManagement() { + return getService("user_management_service", jarLoadUtil::loadUserManagementService); + } + + /** + * 获取日志管理服务 + * + * @return 日志管理服务实例 + */ + public LogManagementService logManagement() { + return getService("log_management_service", jarLoadUtil::loadLogManagementService); + } + + /** + * 获取证书管理服务 + * + * @return 证书管理服务实例 + */ + public CertificateService certificate() { + return getService("certificate_service", jarLoadUtil::loadCertificateService); + } + + /** + * 获取监控告警服务 + * + * @return 监控告警服务实例 + */ + public MonitoringService monitoring() { + return getService("monitoring_service", jarLoadUtil::loadMonitoringService); + } + + /** + * 获取企业服务 + * + * @return 企业服务实例 + */ + public EnterpriseService enterprise() { + return getService("enterprise_service", jarLoadUtil::loadEnterpriseService); + } + + /** + * 获取当前企业模式 + * + * @return 企业模式(commercial 或 open) + */ + public String getEnterpriseMode() { + return jarLoadUtil.getEnterpriseMode(); + } + + /** + * 获取SDK配置 + * + * @return SDK配置 + */ + public TerrabaseSDKConfig getConfig() { + return config; + } + + /** + * 清理服务缓存 + */ + public void clearCache() { + serviceCache.clear(); + jarLoadUtil.clearCache(); + logger.info("SDK服务缓存已清理"); + } + + /** + * 如果需要,初始化Nacos配置 + * 仅在商业版且启用Nacos时执行 + */ + private void initializeNacosIfNeeded() { + try { + // 检查是否为商业版 + String enterpriseMode = jarLoadUtil.getEnterpriseMode(); + if (!"commercial".equals(enterpriseMode)) { + logger.debug("非商业版模式,跳过Nacos配置初始化"); + return; + } + + // 检查是否启用了Nacos + if (!config.isNacosDiscoveryEnabled()) { + logger.debug("Nacos服务发现未启用,跳过Nacos配置初始化"); + return; + } + + // 动态加载商业版Nacos配置类 + Class nacosConfigClass = Class.forName("com.terrabase.enterprise.impl.commercial.config.CommercialNacosConfig"); + java.lang.reflect.Method initializeMethod = nacosConfigClass.getMethod("initializeFromSDKConfig", TerrabaseSDKConfig.class); + initializeMethod.invoke(null, config); + + logger.info("商业版Nacos配置初始化完成"); + + } catch (ClassNotFoundException e) { + logger.debug("商业版Nacos配置类不存在,跳过Nacos配置初始化"); + } catch (Exception e) { + logger.warn("初始化Nacos配置时发生异常,但不影响SDK正常使用", e); + } + } + + /** + * 获取服务实例(带缓存) + * + * @param serviceName 服务名称 + * @param loader 服务加载器 + * @return 服务实例 + */ + @SuppressWarnings("unchecked") + private T getService(String serviceName, ServiceLoader loader) { + try { + // 先检查缓存 + T cachedService = (T) serviceCache.get(serviceName); + if (cachedService != null) { + return cachedService; + } + + // 加载服务 + T service = loader.load(); + if (service != null) { + serviceCache.put(serviceName, service); + logger.debug("服务已加载并缓存: {}", serviceName); + } + + return service; + + } catch (Exception e) { + logger.error("加载服务失败: {}", serviceName, e); + throw new RuntimeException("无法加载服务: " + serviceName, e); + } + } + + /** + * 服务加载器接口 + */ + @FunctionalInterface + private interface ServiceLoader { + T load() throws Exception; + } + + // ==================== 便捷方法 ==================== + + /** + * 快速加密方法 + * + * @param plaintext 明文 + * @param algorithm 算法 + * @param username 用户名 + * @return 密文 + */ + public static String encrypt(String plaintext, CryptoAlgorithm algorithm, String username) { + return getInstance().crypto().encrypt(plaintext, algorithm, username); + } + + /** + * 快速解密方法 + * + * @param ciphertext 密文 + * @param algorithm 算法 + * @param username 用户名 + * @return 明文 + */ + public static String decrypt(String ciphertext, CryptoAlgorithm algorithm, String username) { + return getInstance().crypto().decrypt(ciphertext, algorithm, username); + } + + /** + * 快速获取当前用户信息 + * + * @return 用户信息列表 + */ + public static ResultVo> getCurrentUserInfo() { + return getInstance().userManagement().getCurrentUserInfo(); + } + + /** + * 快速获取企业服务信息 + * + * @return 企业服务信息 + */ + public static String getServiceInfo() { + EnterpriseService service = getInstance().enterprise(); + return String.format("服务名称: %s, 版本: %s, 类型: %s", + service.getServiceName(), + service.getServiceVersion(), + service.getServiceType()); + } +} diff --git a/business-app/src/main/java/com/terrabase/sdk/example/SDKUsageExample.java b/business-app/src/main/java/com/terrabase/sdk/example/SDKUsageExample.java new file mode 100644 index 0000000..5bc57e7 --- /dev/null +++ b/business-app/src/main/java/com/terrabase/sdk/example/SDKUsageExample.java @@ -0,0 +1,160 @@ +package com.terrabase.sdk.example; + +import com.terrabase.enterprise.api.CryptoAlgorithm; +import com.terrabase.enterprise.api.dto.LoginUserDto; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.sdk.TerrabaseSDK; + +import java.util.List; + +/** + * Terrabase SDK 使用示例 + * 展示如何在不同场景下使用SDK + * + * @author Yehong Pan + * @version 1.0.0 + */ +public class SDKUsageExample { + + public static void main(String[] args) { + // 示例1:基本使用 + basicUsageExample(); + + // 示例2:加解密操作 + cryptoExample(); + + // 示例3:用户管理 + userManagementExample(); + + // 示例4:企业服务信息 + enterpriseServiceExample(); + } + + /** + * 基本使用示例 + */ + public static void basicUsageExample() { + System.out.println("=== 基本使用示例 ==="); + + // 初始化SDK + TerrabaseSDK sdk = TerrabaseSDK.init(); + + // 获取企业模式 + String mode = sdk.getEnterpriseMode(); + System.out.println("当前企业模式: " + mode); + + // 获取企业服务信息 + String serviceInfo = TerrabaseSDK.getServiceInfo(); + System.out.println("企业服务信息: " + serviceInfo); + } + + /** + * 加解密操作示例 + */ + public static void cryptoExample() { + System.out.println("\n=== 加解密操作示例 ==="); + + try { + // 初始化SDK + TerrabaseSDK.init(); + + String plaintext = "Hello, Terrabase!"; + String username = "user1"; + + // 使用静态方法快速加密 + String encrypted = TerrabaseSDK.encrypt(plaintext, CryptoAlgorithm.AES, username); + System.out.println("加密结果: " + encrypted); + + // 使用静态方法快速解密 + String decrypted = TerrabaseSDK.decrypt(encrypted, CryptoAlgorithm.AES, username); + System.out.println("解密结果: " + decrypted); + + // 使用实例方法 + TerrabaseSDK sdk = TerrabaseSDK.getInstance(); + String encrypted2 = sdk.crypto().encrypt("Another message", CryptoAlgorithm.RSA, username); + System.out.println("RSA加密结果: " + encrypted2); + + } catch (Exception e) { + System.err.println("加解密操作失败: " + e.getMessage()); + } + } + + /** + * 用户管理示例 + */ + public static void userManagementExample() { + System.out.println("\n=== 用户管理示例 ==="); + + try { + // 初始化SDK + TerrabaseSDK.init(); + + // 获取当前用户信息 + ResultVo> result = TerrabaseSDK.getCurrentUserInfo(); + + if ("200".equals(result.getCode())) { + System.out.println("用户信息获取成功:"); + List users = result.getData(); + if (users != null) { + for (LoginUserDto user : users) { + System.out.println(" 用户: " + user.getUserName() + " (ID: " + user.getUserId() + ")"); + } + } + } else { + System.out.println("用户信息获取失败: " + result.getMsg()); + } + + } catch (Exception e) { + System.err.println("用户管理操作失败: " + e.getMessage()); + } + } + + /** + * 企业服务信息示例 + */ + public static void enterpriseServiceExample() { + System.out.println("\n=== 企业服务信息示例 ==="); + + try { + // 初始化SDK + TerrabaseSDK sdk = TerrabaseSDK.init(); + + // 获取企业服务 + var enterpriseService = sdk.enterprise(); + + System.out.println("企业服务信息:"); + System.out.println(" 服务名称: " + enterpriseService.getServiceName()); + System.out.println(" 服务版本: " + enterpriseService.getServiceVersion()); + System.out.println(" 服务类型: " + enterpriseService.getServiceType()); + System.out.println(" 健康状态: " + enterpriseService.getHealthStatus()); + + // 获取其他服务 + var cryptoService = sdk.crypto(); + var userService = sdk.userManagement(); + var logService = sdk.logManagement(); + var certService = sdk.certificate(); + var monitorService = sdk.monitoring(); + + System.out.println("所有服务已加载完成"); + + } catch (Exception e) { + System.err.println("企业服务操作失败: " + e.getMessage()); + } + } + + /** + * 高级使用示例:自定义JAR路径 + */ + public static void advancedUsageExample() { + System.out.println("\n=== 高级使用示例 ==="); + + try { + // 使用自定义JAR路径创建SDK实例 + // 注意:这需要修改TerrabaseSDK类以支持自定义路径 + System.out.println("高级使用示例需要扩展SDK类以支持自定义配置"); + + } catch (Exception e) { + System.err.println("高级使用示例失败: " + e.getMessage()); + } + } +} diff --git a/business-app/src/main/resources/application.properties b/business-app/src/main/resources/application.properties index fe41c59..5b76a1e 100644 --- a/business-app/src/main/resources/application.properties +++ b/business-app/src/main/resources/application.properties @@ -2,6 +2,21 @@ # 应用基本信息 spring.application.name=terrabase-business-app +# +## nacos相关配置 +#spring.cloud.nacos.discovery.server-addr=https://consulservice:18302 +#spring.cloud.nacos.discovery.username=consul +#spring.cloud.nacos.discovery.password=${NACOS_PASSWORD} +#spring.cloud.nacos.discovery.port=8080 +#spring.cloud.nacos.discovery.ip=${SERVICE_NAME} +#spring.cloud.nacos.discovery.secure=true +#spring.cloud.nacos.discovery.cluster-name=DEFAULT +# +#loadbalancer.client.name=${SERVICE_NAME} +# 在未配置 Nacos 地址时,默认关闭注册与发现,避免启动失败 +spring.cloud.nacos.discovery.enabled=false +spring.cloud.nacos.discovery.register-enabled=false +# server.port=8080 # JAR包路径配置 @@ -40,5 +55,4 @@ info.app.encoding=UTF-8 info.app.java.version=17 # 商业版加解密REST接口配置 -terrabase.commercial.oms.base.url=http://localhost:8081/api/ -terrabase.commercial.timeout=30000 +# 已移除不再使用的商业版REST配置项 diff --git a/enterprise-api/pom.xml b/enterprise-api/pom.xml index 4e09329..8b71a0c 100644 --- a/enterprise-api/pom.xml +++ b/enterprise-api/pom.xml @@ -67,6 +67,13 @@ test + + org.projectlombok + lombok + 1.18.32 + provided + + junit junit diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/CertificateService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/CertificateService.java index 44d4652..48e8397 100644 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/CertificateService.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/CertificateService.java @@ -1,6 +1,7 @@ package com.terrabase.enterprise.api; import com.terrabase.enterprise.api.dto.*; +import com.terrabase.enterprise.api.response.ResultVo; import java.util.List; /** @@ -11,78 +12,17 @@ * @version 1.0.0 */ public interface CertificateService { - - /** - * 获取服务名称 - * @return 服务名称 - */ - String getServiceName(); - - /** - * 获取服务版本 - * @return 服务版本 - */ - String getServiceVersion(); - - /** - * 获取服务类型(commercial 或 open) - * @return 服务类型 - */ - String getServiceType(); - - /** - * 获取服务健康状态 - * @return 健康状态信息 - */ - String getHealthStatus(); - - /** - * 启动服务 - * 将服务的running状态设置为true - */ - void start(); - - /** - * 停止服务 - * 将服务的running状态设置为false - */ - void stop(); - - /** - * 检查服务是否正在运行 - * @return true如果服务正在运行 - */ - boolean isRunning(); // ========== 证书管理相关接口 ========== - - /** - * 证书注册接口 - * @param certificate 证书信息对象 - */ - void registerCertificate(RegisterCertificate certificate); - - /** - * 导入/更新证书接口 - * @param certificate 证书详细信息对象 - */ - void importOrUpdateCertificate(CertificateDetail certificate); - - /** - * 导入信任CA证书接口 - * @param caCertificate CA证书对象 - */ - void importTrustedCaCertificate(CaCertificate caCertificate); - /** - * 查询所有证书信息接口 - * @return 证书收集信息列表 + * 获取oms管理的所有证书信息接口 + * @return 证书收集信息结果对象 */ - List queryAllCertificates(); + ResultVo> listCertificateServiceList(); /** * License信息查询接口 - * @return License信息对象 + * @return License信息结果对象 */ - LicenseInfo queryLicenseInfo(); + ResultVo getLicenseInfo(); } diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/CryptoService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/CryptoService.java index 2912b52..707869a 100644 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/CryptoService.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/CryptoService.java @@ -6,66 +6,26 @@ * 加解密服务接口 * 提供数据加密和解密功能 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ public interface CryptoService { - - /** - * 获取服务名称 - * @return 服务名称 - */ - String getServiceName(); - - /** - * 获取服务版本 - * @return 服务版本 - */ - String getServiceVersion(); - - /** - * 获取服务类型(commercial 或 open) - * @return 服务类型 - */ - String getServiceType(); - - /** - * 获取服务健康状态 - * @return 健康状态信息 - */ - String getHealthStatus(); - - /** - * 启动服务 - * 将服务的running状态设置为true - */ - void start(); - - /** - * 停止服务 - * 将服务的running状态设置为false - */ - void stop(); - - /** - * 检查服务是否正在运行 - * @return true如果服务正在运行 - */ - boolean isRunning(); /** * 加密接口 * @param plaintext 明文数据 * @param algorithm 加密算法,如果为null则使用默认AES算法 + * @param username 用户名 * @return 密文数据 */ - String encrypt(String plaintext, CryptoAlgorithm algorithm); + String encrypt(String plaintext, CryptoAlgorithm algorithm, String username); /** * 解密接口 * @param ciphertext 密文数据 * @param algorithm 解密算法,如果为null则使用默认AES算法 + * @param username 用户名 * @return 明文数据 */ - String decrypt(String ciphertext, CryptoAlgorithm algorithm); + String decrypt(String ciphertext, CryptoAlgorithm algorithm, String username); } diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java index 969971c..4576d3e 100644 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java @@ -4,7 +4,7 @@ * 企业级服务接口 * 定义企业级功能的核心接口,组合各个子服务 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ public interface EnterpriseService { @@ -33,22 +33,5 @@ public interface EnterpriseService { */ String getHealthStatus(); - /** - * 启动服务 - * 将服务的running状态设置为true - */ - void start(); - - /** - * 停止服务 - * 将服务的running状态设置为false - */ - void stop(); - - /** - * 检查服务是否正在运行 - * @return true如果服务正在运行 - */ - boolean isRunning(); } diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/LogManagementService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/LogManagementService.java index ad2ab1c..3d30eb3 100644 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/LogManagementService.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/LogManagementService.java @@ -1,69 +1,24 @@ package com.terrabase.enterprise.api; import com.terrabase.enterprise.api.dto.*; +import com.terrabase.enterprise.api.request.LogAttributeVo; +import com.terrabase.enterprise.api.response.ResultVo; -/** - * 日志管理服务接口 - * 提供操作日志的国际化注册和上报功能 - * - * @author Terrabase Team - * @version 1.0.0 - */ -public interface LogManagementService { - - /** - * 获取服务名称 - * @return 服务名称 - */ - String getServiceName(); - - /** - * 获取服务版本 - * @return 服务版本 - */ - String getServiceVersion(); - - /** - * 获取服务类型(commercial 或 open) - * @return 服务类型 - */ - String getServiceType(); +import java.util.List; - /** - * 获取服务健康状态 - * @return 健康状态信息 - */ - String getHealthStatus(); - - /** - * 启动服务 - * 将服务的running状态设置为true - */ - void start(); - - /** - * 停止服务 - * 将服务的running状态设置为false - */ - void stop(); - - /** - * 检查服务是否正在运行 - * @return true如果服务正在运行 - */ - boolean isRunning(); +public interface LogManagementService { - // ========== 日志与监控相关接口 ========== - /** - * 操作日志国际化信息注册接口 - * @param logI18NS 国际化日志信息对象 + * 上报审计日志接口 + * @param logs 日志对象列表 + * @return ResultVo<日志条数> */ - void registerOperateLogI18N(LogI18NS logI18NS); + ResultVo registerLogs(List logs); /** - * 上报操作日志接口 - * @param logs 操作日志信息对象 + * 注册审计日志国际化 + * @param logI18ns 国际化对象列表 + * @return ResultVo<注册结果> */ - void reportOperateLog(Logs logs); + ResultVo registryInternational(List logI18ns); } diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/MenuService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/MenuService.java new file mode 100644 index 0000000..3d011ef --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/MenuService.java @@ -0,0 +1,18 @@ +package com.terrabase.enterprise.api; + +import com.terrabase.enterprise.api.dto.MenuRegisterInfo; + +/** + * 菜单管理服务接口 + * 提供菜单注册功能 + * + * @author Yehong Pan + * @version 1.0.0 + */ +public interface MenuService { + /** + * 注册菜单信息 + * @param menuRegisterInfo 菜单注册信息对象 + */ + void registerMenuInfo(MenuRegisterInfo menuRegisterInfo); +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/MonitoringService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/MonitoringService.java index 7cf0420..c237e03 100644 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/MonitoringService.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/MonitoringService.java @@ -1,84 +1,38 @@ package com.terrabase.enterprise.api; import com.terrabase.enterprise.api.dto.*; +import com.terrabase.enterprise.api.request.RegisterEventDefineReq; +import com.terrabase.enterprise.api.request.GetEventsParams; +import com.terrabase.enterprise.api.response.ResultVo; import java.util.List; /** * 监控告警服务接口 * 提供告警定义注册、告警上报、告警查询等功能 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ public interface MonitoringService { /** - * 获取服务名称 - * @return 服务名称 + * 批量注册告警定义接口 + * @param req 注册请求 + * @return 注册结果 */ - String getServiceName(); + ResultVo registerEventDefine(RegisterEventDefineReq req); /** - * 获取服务版本 - * @return 服务版本 + * 上报告警接口 + * @param alarmInfos 告警信息列表 + * @return 是否上报成功 */ - String getServiceVersion(); + ResultVo sendEvents(List alarmInfos); /** - * 获取服务类型(commercial 或 open) - * @return 服务类型 + * 批量查询告警信息接口 + * @param getEventsParams 查询请求 + * @return 查询结果 */ - String getServiceType(); - - /** - * 获取服务健康状态 - * @return 健康状态信息 - */ - String getHealthStatus(); - - /** - * 启动服务 - * 将服务的running状态设置为true - */ - void start(); - - /** - * 停止服务 - * 将服务的running状态设置为false - */ - void stop(); - - /** - * 检查服务是否正在运行 - * @return true如果服务正在运行 - */ - boolean isRunning(); - - // ========== 告警系统相关接口 ========== - - /** - * 注册告警定义接口 - * @param eventDefine 告警定义对象 - */ - void registerEventDefine(EventDefine eventDefine); - - /** - * 告警上报接口 - * @param alarms 告警信息列表 - */ - void sendAlarmsBatch(List alarms); - - /** - * 分页查询告警接口 - * @param queryParams 查询参数 - * @return 告警信息分页结果 - */ - PageResult getEventsByPage(EventQueryParams queryParams); - - /** - * 根据ID查询告警详情接口 - * @param alarmId 告警ID - * @return 告警详细信息 - */ - AlarmDetail getAlarmDetailById(String alarmId); + ResultVo getEventsByPage(GetEventsParams getEventsParams); } diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/UserManagementService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/UserManagementService.java index 18c8cce..5f37d09 100644 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/UserManagementService.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/UserManagementService.java @@ -1,89 +1,54 @@ package com.terrabase.enterprise.api; -import com.terrabase.enterprise.api.dto.*; +import com.terrabase.enterprise.api.dto.AuthorityInfo; +import com.terrabase.enterprise.api.dto.LoginUserDto; +import com.terrabase.enterprise.api.dto.ResourceGroup; +import com.terrabase.enterprise.api.request.RoleRegisterVo; +import com.terrabase.enterprise.api.response.ResultVo; + +import java.util.List; /** * 用户管理服务接口 * 提供角色、权限、菜单等用户管理功能 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ public interface UserManagementService { - - /** - * 获取服务名称 - * @return 服务名称 - */ - String getServiceName(); - - /** - * 获取服务版本 - * @return 服务版本 - */ - String getServiceVersion(); - - /** - * 获取服务类型(commercial 或 open) - * @return 服务类型 - */ - String getServiceType(); - - /** - * 获取服务健康状态 - * @return 健康状态信息 - */ - String getHealthStatus(); - - /** - * 启动服务 - * 将服务的running状态设置为true - */ - void start(); - - /** - * 停止服务 - * 将服务的running状态设置为false - */ - void stop(); - - /** - * 检查服务是否正在运行 - * @return true如果服务正在运行 - */ - boolean isRunning(); // ========== 用户注册相关接口 ========== /** - * 角色注册接口 + * 批量角色注册接口 * @param roleRegister 角色注册对象 */ - void registerRole(RoleRegister roleRegister); + void batchRegisterRole(RoleRegisterVo roleRegister); /** - * 权限注册接口 - * @param authorityInfos 权限信息对象 + * 批量权限注册接口 + * @param authorityInfos 权限信息列表 */ - void registerAuthority(AuthorityInfos authorityInfos); + void registerPermission(List authorityInfos); /** - * 菜单注册接口 - * @param menuRegisterInfo 菜单注册信息对象 + * 获取用户资源组列表 + * @param userName 用户名 + * @return 用户资源组列表 */ - void registerMenu(MenuRegisterInfo menuRegisterInfo); + List getUserGroups(String userName); + + // ========== 用户认证相关接口 ========== /** - * 菜单屏蔽注册接口 - * @param forbiddenBody 菜单屏蔽信息对象 + * 根据token查询角色名接口 + * @return 角色名列表结果对象 */ - void registerMenuForbidden(ForbiddenBody forbiddenBody); - - // ========== 时间管理相关接口 ========== + ResultVo> queryRolesByToken(); /** - * 时间配置变更事件订阅接口 - * @param subscribe 订阅信息对象 + * 获取当前用户信息接口 + * @return 当前用户信息结果对象 */ - void subscribeTimeConfigChange(Subscribe subscribe); + ResultVo> getCurrentUserInfo(); } diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmDetail.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmDetail.java deleted file mode 100644 index 11a8910..0000000 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmDetail.java +++ /dev/null @@ -1,240 +0,0 @@ -package com.terrabase.enterprise.api.dto; - -/** - * 告警详细信息对象 - * 用于查询告警详情功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ -public class AlarmDetail { - - /** - * 告警ID - */ - private String alarmId; - - /** - * 告警定义ID - */ - private String eventDefineId; - - /** - * 告警名称 - */ - private String alarmName; - - /** - * 告警描述 - */ - private String alarmDescription; - - /** - * 告警级别 - */ - private String alarmLevel; - - /** - * 告警状态 - */ - private String alarmStatus; - - /** - * 触发时间 - */ - private Long triggerTime; - - /** - * 告警来源 - */ - private String alarmSource; - - /** - * 告警详情 - */ - private String alarmDetails; - - /** - * 告警数据 - */ - private String alarmData; - - /** - * 处理时间 - */ - private Long handleTime; - - /** - * 处理人 - */ - private String handler; - - /** - * 处理备注 - */ - private String handleRemark; - - /** - * 创建时间 - */ - private Long createTime; - - /** - * 更新时间 - */ - private Long updateTime; - - public AlarmDetail() {} - - public AlarmDetail(String alarmId, String alarmName, String alarmLevel) { - this.alarmId = alarmId; - this.alarmName = alarmName; - this.alarmLevel = alarmLevel; - this.createTime = System.currentTimeMillis(); - } - - public String getAlarmId() { - return alarmId; - } - - public void setAlarmId(String alarmId) { - this.alarmId = alarmId; - } - - public String getEventDefineId() { - return eventDefineId; - } - - public void setEventDefineId(String eventDefineId) { - this.eventDefineId = eventDefineId; - } - - public String getAlarmName() { - return alarmName; - } - - public void setAlarmName(String alarmName) { - this.alarmName = alarmName; - } - - public String getAlarmDescription() { - return alarmDescription; - } - - public void setAlarmDescription(String alarmDescription) { - this.alarmDescription = alarmDescription; - } - - public String getAlarmLevel() { - return alarmLevel; - } - - public void setAlarmLevel(String alarmLevel) { - this.alarmLevel = alarmLevel; - } - - public String getAlarmStatus() { - return alarmStatus; - } - - public void setAlarmStatus(String alarmStatus) { - this.alarmStatus = alarmStatus; - } - - public Long getTriggerTime() { - return triggerTime; - } - - public void setTriggerTime(Long triggerTime) { - this.triggerTime = triggerTime; - } - - public String getAlarmSource() { - return alarmSource; - } - - public void setAlarmSource(String alarmSource) { - this.alarmSource = alarmSource; - } - - public String getAlarmDetails() { - return alarmDetails; - } - - public void setAlarmDetails(String alarmDetails) { - this.alarmDetails = alarmDetails; - } - - public String getAlarmData() { - return alarmData; - } - - public void setAlarmData(String alarmData) { - this.alarmData = alarmData; - } - - public Long getHandleTime() { - return handleTime; - } - - public void setHandleTime(Long handleTime) { - this.handleTime = handleTime; - } - - public String getHandler() { - return handler; - } - - public void setHandler(String handler) { - this.handler = handler; - } - - public String getHandleRemark() { - return handleRemark; - } - - public void setHandleRemark(String handleRemark) { - this.handleRemark = handleRemark; - } - - public Long getCreateTime() { - return createTime; - } - - public void setCreateTime(Long createTime) { - this.createTime = createTime; - } - - public Long getUpdateTime() { - return updateTime; - } - - public void setUpdateTime(Long updateTime) { - this.updateTime = updateTime; - } - - @Override - public String toString() { - return "AlarmDetail{" + - "alarmId='" + alarmId + '\'' + - ", eventDefineId='" + eventDefineId + '\'' + - ", alarmName='" + alarmName + '\'' + - ", alarmDescription='" + alarmDescription + '\'' + - ", alarmLevel='" + alarmLevel + '\'' + - ", alarmStatus='" + alarmStatus + '\'' + - ", triggerTime=" + triggerTime + - ", alarmSource='" + alarmSource + '\'' + - ", alarmDetails='" + alarmDetails + '\'' + - ", alarmData='" + alarmData + '\'' + - ", handleTime=" + handleTime + - ", handler='" + handler + '\'' + - ", handleRemark='" + handleRemark + '\'' + - ", createTime=" + createTime + - ", updateTime=" + updateTime + - '}'; - } -} - - - - diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmInfo.java deleted file mode 100644 index 49e6df4..0000000 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AlarmInfo.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.terrabase.enterprise.api.dto; - -/** - * 告警信息对象 - * 用于告警上报功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ -public class AlarmInfo { - - /** - * 告警ID - */ - private String alarmId; - - /** - * 告警定义ID - */ - private String eventDefineId; - - /** - * 告警名称 - */ - private String alarmName; - - /** - * 告警描述 - */ - private String alarmDescription; - - /** - * 告警级别 - */ - private String alarmLevel; - - /** - * 告警状态 - */ - private String alarmStatus; - - /** - * 触发时间 - */ - private Long triggerTime; - - /** - * 告警来源 - */ - private String alarmSource; - - /** - * 告警详情 - */ - private String alarmDetails; - - /** - * 告警数据 - */ - private String alarmData; - - public AlarmInfo() {} - - public AlarmInfo(String alarmId, String eventDefineId, String alarmName) { - this.alarmId = alarmId; - this.eventDefineId = eventDefineId; - this.alarmName = alarmName; - this.triggerTime = System.currentTimeMillis(); - } - - public String getAlarmId() { - return alarmId; - } - - public void setAlarmId(String alarmId) { - this.alarmId = alarmId; - } - - public String getEventDefineId() { - return eventDefineId; - } - - public void setEventDefineId(String eventDefineId) { - this.eventDefineId = eventDefineId; - } - - public String getAlarmName() { - return alarmName; - } - - public void setAlarmName(String alarmName) { - this.alarmName = alarmName; - } - - public String getAlarmDescription() { - return alarmDescription; - } - - public void setAlarmDescription(String alarmDescription) { - this.alarmDescription = alarmDescription; - } - - public String getAlarmLevel() { - return alarmLevel; - } - - public void setAlarmLevel(String alarmLevel) { - this.alarmLevel = alarmLevel; - } - - public String getAlarmStatus() { - return alarmStatus; - } - - public void setAlarmStatus(String alarmStatus) { - this.alarmStatus = alarmStatus; - } - - public Long getTriggerTime() { - return triggerTime; - } - - public void setTriggerTime(Long triggerTime) { - this.triggerTime = triggerTime; - } - - public String getAlarmSource() { - return alarmSource; - } - - public void setAlarmSource(String alarmSource) { - this.alarmSource = alarmSource; - } - - public String getAlarmDetails() { - return alarmDetails; - } - - public void setAlarmDetails(String alarmDetails) { - this.alarmDetails = alarmDetails; - } - - public String getAlarmData() { - return alarmData; - } - - public void setAlarmData(String alarmData) { - this.alarmData = alarmData; - } - - @Override - public String toString() { - return "AlarmInfo{" + - "alarmId='" + alarmId + '\'' + - ", eventDefineId='" + eventDefineId + '\'' + - ", alarmName='" + alarmName + '\'' + - ", alarmDescription='" + alarmDescription + '\'' + - ", alarmLevel='" + alarmLevel + '\'' + - ", alarmStatus='" + alarmStatus + '\'' + - ", triggerTime=" + triggerTime + - ", alarmSource='" + alarmSource + '\'' + - ", alarmDetails='" + alarmDetails + '\'' + - ", alarmData='" + alarmData + '\'' + - '}'; - } -} - - - - diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AuthorityInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AuthorityInfo.java new file mode 100644 index 0000000..0f907c3 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AuthorityInfo.java @@ -0,0 +1,46 @@ +package com.terrabase.enterprise.api.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AuthorityInfo { + /** + * 资源唯一标识 + */ + @JsonProperty("Description") + private String description; + + /** + * 资源唯一标识 + */ + @JsonProperty("ResourceKey") + private String resourceKey; + + /** + * 是否跳过权限检查 + */ + @JsonProperty("SkipCheck") + private boolean skipCheck; + + /** + * 所需角色 + */ + @JsonProperty("Roles") + private List roles = new ArrayList<>(10); +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AuthorityInfos.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AuthorityInfos.java deleted file mode 100644 index 6129ac3..0000000 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/AuthorityInfos.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.terrabase.enterprise.api.dto; - -import java.util.List; - -/** - * 权限信息对象 - * 用于权限注册功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ -public class AuthorityInfos { - - /** - * 权限列表 - */ - private List authorityList; - - /** - * 应用场景 - */ - private String applicationScenario; - - public AuthorityInfos() {} - - public AuthorityInfos(List authorityList) { - this.authorityList = authorityList; - } - - public List getAuthorityList() { - return authorityList; - } - - public void setAuthorityList(List authorityList) { - this.authorityList = authorityList; - } - - public String getApplicationScenario() { - return applicationScenario; - } - - public void setApplicationScenario(String applicationScenario) { - this.applicationScenario = applicationScenario; - } - - @Override - public String toString() { - return "AuthorityInfos{" + - "authorityList=" + authorityList + - ", applicationScenario='" + applicationScenario + '\'' + - '}'; - } - - /** - * 单个权限信息 - */ - public static class AuthorityInfo { - - /** - * 权限ID - */ - private String authorityId; - - /** - * 权限名称 - */ - private String authorityName; - - /** - * 权限描述 - */ - private String authorityDescription; - - /** - * 权限类型 - */ - private String authorityType; - - /** - * 资源路径 - */ - private String resourcePath; - - /** - * 操作类型 - */ - private String operationType; - - public AuthorityInfo() {} - - public AuthorityInfo(String authorityId, String authorityName, String authorityDescription) { - this.authorityId = authorityId; - this.authorityName = authorityName; - this.authorityDescription = authorityDescription; - } - - public String getAuthorityId() { - return authorityId; - } - - public void setAuthorityId(String authorityId) { - this.authorityId = authorityId; - } - - public String getAuthorityName() { - return authorityName; - } - - public void setAuthorityName(String authorityName) { - this.authorityName = authorityName; - } - - public String getAuthorityDescription() { - return authorityDescription; - } - - public void setAuthorityDescription(String authorityDescription) { - this.authorityDescription = authorityDescription; - } - - public String getAuthorityType() { - return authorityType; - } - - public void setAuthorityType(String authorityType) { - this.authorityType = authorityType; - } - - public String getResourcePath() { - return resourcePath; - } - - public void setResourcePath(String resourcePath) { - this.resourcePath = resourcePath; - } - - public String getOperationType() { - return operationType; - } - - public void setOperationType(String operationType) { - this.operationType = operationType; - } - - @Override - public String toString() { - return "AuthorityInfo{" + - "authorityId='" + authorityId + '\'' + - ", authorityName='" + authorityName + '\'' + - ", authorityDescription='" + authorityDescription + '\'' + - ", authorityType='" + authorityType + '\'' + - ", resourcePath='" + resourcePath + '\'' + - ", operationType='" + operationType + '\'' + - '}'; - } - } -} - - - - diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CaCertificate.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CaCertificate.java deleted file mode 100644 index 129149b..0000000 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CaCertificate.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.terrabase.enterprise.api.dto; - -/** - * CA证书对象 - * 用于导入信任CA证书功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ -public class CaCertificate { - - /** - * CA证书ID - */ - private String caCertificateId; - - /** - * CA证书名称 - */ - private String caCertificateName; - - /** - * CA证书内容 - */ - private String caCertificateContent; - - /** - * CA证书格式 - */ - private String caCertificateFormat; - - /** - * 证书颁发者 - */ - private String issuer; - - /** - * 证书主题 - */ - private String subject; - - /** - * 有效期开始时间 - */ - private Long validFrom; - - /** - * 有效期结束时间 - */ - private Long validTo; - - public CaCertificate() {} - - public CaCertificate(String caCertificateId, String caCertificateName, String caCertificateContent) { - this.caCertificateId = caCertificateId; - this.caCertificateName = caCertificateName; - this.caCertificateContent = caCertificateContent; - } - - public String getCaCertificateId() { - return caCertificateId; - } - - public void setCaCertificateId(String caCertificateId) { - this.caCertificateId = caCertificateId; - } - - public String getCaCertificateName() { - return caCertificateName; - } - - public void setCaCertificateName(String caCertificateName) { - this.caCertificateName = caCertificateName; - } - - public String getCaCertificateContent() { - return caCertificateContent; - } - - public void setCaCertificateContent(String caCertificateContent) { - this.caCertificateContent = caCertificateContent; - } - - public String getCaCertificateFormat() { - return caCertificateFormat; - } - - public void setCaCertificateFormat(String caCertificateFormat) { - this.caCertificateFormat = caCertificateFormat; - } - - public String getIssuer() { - return issuer; - } - - public void setIssuer(String issuer) { - this.issuer = issuer; - } - - public String getSubject() { - return subject; - } - - public void setSubject(String subject) { - this.subject = subject; - } - - public Long getValidFrom() { - return validFrom; - } - - public void setValidFrom(Long validFrom) { - this.validFrom = validFrom; - } - - public Long getValidTo() { - return validTo; - } - - public void setValidTo(Long validTo) { - this.validTo = validTo; - } - - @Override - public String toString() { - return "CaCertificate{" + - "caCertificateId='" + caCertificateId + '\'' + - ", caCertificateName='" + caCertificateName + '\'' + - ", caCertificateFormat='" + caCertificateFormat + '\'' + - ", issuer='" + issuer + '\'' + - ", subject='" + subject + '\'' + - ", validFrom=" + validFrom + - ", validTo=" + validTo + - '}'; - } -} - - - - diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertCollectInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertCollectInfo.java index 271ecd7..23c06aa 100644 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertCollectInfo.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertCollectInfo.java @@ -1,181 +1,36 @@ package com.terrabase.enterprise.api.dto; -/** - * 证书收集信息对象 - * 用于查询所有证书信息功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter public class CertCollectInfo { - - /** - * 证书ID - */ - private String certificateId; - - /** - * 证书名称 - */ - private String certificateName; - - /** - * 证书类型 - */ - private String certificateType; - - /** - * 证书状态 - */ - private String certificateStatus; - - /** - * 有效期开始时间 - */ - private Long validFrom; - - /** - * 有效期结束时间 - */ - private Long validTo; - - /** - * 证书颁发者 - */ + private String productName; + + private long issueTime; + + private long expirationTime; + private String issuer; - - /** - * 证书主题 - */ + private String subject; - - /** - * 证书用途 - */ - private String certificateUsage; - - /** - * 创建时间 - */ - private Long createTime; - - /** - * 更新时间 - */ - private Long updateTime; - - public CertCollectInfo() {} - - public CertCollectInfo(String certificateId, String certificateName, String certificateType) { - this.certificateId = certificateId; - this.certificateName = certificateName; - this.certificateType = certificateType; - } - - public String getCertificateId() { - return certificateId; - } - - public void setCertificateId(String certificateId) { - this.certificateId = certificateId; - } - - public String getCertificateName() { - return certificateName; - } - - public void setCertificateName(String certificateName) { - this.certificateName = certificateName; - } - - public String getCertificateType() { - return certificateType; - } - - public void setCertificateType(String certificateType) { - this.certificateType = certificateType; - } - - public String getCertificateStatus() { - return certificateStatus; - } - - public void setCertificateStatus(String certificateStatus) { - this.certificateStatus = certificateStatus; - } - - public Long getValidFrom() { - return validFrom; - } - - public void setValidFrom(Long validFrom) { - this.validFrom = validFrom; - } - - public Long getValidTo() { - return validTo; - } - - public void setValidTo(Long validTo) { - this.validTo = validTo; - } - - public String getIssuer() { - return issuer; - } - - public void setIssuer(String issuer) { - this.issuer = issuer; - } - - public String getSubject() { - return subject; - } - - public void setSubject(String subject) { - this.subject = subject; - } - - public String getCertificateUsage() { - return certificateUsage; - } - - public void setCertificateUsage(String certificateUsage) { - this.certificateUsage = certificateUsage; - } - - public Long getCreateTime() { - return createTime; - } - - public void setCreateTime(Long createTime) { - this.createTime = createTime; - } - - public Long getUpdateTime() { - return updateTime; - } - - public void setUpdateTime(Long updateTime) { - this.updateTime = updateTime; - } - - @Override - public String toString() { - return "CertCollectInfo{" + - "certificateId='" + certificateId + '\'' + - ", certificateName='" + certificateName + '\'' + - ", certificateType='" + certificateType + '\'' + - ", certificateStatus='" + certificateStatus + '\'' + - ", validFrom=" + validFrom + - ", validTo=" + validTo + - ", issuer='" + issuer + '\'' + - ", subject='" + subject + '\'' + - ", certificateUsage='" + certificateUsage + '\'' + - ", createTime=" + createTime + - ", updateTime=" + updateTime + - '}'; - } + + private String serialNumber; + + private String certType; + + private String status; + + private Integer alertBeforeExpirationDays; + + private String certName; + + private String productVersion; + + private String patchVersion; + + private String deviceEsn; } diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertificateDetail.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertificateDetail.java deleted file mode 100644 index 0a86832..0000000 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/CertificateDetail.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.terrabase.enterprise.api.dto; - -/** - * 证书详细信息对象 - * 用于证书导入/更新功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ -public class CertificateDetail { - - /** - * 证书ID - */ - private String certificateId; - - /** - * 证书内容 - */ - private String certificateContent; - - /** - * 私钥内容 - */ - private String privateKeyContent; - - /** - * 证书格式 - */ - private String certificateFormat; - - /** - * 密码 - */ - private String password; - - /** - * 证书链 - */ - private String[] certificateChain; - - public CertificateDetail() {} - - public CertificateDetail(String certificateId, String certificateContent) { - this.certificateId = certificateId; - this.certificateContent = certificateContent; - } - - public String getCertificateId() { - return certificateId; - } - - public void setCertificateId(String certificateId) { - this.certificateId = certificateId; - } - - public String getCertificateContent() { - return certificateContent; - } - - public void setCertificateContent(String certificateContent) { - this.certificateContent = certificateContent; - } - - public String getPrivateKeyContent() { - return privateKeyContent; - } - - public void setPrivateKeyContent(String privateKeyContent) { - this.privateKeyContent = privateKeyContent; - } - - public String getCertificateFormat() { - return certificateFormat; - } - - public void setCertificateFormat(String certificateFormat) { - this.certificateFormat = certificateFormat; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String[] getCertificateChain() { - return certificateChain; - } - - public void setCertificateChain(String[] certificateChain) { - this.certificateChain = certificateChain; - } - - @Override - public String toString() { - return "CertificateDetail{" + - "certificateId='" + certificateId + '\'' + - ", certificateFormat='" + certificateFormat + '\'' + - ", password='" + (password != null ? "***" : null) + '\'' + - ", certificateChain=" + (certificateChain != null ? certificateChain.length + " items" : null) + - '}'; - } -} - - - - diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Ciphertext.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Ciphertext.java new file mode 100644 index 0000000..392a50a --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Ciphertext.java @@ -0,0 +1,14 @@ +package com.terrabase.enterprise.api.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Ciphertext { + @JsonProperty("keyId") + String keyId; +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventDefine.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventDefine.java index 4a18c80..2455324 100644 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventDefine.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventDefine.java @@ -1,153 +1,51 @@ package com.terrabase.enterprise.api.dto; -/** - * 告警定义对象 - * 用于注册告警定义功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.*; + +@Setter +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor public class EventDefine { - - /** - * 告警定义ID - */ - private String eventDefineId; - - /** - * 告警名称 - */ - private String eventName; - - /** - * 告警描述 - */ - private String eventDescription; - - /** - * 告警类型 - */ - private String eventType; - - /** - * 告警级别 - */ - private String eventLevel; - - /** - * 告警分类 - */ - private String eventCategory; - - /** - * 触发条件 - */ - private String triggerCondition; - - /** - * 告警模板 - */ - private String eventTemplate; - - /** - * 是否启用 - */ - private Boolean enabled; - - public EventDefine() {} - - public EventDefine(String eventDefineId, String eventName, String eventDescription) { - this.eventDefineId = eventDefineId; - this.eventName = eventName; - this.eventDescription = eventDescription; - } - - public String getEventDefineId() { - return eventDefineId; - } - - public void setEventDefineId(String eventDefineId) { - this.eventDefineId = eventDefineId; - } - - public String getEventName() { - return eventName; - } - - public void setEventName(String eventName) { - this.eventName = eventName; - } - - public String getEventDescription() { - return eventDescription; - } - - public void setEventDescription(String eventDescription) { - this.eventDescription = eventDescription; - } - - public String getEventType() { - return eventType; - } - - public void setEventType(String eventType) { - this.eventType = eventType; - } - - public String getEventLevel() { - return eventLevel; - } - - public void setEventLevel(String eventLevel) { - this.eventLevel = eventLevel; - } - - public String getEventCategory() { - return eventCategory; - } - - public void setEventCategory(String eventCategory) { - this.eventCategory = eventCategory; - } - - public String getTriggerCondition() { - return triggerCondition; - } - - public void setTriggerCondition(String triggerCondition) { - this.triggerCondition = triggerCondition; - } - - public String getEventTemplate() { - return eventTemplate; - } - - public void setEventTemplate(String eventTemplate) { - this.eventTemplate = eventTemplate; - } - - public Boolean getEnabled() { - return enabled; - } - - public void setEnabled(Boolean enabled) { - this.enabled = enabled; - } - - @Override - public String toString() { - return "EventDefine{" + - "eventDefineId='" + eventDefineId + '\'' + - ", eventName='" + eventName + '\'' + - ", eventDescription='" + eventDescription + '\'' + - ", eventType='" + eventType + '\'' + - ", eventLevel='" + eventLevel + '\'' + - ", eventCategory='" + eventCategory + '\'' + - ", triggerCondition='" + triggerCondition + '\'' + - ", eventTemplate='" + eventTemplate + '\'' + - ", enabled=" + enabled + - '}'; - } + private @NotEmpty String eventId; + + private @NotEmpty String name; + + private String effect; + + private @NotEmpty String category; + + private String description; + + private String subjectType; + + private @NotEmpty @Pattern( + regexp = "^(alter|event)$" + ) String type; + + private @NotEmpty String parts; + + private String cause; + + private @Pattern( + regexp = "^(warning|minor|major|critical)$" + ) String severity; + + private String suggestion; + + private String version; + + private @Pattern( + regexp = "^(zh|zh-cn|en|en-us)$" + ) String language; + + private @Size( + max = 256 + ) String defineMatchKey; } diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventInfo.java index 6c2ec97..783c634 100644 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventInfo.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventInfo.java @@ -1,181 +1,134 @@ package com.terrabase.enterprise.api.dto; -/** - * 告警信息对象 - * 用于告警查询功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ +import com.fasterxml.jackson.annotation.JsonAlias; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Pattern; +import lombok.*; +import org.hibernate.validator.constraints.Length; + +import java.util.List; + +@Setter +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor public class EventInfo { - - /** - * 告警ID - */ - private String alarmId; - - /** - * 告警定义ID - */ - private String eventDefineId; - - /** - * 告警名称 - */ - private String alarmName; - - /** - * 告警描述 - */ - private String alarmDescription; - - /** - * 告警级别 - */ - private String alarmLevel; - - /** - * 告警状态 - */ - private String alarmStatus; - - /** - * 触发时间 - */ - private Long triggerTime; - - /** - * 告警来源 - */ - private String alarmSource; - - /** - * 处理时间 - */ - private Long handleTime; - - /** - * 处理人 - */ - private String handler; - - /** - * 处理备注 - */ - private String handleRemark; - - public EventInfo() {} - - public EventInfo(String alarmId, String alarmName, String alarmLevel) { - this.alarmId = alarmId; - this.alarmName = alarmName; - this.alarmLevel = alarmLevel; - } - - public String getAlarmId() { - return alarmId; - } - - public void setAlarmId(String alarmId) { - this.alarmId = alarmId; - } - - public String getEventDefineId() { - return eventDefineId; - } - - public void setEventDefineId(String eventDefineId) { - this.eventDefineId = eventDefineId; - } - - public String getAlarmName() { - return alarmName; - } - - public void setAlarmName(String alarmName) { - this.alarmName = alarmName; - } - - public String getAlarmDescription() { - return alarmDescription; - } - - public void setAlarmDescription(String alarmDescription) { - this.alarmDescription = alarmDescription; - } - - public String getAlarmLevel() { - return alarmLevel; - } - - public void setAlarmLevel(String alarmLevel) { - this.alarmLevel = alarmLevel; - } - - public String getAlarmStatus() { - return alarmStatus; - } - - public void setAlarmStatus(String alarmStatus) { - this.alarmStatus = alarmStatus; - } - - public Long getTriggerTime() { - return triggerTime; - } - - public void setTriggerTime(Long triggerTime) { - this.triggerTime = triggerTime; - } - - public String getAlarmSource() { - return alarmSource; - } - - public void setAlarmSource(String alarmSource) { - this.alarmSource = alarmSource; - } - - public Long getHandleTime() { - return handleTime; - } - - public void setHandleTime(Long handleTime) { - this.handleTime = handleTime; - } - - public String getHandler() { - return handler; - } - - public void setHandler(String handler) { - this.handler = handler; - } - - public String getHandleRemark() { - return handleRemark; - } - - public void setHandleRemark(String handleRemark) { - this.handleRemark = handleRemark; - } - - @Override - public String toString() { - return "EventInfo{" + - "alarmId='" + alarmId + '\'' + - ", eventDefineId='" + eventDefineId + '\'' + - ", alarmName='" + alarmName + '\'' + - ", alarmDescription='" + alarmDescription + '\'' + - ", alarmLevel='" + alarmLevel + '\'' + - ", alarmStatus='" + alarmStatus + '\'' + - ", triggerTime=" + triggerTime + - ", alarmSource='" + alarmSource + '\'' + - ", handleTime=" + handleTime + - ", handler='" + handler + '\'' + - ", handleRemark='" + handleRemark + '\'' + - '}'; - } + private @Pattern( + regexp = "^\\d{1,32}$", + message = "id is a number" + ) String id; + + private @Pattern( + regexp = "^[A-Za-z0-9:_\\-=]{1,128}$", + message = "serialNumber is an uuid" + ) String serialNumber; + + private Integer syncNo; + + private @Length( + max = 255, + message = "eventName must less than 255" + ) String eventName; + + private @NotEmpty @Pattern( + regexp = "^(alter|event)$" + ) String eventType; + + private @NotBlank @Length( + max = 255, + message = "evenSubject must less than 255" + ) String eventSubject; + + private @NotBlank @Length( + max = 255, + message = "evenSubjectType must less than 255" + ) String eventSubjectType; + + private @Length( + max = 8000 + ) String eventDescription; + + private @Length( + max = 64 + ) List eventDescriptionArgs; + + private @NotBlank @Pattern( + regexp = "warning|minor|major|critical" + ) String severity; + + private @Length( + max = 8000 + ) String effect; + + private @NotBlank @Length( + max = 128, + message = "evenCategory must less than 255" + ) String eventCategory; + + @JsonAlias({"possibleCause", "cause"}) + private @Length( + max = 8000 + ) String possibleCause; + + private @Length( + max = 8000 + ) String suggestion; + + private @NotBlank @Pattern( + regexp = "Uncleared|Cleared", + message = "status must be Uncleared or Cleared" + ) String status; + + private @Length( + max = 32 + ) String firstOccurTime; + + private @Length( + max = 32 + ) String clearTime; + + private @Length( + max = 255, + message = "eventSource must less than 255" + ) String evenSource; + + private @Length( + max = 255, + message = "deviceSn must less than 255" + ) String deviceSn; + + private @Length( + max = 255, + message = "deviceType must less than 255" + ) String deviceType; + + private @Length( + max = 255 + ) String devURL; + + private @NotBlank @Length( + max = 64 + ) String parts; + + private @Pattern( + regexp = "^(zh|zh-cn|en|en-us)$" + ) String language; + + private int computerCategory; + + private boolean shouldDeleted; + + private String clearType; + + private String defineMatchKey; + + private String lastEventMatchKey; + + private Boolean shouldSaveDefine = true; + + private String deviceId; } diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventObject.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventObject.java new file mode 100644 index 0000000..3c4854f --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventObject.java @@ -0,0 +1,66 @@ +package com.terrabase.enterprise.api.dto; + +import lombok.*; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EventObject { + protected String id; + + protected String eventId; + + protected String eventName; + + protected String eventType; + + protected String eventCategory; + + protected String deviceSn; + + protected String deviceId; + + protected String eventSubject; + + protected String severity; + + protected String eventSource; + + protected String parts; + + protected String clearType; + + protected String clearUser; + + protected String status; + + protected String confirmStatus; + + protected boolean blockingStatus; + + protected int occurCounts; + + protected Long clearTime; + + protected Long firstOccurTime; + + protected Long lastOccurTime; + + protected String readFlag; + + protected String eventDescription; + + protected String eventDescriptionArgs; + + protected String suggestion; + + protected String cause; + + protected Boolean sendToeService; + + protected String serialNumber; + + protected String devUrl; +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventQueryParams.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventQueryParams.java deleted file mode 100644 index 821a8a2..0000000 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventQueryParams.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.terrabase.enterprise.api.dto; - -/** - * 告警查询参数对象 - * 用于分页查询告警功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ -public class EventQueryParams { - - /** - * 页码 - */ - private Integer pageNum; - - /** - * 每页大小 - */ - private Integer pageSize; - - /** - * 告警级别 - */ - private String alarmLevel; - - /** - * 告警状态 - */ - private String alarmStatus; - - /** - * 告警类型 - */ - private String alarmType; - - /** - * 开始时间 - */ - private Long startTime; - - /** - * 结束时间 - */ - private Long endTime; - - /** - * 告警来源 - */ - private String alarmSource; - - /** - * 关键字搜索 - */ - private String keyword; - - public EventQueryParams() {} - - public EventQueryParams(Integer pageNum, Integer pageSize) { - this.pageNum = pageNum; - this.pageSize = pageSize; - } - - public Integer getPageNum() { - return pageNum; - } - - public void setPageNum(Integer pageNum) { - this.pageNum = pageNum; - } - - public Integer getPageSize() { - return pageSize; - } - - public void setPageSize(Integer pageSize) { - this.pageSize = pageSize; - } - - public String getAlarmLevel() { - return alarmLevel; - } - - public void setAlarmLevel(String alarmLevel) { - this.alarmLevel = alarmLevel; - } - - public String getAlarmStatus() { - return alarmStatus; - } - - public void setAlarmStatus(String alarmStatus) { - this.alarmStatus = alarmStatus; - } - - public String getAlarmType() { - return alarmType; - } - - public void setAlarmType(String alarmType) { - this.alarmType = alarmType; - } - - public Long getStartTime() { - return startTime; - } - - public void setStartTime(Long startTime) { - this.startTime = startTime; - } - - public Long getEndTime() { - return endTime; - } - - public void setEndTime(Long endTime) { - this.endTime = endTime; - } - - public String getAlarmSource() { - return alarmSource; - } - - public void setAlarmSource(String alarmSource) { - this.alarmSource = alarmSource; - } - - public String getKeyword() { - return keyword; - } - - public void setKeyword(String keyword) { - this.keyword = keyword; - } - - @Override - public String toString() { - return "EventQueryParams{" + - "pageNum=" + pageNum + - ", pageSize=" + pageSize + - ", alarmLevel='" + alarmLevel + '\'' + - ", alarmStatus='" + alarmStatus + '\'' + - ", alarmType='" + alarmType + '\'' + - ", startTime=" + startTime + - ", endTime=" + endTime + - ", alarmSource='" + alarmSource + '\'' + - ", keyword='" + keyword + '\'' + - '}'; - } -} - - - - diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventsCollection.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventsCollection.java new file mode 100644 index 0000000..3841e28 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/EventsCollection.java @@ -0,0 +1,18 @@ +package com.terrabase.enterprise.api.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +@Setter +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class EventsCollection { + private List events; + + private int totalCount; +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/ForbiddenBody.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/ForbiddenBody.java deleted file mode 100644 index 413a5ea..0000000 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/ForbiddenBody.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.terrabase.enterprise.api.dto; - -import java.util.List; - -/** - * 菜单屏蔽信息对象 - * 用于菜单屏蔽注册功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ -public class ForbiddenBody { - - /** - * 屏蔽的菜单列表 - */ - private List forbiddenMenuIds; - - /** - * 屏蔽原因 - */ - private String reason; - - /** - * 应用场景 - */ - private String applicationScenario; - - /** - * 是否永久屏蔽 - */ - private Boolean permanent; - - /** - * 屏蔽开始时间 - */ - private Long startTime; - - /** - * 屏蔽结束时间 - */ - private Long endTime; - - public ForbiddenBody() {} - - public ForbiddenBody(List forbiddenMenuIds, String reason) { - this.forbiddenMenuIds = forbiddenMenuIds; - this.reason = reason; - } - - public List getForbiddenMenuIds() { - return forbiddenMenuIds; - } - - public void setForbiddenMenuIds(List forbiddenMenuIds) { - this.forbiddenMenuIds = forbiddenMenuIds; - } - - public String getReason() { - return reason; - } - - public void setReason(String reason) { - this.reason = reason; - } - - public String getApplicationScenario() { - return applicationScenario; - } - - public void setApplicationScenario(String applicationScenario) { - this.applicationScenario = applicationScenario; - } - - public Boolean getPermanent() { - return permanent; - } - - public void setPermanent(Boolean permanent) { - this.permanent = permanent; - } - - public Long getStartTime() { - return startTime; - } - - public void setStartTime(Long startTime) { - this.startTime = startTime; - } - - public Long getEndTime() { - return endTime; - } - - public void setEndTime(Long endTime) { - this.endTime = endTime; - } - - @Override - public String toString() { - return "ForbiddenBody{" + - "forbiddenMenuIds=" + forbiddenMenuIds + - ", reason='" + reason + '\'' + - ", applicationScenario='" + applicationScenario + '\'' + - ", permanent=" + permanent + - ", startTime=" + startTime + - ", endTime=" + endTime + - '}'; - } -} - - - - diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LicenseInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LicenseInfo.java index 3fabe97..8e40302 100644 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LicenseInfo.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LicenseInfo.java @@ -1,166 +1,27 @@ package com.terrabase.enterprise.api.dto; -/** - * License信息对象 - * 用于License信息查询功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor public class LicenseInfo { - - /** - * License ID - */ - private String licenseId; - - /** - * License类型 - */ - private String licenseType; - - /** - * 有效期开始时间 - */ - private Long validFrom; - - /** - * 有效期结束时间 - */ - private Long validTo; - /** - * 功能模块列表 + * status许可证状态 + * 0没有导入 1已经正常上传但是未激活 2已经激活 3已经注销 */ - private String[] featureModules; - - /** - * 用户数量限制 - */ - private Integer userLimit; - - /** - * 并发连接数限制 - */ - private Integer concurrentLimit; - - /** - * 数据存储限制(GB) - */ - private Long storageLimit; - - /** - * License状态 - */ - private String licenseStatus; - + private String status; + /** - * 剩余天数 + * sbom信息 */ - private Integer remainingDays; - - public LicenseInfo() {} - - public LicenseInfo(String licenseId, String licenseType) { - this.licenseId = licenseId; - this.licenseType = licenseType; - } - - public String getLicenseId() { - return licenseId; - } - - public void setLicenseId(String licenseId) { - this.licenseId = licenseId; - } - - public String getLicenseType() { - return licenseType; - } - - public void setLicenseType(String licenseType) { - this.licenseType = licenseType; - } - - public Long getValidFrom() { - return validFrom; - } - - public void setValidFrom(Long validFrom) { - this.validFrom = validFrom; - } - - public Long getValidTo() { - return validTo; - } - - public void setValidTo(Long validTo) { - this.validTo = validTo; - } - - public String[] getFeatureModules() { - return featureModules; - } - - public void setFeatureModules(String[] featureModules) { - this.featureModules = featureModules; - } - - public Integer getUserLimit() { - return userLimit; - } - - public void setUserLimit(Integer userLimit) { - this.userLimit = userLimit; - } - - public Integer getConcurrentLimit() { - return concurrentLimit; - } - - public void setConcurrentLimit(Integer concurrentLimit) { - this.concurrentLimit = concurrentLimit; - } - - public Long getStorageLimit() { - return storageLimit; - } - - public void setStorageLimit(Long storageLimit) { - this.storageLimit = storageLimit; - } - - public String getLicenseStatus() { - return licenseStatus; - } - - public void setLicenseStatus(String licenseStatus) { - this.licenseStatus = licenseStatus; - } - - public Integer getRemainingDays() { - return remainingDays; - } - - public void setRemainingDays(Integer remainingDays) { - this.remainingDays = remainingDays; - } - - @Override - public String toString() { - return "LicenseInfo{" + - "licenseId='" + licenseId + '\'' + - ", licenseType='" + licenseType + '\'' + - ", validFrom=" + validFrom + - ", validTo=" + validTo + - ", featureModules=" + (featureModules != null ? java.util.Arrays.toString(featureModules) : null) + - ", userLimit=" + userLimit + - ", concurrentLimit=" + concurrentLimit + - ", storageLimit=" + storageLimit + - ", licenseStatus='" + licenseStatus + '\'' + - ", remainingDays=" + remainingDays + - '}'; - } + private List sboms; } diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LicenseInfoEx.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LicenseInfoEx.java new file mode 100644 index 0000000..5896087 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LicenseInfoEx.java @@ -0,0 +1,18 @@ +package com.terrabase.enterprise.api.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Setter +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class LicenseInfoEx { + private String name; + + private String total; + + private String unit; +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LogI18NS.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LogI18NS.java deleted file mode 100644 index 810920d..0000000 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LogI18NS.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.terrabase.enterprise.api.dto; - -import java.util.List; -import java.util.Map; - -/** - * 国际化日志信息对象 - * 用于操作日志国际化信息注册功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ -public class LogI18NS { - - /** - * 日志国际化信息列表 - */ - private List logI18NList; - - /** - * 应用场景 - */ - private String applicationScenario; - - public LogI18NS() {} - - public LogI18NS(List logI18NList) { - this.logI18NList = logI18NList; - } - - public List getLogI18NList() { - return logI18NList; - } - - public void setLogI18NList(List logI18NList) { - this.logI18NList = logI18NList; - } - - public String getApplicationScenario() { - return applicationScenario; - } - - public void setApplicationScenario(String applicationScenario) { - this.applicationScenario = applicationScenario; - } - - @Override - public String toString() { - return "LogI18NS{" + - "logI18NList=" + logI18NList + - ", applicationScenario='" + applicationScenario + '\'' + - '}'; - } - - /** - * 单个日志国际化信息 - */ - public static class LogI18NInfo { - - /** - * 操作代码 - */ - private String operationCode; - - /** - * 操作名称 - */ - private String operationName; - - /** - * 国际化信息映射 (语言代码 -> 描述) - */ - private Map i18nMessages; - - /** - * 默认语言 - */ - private String defaultLanguage; - - public LogI18NInfo() {} - - public LogI18NInfo(String operationCode, String operationName) { - this.operationCode = operationCode; - this.operationName = operationName; - } - - public String getOperationCode() { - return operationCode; - } - - public void setOperationCode(String operationCode) { - this.operationCode = operationCode; - } - - public String getOperationName() { - return operationName; - } - - public void setOperationName(String operationName) { - this.operationName = operationName; - } - - public Map getI18nMessages() { - return i18nMessages; - } - - public void setI18nMessages(Map i18nMessages) { - this.i18nMessages = i18nMessages; - } - - public String getDefaultLanguage() { - return defaultLanguage; - } - - public void setDefaultLanguage(String defaultLanguage) { - this.defaultLanguage = defaultLanguage; - } - - @Override - public String toString() { - return "LogI18NInfo{" + - "operationCode='" + operationCode + '\'' + - ", operationName='" + operationName + '\'' + - ", i18nMessages=" + i18nMessages + - ", defaultLanguage='" + defaultLanguage + '\'' + - '}'; - } - } -} - - - - diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LogI18n.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LogI18n.java new file mode 100644 index 0000000..98138b0 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LogI18n.java @@ -0,0 +1,22 @@ +package com.terrabase.enterprise.api.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class LogI18n { + private String code; + + private String language; + + private String content; +} + + + + diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LoginUserDto.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LoginUserDto.java new file mode 100644 index 0000000..fe23988 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/LoginUserDto.java @@ -0,0 +1,20 @@ +package com.terrabase.enterprise.api.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class LoginUserDto { + private String userName; + + private String userId; + + private String role; + + private List resourceGroups; +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Logs.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Logs.java deleted file mode 100644 index 972c58d..0000000 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Logs.java +++ /dev/null @@ -1,219 +0,0 @@ -package com.terrabase.enterprise.api.dto; - -import java.util.List; - -/** - * 操作日志信息对象 - * 用于上报操作日志功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ -public class Logs { - - /** - * 日志列表 - */ - private List logList; - - /** - * 应用场景 - */ - private String applicationScenario; - - public Logs() {} - - public Logs(List logList) { - this.logList = logList; - } - - public List getLogList() { - return logList; - } - - public void setLogList(List logList) { - this.logList = logList; - } - - public String getApplicationScenario() { - return applicationScenario; - } - - public void setApplicationScenario(String applicationScenario) { - this.applicationScenario = applicationScenario; - } - - @Override - public String toString() { - return "Logs{" + - "logList=" + logList + - ", applicationScenario='" + applicationScenario + '\'' + - '}'; - } - - /** - * 单个日志信息 - */ - public static class LogInfo { - - /** - * 日志ID - */ - private String logId; - - /** - * 用户ID - */ - private String userId; - - /** - * 用户名 - */ - private String userName; - - /** - * 操作类型 - */ - private String operationType; - - /** - * 操作描述 - */ - private String operationDescription; - - /** - * 操作时间 - */ - private Long operationTime; - - /** - * 操作结果 - */ - private String operationResult; - - /** - * IP地址 - */ - private String ipAddress; - - /** - * 用户代理 - */ - private String userAgent; - - /** - * 操作详情 - */ - private String operationDetails; - - public LogInfo() {} - - public LogInfo(String logId, String userId, String operationType, String operationDescription) { - this.logId = logId; - this.userId = userId; - this.operationType = operationType; - this.operationDescription = operationDescription; - this.operationTime = System.currentTimeMillis(); - } - - public String getLogId() { - return logId; - } - - public void setLogId(String logId) { - this.logId = logId; - } - - public String getUserId() { - return userId; - } - - public void setUserId(String userId) { - this.userId = userId; - } - - public String getUserName() { - return userName; - } - - public void setUserName(String userName) { - this.userName = userName; - } - - public String getOperationType() { - return operationType; - } - - public void setOperationType(String operationType) { - this.operationType = operationType; - } - - public String getOperationDescription() { - return operationDescription; - } - - public void setOperationDescription(String operationDescription) { - this.operationDescription = operationDescription; - } - - public Long getOperationTime() { - return operationTime; - } - - public void setOperationTime(Long operationTime) { - this.operationTime = operationTime; - } - - public String getOperationResult() { - return operationResult; - } - - public void setOperationResult(String operationResult) { - this.operationResult = operationResult; - } - - public String getIpAddress() { - return ipAddress; - } - - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } - - public String getUserAgent() { - return userAgent; - } - - public void setUserAgent(String userAgent) { - this.userAgent = userAgent; - } - - public String getOperationDetails() { - return operationDetails; - } - - public void setOperationDetails(String operationDetails) { - this.operationDetails = operationDetails; - } - - @Override - public String toString() { - return "LogInfo{" + - "logId='" + logId + '\'' + - ", userId='" + userId + '\'' + - ", userName='" + userName + '\'' + - ", operationType='" + operationType + '\'' + - ", operationDescription='" + operationDescription + '\'' + - ", operationTime=" + operationTime + - ", operationResult='" + operationResult + '\'' + - ", ipAddress='" + ipAddress + '\'' + - ", userAgent='" + userAgent + '\'' + - ", operationDetails='" + operationDetails + '\'' + - '}'; - } - } -} - - - - diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/MenuInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/MenuInfo.java new file mode 100644 index 0000000..a52f330 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/MenuInfo.java @@ -0,0 +1,24 @@ +package com.terrabase.enterprise.api.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class MenuInfo { + private int id; + + private String menuId; + + private String parentMenuId; + + private String menuName; + + private String url; + + private String en; + + private String zh; + + private boolean enable; +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/MenuRegisterInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/MenuRegisterInfo.java index ca87bc8..2197ae8 100644 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/MenuRegisterInfo.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/MenuRegisterInfo.java @@ -1,203 +1,40 @@ package com.terrabase.enterprise.api.dto; +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + import java.util.List; -/** - * 菜单注册信息对象 - * 用于菜单注册功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor public class MenuRegisterInfo { - - /** - * 菜单列表 - */ - private List menuList; - - /** - * 应用场景 - */ - private String applicationScenario; - - public MenuRegisterInfo() {} - - public MenuRegisterInfo(List menuList) { - this.menuList = menuList; - } - - public List getMenuList() { - return menuList; - } - - public void setMenuList(List menuList) { - this.menuList = menuList; - } - - public String getApplicationScenario() { - return applicationScenario; - } - - public void setApplicationScenario(String applicationScenario) { - this.applicationScenario = applicationScenario; - } - - @Override - public String toString() { - return "MenuRegisterInfo{" + - "menuList=" + menuList + - ", applicationScenario='" + applicationScenario + '\'' + - '}'; - } - - /** - * 单个菜单信息 - */ - public static class MenuInfo { - - /** - * 菜单ID - */ - private String menuId; - - /** - * 菜单名称 - */ - private String menuName; - - /** - * 菜单描述 - */ - private String menuDescription; - - /** - * 父菜单ID - */ - private String parentMenuId; - - /** - * 菜单路径 - */ - private String menuPath; - - /** - * 菜单图标 - */ - private String menuIcon; - - /** - * 菜单排序 - */ - private Integer menuOrder; - - /** - * 菜单类型 - */ - private String menuType; - - /** - * 是否启用 - */ - private Boolean enabled; - - public MenuInfo() {} - - public MenuInfo(String menuId, String menuName, String menuPath) { - this.menuId = menuId; - this.menuName = menuName; - this.menuPath = menuPath; - } - - public String getMenuId() { - return menuId; - } - - public void setMenuId(String menuId) { - this.menuId = menuId; - } - - public String getMenuName() { - return menuName; - } - - public void setMenuName(String menuName) { - this.menuName = menuName; - } - - public String getMenuDescription() { - return menuDescription; - } - - public void setMenuDescription(String menuDescription) { - this.menuDescription = menuDescription; - } - - public String getParentMenuId() { - return parentMenuId; - } - - public void setParentMenuId(String parentMenuId) { - this.parentMenuId = parentMenuId; - } - - public String getMenuPath() { - return menuPath; - } - - public void setMenuPath(String menuPath) { - this.menuPath = menuPath; - } - - public String getMenuIcon() { - return menuIcon; - } - - public void setMenuIcon(String menuIcon) { - this.menuIcon = menuIcon; - } - - public Integer getMenuOrder() { - return menuOrder; - } - - public void setMenuOrder(Integer menuOrder) { - this.menuOrder = menuOrder; - } - - public String getMenuType() { - return menuType; - } - - public void setMenuType(String menuType) { - this.menuType = menuType; - } - - public Boolean getEnabled() { - return enabled; - } - - public void setEnabled(Boolean enabled) { - this.enabled = enabled; - } - - @Override - public String toString() { - return "MenuInfo{" + - "menuId='" + menuId + '\'' + - ", menuName='" + menuName + '\'' + - ", menuDescription='" + menuDescription + '\'' + - ", parentMenuId='" + parentMenuId + '\'' + - ", menuPath='" + menuPath + '\'' + - ", menuIcon='" + menuIcon + '\'' + - ", menuOrder=" + menuOrder + - ", menuType='" + menuType + '\'' + - ", enabled=" + enabled + - '}'; - } - } -} + @NotNull + private String menuId; + + private String parentMenuId; + + @JsonProperty("menuName") + private String menuNameCode; + + private String url; + + private String iconUrl; + + private String en; + private String zh; + private boolean enable; + private List roleScneMap; + private int weight; +} \ No newline at end of file diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/PageResult.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/PageResult.java deleted file mode 100644 index 8e2086b..0000000 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/PageResult.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.terrabase.enterprise.api.dto; - -import java.util.List; - -/** - * 分页结果对象 - * 用于分页查询功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ -public class PageResult { - - /** - * 数据列表 - */ - private List records; - - /** - * 总记录数 - */ - private Long total; - - /** - * 当前页码 - */ - private Integer pageNum; - - /** - * 每页大小 - */ - private Integer pageSize; - - /** - * 总页数 - */ - private Integer totalPages; - - /** - * 是否有下一页 - */ - private Boolean hasNext; - - /** - * 是否有上一页 - */ - private Boolean hasPrevious; - - public PageResult() {} - - public PageResult(List records, Long total, Integer pageNum, Integer pageSize) { - this.records = records; - this.total = total; - this.pageNum = pageNum; - this.pageSize = pageSize; - this.totalPages = (int) Math.ceil((double) total / pageSize); - this.hasNext = pageNum < totalPages; - this.hasPrevious = pageNum > 1; - } - - public List getRecords() { - return records; - } - - public void setRecords(List records) { - this.records = records; - } - - public Long getTotal() { - return total; - } - - public void setTotal(Long total) { - this.total = total; - } - - public Integer getPageNum() { - return pageNum; - } - - public void setPageNum(Integer pageNum) { - this.pageNum = pageNum; - } - - public Integer getPageSize() { - return pageSize; - } - - public void setPageSize(Integer pageSize) { - this.pageSize = pageSize; - } - - public Integer getTotalPages() { - return totalPages; - } - - public void setTotalPages(Integer totalPages) { - this.totalPages = totalPages; - } - - public Boolean getHasNext() { - return hasNext; - } - - public void setHasNext(Boolean hasNext) { - this.hasNext = hasNext; - } - - public Boolean getHasPrevious() { - return hasPrevious; - } - - public void setHasPrevious(Boolean hasPrevious) { - this.hasPrevious = hasPrevious; - } - - @Override - public String toString() { - return "PageResult{" + - "records=" + records + - ", total=" + total + - ", pageNum=" + pageNum + - ", pageSize=" + pageSize + - ", totalPages=" + totalPages + - ", hasNext=" + hasNext + - ", hasPrevious=" + hasPrevious + - '}'; - } -} - - - - diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Plaintext.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Plaintext.java new file mode 100644 index 0000000..638767b --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Plaintext.java @@ -0,0 +1,14 @@ +package com.terrabase.enterprise.api.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Plaintext { + @ToString.Exclude + @JsonProperty("plain") + private String plain; +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RegisterCertificate.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RegisterCertificate.java deleted file mode 100644 index bff93d4..0000000 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RegisterCertificate.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.terrabase.enterprise.api.dto; - -/** - * 证书注册对象 - * 用于证书注册功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ -public class RegisterCertificate { - - /** - * 证书ID - */ - private String certificateId; - - /** - * 证书名称 - */ - private String certificateName; - - /** - * 证书类型 - */ - private String certificateType; - - /** - * 证书用途 - */ - private String certificateUsage; - - /** - * 证书描述 - */ - private String certificateDescription; - - /** - * 有效期(天数) - */ - private Integer validityDays; - - public RegisterCertificate() {} - - public RegisterCertificate(String certificateId, String certificateName, String certificateType) { - this.certificateId = certificateId; - this.certificateName = certificateName; - this.certificateType = certificateType; - } - - public String getCertificateId() { - return certificateId; - } - - public void setCertificateId(String certificateId) { - this.certificateId = certificateId; - } - - public String getCertificateName() { - return certificateName; - } - - public void setCertificateName(String certificateName) { - this.certificateName = certificateName; - } - - public String getCertificateType() { - return certificateType; - } - - public void setCertificateType(String certificateType) { - this.certificateType = certificateType; - } - - public String getCertificateUsage() { - return certificateUsage; - } - - public void setCertificateUsage(String certificateUsage) { - this.certificateUsage = certificateUsage; - } - - public String getCertificateDescription() { - return certificateDescription; - } - - public void setCertificateDescription(String certificateDescription) { - this.certificateDescription = certificateDescription; - } - - public Integer getValidityDays() { - return validityDays; - } - - public void setValidityDays(Integer validityDays) { - this.validityDays = validityDays; - } - - @Override - public String toString() { - return "RegisterCertificate{" + - "certificateId='" + certificateId + '\'' + - ", certificateName='" + certificateName + '\'' + - ", certificateType='" + certificateType + '\'' + - ", certificateUsage='" + certificateUsage + '\'' + - ", certificateDescription='" + certificateDescription + '\'' + - ", validityDays=" + validityDays + - '}'; - } -} - - - - diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/ResourceGroup.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/ResourceGroup.java new file mode 100644 index 0000000..3adc860 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/ResourceGroup.java @@ -0,0 +1,9 @@ +package com.terrabase.enterprise.api.dto; + +public record ResourceGroup(String id, String parentId, String name, String description) { + private static final String PUBLIC_GROUP_ID = "000"; + + public static ResourceGroup buildPublicGroup() { + return new ResourceGroup(PUBLIC_GROUP_ID, null, "publicGroup", "systemPublicGroup"); + } +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleI18nInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleI18nInfo.java new file mode 100644 index 0000000..fd025ee --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleI18nInfo.java @@ -0,0 +1,34 @@ +package com.terrabase.enterprise.api.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.*; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RoleI18nInfo { + /** + * 角色名 + */ + private String name; + + /** + * 角色关键字 + */ + @NotNull + private String code; + + /** + * 语言 + */ + @NotNull + private String language; + + /** + * 角色的描述内容 + */ + @NotNull + private String content; +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleRegister.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleRegister.java deleted file mode 100644 index 77a56a6..0000000 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleRegister.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.terrabase.enterprise.api.dto; - -/** - * 角色注册对象 - * 用于角色注册功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ -public class RoleRegister { - - /** - * 角色ID - */ - private String roleId; - - /** - * 角色名称 - */ - private String roleName; - - /** - * 角色描述 - */ - private String roleDescription; - - /** - * 角色类型 - */ - private String roleType; - - /** - * 权限列表 - */ - private String[] permissions; - - /** - * 应用场景 - */ - private String applicationScenario; - - public RoleRegister() {} - - public RoleRegister(String roleId, String roleName, String roleDescription) { - this.roleId = roleId; - this.roleName = roleName; - this.roleDescription = roleDescription; - } - - public String getRoleId() { - return roleId; - } - - public void setRoleId(String roleId) { - this.roleId = roleId; - } - - public String getRoleName() { - return roleName; - } - - public void setRoleName(String roleName) { - this.roleName = roleName; - } - - public String getRoleDescription() { - return roleDescription; - } - - public void setRoleDescription(String roleDescription) { - this.roleDescription = roleDescription; - } - - public String getRoleType() { - return roleType; - } - - public void setRoleType(String roleType) { - this.roleType = roleType; - } - - public String[] getPermissions() { - return permissions; - } - - public void setPermissions(String[] permissions) { - this.permissions = permissions; - } - - public String getApplicationScenario() { - return applicationScenario; - } - - public void setApplicationScenario(String applicationScenario) { - this.applicationScenario = applicationScenario; - } - - @Override - public String toString() { - return "RoleRegister{" + - "roleId='" + roleId + '\'' + - ", roleName='" + roleName + '\'' + - ", roleDescription='" + roleDescription + '\'' + - ", roleType='" + roleType + '\'' + - ", applicationScenario='" + applicationScenario + '\'' + - '}'; - } -} - - - - diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleRegisterInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleRegisterInfo.java new file mode 100644 index 0000000..af4a6c8 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleRegisterInfo.java @@ -0,0 +1,41 @@ +package com.terrabase.enterprise.api.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.*; +import org.hibernate.validator.constraints.Length; + +@Setter +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RoleRegisterInfo { + /** + * 角色名 + */ + @Length(max = 64) + @NotNull + private String name; + + /** + * 角色名国际化code代码 + */ + @NotNull + private String nameCode; + + /** + * 角色描述国际化code + */ + private String description; + + /** + * 是否可以创建此类用户 0 不支持 1 支持 + */ + private boolean creatable; + + /** + * 角色支持创建的账户登录类型,0-未定义 1-人机 2-机机 3-人机和机机 4-内部登录 + * (以二进制具体为是否为1代表支持某类型,比如001表示人机,010表示机机,100表示内部,011表示人机和机机) + */ + private Integer supportLoginType; +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleScenInfo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleScenInfo.java new file mode 100644 index 0000000..c3210cf --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/RoleScenInfo.java @@ -0,0 +1,22 @@ +package com.terrabase.enterprise.api.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class RoleScenInfo { + @JsonProperty("menuId") + private String menuId; + + @JsonProperty("roleName") + private String roleName; + + @JsonProperty("scenId") + private String scenId; +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Subscribe.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Subscribe.java deleted file mode 100644 index 85ea387..0000000 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/dto/Subscribe.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.terrabase.enterprise.api.dto; - -/** - * 订阅信息对象 - * 用于时间配置变更事件订阅功能的数据传输对象 - * - * @author Terrabase Team - * @version 1.0.0 - */ -public class Subscribe { - - /** - * 订阅ID - */ - private String subscribeId; - - /** - * 服务名称 - */ - private String serviceName; - - /** - * 通知地址 - */ - private String notifyAddress; - - /** - * 事件类型 - */ - private String eventType; - - /** - * 订阅状态 - */ - private String status; - - /** - * 创建时间 - */ - private Long createTime; - - public Subscribe() {} - - public Subscribe(String subscribeId, String serviceName, String notifyAddress) { - this.subscribeId = subscribeId; - this.serviceName = serviceName; - this.notifyAddress = notifyAddress; - this.createTime = System.currentTimeMillis(); - } - - public String getSubscribeId() { - return subscribeId; - } - - public void setSubscribeId(String subscribeId) { - this.subscribeId = subscribeId; - } - - public String getServiceName() { - return serviceName; - } - - public void setServiceName(String serviceName) { - this.serviceName = serviceName; - } - - public String getNotifyAddress() { - return notifyAddress; - } - - public void setNotifyAddress(String notifyAddress) { - this.notifyAddress = notifyAddress; - } - - public String getEventType() { - return eventType; - } - - public void setEventType(String eventType) { - this.eventType = eventType; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public Long getCreateTime() { - return createTime; - } - - public void setCreateTime(Long createTime) { - this.createTime = createTime; - } - - @Override - public String toString() { - return "Subscribe{" + - "subscribeId='" + subscribeId + '\'' + - ", serviceName='" + serviceName + '\'' + - ", notifyAddress='" + notifyAddress + '\'' + - ", eventType='" + eventType + '\'' + - ", status='" + status + '\'' + - ", createTime=" + createTime + - '}'; - } -} - - - - diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/request/GetEventsParams.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/request/GetEventsParams.java new file mode 100644 index 0000000..e502034 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/request/GetEventsParams.java @@ -0,0 +1,101 @@ +package com.terrabase.enterprise.api.request; + +import jakarta.validation.constraints.*; +import lombok.*; +import org.hibernate.validator.constraints.Length; + +import java.util.List; + +@Setter +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class GetEventsParams { + private @Size( + max = 128 + ) String alarmName; + + private @Positive Long startTime; + + private @Positive Long endTime; + + private @NotBlank @Pattern( + regexp = "warning|minor|major|critical" + ) String severity; + + private @Pattern( + regexp = "^(?! )[_\\- .a-zA-Z0-9]+(? categorys; + + private String cabinetId; + + private @Size( + max = 512 + ) String devUrl; + + private @Min(1L) Integer pageNum; + + private @Max(2000L) Integer pageSize; + + private boolean specifyStartLine; +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/request/LogAttributeVo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/request/LogAttributeVo.java new file mode 100644 index 0000000..54aff3a --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/request/LogAttributeVo.java @@ -0,0 +1,30 @@ +package com.terrabase.enterprise.api.request; + +import lombok.*; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LogAttributeVo { + private long sn; + + private String logType; + + private String username; + + private String operation; + + private String source; + + private String terminal; + + private String result; + + private String flag; + + private String paramType; + + private String detail; +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/request/RegisterEventDefineReq.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/request/RegisterEventDefineReq.java new file mode 100644 index 0000000..ab0d1d1 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/request/RegisterEventDefineReq.java @@ -0,0 +1,33 @@ +package com.terrabase.enterprise.api.request; + +import com.terrabase.enterprise.api.dto.EventDefine; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +@Setter +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class RegisterEventDefineReq { + private static final int MAX_SIZE = 1000; + + private @NotBlank String serviceName; + + private String ServiceEn; + + private String ServiceZh; + + private boolean deleteAll = false; + + private @Valid @NotEmpty @Size( + max=1000 + ) List eventDefines; +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/request/RoleRegisterVo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/request/RoleRegisterVo.java new file mode 100644 index 0000000..f20f4bc --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/request/RoleRegisterVo.java @@ -0,0 +1,20 @@ +package com.terrabase.enterprise.api.request; + +import com.terrabase.enterprise.api.dto.RoleI18nInfo; +import com.terrabase.enterprise.api.dto.RoleRegisterInfo; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class RoleRegisterVo { + private List roleRegisterInfos; + + private List roleI18nInfos; +} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/response/ResultVo.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/response/ResultVo.java new file mode 100644 index 0000000..8a49d72 --- /dev/null +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/response/ResultVo.java @@ -0,0 +1,109 @@ +package com.terrabase.enterprise.api.response; + +/** + * 通用响应结果包装类 + * 用于统一API响应格式 + * + * @param 响应数据类型 + * @author Yehong Pan + * @version 1.0.0 + */ +public class ResultVo { + + /** + * 响应状态码 + */ + private String code; + + /** + * 响应消息 + */ + private String msg; + + /** + * 响应数据 + */ + private T data; + + public ResultVo() {} + + public ResultVo(String code, String msg) { + this.code = code; + this.msg = msg; + } + + public ResultVo(String code, String msg, T data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + /** + * 成功响应 + */ + public static ResultVo success() { + return new ResultVo<>("200", "操作成功"); + } + + /** + * 成功响应带数据 + */ + public static ResultVo success(T data) { + return new ResultVo<>("200", "操作成功", data); + } + + /** + * 成功响应带消息和数据 + */ + public static ResultVo success(String msg, T data) { + return new ResultVo<>("200", msg, data); + } + + /** + * 失败响应 + */ + public static ResultVo error(String code, String msg) { + return new ResultVo<>(code, msg); + } + + /** + * 失败响应带数据 + */ + public static ResultVo error(String code, String msg, T data) { + return new ResultVo<>(code, msg, data); + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + @Override + public String toString() { + return "ResultVo{" + + "code='" + code + '\'' + + ", msg='" + msg + '\'' + + ", data=" + data + + '}'; + } +} + diff --git a/enterprise-impl-commercial/pom.xml b/enterprise-impl-commercial/pom.xml index 80fecb7..236b836 100644 --- a/enterprise-impl-commercial/pom.xml +++ b/enterprise-impl-commercial/pom.xml @@ -24,6 +24,20 @@ + + + com.terrabase + sdk-config + ${project.version} + + + + + com.terrabase + business-app + ${project.version} + + com.terrabase @@ -55,6 +69,23 @@ spring-boot-starter-webflux + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + com.fasterxml.jackson.core @@ -87,6 +118,13 @@ test + + org.projectlombok + lombok + 1.18.32 + provided + + junit junit diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCertificateServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCertificateServiceImpl.java index f160405..7810121 100644 --- a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCertificateServiceImpl.java +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCertificateServiceImpl.java @@ -2,24 +2,21 @@ import com.terrabase.enterprise.api.CertificateService; import com.terrabase.enterprise.api.dto.*; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.enterprise.impl.commercial.client.CertFeignClient; +import com.terrabase.enterprise.impl.commercial.client.LicenseClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.*; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.client.RestClientException; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; /** * 商业版证书管理服务实现 * 集成商业组件实现证书管理功能 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @Service @@ -27,375 +24,58 @@ public class CommercialCertificateServiceImpl implements CertificateService { private static final Logger logger = LoggerFactory.getLogger(CommercialCertificateServiceImpl.class); - private final AtomicBoolean running = new AtomicBoolean(false); - - private final RestTemplate restTemplate; - - private String omsBaseUrl; - private int timeout; - - public CommercialCertificateServiceImpl(RestTemplate restTemplate) { - this.restTemplate = restTemplate; - // 设置默认值 - this.omsBaseUrl = "http://localhost:8081/api/"; - this.timeout = 30000; - } - - public CommercialCertificateServiceImpl(RestTemplate restTemplate, String omsBaseUrl, int timeout) { - this.restTemplate = restTemplate; - this.omsBaseUrl = omsBaseUrl; - this.timeout = timeout; - } - - @Override - public String getServiceName() { - return "Commercial Certificate Service"; - } - - @Override - public String getServiceVersion() { - return "1.0.0-commercial"; - } - - @Override - public String getServiceType() { - return "commercial"; - } - - @Override - public String getHealthStatus() { - if (!running.get()) { - return "服务未运行"; - } - - return String.format("商业版证书管理服务健康状态: 正常 (版本: %s, 类型: %s)", - getServiceVersion(), getServiceType()); - } - - @Override - public void start() { - if (running.compareAndSet(false, true)) { - logger.info("商业版证书管理服务已启动"); - } else { - logger.warn("商业版证书管理服务已经在运行中"); - } - } - - @Override - public void stop() { - if (running.compareAndSet(true, false)) { - logger.info("商业版证书管理服务已停止"); - } else { - logger.warn("商业版证书管理服务已经停止"); - } - } + @Autowired + private LicenseClient licenseClient; - @Override - public boolean isRunning() { - return running.get(); - } + @Autowired + private CertFeignClient certFeignClient; // ========== 证书管理相关接口实现 ========== @Override - public void registerCertificate(RegisterCertificate certificate) { - if (!running.get()) { - logger.warn("服务未运行,无法执行证书注册操作"); - return; - } - - if (certificate == null) { - logger.warn("证书注册对象不能为空"); - return; - } - - try { - logger.info("商业版执行证书注册: {}", certificate); - - // 构建请求参数 - Map requestBody = new HashMap<>(); - requestBody.put("certificateId", certificate.getCertificateId()); - requestBody.put("certificateName", certificate.getCertificateName()); - requestBody.put("certificateType", certificate.getCertificateType()); - requestBody.put("description", certificate.getCertificateDescription()); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); - - // 构建证书注册接口URL - String registerCertificateUrl = omsBaseUrl + "/framework/v1/certificate/action/register/type/internal"; - - // 调用REST接口进行证书注册 - ResponseEntity response = restTemplate.postForEntity(registerCertificateUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - logger.info("商业版REST接口证书注册成功 - 证书ID: {}, 证书名称: {}, 证书类型: {}", - certificate.getCertificateId(), certificate.getCertificateName(), certificate.getCertificateType()); - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口证书注册失败: {}", errorMsg); - } - } else { - logger.error("商业版REST接口证书注册失败,HTTP状态码: {}", response.getStatusCode()); - } - - } catch (RestClientException e) { - logger.error("商业版REST接口证书注册调用异常", e); - } catch (Exception e) { - logger.error("商业版证书注册失败: {}", certificate, e); - } - } - - @Override - public void importOrUpdateCertificate(CertificateDetail certificate) { - if (!running.get()) { - logger.warn("服务未运行,无法执行证书导入/更新操作"); - return; - } - - if (certificate == null) { - logger.warn("证书详细信息对象不能为空"); - return; - } - + public ResultVo> listCertificateServiceList() { try { - logger.info("商业版执行证书导入/更新,证书ID: {}", certificate.getCertificateId()); - - // 构建请求参数 - Map requestBody = new HashMap<>(); - requestBody.put("certificateId", certificate.getCertificateId()); - requestBody.put("certificateFormat", certificate.getCertificateFormat()); - requestBody.put("certificateContent", certificate.getCertificateContent()); - requestBody.put("privateKey", certificate.getPrivateKeyContent()); - requestBody.put("password", certificate.getPassword()); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); - - // 构建证书导入/更新接口URL - String importCertificateUrl = omsBaseUrl + "/framework/v1/certificate/action/import/om"; - - // 调用REST接口进行证书导入/更新 - ResponseEntity response = restTemplate.postForEntity(importCertificateUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - logger.info("商业版REST接口证书导入/更新成功 - 证书ID: {}, 证书格式: {}", - certificate.getCertificateId(), certificate.getCertificateFormat()); - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口证书导入/更新失败: {}", errorMsg); - } - } else { - logger.error("商业版REST接口证书导入/更新失败,HTTP状态码: {}", response.getStatusCode()); - } - - } catch (RestClientException e) { - logger.error("商业版REST接口证书导入/更新调用异常", e); - } catch (Exception e) { - logger.error("商业版证书导入/更新失败: {}", certificate, e); - } - } - - @Override - public void importTrustedCaCertificate(CaCertificate caCertificate) { - if (!running.get()) { - logger.warn("服务未运行,无法执行CA证书导入操作"); - return; - } + logger.info("商业版执行证书信息查询"); - if (caCertificate == null) { - logger.warn("CA证书对象不能为空"); - return; - } + // 使用 Feign 客户端调用远程服务 + ResultVo> result = certFeignClient.listCertificateServiceList(); - try { - logger.info("商业版执行CA证书导入: {}", caCertificate); - - // 构建请求参数 - Map requestBody = new HashMap<>(); - requestBody.put("caCertificateId", caCertificate.getCaCertificateId()); - requestBody.put("caCertificateName", caCertificate.getCaCertificateName()); - requestBody.put("issuer", caCertificate.getIssuer()); - requestBody.put("certificateContent", caCertificate.getCaCertificateContent()); - requestBody.put("validFrom", caCertificate.getValidFrom()); - requestBody.put("validTo", caCertificate.getValidTo()); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); - - // 构建CA证书导入接口URL - String importCaCertificateUrl = omsBaseUrl + "/framework/v1/certificate/action/import"; - - // 调用REST接口进行CA证书导入 - ResponseEntity response = restTemplate.postForEntity(importCaCertificateUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - logger.info("商业版REST接口CA证书导入成功 - CA证书ID: {}, CA证书名称: {}, 颁发者: {}", - caCertificate.getCaCertificateId(), caCertificate.getCaCertificateName(), caCertificate.getIssuer()); - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口CA证书导入失败: {}", errorMsg); - } + if ("200".equals(result.getCode())) { + logger.info("商业版Feign客户端证书信息查询成功,查询到证书数量: {}", + result.getData() != null ? result.getData().size() : 0); } else { - logger.error("商业版REST接口CA证书导入失败,HTTP状态码: {}", response.getStatusCode()); + logger.error("商业版Feign客户端证书信息查询失败: {}", result.getMsg()); } - } catch (RestClientException e) { - logger.error("商业版REST接口CA证书导入调用异常", e); - } catch (Exception e) { - logger.error("商业版CA证书导入失败: {}", caCertificate, e); - } - } - - @Override - public List queryAllCertificates() { - if (!running.get()) { - logger.warn("服务未运行,无法执行证书信息查询操作"); - return null; - } + return result; - try { - logger.info("商业版执行证书信息查询"); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity requestEntity = new HttpEntity<>(headers); - - // 构建证书信息查询接口URL - String queryCertificatesUrl = omsBaseUrl + "/framework/v1/certificate/action/cert/collect"; - - // 调用REST接口进行证书信息查询 - ResponseEntity response = restTemplate.exchange(queryCertificatesUrl, HttpMethod.GET, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - @SuppressWarnings("unchecked") - List> certificateList = (List>) responseBody.get("certificateList"); - - List certificates = new java.util.ArrayList<>(); - if (certificateList != null) { - for (Map certMap : certificateList) { - CertCollectInfo cert = new CertCollectInfo( - (String) certMap.get("certificateId"), - (String) certMap.get("certificateName"), - (String) certMap.get("certificateType") - ); - cert.setCertificateStatus((String) certMap.get("certificateStatus")); - cert.setValidFrom((Long) certMap.get("validFrom")); - cert.setValidTo((Long) certMap.get("validTo")); - cert.setIssuer((String) certMap.get("issuer")); - cert.setSubject((String) certMap.get("subject")); - certificates.add(cert); - } - } - - logger.info("商业版REST接口证书信息查询成功,查询到证书数量: {}", certificates.size()); - return certificates; - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口证书信息查询失败: {}", errorMsg); - return null; - } - } else { - logger.error("商业版REST接口证书信息查询失败,HTTP状态码: {}", response.getStatusCode()); - return null; - } - - } catch (RestClientException e) { - logger.error("商业版REST接口证书信息查询调用异常", e); - return null; } catch (Exception e) { logger.error("商业版证书信息查询失败", e); - return null; + return ResultVo.error("500", "证书信息查询失败: " + e.getMessage()); } } @Override - public LicenseInfo queryLicenseInfo() { - if (!running.get()) { - logger.warn("服务未运行,无法执行License信息查询操作"); - return null; - } - + public ResultVo getLicenseInfo() { try { logger.info("商业版执行License信息查询"); - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); + // 使用LicenseClient调用远程服务 + ResultVo result = licenseClient.getLicenseInfo(); - HttpEntity requestEntity = new HttpEntity<>(headers); - - // 构建License信息查询接口URL - String queryLicenseUrl = omsBaseUrl + "/framework/v1/license/info"; - - // 调用REST接口进行License信息查询 - ResponseEntity response = restTemplate.exchange(queryLicenseUrl, HttpMethod.GET, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - LicenseInfo licenseInfo = new LicenseInfo( - (String) responseBody.get("licenseId"), - (String) responseBody.get("licenseType") - ); - licenseInfo.setValidFrom((Long) responseBody.get("validFrom")); - licenseInfo.setValidTo((Long) responseBody.get("validTo")); - licenseInfo.setFeatureModules((String[]) responseBody.get("featureModules")); - licenseInfo.setUserLimit((Integer) responseBody.get("userLimit")); - licenseInfo.setConcurrentLimit((Integer) responseBody.get("concurrentLimit")); - licenseInfo.setStorageLimit((Long) responseBody.get("storageLimit")); - licenseInfo.setLicenseStatus((String) responseBody.get("licenseStatus")); - licenseInfo.setRemainingDays((Integer) responseBody.get("remainingDays")); - - logger.info("商业版REST接口License信息查询成功 - License ID: {}, License类型: {}, 剩余天数: {}", - licenseInfo.getLicenseId(), licenseInfo.getLicenseType(), licenseInfo.getRemainingDays()); - - return licenseInfo; - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口License信息查询失败: {}", errorMsg); - return null; - } + if ("200".equals(result.getCode())) { + logger.info("商业版License信息查询成功 - 状态: {}, SBOM模块数量: {}", + result.getData().getStatus(), + result.getData().getSboms() != null ? result.getData().getSboms().size() : 0); } else { - logger.error("商业版REST接口License信息查询失败,HTTP状态码: {}", response.getStatusCode()); - return null; + logger.error("商业版License信息查询失败: {}", result.getMsg()); } - - } catch (RestClientException e) { - logger.error("商业版REST接口License信息查询调用异常", e); - return null; + + return result; + } catch (Exception e) { logger.error("商业版License信息查询失败", e); - return null; + return ResultVo.error("500", "License信息查询失败: " + e.getMessage()); } } } diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCryptoServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCryptoServiceImpl.java index 44b214e..1adf914 100644 --- a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCryptoServiceImpl.java +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialCryptoServiceImpl.java @@ -2,23 +2,21 @@ import com.terrabase.enterprise.api.CryptoService; import com.terrabase.enterprise.api.CryptoAlgorithm; +import com.terrabase.enterprise.api.dto.Ciphertext; +import com.terrabase.enterprise.api.dto.Plaintext; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.enterprise.impl.commercial.client.CryptoFeighClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.*; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.client.RestClientException; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; +import java.util.UUID; /** * 商业版加解密服务实现 * 集成商业组件实现加解密功能 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @Service @@ -26,192 +24,71 @@ public class CommercialCryptoServiceImpl implements CryptoService { private static final Logger logger = LoggerFactory.getLogger(CommercialCryptoServiceImpl.class); - private final AtomicBoolean running = new AtomicBoolean(false); - - private final RestTemplate restTemplate; - - private String omsBaseUrl; - private int timeout; - - public CommercialCryptoServiceImpl(RestTemplate restTemplate) { - this.restTemplate = restTemplate; - // 设置默认值 - this.omsBaseUrl = "http://localhost:8081/api/"; - this.timeout = 30000; - } - - public CommercialCryptoServiceImpl(RestTemplate restTemplate, String omsBaseUrl, int timeout) { - this.restTemplate = restTemplate; - this.omsBaseUrl = omsBaseUrl; - this.timeout = timeout; - } - - @Override - public String getServiceName() { - return "Commercial Crypto Service"; - } - - @Override - public String getServiceVersion() { - return "1.0.0-commercial"; - } - - @Override - public String getServiceType() { - return "commercial"; - } - - @Override - public String getHealthStatus() { - if (!running.get()) { - return "服务未运行"; - } - - return String.format("商业版加解密服务健康状态: 正常 (版本: %s, 类型: %s)", - getServiceVersion(), getServiceType()); - } + private final CryptoFeighClient cryptoFeighClient; - @Override - public void start() { - if (running.compareAndSet(false, true)) { - logger.info("商业版加解密服务已启动"); - } else { - logger.warn("商业版加解密服务已经在运行中"); - } - } - - @Override - public void stop() { - if (running.compareAndSet(true, false)) { - logger.info("商业版加解密服务已停止"); - } else { - logger.warn("商业版加解密服务已经停止"); - } - } - - @Override - public boolean isRunning() { - return running.get(); + public CommercialCryptoServiceImpl(CryptoFeighClient cryptoFeighClient) { + this.cryptoFeighClient = cryptoFeighClient; } + @Override - public String encrypt(String plaintext, CryptoAlgorithm algorithm) { - if (!running.get()) { - return "服务未运行,无法执行加密操作"; - } + public String encrypt(String plaintext, CryptoAlgorithm algorithm, String username) { if (plaintext == null || plaintext.trim().isEmpty()) { return "明文数据不能为空"; } - if (algorithm == null) { - algorithm = CryptoAlgorithm.AES; // 默认使用AES - } - try { - logger.info("商业版执行数据加密,原文长度: {}, 算法: {}", plaintext.length(), algorithm.getAlgorithm()); - - // 构建请求参数 - Map requestBody = new HashMap<>(); - requestBody.put("plaintext", plaintext); - requestBody.put("algorithm", algorithm.getAlgorithm()); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); - - // 构建加密接口URL - String encryptUrl = omsBaseUrl + "/enterprise/encrypt"; - - // 调用REST接口进行加密 - ResponseEntity response = restTemplate.postForEntity(encryptUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map responseBody = response.getBody(); - String ciphertext = (String) responseBody.get("ciphertext"); - String status = (String) responseBody.get("status"); - - if ("success".equals(status) && ciphertext != null) { - logger.info("商业版REST接口加密成功,算法: {}", algorithm.getAlgorithm()); - return ciphertext; - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口加密失败: {}", errorMsg); - return "加密失败: " + (errorMsg != null ? errorMsg : "未知错误"); - } - } else { - logger.error("商业版REST接口加密失败,HTTP状态码: {}", response.getStatusCode()); - return "加密失败: HTTP请求失败,状态码: " + response.getStatusCode(); + logger.info("商业版执行数据加密,原文长度: {}, 用户: {}", plaintext.length(), username); + + // 生成UUID作为keyId + String keyId = UUID.randomUUID().toString(); + + // 调用Feign客户端进行加密 + ResultVo result = cryptoFeighClient.encrypt(keyId, new Plaintext(plaintext), username); + + if (result != null && "200".equals(result.getCode()) && result.getData() != null) { + String returnedKeyId = result.getData().getKeyId(); + logger.info("商业版Feign加密成功,返回keyId: {}", returnedKeyId); + return returnedKeyId; } - } catch (RestClientException e) { - logger.error("商业版REST接口加密调用异常,算法: {}", algorithm, e); - return "加密失败: REST接口调用异常 - " + e.getMessage(); + logger.error("商业版Feign加密失败: {}", (result != null ? result.getMsg() : "结果为空")); + return "加密失败: " + (result != null ? result.getMsg() : "结果为空"); + } catch (Exception e) { - logger.error("商业版加密失败,算法: {}", algorithm, e); + logger.error("商业版加密失败", e); return "加密失败: " + e.getMessage(); } } @Override - public String decrypt(String ciphertext, CryptoAlgorithm algorithm) { - if (!running.get()) { - return "服务未运行,无法执行解密操作"; - } + public String decrypt(String ciphertext, CryptoAlgorithm algorithm, String username) { if (ciphertext == null || ciphertext.trim().isEmpty()) { return "密文数据不能为空"; } - if (algorithm == null) { - algorithm = CryptoAlgorithm.AES; // 默认使用AES - } - try { - logger.info("商业版执行数据解密,密文长度: {}, 算法: {}", ciphertext.length(), algorithm.getAlgorithm()); - - // 构建请求参数 - Map requestBody = new HashMap<>(); - requestBody.put("ciphertext", ciphertext); - requestBody.put("algorithm", algorithm.getAlgorithm()); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); - - // 构建解密接口URL - String decryptUrl = omsBaseUrl + "/enterprise/decrypt"; - - // 调用REST接口进行解密 - ResponseEntity response = restTemplate.postForEntity(decryptUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map responseBody = response.getBody(); - String plaintext = (String) responseBody.get("plaintext"); - String status = (String) responseBody.get("status"); - - if ("success".equals(status) && plaintext != null) { - logger.info("商业版REST接口解密成功,算法: {}", algorithm.getAlgorithm()); - return plaintext; - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口解密失败: {}", errorMsg); - return "解密失败: " + (errorMsg != null ? errorMsg : "未知错误"); - } - } else { - logger.error("商业版REST接口解密失败,HTTP状态码: {}", response.getStatusCode()); - return "解密失败: HTTP请求失败,状态码: " + response.getStatusCode(); + logger.info("商业版执行数据解密,密文长度: {}, 用户: {}", ciphertext.length(), username); + + // ciphertext在新语义下为keyId + String keyId = ciphertext; + + // 调用Feign客户端进行解密 + ResultVo result = cryptoFeighClient.decrypt(keyId, username); + + if (result != null && "200".equals(result.getCode()) && result.getData() != null) { + String plain = result.getData().getPlain(); + logger.info("商业版Feign解密成功,返回明文长度: {}", (plain != null ? plain.length() : 0)); + return plain; } - } catch (RestClientException e) { - logger.error("商业版REST接口解密调用异常,算法: {}", algorithm, e); - return "解密失败: REST接口调用异常 - " + e.getMessage(); + logger.error("商业版Feign解密失败: {}", (result != null ? result.getMsg() : "结果为空")); + return "解密失败: " + (result != null ? result.getMsg() : "结果为空"); + } catch (Exception e) { - logger.error("商业版解密失败,算法: {}", algorithm, e); + logger.error("商业版解密失败", e); return "解密失败: " + e.getMessage(); } } diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java index a2bd3ac..488b4bc 100644 --- a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java @@ -5,13 +5,12 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import java.util.concurrent.atomic.AtomicBoolean; /** * 商业版企业服务实现 * 提供企业级服务的基本功能,子服务通过JarLoadUtil独立管理 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @Service @@ -19,7 +18,6 @@ public class CommercialEnterpriseServiceImpl implements EnterpriseService { private static final Logger logger = LoggerFactory.getLogger(CommercialEnterpriseServiceImpl.class); - private final AtomicBoolean running = new AtomicBoolean(false); @Override public String getServiceName() { @@ -38,37 +36,9 @@ public String getServiceType() { @Override public String getHealthStatus() { - if (!running.get()) { - return "服务未运行"; - } - return String.format("商业版企业服务健康状态: 正常 (版本: %s, 类型: %s)", getServiceVersion(), getServiceType()); } - @Override - public void start() { - if (running.compareAndSet(false, true)) { - logger.info("商业版企业服务已启动"); - // 注意:子服务现在通过JarLoadUtil独立管理,不再在此处启动 - } else { - logger.warn("商业版企业服务已经在运行中"); - } - } - - @Override - public void stop() { - if (running.compareAndSet(true, false)) { - logger.info("商业版企业服务已停止"); - // 注意:子服务现在通过JarLoadUtil独立管理,不再在此处停止 - } else { - logger.warn("商业版企业服务已经停止"); - } - } - - @Override - public boolean isRunning() { - return running.get(); - } } diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialLogManagementServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialLogManagementServiceImpl.java index b4e8fbb..b550cb4 100644 --- a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialLogManagementServiceImpl.java +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialLogManagementServiceImpl.java @@ -2,23 +2,21 @@ import com.terrabase.enterprise.api.LogManagementService; import com.terrabase.enterprise.api.dto.*; +import com.terrabase.enterprise.api.request.LogAttributeVo; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.enterprise.impl.commercial.client.OperateLogFeignClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.*; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.client.RestClientException; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; +import java.util.List; /** * 商业版日志管理服务实现 * 集成商业组件实现日志管理功能 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @Service @@ -26,185 +24,63 @@ public class CommercialLogManagementServiceImpl implements LogManagementService private static final Logger logger = LoggerFactory.getLogger(CommercialLogManagementServiceImpl.class); - private final AtomicBoolean running = new AtomicBoolean(false); - - private final RestTemplate restTemplate; - - private String omsBaseUrl; - private int timeout; - - public CommercialLogManagementServiceImpl(RestTemplate restTemplate) { - this.restTemplate = restTemplate; - // 设置默认值 - this.omsBaseUrl = "http://localhost:8081/api/"; - this.timeout = 30000; - } - - public CommercialLogManagementServiceImpl(RestTemplate restTemplate, String omsBaseUrl, int timeout) { - this.restTemplate = restTemplate; - this.omsBaseUrl = omsBaseUrl; - this.timeout = timeout; - } - - @Override - public String getServiceName() { - return "Commercial Log Management Service"; - } - - @Override - public String getServiceVersion() { - return "1.0.0-commercial"; - } - - @Override - public String getServiceType() { - return "commercial"; - } - - @Override - public String getHealthStatus() { - if (!running.get()) { - return "服务未运行"; - } - - return String.format("商业版日志管理服务健康状态: 正常 (版本: %s, 类型: %s)", - getServiceVersion(), getServiceType()); - } - - @Override - public void start() { - if (running.compareAndSet(false, true)) { - logger.info("商业版日志管理服务已启动"); - } else { - logger.warn("商业版日志管理服务已经在运行中"); - } - } + @Autowired + private OperateLogFeignClient operateLogFeignClient; @Override - public void stop() { - if (running.compareAndSet(true, false)) { - logger.info("商业版日志管理服务已停止"); - } else { - logger.warn("商业版日志管理服务已经停止"); - } - } - - @Override - public boolean isRunning() { - return running.get(); - } - - // ========== 日志与监控相关接口实现 ========== - - @Override - public void registerOperateLogI18N(LogI18NS logI18NS) { - if (!running.get()) { - logger.warn("服务未运行,无法执行操作日志国际化信息注册操作"); - return; - } - - if (logI18NS == null || logI18NS.getLogI18NList() == null) { - logger.warn("操作日志国际化信息对象不能为空"); - return; + public ResultVo<Integer> registerLogs(List<LogAttributeVo> logs) { + if (logs == null || logs.isEmpty()) { + logger.warn("审计日志对象不能为空"); + return ResultVo.error("400", "审计日志对象不能为空"); } try { - logger.info("商业版执行操作日志国际化信息注册,国际化信息数量: {}", logI18NS.getLogI18NList().size()); - - // 构建请求参数 - Map<String, Object> requestBody = new HashMap<>(); - requestBody.put("logI18NList", logI18NS.getLogI18NList()); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); + logger.info("商业版执行审计日志上报,日志数量: {}", logs.size()); - HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers); + // 使用 Feign 客户端调用远程服务 + ResultVo<Integer> result = operateLogFeignClient.registerLogs(logs); - // 构建操作日志国际化信息注册接口URL - String registerLogI18NUrl = omsBaseUrl + "/framework/v1/log/operateLogs/actions/register/internation/internal"; - - // 调用REST接口进行操作日志国际化信息注册 - ResponseEntity<Map> response = restTemplate.postForEntity(registerLogI18NUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map<String, Object> responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - logger.info("商业版REST接口操作日志国际化信息注册成功,国际化信息数量: {}", logI18NS.getLogI18NList().size()); - for (LogI18NS.LogI18NInfo logI18NInfo : logI18NS.getLogI18NList()) { - logger.info("商业版操作日志国际化信息注册成功 - 操作代码: {}, 操作名称: {}, 默认语言: {}", - logI18NInfo.getOperationCode(), logI18NInfo.getOperationName(), logI18NInfo.getDefaultLanguage()); - } - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口操作日志国际化信息注册失败: {}", errorMsg); - } + if ("200".equals(result.getCode())) { + logger.info("商业版审计日志上报成功,日志数量: {}", result.getData()); + return result; } else { - logger.error("商业版REST接口操作日志国际化信息注册失败,HTTP状态码: {}", response.getStatusCode()); + logger.error("商业版审计日志上报失败: {}", result.getMsg()); + return ResultVo.error(result.getCode(), result.getMsg()); } - } catch (RestClientException e) { - logger.error("商业版REST接口操作日志国际化信息注册调用异常", e); } catch (Exception e) { - logger.error("商业版操作日志国际化信息注册失败: {}", logI18NS, e); + logger.error("商业版审计日志上报失败", e); + return ResultVo.error("500", "审计日志上报失败: " + e.getMessage()); } } @Override - public void reportOperateLog(Logs logs) { - if (!running.get()) { - logger.warn("服务未运行,无法执行操作日志上报操作"); - return; - } - - if (logs == null || logs.getLogList() == null) { - logger.warn("操作日志对象不能为空"); - return; + public ResultVo<Boolean> registryInternational(List<LogI18n> logI18ns) { + if (logI18ns == null || logI18ns.isEmpty()) { + logger.warn("审计日志国际化对象不能为空"); + return ResultVo.error("400", "审计日志国际化对象不能为空"); } try { - logger.info("商业版执行操作日志上报,日志数量: {}", logs.getLogList().size()); - - // 构建请求参数 - Map<String, Object> requestBody = new HashMap<>(); - requestBody.put("logList", logs.getLogList()); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); + logger.info("商业版执行审计日志国际化注册,国际化信息数量: {}", logI18ns.size()); - HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers); + // 使用 Feign 客户端调用远程服务 + ResultVo<Boolean> result = operateLogFeignClient.registryInternational(logI18ns); - // 构建操作日志上报接口URL - String reportLogUrl = omsBaseUrl + "/framework/v1/log/operateLogs/actions/register/internal"; - - // 调用REST接口进行操作日志上报 - ResponseEntity<Map> response = restTemplate.postForEntity(reportLogUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map<String, Object> responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - logger.info("商业版REST接口操作日志上报成功,日志数量: {}", logs.getLogList().size()); - for (Logs.LogInfo logInfo : logs.getLogList()) { - logger.info("商业版操作日志上报成功 - 日志ID: {}, 用户ID: {}, 操作类型: {}, 操作描述: {}", - logInfo.getLogId(), logInfo.getUserId(), logInfo.getOperationType(), logInfo.getOperationDescription()); - } - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口操作日志上报失败: {}", errorMsg); - } + if ("200".equals(result.getCode())) { + logger.info("商业版审计日志国际化注册成功: {}", result.getData()); + return result; } else { - logger.error("商业版REST接口操作日志上报失败,HTTP状态码: {}", response.getStatusCode()); + logger.error("商业版审计日志国际化注册失败: {}", result.getMsg()); + return ResultVo.error(result.getCode(), result.getMsg()); } - } catch (RestClientException e) { - logger.error("商业版REST接口操作日志上报调用异常", e); } catch (Exception e) { - logger.error("商业版操作日志上报失败: {}", logs, e); + logger.error("商业版审计日志国际化注册失败", e); + return ResultVo.error("500", "审计日志国际化注册失败: " + e.getMessage()); } } } + + + diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialMenuServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialMenuServiceImpl.java new file mode 100644 index 0000000..3b7d62c --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialMenuServiceImpl.java @@ -0,0 +1,57 @@ +package com.terrabase.enterprise.impl.commercial; + +import com.terrabase.enterprise.api.MenuService; +import com.terrabase.enterprise.api.dto.MenuRegisterInfo; +import com.terrabase.enterprise.api.dto.MenuInfo; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.enterprise.impl.commercial.client.MenuFeignClient; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +/** + * 商业版菜单管理服务实现 + * 提供菜单注册功能 + * + * @author Yehong Pan + * @version 1.0.0 + */ +@Service +public class CommercialMenuServiceImpl implements MenuService { + + private static final Logger logger = LoggerFactory.getLogger(CommercialMenuServiceImpl.class); + + @Autowired + private MenuFeignClient menuFeignClient; + + @Override + public void registerMenuInfo(MenuRegisterInfo menuRegisterInfo) { + if (menuRegisterInfo == null) { + logger.warn("菜单注册对象不能为空"); + return; + } + + try { + logger.info("商业版执行菜单注册 - 菜单ID: {}, 菜单名称: {}, URL: {}", + menuRegisterInfo.getMenuId(), menuRegisterInfo.getMenuNameCode(), menuRegisterInfo.getUrl()); + + // 使用Feign客户端进行菜单注册 + ResultVo<MenuInfo> result = menuFeignClient.registerMenuInfo(menuRegisterInfo); + + if (result != null && "200".equals(result.getCode())) { + logger.info("商业版Feign客户端菜单注册成功 - 菜单ID: {}, 菜单名称: {}", + menuRegisterInfo.getMenuId(), menuRegisterInfo.getMenuNameCode()); + } else { + logger.error("商业版Feign客户端菜单注册失败 - 响应码: {}, 消息: {}", + result != null ? result.getCode() : "null", + result != null ? result.getMsg() : "null"); + } + + } catch (Exception e) { + logger.error("商业版菜单注册失败: {}", menuRegisterInfo, e); + } + } +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialMonitoringServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialMonitoringServiceImpl.java index f9d0fc5..5822add 100644 --- a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialMonitoringServiceImpl.java +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialMonitoringServiceImpl.java @@ -2,373 +2,114 @@ import com.terrabase.enterprise.api.MonitoringService; import com.terrabase.enterprise.api.dto.*; +import com.terrabase.enterprise.api.request.RegisterEventDefineReq; +import com.terrabase.enterprise.api.request.GetEventsParams; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.enterprise.impl.commercial.client.AlarmFeignClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.*; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.client.RestClientException; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; /** * 商业版监控告警服务实现 * 集成商业组件实现监控告警功能 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @Service public class CommercialMonitoringServiceImpl implements MonitoringService { private static final Logger logger = LoggerFactory.getLogger(CommercialMonitoringServiceImpl.class); - - private final AtomicBoolean running = new AtomicBoolean(false); - - private final RestTemplate restTemplate; - - private String omsBaseUrl; - private int timeout; - public CommercialMonitoringServiceImpl(RestTemplate restTemplate) { - this.restTemplate = restTemplate; - // 设置默认值 - this.omsBaseUrl = "http://localhost:8081/api/"; - this.timeout = 30000; - } - - public CommercialMonitoringServiceImpl(RestTemplate restTemplate, String omsBaseUrl, int timeout) { - this.restTemplate = restTemplate; - this.omsBaseUrl = omsBaseUrl; - this.timeout = timeout; - } + @Autowired + private AlarmFeignClient alarmFeignClient; @Override - public String getServiceName() { - return "Commercial Monitoring Service"; - } - - @Override - public String getServiceVersion() { - return "1.0.0-commercial"; - } - - @Override - public String getServiceType() { - return "commercial"; - } - - @Override - public String getHealthStatus() { - if (!running.get()) { - return "服务未运行"; + public ResultVo registerEventDefine(RegisterEventDefineReq req) { + if (req == null) { + logger.warn("告警定义注册请求对象不能为空"); + return ResultVo.error("400", "告警定义注册请求对象不能为空"); } - return String.format("商业版监控告警服务健康状态: 正常 (版本: %s, 类型: %s)", - getServiceVersion(), getServiceType()); - } - - @Override - public void start() { - if (running.compareAndSet(false, true)) { - logger.info("商业版监控告警服务已启动"); - } else { - logger.warn("商业版监控告警服务已经在运行中"); - } - } - - @Override - public void stop() { - if (running.compareAndSet(true, false)) { - logger.info("商业版监控告警服务已停止"); - } else { - logger.warn("商业版监控告警服务已经停止"); - } - } - - @Override - public boolean isRunning() { - return running.get(); - } - - // ========== 告警系统相关接口实现 ========== - - @Override - public void registerEventDefine(EventDefine eventDefine) { - if (!running.get()) { - logger.warn("服务未运行,无法执行告警定义注册操作"); - return; - } - - if (eventDefine == null) { - logger.warn("告警定义对象不能为空"); - return; - } - try { - logger.info("商业版执行告警定义注册: {}", eventDefine); - - // 构建请求参数 - Map<String, Object> requestBody = new HashMap<>(); - requestBody.put("eventDefineId", eventDefine.getEventDefineId()); - requestBody.put("eventName", eventDefine.getEventName()); - requestBody.put("eventLevel", eventDefine.getEventLevel()); - requestBody.put("eventDescription", eventDefine.getEventDescription()); - requestBody.put("eventType", eventDefine.getEventType()); - requestBody.put("threshold", eventDefine.getTriggerCondition()); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers); + logger.info("商业版执行告警定义注册,服务名称: {}, 告警定义数量: {}", + req.getServiceName(), req.getEventDefines().size()); - // 构建告警定义注册接口URL - String registerEventDefineUrl = omsBaseUrl + "/monitor/v1/events/defines"; + // 调用Feign客户端进行告警定义注册 + ResultVo result = alarmFeignClient.registerEventDefine(req); - // 调用REST接口进行告警定义注册 - ResponseEntity<Map> response = restTemplate.postForEntity(registerEventDefineUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map<String, Object> responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - logger.info("商业版REST接口告警定义注册成功 - 告警定义ID: {}, 告警名称: {}, 告警级别: {}", - eventDefine.getEventDefineId(), eventDefine.getEventName(), eventDefine.getEventLevel()); - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口告警定义注册失败: {}", errorMsg); - } + if ("200".equals(result.getCode())) { + logger.info("商业版告警定义注册成功,服务名称: {}", req.getServiceName()); } else { - logger.error("商业版REST接口告警定义注册失败,HTTP状态码: {}", response.getStatusCode()); + logger.error("商业版告警定义注册失败: {}", result.getMsg()); } - - } catch (RestClientException e) { - logger.error("商业版REST接口告警定义注册调用异常", e); + + return result; + } catch (Exception e) { - logger.error("商业版告警定义注册失败: {}", eventDefine, e); + logger.error("商业版告警定义注册失败", e); + return ResultVo.error("500", "告警定义注册失败: " + e.getMessage()); } } - + @Override - public void sendAlarmsBatch(List<AlarmInfo> alarms) { - if (!running.get()) { - logger.warn("服务未运行,无法执行告警上报操作"); - return; - } - - if (alarms == null || alarms.isEmpty()) { + public ResultVo<Boolean> sendEvents(List<EventInfo> alarmInfos) { + if (alarmInfos == null || alarmInfos.isEmpty()) { logger.warn("告警信息列表不能为空"); - return; + return ResultVo.error("400", "告警信息列表不能为空"); } - + try { - logger.info("商业版执行告警批量上报,告警数量: {}", alarms.size()); - - // 构建请求参数 - Map<String, Object> requestBody = new HashMap<>(); - requestBody.put("alarms", alarms); + logger.info("商业版执行告警上报,告警数量: {}", alarmInfos.size()); - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); + // 调用Feign客户端进行告警上报 + ResultVo<Boolean> result = alarmFeignClient.sendEvents(alarmInfos); - HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers); - - // 构建告警上报接口URL - String sendAlarmsUrl = omsBaseUrl + "/monitor/v1/events/service/send-alarm/internal"; - - // 调用REST接口进行告警上报 - ResponseEntity<Map> response = restTemplate.postForEntity(sendAlarmsUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map<String, Object> responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - logger.info("商业版REST接口告警批量上报成功,告警数量: {}", alarms.size()); - for (AlarmInfo alarmInfo : alarms) { - logger.info("商业版告警上报成功 - 告警ID: {}, 告警名称: {}, 告警级别: {}", - alarmInfo.getAlarmId(), alarmInfo.getAlarmName(), alarmInfo.getAlarmLevel()); - } - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口告警批量上报失败: {}", errorMsg); - } + if ("200".equals(result.getCode())) { + logger.info("商业版告警上报成功,告警数量: {}", alarmInfos.size()); } else { - logger.error("商业版REST接口告警批量上报失败,HTTP状态码: {}", response.getStatusCode()); + logger.error("商业版告警上报失败: {}", result.getMsg()); } - - } catch (RestClientException e) { - logger.error("商业版REST接口告警批量上报调用异常", e); + + return result; + } catch (Exception e) { - logger.error("商业版告警批量上报失败", e); + logger.error("商业版告警上报失败", e); + return ResultVo.error("500", "告警上报失败: " + e.getMessage()); } } - + @Override - public PageResult<EventInfo> getEventsByPage(EventQueryParams queryParams) { - if (!running.get()) { - logger.warn("服务未运行,无法执行告警查询操作"); - return null; - } - - if (queryParams == null) { + public ResultVo<EventsCollection> getEventsByPage(GetEventsParams getEventsParams) { + if (getEventsParams == null) { logger.warn("告警查询参数对象不能为空"); - return null; + return ResultVo.error("400", "告警查询参数对象不能为空"); } - + try { - logger.info("商业版执行告警分页查询,页码: {}, 每页大小: {}", queryParams.getPageNum(), queryParams.getPageSize()); - - // 构建请求参数 - Map<String, Object> requestBody = new HashMap<>(); - requestBody.put("pageNum", queryParams.getPageNum()); - requestBody.put("pageSize", queryParams.getPageSize()); - requestBody.put("eventLevel", queryParams.getAlarmLevel()); - requestBody.put("alarmStatus", queryParams.getAlarmStatus()); - requestBody.put("startTime", queryParams.getStartTime()); - requestBody.put("endTime", queryParams.getEndTime()); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers); + logger.info("商业版执行告警分页查询,页码: {}, 每页大小: {}", + getEventsParams.getPageNum(), getEventsParams.getPageSize()); - // 构建告警分页查询接口URL - String getEventsUrl = omsBaseUrl + "/monitor/v1/events"; + // 调用Feign客户端进行告警分页查询 + ResultVo<EventsCollection> result = alarmFeignClient.getEventsByPage(getEventsParams); - // 调用REST接口进行告警分页查询 - ResponseEntity<Map> response = restTemplate.postForEntity(getEventsUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map<String, Object> responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - @SuppressWarnings("unchecked") - List<Map<String, Object>> eventList = (List<Map<String, Object>>) responseBody.get("eventList"); - Long total = (Long) responseBody.get("total"); - - List<EventInfo> events = new java.util.ArrayList<>(); - if (eventList != null) { - for (Map<String, Object> eventMap : eventList) { - EventInfo event = new EventInfo( - (String) eventMap.get("alarmId"), - (String) eventMap.get("alarmName"), - (String) eventMap.get("alarmLevel") - ); - event.setEventDefineId((String) eventMap.get("eventDefineId")); - event.setAlarmDescription((String) eventMap.get("alarmDescription")); - event.setAlarmStatus((String) eventMap.get("alarmStatus")); - event.setTriggerTime((Long) eventMap.get("triggerTime")); - event.setAlarmSource((String) eventMap.get("alarmSource")); - event.setHandleTime((Long) eventMap.get("handleTime")); - event.setHandler((String) eventMap.get("handler")); - event.setHandleRemark((String) eventMap.get("handleRemark")); - events.add(event); - } - } - - PageResult<EventInfo> result = new PageResult<>(events, total, queryParams.getPageNum(), queryParams.getPageSize()); - - logger.info("商业版REST接口告警分页查询成功,查询到告警数量: {}, 总记录数: {}", events.size(), result.getTotal()); - - return result; - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口告警分页查询失败: {}", errorMsg); - return null; - } + if ("200".equals(result.getCode())) { + EventsCollection eventsCollection = result.getData(); + logger.info("商业版告警分页查询成功,查询到告警数量: {}, 总记录数: {}", + eventsCollection.getEvents().size(), eventsCollection.getTotalCount()); } else { - logger.error("商业版REST接口告警分页查询失败,HTTP状态码: {}", response.getStatusCode()); - return null; + logger.error("商业版告警分页查询失败: {}", result.getMsg()); } - - } catch (RestClientException e) { - logger.error("商业版REST接口告警分页查询调用异常", e); - return null; - } catch (Exception e) { - logger.error("商业版告警分页查询失败", e); - return null; - } - } - - @Override - public AlarmDetail getAlarmDetailById(String alarmId) { - if (!running.get()) { - logger.warn("服务未运行,无法执行告警详情查询操作"); - return null; - } - - if (alarmId == null || alarmId.trim().isEmpty()) { - logger.warn("告警ID不能为空"); - return null; - } - - try { - logger.info("商业版执行告警详情查询,告警ID: {}", alarmId); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity<String> requestEntity = new HttpEntity<>(headers); - // 构建告警详情查询接口URL - String getAlarmDetailUrl = omsBaseUrl + "/monitor/v1/events/" + alarmId; + return result; - // 调用REST接口进行告警详情查询 - ResponseEntity<Map> response = restTemplate.exchange(getAlarmDetailUrl, HttpMethod.GET, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map<String, Object> responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - Map<String, Object> alarmData = (Map<String, Object>) responseBody.get("alarmDetail"); - - AlarmDetail alarmDetail = new AlarmDetail( - (String) alarmData.get("alarmId"), - (String) alarmData.get("alarmName"), - (String) alarmData.get("alarmLevel") - ); - alarmDetail.setEventDefineId((String) alarmData.get("eventDefineId")); - alarmDetail.setAlarmDescription((String) alarmData.get("alarmDescription")); - alarmDetail.setAlarmStatus((String) alarmData.get("alarmStatus")); - alarmDetail.setTriggerTime((Long) alarmData.get("triggerTime")); - alarmDetail.setAlarmSource((String) alarmData.get("alarmSource")); - alarmDetail.setAlarmDetails((String) alarmData.get("alarmDetails")); - alarmDetail.setAlarmData((String) alarmData.get("alarmData")); - alarmDetail.setCreateTime((Long) alarmData.get("createTime")); - alarmDetail.setUpdateTime((Long) alarmData.get("updateTime")); - - logger.info("商业版REST接口告警详情查询成功 - 告警ID: {}, 告警名称: {}, 告警级别: {}", - alarmDetail.getAlarmId(), alarmDetail.getAlarmName(), alarmDetail.getAlarmLevel()); - - return alarmDetail; - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口告警详情查询失败: {}", errorMsg); - return null; - } - } else { - logger.error("商业版REST接口告警详情查询失败,HTTP状态码: {}", response.getStatusCode()); - return null; - } - - } catch (RestClientException e) { - logger.error("商业版REST接口告警详情查询调用异常,告警ID: {}", alarmId, e); - return null; } catch (Exception e) { - logger.error("商业版告警详情查询失败,告警ID: {}", alarmId, e); - return null; + logger.error("商业版告警分页查询失败", e); + return ResultVo.error("500", "告警分页查询失败: " + e.getMessage()); } } } diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialUserManagementServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialUserManagementServiceImpl.java index c7edf96..674e3c1 100644 --- a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialUserManagementServiceImpl.java +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialUserManagementServiceImpl.java @@ -1,380 +1,200 @@ package com.terrabase.enterprise.impl.commercial; import com.terrabase.enterprise.api.UserManagementService; -import com.terrabase.enterprise.api.dto.*; +import com.terrabase.enterprise.api.dto.AuthorityInfo; +import com.terrabase.enterprise.api.dto.LoginUserDto; +import com.terrabase.enterprise.api.dto.ResourceGroup; +import com.terrabase.enterprise.api.request.RoleRegisterVo; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.enterprise.impl.commercial.client.ManualAuthenticationClient; +import com.terrabase.enterprise.impl.commercial.client.OmsExtensionClient; +import com.terrabase.enterprise.impl.commercial.client.PermissionFeignClient; +import com.terrabase.enterprise.impl.commercial.client.RoleFeignClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.*; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.client.RestClientException; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; +import java.util.ArrayList; +import java.util.List; /** * 商业版用户管理服务实现 * 集成商业组件实现用户管理功能 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @Service public class CommercialUserManagementServiceImpl implements UserManagementService { private static final Logger logger = LoggerFactory.getLogger(CommercialUserManagementServiceImpl.class); - - private final AtomicBoolean running = new AtomicBoolean(false); - - private final RestTemplate restTemplate; - private String omsBaseUrl; - private int timeout; - - public CommercialUserManagementServiceImpl(RestTemplate restTemplate) { - this.restTemplate = restTemplate; - // 设置默认值 - this.omsBaseUrl = "http://localhost:8081/api/"; - this.timeout = 30000; - } + @Autowired + private OmsExtensionClient omsExtensionClient; - public CommercialUserManagementServiceImpl(RestTemplate restTemplate, String omsBaseUrl, int timeout) { - this.restTemplate = restTemplate; - this.omsBaseUrl = omsBaseUrl; - this.timeout = timeout; - } - - @Override - public String getServiceName() { - return "Commercial User Management Service"; - } - - @Override - public String getServiceVersion() { - return "1.0.0-commercial"; - } - - @Override - public String getServiceType() { - return "commercial"; - } + @Autowired + private ManualAuthenticationClient manualAuthenticationClient; - @Override - public String getHealthStatus() { - if (!running.get()) { - return "服务未运行"; - } - - return String.format("商业版用户管理服务健康状态: 正常 (版本: %s, 类型: %s)", - getServiceVersion(), getServiceType()); - } + @Autowired + private RoleFeignClient roleFeignClient; - @Override - public void start() { - if (running.compareAndSet(false, true)) { - logger.info("商业版用户管理服务已启动"); - } else { - logger.warn("商业版用户管理服务已经在运行中"); - } - } - - @Override - public void stop() { - if (running.compareAndSet(true, false)) { - logger.info("商业版用户管理服务已停止"); - } else { - logger.warn("商业版用户管理服务已经停止"); - } - } - - @Override - public boolean isRunning() { - return running.get(); - } + @Autowired + private PermissionFeignClient permissionFeignClient; // ========== 用户注册相关接口实现 ========== @Override - public void registerRole(RoleRegister roleRegister) { - if (!running.get()) { - logger.warn("服务未运行,无法执行角色注册操作"); - return; - } - + public void batchRegisterRole(RoleRegisterVo roleRegister) { if (roleRegister == null) { logger.warn("角色注册对象不能为空"); return; } try { - logger.info("商业版执行角色注册: {}", roleRegister); - - // 构建请求参数 - Map<String, Object> requestBody = new HashMap<>(); - requestBody.put("roleId", roleRegister.getRoleId()); - requestBody.put("roleName", roleRegister.getRoleName()); - requestBody.put("applicationScenario", roleRegister.getApplicationScenario()); - requestBody.put("roleDescription", roleRegister.getRoleDescription()); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); + logger.info("商业版执行批量角色注册"); - HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers); + // 使用 RoleFeignClient 调用远程服务进行批量角色注册 + ResultVo<String> result = roleFeignClient.batchRegisterRole(roleRegister); - // 构建角色注册接口URL - String registerRoleUrl = omsBaseUrl + "/framework/v1/iam/roles/batch/register/internal"; - - // 调用REST接口进行角色注册 - ResponseEntity<Map> response = restTemplate.postForEntity(registerRoleUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map<String, Object> responseBody = response.getBody(); - String status = (String) responseBody.get("status"); + if ("200".equals(result.getCode())) { + logger.info("商业版批量角色注册成功"); + + // 记录角色注册信息 + if (roleRegister.getRoleRegisterInfos() != null && !roleRegister.getRoleRegisterInfos().isEmpty()) { + logger.info("商业版处理角色注册信息,数量: {}", roleRegister.getRoleRegisterInfos().size()); + + for (com.terrabase.enterprise.api.dto.RoleRegisterInfo roleInfo : roleRegister.getRoleRegisterInfos()) { + logger.info("商业版角色注册成功 - 角色名: {}, 角色名代码: {}, 描述: {}, 可创建: {}, 支持登录类型: {}", + roleInfo.getName(), + roleInfo.getNameCode(), + roleInfo.getDescription(), + roleInfo.isCreatable(), + roleInfo.getSupportLoginType()); + } + } - if ("success".equals(status)) { - logger.info("商业版REST接口角色注册成功 - 角色ID: {}, 角色名称: {}, 应用场景: {}", - roleRegister.getRoleId(), roleRegister.getRoleName(), roleRegister.getApplicationScenario()); - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口角色注册失败: {}", errorMsg); + // 记录角色国际化信息 + if (roleRegister.getRoleI18nInfos() != null && !roleRegister.getRoleI18nInfos().isEmpty()) { + logger.info("商业版处理角色国际化信息,数量: {}", roleRegister.getRoleI18nInfos().size()); + + for (com.terrabase.enterprise.api.dto.RoleI18nInfo i18nInfo : roleRegister.getRoleI18nInfos()) { + logger.info("商业版角色国际化信息 - 角色名: {}, 代码: {}, 语言: {}, 内容: {}", + i18nInfo.getName(), + i18nInfo.getCode(), + i18nInfo.getLanguage(), + i18nInfo.getContent()); + } } } else { - logger.error("商业版REST接口角色注册失败,HTTP状态码: {}", response.getStatusCode()); + logger.error("商业版批量角色注册失败: {}", result.getMsg()); } - } catch (RestClientException e) { - logger.error("商业版REST接口角色注册调用异常", e); } catch (Exception e) { - logger.error("商业版角色注册失败: {}", roleRegister, e); + logger.error("商业版批量角色注册失败: {}", roleRegister, e); } } @Override - public void registerAuthority(AuthorityInfos authorityInfos) { - if (!running.get()) { - logger.warn("服务未运行,无法执行权限注册操作"); - return; - } - - if (authorityInfos == null || authorityInfos.getAuthorityList() == null) { - logger.warn("权限注册对象不能为空"); + public void registerPermission(List<AuthorityInfo> authorityInfos) { + if (authorityInfos == null || authorityInfos.isEmpty()) { + logger.warn("权限注册列表不能为空"); return; } try { - logger.info("商业版执行权限注册,权限数量: {}", authorityInfos.getAuthorityList().size()); - - // 构建请求参数 - Map<String, Object> requestBody = new HashMap<>(); - requestBody.put("authorityList", authorityInfos.getAuthorityList()); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers); - - // 构建权限注册接口URL - String registerAuthorityUrl = omsBaseUrl + "/framework/v1/iam/permission/batch/register/internal"; - - // 调用REST接口进行权限注册 - ResponseEntity<Map> response = restTemplate.postForEntity(registerAuthorityUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map<String, Object> responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - logger.info("商业版REST接口权限注册成功,权限数量: {}", authorityInfos.getAuthorityList().size()); - for (AuthorityInfos.AuthorityInfo authorityInfo : authorityInfos.getAuthorityList()) { - logger.info("商业版权限注册成功 - 权限ID: {}, 权限名称: {}, 权限类型: {}", - authorityInfo.getAuthorityId(), authorityInfo.getAuthorityName(), authorityInfo.getAuthorityType()); - } - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口权限注册失败: {}", errorMsg); + logger.info("商业版执行批量权限注册,权限数量: {}", authorityInfos.size()); + + // 调用Feign客户端进行批量权限注册 + ResultVo<String> result = permissionFeignClient.registerPermission(authorityInfos); + + if ("200".equals(result.getCode())) { + logger.info("商业版批量权限注册成功,权限数量: {}", authorityInfos.size()); + for (AuthorityInfo authorityInfo : authorityInfos) { + logger.info("商业版权限注册成功 - 资源标识: {}, 描述: {}, 跳过检查: {}, 所需角色: {}", + authorityInfo.getResourceKey(), + authorityInfo.getDescription(), + authorityInfo.isSkipCheck(), + authorityInfo.getRoles()); } } else { - logger.error("商业版REST接口权限注册失败,HTTP状态码: {}", response.getStatusCode()); + logger.error("商业版批量权限注册失败: {}", result.getMsg()); } - } catch (RestClientException e) { - logger.error("商业版REST接口权限注册调用异常", e); } catch (Exception e) { - logger.error("商业版权限注册失败: {}", authorityInfos, e); + logger.error("商业版批量权限注册失败: {}", authorityInfos, e); } } - + @Override - public void registerMenu(MenuRegisterInfo menuRegisterInfo) { - if (!running.get()) { - logger.warn("服务未运行,无法执行菜单注册操作"); - return; + public List<ResourceGroup> getUserGroups(String userName) { + if (userName == null || userName.trim().isEmpty()) { + logger.warn("用户名不能为空"); + return new ArrayList<>(); } - - if (menuRegisterInfo == null || menuRegisterInfo.getMenuList() == null) { - logger.warn("菜单注册对象不能为空"); - return; - } - + try { - logger.info("商业版执行菜单注册,菜单数量: {}", menuRegisterInfo.getMenuList().size()); + logger.info("商业版获取用户资源组: {}", userName); - // 构建请求参数 - Map<String, Object> requestBody = new HashMap<>(); - requestBody.put("menuList", menuRegisterInfo.getMenuList()); + // 使用FeignClient调用OMS扩展服务获取用户资源组 + List<ResourceGroup> groups = omsExtensionClient.getUserGroups(userName); - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); + logger.info("商业版获取用户资源组成功 - 用户: {}, 资源组数量: {}", userName, groups.size()); - HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers); + return groups; - // 构建菜单注册接口URL - String registerMenuUrl = omsBaseUrl + "/framework/v1/customize/menu/register/internal"; - - // 调用REST接口进行菜单注册 - ResponseEntity<Map> response = restTemplate.postForEntity(registerMenuUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map<String, Object> responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - logger.info("商业版REST接口菜单注册成功,菜单数量: {}", menuRegisterInfo.getMenuList().size()); - for (MenuRegisterInfo.MenuInfo menuInfo : menuRegisterInfo.getMenuList()) { - logger.info("商业版菜单注册成功 - 菜单ID: {}, 菜单名称: {}, 菜单路径: {}", - menuInfo.getMenuId(), menuInfo.getMenuName(), menuInfo.getMenuPath()); - } - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口菜单注册失败: {}", errorMsg); - } - } else { - logger.error("商业版REST接口菜单注册失败,HTTP状态码: {}", response.getStatusCode()); - } - - } catch (RestClientException e) { - logger.error("商业版REST接口菜单注册调用异常", e); } catch (Exception e) { - logger.error("商业版菜单注册失败: {}", menuRegisterInfo, e); + logger.error("商业版获取用户资源组失败 - 用户: {}", userName, e); + // 发生异常时返回默认的公共资源组 + List<ResourceGroup> defaultGroups = new ArrayList<>(); + defaultGroups.add(ResourceGroup.buildPublicGroup()); + return defaultGroups; } } - + + // ========== 用户认证相关接口实现 ========== + @Override - public void registerMenuForbidden(ForbiddenBody forbiddenBody) { - if (!running.get()) { - logger.warn("服务未运行,无法执行菜单屏蔽注册操作"); - return; - } - - if (forbiddenBody == null || forbiddenBody.getForbiddenMenuIds() == null) { - logger.warn("菜单屏蔽对象不能为空"); - return; - } - + public ResultVo<List<String>> queryRolesByToken() { try { - logger.info("商业版执行菜单屏蔽注册,屏蔽菜单数量: {}", forbiddenBody.getForbiddenMenuIds().size()); - - // 构建请求参数 - Map<String, Object> requestBody = new HashMap<>(); - requestBody.put("forbiddenMenuIds", forbiddenBody.getForbiddenMenuIds()); - requestBody.put("reason", forbiddenBody.getReason()); + logger.info("商业版执行根据token查询角色名"); - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); + // 使用 Feign 客户端调用远程服务 + ResultVo<List<String>> result = manualAuthenticationClient.queryRolesByToken(); - HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers); - - // 构建菜单屏蔽注册接口URL - String registerMenuForbiddenUrl = omsBaseUrl + "/framework/v1/customize/menu/register/forbidden/item/internal"; - - // 调用REST接口进行菜单屏蔽注册 - ResponseEntity<Map> response = restTemplate.postForEntity(registerMenuForbiddenUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map<String, Object> responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - logger.info("商业版REST接口菜单屏蔽注册成功,屏蔽菜单数量: {}", forbiddenBody.getForbiddenMenuIds().size()); - for (String menuId : forbiddenBody.getForbiddenMenuIds()) { - logger.info("商业版菜单屏蔽注册成功 - 菜单ID: {}, 屏蔽原因: {}", menuId, forbiddenBody.getReason()); - } - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口菜单屏蔽注册失败: {}", errorMsg); - } + if ("200".equals(result.getCode())) { + logger.info("商业版根据token查询角色名成功,角色数量: {}", result.getData().size()); + return result; } else { - logger.error("商业版REST接口菜单屏蔽注册失败,HTTP状态码: {}", response.getStatusCode()); + logger.error("商业版根据token查询角色名失败: {}", result.getMsg()); + return ResultVo.error(result.getCode(), result.getMsg()); } - - } catch (RestClientException e) { - logger.error("商业版REST接口菜单屏蔽注册调用异常", e); + } catch (Exception e) { - logger.error("商业版菜单屏蔽注册失败: {}", forbiddenBody, e); + logger.error("商业版根据token查询角色名失败", e); + return ResultVo.error("500", "角色查询失败: " + e.getMessage()); } } - - // ========== 时间管理相关接口实现 ========== - + @Override - public void subscribeTimeConfigChange(Subscribe subscribe) { - if (!running.get()) { - logger.warn("服务未运行,无法执行时间配置变更事件订阅操作"); - return; - } - - if (subscribe == null) { - logger.warn("订阅信息对象不能为空"); - return; - } - + public ResultVo<List<LoginUserDto>> getCurrentUserInfo() { try { - logger.info("商业版执行时间配置变更事件订阅: {}", subscribe); - - // 构建请求参数 - Map<String, Object> requestBody = new HashMap<>(); - requestBody.put("subscribeId", subscribe.getSubscribeId()); - requestBody.put("serviceName", subscribe.getServiceName()); - requestBody.put("notifyAddress", subscribe.getNotifyAddress()); - requestBody.put("eventType", subscribe.getEventType()); - - // 设置请求头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); + logger.info("商业版执行获取当前用户信息"); - HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers); + // 使用 Feign 客户端调用远程服务 + ResultVo<List<LoginUserDto>> result = manualAuthenticationClient.sessionCur(); - // 构建时间配置变更事件订阅接口URL - String subscribeTimeConfigUrl = omsBaseUrl + "/framework/v1/iam/subscribe/internal"; - - // 调用REST接口进行时间配置变更事件订阅 - ResponseEntity<Map> response = restTemplate.postForEntity(subscribeTimeConfigUrl, requestEntity, Map.class); - - if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { - Map<String, Object> responseBody = response.getBody(); - String status = (String) responseBody.get("status"); - - if ("success".equals(status)) { - logger.info("商业版REST接口时间配置变更事件订阅成功 - 订阅ID: {}, 服务名称: {}, 通知地址: {}", - subscribe.getSubscribeId(), subscribe.getServiceName(), subscribe.getNotifyAddress()); - } else { - String errorMsg = (String) responseBody.get("message"); - logger.error("商业版REST接口时间配置变更事件订阅失败: {}", errorMsg); - } + if ("200".equals(result.getCode())) { + logger.info("商业版获取当前用户信息成功,用户数量: {}", result.getData().size()); + return result; } else { - logger.error("商业版REST接口时间配置变更事件订阅失败,HTTP状态码: {}", response.getStatusCode()); + logger.error("商业版获取当前用户信息失败: {}", result.getMsg()); + return ResultVo.error(result.getCode(), result.getMsg()); } - - } catch (RestClientException e) { - logger.error("商业版REST接口时间配置变更事件订阅调用异常", e); + } catch (Exception e) { - logger.error("商业版时间配置变更事件订阅失败: {}", subscribe, e); + logger.error("商业版获取当前用户信息失败", e); + return ResultVo.error("500", "用户信息查询失败: " + e.getMessage()); } } } diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/AlarmFeignClient.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/AlarmFeignClient.java new file mode 100644 index 0000000..fba595b --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/AlarmFeignClient.java @@ -0,0 +1,49 @@ +package com.terrabase.enterprise.impl.commercial.client; + +import com.terrabase.enterprise.api.dto.EventInfo; +import com.terrabase.enterprise.api.dto.EventsCollection; +import com.terrabase.enterprise.api.request.GetEventsParams; +import com.terrabase.enterprise.api.request.RegisterEventDefineReq; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.enterprise.impl.commercial.config.FeignInnerRequestAuthInterceptor; +import com.terrabase.enterprise.impl.commercial.config.HttpsFeignClientConfig; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.cloud.openfeign.SpringQueryMap; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +@Component +@FeignClient(value = "Monitor", path = "/monitor/v1", contextId = "eDataMate-alarm", + configuration = {HttpsFeignClientConfig.class, FeignInnerRequestAuthInterceptor.class}) +public interface AlarmFeignClient { + /** + * 批量注册权限 + * + * @param req 注册请求 + * @return 注册结果 + */ + @PostMapping({"/events/defines"}) + ResultVo registerEventDefine(@RequestBody RegisterEventDefineReq req); + + /** + * 上报告警 + * + * @param alarmInfos 告警信息 + * @return 是否上报成功 + */ + @PostMapping({"/events/service/send-alarm/internal"}) + ResultVo<Boolean> sendEvents(@RequestBody List<EventInfo> alarmInfos); + + /** + * 批量查询告警信息 + * + * @param getEventsParams 查询请求 + * @return 查询结果 + */ + @GetMapping({"/events"}) + ResultVo<EventsCollection> getEventsByPage(@SpringQueryMap GetEventsParams getEventsParams); +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/CertFeignClient.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/CertFeignClient.java new file mode 100644 index 0000000..d3c14e0 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/CertFeignClient.java @@ -0,0 +1,26 @@ +package com.terrabase.enterprise.impl.commercial.client; + +import com.terrabase.enterprise.api.dto.CertCollectInfo; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.enterprise.impl.commercial.config.FeignInnerRequestAuthInterceptor; +import com.terrabase.enterprise.impl.commercial.config.HttpsFeignClientConfig; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; + +import java.util.List; + +@Component +@FeignClient(value = "Framework", path = "/framework/v1/certificate", contextId = "me-cert-collect", + configuration = {HttpsFeignClientConfig.class, FeignInnerRequestAuthInterceptor.class}) +public interface CertFeignClient { + /** + * 获取oms管理的所有证书信息 + * + * @return 证书信息 + */ + @GetMapping(value = "/action/cert/collect", consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + ResultVo<List<CertCollectInfo>> listCertificateServiceList(); +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/CryptoFeighClient.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/CryptoFeighClient.java new file mode 100644 index 0000000..eba3dd3 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/CryptoFeighClient.java @@ -0,0 +1,33 @@ +package com.terrabase.enterprise.impl.commercial.client; + +import com.terrabase.enterprise.api.dto.Ciphertext; +import com.terrabase.enterprise.api.dto.Plaintext; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.enterprise.impl.commercial.config.FeignInnerRequestAuthInterceptor; +import com.terrabase.enterprise.impl.commercial.config.HttpsFeignClientConfig; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; + +@Component +@FeignClient(value = "Framework", path = "/framework/v1/crypto", contextId = "me-role", + configuration = {HttpsFeignClientConfig.class, FeignInnerRequestAuthInterceptor.class}) +public interface CryptoFeighClient { + /** + * 加密接口 数据加密,传入要加密的明文,返回加密后的id + * + * @param key 加密id + * @param plaintext 要加密的明文 + * @param username 用户名 + * @return 加密后的id + */ + @PostMapping({"/{key}/actions/encrypt/internal"}) + ResultVo<Ciphertext> encrypt(@PathVariable("key") String key, @RequestBody Plaintext plaintext, + @RequestHeader("username") String username); + + @PostMapping({"/{key}/actions/decrypt/internal"}) + ResultVo<Plaintext> decrypt(@PathVariable("key") String key, @RequestHeader("username") String username); +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/LicenseClient.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/LicenseClient.java new file mode 100644 index 0000000..d832e70 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/LicenseClient.java @@ -0,0 +1,17 @@ +package com.terrabase.enterprise.impl.commercial.client; + +import com.terrabase.enterprise.api.dto.LicenseInfo; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.enterprise.impl.commercial.config.FeignInnerRequestAuthInterceptor; +import com.terrabase.enterprise.impl.commercial.config.HttpsFeignClientConfig; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; + +@Component +@FeignClient(value = "Framework", path = "/framework/v1/license", contextId = "edm-license", + configuration = {HttpsFeignClientConfig.class, FeignInnerRequestAuthInterceptor.class}) +public interface LicenseClient { + @GetMapping(value = "/info") + ResultVo<LicenseInfo> getLicenseInfo(); +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/ManualAuthenticationClient.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/ManualAuthenticationClient.java new file mode 100644 index 0000000..b5f1292 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/ManualAuthenticationClient.java @@ -0,0 +1,33 @@ +package com.terrabase.enterprise.impl.commercial.client; + +import com.terrabase.enterprise.api.dto.LoginUserDto; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.enterprise.impl.commercial.config.FeignInnerRequestAuthInterceptor; +import com.terrabase.enterprise.impl.commercial.config.HttpsFeignClientConfig; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +import java.util.List; + +@Component +@FeignClient(value = "Framework", path = "/framework/v1", contextId = "frameworkRole", + configuration = {HttpsFeignClientConfig.class, FeignInnerRequestAuthInterceptor.class}) +public interface ManualAuthenticationClient { + /** + * 调用oms侧接口,如果鉴权成功会返回角色名 + * + * @return ResultVo<List<String>> + */ + @PostMapping(value = "/iam/roles/query-by-token") + ResultVo<List<String>> queryRolesByToken(); + + /** + * 调用oms侧接口,返回当前的用户信息 + * + * @return Result<List<LoginUserDto>> + */ + @GetMapping(value = "/sessions/current/internal") + ResultVo<List<LoginUserDto>> sessionCur(); +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/MenuFeignClient.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/MenuFeignClient.java new file mode 100644 index 0000000..93db0be --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/MenuFeignClient.java @@ -0,0 +1,23 @@ +package com.terrabase.enterprise.impl.commercial.client; + +import com.terrabase.enterprise.api.dto.MenuInfo; +import com.terrabase.enterprise.api.dto.MenuRegisterInfo; +import com.terrabase.enterprise.impl.commercial.config.FeignInnerRequestAuthInterceptor; +import com.terrabase.enterprise.impl.commercial.config.HttpsFeignClientConfig; +import com.terrabase.enterprise.api.response.ResultVo; + + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@Component +@FeignClient(value = "Framework", path = "/framework/v1/customize", contextId = "settings-menu", +configuration = {HttpsFeignClientConfig.class, FeignInnerRequestAuthInterceptor.class}) +public interface MenuFeignClient { + @PostMapping(value = "/menu/register/internal", consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + ResultVo<MenuInfo> registerMenuInfo(@RequestBody MenuRegisterInfo menuRegisterInfo); +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/OmsExtensionClient.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/OmsExtensionClient.java new file mode 100644 index 0000000..7f2dac0 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/OmsExtensionClient.java @@ -0,0 +1,19 @@ +package com.terrabase.enterprise.impl.commercial.client; + +import com.terrabase.enterprise.api.dto.ResourceGroup; +import com.terrabase.enterprise.impl.commercial.config.FeignInnerRequestAuthInterceptor; +import com.terrabase.enterprise.impl.commercial.config.HttpsFeignClientConfig; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.List; + +@Component +@FeignClient(name = "oms", path = "/rpc/v1", url = "${oms-extension.api.url:https://oms-extension:8021}", + configuration = {FeignInnerRequestAuthInterceptor.class, HttpsFeignClientConfig.class}) +public interface OmsExtensionClient { + @GetMapping("/{userName}/user-resource-groups") + List<ResourceGroup> getUserGroups(@PathVariable String userName); +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/OperateLogFeignClient.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/OperateLogFeignClient.java new file mode 100644 index 0000000..6051473 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/OperateLogFeignClient.java @@ -0,0 +1,36 @@ +package com.terrabase.enterprise.impl.commercial.client; + +import com.terrabase.enterprise.api.dto.LogI18n; +import com.terrabase.enterprise.api.request.LogAttributeVo; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.enterprise.impl.commercial.config.FeignInnerRequestAuthInterceptor; +import com.terrabase.enterprise.impl.commercial.config.HttpsFeignClientConfig; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PostMapping; + +import java.util.List; + +@Component +@FeignClient(value = "Framework", path = "/framework/v1/log/operateLogs", contextId = "eDataMate-operateLog", + configuration = {HttpsFeignClientConfig.class, FeignInnerRequestAuthInterceptor.class}) +public interface +OperateLogFeignClient { + /** + * 上报审计日志接口 + * + * @param logs log对象列表 + * @return ResultVo<日志条数> + */ + @PostMapping(value = "/actions/register/internal") + ResultVo<Integer> registerLogs(List<LogAttributeVo> logs); + + /** + * 注册审计日志国际化 + * + * @param LogI18ns 国际化对象list + * @return ResultVo<注册结果> + */ + @PostMapping(value = "/actions/register/internation/internal") + ResultVo<Boolean> registryInternational(List<LogI18n> LogI18ns); +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/PermissionFeignClient.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/PermissionFeignClient.java new file mode 100644 index 0000000..0dd82d8 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/PermissionFeignClient.java @@ -0,0 +1,28 @@ +package com.terrabase.enterprise.impl.commercial.client; + +import com.terrabase.enterprise.api.dto.AuthorityInfo; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.enterprise.impl.commercial.config.FeignInnerRequestAuthInterceptor; +import com.terrabase.enterprise.impl.commercial.config.HttpsFeignClientConfig; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +@Component +@FeignClient(value = "Framework", path = "/framework/v1/iam/permission", contextId = "eDataMate-permission", + configuration = {HttpsFeignClientConfig.class, FeignInnerRequestAuthInterceptor.class}) +public interface PermissionFeignClient { + /** + * 批量注册权限 + * + * @param authorityInfos 待注册权限实体列表 + * @return 注册结果 + */ + @PostMapping(value = "/batch/register/internal", consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + ResultVo<String> registerPermission(@RequestBody List<AuthorityInfo> authorityInfos); +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/RoleFeignClient.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/RoleFeignClient.java new file mode 100644 index 0000000..b34e021 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/client/RoleFeignClient.java @@ -0,0 +1,26 @@ +package com.terrabase.enterprise.impl.commercial.client; + +import com.terrabase.enterprise.api.request.RoleRegisterVo; +import com.terrabase.enterprise.api.response.ResultVo; +import com.terrabase.enterprise.impl.commercial.config.FeignInnerRequestAuthInterceptor; +import com.terrabase.enterprise.impl.commercial.config.HttpsFeignClientConfig; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@Component +@FeignClient(value = "Framework", path = "/framework/v1/iam/roles", contextId = "me-role", + configuration = {HttpsFeignClientConfig.class, FeignInnerRequestAuthInterceptor.class}) +public interface RoleFeignClient { + /** + * 创建新角色 + * + * @param roleRegisterVo 待创建新角色 + * @return 创建结果 + */ + @PostMapping(value = "/batch/register/internal", consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + ResultVo<String> batchRegisterRole(@RequestBody RoleRegisterVo roleRegisterVo); +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/CommercialNacosConfig.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/CommercialNacosConfig.java new file mode 100644 index 0000000..43fd3c4 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/CommercialNacosConfig.java @@ -0,0 +1,116 @@ +package com.terrabase.enterprise.impl.commercial.config; + +import com.alibaba.nacos.common.tls.TlsSystemConfig; +import com.terrabase.sdk.config.TerrabaseSDKConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +/** + * 商业版Nacos配置管理类 + * 仅在商业版且启用Nacos时生效 + * + * @author Yehong Pan + * @version 1.0.0 + */ +@Configuration +@ConditionalOnProperty( + name = "spring.cloud.nacos.discovery.enabled", + havingValue = "true", + matchIfMissing = false +) +@Import({NacosListener.class, LoadBalancerClientFactoryConfig.class}) +public class CommercialNacosConfig { + + private static final Logger logger = LoggerFactory.getLogger(CommercialNacosConfig.class); + + /** + * 根据SDK配置初始化Nacos配置 + * + * @param sdkConfig SDK配置 + */ + public static void initializeFromSDKConfig(TerrabaseSDKConfig sdkConfig) { + if (sdkConfig == null || !sdkConfig.isNacosDiscoveryEnabled()) { + logger.info("Nacos服务发现未启用,跳过Nacos配置初始化"); + return; + } + + logger.info("初始化商业版Nacos配置"); + logger.info("Nacos服务器地址: {}", sdkConfig.getNacosServerAddr()); + logger.info("Nacos用户名: {}", sdkConfig.getNacosUsername()); + logger.info("服务名称: {}", sdkConfig.getServiceName()); + logger.info("服务端口: {}", sdkConfig.getServicePort()); + + // 设置系统属性,供Spring Cloud Nacos使用 + if (sdkConfig.getNacosServerAddr() != null) { + System.setProperty("spring.cloud.nacos.discovery.server-addr", sdkConfig.getNacosServerAddr()); + } + if (sdkConfig.getNacosUsername() != null) { + System.setProperty("spring.cloud.nacos.discovery.username", sdkConfig.getNacosUsername()); + } + if (sdkConfig.getNacosPassword() != null) { + System.setProperty("spring.cloud.nacos.discovery.password", sdkConfig.getNacosPassword()); + } + if (sdkConfig.getNacosPort() != null) { + System.setProperty("spring.cloud.nacos.discovery.port", sdkConfig.getNacosPort()); + } + if (sdkConfig.getNacosIp() != null) { + System.setProperty("spring.cloud.nacos.discovery.ip", sdkConfig.getNacosIp()); + } + if (sdkConfig.getServiceName() != null) { + System.setProperty("spring.application.name", sdkConfig.getServiceName()); + } + if (sdkConfig.getServicePort() != null) { + System.setProperty("server.port", sdkConfig.getServicePort()); + } + + // 启用Nacos发现和注册 + System.setProperty("spring.cloud.nacos.discovery.enabled", "true"); + System.setProperty("spring.cloud.nacos.discovery.register-enabled", "true"); + + // 配置SSL设置 + configureSSL(sdkConfig); + + logger.info("商业版Nacos配置初始化完成"); + } + + /** + * 配置SSL设置 + * + * @param sdkConfig SDK配置 + */ + private static void configureSSL(TerrabaseSDKConfig sdkConfig) { + if (sdkConfig.isTlsEnabled()) { + logger.info("配置Nacos SSL设置"); + logger.info("TLS启用: {}", sdkConfig.isTlsEnabled()); + logger.info("客户端认证: {}", sdkConfig.isClientAuth()); + logger.info("信任证书路径: {}", sdkConfig.getTrustCertPath()); + + // 设置TLS系统属性 + System.setProperty(TlsSystemConfig.TLS_ENABLE, String.valueOf(sdkConfig.isTlsEnabled())); + System.setProperty(TlsSystemConfig.CLIENT_AUTH, String.valueOf(sdkConfig.isClientAuth())); + if (sdkConfig.getTrustCertPath() != null) { + System.setProperty(TlsSystemConfig.CLIENT_TRUST_CERT, sdkConfig.getTrustCertPath()); + } + + logger.info("Nacos SSL配置完成"); + } else { + logger.info("Nacos SSL未启用"); + } + } + + /** + * 检查是否为商业版Nacos配置 + * + * @param sdkConfig SDK配置 + * @return 是否为商业版Nacos配置 + */ + public static boolean isCommercialNacosConfig(TerrabaseSDKConfig sdkConfig) { + return sdkConfig != null && + sdkConfig.isNacosDiscoveryEnabled() && + sdkConfig.getNacosServerAddr() != null && + !sdkConfig.getNacosServerAddr().trim().isEmpty(); + } +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/FeignInnerRequestAuthInterceptor.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/FeignInnerRequestAuthInterceptor.java new file mode 100644 index 0000000..3e943f9 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/FeignInnerRequestAuthInterceptor.java @@ -0,0 +1,26 @@ +package com.terrabase.enterprise.impl.commercial.config; + +import feign.RequestInterceptor; +import feign.RequestTemplate; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +/** + * FeignClient内部调用前置拦截器 + */ +@Slf4j +@Component +public class FeignInnerRequestAuthInterceptor implements RequestInterceptor { + private static final String X_AUTH_TOKEN_NAME = "X-Auth-Token-Inner"; + + @Override + public void apply(RequestTemplate requestTemplate) { + String token = MachineTokenConfig.getMachineToken(); + if (StringUtils.isBlank(token)) { + log.warn("Failed to get machine token, using empty token for inner request"); + token = StringUtils.EMPTY; + } + requestTemplate.header(X_AUTH_TOKEN_NAME, token); + } +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/HttpsFeignClientConfig.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/HttpsFeignClientConfig.java new file mode 100644 index 0000000..e934c07 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/HttpsFeignClientConfig.java @@ -0,0 +1,52 @@ +package com.terrabase.enterprise.impl.commercial.config; + +import feign.Client; + +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; +import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; +import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.cert.X509Certificate; +import java.util.Collections; + +/** + * Feign配置 + */ +@Configuration +public class HttpsFeignClientConfig { + @Bean + public Client feignClient(LoadBalancerClient loadBalancerClient, + LoadBalancerClientFactory loadBalancerClientFactory) + throws NoSuchAlgorithmException, KeyManagementException { + SSLContext instance = SSLContext.getInstance("TLSv1.2"); + instance.init(null, new TrustManager[]{getX509TrustManager()}, SecureRandom.getInstanceStrong()); + Client.Default client = new Client.Default(instance.getSocketFactory(), (s, sslSession) -> true); + return new FeignBlockingLoadBalancerClient(client, loadBalancerClient, loadBalancerClientFactory, + Collections.emptyList()); + } + + private static X509TrustManager getX509TrustManager() { + return new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] x509Certificates, String authType) { + } + + @Override + public void checkServerTrusted(X509Certificate[] x509Certificates, String authType) { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[] {}; + } + }; + } +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/LoadBalancerClientFactoryConfig.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/LoadBalancerClientFactoryConfig.java new file mode 100644 index 0000000..2f700c5 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/LoadBalancerClientFactoryConfig.java @@ -0,0 +1,101 @@ +package com.terrabase.enterprise.impl.commercial.config; + + +import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.loadbalancer.LoadBalancerAlgorithm; +import com.alibaba.cloud.nacos.loadbalancer.DefaultLoadBalancerAlgorithm; +import com.alibaba.cloud.nacos.loadbalancer.NacosLoadBalancer; +import com.alibaba.cloud.nacos.util.InetIPv6Utils; + +import jakarta.annotation.Resource; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClientsProperties; +import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer; +import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; +import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.GenericApplicationContext; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * LoadBalancerClientFactory配置类 + * 规避Nacos在使用FeignClient客户端下无法正确获取Nacos实例地址的问题 + * + * @author Yehong Pan + * @since 2025-10-10 + */ +@Configuration +@EnableConfigurationProperties(LoadBalancerClientsProperties.class) +public class +LoadBalancerClientFactoryConfig { + @Resource + private NacosDiscoveryProperties discoveryProperties; + + @Resource + private InetIPv6Utils inetIPv6Utils; + + /** + * 获取LoadBalancerClientFactory对象 + * @param properties properties + * @return LoadBalancerClientFacotry对象 + */ + @Bean + @ConditionalOnMissingBean + public LoadBalancerClientFactory loadBalancerClientFactory(LoadBalancerClientsProperties properties) { + return new CubeLoadBalancerClientFactory(properties, discoveryProperties, inetIPv6Utils); + } + + private static class CubeLoadBalancerClientFactory extends LoadBalancerClientFactory { + private static final Map<String, ReactiveLoadBalancer<ServiceInstance>> SERVICE_INSTANCE_MAP = + new ConcurrentHashMap<>(); + + private final NacosDiscoveryProperties discoveryProperties; + + private final InetIPv6Utils inetIPv6Utils; + + /** + * 构造函数 + * + * @param properties springcloud负载均衡环境参数 + * @param discoveryProperties nacos环境配置参数 + * @param inetIPv6Utils 工具 + */ + public CubeLoadBalancerClientFactory(LoadBalancerClientsProperties properties, + NacosDiscoveryProperties discoveryProperties, + InetIPv6Utils inetIPv6Utils) { + super(properties); + this.discoveryProperties = discoveryProperties; + this.inetIPv6Utils = inetIPv6Utils; + } + + @Override + public GenericApplicationContext createContext(String name) { + ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); + GenericApplicationContext context = super.createContext(name); + Thread.currentThread().setContextClassLoader(originalClassLoader); + return context; + } + + @Override + public ReactiveLoadBalancer<ServiceInstance> getInstance(String serviceId) { + Map<String, LoadBalancerAlgorithm> loadBalancerAlgorithmMap = new HashMap<>(); + loadBalancerAlgorithmMap.put("defaultServiceId", new DefaultLoadBalancerAlgorithm()); + return SERVICE_INSTANCE_MAP.computeIfAbsent(serviceId, key-> { + NacosLoadBalancer nacosLoadBalancer = new NacosLoadBalancer( + getLazyProvider(serviceId, ServiceInstanceListSupplier.class), serviceId, discoveryProperties, + inetIPv6Utils, new ArrayList<>(), loadBalancerAlgorithmMap); + nacosLoadBalancer.init(); + return nacosLoadBalancer; + }); + } + } + +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/MachineTokenConfig.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/MachineTokenConfig.java new file mode 100644 index 0000000..9545f54 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/MachineTokenConfig.java @@ -0,0 +1,122 @@ +package com.terrabase.enterprise.impl.commercial.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Configuration; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +/** + * 机器令牌配置类,提供令牌的获取和刷新功能。 + * 通过静态方法管理机器令牌,其他类可直接调用获取或刷新令牌。 + * + * 采用直接执行命令的方式获取和解密机器令牌,无需依赖外部脚本文件。 + */ +@Configuration +public class MachineTokenConfig { + + private static final Logger logger = LoggerFactory.getLogger(MachineTokenConfig.class); + + /** + * 存储解密后的机器令牌 + */ + private static volatile String MACHINE_TOKEN_DECRYPTED = null; + + /** + * 获取机器令牌,如果令牌为空则自动调用脚本获取 + * @return 解密后的机器令牌,如果获取失败返回null + */ + public static String getMachineToken() { + if (MACHINE_TOKEN_DECRYPTED == null || MACHINE_TOKEN_DECRYPTED.isEmpty()) { + refreshMachineToken(); + } + return MACHINE_TOKEN_DECRYPTED; + } + + /** + * 刷新机器令牌,强制重新调用脚本获取新令牌 + * @return 是否成功获取到新令牌 + */ + public static synchronized boolean refreshMachineToken() { + String token = getTokenWithFallback(); + if (token != null && !token.isEmpty()) { + MACHINE_TOKEN_DECRYPTED = token; + return true; + } + return false; + } + + /** + * 从脚本获取机器令牌(简化版本) + * 直接执行命令获取加密令牌,然后通过Python解密 + * @return 解密后的机器令牌,失败时返回null + */ + private static String getTokenFromScript() { + try { + logger.info("开始执行机器令牌获取脚本..."); + + // 执行脚本获取加密令牌 + ProcessBuilder pb = new ProcessBuilder("bash", "-c", + "grep 'machine_token=' /opt/huawei/fce/runtime/security/priv/platform.conf | awk -F'=' '{print $2}'"); + Process process = pb.start(); + + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String encryptedToken = reader.readLine(); + reader.close(); + + if (encryptedToken == null || encryptedToken.trim().isEmpty()) { + logger.warn("无法获取加密机器令牌"); + return null; + } + + logger.info("成功获取加密机器令牌,开始解密..."); + + // 执行Python脚本解密 + ProcessBuilder pythonPb = new ProcessBuilder("python", "-c", + "import kmc.kmc as K; import os; os.environ['KMC_DATA_USER']='tomcat'; machine_token='" + + encryptedToken.trim() + "'; plain_machine_token=K.API().decrypt(0,machine_token); print(plain_machine_token)"); + Process pythonProcess = pythonPb.start(); + + BufferedReader pythonReader = new BufferedReader(new InputStreamReader(pythonProcess.getInputStream())); + String decryptedToken = pythonReader.readLine(); + pythonReader.close(); + + if (decryptedToken == null || decryptedToken.trim().isEmpty()) { + logger.warn("机器令牌解密失败"); + return null; + } + + logger.info("机器令牌获取成功"); + return decryptedToken.trim(); + + } catch (Exception e) { + logger.error("机器令牌获取脚本执行失败", e); + return null; + } + } + + /** + * 获取机器令牌(带重试机制) + * 如果脚本获取失败,会尝试从环境变量获取 + * @return 机器令牌 + */ + public static String getTokenWithFallback() { + // 首先尝试从脚本获取 + String token = getTokenFromScript(); + + // 如果脚本获取失败,尝试从环境变量获取 + if (token == null || token.isEmpty()) { + String envToken = System.getenv("MACHINE_TOKEN"); + if (envToken != null && !envToken.trim().isEmpty()) { + logger.info("从环境变量获取机器令牌"); + return envToken; + } + } + + return token; + } + +} + + diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/NacosListener.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/NacosListener.java new file mode 100644 index 0000000..e236a8c --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/NacosListener.java @@ -0,0 +1,34 @@ +package com.terrabase.enterprise.impl.commercial.config; + +import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; +import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration; +import com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Configuration; + + +/** + * Nacos控制器 + */ +@Configuration +@ConditionalOnNacosDiscoveryEnabled +@AutoConfigureAfter(NacosServiceRegistryAutoConfiguration.class) +public class NacosListener implements ApplicationContextAware { + private NacosAutoServiceRegistration registration; + + @Autowired(required = false) + public void setRegistration(NacosAutoServiceRegistration registration) { + this.registration = registration; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + if (registration != null) { + registration.start(); + } + } +} diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCertificateServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCertificateServiceImpl.java index 78cb399..1ceb8f6 100644 --- a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCertificateServiceImpl.java +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCertificateServiceImpl.java @@ -2,20 +2,18 @@ import com.terrabase.enterprise.api.CertificateService; import com.terrabase.enterprise.api.dto.*; -import com.terrabase.enterprise.impl.open.config.KmcConfig; +import com.terrabase.enterprise.api.response.ResultVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; /** * 开源版证书管理服务实现 * 基于开源技术实现证书管理功能 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @Service @@ -23,189 +21,73 @@ public class OpenCertificateServiceImpl implements CertificateService { private static final Logger logger = LoggerFactory.getLogger(OpenCertificateServiceImpl.class); - private final AtomicBoolean running = new AtomicBoolean(false); - - @Autowired - private KmcConfig kmcConfig; - - @Override - public String getServiceName() { - return "Open Source Certificate Service"; - } - - @Override - public String getServiceVersion() { - return "1.0.0-open"; - } - - @Override - public String getServiceType() { - return "open"; - } - - @Override - public String getHealthStatus() { - if (!running.get()) { - return "服务未运行"; - } - - return String.format("开源版证书管理服务健康状态: 正常 (版本: %s, 类型: %s)", - getServiceVersion(), getServiceType()); - } - - @Override - public void start() { - if (running.compareAndSet(false, true)) { - logger.info("开源版证书管理服务已启动"); - } else { - logger.warn("开源版证书管理服务已经在运行中"); - } - } - - @Override - public void stop() { - if (running.compareAndSet(true, false)) { - logger.info("开源版证书管理服务已停止"); - } else { - logger.warn("开源版证书管理服务已经停止"); - } - } - - @Override - public boolean isRunning() { - return running.get(); - } - // ========== 证书管理相关接口实现 ========== - - @Override - public void registerCertificate(RegisterCertificate certificate) { - if (!running.get()) { - logger.warn("服务未运行,无法执行证书注册操作"); - return; - } - - if (certificate == null) { - logger.warn("证书注册对象不能为空"); - return; - } - - try { - logger.info("开源版执行证书注册: {}", certificate); - logger.info("开源版证书注册成功 - 证书ID: {}, 证书名称: {}, 证书类型: {}", - certificate.getCertificateId(), certificate.getCertificateName(), certificate.getCertificateType()); - - } catch (Exception e) { - logger.error("开源版证书注册失败: {}", certificate, e); - } - } - @Override - public void importOrUpdateCertificate(CertificateDetail certificate) { - if (!running.get()) { - logger.warn("服务未运行,无法执行证书导入/更新操作"); - return; - } - - if (certificate == null) { - logger.warn("证书详细信息对象不能为空"); - return; - } - - try { - logger.info("开源版执行证书导入/更新,证书ID: {}", certificate.getCertificateId()); - - logger.info("开源版证书导入/更新成功 - 证书ID: {}, 证书格式: {}", - certificate.getCertificateId(), certificate.getCertificateFormat()); - - } catch (Exception e) { - logger.error("开源版证书导入/更新失败: {}", certificate, e); - } - } - - @Override - public void importTrustedCaCertificate(CaCertificate caCertificate) { - if (!running.get()) { - logger.warn("服务未运行,无法执行CA证书导入操作"); - return; - } - - if (caCertificate == null) { - logger.warn("CA证书对象不能为空"); - return; - } - - try { - logger.info("开源版执行CA证书导入: {}", caCertificate); - - logger.info("开源版CA证书导入成功 - CA证书ID: {}, CA证书名称: {}, 颁发者: {}", - caCertificate.getCaCertificateId(), caCertificate.getCaCertificateName(), caCertificate.getIssuer()); - - } catch (Exception e) { - logger.error("开源版CA证书导入失败: {}", caCertificate, e); - } - } - - @Override - public List<CertCollectInfo> queryAllCertificates() { - if (!running.get()) { - logger.warn("服务未运行,无法执行证书信息查询操作"); - return null; - } - + public ResultVo<List<CertCollectInfo>> listCertificateServiceList() { try { logger.info("开源版执行证书信息查询"); // 返回模拟数据 List<CertCollectInfo> certificates = new java.util.ArrayList<>(); - CertCollectInfo cert1 = new CertCollectInfo("cert_001", "数据使能证书", "SSL"); - cert1.setCertificateStatus("有效"); - cert1.setValidFrom(System.currentTimeMillis() - 86400000L); // 1天前 - cert1.setValidTo(System.currentTimeMillis() + 86400000L * 365); // 1年后 + // 创建数据使能证书 + CertCollectInfo cert1 = new CertCollectInfo(); + cert1.setProductName("数据使能平台"); + cert1.setIssueTime(System.currentTimeMillis() - 86400000L); // 1天前 + cert1.setExpirationTime(System.currentTimeMillis() + 86400000L * 365); // 1年后 cert1.setIssuer("Terrabase CA"); cert1.setSubject("CN=terrabase-data-enable"); + cert1.setSerialNumber("1234567890ABCDEF"); + cert1.setCertType("SSL"); + cert1.setStatus("有效"); + cert1.setAlertBeforeExpirationDays(30); + cert1.setCertName("数据使能证书"); + cert1.setProductVersion("1.0.0"); + cert1.setPatchVersion("1.0.1"); + cert1.setDeviceEsn("DEVICE-001"); certificates.add(cert1); logger.info("开源版证书信息查询成功,查询到证书数量: {}", certificates.size()); - return certificates; + return ResultVo.success(certificates); } catch (Exception e) { logger.error("开源版证书信息查询失败", e); - return null; + return ResultVo.error("500", "证书信息查询失败: " + e.getMessage()); } } @Override - public LicenseInfo queryLicenseInfo() { - if (!running.get()) { - logger.warn("服务未运行,无法执行License信息查询操作"); - return null; - } - + public ResultVo<LicenseInfo> getLicenseInfo() { try { logger.info("开源版执行License信息查询"); // 返回模拟数据 - LicenseInfo licenseInfo = new LicenseInfo("license_001", "开源版"); - licenseInfo.setValidFrom(System.currentTimeMillis() - 86400000L * 30); // 30天前 - licenseInfo.setValidTo(System.currentTimeMillis() + 86400000L * 365); // 1年后 - licenseInfo.setFeatureModules(new String[]{"数据使能", "KMC加解密", "基础监控"}); - licenseInfo.setUserLimit(1000); - licenseInfo.setConcurrentLimit(100); - licenseInfo.setStorageLimit(1000L); // 1TB - licenseInfo.setLicenseStatus("有效"); - licenseInfo.setRemainingDays(365); + LicenseInfo licenseInfo = new LicenseInfo(); + + // 设置许可证状态:2表示已经激活 + licenseInfo.setStatus("2"); + + // 设置SBOM信息 + List<LicenseInfoEx> sboms = new java.util.ArrayList<>(); + + // 添加数据使能模块信息 + LicenseInfoEx dataEnable = new LicenseInfoEx(); + dataEnable.setName("数据使能"); + dataEnable.setTotal("1000"); + dataEnable.setUnit("用户"); + sboms.add(dataEnable); + + licenseInfo.setSboms(sboms); - logger.info("开源版License信息查询成功 - License ID: {}, License类型: {}, 剩余天数: {}", - licenseInfo.getLicenseId(), licenseInfo.getLicenseType(), licenseInfo.getRemainingDays()); + logger.info("开源版License信息查询成功 - 状态: {}, SBOM模块数量: {}", + licenseInfo.getStatus(), licenseInfo.getSboms().size()); - return licenseInfo; + return ResultVo.success(licenseInfo); } catch (Exception e) { logger.error("开源版License信息查询失败", e); - return null; + return ResultVo.error("500", "License信息查询失败: " + e.getMessage()); } } } diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCryptoServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCryptoServiceImpl.java index 0223d23..37eed14 100644 --- a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCryptoServiceImpl.java +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCryptoServiceImpl.java @@ -9,13 +9,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.concurrent.atomic.AtomicBoolean; /** * 开源版加解密服务实现 * 基于开源KMC技术实现 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @Service @@ -23,64 +22,11 @@ public class OpenCryptoServiceImpl implements CryptoService { private static final Logger logger = LoggerFactory.getLogger(OpenCryptoServiceImpl.class); - private final AtomicBoolean running = new AtomicBoolean(false); - @Autowired private KmcConfig kmcConfig; - - @Override - public String getServiceName() { - return "Open Source Crypto Service"; - } - - @Override - public String getServiceVersion() { - return "1.0.0-open"; - } - - @Override - public String getServiceType() { - return "open"; - } - - @Override - public String getHealthStatus() { - if (!running.get()) { - return "服务未运行"; - } - - return String.format("开源版加解密服务健康状态: 正常 (版本: %s, 类型: %s)", - getServiceVersion(), getServiceType()); - } - - @Override - public void start() { - if (running.compareAndSet(false, true)) { - logger.info("开源版加解密服务已启动"); - } else { - logger.warn("开源版加解密服务已经在运行中"); - } - } - - @Override - public void stop() { - if (running.compareAndSet(true, false)) { - logger.info("开源版加解密服务已停止"); - } else { - logger.warn("开源版加解密服务已经停止"); - } - } @Override - public boolean isRunning() { - return running.get(); - } - - @Override - public String encrypt(String plaintext, CryptoAlgorithm algorithm) { - if (!running.get()) { - return "服务未运行,无法执行加密操作"; - } + public String encrypt(String plaintext, CryptoAlgorithm algorithm, String username) { if (!kmcConfig.isEnabled()) { return "KMC功能未启用,无法执行加密操作"; @@ -95,7 +41,7 @@ public String encrypt(String plaintext, CryptoAlgorithm algorithm) { } try { - logger.info("开源版执行数据加密,原文长度: {}, 算法: {}", plaintext.length(), algorithm.getAlgorithm()); + logger.info("开源版执行数据加密,原文长度: {}, 算法: {}, 用户: {}", plaintext.length(), algorithm.getAlgorithm(), username); // 使用KMC工具进行加密 String ciphertext = KmcCryptoUtil.encrypt(plaintext, kmcConfig.getDefaultKeyId(), algorithm); @@ -115,10 +61,7 @@ public String encrypt(String plaintext, CryptoAlgorithm algorithm) { } @Override - public String decrypt(String ciphertext, CryptoAlgorithm algorithm) { - if (!running.get()) { - return "服务未运行,无法执行解密操作"; - } + public String decrypt(String ciphertext, CryptoAlgorithm algorithm, String username) { if (!kmcConfig.isEnabled()) { return "KMC功能未启用,无法执行解密操作"; @@ -133,7 +76,7 @@ public String decrypt(String ciphertext, CryptoAlgorithm algorithm) { } try { - logger.info("开源版执行数据解密,密文长度: {}, 算法: {}", ciphertext.length(), algorithm.getAlgorithm()); + logger.info("开源版执行数据解密,密文长度: {}, 算法: {}, 用户: {}", ciphertext.length(), algorithm.getAlgorithm(), username); // 使用KMC工具进行解密 String plaintext = KmcCryptoUtil.decrypt(ciphertext, kmcConfig.getDefaultKeyId(), algorithm); diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java index 57a8cef..9e37bb2 100644 --- a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java @@ -5,13 +5,12 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import java.util.concurrent.atomic.AtomicBoolean; /** * 开源版企业服务实现 * 提供企业级服务的基本功能,子服务通过JarLoadUtil独立管理 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @Service @@ -19,7 +18,6 @@ public class OpenEnterpriseServiceImpl implements EnterpriseService { private static final Logger logger = LoggerFactory.getLogger(OpenEnterpriseServiceImpl.class); - private final AtomicBoolean running = new AtomicBoolean(false); @Override public String getServiceName() { @@ -38,36 +36,8 @@ public String getServiceType() { @Override public String getHealthStatus() { - if (!running.get()) { - return "服务未运行"; - } - return String.format("开源版企业服务健康状态: 正常 (版本: %s, 类型: %s)", getServiceVersion(), getServiceType()); } - @Override - public void start() { - if (running.compareAndSet(false, true)) { - logger.info("开源版企业服务已启动"); - // 注意:子服务现在通过JarLoadUtil独立管理,不再在此处启动 - } else { - logger.warn("开源版企业服务已经在运行中"); - } - } - - @Override - public void stop() { - if (running.compareAndSet(true, false)) { - logger.info("开源版企业服务已停止"); - // 注意:子服务现在通过JarLoadUtil独立管理,不再在此处停止 - } else { - logger.warn("开源版企业服务已经停止"); - } - } - - @Override - public boolean isRunning() { - return running.get(); - } } \ No newline at end of file diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenLogManagementServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenLogManagementServiceImpl.java index fbc1a92..0ef220f 100644 --- a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenLogManagementServiceImpl.java +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenLogManagementServiceImpl.java @@ -1,129 +1,76 @@ package com.terrabase.enterprise.impl.open; import com.terrabase.enterprise.api.LogManagementService; -import com.terrabase.enterprise.api.dto.*; -import com.terrabase.enterprise.impl.open.config.KmcConfig; +import com.terrabase.enterprise.api.dto.LogI18n; +import com.terrabase.enterprise.api.request.LogAttributeVo; +import com.terrabase.enterprise.api.response.ResultVo; + +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.concurrent.atomic.AtomicBoolean; - /** * 开源版日志管理服务实现 * 基于开源技术实现日志管理功能 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @Service public class OpenLogManagementServiceImpl implements LogManagementService { private static final Logger logger = LoggerFactory.getLogger(OpenLogManagementServiceImpl.class); - - private final AtomicBoolean running = new AtomicBoolean(false); - - @Autowired - private KmcConfig kmcConfig; - - @Override - public String getServiceName() { - return "Open Source Log Management Service"; - } - - @Override - public String getServiceVersion() { - return "1.0.0-open"; - } @Override - public String getServiceType() { - return "open"; - } - - @Override - public String getHealthStatus() { - if (!running.get()) { - return "服务未运行"; - } - - return String.format("开源版日志管理服务健康状态: 正常 (版本: %s, 类型: %s)", - getServiceVersion(), getServiceType()); - } - - @Override - public void start() { - if (running.compareAndSet(false, true)) { - logger.info("开源版日志管理服务已启动"); - } else { - logger.warn("开源版日志管理服务已经在运行中"); - } - } - - @Override - public void stop() { - if (running.compareAndSet(true, false)) { - logger.info("开源版日志管理服务已停止"); - } else { - logger.warn("开源版日志管理服务已经停止"); - } - } - - @Override - public boolean isRunning() { - return running.get(); - } - - // ========== 日志与监控相关接口实现 ========== - - @Override - public void registerOperateLogI18N(LogI18NS logI18NS) { - if (!running.get()) { - logger.warn("服务未运行,无法执行操作日志国际化信息注册操作"); - return; - } - - if (logI18NS == null || logI18NS.getLogI18NList() == null) { - logger.warn("操作日志国际化信息对象不能为空"); - return; + public ResultVo<Integer> registerLogs(List<LogAttributeVo> logs) { + if (logs == null || logs.isEmpty()) { + logger.warn("审计日志对象不能为空"); + return ResultVo.error("400", "审计日志对象不能为空"); } try { - logger.info("开源版执行操作日志国际化信息注册,国际化信息数量: {}", logI18NS.getLogI18NList().size()); + logger.info("开源版执行审计日志上报,日志数量: {}", logs.size()); - for (LogI18NS.LogI18NInfo logI18NInfo : logI18NS.getLogI18NList()) { - logger.info("开源版操作日志国际化信息注册成功 - 操作代码: {}, 操作名称: {}, 默认语言: {}", - logI18NInfo.getOperationCode(), logI18NInfo.getOperationName(), logI18NInfo.getDefaultLanguage()); + // 开源版不记录审计日志,只进行简单的日志输出 + for (LogAttributeVo log : logs) { + logger.debug("开源版审计日志处理 - 序号: {}, 日志类型: {}, 用户名: {}, 操作: {}, 来源: {}, 终端: {}, 结果: {}", + log.getSn(), log.getLogType(), log.getUsername(), log.getOperation(), + log.getSource(), log.getTerminal(), log.getResult()); } + return ResultVo.success(logs.size()); + } catch (Exception e) { - logger.error("开源版操作日志国际化信息注册失败: {}", logI18NS, e); + logger.error("开源版审计日志上报失败", e); + return ResultVo.error("500", "审计日志上报失败: " + e.getMessage()); } } @Override - public void reportOperateLog(Logs logs) { - if (!running.get()) { - logger.warn("服务未运行,无法执行操作日志上报操作"); - return; - } - - if (logs == null || logs.getLogList() == null) { - logger.warn("操作日志对象不能为空"); - return; + public ResultVo<Boolean> registryInternational(List<LogI18n> logI18ns) { + if (logI18ns == null || logI18ns.isEmpty()) { + logger.warn("审计日志国际化对象不能为空"); + return ResultVo.error("400", "审计日志国际化对象不能为空"); } try { - logger.info("开源版执行操作日志上报,日志数量: {}", logs.getLogList().size()); + logger.info("开源版执行审计日志国际化注册,国际化信息数量: {}", logI18ns.size()); - for (Logs.LogInfo logInfo : logs.getLogList()) { - logger.info("开源版操作日志上报成功 - 日志ID: {}, 用户ID: {}, 操作类型: {}, 操作描述: {}", - logInfo.getLogId(), logInfo.getUserId(), logInfo.getOperationType(), logInfo.getOperationDescription()); + // 开源版不记录审计日志,只进行简单的日志输出 + for (LogI18n logI18n : logI18ns) { + logger.debug("开源版审计日志国际化处理 - 代码: {}, 语言: {}, 内容: {}", + logI18n.getCode(), logI18n.getLanguage(), logI18n.getContent()); } + return ResultVo.success(true); + } catch (Exception e) { - logger.error("开源版操作日志上报失败: {}", logs, e); + logger.error("开源版审计日志国际化注册失败", e); + return ResultVo.error("500", "审计日志国际化注册失败: " + e.getMessage()); } } } + + + diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenMenuServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenMenuServiceImpl.java new file mode 100644 index 0000000..8fbb9ac --- /dev/null +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenMenuServiceImpl.java @@ -0,0 +1,36 @@ +package com.terrabase.enterprise.impl.open; + +import com.terrabase.enterprise.api.MenuService; +import com.terrabase.enterprise.api.dto.MenuRegisterInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +/** + * 开源版菜单管理服务实现 + * 提供菜单注册功能 + * + * @author Yehong Pan + * @version 1.0.0 + */ +@Service +public class OpenMenuServiceImpl implements MenuService { + + private static final Logger logger = LoggerFactory.getLogger(OpenMenuServiceImpl.class); + + @Override + public void registerMenuInfo(MenuRegisterInfo menuRegisterInfo) { + + if (menuRegisterInfo == null) { + logger.warn("菜单注册对象不能为空"); + return; + } + + try { + logger.info("开源版执行菜单注册 - 菜单ID: {}, 菜单名称: {}, URL: {}", + menuRegisterInfo.getMenuId(), menuRegisterInfo.getMenuNameCode(), menuRegisterInfo.getUrl()); + } catch (Exception e) { + logger.error("开源版菜单注册失败: {}", menuRegisterInfo, e); + } + } +} diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenMonitoringServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenMonitoringServiceImpl.java index c59d7d1..171ef89 100644 --- a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenMonitoringServiceImpl.java +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenMonitoringServiceImpl.java @@ -2,218 +2,203 @@ import com.terrabase.enterprise.api.MonitoringService; import com.terrabase.enterprise.api.dto.*; -import com.terrabase.enterprise.impl.open.config.KmcConfig; +import com.terrabase.enterprise.api.request.RegisterEventDefineReq; +import com.terrabase.enterprise.api.request.GetEventsParams; +import com.terrabase.enterprise.api.response.ResultVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; /** * 开源版监控告警服务实现 * 基于开源技术实现监控告警功能 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ @Service public class OpenMonitoringServiceImpl implements MonitoringService { private static final Logger logger = LoggerFactory.getLogger(OpenMonitoringServiceImpl.class); - - private final AtomicBoolean running = new AtomicBoolean(false); - - @Autowired - private KmcConfig kmcConfig; - - @Override - public String getServiceName() { - return "Open Source Monitoring Service"; - } - - @Override - public String getServiceVersion() { - return "1.0.0-open"; - } - - @Override - public String getServiceType() { - return "open"; - } - - @Override - public String getHealthStatus() { - if (!running.get()) { - return "服务未运行"; - } - - return String.format("开源版监控告警服务健康状态: 正常 (版本: %s, 类型: %s)", - getServiceVersion(), getServiceType()); - } - - @Override - public void start() { - if (running.compareAndSet(false, true)) { - logger.info("开源版监控告警服务已启动"); - } else { - logger.warn("开源版监控告警服务已经在运行中"); - } - } - - @Override - public void stop() { - if (running.compareAndSet(true, false)) { - logger.info("开源版监控告警服务已停止"); - } else { - logger.warn("开源版监控告警服务已经停止"); - } - } - - @Override - public boolean isRunning() { - return running.get(); - } - - // ========== 告警系统相关接口实现 ========== @Override - public void registerEventDefine(EventDefine eventDefine) { - if (!running.get()) { - logger.warn("服务未运行,无法执行告警定义注册操作"); - return; - } - - if (eventDefine == null) { - logger.warn("告警定义对象不能为空"); - return; + public ResultVo registerEventDefine(RegisterEventDefineReq req) { + if (req == null) { + logger.warn("告警定义注册请求对象不能为空"); + return ResultVo.error("400", "告警定义注册请求对象不能为空"); } try { - logger.info("开源版执行告警定义注册: {}", eventDefine); + logger.info("开源版执行告警定义注册,服务名称: {}, 服务英文名: {}, 服务中文名: {}, 删除所有: {}, 告警定义数量: {}", + req.getServiceName(), req.getServiceEn(), req.getServiceZh(), req.isDeleteAll(), req.getEventDefines().size()); - // 模拟调用POST /monitor/v1/events/defines - logger.info("开源版告警定义注册成功 - 告警定义ID: {}, 告警名称: {}, 告警级别: {}", - eventDefine.getEventDefineId(), eventDefine.getEventName(), eventDefine.getEventLevel()); + // 开源版不进行实际的告警定义注册,只进行详细的日志输出 + for (EventDefine eventDefine : req.getEventDefines()) { + logger.info("开源版告警定义注册处理 - 事件ID: {}, 事件名称: {}, 事件类型: {}, 严重级别: {}, 分类: {}, 部件: {}", + eventDefine.getEventId(), + eventDefine.getName(), + eventDefine.getType(), + eventDefine.getSeverity(), + eventDefine.getCategory(), + eventDefine.getParts()); + + logger.debug("开源版告警定义详细信息 - 影响: {}, 描述: {}, 主体类型: {}, 原因: {}, 建议: {}, 版本: {}, 语言: {}, 匹配键: {}", + eventDefine.getEffect(), + eventDefine.getDescription(), + eventDefine.getSubjectType(), + eventDefine.getCause(), + eventDefine.getSuggestion(), + eventDefine.getVersion(), + eventDefine.getLanguage(), + eventDefine.getDefineMatchKey()); + } + + return ResultVo.success("告警定义注册成功"); } catch (Exception e) { - logger.error("开源版告警定义注册失败: {}", eventDefine, e); + logger.error("开源版告警定义注册失败", e); + return ResultVo.error("500", "告警定义注册失败: " + e.getMessage()); } } @Override - public void sendAlarmsBatch(List<AlarmInfo> alarms) { - if (!running.get()) { - logger.warn("服务未运行,无法执行告警上报操作"); - return; - } - - if (alarms == null || alarms.isEmpty()) { - logger.warn("告警信息列表不能为空"); - return; + public ResultVo<Boolean> sendEvents(List<EventInfo> eventInfos) { + if (eventInfos == null || eventInfos.isEmpty()) { + logger.warn("事件信息列表不能为空"); + return ResultVo.error("400", "事件信息列表不能为空"); } try { - logger.info("开源版执行告警批量上报,告警数量: {}", alarms.size()); + logger.info("开源版执行事件上报,事件数量: {}", eventInfos.size()); - // 模拟调用POST /monitor/v1/events/service/send-alarm/internal - for (AlarmInfo alarmInfo : alarms) { - logger.info("开源版告警上报成功 - 告警ID: {}, 告警名称: {}, 告警级别: {}", - alarmInfo.getAlarmId(), alarmInfo.getAlarmName(), alarmInfo.getAlarmLevel()); + // 开源版不进行实际的事件上报,只进行详细的日志输出 + for (EventInfo eventInfo : eventInfos) { + logger.info("开源版事件上报处理 - 事件ID: {}, 序列号: {}, 事件名称: {}, 事件类型: {}, 严重级别: {}, 状态: {}", + eventInfo.getId(), + eventInfo.getSerialNumber(), + eventInfo.getEventName(), + eventInfo.getEventType(), + eventInfo.getSeverity(), + eventInfo.getStatus()); + + logger.debug("开源版事件详细信息 - 事件主体: {}, 主体类型: {}, 描述: {}, 影响: {}, 分类: {}, 原因: {}, 建议: {}", + eventInfo.getEventSubject(), + eventInfo.getEventSubjectType(), + eventInfo.getEventDescription(), + eventInfo.getEffect(), + eventInfo.getEventCategory(), + eventInfo.getPossibleCause(), + eventInfo.getSuggestion()); + + logger.debug("开源版事件时间信息 - 首次发生时间: {}, 清除时间: {}, 事件来源: {}, 设备序列号: {}, 设备类型: {}, 部件: {}, 语言: {}", + eventInfo.getFirstOccurTime(), + eventInfo.getClearTime(), + eventInfo.getEvenSource(), + eventInfo.getDeviceSn(), + eventInfo.getDeviceType(), + eventInfo.getParts(), + eventInfo.getLanguage()); } + return ResultVo.success(true); + } catch (Exception e) { - logger.error("开源版告警批量上报失败", e); + logger.error("开源版事件上报失败", e); + return ResultVo.error("500", "事件上报失败: " + e.getMessage()); } } @Override - public PageResult<EventInfo> getEventsByPage(EventQueryParams queryParams) { - if (!running.get()) { - logger.warn("服务未运行,无法执行告警查询操作"); - return null; - } - - if (queryParams == null) { - logger.warn("告警查询参数对象不能为空"); - return null; + public ResultVo<EventsCollection> getEventsByPage(GetEventsParams getEventsParams) { + if (getEventsParams == null) { + logger.warn("事件查询参数对象不能为空"); + return ResultVo.error("400", "事件查询参数对象不能为空"); } try { - logger.info("开源版执行告警分页查询,页码: {}, 每页大小: {}", queryParams.getPageNum(), queryParams.getPageSize()); + logger.info("开源版执行事件分页查询,页码: {}, 每页大小: {}, 告警名称: {}, 严重级别: {}, 事件类型: {}, 语言: {}", + getEventsParams.getPageNum(), getEventsParams.getPageSize(), + getEventsParams.getAlarmName(), getEventsParams.getSeverity(), + getEventsParams.getEventType(), getEventsParams.getLanguage()); - // 模拟调用POST /monitor/v1/events - // 返回模拟数据 - List<EventInfo> events = new java.util.ArrayList<>(); + // 开源版返回模拟数据,使用 EventObject 结构 + List<EventObject> events = new java.util.ArrayList<>(); - EventInfo event1 = new EventInfo("alarm_001", "数据使能服务异常", "严重"); - event1.setEventDefineId("event_def_001"); - event1.setAlarmDescription("数据使能服务响应超时"); - event1.setAlarmStatus("未处理"); - event1.setTriggerTime(System.currentTimeMillis()); - event1.setAlarmSource("数据使能模块"); + // 创建第一个事件对象 + EventObject event1 = new EventObject(); + event1.setId("1"); + event1.setEventId("event_001"); + event1.setEventName("数据使能服务异常"); + event1.setEventType("alter"); + event1.setEventCategory("system"); + event1.setDeviceSn("DEVICE_001"); + event1.setDeviceId("device_001"); + event1.setEventSubject("数据使能服务"); + event1.setSeverity("critical"); + event1.setEventSource("数据使能模块"); + event1.setParts("data_service"); + event1.setClearType("auto"); + event1.setStatus("Uncleared"); + event1.setConfirmStatus("unconfirmed"); + event1.setBlockingStatus(false); + event1.setOccurCounts(1); + event1.setFirstOccurTime(System.currentTimeMillis()); + event1.setLastOccurTime(System.currentTimeMillis()); + event1.setEventDescription("数据使能服务响应超时"); + event1.setSuggestion("检查服务状态和网络连接"); + event1.setCause("网络连接超时"); + event1.setSendToeService(false); + event1.setSerialNumber("SN_001"); + event1.setDevUrl("http://device001:8080"); events.add(event1); - EventInfo event2 = new EventInfo("alarm_002", "KMC加密失败", "警告"); - event2.setEventDefineId("event_def_002"); - event2.setAlarmDescription("KMC加密操作失败"); - event2.setAlarmStatus("已处理"); - event2.setTriggerTime(System.currentTimeMillis() - 3600000L); // 1小时前 - event2.setAlarmSource("KMC模块"); - event2.setHandleTime(System.currentTimeMillis() - 1800000L); // 30分钟前 - event2.setHandler("admin"); - event2.setHandleRemark("已修复密钥配置问题"); + // 创建第二个事件对象 + EventObject event2 = new EventObject(); + event2.setId("2"); + event2.setEventId("event_002"); + event2.setEventName("KMC加密失败"); + event2.setEventType("alter"); + event2.setEventCategory("security"); + event2.setDeviceSn("DEVICE_002"); + event2.setDeviceId("device_002"); + event2.setEventSubject("KMC加密服务"); + event2.setSeverity("major"); + event2.setEventSource("KMC模块"); + event2.setParts("kmc_service"); + event2.setClearType("manual"); + event2.setClearUser("admin"); + event2.setStatus("Cleared"); + event2.setConfirmStatus("confirmed"); + event2.setBlockingStatus(false); + event2.setOccurCounts(1); + event2.setFirstOccurTime(System.currentTimeMillis() - 3600000L); // 1小时前 + event2.setLastOccurTime(System.currentTimeMillis() - 3600000L); + event2.setClearTime(System.currentTimeMillis() - 1800000L); // 30分钟前 + event2.setEventDescription("KMC加密操作失败"); + event2.setSuggestion("检查密钥配置和证书状态"); + event2.setCause("密钥配置错误"); + event2.setSendToeService(true); + event2.setSerialNumber("SN_002"); + event2.setDevUrl("http://device002:8080"); events.add(event2); - PageResult<EventInfo> result = new PageResult<>(events, 2L, queryParams.getPageNum(), queryParams.getPageSize()); + EventsCollection eventsCollection = new EventsCollection(); + eventsCollection.setEvents(events); + eventsCollection.setTotalCount(2); - logger.info("开源版告警分页查询成功,查询到告警数量: {}, 总记录数: {}", events.size(), result.getTotal()); + logger.info("开源版事件分页查询成功,查询到事件数量: {}, 总记录数: {}", + events.size(), eventsCollection.getTotalCount()); - return result; + return ResultVo.success(eventsCollection); } catch (Exception e) { - logger.error("开源版告警分页查询失败", e); - return null; - } - } - - @Override - public AlarmDetail getAlarmDetailById(String alarmId) { - if (!running.get()) { - logger.warn("服务未运行,无法执行告警详情查询操作"); - return null; - } - - if (alarmId == null || alarmId.trim().isEmpty()) { - logger.warn("告警ID不能为空"); - return null; - } - - try { - logger.info("开源版执行告警详情查询,告警ID: {}", alarmId); - - // 模拟调用告警详情查询接口 - // 返回模拟数据 - AlarmDetail alarmDetail = new AlarmDetail(alarmId, "数据使能服务异常", "严重"); - alarmDetail.setEventDefineId("event_def_001"); - alarmDetail.setAlarmDescription("数据使能服务响应超时,影响数据处理功能"); - alarmDetail.setAlarmStatus("未处理"); - alarmDetail.setTriggerTime(System.currentTimeMillis()); - alarmDetail.setAlarmSource("数据使能模块"); - alarmDetail.setAlarmDetails("服务响应时间超过5秒,可能由于数据量过大或网络延迟导致"); - alarmDetail.setAlarmData("{\"responseTime\": 5000, \"dataSize\": \"100MB\", \"networkLatency\": \"200ms\"}"); - alarmDetail.setCreateTime(System.currentTimeMillis()); - alarmDetail.setUpdateTime(System.currentTimeMillis()); - - logger.info("开源版告警详情查询成功 - 告警ID: {}, 告警名称: {}, 告警级别: {}", - alarmDetail.getAlarmId(), alarmDetail.getAlarmName(), alarmDetail.getAlarmLevel()); - - return alarmDetail; - - } catch (Exception e) { - logger.error("开源版告警详情查询失败,告警ID: {}", alarmId, e); - return null; + logger.error("开源版事件分页查询失败", e); + return ResultVo.error("500", "事件分页查询失败: " + e.getMessage()); } } } + + + diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenUserManagementServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenUserManagementServiceImpl.java index 9bc4f9a..ab610ab 100644 --- a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenUserManagementServiceImpl.java +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenUserManagementServiceImpl.java @@ -1,20 +1,23 @@ package com.terrabase.enterprise.impl.open; import com.terrabase.enterprise.api.UserManagementService; -import com.terrabase.enterprise.api.dto.*; -import com.terrabase.enterprise.impl.open.config.KmcConfig; +import com.terrabase.enterprise.api.dto.AuthorityInfo; +import com.terrabase.enterprise.api.dto.LoginUserDto; +import com.terrabase.enterprise.api.dto.ResourceGroup; +import com.terrabase.enterprise.api.request.RoleRegisterVo; +import com.terrabase.enterprise.api.response.ResultVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.concurrent.atomic.AtomicBoolean; +import java.util.ArrayList; +import java.util.List; /** * 开源版用户管理服务实现 * 基于开源技术实现用户管理功能 - * - * @author Terrabase Team + * + * @author Yehong Pan * @version 1.0.0 */ @Service @@ -22,204 +25,147 @@ public class OpenUserManagementServiceImpl implements UserManagementService { private static final Logger logger = LoggerFactory.getLogger(OpenUserManagementServiceImpl.class); - private final AtomicBoolean running = new AtomicBoolean(false); - - @Autowired - private KmcConfig kmcConfig; - - @Override - public String getServiceName() { - return "Open Source User Management Service"; - } - - @Override - public String getServiceVersion() { - return "1.0.0-open"; - } - - @Override - public String getServiceType() { - return "open"; - } - - @Override - public String getHealthStatus() { - if (!running.get()) { - return "服务未运行"; - } - - return String.format("开源版用户管理服务健康状态: 正常 (版本: %s, 类型: %s)", - getServiceVersion(), getServiceType()); - } - - @Override - public void start() { - if (running.compareAndSet(false, true)) { - logger.info("开源版用户管理服务已启动"); - } else { - logger.warn("开源版用户管理服务已经在运行中"); - } - } - - @Override - public void stop() { - if (running.compareAndSet(true, false)) { - logger.info("开源版用户管理服务已停止"); - } else { - logger.warn("开源版用户管理服务已经停止"); - } - } - - @Override - public boolean isRunning() { - return running.get(); - } - // ========== 用户注册相关接口实现 ========== @Override - public void registerRole(RoleRegister roleRegister) { - if (!running.get()) { - logger.warn("服务未运行,无法执行角色注册操作"); - return; - } - + public void batchRegisterRole(RoleRegisterVo roleRegister) { if (roleRegister == null) { logger.warn("角色注册对象不能为空"); return; } try { - logger.info("开源版执行角色注册: {}", roleRegister); - - logger.info("开源版角色注册成功 - 角色ID: {}, 角色名称: {}, 应用场景: {}", - roleRegister.getRoleId(), roleRegister.getRoleName(), roleRegister.getApplicationScenario()); + logger.info("开源版执行批量角色注册"); - // 记录审计日志 - if (kmcConfig.isEnableAuditLog()) { - logger.info("角色注册审计 - 角色ID: {}, 角色名称: {}, 角色类型: {}", - roleRegister.getRoleId(), roleRegister.getRoleName(), roleRegister.getRoleType()); + // 处理角色注册信息列表 + if (roleRegister.getRoleRegisterInfos() != null && !roleRegister.getRoleRegisterInfos().isEmpty()) { + logger.info("开源版处理角色注册信息,数量: {}", roleRegister.getRoleRegisterInfos().size()); + + for (com.terrabase.enterprise.api.dto.RoleRegisterInfo roleInfo : roleRegister.getRoleRegisterInfos()) { + logger.info("开源版角色注册成功 - 角色名: {}, 角色名代码: {}, 描述: {}, 可创建: {}, 支持登录类型: {}", + roleInfo.getName(), + roleInfo.getNameCode(), + roleInfo.getDescription(), + roleInfo.isCreatable(), + roleInfo.getSupportLoginType()); + } } + // 处理角色国际化信息列表 + if (roleRegister.getRoleI18nInfos() != null && !roleRegister.getRoleI18nInfos().isEmpty()) { + logger.info("开源版处理角色国际化信息,数量: {}", roleRegister.getRoleI18nInfos().size()); + + for (com.terrabase.enterprise.api.dto.RoleI18nInfo i18nInfo : roleRegister.getRoleI18nInfos()) { + logger.info("开源版角色国际化信息 - 角色名: {}, 代码: {}, 语言: {}, 内容: {}", + i18nInfo.getName(), + i18nInfo.getCode(), + i18nInfo.getLanguage(), + i18nInfo.getContent()); + } + } + } catch (Exception e) { - logger.error("开源版角色注册失败: {}", roleRegister, e); + logger.error("开源版批量角色注册失败: {}", roleRegister, e); } } @Override - public void registerAuthority(AuthorityInfos authorityInfos) { - if (!running.get()) { - logger.warn("服务未运行,无法执行权限注册操作"); - return; - } - - if (authorityInfos == null || authorityInfos.getAuthorityList() == null) { - logger.warn("权限注册对象不能为空"); + public void registerPermission(List<AuthorityInfo> authorityInfos) { + if (authorityInfos == null || authorityInfos.isEmpty()) { + logger.warn("权限注册列表不能为空"); return; } try { - logger.info("开源版执行权限注册,权限数量: {}", authorityInfos.getAuthorityList().size()); + logger.info("开源版执行批量权限注册,权限数量: {}", authorityInfos.size()); - for (AuthorityInfos.AuthorityInfo authorityInfo : authorityInfos.getAuthorityList()) { - logger.info("开源版权限注册成功 - 权限ID: {}, 权限名称: {}, 权限类型: {}", - authorityInfo.getAuthorityId(), authorityInfo.getAuthorityName(), authorityInfo.getAuthorityType()); - } - - // 记录审计日志 - if (kmcConfig.isEnableAuditLog()) { - logger.info("权限注册审计 - 权限数量: {}, 应用场景: {}", - authorityInfos.getAuthorityList().size(), authorityInfos.getApplicationScenario()); + for (AuthorityInfo authorityInfo : authorityInfos) { + logger.info("开源版权限注册成功 - 资源标识: {}, 描述: {}, 跳过检查: {}, 所需角色: {}", + authorityInfo.getResourceKey(), + authorityInfo.getDescription(), + authorityInfo.isSkipCheck(), + authorityInfo.getRoles()); } - + } catch (Exception e) { - logger.error("开源版权限注册失败: {}", authorityInfos, e); + logger.error("开源版批量权限注册失败: {}", authorityInfos, e); } } @Override - public void registerMenu(MenuRegisterInfo menuRegisterInfo) { - if (!running.get()) { - logger.warn("服务未运行,无法执行菜单注册操作"); - return; - } - - if (menuRegisterInfo == null || menuRegisterInfo.getMenuList() == null) { - logger.warn("菜单注册对象不能为空"); - return; + public List<ResourceGroup> getUserGroups(String userName) { + if (userName == null || userName.trim().isEmpty()) { + logger.warn("用户名不能为空"); + return new ArrayList<>(); } try { - logger.info("开源版执行菜单注册,菜单数量: {}", menuRegisterInfo.getMenuList().size()); - - for (MenuRegisterInfo.MenuInfo menuInfo : menuRegisterInfo.getMenuList()) { - logger.info("开源版菜单注册成功 - 菜单ID: {}, 菜单名称: {}, 菜单路径: {}", - menuInfo.getMenuId(), menuInfo.getMenuName(), menuInfo.getMenuPath()); - } + logger.info("开源版获取用户资源组: {}", userName); - // 记录审计日志 - if (kmcConfig.isEnableAuditLog()) { - logger.info("菜单注册审计 - 菜单数量: {}, 应用场景: {}", - menuRegisterInfo.getMenuList().size(), menuRegisterInfo.getApplicationScenario()); - } + // 开源版实现:返回默认的公共资源组 + List<ResourceGroup> groups = new ArrayList<>(); + groups.add(ResourceGroup.buildPublicGroup()); + + logger.info("开源版获取用户资源组成功 - 用户: {}, 资源组数量: {}", userName, groups.size()); + + return groups; } catch (Exception e) { - logger.error("开源版菜单注册失败: {}", menuRegisterInfo, e); + logger.error("开源版获取用户资源组失败 - 用户: {}", userName, e); + return new ArrayList<>(); } } + + // ========== 用户认证相关接口实现 ========== @Override - public void registerMenuForbidden(ForbiddenBody forbiddenBody) { - if (!running.get()) { - logger.warn("服务未运行,无法执行菜单屏蔽注册操作"); - return; - } - - if (forbiddenBody == null || forbiddenBody.getForbiddenMenuIds() == null) { - logger.warn("菜单屏蔽对象不能为空"); - return; - } - + public ResultVo<List<String>> queryRolesByToken() { try { - logger.info("开源版执行菜单屏蔽注册,屏蔽菜单数量: {}", forbiddenBody.getForbiddenMenuIds().size()); - - for (String menuId : forbiddenBody.getForbiddenMenuIds()) { - logger.info("开源版菜单屏蔽注册成功 - 菜单ID: {}, 屏蔽原因: {}", menuId, forbiddenBody.getReason()); - } + logger.info("开源版执行根据token查询角色名"); - // 记录审计日志 - if (kmcConfig.isEnableAuditLog()) { - logger.info("菜单屏蔽注册审计 - 屏蔽菜单数量: {}, 屏蔽原因: {}, 是否永久屏蔽: {}", - forbiddenBody.getForbiddenMenuIds().size(), forbiddenBody.getReason(), forbiddenBody.getPermanent()); - } + // 开源版实现:返回模拟的角色数据 + List<String> roles = new java.util.ArrayList<>(); + roles.add("admin"); + roles.add("user"); + roles.add("operator"); + + logger.info("开源版根据token查询角色名成功,角色数量: {}", roles.size()); + return ResultVo.success(roles); } catch (Exception e) { - logger.error("开源版菜单屏蔽注册失败: {}", forbiddenBody, e); + logger.error("开源版根据token查询角色名失败", e); + return ResultVo.error("500", "角色查询失败: " + e.getMessage()); } } - - // ========== 时间管理相关接口实现 ========== @Override - public void subscribeTimeConfigChange(Subscribe subscribe) { - if (!running.get()) { - logger.warn("服务未运行,无法执行时间配置变更事件订阅操作"); - return; - } - - if (subscribe == null) { - logger.warn("订阅信息对象不能为空"); - return; - } - + public ResultVo<List<LoginUserDto>> getCurrentUserInfo() { try { - logger.info("开源版执行时间配置变更事件订阅: {}", subscribe); - - logger.info("开源版时间配置变更事件订阅成功 - 订阅ID: {}, 服务名称: {}, 通知地址: {}", - subscribe.getSubscribeId(), subscribe.getServiceName(), subscribe.getNotifyAddress()); + logger.info("开源版执行获取当前用户信息"); + + // 开源版实现:返回模拟的用户信息 + List<LoginUserDto> users = new java.util.ArrayList<>(); + + LoginUserDto user = new LoginUserDto(); + user.setUserName("admin"); + user.setUserId("admin_001"); + user.setRole("admin"); + + // 设置资源组 + List<ResourceGroup> resourceGroups = new java.util.ArrayList<>(); + resourceGroups.add(ResourceGroup.buildPublicGroup()); + user.setResourceGroups(resourceGroups); + users.add(user); + + logger.info("开源版获取当前用户信息成功,用户数量: {}", users.size()); + return ResultVo.success(users); } catch (Exception e) { - logger.error("开源版时间配置变更事件订阅失败: {}", subscribe, e); + logger.error("开源版获取当前用户信息失败", e); + return ResultVo.error("500", "用户信息查询失败: " + e.getMessage()); } } } + + + diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/util/KmcCryptoUtil.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/util/KmcCryptoUtil.java index 2a74c40..6d8357e 100644 --- a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/util/KmcCryptoUtil.java +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/util/KmcCryptoUtil.java @@ -14,8 +14,6 @@ import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.*; -import java.security.spec.PKCS8EncodedKeySpec; -import java.security.spec.X509EncodedKeySpec; import java.util.concurrent.ConcurrentHashMap; import java.util.Map; @@ -23,7 +21,7 @@ * KMC (Key Management Center) 加解密工具类 * 基于开源算法实现数据加解密功能 * - * @author Terrabase Team + * @author Yehong Pan * @version 1.0.0 */ public class KmcCryptoUtil { @@ -90,16 +88,20 @@ public static SecretKey createKeyFromBytes(byte[] keyBytes) { } /** - * 获取或创建密钥 + * 获取或生成密钥 * @param keyId 密钥ID * @return 密钥对象 */ - public static SecretKey getOrCreateKey(String keyId) { - return keyCache.computeIfAbsent(keyId, KmcCryptoUtil::generateKey); + public static SecretKey getOrGenerateKey(String keyId) { + SecretKey key = keyCache.get(keyId); + if (key == null) { + key = generateAndCacheKey(keyId); + } + return key; } /** - * 加密数据 + * 使用指定密钥加密数据 * @param plaintext 明文数据 * @param keyId 密钥ID * @return 加密后的Base64编码字符串 @@ -110,33 +112,27 @@ public static String encrypt(String plaintext, String keyId) { } try { - SecretKey key = getOrCreateKey(keyId); + SecretKey key = getOrGenerateKey(keyId); // 生成随机IV byte[] iv = new byte[GCM_IV_LENGTH]; secureRandom.nextBytes(iv); - // 创建GCM参数规范 - GCMParameterSpec gcmSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv); - - // 初始化加密器 + // 创建Cipher对象 Cipher cipher = Cipher.getInstance(TRANSFORMATION); + GCMParameterSpec gcmSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv); cipher.init(Cipher.ENCRYPT_MODE, key, gcmSpec); - // 执行加密 - byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); + // 加密数据 + byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); - // 将IV和密文组合 - byte[] encryptedData = new byte[GCM_IV_LENGTH + ciphertext.length]; - System.arraycopy(iv, 0, encryptedData, 0, GCM_IV_LENGTH); - System.arraycopy(ciphertext, 0, encryptedData, GCM_IV_LENGTH, ciphertext.length); + // 将IV和加密数据组合 + byte[] combined = new byte[GCM_IV_LENGTH + encryptedBytes.length]; + System.arraycopy(iv, 0, combined, 0, GCM_IV_LENGTH); + System.arraycopy(encryptedBytes, 0, combined, GCM_IV_LENGTH, encryptedBytes.length); // 返回Base64编码的结果 - String result = Base64.encodeBase64String(encryptedData); - logger.debug("数据加密成功,密钥ID: {}, 原文长度: {}, 密文长度: {}", - keyId, plaintext.length(), result.length()); - - return result; + return Base64.encodeBase64String(combined); } catch (Exception e) { logger.error("数据加密失败,密钥ID: {}", keyId, e); @@ -145,7 +141,7 @@ public static String encrypt(String plaintext, String keyId) { } /** - * 解密数据 + * 使用指定密钥解密数据 * @param ciphertext 密文数据(Base64编码) * @param keyId 密钥ID * @return 解密后的明文数据 @@ -156,37 +152,25 @@ public static String decrypt(String ciphertext, String keyId) { } try { - SecretKey key = getOrCreateKey(keyId); + SecretKey key = getOrGenerateKey(keyId); // 解码Base64 - byte[] encryptedData = Base64.decodeBase64(ciphertext); - - // 检查数据长度 - if (encryptedData.length < GCM_IV_LENGTH) { - throw new IllegalArgumentException("密文数据格式错误"); - } + byte[] combined = Base64.decodeBase64(ciphertext); - // 提取IV和密文 + // 分离IV和加密数据 byte[] iv = new byte[GCM_IV_LENGTH]; - byte[] cipherBytes = new byte[encryptedData.length - GCM_IV_LENGTH]; - System.arraycopy(encryptedData, 0, iv, 0, GCM_IV_LENGTH); - System.arraycopy(encryptedData, GCM_IV_LENGTH, cipherBytes, 0, cipherBytes.length); - - // 创建GCM参数规范 - GCMParameterSpec gcmSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv); + byte[] encryptedBytes = new byte[combined.length - GCM_IV_LENGTH]; + System.arraycopy(combined, 0, iv, 0, GCM_IV_LENGTH); + System.arraycopy(combined, GCM_IV_LENGTH, encryptedBytes, 0, encryptedBytes.length); - // 初始化解密器 + // 创建Cipher对象 Cipher cipher = Cipher.getInstance(TRANSFORMATION); + GCMParameterSpec gcmSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv); cipher.init(Cipher.DECRYPT_MODE, key, gcmSpec); - // 执行解密 - byte[] plaintext = cipher.doFinal(cipherBytes); - String result = new String(plaintext, StandardCharsets.UTF_8); - - logger.debug("数据解密成功,密钥ID: {}, 密文长度: {}, 原文长度: {}", - keyId, ciphertext.length(), result.length()); - - return result; + // 解密数据 + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + return new String(decryptedBytes, StandardCharsets.UTF_8); } catch (Exception e) { logger.error("数据解密失败,密钥ID: {}", keyId, e); @@ -331,174 +315,221 @@ public static String decrypt(String ciphertext, String keyId, CryptoAlgorithm al /** * 对称加密 + * @param plaintext 明文数据 + * @param keyId 密钥ID + * @param algorithm 加密算法 + * @return 加密后的Base64编码字符串 */ - private static String encryptSymmetric(String plaintext, String keyId, CryptoAlgorithm algorithm) throws Exception { - SecretKey key = getOrCreateSymmetricKey(keyId, algorithm); - - Cipher cipher = Cipher.getInstance(algorithm.getTransformation()); - - if (algorithm == CryptoAlgorithm.AES) { - // AES使用GCM模式 - byte[] iv = new byte[12]; // GCM IV长度 - secureRandom.nextBytes(iv); - GCMParameterSpec gcmSpec = new GCMParameterSpec(128, iv); - cipher.init(Cipher.ENCRYPT_MODE, key, gcmSpec); - - byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); - - // 将IV和密文组合 - byte[] encryptedData = new byte[iv.length + ciphertext.length]; - System.arraycopy(iv, 0, encryptedData, 0, iv.length); - System.arraycopy(ciphertext, 0, encryptedData, iv.length, ciphertext.length); - - return Base64.encodeBase64String(encryptedData); - } else if (algorithm == CryptoAlgorithm.CHACHA20) { - // ChaCha20使用特殊的IV处理 - byte[] iv = new byte[12]; // ChaCha20需要12字节的nonce - secureRandom.nextBytes(iv); - IvParameterSpec ivSpec = new IvParameterSpec(iv); - cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); - - byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); - - // 将IV和密文组合 - byte[] encryptedData = new byte[iv.length + ciphertext.length]; - System.arraycopy(iv, 0, encryptedData, 0, iv.length); - System.arraycopy(ciphertext, 0, encryptedData, iv.length, ciphertext.length); - - return Base64.encodeBase64String(encryptedData); - } else { - // 其他对称算法使用CBC模式 - cipher.init(Cipher.ENCRYPT_MODE, key); - byte[] iv = cipher.getIV(); - byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); - - // 将IV和密文组合 - byte[] encryptedData = new byte[iv.length + ciphertext.length]; - System.arraycopy(iv, 0, encryptedData, 0, iv.length); - System.arraycopy(ciphertext, 0, encryptedData, iv.length, ciphertext.length); + private static String encryptSymmetric(String plaintext, String keyId, CryptoAlgorithm algorithm) { + try { + SecretKey key = getOrGenerateKey(keyId); - return Base64.encodeBase64String(encryptedData); + // 根据算法选择不同的加密方式 + if (algorithm == CryptoAlgorithm.AES) { + return encryptAES(plaintext, key); + } else if (algorithm == CryptoAlgorithm.DES) { + return encryptDES(plaintext, key); + } else if (algorithm == CryptoAlgorithm.TRIPLE_DES) { + return encryptTripleDES(plaintext, key); + } else if (algorithm == CryptoAlgorithm.BLOWFISH) { + return encryptBlowfish(plaintext, key); + } else { + // 默认使用AES + return encryptAES(plaintext, key); + } + } catch (Exception e) { + logger.error("对称加密失败,算法: {}", algorithm, e); + throw new RuntimeException("对称加密失败", e); } } /** * 对称解密 + * @param ciphertext 密文数据 + * @param keyId 密钥ID + * @param algorithm 解密算法 + * @return 解密后的明文数据 */ - private static String decryptSymmetric(String ciphertext, String keyId, CryptoAlgorithm algorithm) throws Exception { - SecretKey key = getOrCreateSymmetricKey(keyId, algorithm); - - byte[] encryptedData = Base64.decodeBase64(ciphertext); - Cipher cipher = Cipher.getInstance(algorithm.getTransformation()); - - if (algorithm == CryptoAlgorithm.AES) { - // AES使用GCM模式 - byte[] iv = new byte[12]; - byte[] cipherBytes = new byte[encryptedData.length - 12]; - System.arraycopy(encryptedData, 0, iv, 0, 12); - System.arraycopy(encryptedData, 12, cipherBytes, 0, cipherBytes.length); - - GCMParameterSpec gcmSpec = new GCMParameterSpec(128, iv); - cipher.init(Cipher.DECRYPT_MODE, key, gcmSpec); - - byte[] plaintext = cipher.doFinal(cipherBytes); - return new String(plaintext, StandardCharsets.UTF_8); - } else if (algorithm == CryptoAlgorithm.CHACHA20) { - // ChaCha20使用特殊的IV处理 - byte[] iv = new byte[12]; // ChaCha20需要12字节的nonce - byte[] cipherBytes = new byte[encryptedData.length - 12]; - System.arraycopy(encryptedData, 0, iv, 0, 12); - System.arraycopy(encryptedData, 12, cipherBytes, 0, cipherBytes.length); - - IvParameterSpec ivSpec = new IvParameterSpec(iv); - cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); - - byte[] plaintext = cipher.doFinal(cipherBytes); - return new String(plaintext, StandardCharsets.UTF_8); - } else { - // 其他对称算法使用CBC模式 - byte[] iv = new byte[cipher.getBlockSize()]; - byte[] cipherBytes = new byte[encryptedData.length - iv.length]; - System.arraycopy(encryptedData, 0, iv, 0, iv.length); - System.arraycopy(encryptedData, iv.length, cipherBytes, 0, cipherBytes.length); - - IvParameterSpec ivSpec = new IvParameterSpec(iv); - cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); + private static String decryptSymmetric(String ciphertext, String keyId, CryptoAlgorithm algorithm) { + try { + SecretKey key = getOrGenerateKey(keyId); - byte[] plaintext = cipher.doFinal(cipherBytes); - return new String(plaintext, StandardCharsets.UTF_8); + // 根据算法选择不同的解密方式 + if (algorithm == CryptoAlgorithm.AES) { + return decryptAES(ciphertext, key); + } else if (algorithm == CryptoAlgorithm.DES) { + return decryptDES(ciphertext, key); + } else if (algorithm == CryptoAlgorithm.TRIPLE_DES) { + return decryptTripleDES(ciphertext, key); + } else if (algorithm == CryptoAlgorithm.BLOWFISH) { + return decryptBlowfish(ciphertext, key); + } else { + // 默认使用AES + return decryptAES(ciphertext, key); + } + } catch (Exception e) { + logger.error("对称解密失败,算法: {}", algorithm, e); + throw new RuntimeException("对称解密失败", e); } } /** - * 非对称加密(RSA) + * AES加密 */ - private static String encryptAsymmetric(String plaintext, String keyId, CryptoAlgorithm algorithm) throws Exception { - KeyPair keyPair = getOrCreateKeyPair(keyId, algorithm); - PublicKey publicKey = keyPair.getPublic(); + private static String encryptAES(String plaintext, SecretKey key) throws Exception { + Cipher cipher = Cipher.getInstance(TRANSFORMATION); + GCMParameterSpec gcmSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, new byte[GCM_IV_LENGTH]); + cipher.init(Cipher.ENCRYPT_MODE, key, gcmSpec); - Cipher cipher = Cipher.getInstance(algorithm.getTransformation()); - cipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); + byte[] iv = cipher.getIV(); - byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); - return Base64.encodeBase64String(ciphertext); + byte[] combined = new byte[iv.length + encryptedBytes.length]; + System.arraycopy(iv, 0, combined, 0, iv.length); + System.arraycopy(encryptedBytes, 0, combined, iv.length, encryptedBytes.length); + + return Base64.encodeBase64String(combined); } /** - * 非对称解密(RSA) + * AES解密 */ - private static String decryptAsymmetric(String ciphertext, String keyId, CryptoAlgorithm algorithm) throws Exception { - KeyPair keyPair = getOrCreateKeyPair(keyId, algorithm); - PrivateKey privateKey = keyPair.getPrivate(); + private static String decryptAES(String ciphertext, SecretKey key) throws Exception { + byte[] combined = Base64.decodeBase64(ciphertext); + byte[] iv = new byte[GCM_IV_LENGTH]; + byte[] encryptedBytes = new byte[combined.length - GCM_IV_LENGTH]; + + System.arraycopy(combined, 0, iv, 0, GCM_IV_LENGTH); + System.arraycopy(combined, GCM_IV_LENGTH, encryptedBytes, 0, encryptedBytes.length); - Cipher cipher = Cipher.getInstance(algorithm.getTransformation()); - cipher.init(Cipher.DECRYPT_MODE, privateKey); + Cipher cipher = Cipher.getInstance(TRANSFORMATION); + GCMParameterSpec gcmSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv); + cipher.init(Cipher.DECRYPT_MODE, key, gcmSpec); - byte[] encryptedData = Base64.decodeBase64(ciphertext); - byte[] plaintext = cipher.doFinal(encryptedData); - return new String(plaintext, StandardCharsets.UTF_8); + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + return new String(decryptedBytes, StandardCharsets.UTF_8); } /** - * 获取或创建对称密钥 + * DES加密 */ - private static SecretKey getOrCreateSymmetricKey(String keyId, CryptoAlgorithm algorithm) throws Exception { - String cacheKey = keyId + "_" + algorithm.name(); - return keyCache.computeIfAbsent(cacheKey, k -> { - try { - KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm.getAlgorithm()); - keyGenerator.init(algorithm.getDefaultKeyLength()); - return keyGenerator.generateKey(); - } catch (Exception e) { - throw new RuntimeException("生成对称密钥失败", e); - } - }); + private static String encryptDES(String plaintext, SecretKey key) throws Exception { + Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, key); + + byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); + byte[] iv = cipher.getIV(); + + byte[] combined = new byte[iv.length + encryptedBytes.length]; + System.arraycopy(iv, 0, combined, 0, iv.length); + System.arraycopy(encryptedBytes, 0, combined, iv.length, encryptedBytes.length); + + return Base64.encodeBase64String(combined); } /** - * 获取或创建密钥对 + * DES解密 */ - private static KeyPair getOrCreateKeyPair(String keyId, CryptoAlgorithm algorithm) throws Exception { - String cacheKey = keyId + "_" + algorithm.name(); - return keyPairCache.computeIfAbsent(cacheKey, k -> { - try { - KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm.getAlgorithm()); - keyPairGenerator.initialize(algorithm.getDefaultKeyLength()); - return keyPairGenerator.generateKeyPair(); - } catch (Exception e) { - throw new RuntimeException("生成密钥对失败", e); - } - }); + private static String decryptDES(String ciphertext, SecretKey key) throws Exception { + byte[] combined = Base64.decodeBase64(ciphertext); + byte[] iv = new byte[8]; + byte[] encryptedBytes = new byte[combined.length - 8]; + + System.arraycopy(combined, 0, iv, 0, 8); + System.arraycopy(combined, 8, encryptedBytes, 0, encryptedBytes.length); + + Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv)); + + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + return new String(decryptedBytes, StandardCharsets.UTF_8); } /** - * 清空所有密钥缓存 + * 3DES加密 */ - public static void clearAllCaches() { - int symmetricCount = keyCache.size(); - int asymmetricCount = keyPairCache.size(); - keyCache.clear(); - keyPairCache.clear(); - logger.info("已清空所有密钥缓存,对称密钥: {}, 非对称密钥: {}", symmetricCount, asymmetricCount); + private static String encryptTripleDES(String plaintext, SecretKey key) throws Exception { + Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, key); + + byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); + byte[] iv = cipher.getIV(); + + byte[] combined = new byte[iv.length + encryptedBytes.length]; + System.arraycopy(iv, 0, combined, 0, iv.length); + System.arraycopy(encryptedBytes, 0, combined, iv.length, encryptedBytes.length); + + return Base64.encodeBase64String(combined); + } + + /** + * 3DES解密 + */ + private static String decryptTripleDES(String ciphertext, SecretKey key) throws Exception { + byte[] combined = Base64.decodeBase64(ciphertext); + byte[] iv = new byte[8]; + byte[] encryptedBytes = new byte[combined.length - 8]; + + System.arraycopy(combined, 0, iv, 0, 8); + System.arraycopy(combined, 8, encryptedBytes, 0, encryptedBytes.length); + + Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv)); + + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + return new String(decryptedBytes, StandardCharsets.UTF_8); + } + + /** + * Blowfish加密 + */ + private static String encryptBlowfish(String plaintext, SecretKey key) throws Exception { + Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, key); + + byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); + byte[] iv = cipher.getIV(); + + byte[] combined = new byte[iv.length + encryptedBytes.length]; + System.arraycopy(iv, 0, combined, 0, iv.length); + System.arraycopy(encryptedBytes, 0, combined, iv.length, encryptedBytes.length); + + return Base64.encodeBase64String(combined); + } + + /** + * Blowfish解密 + */ + private static String decryptBlowfish(String ciphertext, SecretKey key) throws Exception { + byte[] combined = Base64.decodeBase64(ciphertext); + byte[] iv = new byte[8]; + byte[] encryptedBytes = new byte[combined.length - 8]; + + System.arraycopy(combined, 0, iv, 0, 8); + System.arraycopy(combined, 8, encryptedBytes, 0, encryptedBytes.length); + + Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv)); + + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + return new String(decryptedBytes, StandardCharsets.UTF_8); + } + + /** + * 非对称加密 + */ + private static String encryptAsymmetric(String plaintext, String keyId, CryptoAlgorithm algorithm) { + // 简化实现,实际项目中需要更复杂的非对称加密逻辑 + logger.warn("非对称加密暂未完全实现,使用对称加密替代"); + return encryptSymmetric(plaintext, keyId, CryptoAlgorithm.AES); + } + + /** + * 非对称解密 + */ + private static String decryptAsymmetric(String ciphertext, String keyId, CryptoAlgorithm algorithm) { + // 简化实现,实际项目中需要更复杂的非对称解密逻辑 + logger.warn("非对称解密暂未完全实现,使用对称解密替代"); + return decryptSymmetric(ciphertext, keyId, CryptoAlgorithm.AES); } -} +} \ No newline at end of file diff --git a/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplIntegrationTest.java b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplIntegrationTest.java index 00bed1b..fff579e 100644 --- a/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplIntegrationTest.java +++ b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplIntegrationTest.java @@ -1,71 +1,39 @@ package com.terrabase.enterprise.impl.open; -import com.terrabase.enterprise.impl.open.config.KmcConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; import static org.junit.jupiter.api.Assertions.*; /** - * 开源版企业服务集成测试 - * 测试企业服务的基本功能 - * - * @author Terrabase Team - * @version 1.0.0 + * 开源版企业服务集成测试(适配当前API) */ -@ExtendWith(MockitoExtension.class) class OpenEnterpriseServiceImplIntegrationTest { - @Mock - private KmcConfig kmcConfig; - - @InjectMocks private OpenEnterpriseServiceImpl enterpriseService; @BeforeEach void setUp() { - // 启动服务 - enterpriseService.start(); + enterpriseService = new OpenEnterpriseServiceImpl(); } @Test void testBasicServiceOperations() { - // 测试基本服务操作 assertEquals("Open Source Enterprise Service", enterpriseService.getServiceName()); assertEquals("1.0.0-open", enterpriseService.getServiceVersion()); assertEquals("open", enterpriseService.getServiceType()); - assertTrue(enterpriseService.isRunning()); - // 测试健康状态 String healthStatus = enterpriseService.getHealthStatus(); assertNotNull(healthStatus); assertTrue(healthStatus.contains("正常")); } - @Test - void testServiceStartStop() { - // 测试服务启动和停止 - assertTrue(enterpriseService.isRunning()); - - enterpriseService.stop(); - assertFalse(enterpriseService.isRunning()); - - enterpriseService.start(); - assertTrue(enterpriseService.isRunning()); - } - @Test void testServiceMetadata() { - // 测试服务元数据 assertEquals("Open Source Enterprise Service", enterpriseService.getServiceName()); assertEquals("1.0.0-open", enterpriseService.getServiceVersion()); assertEquals("open", enterpriseService.getServiceType()); - // 验证元数据不为空 assertNotNull(enterpriseService.getServiceName()); assertNotNull(enterpriseService.getServiceVersion()); assertNotNull(enterpriseService.getServiceType()); @@ -73,126 +41,14 @@ void testServiceMetadata() { @Test void testHealthStatus() { - // 测试健康状态 String healthStatus = enterpriseService.getHealthStatus(); assertNotNull(healthStatus); assertTrue(healthStatus.contains("开源版")); - - // 停止服务后测试健康状态 - enterpriseService.stop(); - String stoppedHealthStatus = enterpriseService.getHealthStatus(); - assertTrue(stoppedHealthStatus.contains("停止")); - } - - @Test - void testServiceStateConsistency() { - // 测试服务状态一致性 - assertTrue(enterpriseService.isRunning()); - - // 多次调用应该返回相同结果 - assertTrue(enterpriseService.isRunning()); - assertTrue(enterpriseService.isRunning()); - - enterpriseService.stop(); - assertFalse(enterpriseService.isRunning()); - assertFalse(enterpriseService.isRunning()); - } - - @Test - void testServiceLifecycle() { - // 测试服务生命周期 - // 初始状态 - assertFalse(enterpriseService.isRunning()); - - // 启动服务 - enterpriseService.start(); - assertTrue(enterpriseService.isRunning()); - - // 停止服务 - enterpriseService.stop(); - assertFalse(enterpriseService.isRunning()); - - // 重启服务 - enterpriseService.start(); - assertTrue(enterpriseService.isRunning()); - } - - @Test - void testConcurrentOperations() throws InterruptedException { - // 测试并发操作 - Thread[] threads = new Thread[5]; - boolean[] results = new boolean[5]; - - for (int i = 0; i < 5; i++) { - final int index = i; - threads[i] = new Thread(() -> { - try { - // 模拟并发操作 - String serviceName = enterpriseService.getServiceName(); - String serviceVersion = enterpriseService.getServiceVersion(); - String serviceType = enterpriseService.getServiceType(); - boolean isRunning = enterpriseService.isRunning(); - String healthStatus = enterpriseService.getHealthStatus(); - - results[index] = serviceName != null && - serviceVersion != null && - serviceType != null && - healthStatus != null; - } catch (Exception e) { - results[index] = false; - } - }); - } - - // 启动所有线程 - for (Thread thread : threads) { - thread.start(); - } - - // 等待所有线程完成 - for (Thread thread : threads) { - thread.join(); - } - - // 验证所有线程都成功执行 - for (boolean result : results) { - assertTrue(result, "并发操作应该成功"); - } - } - - @Test - void testServiceRestart() { - // 测试服务重启 - assertTrue(enterpriseService.isRunning()); - - // 停止服务 - enterpriseService.stop(); - assertFalse(enterpriseService.isRunning()); - - // 重启服务 - enterpriseService.start(); - assertTrue(enterpriseService.isRunning()); - - // 验证健康状态 - String healthStatus = enterpriseService.getHealthStatus(); assertTrue(healthStatus.contains("正常")); } - @Test - void testServiceErrorHandling() { - // 测试服务错误处理 - // 多次启动应该不会出错 - assertDoesNotThrow(() -> enterpriseService.start()); - assertDoesNotThrow(() -> enterpriseService.start()); - - // 多次停止应该不会出错 - assertDoesNotThrow(() -> enterpriseService.stop()); - assertDoesNotThrow(() -> enterpriseService.stop()); - } - @Test void testServiceInformationConsistency() { - // 测试服务信息一致性 String serviceName1 = enterpriseService.getServiceName(); String serviceName2 = enterpriseService.getServiceName(); assertEquals(serviceName1, serviceName2); @@ -205,19 +61,4 @@ void testServiceInformationConsistency() { String serviceType2 = enterpriseService.getServiceType(); assertEquals(serviceType1, serviceType2); } - - @Test - void testServiceHealthStatusChanges() { - // 测试健康状态变化 - String runningHealthStatus = enterpriseService.getHealthStatus(); - assertTrue(runningHealthStatus.contains("正常")); - - enterpriseService.stop(); - String stoppedHealthStatus = enterpriseService.getHealthStatus(); - assertTrue(stoppedHealthStatus.contains("停止")); - - enterpriseService.start(); - String restartedHealthStatus = enterpriseService.getHealthStatus(); - assertTrue(restartedHealthStatus.contains("正常")); - } } \ No newline at end of file diff --git a/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java index 7f30a38..79852ac 100644 --- a/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java +++ b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java @@ -1,245 +1,54 @@ package com.terrabase.enterprise.impl.open; -import com.terrabase.enterprise.impl.open.config.KmcConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.DisplayName; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.TestPropertySource; import static org.junit.jupiter.api.Assertions.*; /** - * 开源版企业服务KMC功能集成测试 - * - * @author Terrabase Team - * @version 1.0.0 + * 开源版企业服务基本功能测试(适配当前API) */ -@SpringBootTest(classes = TestConfiguration.class) -@TestPropertySource(properties = { - "terrabase.kmc.enabled=true", - "terrabase.kmc.default-key-id=test_default", - "terrabase.kmc.enable-audit-log=true" -}) -@DisplayName("开源版企业服务KMC功能集成测试") +@DisplayName("开源版企业服务基本功能测试") public class OpenEnterpriseServiceImplKmcTest { private OpenEnterpriseServiceImpl service; - private KmcConfig kmcConfig; @BeforeEach void setUp() { service = new OpenEnterpriseServiceImpl(); - kmcConfig = new KmcConfig(); - kmcConfig.setEnabled(true); - kmcConfig.setDefaultKeyId("test_default"); - kmcConfig.setEnableAuditLog(true); - - // 使用反射设置私有字段 - try { - var field = service.getClass().getDeclaredField("kmcConfig"); - field.setAccessible(true); - field.set(service, kmcConfig); - - // 启动服务 - var runningField = service.getClass().getDeclaredField("running"); - runningField.setAccessible(true); - var running = (java.util.concurrent.atomic.AtomicBoolean) runningField.get(service); - running.set(true); - } catch (Exception e) { - throw new RuntimeException("设置KMC配置失败", e); - } } @Test - @DisplayName("测试服务初始化") + @DisplayName("测试服务初始化与健康状态") void testServiceInitialization() { - // 验证服务信息 assertEquals("Open Source Enterprise Service", service.getServiceName()); assertEquals("1.0.0-open", service.getServiceVersion()); assertEquals("open", service.getServiceType()); - // 验证健康状态 - String healthStatus = service.getHealthStatus(); - assertTrue(healthStatus.contains("正常")); - assertTrue(healthStatus.contains("开源版")); - } - - @Test - @DisplayName("测试服务启动") - void testServiceStart() { - // 停止服务 - service.stop(); - assertFalse(service.isRunning()); - - // 启动服务 - service.start(); - assertTrue(service.isRunning()); - - // 验证健康状态 - String healthStatus = service.getHealthStatus(); - assertTrue(healthStatus.contains("正常")); - } - - @Test - @DisplayName("测试服务停止") - void testServiceStop() { - // 启动服务 - service.start(); - assertTrue(service.isRunning()); - - // 停止服务 - service.stop(); - assertFalse(service.isRunning()); - - // 验证健康状态 - String healthStatus = service.getHealthStatus(); - assertTrue(healthStatus.contains("停止")); - } - - @Test - @DisplayName("测试服务重启") - void testServiceRestart() { - // 启动服务 - service.start(); - assertTrue(service.isRunning()); - - // 停止服务 - service.stop(); - assertFalse(service.isRunning()); - - // 重启服务 - service.start(); - assertTrue(service.isRunning()); - - // 验证健康状态 String healthStatus = service.getHealthStatus(); - assertTrue(healthStatus.contains("正常")); - } - - @Test - @DisplayName("测试KMC配置") - void testKmcConfiguration() { - // 验证KMC配置已设置 - assertNotNull(kmcConfig); - assertTrue(kmcConfig.isEnabled()); - assertEquals("test_default", kmcConfig.getDefaultKeyId()); - assertTrue(kmcConfig.isEnableAuditLog()); - } - - @Test - @DisplayName("测试服务状态一致性") - void testServiceStateConsistency() { - // 测试多次调用状态的一致性 - assertTrue(service.isRunning()); - assertTrue(service.isRunning()); - - service.stop(); - assertFalse(service.isRunning()); - assertFalse(service.isRunning()); - - service.start(); - assertTrue(service.isRunning()); - assertTrue(service.isRunning()); - } - - @Test - @DisplayName("测试健康状态信息") - void testHealthStatusInformation() { - String healthStatus = service.getHealthStatus(); - - // 验证健康状态包含必要信息 assertNotNull(healthStatus); - assertTrue(healthStatus.contains("开源版")); assertTrue(healthStatus.contains("正常")); - - // 停止服务后验证健康状态变化 - service.stop(); - String stoppedHealthStatus = service.getHealthStatus(); - assertTrue(stoppedHealthStatus.contains("停止")); + assertTrue(healthStatus.contains("开源版")); } @Test @DisplayName("测试服务元数据") void testServiceMetadata() { - // 验证服务名称 assertEquals("Open Source Enterprise Service", service.getServiceName()); - - // 验证服务版本 assertEquals("1.0.0-open", service.getServiceVersion()); - - // 验证服务类型 assertEquals("open", service.getServiceType()); - // 验证元数据一致性 assertNotNull(service.getServiceName()); assertNotNull(service.getServiceVersion()); assertNotNull(service.getServiceType()); } @Test - @DisplayName("测试并发访问") - void testConcurrentAccess() throws InterruptedException { - // 创建多个线程同时访问服务 - Thread[] threads = new Thread[10]; - boolean[] results = new boolean[10]; - - for (int i = 0; i < 10; i++) { - final int index = i; - threads[i] = new Thread(() -> { - try { - // 模拟并发访问 - String serviceName = service.getServiceName(); - String serviceVersion = service.getServiceVersion(); - String serviceType = service.getServiceType(); - boolean isRunning = service.isRunning(); - String healthStatus = service.getHealthStatus(); - - results[index] = serviceName != null && - serviceVersion != null && - serviceType != null && - healthStatus != null; - } catch (Exception e) { - results[index] = false; - } - }); - } - - // 启动所有线程 - for (Thread thread : threads) { - thread.start(); - } - - // 等待所有线程完成 - for (Thread thread : threads) { - thread.join(); - } - - // 验证所有线程都成功访问了服务 - for (boolean result : results) { - assertTrue(result, "并发访问应该成功"); - } - } - - @Test - @DisplayName("测试服务生命周期") - void testServiceLifecycle() { - // 初始状态应该是停止的 - assertFalse(service.isRunning()); - - // 启动服务 - service.start(); - assertTrue(service.isRunning()); - - // 再次启动应该不会出错 - assertDoesNotThrow(() -> service.start()); - assertTrue(service.isRunning()); - - // 停止服务 - service.stop(); - assertFalse(service.isRunning()); - - // 再次停止应该不会出错 - assertDoesNotThrow(() -> service.stop()); - assertFalse(service.isRunning()); + @DisplayName("测试健康状态信息格式") + void testHealthStatusInformation() { + String healthStatus = service.getHealthStatus(); + assertNotNull(healthStatus); + assertTrue(healthStatus.contains("开源版")); + assertTrue(healthStatus.contains("正常")); } } \ No newline at end of file diff --git a/pom.xml b/pom.xml index 101204e..923d5bf 100644 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,7 @@ <description>Terrabase - 企业级数据使能平台</description> <modules> + <module>sdk-config</module> <module>business-app</module> <module>enterprise-api</module> <module>enterprise-impl-commercial</module> @@ -25,6 +26,8 @@ <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring-boot.version>3.2.0</spring-boot.version> + <spring-cloud.version>2023.0.4</spring-cloud.version> + <spring-cloud-alibaba.version>2023.0.3.2</spring-cloud-alibaba.version> </properties> <dependencyManagement> @@ -36,6 +39,20 @@ <type>pom</type> <scope>import</scope> </dependency> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-dependencies</artifactId> + <version>${spring-cloud.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + <dependency> + <groupId>com.alibaba.cloud</groupId> + <artifactId>spring-cloud-alibaba-dependencies</artifactId> + <version>${spring-cloud-alibaba.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> </dependencies> </dependencyManagement> diff --git a/sdk-config/src/main/java/com/terrabase/sdk/config/TerrabaseSDKConfig.java b/sdk-config/src/main/java/com/terrabase/sdk/config/TerrabaseSDKConfig.java new file mode 100644 index 0000000..c47e941 --- /dev/null +++ b/sdk-config/src/main/java/com/terrabase/sdk/config/TerrabaseSDKConfig.java @@ -0,0 +1,360 @@ +package com.terrabase.sdk.config; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Terrabase SDK 配置类 + * 支持外部配置注入,解决SDK以JAR包形式使用时配置隔离问题 + * + * @author Yehong Pan + * @version 1.0.0 + */ +public class TerrabaseSDKConfig { + + private static final Logger logger = LoggerFactory.getLogger(TerrabaseSDKConfig.class); + + // ==================== Nacos 配置(仅商业版使用) ==================== + private String nacosServerAddr = "https://consulservice:18302"; // 默认Nacos服务器地址 + private String nacosUsername = "consul"; // 默认用户名 + private String nacosPassword; // 密码通过脚本自动获取 + private String nacosPort = "8080"; + private String nacosIp = "terrabase"; // 默认服务注册IP为terrabase + private boolean nacosSecure = true; + private String nacosClusterName = "DEFAULT"; + private boolean nacosDiscoveryEnabled = false; // 默认关闭,仅商业版启用 + private boolean nacosRegisterEnabled = false; // 默认关闭,仅商业版启用 + + // ==================== SSL 配置 ==================== + private boolean tlsEnabled = true; // 默认启用TLS + private boolean clientAuth = true; // 默认启用客户端认证 + private String trustCertPath = "/opt/huawei/fce/runtime/security/server_cert/nacos/nacos.crt"; // 默认证书路径 + + // ==================== 服务配置 ==================== + private String serviceName; + private String servicePort = "8008"; // 默认服务端口为8008 + + // ==================== JAR包路径配置 ==================== + private String jarPath = "./lib"; + + // ==================== 认证配置 ==================== + private String machineToken; + private String authToken; + + // ==================== 其他配置 ==================== + private Map<String, String> customProperties = new HashMap<>(); + + /** + * 默认构造函数 + */ + public TerrabaseSDKConfig() { + } + + /** + * 创建默认配置(开源版) + * 开源版不启用Nacos服务注册和发现 + * @return 默认配置实例 + */ + public static TerrabaseSDKConfig createDefault() { + TerrabaseSDKConfig config = new TerrabaseSDKConfig(); + // 开源版默认不启用Nacos + config.setNacosDiscoveryEnabled(false); + config.setNacosRegisterEnabled(false); + return config; + } + + /** + * 创建商业版配置 + * 商业版启用Nacos服务注册和发现 + * @param nacosServerAddr Nacos服务器地址 + * @param nacosUsername Nacos用户名 + * @param nacosPassword Nacos密码 + * @return 商业版配置实例 + */ + public static TerrabaseSDKConfig createCommercial(String nacosServerAddr, String nacosUsername, String nacosPassword) { + TerrabaseSDKConfig config = new TerrabaseSDKConfig(); + config.setNacosServerAddr(nacosServerAddr); + config.setNacosUsername(nacosUsername); + config.setNacosPassword(nacosPassword); + // 商业版启用Nacos + config.setNacosDiscoveryEnabled(true); + config.setNacosRegisterEnabled(true); + return config; + } + + /** + * 创建带默认值的商业版配置 + * 使用默认的Nacos服务器地址和用户名,密码通过脚本自动获取 + * @return 商业版配置实例 + */ + public static TerrabaseSDKConfig createCommercialWithDefaults() { + TerrabaseSDKConfig config = new TerrabaseSDKConfig(); + // 使用默认值,密码通过脚本自动获取(带重试机制) + config.setNacosPassword(getPasswordWithFallback()); + // 商业版启用Nacos + config.setNacosDiscoveryEnabled(true); + config.setNacosRegisterEnabled(true); + return config; + } + + // ==================== Getter/Setter 方法 ==================== + + public String getNacosServerAddr() { + return nacosServerAddr; + } + + public void setNacosServerAddr(String nacosServerAddr) { + this.nacosServerAddr = nacosServerAddr; + } + + public String getNacosUsername() { + return nacosUsername; + } + + public void setNacosUsername(String nacosUsername) { + this.nacosUsername = nacosUsername; + } + + public String getNacosPassword() { + return nacosPassword; + } + + public void setNacosPassword(String nacosPassword) { + this.nacosPassword = nacosPassword; + } + + public String getNacosPort() { + return nacosPort; + } + + public void setNacosPort(String nacosPort) { + this.nacosPort = nacosPort; + } + + public String getNacosIp() { + return nacosIp; + } + + public void setNacosIp(String nacosIp) { + this.nacosIp = nacosIp; + } + + public boolean isNacosSecure() { + return nacosSecure; + } + + public void setNacosSecure(boolean nacosSecure) { + this.nacosSecure = nacosSecure; + } + + public String getNacosClusterName() { + return nacosClusterName; + } + + public void setNacosClusterName(String nacosClusterName) { + this.nacosClusterName = nacosClusterName; + } + + public boolean isNacosDiscoveryEnabled() { + return nacosDiscoveryEnabled; + } + + public void setNacosDiscoveryEnabled(boolean nacosDiscoveryEnabled) { + this.nacosDiscoveryEnabled = nacosDiscoveryEnabled; + } + + public boolean isNacosRegisterEnabled() { + return nacosRegisterEnabled; + } + + public void setNacosRegisterEnabled(boolean nacosRegisterEnabled) { + this.nacosRegisterEnabled = nacosRegisterEnabled; + } + + public boolean isTlsEnabled() { + return tlsEnabled; + } + + public void setTlsEnabled(boolean tlsEnabled) { + this.tlsEnabled = tlsEnabled; + } + + public boolean isClientAuth() { + return clientAuth; + } + + public void setClientAuth(boolean clientAuth) { + this.clientAuth = clientAuth; + } + + public String getTrustCertPath() { + return trustCertPath; + } + + public void setTrustCertPath(String trustCertPath) { + this.trustCertPath = trustCertPath; + } + + public String getServiceName() { + return serviceName; + } + + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } + + public String getServicePort() { + return servicePort; + } + + public void setServicePort(String servicePort) { + this.servicePort = servicePort; + } + + public String getJarPath() { + return jarPath; + } + + public void setJarPath(String jarPath) { + this.jarPath = jarPath; + } + + public String getMachineToken() { + return machineToken; + } + + public void setMachineToken(String machineToken) { + this.machineToken = machineToken; + } + + public String getAuthToken() { + return authToken; + } + + public void setAuthToken(String authToken) { + this.authToken = authToken; + } + + public Map<String, String> getCustomProperties() { + return customProperties; + } + + public void setCustomProperties(Map<String, String> customProperties) { + this.customProperties = customProperties; + } + + /** + * 添加自定义属性 + * @param key 属性键 + * @param value 属性值 + */ + public void addCustomProperty(String key, String value) { + this.customProperties.put(key, value); + } + + /** + * 获取自定义属性 + * @param key 属性键 + * @return 属性值 + */ + public String getCustomProperty(String key) { + return this.customProperties.get(key); + } + + /** + * 通过脚本获取Nacos密码 + * 执行脚本获取加密密码并解密 + * @return 解密后的密码 + */ + public static String getPasswordFromScript() { + try { + logger.info("开始执行密码获取脚本..."); + + // 执行脚本获取加密密码 + ProcessBuilder pb = new ProcessBuilder("bash", "-c", + "grep keypass_tomcat /opt/huawei/fce/runtime/security/server_cert/nacos/nacos.conf | awk -F= '{print $2}'"); + Process process = pb.start(); + + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String encryptedPassword = reader.readLine(); + reader.close(); + + if (encryptedPassword == null || encryptedPassword.trim().isEmpty()) { + logger.warn("无法获取加密密码,使用默认密码"); + return "default-password"; + } + + logger.info("成功获取加密密码,开始解密..."); + + // 执行Python脚本解密 + ProcessBuilder pythonPb = new ProcessBuilder("python", "-c", + "import kmc.kmc as K; import os; os.environ['KMC_DATA_USER']='tomcat'; nacos_pass='" + + encryptedPassword.trim() + "'; plain_nacos_pass=K.API().decrypt(0,nacos_pass); print(plain_nacos_pass)"); + Process pythonProcess = pythonPb.start(); + + BufferedReader pythonReader = new BufferedReader(new InputStreamReader(pythonProcess.getInputStream())); + String decryptedPassword = pythonReader.readLine(); + pythonReader.close(); + + if (decryptedPassword == null || decryptedPassword.trim().isEmpty()) { + logger.warn("密码解密失败,使用默认密码"); + return "default-password"; + } + + logger.info("密码获取成功"); + return decryptedPassword.trim(); + + } catch (Exception e) { + logger.error("密码获取脚本执行失败,使用默认密码", e); + return "default-password"; + } + } + + /** + * 获取密码(带重试机制) + * 如果脚本获取失败,会尝试从环境变量获取 + * @return 密码 + */ + public static String getPasswordWithFallback() { + // 首先尝试从脚本获取 + String password = getPasswordFromScript(); + + // 如果脚本获取失败,尝试从环境变量获取 + if ("default-password".equals(password)) { + String envPassword = System.getenv("NACOS_PASSWORD"); + if (envPassword != null && !envPassword.trim().isEmpty()) { + logger.info("从环境变量获取密码"); + return envPassword; + } + } + + return password; + } + + /** + * 验证配置是否有效 + * @return 是否有效 + */ + public boolean isValid() { + if (nacosDiscoveryEnabled) { + return nacosServerAddr != null && !nacosServerAddr.trim().isEmpty(); + } + return true; + } + + @Override + public String toString() { + return "TerrabaseSDKConfig{" + + "nacosServerAddr='" + nacosServerAddr + '\'' + + ", nacosUsername='" + nacosUsername + '\'' + + ", nacosDiscoveryEnabled=" + nacosDiscoveryEnabled + + ", nacosRegisterEnabled=" + nacosRegisterEnabled + + ", serviceName='" + serviceName + '\'' + + ", jarPath='" + jarPath + '\'' + + '}'; + } +} From 17787821c24597ab4998d92d3d8d1267f1dc26d9 Mon Sep 17 00:00:00 2001 From: panyehong <2655992392@qq.com> Date: Thu, 23 Oct 2025 20:11:53 +0800 Subject: [PATCH 4/6] =?UTF-8?q?[feat]<terrabase>Terrabase=E7=9A=84SDK?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E3=80=82=20[=E5=85=B7=E4=BD=93=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0]=201.LogManagementService=E4=BF=AE=E6=94=B9=E4=B8=BAL?= =?UTF-8?q?ogService=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=AF=B9=E5=BA=94=E5=BC=80?= =?UTF-8?q?=E6=BA=90=E5=92=8C=E5=95=86=E4=B8=9A=E5=AE=9E=E7=8E=B0=E3=80=82?= =?UTF-8?q?=202.=E5=B0=86KmcConfig=E4=B8=8B=E6=B2=89=E5=88=B0=E5=BC=80?= =?UTF-8?q?=E6=BA=90=E5=AE=9E=E7=8E=B0=E4=B8=AD=EF=BC=8C=E8=A7=A3=E9=99=A4?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E4=BE=9D=E8=B5=96=EF=BC=88api=E5=8C=85?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E5=BC=80=E6=BA=90=E5=8C=85=EF=BC=8C=E5=BC=80?= =?UTF-8?q?=E6=BA=90=E5=8C=85=E4=BE=9D=E8=B5=96api=E5=8C=85=EF=BC=89?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E3=80=82=203.=E5=88=A0=E9=99=A4EnterpriseSer?= =?UTF-8?q?vice=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/BusinessApplication.java | 31 +-- .../business/config/EnterpriseConfig.java | 27 -- .../controller/EnterpriseController.java | 23 +- .../controller/LogManagementController.java | 6 +- .../terrabase/business/util/JarLoadUtil.java | 203 +------------- .../terrabase/sdk/StandaloneJarLoadUtil.java | 194 +------------ .../java/com/terrabase/sdk/TerrabaseSDK.java | 168 ++++++----- .../sdk/example/SDKUsageExample.java | 263 +++++++++++++++--- .../src/main/resources/application.properties | 10 - .../enterprise/api/EnterpriseService.java | 37 --- ...ManagementService.java => LogService.java} | 2 +- .../CommercialEnterpriseServiceImpl.java | 44 --- ...mpl.java => CommercialLogServiceImpl.java} | 6 +- .../impl/open/OpenCryptoServiceImpl.java | 58 +++- .../impl/open/OpenEnterpriseServiceImpl.java | 43 --- ...rviceImpl.java => OpenLogServiceImpl.java} | 6 +- .../impl/open/config/KmcConfig.java | 7 + ...nEnterpriseServiceImplIntegrationTest.java | 64 ----- .../OpenEnterpriseServiceImplKmcTest.java | 54 ---- 19 files changed, 432 insertions(+), 814 deletions(-) delete mode 100644 business-app/src/main/java/com/terrabase/business/config/EnterpriseConfig.java delete mode 100644 enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java rename enterprise-api/src/main/java/com/terrabase/enterprise/api/{LogManagementService.java => LogService.java} (93%) delete mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java rename enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/{CommercialLogManagementServiceImpl.java => CommercialLogServiceImpl.java} (94%) delete mode 100644 enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java rename enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/{OpenLogManagementServiceImpl.java => OpenLogServiceImpl.java} (94%) delete mode 100644 enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplIntegrationTest.java delete mode 100644 enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java diff --git a/business-app/src/main/java/com/terrabase/business/BusinessApplication.java b/business-app/src/main/java/com/terrabase/business/BusinessApplication.java index 50eb13f..3aa2e6b 100644 --- a/business-app/src/main/java/com/terrabase/business/BusinessApplication.java +++ b/business-app/src/main/java/com/terrabase/business/BusinessApplication.java @@ -2,7 +2,6 @@ import com.alibaba.nacos.common.tls.TlsSystemConfig; import com.terrabase.business.util.JarLoadUtil; -import com.terrabase.enterprise.api.EnterpriseService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -34,8 +33,6 @@ public class BusinessApplication { @Autowired private JarLoadUtil jarLoadUtil; - // 动态加载企业服务 - 延迟初始化 - private EnterpriseService enterpriseService; public static void main(String[] args) { logger.info("正在启动 Terrabase 业务应用..."); @@ -59,32 +56,20 @@ public CommandLineRunner init() { logger.info("=== Terrabase 业务应用初始化开始 ==="); try { - // 延迟加载企业服务 - if (enterpriseService == null) { - logger.info("正在加载企业服务..."); - enterpriseService = jarLoadUtil.loadEnterpriseService(); - } + // 检测企业模式 + String enterpriseMode = jarLoadUtil.getEnterpriseMode(); + logger.info("企业模式: {}", enterpriseMode); - if (enterpriseService != null) { - logger.info("企业服务加载成功:"); - logger.info(" 服务名称: {}", enterpriseService.getServiceName()); - logger.info(" 服务版本: {}", enterpriseService.getServiceVersion()); - logger.info(" 服务类型: {}", enterpriseService.getServiceType()); - - // 企业服务已加载完成,无需手动启动 - logger.info("企业服务加载完成"); - - // 获取健康状态 - String healthStatus = enterpriseService.getHealthStatus(); - logger.info("企业服务健康状态: {}", healthStatus); + if ("commercial".equals(enterpriseMode)) { + logger.info("商业版模式已启用"); } else { - logger.error("企业服务加载失败,应用可能无法正常工作"); + logger.info("开源版模式已启用"); } } catch (Exception e) { - logger.error("应用初始化过程中发生错误", e); + logger.error("企业模式检测失败", e); // 不抛出异常,让应用继续启动 - logger.warn("应用将在没有企业服务的情况下继续运行"); + logger.warn("应用将在默认模式下继续运行"); } logger.info("=== Terrabase 业务应用初始化完成 ==="); diff --git a/business-app/src/main/java/com/terrabase/business/config/EnterpriseConfig.java b/business-app/src/main/java/com/terrabase/business/config/EnterpriseConfig.java deleted file mode 100644 index 75b7dea..0000000 --- a/business-app/src/main/java/com/terrabase/business/config/EnterpriseConfig.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.terrabase.business.config; - -import com.terrabase.enterprise.impl.open.config.KmcConfig; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * 企业服务配置类 - * 管理企业服务相关的Bean配置 - * - * @author Terrabase Team - * @version 1.0.0 - */ -@Configuration -public class EnterpriseConfig { - - /** - * 创建KmcConfig Bean,确保Spring容器中有这个配置 - * 使用@ConfigurationProperties自动绑定配置文件中的属性 - */ - @Bean - @ConfigurationProperties(prefix = "terrabase.kmc") - public KmcConfig kmcConfig() { - return new KmcConfig(); - } -} diff --git a/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java b/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java index 224f487..e57c40e 100644 --- a/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java +++ b/business-app/src/main/java/com/terrabase/business/controller/EnterpriseController.java @@ -1,7 +1,6 @@ package com.terrabase.business.controller; import com.terrabase.business.util.JarLoadUtil; -import com.terrabase.enterprise.api.EnterpriseService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -34,14 +33,10 @@ public class EnterpriseController { @GetMapping("/info") public ResponseEntity<Map<String, Object>> getServiceInfo() { try { - EnterpriseService service = jarLoadUtil.loadEnterpriseService(); - Map<String, Object> info = new HashMap<>(); - info.put("serviceName", service.getServiceName()); - info.put("serviceVersion", service.getServiceVersion()); - info.put("serviceType", service.getServiceType()); info.put("enterpriseMode", jarLoadUtil.getEnterpriseMode()); - info.put("healthStatus", service.getHealthStatus()); + info.put("status", "running"); + info.put("message", "企业服务运行正常"); return ResponseEntity.ok(info); @@ -59,13 +54,10 @@ public ResponseEntity<Map<String, Object>> getServiceInfo() { @GetMapping("/health") public ResponseEntity<Map<String, Object>> getHealthStatus() { try { - EnterpriseService service = jarLoadUtil.loadEnterpriseService(); - Map<String, Object> health = new HashMap<>(); health.put("status", "UP"); - health.put("serviceName", service.getServiceName()); - health.put("serviceType", service.getServiceType()); - health.put("healthStatus", service.getHealthStatus()); + health.put("enterpriseMode", jarLoadUtil.getEnterpriseMode()); + health.put("details", "企业服务运行正常"); health.put("timestamp", System.currentTimeMillis()); return ResponseEntity.ok(health); @@ -90,13 +82,12 @@ public ResponseEntity<Map<String, Object>> reloadService() { // 清理缓存 jarLoadUtil.clearCache(); - // 重新加载服务 - EnterpriseService service = jarLoadUtil.loadEnterpriseService(); + // 重新检测企业模式 + String enterpriseMode = jarLoadUtil.getEnterpriseMode(); Map<String, Object> response = new HashMap<>(); response.put("message", "企业服务重新加载成功"); - response.put("serviceName", service.getServiceName()); - response.put("serviceType", service.getServiceType()); + response.put("enterpriseMode", enterpriseMode); response.put("timestamp", System.currentTimeMillis()); return ResponseEntity.ok(response); diff --git a/business-app/src/main/java/com/terrabase/business/controller/LogManagementController.java b/business-app/src/main/java/com/terrabase/business/controller/LogManagementController.java index 112341d..82d0bd5 100644 --- a/business-app/src/main/java/com/terrabase/business/controller/LogManagementController.java +++ b/business-app/src/main/java/com/terrabase/business/controller/LogManagementController.java @@ -1,7 +1,7 @@ package com.terrabase.business.controller; import com.terrabase.business.util.JarLoadUtil; -import com.terrabase.enterprise.api.LogManagementService; +import com.terrabase.enterprise.api.LogService; import com.terrabase.enterprise.api.dto.LogI18n; import com.terrabase.enterprise.api.request.LogAttributeVo; import com.terrabase.enterprise.api.response.ResultVo; @@ -44,7 +44,7 @@ public ResponseEntity<Map<String, Object>> registerLogs(@RequestBody List<LogAtt return ResponseEntity.badRequest().body(error); } - LogManagementService logService = jarLoadUtil.loadLogManagementService(); + LogService logService = jarLoadUtil.loadLogService(); ResultVo<Integer> result = logService.registerLogs(logs); Map<String, Object> response = new HashMap<>(); @@ -82,7 +82,7 @@ public ResponseEntity<Map<String, Object>> registryInternational(@RequestBody Li return ResponseEntity.badRequest().body(error); } - LogManagementService logService = jarLoadUtil.loadLogManagementService(); + LogService logService = jarLoadUtil.loadLogService(); ResultVo<Boolean> result = logService.registryInternational(logI18ns); Map<String, Object> response = new HashMap<>(); diff --git a/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java b/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java index 88032af..f116ee5 100644 --- a/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java +++ b/business-app/src/main/java/com/terrabase/business/util/JarLoadUtil.java @@ -1,8 +1,6 @@ package com.terrabase.business.util; import com.terrabase.enterprise.api.*; -import com.terrabase.enterprise.impl.open.OpenEnterpriseServiceImpl; -import com.terrabase.enterprise.impl.open.config.KmcConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -57,15 +55,6 @@ public UserManagementService loadUserManagementService() { "com.terrabase.enterprise.impl.open.OpenUserManagementServiceImpl"); } - /** - * 加载日志管理服务 - * @return 日志管理服务实例 - */ - public LogManagementService loadLogManagementService() { - return (LogManagementService) loadService("log_management_service", - "com.terrabase.enterprise.impl.commercial.CommercialLogManagementServiceImpl", - "com.terrabase.enterprise.impl.open.OpenLogManagementServiceImpl"); - } /** * 加载证书管理服务 @@ -77,6 +66,16 @@ public CertificateService loadCertificateService() { "com.terrabase.enterprise.impl.open.OpenCertificateServiceImpl"); } + /** + * 加载日志服务 + * @return 日志服务实例 + */ + public LogService loadLogService() { + return (LogService) loadService("log_service", + "com.terrabase.enterprise.impl.commercial.CommercialLogServiceImpl", + "com.terrabase.enterprise.impl.open.OpenLogServiceImpl"); + } + /** * 加载监控告警服务 * @return 监控告警服务实例 @@ -154,83 +153,6 @@ private Object loadService(String cacheKey, String commercialClassName, String o } } - /** - * 根据lib目录下是否存在JAR包动态加载企业服务实现 - * @return 企业服务实例,如果加载失败则返回开源版服务作为降级方案 - */ - public EnterpriseService loadEnterpriseService() { - try { - String cacheKey = "enterprise_service"; - - // 先检查缓存 - EnterpriseService cachedService = (EnterpriseService) serviceInstances.get(cacheKey); - if (cachedService != null) { - logger.info("从缓存中获取企业服务实例"); - return cachedService; - } - - logger.info("开始检测并加载企业服务实现"); - - EnterpriseService service; - if (isCommercialJarAvailable()) { - logger.info("检测到商业版JAR包,加载商业版企业服务"); - service = loadCommercialService(); - } else { - logger.info("未检测到商业版JAR包,使用开源版企业服务"); - service = loadOpenSourceService(); - } - - // 如果服务加载失败,使用开源版作为降级方案 - if (service == null) { - logger.warn("企业服务加载失败,使用开源版作为降级方案"); - service = loadOpenSourceService(); - } - - // 如果开源版也加载失败,抛出异常 - if (service == null) { - throw new RuntimeException("无法加载任何企业服务实现"); - } - - // 缓存服务实例 - serviceInstances.put(cacheKey, service); - logger.info("企业服务加载成功: {}", service.getServiceName()); - - return service; - - } catch (Exception e) { - logger.error("加载企业服务失败,尝试使用开源版作为降级方案", e); - try { - // 最后的降级方案:直接实例化开源版服务 - OpenEnterpriseServiceImpl fallbackService = new OpenEnterpriseServiceImpl(); - - // 从Spring容器中获取KmcConfig并手动注入 - try { - KmcConfig kmcConfig = applicationContext.getBean(KmcConfig.class); - if (kmcConfig != null) { - logger.info("降级方案:从Spring容器中获取KmcConfig并注入到开源版服务"); - java.lang.reflect.Field kmcConfigField = OpenEnterpriseServiceImpl.class.getDeclaredField("kmcConfig"); - kmcConfigField.setAccessible(true); - kmcConfigField.set(fallbackService, kmcConfig); - } else { - logger.warn("降级方案:Spring容器中没有找到KmcConfig Bean"); - } - } catch (Exception fallbackException) { - logger.warn("降级方案:注入KmcConfig失败: {}", fallbackException.getMessage()); - } - - serviceInstances.put("enterprise_service", fallbackService); - - // 降级企业服务已加载完成,无需手动启动 - logger.info("降级企业服务已加载完成"); - - logger.warn("使用开源版企业服务作为降级方案"); - return fallbackService; - } catch (Exception fallbackException) { - logger.error("降级方案也失败了", fallbackException); - throw new RuntimeException("无法加载任何企业服务实现,应用无法启动", fallbackException); - } - } - } /** * 检测商业版JAR包是否可用 @@ -251,7 +173,7 @@ private boolean isCommercialJarAvailable() { URLClassLoader classLoader = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader()); // 尝试加载商业版实现类 - Class<?> clazz = classLoader.loadClass("com.terrabase.enterprise.impl.commercial.CommercialEnterpriseServiceImpl"); + Class<?> clazz = classLoader.loadClass("com.terrabase.enterprise.impl.commercial.CommercialCryptoServiceImpl"); if (clazz != null) { logger.debug("商业版JAR包验证成功: {}", jarFile.getAbsolutePath()); return true; @@ -264,60 +186,7 @@ private boolean isCommercialJarAvailable() { return false; } - /** - * 加载商业版服务 - * @return 商业版服务实例 - */ - private EnterpriseService loadCommercialService() throws Exception { - logger.info("正在加载商业版企业服务..."); - - // 尝试从JAR包加载 - EnterpriseService service = loadFromJar("com.terrabase.enterprise.impl.commercial.CommercialEnterpriseServiceImpl"); - - if (service == null) { - // 如果JAR包加载失败,尝试从类路径加载 - service = loadFromClasspath("com.terrabase.enterprise.impl.commercial.CommercialEnterpriseServiceImpl"); - } - - if (service == null) { - throw new RuntimeException("无法加载商业版企业服务"); - } - - return service; - } - /** - * 加载开源版服务 - * @return 开源版服务实例 - */ - private EnterpriseService loadOpenSourceService() throws Exception { - logger.info("正在加载开源版企业服务..."); - - // 直接实例化开源版实现(通过直接依赖) - OpenEnterpriseServiceImpl service = new OpenEnterpriseServiceImpl(); - - // 从Spring容器中获取KmcConfig并手动注入 - try { - KmcConfig kmcConfig = applicationContext.getBean(KmcConfig.class); - if (kmcConfig != null) { - logger.info("从Spring容器中获取KmcConfig并注入到开源版服务"); - // 使用反射注入KmcConfig - java.lang.reflect.Field kmcConfigField = OpenEnterpriseServiceImpl.class.getDeclaredField("kmcConfig"); - kmcConfigField.setAccessible(true); - kmcConfigField.set(service, kmcConfig); - } else { - logger.warn("Spring容器中没有找到KmcConfig Bean"); - } - } catch (Exception e) { - logger.warn("注入KmcConfig失败: {}", e.getMessage()); - } - - if (service == null) { - throw new RuntimeException("无法加载开源版企业服务"); - } - - return service; - } /** * 从JAR包加载服务(通用方法) @@ -372,8 +241,6 @@ private Object loadServiceFromClasspath(String className) { Object instance = defaultConstructor.newInstance(); logger.info("使用默认构造函数创建服务实例"); - // 手动注入依赖 - injectDependencies(instance, className); return instance; @@ -383,55 +250,7 @@ private Object loadServiceFromClasspath(String className) { } } - /** - * 从JAR包加载服务 - * @param className 类名 - * @return 服务实例 - */ - private EnterpriseService loadFromJar(String className) { - return (EnterpriseService) loadServiceFromJar(className); - } - /** - * 从类路径加载服务 - * @param className 类名 - * @return 服务实例 - */ - private EnterpriseService loadFromClasspath(String className) { - return (EnterpriseService) loadServiceFromClasspath(className); - } - - /** - * 手动注入依赖 - * @param instance 服务实例 - * @param className 类名 - */ - private void injectDependencies(Object instance, String className) { - try { - // 为 OpenCryptoServiceImpl 注入 KmcConfig - if (className.contains("OpenCryptoServiceImpl")) { - try { - KmcConfig kmcConfig = applicationContext.getBean(KmcConfig.class); - if (kmcConfig != null) { - java.lang.reflect.Field kmcConfigField = instance.getClass().getDeclaredField("kmcConfig"); - kmcConfigField.setAccessible(true); - kmcConfigField.set(instance, kmcConfig); - logger.info("成功注入 KmcConfig 到 OpenCryptoServiceImpl"); - } else { - logger.warn("Spring容器中没有找到 KmcConfig Bean"); - } - } catch (Exception e) { - logger.warn("注入 KmcConfig 失败: {}", e.getMessage()); - } - } - - // 为其他服务注入依赖(如果需要) - // 可以在这里添加其他服务的依赖注入逻辑 - - } catch (Exception e) { - logger.warn("依赖注入失败: {}", e.getMessage()); - } - } /** * 根据类名获取JAR文件名 diff --git a/business-app/src/main/java/com/terrabase/sdk/StandaloneJarLoadUtil.java b/business-app/src/main/java/com/terrabase/sdk/StandaloneJarLoadUtil.java index b4834f8..c8770d8 100644 --- a/business-app/src/main/java/com/terrabase/sdk/StandaloneJarLoadUtil.java +++ b/business-app/src/main/java/com/terrabase/sdk/StandaloneJarLoadUtil.java @@ -1,8 +1,6 @@ package com.terrabase.sdk; import com.terrabase.enterprise.api.*; -import com.terrabase.enterprise.impl.open.OpenEnterpriseServiceImpl; -import com.terrabase.enterprise.impl.open.config.KmcConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -65,13 +63,13 @@ public UserManagementService loadUserManagementService() { } /** - * 加载日志管理服务 - * @return 日志管理服务实例 + * 加载日志服务 + * @return 日志服务实例 */ - public LogManagementService loadLogManagementService() { - return (LogManagementService) loadService("log_management_service", - "com.terrabase.enterprise.impl.commercial.CommercialLogManagementServiceImpl", - "com.terrabase.enterprise.impl.open.OpenLogManagementServiceImpl"); + public LogService loadLogService() { + return (LogService) loadService("log_service", + "com.terrabase.enterprise.impl.commercial.CommercialLogServiceImpl", + "com.terrabase.enterprise.impl.open.OpenLogServiceImpl"); } /** @@ -156,78 +154,6 @@ private Object loadService(String cacheKey, String commercialClassName, String o } } - /** - * 根据lib目录下是否存在JAR包动态加载企业服务实现 - * @return 企业服务实例,如果加载失败则返回开源版服务作为降级方案 - */ - public EnterpriseService loadEnterpriseService() { - try { - String cacheKey = "enterprise_service"; - - // 先检查缓存 - EnterpriseService cachedService = (EnterpriseService) serviceInstances.get(cacheKey); - if (cachedService != null) { - logger.info("从缓存中获取企业服务实例"); - return cachedService; - } - - logger.info("开始检测并加载企业服务实现"); - - EnterpriseService service; - if (isCommercialJarAvailable()) { - logger.info("检测到商业版JAR包,加载商业版企业服务"); - service = loadCommercialService(); - } else { - logger.info("未检测到商业版JAR包,使用开源版企业服务"); - service = loadOpenSourceService(); - } - - // 如果服务加载失败,使用开源版作为降级方案 - if (service == null) { - logger.warn("企业服务加载失败,使用开源版作为降级方案"); - service = loadOpenSourceService(); - } - - // 如果开源版也加载失败,抛出异常 - if (service == null) { - throw new RuntimeException("无法加载任何企业服务实现"); - } - - // 缓存服务实例 - serviceInstances.put(cacheKey, service); - logger.info("企业服务加载成功: {}", service.getServiceName()); - - return service; - - } catch (Exception e) { - logger.error("加载企业服务失败,尝试使用开源版作为降级方案", e); - try { - // 最后的降级方案:直接实例化开源版服务 - OpenEnterpriseServiceImpl fallbackService = new OpenEnterpriseServiceImpl(); - - // 尝试创建默认的KmcConfig - try { - KmcConfig kmcConfig = createDefaultKmcConfig(); - if (kmcConfig != null) { - logger.info("降级方案:创建默认KmcConfig并注入到开源版服务"); - java.lang.reflect.Field kmcConfigField = OpenEnterpriseServiceImpl.class.getDeclaredField("kmcConfig"); - kmcConfigField.setAccessible(true); - kmcConfigField.set(fallbackService, kmcConfig); - } - } catch (Exception fallbackException) { - logger.warn("降级方案:注入KmcConfig失败: {}", fallbackException.getMessage()); - } - - serviceInstances.put("enterprise_service", fallbackService); - - logger.warn("使用开源版企业服务作为降级方案"); - return fallbackService; - } catch (Exception fallbackException) { - logger.error("降级方案也失败了", fallbackException); - throw new RuntimeException("无法加载任何企业服务实现,应用无法启动", fallbackException); - } - } - } /** * 检测商业版JAR包是否可用 @@ -248,7 +174,7 @@ private boolean isCommercialJarAvailable() { URLClassLoader classLoader = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader()); // 尝试加载商业版实现类 - Class<?> clazz = classLoader.loadClass("com.terrabase.enterprise.impl.commercial.CommercialEnterpriseServiceImpl"); + Class<?> clazz = classLoader.loadClass("com.terrabase.enterprise.impl.commercial.CommercialCryptoServiceImpl"); if (clazz != null) { logger.debug("商业版JAR包验证成功: {}", jarFile.getAbsolutePath()); return true; @@ -261,68 +187,8 @@ private boolean isCommercialJarAvailable() { return false; } - /** - * 加载商业版服务 - * @return 商业版服务实例 - */ - private EnterpriseService loadCommercialService() throws Exception { - logger.info("正在加载商业版企业服务..."); - - // 尝试从JAR包加载 - EnterpriseService service = loadFromJar("com.terrabase.enterprise.impl.commercial.CommercialEnterpriseServiceImpl"); - - if (service == null) { - // 如果JAR包加载失败,尝试从类路径加载 - service = loadFromClasspath("com.terrabase.enterprise.impl.commercial.CommercialEnterpriseServiceImpl"); - } - - if (service == null) { - throw new RuntimeException("无法加载商业版企业服务"); - } - - return service; - } - /** - * 加载开源版服务 - * @return 开源版服务实例 - */ - private EnterpriseService loadOpenSourceService() throws Exception { - logger.info("正在加载开源版企业服务..."); - - // 直接实例化开源版实现(通过直接依赖) - OpenEnterpriseServiceImpl service = new OpenEnterpriseServiceImpl(); - - // 注意:OpenEnterpriseServiceImpl本身不需要KmcConfig - // KmcConfig是子服务(如OpenCryptoServiceImpl)需要的 - // 子服务会在需要时通过JarLoadUtil独立加载和配置 - - logger.info("开源版企业服务加载完成,子服务将在需要时独立加载"); - - if (service == null) { - throw new RuntimeException("无法加载开源版企业服务"); - } - - return service; - } - /** - * 创建默认的KmcConfig - * @return KmcConfig实例 - */ - private KmcConfig createDefaultKmcConfig() { - try { - KmcConfig config = new KmcConfig(); - // 设置默认配置 - config.setEnabled(true); - config.setDefaultKeyId("sdk_default"); - config.setKeyCaching(true); - return config; - } catch (Exception e) { - logger.warn("创建默认KmcConfig失败: {}", e.getMessage()); - return null; - } - } /** * 从JAR包加载服务(通用方法) @@ -377,9 +243,6 @@ private Object loadServiceFromClasspath(String className) { Object instance = defaultConstructor.newInstance(); logger.info("使用默认构造函数创建服务实例"); - // 手动注入依赖 - injectDependencies(instance, className); - return instance; } catch (Exception e) { @@ -388,50 +251,7 @@ private Object loadServiceFromClasspath(String className) { } } - /** - * 从JAR包加载服务 - * @param className 类名 - * @return 服务实例 - */ - private EnterpriseService loadFromJar(String className) { - return (EnterpriseService) loadServiceFromJar(className); - } - - /** - * 从类路径加载服务 - * @param className 类名 - * @return 服务实例 - */ - private EnterpriseService loadFromClasspath(String className) { - return (EnterpriseService) loadServiceFromClasspath(className); - } - /** - * 手动注入依赖 - * @param instance 服务实例 - * @param className 类名 - */ - private void injectDependencies(Object instance, String className) { - try { - // 只为OpenCryptoServiceImpl注入KmcConfig(其他服务不需要) - if (className.contains("OpenCryptoServiceImpl")) { - try { - KmcConfig kmcConfig = createDefaultKmcConfig(); - if (kmcConfig != null) { - java.lang.reflect.Field kmcConfigField = instance.getClass().getDeclaredField("kmcConfig"); - kmcConfigField.setAccessible(true); - kmcConfigField.set(instance, kmcConfig); - logger.info("成功注入 KmcConfig 到 {}", className); - } - } catch (Exception e) { - logger.warn("注入 KmcConfig 到 {} 失败: {}", className, e.getMessage()); - } - } - - } catch (Exception e) { - logger.warn("依赖注入失败: {}", e.getMessage()); - } - } /** * 根据类名获取JAR文件名 diff --git a/business-app/src/main/java/com/terrabase/sdk/TerrabaseSDK.java b/business-app/src/main/java/com/terrabase/sdk/TerrabaseSDK.java index 2be0dc9..1767965 100644 --- a/business-app/src/main/java/com/terrabase/sdk/TerrabaseSDK.java +++ b/business-app/src/main/java/com/terrabase/sdk/TerrabaseSDK.java @@ -16,17 +16,47 @@ * Terrabase SDK 主入口类 * 提供统一的静态调用接口,支持所有企业服务功能 * - * 使用示例: + * <h3>使用方式</h3> * <pre> - * // 初始化SDK - * TerrabaseSDK.init(); + * // 方式1:直接使用静态方法(最简洁) + * String encrypted = TerrabaseSDK.cryptoService().encrypt("hello", CryptoAlgorithm.AES, "user1"); + * String decrypted = TerrabaseSDK.cryptoService().decrypt(encrypted, CryptoAlgorithm.AES, "user1"); * - * // 调用加解密服务 - * String encrypted = TerrabaseSDK.crypto().encrypt("hello", CryptoAlgorithm.AES, "user1"); - * String decrypted = TerrabaseSDK.crypto().decrypt(encrypted, CryptoAlgorithm.AES, "user1"); + * // 方式2:通过getInstance()获取实例后调用 + * String encrypted = TerrabaseSDK.getInstance().crypto().encrypt("hello", CryptoAlgorithm.AES, "user1"); + * String decrypted = TerrabaseSDK.getInstance().crypto().decrypt(encrypted, CryptoAlgorithm.AES, "user1"); * - * // 调用用户管理服务 - * ResultVo&lt;List&lt;LoginUserDto&gt;&gt; users = TerrabaseSDK.userManagement().getCurrentUserInfo(); + * // 方式3:先初始化再调用 + * TerrabaseSDK sdk = TerrabaseSDK.init(); + * String encrypted = sdk.crypto().encrypt("hello", CryptoAlgorithm.AES, "user1"); + * ResultVo&lt;List&lt;LoginUserDto&gt;&gt; users = sdk.userManagement().getCurrentUserInfo(); + * + * // 日志服务 + * TerrabaseSDK.logService().log("INFO", "用户登录成功", "user1"); + * TerrabaseSDK.logService().log("ERROR", "系统异常", "user1"); + * + * // 用户管理服务 + * ResultVo&lt;List&lt;LoginUserDto&gt;&gt; users = TerrabaseSDK.userManagementService().getCurrentUserInfo(); + * + * // 证书管理服务 + * ResultVo&lt;CertificateDto&gt; cert = TerrabaseSDK.certificateService().generateCertificate(request); + * ResultVo&lt;Boolean&gt; valid = TerrabaseSDK.certificateService().validateCertificate("cert123"); + * + * // 监控告警服务 + * ResultVo&lt;Boolean&gt; alert = TerrabaseSDK.monitoringService().sendAlert(alertRequest); + * ResultVo&lt;List&lt;MetricDto&gt;&gt; metrics = TerrabaseSDK.monitoringService().getMetrics("cpu_usage", "2024-01-01", "2024-01-31"); + * + * // 获取企业模式信息 + * String mode = TerrabaseSDK.getInstance().getEnterpriseMode(); + * String info = TerrabaseSDK.getServiceInfo(); + * </pre> + * + * <h3>配置初始化方式(高级用法)</h3> + * <pre> + * // 使用自定义配置初始化 + * TerrabaseSDKConfig config = new TerrabaseSDKConfig(); + * config.setJarPath("/path/to/enterprise/jars"); + * TerrabaseSDK.init(config); * </pre> * * @author Yehong Pan @@ -140,12 +170,12 @@ public UserManagementService userManagement() { } /** - * 获取日志管理服务 + * 获取日志服务 * - * @return 日志管理服务实例 + * @return 日志服务实例 */ - public LogManagementService logManagement() { - return getService("log_management_service", jarLoadUtil::loadLogManagementService); + public LogService log() { + return getService("log_service", jarLoadUtil::loadLogService); } /** @@ -166,13 +196,72 @@ public MonitoringService monitoring() { return getService("monitoring_service", jarLoadUtil::loadMonitoringService); } + + // ==================== 静态方法(便捷调用) ==================== + + /** + * 获取加解密服务(静态方法) + * + * @return 加解密服务实例 + */ + public static CryptoService cryptoService() { + return getInstance().crypto(); + } + /** - * 获取企业服务 + * 获取用户管理服务(静态方法) * - * @return 企业服务实例 + * @return 用户管理服务实例 */ - public EnterpriseService enterprise() { - return getService("enterprise_service", jarLoadUtil::loadEnterpriseService); + public static UserManagementService userManagementService() { + return getInstance().userManagement(); + } + + /** + * 获取日志服务(静态方法) + * + * @return 日志服务实例 + */ + public static LogService logService() { + return getInstance().log(); + } + + /** + * 获取证书管理服务(静态方法) + * + * @return 证书管理服务实例 + */ + public static CertificateService certificateService() { + return getInstance().certificate(); + } + + /** + * 获取监控告警服务(静态方法) + * + * @return 监控告警服务实例 + */ + public static MonitoringService monitoringService() { + return getInstance().monitoring(); + } + + + /** + * 获取服务信息(静态方法) + * 返回包含企业模式等信息的字符串 + * + * @return 服务信息字符串 + */ + public static String getServiceInfo() { + try { + StringBuilder info = new StringBuilder(); + info.append("企业模式: ").append(getInstance().getEnterpriseMode()).append("\n"); + info.append("JAR路径: ").append(getInstance().getConfig().getJarPath()).append("\n"); + info.append("Nacos发现: ").append(getInstance().getConfig().isNacosDiscoveryEnabled() ? "启用" : "禁用"); + return info.toString(); + } catch (Exception e) { + logger.error("获取服务信息失败", e); + return "获取服务信息失败: " + e.getMessage(); + } } /** @@ -274,51 +363,4 @@ private interface ServiceLoader<T> { T load() throws Exception; } - // ==================== 便捷方法 ==================== - - /** - * 快速加密方法 - * - * @param plaintext 明文 - * @param algorithm 算法 - * @param username 用户名 - * @return 密文 - */ - public static String encrypt(String plaintext, CryptoAlgorithm algorithm, String username) { - return getInstance().crypto().encrypt(plaintext, algorithm, username); - } - - /** - * 快速解密方法 - * - * @param ciphertext 密文 - * @param algorithm 算法 - * @param username 用户名 - * @return 明文 - */ - public static String decrypt(String ciphertext, CryptoAlgorithm algorithm, String username) { - return getInstance().crypto().decrypt(ciphertext, algorithm, username); - } - - /** - * 快速获取当前用户信息 - * - * @return 用户信息列表 - */ - public static ResultVo<List<LoginUserDto>> getCurrentUserInfo() { - return getInstance().userManagement().getCurrentUserInfo(); - } - - /** - * 快速获取企业服务信息 - * - * @return 企业服务信息 - */ - public static String getServiceInfo() { - EnterpriseService service = getInstance().enterprise(); - return String.format("服务名称: %s, 版本: %s, 类型: %s", - service.getServiceName(), - service.getServiceVersion(), - service.getServiceType()); - } } diff --git a/business-app/src/main/java/com/terrabase/sdk/example/SDKUsageExample.java b/business-app/src/main/java/com/terrabase/sdk/example/SDKUsageExample.java index 5bc57e7..00ee04c 100644 --- a/business-app/src/main/java/com/terrabase/sdk/example/SDKUsageExample.java +++ b/business-app/src/main/java/com/terrabase/sdk/example/SDKUsageExample.java @@ -1,7 +1,11 @@ package com.terrabase.sdk.example; import com.terrabase.enterprise.api.CryptoAlgorithm; -import com.terrabase.enterprise.api.dto.LoginUserDto; +import com.terrabase.enterprise.api.dto.*; +import com.terrabase.enterprise.api.request.LogAttributeVo; +import com.terrabase.enterprise.api.request.RegisterEventDefineReq; +import com.terrabase.enterprise.api.request.GetEventsParams; +import com.terrabase.enterprise.api.dto.EventDefine; import com.terrabase.enterprise.api.response.ResultVo; import com.terrabase.sdk.TerrabaseSDK; @@ -28,6 +32,15 @@ public static void main(String[] args) { // 示例4:企业服务信息 enterpriseServiceExample(); + + // 示例5:日志服务 + logServiceExample(); + + // 示例6:证书管理 + certificateServiceExample(); + + // 示例7:监控告警 + monitoringServiceExample(); } /** @@ -36,16 +49,19 @@ public static void main(String[] args) { public static void basicUsageExample() { System.out.println("=== 基本使用示例 ==="); - // 初始化SDK - TerrabaseSDK sdk = TerrabaseSDK.init(); + // 方式1:通过getInstance()调用(推荐) + String mode = TerrabaseSDK.getInstance().getEnterpriseMode(); + String serviceInfo = TerrabaseSDK.getServiceInfo(); + System.out.println("企业模式: " + mode); + System.out.println("服务信息: " + serviceInfo); - // 获取企业模式 - String mode = sdk.getEnterpriseMode(); - System.out.println("当前企业模式: " + mode); + // 方式2:传统实例化方式 + TerrabaseSDK sdk = TerrabaseSDK.init(); + String sdkMode = sdk.getEnterpriseMode(); + System.out.println("当前企业模式: " + sdkMode); - // 获取企业服务信息 - String serviceInfo = TerrabaseSDK.getServiceInfo(); - System.out.println("企业服务信息: " + serviceInfo); + // 方式3:获取详细信息 + System.out.println("企业服务详细信息: " + serviceInfo); } /** @@ -55,24 +71,24 @@ public static void cryptoExample() { System.out.println("\n=== 加解密操作示例 ==="); try { - // 初始化SDK - TerrabaseSDK.init(); - String plaintext = "Hello, Terrabase!"; String username = "user1"; - // 使用静态方法快速加密 - String encrypted = TerrabaseSDK.encrypt(plaintext, CryptoAlgorithm.AES, username); - System.out.println("加密结果: " + encrypted); + // 方式1:直接使用静态方法(最简洁) + String encrypted = TerrabaseSDK.cryptoService().encrypt(plaintext, CryptoAlgorithm.AES, username); + System.out.println("AES加密结果: " + encrypted); - // 使用静态方法快速解密 - String decrypted = TerrabaseSDK.decrypt(encrypted, CryptoAlgorithm.AES, username); - System.out.println("解密结果: " + decrypted); + String decrypted = TerrabaseSDK.cryptoService().decrypt(encrypted, CryptoAlgorithm.AES, username); + System.out.println("AES解密结果: " + decrypted); - // 使用实例方法 - TerrabaseSDK sdk = TerrabaseSDK.getInstance(); - String encrypted2 = sdk.crypto().encrypt("Another message", CryptoAlgorithm.RSA, username); - System.out.println("RSA加密结果: " + encrypted2); + // 方式2:RSA加密 + String rsaEncrypted = TerrabaseSDK.cryptoService().encrypt("Another message", CryptoAlgorithm.RSA, username); + System.out.println("RSA加密结果: " + rsaEncrypted); + + // 方式3:传统实例化方式 + TerrabaseSDK sdk = TerrabaseSDK.init(); + String encrypted3 = sdk.crypto().encrypt("Instance method", CryptoAlgorithm.AES, username); + System.out.println("实例方法加密结果: " + encrypted3); } catch (Exception e) { System.err.println("加解密操作失败: " + e.getMessage()); @@ -86,11 +102,8 @@ public static void userManagementExample() { System.out.println("\n=== 用户管理示例 ==="); try { - // 初始化SDK - TerrabaseSDK.init(); - - // 获取当前用户信息 - ResultVo<List<LoginUserDto>> result = TerrabaseSDK.getCurrentUserInfo(); + // 方式1:直接使用静态方法(最简洁) + ResultVo<List<LoginUserDto>> result = TerrabaseSDK.userManagementService().getCurrentUserInfo(); if ("200".equals(result.getCode())) { System.out.println("用户信息获取成功:"); @@ -104,6 +117,11 @@ public static void userManagementExample() { System.out.println("用户信息获取失败: " + result.getMsg()); } + // 方式2:传统实例化方式 + TerrabaseSDK sdk = TerrabaseSDK.init(); + ResultVo<List<LoginUserDto>> result2 = sdk.userManagement().getCurrentUserInfo(); + System.out.println("实例方式获取用户信息: " + (result2.getData() != null ? result2.getData().size() + "个用户" : "无数据")); + } catch (Exception e) { System.err.println("用户管理操作失败: " + e.getMessage()); } @@ -116,29 +134,188 @@ public static void enterpriseServiceExample() { System.out.println("\n=== 企业服务信息示例 ==="); try { - // 初始化SDK + // 方式1:直接使用静态方法(最简洁) + System.out.println("企业服务信息:"); + System.out.println(TerrabaseSDK.getServiceInfo()); + + // 方式2:传统实例化方式 TerrabaseSDK sdk = TerrabaseSDK.init(); + String mode = sdk.getEnterpriseMode(); + System.out.println("实例方式获取企业模式: " + mode); - // 获取企业服务 - var enterpriseService = sdk.enterprise(); + // 方式3:展示所有服务的调用 + System.out.println("\n所有服务调用演示:"); + System.out.println(" 加解密服务: " + TerrabaseSDK.cryptoService().getClass().getSimpleName()); + System.out.println(" 用户管理服务: " + TerrabaseSDK.userManagementService().getClass().getSimpleName()); + System.out.println(" 日志服务: " + TerrabaseSDK.logService().getClass().getSimpleName()); + System.out.println(" 证书服务: " + TerrabaseSDK.certificateService().getClass().getSimpleName()); + System.out.println(" 监控服务: " + TerrabaseSDK.monitoringService().getClass().getSimpleName()); - System.out.println("企业服务信息:"); - System.out.println(" 服务名称: " + enterpriseService.getServiceName()); - System.out.println(" 服务版本: " + enterpriseService.getServiceVersion()); - System.out.println(" 服务类型: " + enterpriseService.getServiceType()); - System.out.println(" 健康状态: " + enterpriseService.getHealthStatus()); + } catch (Exception e) { + System.err.println("企业服务操作失败: " + e.getMessage()); + } + } + + /** + * 日志服务示例 + */ + public static void logServiceExample() { + System.out.println("\n=== 日志服务示例 ==="); + + try { + // 创建日志属性对象 + LogAttributeVo log1 = new LogAttributeVo(); + log1.setSn(1L); + log1.setLogType("INFO"); + log1.setUsername("user1"); + log1.setOperation("登录"); + log1.setSource("web"); + log1.setTerminal("browser"); + log1.setResult("成功"); + log1.setFlag("normal"); + log1.setParamType("string"); + log1.setDetail("用户登录成功"); - // 获取其他服务 - var cryptoService = sdk.crypto(); - var userService = sdk.userManagement(); - var logService = sdk.logManagement(); - var certService = sdk.certificate(); - var monitorService = sdk.monitoring(); + LogAttributeVo log2 = new LogAttributeVo(); + log2.setSn(2L); + log2.setLogType("ERROR"); + log2.setUsername("user1"); + log2.setOperation("数据库连接"); + log2.setSource("system"); + log2.setTerminal("server"); + log2.setResult("失败"); + log2.setFlag("error"); + log2.setParamType("string"); + log2.setDetail("数据库连接失败"); - System.out.println("所有服务已加载完成"); + // 批量上报日志 + List<LogAttributeVo> logs = List.of(log1, log2); + ResultVo<Integer> result = TerrabaseSDK.logService().registerLogs(logs); + if ("200".equals(result.getCode())) { + System.out.println("日志上报成功,上报了 " + result.getData() + " 条日志"); + } + + // 注册日志国际化信息 + LogI18n logI18n = new LogI18n(); + logI18n.setCode("user.login.success"); + logI18n.setLanguage("zh-CN"); + logI18n.setContent("用户登录成功"); + + ResultVo<Boolean> i18nResult = TerrabaseSDK.logService().registryInternational(List.of(logI18n)); + if ("200".equals(i18nResult.getCode())) { + System.out.println("日志国际化注册成功: " + i18nResult.getData()); + } } catch (Exception e) { - System.err.println("企业服务操作失败: " + e.getMessage()); + System.err.println("日志服务操作失败: " + e.getMessage()); + } + } + + /** + * 证书管理服务示例 + */ + public static void certificateServiceExample() { + System.out.println("\n=== 证书管理服务示例 ==="); + + try { + // 获取证书服务列表 + ResultVo<List<CertCollectInfo>> certs = TerrabaseSDK.certificateService().listCertificateServiceList(); + if ("200".equals(certs.getCode()) && certs.getData() != null) { + System.out.println("获取到 " + certs.getData().size() + " 个证书服务"); + for (CertCollectInfo cert : certs.getData()) { + System.out.println(" 证书服务: " + cert.getProductName() + " (状态: " + cert.getStatus() + ")"); + } + } + + // 获取License信息 + ResultVo<LicenseInfo> license = TerrabaseSDK.certificateService().getLicenseInfo(); + if ("200".equals(license.getCode()) && license.getData() != null) { + LicenseInfo licenseInfo = license.getData(); + System.out.println("License信息:"); + System.out.println(" 状态: " + licenseInfo.getStatus()); + System.out.println(" SBOM数量: " + (licenseInfo.getSboms() != null ? licenseInfo.getSboms().size() : 0)); + } + + } catch (Exception e) { + System.err.println("证书管理操作失败: " + e.getMessage()); + } + } + + /** + * 监控告警服务示例 + */ + public static void monitoringServiceExample() { + System.out.println("\n=== 监控告警服务示例 ==="); + + try { + // 注册告警定义 + RegisterEventDefineReq eventDefine = new RegisterEventDefineReq(); + eventDefine.setServiceName("system-service"); + eventDefine.setServiceEn("System Service"); + eventDefine.setServiceZh("系统服务"); + eventDefine.setDeleteAll(false); + + // 创建事件定义列表 + EventDefine eventDef = new EventDefine(); + eventDef.setEventId("system-error-001"); + eventDef.setName("系统异常"); + eventDef.setType("event"); + eventDef.setCategory("system"); + eventDef.setDescription("系统发生异常"); + eventDef.setSeverity("major"); + eventDef.setLanguage("zh-cn"); + + eventDefine.setEventDefines(List.of(eventDef)); + + ResultVo registerResult = TerrabaseSDK.monitoringService().registerEventDefine(eventDefine); + if ("200".equals(registerResult.getCode())) { + System.out.println("告警定义注册成功"); + } + + // 上报告警事件 + EventInfo eventInfo = new EventInfo(); + eventInfo.setEventName("系统异常"); + eventInfo.setEventType("event"); + eventInfo.setEventSubject("数据库连接超时"); + eventInfo.setEventSubjectType("system"); + eventInfo.setSeverity("major"); + eventInfo.setEventCategory("system"); + eventInfo.setStatus("Uncleared"); + eventInfo.setFirstOccurTime("2024-01-01T00:00:00Z"); + eventInfo.setParts("system"); + eventInfo.setLanguage("zh-cn"); + + ResultVo<Boolean> sendResult = TerrabaseSDK.monitoringService().sendEvents(List.of(eventInfo)); + if ("200".equals(sendResult.getCode())) { + System.out.println("告警事件上报成功: " + sendResult.getData()); + } + + // 查询告警事件 + GetEventsParams queryParams = new GetEventsParams(); + queryParams.setAlarmName("系统异常"); + queryParams.setStartTime(1704067200000L); // 2024-01-01 + queryParams.setEndTime(1706745600000L); // 2024-01-31 + queryParams.setSeverity("major"); + queryParams.setCategory("system"); + queryParams.setEventType("Uncleared"); + queryParams.setOrderBy("first_occur_time desc"); + queryParams.setLanguage("zh-cn"); + queryParams.setPageNum(1); + queryParams.setPageSize(10); + + ResultVo<EventsCollection> events = TerrabaseSDK.monitoringService().getEventsByPage(queryParams); + if ("200".equals(events.getCode()) && events.getData() != null) { + EventsCollection collection = events.getData(); + System.out.println("查询到 " + collection.getTotalCount() + " 条告警事件"); + if (collection.getEvents() != null) { + for (EventObject event : collection.getEvents()) { + System.out.println(" 事件: " + event.getEventName() + " (" + event.getEventType() + ")"); + } + } + } + + } catch (Exception e) { + System.err.println("监控告警操作失败: " + e.getMessage()); } } diff --git a/business-app/src/main/resources/application.properties b/business-app/src/main/resources/application.properties index 5b76a1e..ecbd905 100644 --- a/business-app/src/main/resources/application.properties +++ b/business-app/src/main/resources/application.properties @@ -32,16 +32,6 @@ logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - enterprise.service.cache.enabled=true enterprise.service.cache.ttl=3600 -# KMC (Key Management Center) 配置 -terrabase.kmc.enabled=true -terrabase.kmc.default-key-id=default -terrabase.kmc.key-caching=true -terrabase.kmc.max-cache-size=100 -terrabase.kmc.key-expiration-time=86400000 -terrabase.kmc.enable-key-rotation=false -terrabase.kmc.key-rotation-interval=604800000 -terrabase.kmc.enable-audit-log=true - # 监控配置 management.endpoints.web.exposure.include=health,info,metrics management.endpoint.health.show-details=always diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java deleted file mode 100644 index 4576d3e..0000000 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/EnterpriseService.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.terrabase.enterprise.api; - -/** - * 企业级服务接口 - * 定义企业级功能的核心接口,组合各个子服务 - * - * @author Yehong Pan - * @version 1.0.0 - */ -public interface EnterpriseService { - - /** - * 获取服务名称 - * @return 服务名称 - */ - String getServiceName(); - - /** - * 获取服务版本 - * @return 服务版本 - */ - String getServiceVersion(); - - /** - * 获取服务类型(commercial 或 open) - * @return 服务类型 - */ - String getServiceType(); - - /** - * 获取服务健康状态 - * @return 健康状态信息 - */ - String getHealthStatus(); - - -} diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/LogManagementService.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/LogService.java similarity index 93% rename from enterprise-api/src/main/java/com/terrabase/enterprise/api/LogManagementService.java rename to enterprise-api/src/main/java/com/terrabase/enterprise/api/LogService.java index 3d30eb3..b3b9fc5 100644 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/LogManagementService.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/LogService.java @@ -6,7 +6,7 @@ import java.util.List; -public interface LogManagementService { +public interface LogService { /** * 上报审计日志接口 diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java deleted file mode 100644 index 488b4bc..0000000 --- a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialEnterpriseServiceImpl.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.terrabase.enterprise.impl.commercial; - -import com.terrabase.enterprise.api.EnterpriseService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; - - -/** - * 商业版企业服务实现 - * 提供企业级服务的基本功能,子服务通过JarLoadUtil独立管理 - * - * @author Yehong Pan - * @version 1.0.0 - */ -@Service -public class CommercialEnterpriseServiceImpl implements EnterpriseService { - - private static final Logger logger = LoggerFactory.getLogger(CommercialEnterpriseServiceImpl.class); - - - @Override - public String getServiceName() { - return "Commercial Enterprise Service"; - } - - @Override - public String getServiceVersion() { - return "1.0.0-commercial"; - } - - @Override - public String getServiceType() { - return "commercial"; - } - - @Override - public String getHealthStatus() { - return String.format("商业版企业服务健康状态: 正常 (版本: %s, 类型: %s)", - getServiceVersion(), getServiceType()); - } - - -} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialLogManagementServiceImpl.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialLogServiceImpl.java similarity index 94% rename from enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialLogManagementServiceImpl.java rename to enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialLogServiceImpl.java index b550cb4..b82420c 100644 --- a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialLogManagementServiceImpl.java +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/CommercialLogServiceImpl.java @@ -1,6 +1,6 @@ package com.terrabase.enterprise.impl.commercial; -import com.terrabase.enterprise.api.LogManagementService; +import com.terrabase.enterprise.api.LogService; import com.terrabase.enterprise.api.dto.*; import com.terrabase.enterprise.api.request.LogAttributeVo; import com.terrabase.enterprise.api.response.ResultVo; @@ -20,9 +20,9 @@ * @version 1.0.0 */ @Service -public class CommercialLogManagementServiceImpl implements LogManagementService { +public class CommercialLogServiceImpl implements LogService { - private static final Logger logger = LoggerFactory.getLogger(CommercialLogManagementServiceImpl.class); + private static final Logger logger = LoggerFactory.getLogger(CommercialLogServiceImpl.class); @Autowired private OperateLogFeignClient operateLogFeignClient; diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCryptoServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCryptoServiceImpl.java index 37eed14..c97deaf 100644 --- a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCryptoServiceImpl.java +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenCryptoServiceImpl.java @@ -22,12 +22,60 @@ public class OpenCryptoServiceImpl implements CryptoService { private static final Logger logger = LoggerFactory.getLogger(OpenCryptoServiceImpl.class); - @Autowired + @Autowired(required = false) private KmcConfig kmcConfig; + + /** + * 默认构造函数,用于非Spring环境下的实例化 + */ + public OpenCryptoServiceImpl() { + // 在非Spring环境下,自动创建KmcConfig实例 + this.kmcConfig = createDefaultKmcConfig(); + if (this.kmcConfig != null) { + logger.info("OpenCryptoServiceImpl 已在非Spring环境下成功初始化,KmcConfig自动创建完成"); + } else { + logger.warn("OpenCryptoServiceImpl 初始化失败,KmcConfig创建失败"); + } + } + + /** + * 创建默认的KmcConfig实例 + * @return KmcConfig实例 + */ + private KmcConfig createDefaultKmcConfig() { + try { + KmcConfig config = new KmcConfig(); + // 设置默认配置 + config.setEnabled(true); + config.setDefaultKeyId("sdk_default"); + config.setKeyCaching(true); + config.setMaxCacheSize(100); + config.setKeyExpirationTime(24 * 60 * 60 * 1000); // 24小时 + config.setEnableKeyRotation(false); + config.setKeyRotationInterval(7 * 24 * 60 * 60 * 1000); // 7天 + config.setEnableAuditLog(true); + + // 手动调用初始化方法(非Spring环境) + config.initialize(); + + return config; + } catch (Exception e) { + logger.error("创建默认KmcConfig失败", e); + return null; + } + } @Override public String encrypt(String plaintext, CryptoAlgorithm algorithm, String username) { + if (kmcConfig == null) { + logger.warn("KmcConfig未初始化,尝试重新创建"); + kmcConfig = createDefaultKmcConfig(); + if (kmcConfig == null) { + return "KMC配置初始化失败,无法执行加密操作"; + } + } + if (!kmcConfig.isEnabled()) { return "KMC功能未启用,无法执行加密操作"; } @@ -63,6 +111,14 @@ public String encrypt(String plaintext, CryptoAlgorithm algorithm, String userna @Override public String decrypt(String ciphertext, CryptoAlgorithm algorithm, String username) { + if (kmcConfig == null) { + logger.warn("KmcConfig未初始化,尝试重新创建"); + kmcConfig = createDefaultKmcConfig(); + if (kmcConfig == null) { + return "KMC配置初始化失败,无法执行解密操作"; + } + } + if (!kmcConfig.isEnabled()) { return "KMC功能未启用,无法执行解密操作"; } diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java deleted file mode 100644 index 9e37bb2..0000000 --- a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.terrabase.enterprise.impl.open; - -import com.terrabase.enterprise.api.EnterpriseService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; - - -/** - * 开源版企业服务实现 - * 提供企业级服务的基本功能,子服务通过JarLoadUtil独立管理 - * - * @author Yehong Pan - * @version 1.0.0 - */ -@Service -public class OpenEnterpriseServiceImpl implements EnterpriseService { - - private static final Logger logger = LoggerFactory.getLogger(OpenEnterpriseServiceImpl.class); - - - @Override - public String getServiceName() { - return "Open Source Enterprise Service"; - } - - @Override - public String getServiceVersion() { - return "1.0.0-open"; - } - - @Override - public String getServiceType() { - return "open"; - } - - @Override - public String getHealthStatus() { - return String.format("开源版企业服务健康状态: 正常 (版本: %s, 类型: %s)", - getServiceVersion(), getServiceType()); - } - -} \ No newline at end of file diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenLogManagementServiceImpl.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenLogServiceImpl.java similarity index 94% rename from enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenLogManagementServiceImpl.java rename to enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenLogServiceImpl.java index 0ef220f..b68f260 100644 --- a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenLogManagementServiceImpl.java +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/OpenLogServiceImpl.java @@ -1,6 +1,6 @@ package com.terrabase.enterprise.impl.open; -import com.terrabase.enterprise.api.LogManagementService; +import com.terrabase.enterprise.api.LogService; import com.terrabase.enterprise.api.dto.LogI18n; import com.terrabase.enterprise.api.request.LogAttributeVo; import com.terrabase.enterprise.api.response.ResultVo; @@ -18,9 +18,9 @@ * @version 1.0.0 */ @Service -public class OpenLogManagementServiceImpl implements LogManagementService { +public class OpenLogServiceImpl implements LogService { - private static final Logger logger = LoggerFactory.getLogger(OpenLogManagementServiceImpl.class); + private static final Logger logger = LoggerFactory.getLogger(OpenLogServiceImpl.class); @Override public ResultVo<Integer> registerLogs(List<LogAttributeVo> logs) { diff --git a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/config/KmcConfig.java b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/config/KmcConfig.java index 74a0952..645ee94 100644 --- a/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/config/KmcConfig.java +++ b/enterprise-impl-open/src/main/java/com/terrabase/enterprise/impl/open/config/KmcConfig.java @@ -38,6 +38,13 @@ public class KmcConfig { @PostConstruct public void init() { + initialize(); + } + + /** + * 手动初始化方法,用于非Spring环境 + */ + public void initialize() { logger.info("初始化KMC配置..."); logger.info("KMC启用状态: {}", enabled); logger.info("默认密钥ID: {}", defaultKeyId); diff --git a/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplIntegrationTest.java b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplIntegrationTest.java deleted file mode 100644 index fff579e..0000000 --- a/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplIntegrationTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.terrabase.enterprise.impl.open; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * 开源版企业服务集成测试(适配当前API) - */ -class OpenEnterpriseServiceImplIntegrationTest { - - private OpenEnterpriseServiceImpl enterpriseService; - - @BeforeEach - void setUp() { - enterpriseService = new OpenEnterpriseServiceImpl(); - } - - @Test - void testBasicServiceOperations() { - assertEquals("Open Source Enterprise Service", enterpriseService.getServiceName()); - assertEquals("1.0.0-open", enterpriseService.getServiceVersion()); - assertEquals("open", enterpriseService.getServiceType()); - - String healthStatus = enterpriseService.getHealthStatus(); - assertNotNull(healthStatus); - assertTrue(healthStatus.contains("正常")); - } - - @Test - void testServiceMetadata() { - assertEquals("Open Source Enterprise Service", enterpriseService.getServiceName()); - assertEquals("1.0.0-open", enterpriseService.getServiceVersion()); - assertEquals("open", enterpriseService.getServiceType()); - - assertNotNull(enterpriseService.getServiceName()); - assertNotNull(enterpriseService.getServiceVersion()); - assertNotNull(enterpriseService.getServiceType()); - } - - @Test - void testHealthStatus() { - String healthStatus = enterpriseService.getHealthStatus(); - assertNotNull(healthStatus); - assertTrue(healthStatus.contains("开源版")); - assertTrue(healthStatus.contains("正常")); - } - - @Test - void testServiceInformationConsistency() { - String serviceName1 = enterpriseService.getServiceName(); - String serviceName2 = enterpriseService.getServiceName(); - assertEquals(serviceName1, serviceName2); - - String serviceVersion1 = enterpriseService.getServiceVersion(); - String serviceVersion2 = enterpriseService.getServiceVersion(); - assertEquals(serviceVersion1, serviceVersion2); - - String serviceType1 = enterpriseService.getServiceType(); - String serviceType2 = enterpriseService.getServiceType(); - assertEquals(serviceType1, serviceType2); - } -} \ No newline at end of file diff --git a/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java b/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java deleted file mode 100644 index 79852ac..0000000 --- a/enterprise-impl-open/src/test/java/com/terrabase/enterprise/impl/open/OpenEnterpriseServiceImplKmcTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.terrabase.enterprise.impl.open; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.DisplayName; -import static org.junit.jupiter.api.Assertions.*; - -/** - * 开源版企业服务基本功能测试(适配当前API) - */ -@DisplayName("开源版企业服务基本功能测试") -public class OpenEnterpriseServiceImplKmcTest { - - private OpenEnterpriseServiceImpl service; - - @BeforeEach - void setUp() { - service = new OpenEnterpriseServiceImpl(); - } - - @Test - @DisplayName("测试服务初始化与健康状态") - void testServiceInitialization() { - assertEquals("Open Source Enterprise Service", service.getServiceName()); - assertEquals("1.0.0-open", service.getServiceVersion()); - assertEquals("open", service.getServiceType()); - - String healthStatus = service.getHealthStatus(); - assertNotNull(healthStatus); - assertTrue(healthStatus.contains("正常")); - assertTrue(healthStatus.contains("开源版")); - } - - @Test - @DisplayName("测试服务元数据") - void testServiceMetadata() { - assertEquals("Open Source Enterprise Service", service.getServiceName()); - assertEquals("1.0.0-open", service.getServiceVersion()); - assertEquals("open", service.getServiceType()); - - assertNotNull(service.getServiceName()); - assertNotNull(service.getServiceVersion()); - assertNotNull(service.getServiceType()); - } - - @Test - @DisplayName("测试健康状态信息格式") - void testHealthStatusInformation() { - String healthStatus = service.getHealthStatus(); - assertNotNull(healthStatus); - assertTrue(healthStatus.contains("开源版")); - assertTrue(healthStatus.contains("正常")); - } -} \ No newline at end of file From cf4551794eaaac61d9a55ebc13c33c8a7e1932e4 Mon Sep 17 00:00:00 2001 From: panyehong <2655992392@qq.com> Date: Fri, 24 Oct 2025 19:16:08 +0800 Subject: [PATCH 5/6] =?UTF-8?q?[feat]<terrabase>Terrabase=E7=9A=84SDK?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E3=80=82=20[=E5=85=B7=E4=BD=93=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0]=201.=E5=B0=86SDK=E7=9A=84=E5=AE=9E=E7=8E=B0=E5=92=8C?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=B8=8B=E6=B2=89=E5=88=B0enterprise-api?= =?UTF-8?q?=E4=B8=AD=E3=80=82=202.=E8=BE=93=E5=87=BA=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API-INTERFACE-DOCUMENTATION.md | 779 ++++++++++++++++++ business-app/pom.xml | 8 +- .../sdk/example/SDKUsageExample.java | 2 +- enterprise-api/pom.xml | 28 + .../api}/sdk/StandaloneJarLoadUtil.java | 140 +++- .../enterprise/api}/sdk/TerrabaseSDK.java | 39 +- .../api/sdk}/TerrabaseSDKConfig.java | 2 +- enterprise-impl-commercial/pom.xml | 14 - .../config/CommercialNacosConfig.java | 2 +- pom.xml | 1 - 10 files changed, 977 insertions(+), 38 deletions(-) create mode 100644 API-INTERFACE-DOCUMENTATION.md rename {business-app/src/main/java/com/terrabase => enterprise-api/src/main/java/com/terrabase/enterprise/api}/sdk/StandaloneJarLoadUtil.java (63%) rename {business-app/src/main/java/com/terrabase => enterprise-api/src/main/java/com/terrabase/enterprise/api}/sdk/TerrabaseSDK.java (89%) rename {sdk-config/src/main/java/com/terrabase/sdk/config => enterprise-api/src/main/java/com/terrabase/enterprise/api/sdk}/TerrabaseSDKConfig.java (99%) diff --git a/API-INTERFACE-DOCUMENTATION.md b/API-INTERFACE-DOCUMENTATION.md new file mode 100644 index 0000000..420c744 --- /dev/null +++ b/API-INTERFACE-DOCUMENTATION.md @@ -0,0 +1,779 @@ +# Terrabase Enterprise API 接口文档 + +## 概述 + +本文档详细描述了 Terrabase Enterprise API 模块中所有服务接口的定义、参数、返回值和使用方法。该模块提供了企业级应用的核心功能,包括证书管理、加解密服务、日志管理、菜单管理、监控告警和用户管理等功能。 + +## 目录 + +- [通用响应格式](#通用响应格式) +- [证书管理服务 (CertificateService)](#证书管理服务-certificateservice) +- [加解密服务 (CryptoService)](#加解密服务-cryptoservice) +- [日志服务 (LogService)](#日志服务-logservice) +- [菜单管理服务 (MenuService)](#菜单管理服务-menuservice) +- [监控告警服务 (MonitoringService)](#监控告警服务-monitoringservice) +- [用户管理服务 (UserManagementService)](#用户管理服务-usermanagementservice) +- [数据模型](#数据模型) + +--- + +## 通用响应格式 + +所有 API 接口都使用统一的响应格式 `ResultVo<T>`: + +```java +public class ResultVo<T> { + private String code; // 响应状态码 + private String msg; // 响应消息 + private T data; // 响应数据 +} +``` + +**状态码说明:** +- `200`: 操作成功 +- 其他: 具体错误码,详见各接口说明 + +--- + +## 证书管理服务 (CertificateService) + +### 接口概述 +提供证书注册、导入、查询等功能。 + +### 接口方法 + +#### 1. 获取证书列表 +```java +ResultVo<List<CertCollectInfo>> listCertificateServiceList() +``` + +**功能描述:** 获取 OMS 管理的所有证书信息 + +**返回值:** `ResultVo<List<CertCollectInfo>>` +- 成功时返回证书信息列表 +- 失败时返回错误信息 + +**CertCollectInfo 字段说明:** + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| productName | String | 产品名称 | +| issueTime | long | 签发时间 | +| expirationTime | long | 过期时间 | +| issuer | String | 颁发者 | +| subject | String | 主题 | +| serialNumber | String | 序列号 | +| certType | String | 证书类型 | +| status | String | 状态 | +| alertBeforeExpirationDays | Integer | 过期前提醒天数 | +| certName | String | 证书名称 | +| productVersion | String | 产品版本 | +| patchVersion | String | 补丁版本 | +| deviceEsn | String | 设备序列号 | + +#### 2. 获取许可证信息 +```java +ResultVo<LicenseInfo> getLicenseInfo() +``` + +**功能描述:** 查询 License 信息 + +**返回值:** `ResultVo<LicenseInfo>` +- 成功时返回许可证信息 +- 失败时返回错误信息 + +**LicenseInfo 字段说明:** + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| status | String | 许可证状态 (0:未导入, 1:已上传未激活, 2:已激活, 3:已注销) | +| sboms | List<LicenseInfoEx> | SBOM 信息列表 | + +--- + +## 加解密服务 (CryptoService) + +### 接口概述 +提供数据加密和解密功能,支持多种加密算法。 + +### 支持的加密算法 + +```java +public enum CryptoAlgorithm { + AES, // AES加密算法 (默认) + RSA, // RSA非对称加密 + DES, // DES加密算法 + TRIPLE_DES, // 3DES加密算法 + BLOWFISH, // Blowfish加密算法 + CHACHA20 // ChaCha20流密码算法 +} +``` + +### 接口方法 + +#### 1. 数据加密 +```java +String encrypt(String plaintext, CryptoAlgorithm algorithm, String username) +``` + +**功能描述:** 对明文数据进行加密 + +**参数说明:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| plaintext | String | 是 | 待加密的明文数据 | +| algorithm | CryptoAlgorithm | 否 | 加密算法,为 null 时使用默认 AES 算法 | +| username | String | 是 | 用户名 | + +**返回值:** `String` - 加密后的密文数据 + +**使用示例:** +```java +// 使用默认 AES 算法加密 +String ciphertext = cryptoService.encrypt("Hello World", null, "admin"); + +// 使用 RSA 算法加密 +String ciphertext = cryptoService.encrypt("Hello World", CryptoAlgorithm.RSA, "admin"); +``` + +#### 2. 数据解密 +```java +String decrypt(String ciphertext, CryptoAlgorithm algorithm, String username) +``` + +**功能描述:** 对密文数据进行解密 + +**参数说明:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| ciphertext | String | 是 | 待解密的密文数据 | +| algorithm | CryptoAlgorithm | 否 | 解密算法,为 null 时使用默认 AES 算法 | +| username | String | 是 | 用户名 | + +**返回值:** `String` - 解密后的明文数据 + +**使用示例:** +```java +// 使用默认 AES 算法解密 +String plaintext = cryptoService.decrypt(ciphertext, null, "admin"); + +// 使用 RSA 算法解密 +String plaintext = cryptoService.decrypt(ciphertext, CryptoAlgorithm.RSA, "admin"); +``` + +--- + +## 日志服务 (LogService) + +### 接口概述 +提供审计日志上报和国际化功能。 + +### 接口方法 + +#### 1. 上报审计日志 +```java +ResultVo<Integer> registerLogs(List<LogAttributeVo> logs) +``` + +**功能描述:** 批量上报审计日志 + +**参数说明:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| logs | List<LogAttributeVo> | 是 | 日志对象列表 | + +**LogAttributeVo 字段说明:** + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| sn | long | 序列号 | +| logType | String | 日志类型 | +| username | String | 用户名 | +| operation | String | 操作 | +| source | String | 来源 | +| terminal | String | 终端 | +| result | String | 结果 | +| flag | String | 标志 | +| paramType | String | 参数类型 | +| detail | String | 详细信息 | + +**返回值:** `ResultVo<Integer>` - 返回成功处理的日志条数 + +#### 2. 注册审计日志国际化 +```java +ResultVo<Boolean> registryInternational(List<LogI18n> logI18ns) +``` + +**功能描述:** 批量注册审计日志的国际化信息 + +**参数说明:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| logI18ns | List<LogI18n> | 是 | 国际化对象列表 | + +**返回值:** `ResultVo<Boolean>` - 返回注册是否成功 + +--- + +## 菜单管理服务 (MenuService) + +### 接口概述 +提供菜单注册功能。 + +### 接口方法 + +#### 1. 注册菜单信息 +```java +void registerMenuInfo(MenuRegisterInfo menuRegisterInfo) +``` + +**功能描述:** 注册菜单信息到系统 + +**参数说明:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| menuRegisterInfo | MenuRegisterInfo | 是 | 菜单注册信息对象 | + +**MenuRegisterInfo 字段说明:** + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| menuId | String | 是 | 菜单ID | +| parentMenuId | String | 否 | 父菜单ID | +| menuNameCode | String | 否 | 菜单名称代码 | +| url | String | 否 | 菜单URL | +| iconUrl | String | 否 | 图标URL | +| en | String | 否 | 英文名称 | +| zh | String | 否 | 中文名称 | +| enable | boolean | 否 | 是否启用 | +| roleScneMap | List<RoleScenInfo> | 否 | 角色场景映射 | +| weight | int | 否 | 权重 | + +**返回值:** `void` - 无返回值 + +--- + +## 监控告警服务 (MonitoringService) + +### 接口概述 +提供告警定义注册、告警上报、告警查询等功能。 + +### 接口方法 + +#### 1. 批量注册告警定义 +```java +ResultVo registerEventDefine(RegisterEventDefineReq req) +``` + +**功能描述:** 批量注册告警定义到系统 + +**参数说明:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| req | RegisterEventDefineReq | 是 | 注册请求对象 | + +**返回值:** `ResultVo` - 注册结果 + +#### 2. 上报告警 +```java +ResultVo<Boolean> sendEvents(List<EventInfo> alarmInfos) +``` + +**功能描述:** 批量上报告警信息 + +**参数说明:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| alarmInfos | List<EventInfo> | 是 | 告警信息列表 | + +**EventInfo 字段说明:** + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | String | 否 | 事件ID (1-32位数字) | +| serialNumber | String | 否 | 序列号 (UUID格式) | +| syncNo | Integer | 否 | 同步号 | +| eventName | String | 否 | 事件名称 (最大255字符) | +| eventType | String | 是 | 事件类型 (alter/event) | +| eventSubject | String | 是 | 事件主题 (最大255字符) | +| eventSubjectType | String | 是 | 事件主题类型 (最大255字符) | +| eventDescription | String | 否 | 事件描述 (最大8000字符) | +| eventDescriptionArgs | List<String> | 否 | 事件描述参数 (最大64个) | +| severity | String | 是 | 严重程度 (warning/minor/major/critical) | +| effect | String | 否 | 影响 (最大8000字符) | +| eventCategory | String | 是 | 事件分类 (最大128字符) | +| possibleCause | String | 否 | 可能原因 (最大8000字符) | +| suggestion | String | 否 | 建议 (最大8000字符) | +| status | String | 是 | 状态 (Uncleared/Cleared) | +| firstOccurTime | String | 否 | 首次发生时间 (最大32字符) | +| clearTime | String | 否 | 清除时间 (最大32字符) | +| evenSource | String | 否 | 事件源 (最大255字符) | +| deviceSn | String | 否 | 设备序列号 (最大255字符) | +| deviceType | String | 否 | 设备类型 (最大255字符) | +| devURL | String | 否 | 设备URL (最大255字符) | +| parts | String | 是 | 部件 (最大64字符) | +| language | String | 否 | 语言 (zh/zh-cn/en/en-us) | +| computerCategory | int | 否 | 计算机分类 | +| shouldDeleted | boolean | 否 | 是否应删除 | +| clearType | String | 否 | 清除类型 | +| defineMatchKey | String | 否 | 定义匹配键 | +| lastEventMatchKey | String | 否 | 最后事件匹配键 | +| shouldSaveDefine | Boolean | 否 | 是否应保存定义 (默认true) | +| deviceId | String | 否 | 设备ID | + +**返回值:** `ResultVo<Boolean>` - 返回是否上报成功 + +#### 3. 批量查询告警信息 +```java +ResultVo<EventsCollection> getEventsByPage(GetEventsParams getEventsParams) +``` + +**功能描述:** 分页查询告警信息 + +**参数说明:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| getEventsParams | GetEventsParams | 是 | 查询参数对象 | + +**返回值:** `ResultVo<EventsCollection>` - 返回分页查询结果 + +--- + +## 用户管理服务 (UserManagementService) + +### 接口概述 +提供角色、权限、菜单等用户管理功能。 + +### 接口方法 + +#### 1. 批量角色注册 +```java +void batchRegisterRole(RoleRegisterVo roleRegister) +``` + +**功能描述:** 批量注册角色信息 + +**参数说明:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| roleRegister | RoleRegisterVo | 是 | 角色注册对象 | + +**RoleRegisterVo 字段说明:** + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| roleRegisterInfos | List<RoleRegisterInfo> | 角色注册信息列表 | +| roleI18nInfos | List<RoleI18nInfo> | 角色国际化信息列表 | + +**返回值:** `void` - 无返回值 + +#### 2. 批量权限注册 +```java +void registerPermission(List<AuthorityInfo> authorityInfos) +``` + +**功能描述:** 批量注册权限信息 + +**参数说明:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| authorityInfos | List<AuthorityInfo> | 是 | 权限信息列表 | + +**返回值:** `void` - 无返回值 + +#### 3. 获取用户资源组列表 +```java +List<ResourceGroup> getUserGroups(String userName) +``` + +**功能描述:** 根据用户名获取用户所属的资源组列表 + +**参数说明:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| userName | String | 是 | 用户名 | + +**返回值:** `List<ResourceGroup>` - 用户资源组列表 + +#### 4. 根据Token查询角色名 +```java +ResultVo<List<String>> queryRolesByToken() +``` + +**功能描述:** 根据当前用户的Token查询角色名列表 + +**返回值:** `ResultVo<List<String>>` - 返回角色名列表 + +#### 5. 获取当前用户信息 +```java +ResultVo<List<LoginUserDto>> getCurrentUserInfo() +``` + +**功能描述:** 获取当前登录用户的详细信息 + +**返回值:** `ResultVo<List<LoginUserDto>>` - 返回当前用户信息列表 + +--- + +## 数据模型 + +### 通用数据模型 + +#### ResultVo<T> +通用响应包装类,用于统一API响应格式。 + +#### CryptoAlgorithm +加密算法枚举,定义了系统支持的各种加密算法。 + +### 业务数据模型 + +#### CertCollectInfo +证书收集信息,包含证书的详细信息。 + +#### LicenseInfo +许可证信息,包含许可证状态和SBOM信息。 + +#### EventInfo +事件信息,用于告警和监控。 + +#### MenuRegisterInfo +菜单注册信息,用于菜单管理。 + +#### LogAttributeVo +日志属性对象,用于审计日志。 + +#### RoleRegisterVo +角色注册对象,用于角色管理。 + +#### AuthorityInfo +权限信息,用于权限管理。 + +#### ResourceGroup +资源组信息,用于资源管理。 + +#### LoginUserDto +登录用户信息,用于用户认证。 + +--- + +## 使用示例 + +### 1. SDK 初始化方式 + +```java +import com.terrabase.enterprise.api.sdk.TerrabaseSDK; +import com.terrabase.enterprise.api.sdk.TerrabaseSDKConfig; +import com.terrabase.enterprise.api.CryptoAlgorithm; + +public class TerrabaseSDKExample { + + public static void main(String[] args) { + try { + // 方式1:使用默认配置初始化(推荐) + TerrabaseSDK sdk = TerrabaseSDK.init(); + + // 方式2:使用自定义配置初始化 + TerrabaseSDKConfig config = new TerrabaseSDKConfig(); + config.setNacosDiscoveryEnabled(false); // 开源版不启用Nacos + TerrabaseSDK sdk2 = TerrabaseSDK.init(config); + + // 方式3:直接使用静态方法(最简洁) + String encrypted = TerrabaseSDK.cryptoService().encrypt("hello", CryptoAlgorithm.AES, "user1"); + + } catch (Exception e) { + e.printStackTrace(); + } + } +} +``` + +### 2. 加解密服务使用示例 + +```java +// 方式1:使用静态方法(最简洁) +String plaintext = "敏感数据"; +String ciphertext = TerrabaseSDK.cryptoService().encrypt(plaintext, CryptoAlgorithm.AES, "admin"); +System.out.println("加密结果: " + ciphertext); + +String decryptedText = TerrabaseSDK.cryptoService().decrypt(ciphertext, CryptoAlgorithm.AES, "admin"); +System.out.println("解密结果: " + decryptedText); + +// 使用 RSA 算法加密 +String rsaCiphertext = TerrabaseSDK.cryptoService().encrypt(plaintext, CryptoAlgorithm.RSA, "admin"); +System.out.println("RSA 加密结果: " + rsaCiphertext); + +// 方式2:通过实例调用 +TerrabaseSDK sdk = TerrabaseSDK.getInstance(); +String encrypted = sdk.crypto().encrypt(plaintext, CryptoAlgorithm.AES, "admin"); +``` + +### 3. 日志服务使用示例 + +```java +// 使用静态方法调用 +LogService logService = TerrabaseSDK.logService(); + +// 创建日志对象 +LogAttributeVo log = LogAttributeVo.builder() + .sn(System.currentTimeMillis()) + .logType("AUDIT") + .username("admin") + .operation("LOGIN") + .source("WEB") + .terminal("192.168.1.100") + .result("SUCCESS") + .flag("NORMAL") + .paramType("STRING") + .detail("用户登录成功") + .build(); + +// 上报日志 +ResultVo<Integer> result = logService.registerLogs(Arrays.asList(log)); +if ("200".equals(result.getCode())) { + System.out.println("日志上报成功,处理条数: " + result.getData()); +} else { + System.out.println("日志上报失败: " + result.getMsg()); +} + +// 或者直接使用静态方法 +ResultVo<Integer> result2 = TerrabaseSDK.logService().registerLogs(Arrays.asList(log)); +``` + +### 4. 菜单服务使用示例 + +```java +// 使用静态方法获取服务 +MenuService menuService = TerrabaseSDK.menuService(); + +// 创建菜单信息 +MenuRegisterInfo menuInfo = MenuRegisterInfo.builder() + .menuId("MENU_001") + .parentMenuId("ROOT") + .menuNameCode("USER_MANAGEMENT") + .url("/user/management") + .iconUrl("/icons/user.png") + .en("User Management") + .zh("用户管理") + .enable(true) + .weight(1) + .build(); + +// 注册菜单 +try { + menuService.registerMenuInfo(menuInfo); + System.out.println("菜单注册成功"); +} catch (Exception e) { + System.out.println("菜单注册失败: " + e.getMessage()); +} + +// 或者直接使用静态方法 +TerrabaseSDK.menuService().registerMenuInfo(menuInfo); +``` + +### 5. 证书服务使用示例 + +```java +// 使用静态方法获取证书服务 +CertificateService certificateService = TerrabaseSDK.certificateService(); + +// 获取证书列表 +ResultVo<List<CertCollectInfo>> certResult = certificateService.listCertificateServiceList(); +if ("200".equals(certResult.getCode())) { + List<CertCollectInfo> certs = certResult.getData(); + System.out.println("证书数量: " + certs.size()); + for (CertCollectInfo cert : certs) { + System.out.println("证书名称: " + cert.getCertName() + + ", 状态: " + cert.getStatus() + + ", 过期时间: " + new Date(cert.getExpirationTime())); + } +} else { + System.out.println("获取证书列表失败: " + certResult.getMsg()); +} + +// 获取许可证信息 +ResultVo<LicenseInfo> licenseResult = certificateService.getLicenseInfo(); +if ("200".equals(licenseResult.getCode())) { + LicenseInfo license = licenseResult.getData(); + System.out.println("许可证状态: " + license.getStatus()); +} else { + System.out.println("获取许可证信息失败: " + licenseResult.getMsg()); +} + +// 或者直接使用静态方法 +ResultVo<List<CertCollectInfo>> certs = TerrabaseSDK.certificateService().listCertificateServiceList(); +``` + +### 6. 监控告警服务使用示例 + +```java +// 使用静态方法获取监控服务 +MonitoringService monitoringService = TerrabaseSDK.monitoringService(); + +// 创建告警信息 +EventInfo event = EventInfo.builder() + .eventName("系统异常") + .eventType("alter") + .eventSubject("服务器") + .eventSubjectType("硬件") + .eventDescription("服务器CPU使用率过高") + .severity("major") + .eventCategory("性能") + .status("Uncleared") + .parts("CPU") + .build(); + +// 上报告警 +ResultVo<Boolean> alarmResult = monitoringService.sendEvents(Arrays.asList(event)); +if ("200".equals(alarmResult.getCode()) && alarmResult.getData()) { + System.out.println("告警上报成功"); +} else { + System.out.println("告警上报失败: " + alarmResult.getMsg()); +} + +// 或者直接使用静态方法 +ResultVo<Boolean> result = TerrabaseSDK.monitoringService().sendEvents(Arrays.asList(event)); +``` + +### 7. 用户管理服务使用示例 + +```java +// 使用静态方法获取用户管理服务 +UserManagementService userService = TerrabaseSDK.userManagementService(); + +// 获取用户资源组 +List<ResourceGroup> groups = userService.getUserGroups("admin"); +System.out.println("用户资源组数量: " + groups.size()); +for (ResourceGroup group : groups) { + System.out.println("资源组: " + group.getGroupName()); +} + +// 根据Token查询角色 +ResultVo<List<String>> rolesResult = userService.queryRolesByToken(); +if ("200".equals(rolesResult.getCode())) { + List<String> roles = rolesResult.getData(); + System.out.println("用户角色: " + String.join(", ", roles)); +} else { + System.out.println("查询角色失败: " + rolesResult.getMsg()); +} + +// 获取当前用户信息 +ResultVo<List<LoginUserDto>> userResult = userService.getCurrentUserInfo(); +if ("200".equals(userResult.getCode())) { + List<LoginUserDto> users = userResult.getData(); + if (!users.isEmpty()) { + LoginUserDto user = users.get(0); + System.out.println("当前用户: " + user.getUsername()); + } +} else { + System.out.println("获取用户信息失败: " + userResult.getMsg()); +} + +// 或者直接使用静态方法 +ResultVo<List<LoginUserDto>> users = TerrabaseSDK.userManagementService().getCurrentUserInfo(); +``` + +### 8. 完整使用示例 + +```java +import com.terrabase.enterprise.api.sdk.TerrabaseSDK; +import com.terrabase.enterprise.api.CryptoAlgorithm; +import com.terrabase.enterprise.api.dto.LogAttributeVo; +import com.terrabase.enterprise.api.dto.MenuRegisterInfo; +import com.terrabase.enterprise.api.dto.EventInfo; +import com.terrabase.enterprise.api.response.ResultVo; + +public class CompleteExample { + + public static void main(String[] args) { + try { + // 初始化 SDK + TerrabaseSDK.init(); + + // 1. 加解密操作 + String encrypted = TerrabaseSDK.cryptoService().encrypt("Hello World", CryptoAlgorithm.AES, "admin"); + String decrypted = TerrabaseSDK.cryptoService().decrypt(encrypted, CryptoAlgorithm.AES, "admin"); + System.out.println("解密结果: " + decrypted); + + // 2. 日志上报 + LogAttributeVo log = LogAttributeVo.builder() + .sn(System.currentTimeMillis()) + .logType("AUDIT") + .username("admin") + .operation("LOGIN") + .result("SUCCESS") + .build(); + ResultVo<Integer> logResult = TerrabaseSDK.logService().registerLogs(Arrays.asList(log)); + + // 3. 菜单注册 + MenuRegisterInfo menu = MenuRegisterInfo.builder() + .menuId("MENU_001") + .menuNameCode("TEST_MENU") + .zh("测试菜单") + .enable(true) + .build(); + TerrabaseSDK.menuService().registerMenuInfo(menu); + + // 4. 告警上报 + EventInfo event = EventInfo.builder() + .eventName("测试告警") + .eventType("alter") + .eventSubject("系统") + .severity("minor") + .status("Uncleared") + .parts("TEST") + .build(); + ResultVo<Boolean> alarmResult = TerrabaseSDK.monitoringService().sendEvents(Arrays.asList(event)); + + // 5. 用户信息查询 + ResultVo<List<LoginUserDto>> users = TerrabaseSDK.userManagementService().getCurrentUserInfo(); + + System.out.println("所有操作执行完成!"); + + } catch (Exception e) { + System.err.println("操作失败: " + e.getMessage()); + e.printStackTrace(); + } + } +} +``` + +--- + +## 注意事项 + +1. **加密算法选择**:建议根据数据敏感程度选择合适的加密算法,AES适用于一般数据加密,RSA适用于密钥交换。 + +2. **日志上报**:审计日志应包含完整的操作信息,便于后续审计和追踪。 + +3. **菜单注册**:菜单注册时需确保菜单ID唯一,避免冲突。 + +4. **告警信息**:告警信息应包含完整的上下文信息,便于问题定位和处理。 + +5. **权限管理**:权限注册时应遵循最小权限原则,避免权限过度授予。 + +6. **错误处理**:所有接口调用都应进行适当的错误处理,根据返回的状态码进行相应处理。 + +--- + +## 版本信息 + +- **文档版本**: 1.0.0 +- **API版本**: 1.0.0 +- **最后更新**: 2024年12月 + +--- + +## 联系方式 + +如有问题或建议,请联系 Terrabase 开发团队。 diff --git a/business-app/pom.xml b/business-app/pom.xml index ae03d0c..b4eb6ed 100644 --- a/business-app/pom.xml +++ b/business-app/pom.xml @@ -36,13 +36,6 @@ <artifactId>spring-boot-starter-validation</artifactId> </dependency> - <!-- SDK 配置模块依赖 --> - <dependency> - <groupId>com.terrabase</groupId> - <artifactId>sdk-config</artifactId> - <version>${project.version}</version> - </dependency> - <!-- Enterprise API 依赖 --> <dependency> <groupId>com.terrabase</groupId> @@ -105,6 +98,7 @@ </goals> <configuration> <finalName>terrabase-sdk-${project.version}</finalName> + <createDependencyReducedPom>false</createDependencyReducedPom> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.terrabase.sdk.TerrabaseSDK</mainClass> diff --git a/business-app/src/main/java/com/terrabase/sdk/example/SDKUsageExample.java b/business-app/src/main/java/com/terrabase/sdk/example/SDKUsageExample.java index 00ee04c..6e2230d 100644 --- a/business-app/src/main/java/com/terrabase/sdk/example/SDKUsageExample.java +++ b/business-app/src/main/java/com/terrabase/sdk/example/SDKUsageExample.java @@ -7,7 +7,7 @@ import com.terrabase.enterprise.api.request.GetEventsParams; import com.terrabase.enterprise.api.dto.EventDefine; import com.terrabase.enterprise.api.response.ResultVo; -import com.terrabase.sdk.TerrabaseSDK; +import com.terrabase.enterprise.api.sdk.TerrabaseSDK; import java.util.List; diff --git a/enterprise-api/pom.xml b/enterprise-api/pom.xml index 8b71a0c..bf74517 100644 --- a/enterprise-api/pom.xml +++ b/enterprise-api/pom.xml @@ -60,6 +60,26 @@ <artifactId>slf4j-api</artifactId> </dependency> + <!-- 加密相关依赖(用于SDK功能) --> + <dependency> + <groupId>org.bouncycastle</groupId> + <artifactId>bcprov-jdk15on</artifactId> + <version>1.70</version> + </dependency> + + <dependency> + <groupId>org.bouncycastle</groupId> + <artifactId>bcpkix-jdk15on</artifactId> + <version>1.70</version> + </dependency> + + <!-- Base64编码 --> + <dependency> + <groupId>commons-codec</groupId> + <artifactId>commons-codec</artifactId> + <version>1.15</version> + </dependency> + <!-- 测试依赖 --> <dependency> <groupId>org.springframework.boot</groupId> @@ -92,6 +112,14 @@ <target>17</target> </configuration> </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>3.1.0</version> + <configuration> + <mainClass>com.terrabase.enterprise.api.sdk.example.TerrabaseSDKExample</mainClass> + </configuration> + </plugin> </plugins> </build> </project> \ No newline at end of file diff --git a/business-app/src/main/java/com/terrabase/sdk/StandaloneJarLoadUtil.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/sdk/StandaloneJarLoadUtil.java similarity index 63% rename from business-app/src/main/java/com/terrabase/sdk/StandaloneJarLoadUtil.java rename to enterprise-api/src/main/java/com/terrabase/enterprise/api/sdk/StandaloneJarLoadUtil.java index c8770d8..20993b4 100644 --- a/business-app/src/main/java/com/terrabase/sdk/StandaloneJarLoadUtil.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/sdk/StandaloneJarLoadUtil.java @@ -1,4 +1,4 @@ -package com.terrabase.sdk; +package com.terrabase.enterprise.api.sdk; import com.terrabase.enterprise.api.*; import org.slf4j.Logger; @@ -32,14 +32,14 @@ public class StandaloneJarLoadUtil { * @param jarPath JAR包路径 */ public StandaloneJarLoadUtil(String jarPath) { - this.jarPath = jarPath != null ? jarPath : "./lib"; + this.jarPath = jarPath != null ? jarPath : findJarPathStatic(); } /** * 默认构造函数,使用默认路径 */ public StandaloneJarLoadUtil() { - this("./lib"); + this(findJarPathStatic()); } /** @@ -92,6 +92,16 @@ public MonitoringService loadMonitoringService() { "com.terrabase.enterprise.impl.open.OpenMonitoringServiceImpl"); } + /** + * 加载菜单服务 + * @return 菜单服务实例 + */ + public MenuService loadMenuService() { + return (MenuService) loadService("menu_service", + "com.terrabase.enterprise.impl.commercial.CommercialMenuServiceImpl", + "com.terrabase.enterprise.impl.open.OpenMenuServiceImpl"); + } + /** * 通用服务加载方法 * @param cacheKey 缓存键 @@ -114,15 +124,22 @@ private Object loadService(String cacheKey, String commercialClassName, String o if (isCommercialJarAvailable()) { logger.info("检测到商业版JAR包,加载商业版服务: {}", commercialClassName); service = loadServiceFromJar(commercialClassName); + } else if (isOpenJarAvailable()) { + logger.info("检测到开源版JAR包,加载开源版服务: {}", openClassName); + service = loadServiceFromJar(openClassName); } else { - logger.info("未检测到商业版JAR包,使用开源版服务: {}", openClassName); + logger.info("未检测到JAR包,尝试从类路径加载开源版服务: {}", openClassName); service = loadServiceFromClasspath(openClassName); } // 如果服务加载失败,使用开源版作为降级方案 if (service == null) { - logger.warn("服务加载失败,使用开源版作为降级方案: {}", openClassName); - service = loadServiceFromClasspath(openClassName); + logger.warn("服务加载失败,尝试从JAR包加载开源版作为降级方案: {}", openClassName); + if (isOpenJarAvailable()) { + service = loadServiceFromJar(openClassName); + } else { + service = loadServiceFromClasspath(openClassName); + } } // 如果开源版也加载失败,抛出异常 @@ -140,8 +157,14 @@ private Object loadService(String cacheKey, String commercialClassName, String o } catch (Exception e) { logger.error("加载服务失败: {}, 尝试使用开源版作为降级方案", cacheKey, e); try { - // 最后的降级方案:直接实例化开源版服务 - Object fallbackService = loadServiceFromClasspath(openClassName); + // 最后的降级方案:尝试从JAR包或类路径加载开源版服务 + Object fallbackService = null; + if (isOpenJarAvailable()) { + fallbackService = loadServiceFromJar(openClassName); + } else { + fallbackService = loadServiceFromClasspath(openClassName); + } + if (fallbackService != null) { serviceInstances.put(cacheKey, fallbackService); logger.warn("使用开源版服务作为降级方案: {}", cacheKey); @@ -187,6 +210,38 @@ private boolean isCommercialJarAvailable() { return false; } + /** + * 检测开源版JAR包是否可用 + * @return true如果JAR包存在且可加载 + */ + private boolean isOpenJarAvailable() { + try { + String jarFileName = "enterprise-impl-open-1.0.0.jar"; + File jarFile = new File(jarPath, jarFileName); + + if (!jarFile.exists()) { + logger.debug("开源版JAR文件不存在: {}", jarFile.getAbsolutePath()); + return false; + } + + // 尝试加载JAR包中的类来验证JAR包是否有效 + URL jarUrl = jarFile.toURI().toURL(); + URLClassLoader classLoader = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader()); + + // 尝试加载开源版实现类 + Class<?> clazz = classLoader.loadClass("com.terrabase.enterprise.impl.open.OpenCryptoServiceImpl"); + if (clazz != null) { + logger.debug("开源版JAR包验证成功: {}", jarFile.getAbsolutePath()); + return true; + } + + } catch (Exception e) { + logger.debug("开源版JAR包检测失败: {}", e.getMessage()); + } + + return false; + } + @@ -275,11 +330,78 @@ public void clearCache() { serviceInstances.clear(); } + /** + * 智能查找 JAR 路径(静态方法) + * 支持 IntelliJ、Maven、Eclipse 等多种开发环境 + * @return JAR 路径 + */ + private static String findJarPathStatic() { + logger.info("开始智能查找 JAR 路径..."); + + // 获取当前工作目录 + String currentDir = System.getProperty("user.dir"); + logger.debug("当前工作目录: {}", currentDir); + + // 可能的 JAR 路径(按优先级排序) + String[] possiblePaths = { + "lib", // 当前目录下的 lib(IntelliJ 常用) + "./lib", // 明确指定当前目录(Maven 常用) + "../lib", // 上级目录下的 lib + "../../lib", // 上两级目录 + currentDir + "/lib", // 基于工作目录的绝对路径 + "C:/Terrabase/lib", // Windows 绝对路径 + "/Terrabase/lib", // Linux 绝对路径 + currentDir + "/../lib", // 工作目录的上级 lib + currentDir + "/../../lib" // 工作目录的上两级 lib + }; + + // 遍历所有可能的路径 + for (String path : possiblePaths) { + logger.debug("检查路径: {}", path); + File libDir = new File(path); + + if (libDir.exists() && libDir.isDirectory()) { + File[] files = libDir.listFiles(); + if (files != null) { + for (File file : files) { + if (file.getName().contains("enterprise-impl") && file.getName().endsWith(".jar")) { + logger.info("✅ 找到 JAR 路径: {} (包含文件: {})", path, file.getName()); + return path; + } + } + } + } + } + + // 如果都没找到,返回默认路径 + logger.warn("⚠️ 未找到 JAR 文件,使用默认路径: ./lib"); + logger.info("请确保以下路径之一存在 JAR 文件:"); + for (String path : possiblePaths) { + logger.info(" - {}", path); + } + return "./lib"; + } + + /** + * 智能查找 JAR 路径(公共方法) + * 支持 IntelliJ、Maven、Eclipse 等多种开发环境 + * @return JAR 路径 + */ + public static String findJarPath() { + return findJarPathStatic(); + } + /** * 获取当前企业模式 * @return 企业模式 */ public String getEnterpriseMode() { - return isCommercialJarAvailable() ? "commercial" : "open"; + if (isCommercialJarAvailable()) { + return "commercial"; + } else if (isOpenJarAvailable()) { + return "open"; + } else { + return "classpath"; + } } } diff --git a/business-app/src/main/java/com/terrabase/sdk/TerrabaseSDK.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/sdk/TerrabaseSDK.java similarity index 89% rename from business-app/src/main/java/com/terrabase/sdk/TerrabaseSDK.java rename to enterprise-api/src/main/java/com/terrabase/enterprise/api/sdk/TerrabaseSDK.java index 1767965..2ef7552 100644 --- a/business-app/src/main/java/com/terrabase/sdk/TerrabaseSDK.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/sdk/TerrabaseSDK.java @@ -1,10 +1,9 @@ -package com.terrabase.sdk; +package com.terrabase.enterprise.api.sdk; import com.terrabase.enterprise.api.*; import com.terrabase.enterprise.api.CryptoAlgorithm; import com.terrabase.enterprise.api.dto.*; import com.terrabase.enterprise.api.response.ResultVo; -import com.terrabase.sdk.config.TerrabaseSDKConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -84,7 +83,14 @@ public class TerrabaseSDK { */ private TerrabaseSDK() { this.config = TerrabaseSDKConfig.createDefault(); - this.jarLoadUtil = new StandaloneJarLoadUtil(config.getJarPath()); + // 使用智能路径查找,如果配置中没有指定路径 + String jarPath = config.getJarPath(); + if (jarPath == null || jarPath.trim().isEmpty()) { + jarPath = StandaloneJarLoadUtil.findJarPath(); + config.setJarPath(jarPath); + logger.info("使用智能路径查找结果: {}", jarPath); + } + this.jarLoadUtil = new StandaloneJarLoadUtil(jarPath); logger.info("TerrabaseSDK 实例已创建"); } @@ -94,7 +100,14 @@ private TerrabaseSDK() { */ private TerrabaseSDK(TerrabaseSDKConfig config) { this.config = config != null ? config : TerrabaseSDKConfig.createDefault(); - this.jarLoadUtil = new StandaloneJarLoadUtil(this.config.getJarPath()); + // 使用智能路径查找,如果配置中没有指定路径 + String jarPath = this.config.getJarPath(); + if (jarPath == null || jarPath.trim().isEmpty()) { + jarPath = StandaloneJarLoadUtil.findJarPath(); + this.config.setJarPath(jarPath); + logger.info("使用智能路径查找结果: {}", jarPath); + } + this.jarLoadUtil = new StandaloneJarLoadUtil(jarPath); // 如果是商业版且启用了Nacos,则初始化Nacos配置 initializeNacosIfNeeded(); @@ -196,6 +209,15 @@ public MonitoringService monitoring() { return getService("monitoring_service", jarLoadUtil::loadMonitoringService); } + /** + * 获取菜单服务 + * + * @return 菜单服务实例 + */ + public MenuService menu() { + return getService("menu_service", jarLoadUtil::loadMenuService); + } + // ==================== 静态方法(便捷调用) ==================== @@ -244,6 +266,15 @@ public static MonitoringService monitoringService() { return getInstance().monitoring(); } + /** + * 获取菜单服务(静态方法) + * + * @return 菜单服务实例 + */ + public static MenuService menuService() { + return getInstance().menu(); + } + /** * 获取服务信息(静态方法) diff --git a/sdk-config/src/main/java/com/terrabase/sdk/config/TerrabaseSDKConfig.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/sdk/TerrabaseSDKConfig.java similarity index 99% rename from sdk-config/src/main/java/com/terrabase/sdk/config/TerrabaseSDKConfig.java rename to enterprise-api/src/main/java/com/terrabase/enterprise/api/sdk/TerrabaseSDKConfig.java index c47e941..9f16df4 100644 --- a/sdk-config/src/main/java/com/terrabase/sdk/config/TerrabaseSDKConfig.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/sdk/TerrabaseSDKConfig.java @@ -1,4 +1,4 @@ -package com.terrabase.sdk.config; +package com.terrabase.enterprise.api.sdk; import java.io.BufferedReader; import java.io.InputStreamReader; diff --git a/enterprise-impl-commercial/pom.xml b/enterprise-impl-commercial/pom.xml index 236b836..1d24194 100644 --- a/enterprise-impl-commercial/pom.xml +++ b/enterprise-impl-commercial/pom.xml @@ -24,20 +24,6 @@ </properties> <dependencies> - <!-- SDK Config 依赖 --> - <dependency> - <groupId>com.terrabase</groupId> - <artifactId>sdk-config</artifactId> - <version>${project.version}</version> - </dependency> - - <!-- Business App SDK 依赖 --> - <dependency> - <groupId>com.terrabase</groupId> - <artifactId>business-app</artifactId> - <version>${project.version}</version> - </dependency> - <!-- Enterprise API 依赖 --> <dependency> <groupId>com.terrabase</groupId> diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/CommercialNacosConfig.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/CommercialNacosConfig.java index 43fd3c4..7c22573 100644 --- a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/CommercialNacosConfig.java +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/CommercialNacosConfig.java @@ -1,7 +1,7 @@ package com.terrabase.enterprise.impl.commercial.config; import com.alibaba.nacos.common.tls.TlsSystemConfig; -import com.terrabase.sdk.config.TerrabaseSDKConfig; +import com.terrabase.enterprise.api.sdk.TerrabaseSDKConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/pom.xml b/pom.xml index 923d5bf..d77237b 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,6 @@ <description>Terrabase - 企业级数据使能平台</description> <modules> - <module>sdk-config</module> <module>business-app</module> <module>enterprise-api</module> <module>enterprise-impl-commercial</module> From 347b73d9fe15a418d119494692cfb1e17ec723af Mon Sep 17 00:00:00 2001 From: panyehong <2655992392@qq.com> Date: Sat, 25 Oct 2025 18:42:15 +0800 Subject: [PATCH 6/6] =?UTF-8?q?[feat]<terrabase>Terrabase=E7=9A=84SDK?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E3=80=82=20[=E5=85=B7=E4=BD=93=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0]=201.=E4=BF=AE=E5=A4=8Dpom=E6=96=87=E4=BB=B6=202.?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AF=81=E4=B9=A6=E8=B7=AF=E5=BE=84=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=85=8D=E7=BD=AE=E3=80=82=203.=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=9C=BA=E6=9C=BAtoken=E9=87=8D=E8=AF=95=E6=9C=BA=E5=88=B6?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API-INTERFACE-DOCUMENTATION.md | 146 ++++++++++++++++-- business-app/pom.xml | 18 +-- .../enterprise/api/sdk/TerrabaseSDK.java | 64 ++++++++ .../FeignInnerRequestAuthInterceptor.java | 51 +++++- .../config/HttpsFeignClientConfig.java | 40 ++++- .../commercial/config/TokenRetryConfig.java | 91 +++++++++++ .../config/TokenRetryErrorDecoder.java | 93 +++++++++++ .../impl/commercial/config/TokenRetryer.java | 97 ++++++++++++ 8 files changed, 570 insertions(+), 30 deletions(-) create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/TokenRetryConfig.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/TokenRetryErrorDecoder.java create mode 100644 enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/TokenRetryer.java diff --git a/API-INTERFACE-DOCUMENTATION.md b/API-INTERFACE-DOCUMENTATION.md index 420c744..21bb716 100644 --- a/API-INTERFACE-DOCUMENTATION.md +++ b/API-INTERFACE-DOCUMENTATION.md @@ -488,7 +488,18 @@ public class TerrabaseSDKExample { config.setNacosDiscoveryEnabled(false); // 开源版不启用Nacos TerrabaseSDK sdk2 = TerrabaseSDK.init(config); - // 方式3:直接使用静态方法(最简洁) + // 方式3:使用指定证书路径初始化(推荐用于HTTPS环境) + TerrabaseSDK sdkWithCert = TerrabaseSDK.initWithCertPath("/path/to/trust/cert.pem"); + + // 方式4:使用证书路径和Nacos配置初始化(商业版) + TerrabaseSDK commercialSdk = TerrabaseSDK.initWithCertPathAndNacos( + "/path/to/trust/cert.pem", + "https://nacos-server:8848", + "nacos", + "password" + ); + + // 方式5:直接使用静态方法(最简洁) String encrypted = TerrabaseSDK.cryptoService().encrypt("hello", CryptoAlgorithm.AES, "user1"); } catch (Exception e) { @@ -498,7 +509,101 @@ public class TerrabaseSDKExample { } ``` -### 2. 加解密服务使用示例 +### 2. 证书路径配置说明 + +#### 2.1 为什么需要配置证书路径? + +在HTTPS环境中,SDK需要验证服务器证书的有效性。默认情况下,SDK使用系统默认的证书路径,但在某些企业环境中,可能需要使用特定的证书文件来建立信任关系。 + +#### 2.2 证书路径配置方式 + +**方式1:使用便捷方法(推荐)** +```java +// 仅设置证书路径,使用默认配置 +TerrabaseSDK sdk = TerrabaseSDK.initWithCertPath("/path/to/trust/cert.pem"); + +// 设置证书路径和Nacos配置(商业版) +TerrabaseSDK sdk = TerrabaseSDK.initWithCertPathAndNacos( + "/path/to/trust/cert.pem", + "https://nacos-server:8848", + "nacos", + "password" +); +``` + +**方式2:使用配置对象** +```java +// 创建配置对象 +TerrabaseSDKConfig config = new TerrabaseSDKConfig(); +config.setTrustCertPath("/path/to/trust/cert.pem"); +config.setNacosDiscoveryEnabled(false); // 开源版 + +// 使用配置初始化 +TerrabaseSDK sdk = TerrabaseSDK.init(config); +``` + +**方式3:商业版完整配置** +```java +// 创建商业版配置 +TerrabaseSDKConfig commercialConfig = TerrabaseSDKConfig.createCommercial( + "https://nacos-server:8848", + "nacos", + "password" +); +commercialConfig.setTrustCertPath("/path/to/trust/cert.pem"); + +// 使用配置初始化 +TerrabaseSDK sdk = TerrabaseSDK.init(commercialConfig); +``` + +#### 2.3 证书文件格式要求 + +- **支持格式**:PEM格式(.pem, .crt, .cer) +- **文件内容**:包含完整的证书链 +- **文件权限**:确保应用有读取权限 + +#### 2.4 常见证书路径示例 + +```java +// Linux/Unix 环境 +TerrabaseSDK.initWithCertPath("/etc/ssl/certs/ca-certificates.crt"); +TerrabaseSDK.initWithCertPath("/opt/huawei/fce/runtime/security/server_cert/nacos/nacos.crt"); + +// Windows 环境 +TerrabaseSDK.initWithCertPath("C:\\certs\\trust-cert.pem"); +TerrabaseSDK.initWithCertPath("C:\\Program Files\\certificates\\ca-bundle.crt"); + +// 相对路径 +TerrabaseSDK.initWithCertPath("./certs/trust-cert.pem"); +TerrabaseSDK.initWithCertPath("conf/ssl/trust-store.pem"); +``` + +#### 2.5 证书验证失败处理 + +如果证书路径无效或证书验证失败,SDK会记录错误日志并可能影响HTTPS连接: + +```java +try { + TerrabaseSDK sdk = TerrabaseSDK.initWithCertPath("/invalid/path/cert.pem"); + // 如果证书路径无效,后续HTTPS请求可能会失败 +} catch (Exception e) { + System.err.println("证书配置失败: " + e.getMessage()); +} +``` + +#### 2.6 动态证书更新 + +如果需要动态更新证书路径,可以重新初始化SDK: + +```java +// 清理现有实例 +TerrabaseSDK.getInstance().clearCache(); + +// 重新初始化(注意:SDK是单例,需要重启应用才能生效) +TerrabaseSDK sdk = TerrabaseSDK.initWithCertPath("/new/path/cert.pem"); +``` + +### 3. 加解密服务使用示例 ```java // 方式1:使用静态方法(最简洁) @@ -518,7 +623,7 @@ TerrabaseSDK sdk = TerrabaseSDK.getInstance(); String encrypted = sdk.crypto().encrypt(plaintext, CryptoAlgorithm.AES, "admin"); ``` -### 3. 日志服务使用示例 +### 4. 日志服务使用示例 ```java // 使用静态方法调用 @@ -550,7 +655,7 @@ if ("200".equals(result.getCode())) { ResultVo<Integer> result2 = TerrabaseSDK.logService().registerLogs(Arrays.asList(log)); ``` -### 4. 菜单服务使用示例 +### 5. 菜单服务使用示例 ```java // 使用静态方法获取服务 @@ -581,7 +686,7 @@ try { TerrabaseSDK.menuService().registerMenuInfo(menuInfo); ``` -### 5. 证书服务使用示例 +### 6. 证书服务使用示例 ```java // 使用静态方法获取证书服务 @@ -614,7 +719,7 @@ if ("200".equals(licenseResult.getCode())) { ResultVo<List<CertCollectInfo>> certs = TerrabaseSDK.certificateService().listCertificateServiceList(); ``` -### 6. 监控告警服务使用示例 +### 7. 监控告警服务使用示例 ```java // 使用静态方法获取监控服务 @@ -645,7 +750,7 @@ if ("200".equals(alarmResult.getCode()) && alarmResult.getData()) { ResultVo<Boolean> result = TerrabaseSDK.monitoringService().sendEvents(Arrays.asList(event)); ``` -### 7. 用户管理服务使用示例 +### 8. 用户管理服务使用示例 ```java // 使用静态方法获取用户管理服务 @@ -683,7 +788,7 @@ if ("200".equals(userResult.getCode())) { ResultVo<List<LoginUserDto>> users = TerrabaseSDK.userManagementService().getCurrentUserInfo(); ``` -### 8. 完整使用示例 +### 9. 完整使用示例 ```java import com.terrabase.enterprise.api.sdk.TerrabaseSDK; @@ -697,8 +802,8 @@ public class CompleteExample { public static void main(String[] args) { try { - // 初始化 SDK - TerrabaseSDK.init(); + // 初始化 SDK(使用证书路径) + TerrabaseSDK.initWithCertPath("/path/to/trust/cert.pem"); // 1. 加解密操作 String encrypted = TerrabaseSDK.cryptoService().encrypt("Hello World", CryptoAlgorithm.AES, "admin"); @@ -738,6 +843,9 @@ public class CompleteExample { // 5. 用户信息查询 ResultVo<List<LoginUserDto>> users = TerrabaseSDK.userManagementService().getCurrentUserInfo(); + // 6. 证书信息查询 + ResultVo<List<CertCollectInfo>> certs = TerrabaseSDK.certificateService().listCertificateServiceList(); + System.out.println("所有操作执行完成!"); } catch (Exception e) { @@ -754,15 +862,23 @@ public class CompleteExample { 1. **加密算法选择**:建议根据数据敏感程度选择合适的加密算法,AES适用于一般数据加密,RSA适用于密钥交换。 -2. **日志上报**:审计日志应包含完整的操作信息,便于后续审计和追踪。 +2. **证书路径配置**: + - 确保证书文件存在且可读 + - 使用PEM格式的证书文件 + - 证书路径应使用绝对路径,避免相对路径问题 + - 在HTTPS环境中,证书配置错误可能导致连接失败 + +3. **日志上报**:审计日志应包含完整的操作信息,便于后续审计和追踪。 + +4. **菜单注册**:菜单注册时需确保菜单ID唯一,避免冲突。 -3. **菜单注册**:菜单注册时需确保菜单ID唯一,避免冲突。 +5. **告警信息**:告警信息应包含完整的上下文信息,便于问题定位和处理。 -4. **告警信息**:告警信息应包含完整的上下文信息,便于问题定位和处理。 +6. **权限管理**:权限注册时应遵循最小权限原则,避免权限过度授予。 -5. **权限管理**:权限注册时应遵循最小权限原则,避免权限过度授予。 +7. **错误处理**:所有接口调用都应进行适当的错误处理,根据返回的状态码进行相应处理。 -6. **错误处理**:所有接口调用都应进行适当的错误处理,根据返回的状态码进行相应处理。 +8. **SDK初始化**:SDK采用单例模式,初始化后无法更改配置,如需更改配置需要重启应用。 --- diff --git a/business-app/pom.xml b/business-app/pom.xml index b4eb6ed..fbec3de 100644 --- a/business-app/pom.xml +++ b/business-app/pom.xml @@ -140,24 +140,22 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> - <version>3.6.3</version> + <version>3.6.0</version> <executions> <execution> <id>attach-javadocs</id> <goals> <goal>jar</goal> </goals> + <configuration> + <encoding>UTF-8</encoding> + <charset>UTF-8</charset> + <docencoding>UTF-8</docencoding> + <doclint>none</doclint> + <quiet>true</quiet> + </configuration> </execution> </executions> - <configuration> - <source>17</source> - <target>17</target> - <encoding>UTF-8</encoding> - <charset>UTF-8</charset> - <docencoding>UTF-8</docencoding> - <doclint>none</doclint> - <quiet>true</quiet> - </configuration> </plugin> </plugins> </build> diff --git a/enterprise-api/src/main/java/com/terrabase/enterprise/api/sdk/TerrabaseSDK.java b/enterprise-api/src/main/java/com/terrabase/enterprise/api/sdk/TerrabaseSDK.java index 2ef7552..98c9cd1 100644 --- a/enterprise-api/src/main/java/com/terrabase/enterprise/api/sdk/TerrabaseSDK.java +++ b/enterprise-api/src/main/java/com/terrabase/enterprise/api/sdk/TerrabaseSDK.java @@ -30,6 +30,18 @@ * String encrypted = sdk.crypto().encrypt("hello", CryptoAlgorithm.AES, "user1"); * ResultVo&lt;List&lt;LoginUserDto&gt;&gt; users = sdk.userManagement().getCurrentUserInfo(); * + * // 方式4:使用指定证书路径初始化(推荐用于HTTPS环境) + * TerrabaseSDK sdkWithCert = TerrabaseSDK.initWithCertPath("/path/to/trust/cert.pem"); + * String encrypted = sdkWithCert.crypto().encrypt("hello", CryptoAlgorithm.AES, "user1"); + * + * // 方式5:使用证书路径和Nacos配置初始化(商业版) + * TerrabaseSDK commercialSdk = TerrabaseSDK.initWithCertPathAndNacos( + * "/path/to/trust/cert.pem", + * "https://nacos-server:8848", + * "nacos", + * "password" + * ); + * * // 日志服务 * TerrabaseSDK.logService().log("INFO", "用户登录成功", "user1"); * TerrabaseSDK.logService().log("ERROR", "系统异常", "user1"); @@ -55,7 +67,14 @@ * // 使用自定义配置初始化 * TerrabaseSDKConfig config = new TerrabaseSDKConfig(); * config.setJarPath("/path/to/enterprise/jars"); + * config.setTrustCertPath("/path/to/trust/cert.pem"); // 设置证书路径 * TerrabaseSDK.init(config); + * + * // 商业版配置(启用Nacos) + * TerrabaseSDKConfig commercialConfig = TerrabaseSDKConfig.createCommercial( + * "https://nacos-server:8848", "nacos", "password"); + * commercialConfig.setTrustCertPath("/path/to/trust/cert.pem"); + * TerrabaseSDK.init(commercialConfig); * </pre> * * @author Yehong Pan @@ -152,6 +171,51 @@ public static TerrabaseSDK init(TerrabaseSDKConfig config) { return instance; } + /** + * 使用证书路径初始化SDK + * 此方法会检测并加载企业服务实现,并设置指定的证书路径 + * + * @param trustCertPath 信任证书路径 + * @return SDK实例 + */ + public static TerrabaseSDK initWithCertPath(String trustCertPath) { + if (instance == null) { + synchronized (lock) { + if (instance == null) { + TerrabaseSDKConfig config = TerrabaseSDKConfig.createDefault(); + config.setTrustCertPath(trustCertPath); + instance = new TerrabaseSDK(config); + logger.info("TerrabaseSDK 使用证书路径初始化完成: {}", trustCertPath); + } + } + } + return instance; + } + + /** + * 使用证书路径和Nacos配置初始化SDK(商业版) + * 此方法会检测并加载企业服务实现,并设置指定的证书路径和Nacos配置 + * + * @param trustCertPath 信任证书路径 + * @param nacosServerAddr Nacos服务器地址 + * @param nacosUsername Nacos用户名 + * @param nacosPassword Nacos密码 + * @return SDK实例 + */ + public static TerrabaseSDK initWithCertPathAndNacos(String trustCertPath, String nacosServerAddr, String nacosUsername, String nacosPassword) { + if (instance == null) { + synchronized (lock) { + if (instance == null) { + TerrabaseSDKConfig config = TerrabaseSDKConfig.createCommercial(nacosServerAddr, nacosUsername, nacosPassword); + config.setTrustCertPath(trustCertPath); + instance = new TerrabaseSDK(config); + logger.info("TerrabaseSDK 使用证书路径和Nacos配置初始化完成,证书路径: {}, Nacos地址: {}", trustCertPath, nacosServerAddr); + } + } + } + return instance; + } + /** * 获取SDK实例(如果未初始化会自动初始化) * diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/FeignInnerRequestAuthInterceptor.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/FeignInnerRequestAuthInterceptor.java index 3e943f9..6c9a2dd 100644 --- a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/FeignInnerRequestAuthInterceptor.java +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/FeignInnerRequestAuthInterceptor.java @@ -4,23 +4,72 @@ import feign.RequestTemplate; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * FeignClient内部调用前置拦截器 + * 在请求中添加机器令牌,并支持重试机制 */ @Slf4j @Component public class FeignInnerRequestAuthInterceptor implements RequestInterceptor { private static final String X_AUTH_TOKEN_NAME = "X-Auth-Token-Inner"; + + @Autowired + private TokenRetryConfig tokenRetryConfig; @Override public void apply(RequestTemplate requestTemplate) { - String token = MachineTokenConfig.getMachineToken(); + String token = getTokenWithRetry(); if (StringUtils.isBlank(token)) { log.warn("Failed to get machine token, using empty token for inner request"); token = StringUtils.EMPTY; } requestTemplate.header(X_AUTH_TOKEN_NAME, token); + + if (tokenRetryConfig.isVerboseLogging()) { + log.debug("Added token to request: {} -> {}", requestTemplate.url(), + token.length() > 10 ? token.substring(0, 10) + "..." : token); + } + } + + /** + * 获取 token,支持重试机制 + */ + private String getTokenWithRetry() { + int retryCount = 0; + String token = null; + + while (retryCount <= tokenRetryConfig.getMaxRetries()) { + try { + if (retryCount > 0) { + log.info("重试获取 token,第 {} 次尝试", retryCount); + if (tokenRetryConfig.isRefreshTokenBeforeRetry()) { + MachineTokenConfig.refreshMachineToken(); + } + Thread.sleep(tokenRetryConfig.getRetryInterval()); + } + + token = MachineTokenConfig.getMachineToken(); + if (StringUtils.isNotBlank(token)) { + if (retryCount > 0) { + log.info("Token 获取成功,重试 {} 次后成功", retryCount); + } + break; + } + + retryCount++; + } catch (Exception e) { + log.error("获取 token 时发生异常,第 {} 次尝试", retryCount, e); + retryCount++; + } + } + + if (StringUtils.isBlank(token)) { + log.error("经过 {} 次重试后仍无法获取 token", tokenRetryConfig.getMaxRetries()); + } + + return token; } } diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/HttpsFeignClientConfig.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/HttpsFeignClientConfig.java index e934c07..2c1a809 100644 --- a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/HttpsFeignClientConfig.java +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/HttpsFeignClientConfig.java @@ -1,12 +1,16 @@ package com.terrabase.enterprise.impl.commercial.config; import feign.Client; +import feign.codec.ErrorDecoder; +import feign.Retryer; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; @@ -19,18 +23,46 @@ /** * Feign配置 + * 支持 HTTPS、负载均衡和 Token 重试机制 */ @Configuration +@ConditionalOnClass(LoadBalancerClientFactory.class) public class HttpsFeignClientConfig { + + @Autowired(required = false) + private LoadBalancerClient loadBalancerClient; + + @Autowired + private TokenRetryErrorDecoder tokenRetryErrorDecoder; + + @Autowired + private TokenRetryer tokenRetryer; + @Bean - public Client feignClient(LoadBalancerClient loadBalancerClient, - LoadBalancerClientFactory loadBalancerClientFactory) + public Client feignClient(LoadBalancerClientFactory loadBalancerClientFactory) throws NoSuchAlgorithmException, KeyManagementException { SSLContext instance = SSLContext.getInstance("TLSv1.2"); instance.init(null, new TrustManager[]{getX509TrustManager()}, SecureRandom.getInstanceStrong()); Client.Default client = new Client.Default(instance.getSocketFactory(), (s, sslSession) -> true); - return new FeignBlockingLoadBalancerClient(client, loadBalancerClient, loadBalancerClientFactory, - Collections.emptyList()); + + // 如果 LoadBalancerClient 可用,使用负载均衡客户端 + if (loadBalancerClient != null) { + return new FeignBlockingLoadBalancerClient(client, loadBalancerClient, loadBalancerClientFactory, + Collections.emptyList()); + } else { + // 否则返回普通的 HTTPS 客户端 + return client; + } + } + + @Bean + public ErrorDecoder errorDecoder() { + return tokenRetryErrorDecoder; + } + + @Bean + public Retryer retryer() { + return tokenRetryer; } private static X509TrustManager getX509TrustManager() { diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/TokenRetryConfig.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/TokenRetryConfig.java new file mode 100644 index 0000000..9faed10 --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/TokenRetryConfig.java @@ -0,0 +1,91 @@ +package com.terrabase.enterprise.impl.commercial.config; + +import org.springframework.context.annotation.Configuration; + +/** + * Token 重试配置 + * 用于配置 Feign 客户端在遇到 token 失效时的重试策略 + * 配置值直接硬编码在类中,无需外部配置文件 + */ +@Configuration +public class TokenRetryConfig { + + /** + * 是否启用 token 重试机制 + */ + private boolean enabled = true; + + /** + * 最大重试次数 + */ + private int maxRetries = 2; + + /** + * 重试间隔(毫秒) + */ + private long retryInterval = 1000; + + /** + * 是否在重试前刷新 token + */ + private boolean refreshTokenBeforeRetry = true; + + /** + * 无效 token 的错误消息关键词 + */ + private String invalidTokenMessage = "invalid token"; + + /** + * 是否启用详细日志 + */ + private boolean verboseLogging = true; + + // Getters and Setters + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public int getMaxRetries() { + return maxRetries; + } + + public void setMaxRetries(int maxRetries) { + this.maxRetries = maxRetries; + } + + public long getRetryInterval() { + return retryInterval; + } + + public void setRetryInterval(long retryInterval) { + this.retryInterval = retryInterval; + } + + public boolean isRefreshTokenBeforeRetry() { + return refreshTokenBeforeRetry; + } + + public void setRefreshTokenBeforeRetry(boolean refreshTokenBeforeRetry) { + this.refreshTokenBeforeRetry = refreshTokenBeforeRetry; + } + + public String getInvalidTokenMessage() { + return invalidTokenMessage; + } + + public void setInvalidTokenMessage(String invalidTokenMessage) { + this.invalidTokenMessage = invalidTokenMessage; + } + + public boolean isVerboseLogging() { + return verboseLogging; + } + + public void setVerboseLogging(boolean verboseLogging) { + this.verboseLogging = verboseLogging; + } +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/TokenRetryErrorDecoder.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/TokenRetryErrorDecoder.java new file mode 100644 index 0000000..89c674e --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/TokenRetryErrorDecoder.java @@ -0,0 +1,93 @@ +package com.terrabase.enterprise.impl.commercial.config; + +import com.terrabase.enterprise.api.response.ResultVo; +import feign.Response; +import feign.Util; +import feign.codec.ErrorDecoder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +/** + * Token 重试错误解码器 + * 检测 "invalid token" 错误并抛出特殊异常以触发重试机制 + */ +@Slf4j +@Component +public class TokenRetryErrorDecoder implements ErrorDecoder { + + @Autowired + private TokenRetryConfig tokenRetryConfig; + + private final ErrorDecoder defaultErrorDecoder = new Default(); + + @Override + public Exception decode(String methodKey, Response response) { + // 如果重试机制未启用,使用默认错误解码器 + if (!tokenRetryConfig.isEnabled()) { + return defaultErrorDecoder.decode(methodKey, response); + } + + // 检查是否是 token 相关错误 + if (isTokenError(response)) { + log.warn("检测到 token 错误,响应状态: {}, 方法: {}", response.status(), methodKey); + return new TokenRetryException("Token 验证失败,需要重试", response.status()); + } + + // 其他错误使用默认处理 + return defaultErrorDecoder.decode(methodKey, response); + } + + /** + * 检查是否是 token 相关错误 + */ + private boolean isTokenError(Response response) { + try { + // 检查状态码 + if (response.status() == 401 || response.status() == 403) { + return true; + } + + // 检查响应体中的错误消息 + if (response.body() != null) { + String body = Util.toString(response.body().asReader(StandardCharsets.UTF_8)); + if (body != null && body.toLowerCase().contains(tokenRetryConfig.getInvalidTokenMessage().toLowerCase())) { + return true; + } + + // 尝试解析 ResultVo 格式的响应 + try { + // 简单的字符串匹配,避免依赖 Jackson + if (body.contains("\"msg\"") && body.contains(tokenRetryConfig.getInvalidTokenMessage())) { + return true; + } + } catch (Exception e) { + // 忽略解析错误 + } + } + } catch (IOException e) { + log.warn("读取响应体失败", e); + } + + return false; + } + + /** + * Token 重试异常 + */ + public static class TokenRetryException extends RuntimeException { + private final int status; + + public TokenRetryException(String message, int status) { + super(message); + this.status = status; + } + + public int getStatus() { + return status; + } + } +} diff --git a/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/TokenRetryer.java b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/TokenRetryer.java new file mode 100644 index 0000000..b93e47f --- /dev/null +++ b/enterprise-impl-commercial/src/main/java/com/terrabase/enterprise/impl/commercial/config/TokenRetryer.java @@ -0,0 +1,97 @@ +package com.terrabase.enterprise.impl.commercial.config; + +import feign.RetryableException; +import feign.Retryer; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Token 重试器 + * 专门处理 token 相关的重试逻辑 + */ +@Slf4j +@Component +public class TokenRetryer implements Retryer { + + @Autowired + private TokenRetryConfig tokenRetryConfig; + + private int attempt = 1; + private final long period; + private final long maxPeriod; + private final int maxAttempts; + + public TokenRetryer() { + this(1000L, 5000L, 3); + } + + public TokenRetryer(long period, long maxPeriod, int maxAttempts) { + this.period = period; + this.maxPeriod = maxPeriod; + this.maxAttempts = maxAttempts; + } + + @Override + public void continueOrPropagate(RetryableException e) { + // 检查是否是 token 重试异常 + if (e.getCause() instanceof TokenRetryErrorDecoder.TokenRetryException) { + TokenRetryErrorDecoder.TokenRetryException tokenException = + (TokenRetryErrorDecoder.TokenRetryException) e.getCause(); + + if (attempt++ >= maxAttempts) { + log.error("Token 重试次数已达上限 ({}), 放弃重试", maxAttempts); + throw e; + } + + log.warn("Token 验证失败,准备重试 (第 {} 次)", attempt - 1); + + // 刷新 token + if (tokenRetryConfig.isRefreshTokenBeforeRetry()) { + boolean refreshSuccess = MachineTokenConfig.refreshMachineToken(); + if (refreshSuccess) { + log.info("Token 刷新成功,准备重试请求"); + } else { + log.warn("Token 刷新失败,但仍将重试"); + } + } + + // 计算重试间隔 + long sleepTime = period * attempt; + if (sleepTime > maxPeriod) { + sleepTime = maxPeriod; + } + + try { + Thread.sleep(sleepTime); + } catch (InterruptedException interrupted) { + Thread.currentThread().interrupt(); + throw e; + } + + return; + } + + // 其他类型的异常,使用默认重试逻辑 + if (attempt++ >= maxAttempts) { + throw e; + } + + long sleepTime = period * attempt; + if (sleepTime > maxPeriod) { + sleepTime = maxPeriod; + } + + try { + Thread.sleep(sleepTime); + } catch (InterruptedException interrupted) { + Thread.currentThread().interrupt(); + throw e; + } + } + + @Override + public Retryer clone() { + return new TokenRetryer(period, maxPeriod, maxAttempts); + } +}