diff --git a/blade-service/blade-desk/pom.xml b/blade-service/blade-desk/pom.xml index 1c8f7f5d..1c079e18 100644 --- a/blade-service/blade-desk/pom.xml +++ b/blade-service/blade-desk/pom.xml @@ -110,6 +110,14 @@ org.springblade blade-scheduling-api + + + + + com.googlecode.aviator + aviator + 5.4.3 + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/aviator/config/AviatorConfig.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/aviator/config/AviatorConfig.java new file mode 100644 index 00000000..4f1ac762 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/aviator/config/AviatorConfig.java @@ -0,0 +1,29 @@ +package org.springblade.desk.basic.aviator.config; + +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.AviatorEvaluatorInstance; +import com.googlecode.aviator.Options; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class AviatorConfig { + + @Bean + public AviatorEvaluatorInstance aviatorEvaluatorInstance() { + AviatorEvaluatorInstance instance = AviatorEvaluator.newInstance(); + // 核心配置项 + instance.setOption(Options.USE_USER_ENV_AS_TOP_ENV_DIRECTLY, true); // 环境变量透传 + // instance.setOption(Options.MAX_CACHE_SIZE, 2000); // 表达式缓存大小 + instance.setOption(Options.TRACE_EVAL, false); // 生产环境关闭追踪 + + // JDK17+ 优化配置 + instance.setOption(Options.OPTIMIZE_LEVEL, AviatorEvaluator.EVAL); // 优化级别 + // 开启表达式缓存,提升性能 + instance.setCachedExpressionByDefault(true); + // 注册自定义函数(如有) + // instance.addFunction(new YourCustomFunction()); + return instance; + } +} + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/aviator/service/AviatorService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/aviator/service/AviatorService.java new file mode 100644 index 00000000..38a5aef2 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/aviator/service/AviatorService.java @@ -0,0 +1,32 @@ +package org.springblade.desk.basic.aviator.service; + +import com.googlecode.aviator.AviatorEvaluatorInstance; +import jakarta.annotation.Resource; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +@ToString(callSuper = false) +@Slf4j +public class AviatorService { + + @Resource + private AviatorEvaluatorInstance aviatorEvaluator; + + public Object evaluateExpression(String expression, Map variables) { + try { + return aviatorEvaluator.execute(expression, variables); + } catch (Exception e) { + throw new RuntimeException("表达式执行失败: " + e.getMessage(), e); + } + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/AviatorController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/AviatorController.java new file mode 100644 index 00000000..6e17fb91 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/AviatorController.java @@ -0,0 +1,50 @@ +package org.springblade.desk.basic.controller; + +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; +import org.springblade.desk.basic.aviator.service.AviatorService; +import org.springblade.desk.basic.constant.BAModuleConst; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@RestController +@RequestMapping(BAModuleConst.CONTROLLER_PREFIX + "/Aviator") +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +@Slf4j +@Tag(name = "Aviator", description = "Aviator接口") +public class AviatorController { + + @Resource + private AviatorService aviatorService; + + /** + * { + * "expression": "a + b * (c - d)", + * "variables": { + * "a": 5, + * "b": 2, + * "c": 10, + * "d": 3 + * } + * } + * + * @param request + * @return + */ + @PostMapping("/evaluate") + public Object evaluate(@RequestBody Map request) { + String expression = (String) request.get("expression"); + Map variables = (Map) request.get("variables"); + return aviatorService.evaluateExpression(expression, variables); + } +}