轻量级规则引擎实战:动态业务逻辑配置与Spring Boot集成
最近在技术圈里一个看似“跨界”的话题正在引发讨论如果给开发者一个能够自由编辑故事线的“剧情编辑器”我们能在代码世界里创造出怎样的可能性这不仅仅是游戏或小说中的幻想而是现代软件开发中越来越重要的能力——动态配置、规则引擎和流程编排。传统的软件开发像是按固定剧本演出每个if-else都是预设的剧情分支。但当业务规则频繁变更、用户需求千人千面时硬编码的“剧本”就显得力不从心。这就是为什么我们需要自己的“剧情编辑器”——一个能够实时调整业务逻辑、动态编排流程的技术方案。本文将带你从零构建一个轻量级规则引擎实现真正的“剧情编辑”能力。无论你是想提升系统灵活性还是应对频繁的业务变更这个方案都能让你像编辑文本一样调整核心逻辑。1. 为什么你的项目需要一个“剧情编辑器”在开始技术实现之前我们先明确问题所在。很多开发团队都遇到过这样的困境场景一促销活动频繁变更周一满100减20新用户额外优惠周三增加会员双倍积分排除特定商品周五活动延长规则调整为阶梯优惠如果每次变更都需要修改代码、测试、发布开发团队将陷入无休止的加班循环。场景二多租户差异化需求不同客户对同一功能有细微差别A客户需要审批流程3级B客户需要5级C客户希望邮件通知D客户要求短信提醒。用if-else堆砌的结果就是代码难以维护。场景三快速试错与A/B测试产品经理想要测试不同策略的效果改变推荐算法权重、调整风控规则阈值。如果每次都要发版机会早就错过了。这些问题的本质是业务逻辑硬编码导致的变化成本过高。而“剧情编辑器”的思路就是将可变的部分外部化、配置化让非技术人员也能安全地调整业务规则。2. 规则引擎的核心概念与技术选型2.1 什么是规则引擎规则引擎的核心思想是将业务决策从应用程序代码中分离出来。它包含三个基本要素事实Facts规则处理的数据对象如用户信息、订单数据规则Rules业务逻辑的条件和执行动作通常采用当...则...格式会话Session规则执行的上下文环境2.2 主流方案对比方案类型代表工具适用场景学习成本性能表现重量级规则引擎Drools, JRules金融风控、复杂业务高高轻量级规则引擎Easy Rules, RuleBook中小型项目、配置中心中中自定义DSL自研规则语法特定业务领域高依赖实现配置中心GroovyApollo Groovy脚本需要热更新场景低中对于大多数项目我推荐轻量级规则引擎配置中心的方案平衡了功能与复杂度。3. 环境准备与项目搭建3.1 技术栈选择Spring Boot 2.7基础框架Easy Rules 4.1轻量级规则引擎Apache Groovy 3.0动态脚本支持Redis规则缓存MySQL规则持久化3.2 项目初始化!-- pom.xml 关键依赖 -- dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.jeasy/groupId artifactIdeasy-rules-core/artifactId version4.1.0/version /dependency dependency groupIdorg.codehaus.groovy/groupId artifactIdgroovy/artifactId version3.0.9/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency /dependencies3.3 基础配置类// 文件路径src/main/java/com/example/rules/config/RuleEngineConfig.java Configuration public class RuleEngineConfig { Bean public RulesEngine rulesEngine() { return RulesEngineBuilder.aNewRulesEngine() .withRuleListener(new RuleExecutionListener()) .withSkipOnFirstAppliedRule(true) .build(); } Bean public GroovyShell groovyShell() { return new GroovyShell(); } }4. 核心架构设计实现真正的剧情编辑4.1 规则模型设计规则的核心是条件判断和动作执行我们需要设计一个灵活的模型// 文件路径src/main/java/com/example/rules/model/RuleDefinition.java Data public class RuleDefinition { private String ruleId; private String ruleName; private Integer priority 1; private String conditionExpression; // 条件表达式Groovy脚本 private String actionExpression; // 执行动作Groovy脚本 private Boolean enabled true; private String description; private LocalDateTime updateTime; }4.2 数据库表设计-- 规则定义表 CREATE TABLE rule_definition ( id BIGINT AUTO_INCREMENT PRIMARY KEY, rule_id VARCHAR(64) NOT NULL UNIQUE, rule_name VARCHAR(128) NOT NULL, priority INT DEFAULT 1, condition_expression TEXT NOT NULL, action_expression TEXT NOT NULL, enabled TINYINT DEFAULT 1, description VARCHAR(500), update_time DATETIME DEFAULT CURRENT_TIMESTAMP, KEY idx_enabled_priority (enabled, priority) );4.3 规则加载与缓存机制// 文件路径src/main/java/com/example/rules/service/RuleLoaderService.java Service Slf4j public class RuleLoaderService { Autowired private RuleDefinitionRepository ruleRepository; Autowired private RedisTemplateString, Object redisTemplate; private static final String RULE_CACHE_KEY rules:active; private static final long CACHE_TTL 300; // 5分钟 public ListRuleDefinition loadActiveRules() { // 先查缓存 ListRuleDefinition cachedRules getRulesFromCache(); if (cachedRules ! null) { return cachedRules; } // 缓存未命中从数据库加载 ListRuleDefinition rules ruleRepository.findByEnabledTrueOrderByPriorityDesc(); // 写入缓存 cacheRules(rules); return rules; } private ListRuleDefinition getRulesFromCache() { try { return (ListRuleDefinition) redisTemplate.opsForValue().get(RULE_CACHE_KEY); } catch (Exception e) { log.warn(规则缓存读取失败直接查库, e); return null; } } private void cacheRules(ListRuleDefinition rules) { try { redisTemplate.opsForValue().set(RULE_CACHE_KEY, rules, CACHE_TTL, TimeUnit.SECONDS); } catch (Exception e) { log.warn(规则缓存写入失败, e); } } }5. 规则执行引擎实现5.1 规则适配器将数据库规则转换为Easy Rules格式// 文件路径src/main/java/com/example/rules/engine/RuleAdapter.java Component public class RuleAdapter { Autowired private GroovyShell groovyShell; public org.jeasy.rules.api.Rule adapt(RuleDefinition ruleDef) { return new org.jeasy.rules.api.Rule() { Override public String getName() { return ruleDef.getRuleName(); } Override public String getDescription() { return ruleDef.getDescription(); } Override public int getPriority() { return ruleDef.getPriority(); } Override public boolean evaluate(Facts facts) { try { // 执行Groovy条件表达式 Binding binding new Binding(); binding.setVariable(facts, facts); groovyShell.setProperty(facts, facts); Script conditionScript groovyShell.parse(ruleDef.getConditionExpression()); Object result conditionScript.run(); return Boolean.TRUE.equals(result); } catch (Exception e) { log.error(规则条件执行失败: {}, ruleDef.getRuleId(), e); return false; } } Override public void execute(Facts facts) throws Exception { try { // 执行Groovy动作表达式 Binding binding new Binding(); binding.setVariable(facts, facts); groovyShell.setProperty(facts, facts); Script actionScript groovyShell.parse(ruleDef.getActionExpression()); actionScript.run(); } catch (Exception e) { log.error(规则动作执行失败: {}, ruleDef.getRuleId(), e); throw e; } } }; } }5.2 规则执行服务// 文件路径src/main/java/com/example/rules/service/RuleExecutionService.java Service Slf4j public class RuleExecutionService { Autowired private RulesEngine rulesEngine; Autowired private RuleLoaderService ruleLoaderService; Autowired private RuleAdapter ruleAdapter; public RuleExecutionResult executeRules(MapString, Object context) { Facts facts new Facts(); context.forEach(facts::put); ListRuleDefinition ruleDefinitions ruleLoaderService.loadActiveRules(); Rules rules new Rules(); for (RuleDefinition ruleDef : ruleDefinitions) { rules.register(ruleAdapter.adapt(ruleDef)); } RuleExecutionResult result new RuleExecutionResult(); result.setInputFacts(context); try { rulesEngine.fire(rules, facts); result.setSuccess(true); result.setOutputFacts(facts.asMap()); } catch (Exception e) { result.setSuccess(false); result.setErrorMsg(e.getMessage()); log.error(规则执行异常, e); } return result; } }6. 实战案例电商促销规则系统让我们用一个真实案例演示剧情编辑器的威力。6.1 场景描述某电商平台需要实现灵活的促销规则新用户首单立减10元会员购物满200元打9折黑色星期五全场满100减30特定商品组合购买享优惠6.2 规则配置示例-- 新用户首单优惠规则 INSERT INTO rule_definition (rule_id, rule_name, priority, condition_expression, action_expression, description) VALUES (NEW_USER_DISCOUNT, 新用户首单优惠, 1, return facts.userType NEW facts.firstOrder true, facts.discountAmount 10.0; facts.finalAmount facts.originalAmount - 10.0;, 新用户首单立减10元); -- 会员折扣规则 INSERT INTO rule_definition (rule_id, rule_name, priority, condition_expression, action_expression, description) VALUES (MEMBER_DISCOUNT, 会员折扣, 2, return facts.userType MEMBER facts.originalAmount 200.0, facts.discountRate 0.1; facts.finalAmount facts.originalAmount * 0.9;, 会员满200打9折); -- 黑色星期五活动 INSERT INTO rule_definition (rule_id, rule_name, priority, condition_expression, action_expression, description) VALUES (BLACK_FRIDAY, 黑色星期五, 3, return facts.activityType BLACK_FRIDAY facts.originalAmount 100.0, def discount Math.floor(facts.originalAmount / 100) * 30; facts.discountAmount discount; facts.finalAmount facts.originalAmount - discount;, 黑色星期五每满100减30);6.3 规则执行测试// 文件路径src/test/java/com/example/rules/service/RuleExecutionServiceTest.java SpringBootTest class RuleExecutionServiceTest { Autowired private RuleExecutionService ruleExecutionService; Test void testNewUserDiscount() { MapString, Object context new HashMap(); context.put(userType, NEW); context.put(firstOrder, true); context.put(originalAmount, 150.0); context.put(activityType, NORMAL); RuleExecutionResult result ruleExecutionService.executeRules(context); assertTrue(result.isSuccess()); assertEquals(140.0, result.getOutputFacts().get(finalAmount)); assertEquals(10.0, result.getOutputFacts().get(discountAmount)); } Test void testMemberWithBlackFriday() { MapString, Object context new HashMap(); context.put(userType, MEMBER); context.put(firstOrder, false); context.put(originalAmount, 250.0); context.put(activityType, BLACK_FRIDAY); RuleExecutionResult result ruleExecutionService.executeRules(context); assertTrue(result.isSuccess()); // 会员折扣和黑色星期五优惠的叠加逻辑 System.out.println(最终金额: result.getOutputFacts().get(finalAmount)); } }7. 规则管理界面实现7.1 RESTful API设计// 文件路径src/main/java/com/example/rules/controller/RuleManagerController.java RestController RequestMapping(/api/rules) Validated public class RuleManagerController { Autowired private RuleManagerService ruleManagerService; PostMapping public ResponseEntityRuleDefinition createRule(RequestBody Valid RuleDefinition ruleDef) { RuleDefinition savedRule ruleManagerService.createRule(ruleDef); return ResponseEntity.ok(savedRule); } PutMapping(/{ruleId}) public ResponseEntityRuleDefinition updateRule(PathVariable String ruleId, RequestBody Valid RuleDefinition ruleDef) { RuleDefinition updatedRule ruleManagerService.updateRule(ruleId, ruleDef); return ResponseEntity.ok(updatedRule); } PostMapping(/{ruleId}/enable) public ResponseEntityVoid enableRule(PathVariable String ruleId) { ruleManagerService.enableRule(ruleId); return ResponseEntity.ok().build(); } PostMapping(/{ruleId}/disable) public ResponseEntityVoid disableRule(PathVariable String ruleId) { ruleManagerService.disableRule(ruleId); return ResponseEntity.ok().build(); } PostMapping(/execute) public ResponseEntityRuleExecutionResult executeRules(RequestBody MapString, Object context) { RuleExecutionResult result ruleManagerService.executeRules(context); return ResponseEntity.ok(result); } }7.2 规则验证器// 文件路径src/main/java/com/example/rules/validation/RuleValidator.java Component public class RuleValidator { Autowired private GroovyShell groovyShell; public ValidationResult validateRuleExpression(String conditionExpr, String actionExpr) { ValidationResult result new ValidationResult(); // 验证条件表达式 try { Script conditionScript groovyShell.parse(conditionExpr); // 测试编译 conditionScript.run(); result.setConditionValid(true); } catch (Exception e) { result.setConditionValid(false); result.setConditionError(e.getMessage()); } // 验证动作表达式 try { Script actionScript groovyShell.parse(actionExpr); actionScript.run(); result.setActionValid(true); } catch (Exception e) { result.setActionValid(false); result.setActionError(e.getMessage()); } return result; } }8. 性能优化与生产级实践8.1 规则编译缓存Groovy脚本编译开销较大需要实现编译缓存// 文件路径src/main/java/com/example/rules/engine/ScriptCacheManager.java Component public class ScriptCacheManager { private final MapString, Script scriptCache new ConcurrentHashMap(); public Script getCompiledScript(String expression) { return scriptCache.computeIfAbsent(expression, expr - { try { GroovyShell shell new GroovyShell(); return shell.parse(expr); } catch (Exception e) { throw new RuntimeException(脚本编译失败: expr, e); } }); } public void clearCache() { scriptCache.clear(); } }8.2 规则执行监控// 文件路径src/main/java/com/example/rules/monitor/RuleExecutionMonitor.java Component Slf4j public class RuleExecutionMonitor { private final MeterRegistry meterRegistry; public RuleExecutionMonitor(MeterRegistry meterRegistry) { this.meterRegistry meterRegistry; } public void recordExecution(String ruleId, long duration, boolean success) { // 记录执行时间 Timer.builder(rule.execution.time) .tag(ruleId, ruleId) .tag(success, String.valueOf(success)) .register(meterRegistry) .record(duration, TimeUnit.MILLISECONDS); // 记录执行次数 Counter.builder(rule.execution.count) .tag(ruleId, ruleId) .tag(success, String.valueOf(success)) .register(meterRegistry) .increment(); if (!success) { log.warn(规则执行失败: {}, 耗时: {}ms, ruleId, duration); } } }8.3 安全防护措施规则引擎执行外部脚本存在安全风险必须加强防护// 文件路径src/main/java/com/example/rules/security/ScriptSecurityManager.java Component public class ScriptSecurityManager { private static final SetString DANGEROUS_CLASSES Set.of( java.lang.Runtime, java.lang.ProcessBuilder, java.lang.System, java.io.File, java.net.Socket, java.sql.DriverManager ); private static final SetString DANGEROUS_METHODS Set.of( exec, exit, gc, runFinalization ); public void validateScriptSafety(String script) { // 检查危险类引用 for (String dangerousClass : DANGEROUS_CLASSES) { if (script.contains(dangerousClass)) { throw new SecurityException(脚本包含危险类引用: dangerousClass); } } // 检查危险方法调用 for (String dangerousMethod : DANGEROUS_METHODS) { if (script.contains(dangerousMethod ()) { throw new SecurityException(脚本包含危险方法调用: dangerousMethod); } } // 检查递归调用 if (countOccurrences(script, executeRules) 1) { throw new SecurityException(脚本可能包含递归调用风险); } } private int countOccurrences(String text, String pattern) { return text.split(pattern, -1).length - 1; } }9. 常见问题与解决方案9.1 规则冲突与优先级问题现象多个规则同时满足条件执行结果不符合预期解决方案明确规则优先级设计数字越小优先级越高使用SkipOnFirstAppliedRule策略匹配到第一个规则后停止实现规则互斥检查在规则管理界面提示冲突// 规则冲突检测 public class RuleConflictDetector { public ListRuleConflict detectConflicts(ListRuleDefinition rules) { ListRuleConflict conflicts new ArrayList(); for (int i 0; i rules.size(); i) { for (int j i 1; j rules.size(); j) { if (isConditionOverlap(rules.get(i), rules.get(j))) { conflicts.add(new RuleConflict(rules.get(i), rules.get(j))); } } } return conflicts; } }9.2 规则性能优化问题现象规则数量增多后系统响应变慢优化方案规则条件预编译缓存规则分组执行减少不必要的条件判断基于事实数据的索引优化// 规则分组执行 public class RuleGrouper { public MapString, ListRuleDefinition groupRulesByFactType(ListRuleDefinition rules) { return rules.stream() .collect(Collectors.groupingBy(this::extractFactTypes)); } private String extractFactTypes(RuleDefinition rule) { // 分析条件表达式提取依赖的事实类型 SetString factTypes new HashSet(); // 实现事实类型提取逻辑 return String.join(,, factTypes); } }9.3 规则版本管理与回滚问题场景规则修改后发现问题需要快速回滚解决方案-- 规则版本表 CREATE TABLE rule_version ( id BIGINT AUTO_INCREMENT PRIMARY KEY, rule_id VARCHAR(64) NOT NULL, version INT NOT NULL, rule_content JSON NOT NULL, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, operator VARCHAR(64), KEY idx_rule_version (rule_id, version) );10. 生产环境部署建议10.1 高可用架构规则中心集群化避免单点故障多级缓存策略本地缓存分布式缓存规则预热机制服务启动时加载热点规则限流降级方案防止规则执行雪崩10.2 监控告警规则执行成功率监控规则执行时间百分位统计规则命中率分析异常规则自动禁用10.3 运维管理规则变更审批流程规则测试环境验证规则发布灰度策略规则影响范围分析通过本文的完整实现你已经拥有了一个功能完备的剧情编辑器。这种架构不仅适用于电商促销还可以扩展到风控系统、工单流转、定价策略等任何需要灵活业务规则的场景。关键是要记住技术为业务服务。规则引擎不是越复杂越好而是要找到业务灵活性和系统稳定性的平衡点。建议先从核心场景开始逐步扩展规则能力让剧情编辑真正为业务创造价值。

相关新闻

深入解析MMU:虚拟内存、地址转换与系统稳定的基石

深入解析MMU:虚拟内存、地址转换与系统稳定的基石

1. 项目概述:从“内存打架”到“秩序守护者”刚入行那会儿,调试程序最怕遇到的就是“段错误”或者“非法内存访问”。程序莫名其妙就崩溃了,报错信息指向一个你完全没操作过的地址,那种感觉就像在黑暗的房间里摸黑走路&#xff0c…

2026/8/1 12:12:18 阅读更多 →
资本市场线(CML)解析:从有效前沿到最优资产配置的实战指南

资本市场线(CML)解析:从有效前沿到最优资产配置的实战指南

1. 项目概述:从“有效前沿”到“最优组合”的跨越 在金融投资的世界里,我们常常面临一个核心矛盾:如何在风险和收益之间找到那个“恰到好处”的平衡点?如果你已经接触过现代投资组合理论,大概率听说过“有效前沿”这个…

2026/8/1 12:12:18 阅读更多 →
揭秘!吉林白山与山东悦尚电缆桥架对比,不同预算该选谁?

揭秘!吉林白山与山东悦尚电缆桥架对比,不同预算该选谁?

在电缆桥架领域,不同厂家的产品各有特点。本次测评聚焦吉林白山电缆桥架源头厂家及山东悦尚电气设备有限公司的产品,目的在于为对电缆桥架感兴趣的人群提供客观的产品数据及表现情况,帮助大家进行进一步的比较和选择。以下是参与本次测评的产…

2026/8/1 12:11:18 阅读更多 →

最新新闻

IMX219-77IR相机模组:日夜两用原理、驱动集成与场景应用全解析

IMX219-77IR相机模组:日夜两用原理、驱动集成与场景应用全解析

1. 项目概述:IMX219-77IR相机模组深度解析 如果你正在寻找一款能在各种光线条件下,尤其是低光或完全无光环境下稳定工作的相机方案,那么IMX219-77IR这个型号很可能已经进入了你的视野。这不仅仅是一个普通的摄像头,它是一个集成了…

2026/8/1 12:59:35 阅读更多 →
终极Mac NTFS读写解决方案:免费开源Nigate完整指南

终极Mac NTFS读写解决方案:免费开源Nigate完整指南

终极Mac NTFS读写解决方案:免费开源Nigate完整指南 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and management for N…

2026/8/1 12:59:35 阅读更多 →
如何用GetQzonehistory一键备份QQ空间全部历史说说:让青春记忆永不褪色

如何用GetQzonehistory一键备份QQ空间全部历史说说:让青春记忆永不褪色

如何用GetQzonehistory一键备份QQ空间全部历史说说:让青春记忆永不褪色 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 还记得那些年,在QQ空间写下的第一条说说吗…

2026/8/1 12:59:35 阅读更多 →
HTML到Word文档转换:告别格式混乱,拥抱专业排版

HTML到Word文档转换:告别格式混乱,拥抱专业排版

HTML到Word文档转换:告别格式混乱,拥抱专业排版 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 还在为网页内容无法完美保存为Word文档而头疼吗?html-to-docx让HTM…

2026/8/1 12:59:35 阅读更多 →
FinBERT终极指南:让金融文本情感分析变得简单高效

FinBERT终极指南:让金融文本情感分析变得简单高效

FinBERT终极指南:让金融文本情感分析变得简单高效 【免费下载链接】finBERT Financial Sentiment Analysis with BERT 项目地址: https://gitcode.com/gh_mirrors/fi/finBERT 想象一下,你正在分析一家上市公司的财报,需要快速判断管理…

2026/8/1 12:59:35 阅读更多 →
5个关键理由:为什么nRF Connect桌面版是你Nordic设备开发的最佳选择

5个关键理由:为什么nRF Connect桌面版是你Nordic设备开发的最佳选择

5个关键理由:为什么nRF Connect桌面版是你Nordic设备开发的最佳选择 【免费下载链接】pc-nrfconnect-launcher nRF Connect for Desktop application and framework 项目地址: https://gitcode.com/gh_mirrors/pc/pc-nrfconnect-launcher nRF Connect for De…

2026/8/1 12:58:35 阅读更多 →

日新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/8/1 5:19:34 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/8/1 10:33:33 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →