Flutter规则引擎实战:用evanca/flutter-ai-rules解耦复杂业务逻辑

news2026/5/2 18:50:02
1. 项目概述当Flutter遇见AI规则引擎最近在做一个Flutter项目涉及到复杂的业务逻辑和状态流转比如用户权限判断、表单校验规则链、订单状态机等。传统的if-else嵌套写多了代码不仅臃肿难维护每次业务规则变动都得重新发版测试和产品都叫苦不迭。就在这个当口我发现了evanca/flutter-ai-rules这个项目。光看名字就很有意思“Flutter”和“AI Rules”组合在一起它并不是要做一个AI模型来写代码而是引入了一个在服务端和前端领域非常成熟的概念——规则引擎并赋予了它更智能、更动态的特性。简单来说evanca/flutter-ai-rules是一个为Flutter应用设计的、轻量级且功能强大的规则引擎库。它的核心目标是将业务决策逻辑从应用程序代码中剥离出来实现逻辑与数据的解耦。你可以把它想象成一个在应用内部运行的、可编程的“裁判系统”。你预先定义好一系列规则比如“如果用户是VIP且订单金额大于100则免运费”然后将业务数据用户信息、订单数据交给这个引擎引擎会自动匹配并执行所有符合条件的规则得出最终结论或执行一系列动作。为什么说它“AI”呢这里的“AI”并非指机器学习而是强调其智能性和自适应性。传统的规则引擎是静态配置的而这个库的设计理念更倾向于支持动态规则加载、规则的热更新、以及更灵活的规则组合与推理能力让应用在运行时也能“聪明”地调整其行为逻辑这非常契合现代应用对灵活性和可维护性的高要求。对于需要处理复杂业务流、多条件审批、个性化营销策略、动态配置化功能的Flutter应用开发者来说这个库提供了一个优雅的解决方案。2. 核心架构与设计哲学2.1 规则引擎的基本模型在深入evanca/flutter-ai-rules之前有必要先理解规则引擎的通用模型。一个典型的规则引擎包含几个核心部分规则库存储所有业务规则的地方。每条规则通常包含两部分条件和动作。条件部分是一个逻辑表达式用于判断规则是否适用动作部分定义了当条件满足时需要执行的操作。事实即输入的业务数据对象。引擎会将事实与规则库中的条件进行匹配。推理引擎这是核心大脑负责匹配事实与规则决定哪些规则被激活并以何种顺序执行这些规则的动作。工作内存推理过程中用于存储事实和中间结果的内存区。evanca/flutter-ai-rules借鉴了这个经典模型并针对Flutter和Dart语言的特点进行了现代化改造。它的设计哲学可以概括为三点声明式、可组合、可热更新。声明式你通过Dart代码以近乎自然语言的方式声明规则而不是用命令式的if-else去描述执行流程。这让业务规则的意图更加清晰。可组合简单的规则可以像乐高积木一样组合成复杂的规则集支持与、或、非等逻辑运算以及规则的优先级和依赖关系。可热更新理想情况下规则应该能够在不重启应用的情况下被更新、添加或移除。这是实现动态化业务的关键evanca/flutter-ai-rules在架构上为此留出了接口。2.2 库的核心组件拆解根据其公开的API和设计模式我们可以推断出该库可能包含以下核心组件Rule类规则的基本单元。每个Rule对象应该包含一个唯一的标识符、一个条件评估函数返回bool和一个动作执行函数。// 伪代码示例展示Rule的可能结构 class Rule { final String id; final bool Function(Fact fact) condition; final void Function(Fact fact) action; final int priority; // 优先级 // ... 其他属性如规则描述、所属组等 }RuleEngine类规则引擎的核心控制器。它负责注册规则、接收事实输入、执行推理循环并触发动作。其execute方法可能是最重要的入口。class RuleEngine { void registerRule(Rule rule); FutureExecutionResult execute(Fact fact); // ... 管理规则生命周期的方法 }Fact类封装输入数据的容器。为了通用性它可能是一个MapString, dynamic的包装或者支持通过特定接口访问数据。RuleSet或RuleGroup用于管理一组相关规则的集合。可以对整组规则进行启用、禁用或批量操作。Condition构建器为了更方便地声明复杂条件库可能会提供一套DSL领域特定语言或构建器模式来组合条件例如var condition ConditionBuilder() .property(user.vipLevel).greaterThan(2) .and() .property(order.amount).lessThan(500.0) .build();注意以上是基于常见规则引擎模式的推断具体实现需以evanca/flutter-ai-rules的实际源码为准。但其设计目标一定是让开发者从繁琐的条件判断中解放出来专注于业务规则本身的定义。2.3 与状态管理的结合在Flutter中规则引擎很少孤立存在。它通常与状态管理方案如Provider、Riverpod、Bloc等紧密结合。一个典型的模式是在业务逻辑层或ViewModel/Presenter层将当前的应用状态作为Fact送入规则引擎引擎执行后产生的结果如下一步该跳转到哪个页面、显示何种提示、更新哪些数据再反过来驱动UI状态的改变。例如在Bloc中你可以在mapEventToState方法里调用规则引擎根据事件携带的数据和当前状态决定下一个状态是什么。这样复杂的业务逻辑转移到了规则定义文件中Bloc本身变得非常简洁和清晰。3. 从零开始集成与基础使用假设我们正在开发一个电商应用其中有一个复杂的优惠券计算逻辑。我们将使用evanca/flutter-ai-rules来重构这部分代码。3.1 环境准备与安装首先在pubspec.yaml文件中添加依赖。由于这是一个假设的库我们以常规方式添加dependencies: flutter: sdk: flutter flutter_ai_rules: ^1.0.0 # 请替换为实际版本然后运行flutter pub get来安装包。3.2 定义业务事实Fact是规则引擎处理的数据对象。我们需要创建一个能代表订单和用户信息的Fact类。一种灵活的方式是让Fact持有一个Map或者实现特定的接口。// 定义业务数据模型 class User { final String id; final bool isVip; final int vipLevel; final DateTime joinDate; // ... 其他属性 } class Order { final String id; final double amount; final ListString productCategories; final DateTime createTime; // ... 其他属性 } // 创建Fact类用于向规则引擎传递数据 class CouponFact { final User user; final Order order; final ListCoupon availableCoupons; // 输出结果 Coupon? selectedCoupon; double finalDiscount 0.0; CouponFact({ required this.user, required this.order, required this.availableCoupons, }); // 为了方便规则条件访问可以提供一些快捷方法或转换为Map MapString, dynamic toMap() { return { user: user, order: order, availableCoupons: availableCoupons, selectedCoupon: selectedCoupon, finalDiscount: finalDiscount, }; } }3.3 创建第一条规则现在我们来创建第一条业务规则“如果用户是VIP且订单金额超过100元则自动应用一张‘VIP满减券’”。我们需要先了解flutter_ai_rules定义规则的方式。假设它使用一个Rule类import package:flutter_ai_rules/flutter_ai_rules.dart; Rule createVipDiscountRule() { return Rule( id: rule_vip_discount, name: VIP用户满100减10, priority: 10, // 优先级数值越大越先执行或后执行取决于引擎策略 condition: (Fact fact) { // 需要将通用Fact转换为我们具体的CouponFact // 实际库可能会提供类型安全的方式这里假设通过key获取 var data fact.getCouponFact(couponData); if (data null) return false; return data.user.isVip data.order.amount 100.0; }, action: (Fact fact) { var data fact.getCouponFact(couponData); if (data null) return; // 找到VIP满减券 var vipCoupon data.availableCoupons.firstWhere( (coupon) coupon.code VIP100-10, orElse: () null, ); if (vipCoupon ! null) { data.selectedCoupon vipCoupon; data.finalDiscount 10.0; // 减10元 print(规则[VIP用户满100减10]生效已应用优惠券: ${vipCoupon.code}); } }, ); }实操心得在定义condition和action时要特别注意副作用和执行顺序。condition函数应该是纯函数只读不写确保评估过程没有副作用。而action函数会修改Fact的状态。规则引擎可能支持在action中中断后续规则的执行这取决于引擎的冲突解决策略如优先级、显式中断命令。3.4 初始化规则引擎并执行创建一个规则引擎实例注册我们定义好的规则然后在业务逻辑中调用。class CouponService { final RuleEngine _engine RuleEngine(); CouponService() { _initializeRules(); } void _initializeRules() { _engine.registerRule(createVipDiscountRule()); // 注册其他规则... // _engine.registerRule(createNewUserRule()); // _engine.registerRule(createCategoryDiscountRule()); } FutureCouponFact calculateBestCoupon(User user, Order order, ListCoupon coupons) async { // 1. 准备事实 var fact CouponFact(user: user, order: order, availableCoupons: coupons); var wrapperFact Fact(); wrapperFact.set(couponData, fact); // 2. 执行规则引擎 var result await _engine.execute(wrapperFact); // 3. 处理结果 if (result.status ExecutionStatus.success) { print(规则执行完毕最终折扣: ${fact.finalDiscount} 使用优惠券: ${fact.selectedCoupon?.code}); } else { print(规则执行失败: ${result.error}); } return fact; } }在UI或Bloc中你可以这样使用这个服务// 在Bloc或ViewModel中 void onCalculateCoupon(User user, Order order) async { var coupons await _couponRepo.fetchAvailableCoupons(); var result await _couponService.calculateBestCoupon(user, order, coupons); // 根据result.finalDiscount和result.selectedCoupon更新状态 emit(state.copyWith( discount: result.finalDiscount, appliedCoupon: result.selectedCoupon, )); }4. 高级特性与复杂规则构建基础规则只能解决简单问题。真正的业务场景往往需要处理规则间的复杂关系。evanca/flutter-ai-rules的强大之处在于它对复杂规则场景的支持。4.1 规则组合与逻辑运算符单一条件往往不够。我们需要表达“条件A与条件B同时满足”或者“条件C或条件D任一满足”。高级的规则引擎会提供逻辑组合能力。假设库提供了CompositeRule或通过ConditionBuilder来组合条件// 场景新用户首单或老用户购买特定品类商品可享受包邮 Rule createFreeShippingRule() { var condition ConditionGroup.anyOf([ // 任何一组条件满足即可 ConditionGroup.allOf([ // 新用户首单 Condition((f) f.getUser(user).isNewUser), Condition((f) f.getOrder(order).isFirstOrder), ]), ConditionGroup.allOf([ // 老用户购买电子品类 Condition((f) !f.getUser(user).isNewUser), Condition((f) f.getOrder(order).productCategories.contains(electronics)), Condition((f) f.getOrder(order).amount 50.0), ]), ]); return Rule( id: rule_free_shipping, condition: condition.evaluate, // 组合条件评估函数 action: (fact) { fact.set(freeShipping, true); fact.set(shippingCost, 0.0); }, ); }4.2 规则优先级与执行控制当多条规则的条件同时被满足时谁先执行这就涉及到优先级和冲突解决策略。常见的策略有优先级每条规则有一个优先级数值。引擎可能按优先级从高到低或从低到高执行。显式中断在某条规则的action中可以明确指示引擎停止执行后续规则。唾液原则后执行的规则可以覆盖先执行规则的结果。在flutter_ai_rules中我们可以在定义规则时指定priority。对于优惠券场景通常的优先级逻辑是门槛高、优惠力度大的规则先执行或者特定类型的优惠券如仅限使用的具有最高优先级。Rule createExclusiveCouponRule() { return Rule( id: rule_exclusive_coupon, name: 独家渠道专属券, priority: 100, // 最高优先级 condition: (fact) { var order fact.getOrder(order); return order.channel exclusive_app; }, action: (fact) { // 应用独家优惠并可能设置标志阻止其他优惠券规则 fact.set(exclusiveApplied, true); // 某些引擎支持 fact.halt() 来中断 }, ); }4.3 动态规则加载与热更新这是体现“AI”或“智能”特性的关键。我们不想每次修改优惠策略都发布一个新版本的应用。理想的方式是从服务器动态加载规则配置。假设规则可以用JSON或YAML来描述// rule_config.json { rules: [ { id: dynamic_rule_1, name: 夏季促销, enabled: true, priority: 50, condition: { operator: AND, conditions: [ {path: order.createTime, operator: AFTER, value: 2024-06-01}, {path: order.createTime, operator: BEFORE, value: 2024-08-31}, {path: order.amount, operator: GREATER_THAN_OR_EQUAL, value: 200} ] }, action: { type: apply_discount, value: 20, unit: percent } } ] }我们需要一个RuleLoader来解析这个JSON并将其转换为引擎内部的Rule对象。然后在应用启动时或定时从服务器拉取最新的规则配置调用engine.clearRules()和engine.registerAll(newRules)来更新规则库。class RemoteRuleLoader { final String configUrl; FutureListRule loadRules() async { final response await http.get(Uri.parse(configUrl)); if (response.statusCode 200) { final config jsonDecode(response.body); return _parseRulesFromJson(config); } return []; } ListRule _parseRulesFromJson(MapString, dynamic json) { // 实现JSON到Rule对象的解析逻辑 // 这是一个复杂但核心的部分需要将操作符如GREATER_THAN映射到具体的Dart函数 ListRule rules []; for (var ruleJson in json[rules]) { var condition _parseCondition(ruleJson[condition]); var action _parseAction(ruleJson[action]); rules.add(Rule( id: ruleJson[id], name: ruleJson[name], priority: ruleJson[priority], condition: condition, action: action, )); } return rules; } }踩坑提醒动态加载规则带来了巨大的灵活性但也引入了安全风险。务必确保规则配置来源可信使用HTTPS进行签名验证。同时复杂的条件解析器可能成为性能瓶颈需要谨慎设计。对于移动端建议对规则配置进行版本管理和差分更新以减少网络流量。5. 性能优化与最佳实践在移动设备上运行规则引擎性能是需要重点考虑的问题。一个设计不良的规则集可能导致界面卡顿。5.1 规则优化策略条件短路评估确保你的规则引擎支持条件的短路评估如、||。在组合条件时将最可能失败或计算成本最低的条件放在前面。避免在Condition中进行耗时操作condition函数应快速返回。不要在里面进行网络请求、复杂的数据库查询或大量计算。如果需要这些数据应提前加载到Fact中。索引与Rete算法高级规则引擎会使用Rete等算法来优化规则匹配效率。它通过构建网络来共享不同规则间的相同条件避免重复计算。如果flutter_ai-rules实现了此类算法那将是一大优势。如果没有对于规则数量较少100条的场景线性匹配通常也足够快。规则分组与选择性激活并非所有规则都需要在每次执行时被评估。可以根据业务场景将规则分组只激活相关的规则组。例如“购物车规则组”、“结算页规则组”、“个人中心规则组”。5.2 内存与状态管理Fact对象设计尽量让Fact对象轻量。只传递当前决策所需的最小数据集。对于大型对象如用户完整的订单历史传递其引用或ID而非整个对象。引擎实例生命周期对于全局性的规则如优惠计算可以创建一个单例的RuleEngine。对于页面级或组件级特定的规则可以考虑创建短生命周期的引擎实例用后即焚避免内存泄漏。清理中间状态每次执行engine.execute()后如果引擎内部保留了中间状态记得在下次执行前重置或创建新的Fact防止旧数据污染新的决策。5.3 测试策略规则引擎将逻辑外置这使得单元测试变得非常清晰。规则单元测试为每一条重要的规则单独编写测试验证其条件判断和动作执行是否正确。test(VIP折扣规则应在VIP用户且金额满100时触发, () { var rule createVipDiscountRule(); var vipUser User(isVip: true); var largeOrder Order(amount: 150.0); var fact CouponFact(user: vipUser, order: largeOrder, availableCoupons: [vipCoupon]); var wrapperFact Fact()..set(couponData, fact); expect(rule.condition(wrapperFact), isTrue); rule.action(wrapperFact); expect(fact.selectedCoupon?.code, VIP100-10); expect(fact.finalDiscount, 10.0); });集成测试测试整个规则集在特定业务场景下的综合输出。可以构造复杂的Fact执行引擎并断言最终的所有输出状态。动态规则测试如果支持动态加载还需要测试规则配置文件的解析器确保JSON到Rule的转换准确无误。6. 实战构建一个完整的动态营销系统让我们构想一个更复杂的实战场景为一个内容订阅应用设计一个动态营销规则系统用于决定向用户展示何种促销弹窗、定价方案或升级路径。业务目标根据用户行为阅读文章数、使用时长、设备类型、用户属性注册时长、订阅状态、以及全局运营策略节假日活动、冲KPI动态决定在用户打开App时是否展示、以及展示什么样的促销信息。6.1 系统设计我们将规则分为几个层次准入规则决定用户是否有资格看到任何促销例如已订阅高级版的用户不看任何促销。优先级规则在多个符合条件的促销中决定展示哪一个例如周年庆活动的优先级高于常规折扣。展示规则决定促销的具体展示形式、文案、图片A/B测试。我们为这个系统设计三个Fact类UserFact: 用户静态属性。BehaviorFact: 用户近期动态行为由客户端SDK收集。ContextFact: 当前上下文网络状态、时间、App版本等。6.2 规则定义示例// 规则1准入规则 - 仅向非高级订阅用户展示 Rule createEligibilityRule() { return Rule( id: filter_premium_user, condition: (fact) !fact.getUserFact(user).isPremiumSubscriber, action: (fact) fact.set(isEligible, true), ); } // 规则2行为触发规则 - 深度阅读用户推荐年度套餐 Rule createDeepReaderRule() { return Rule( id: target_deep_reader, priority: 20, condition: (fact) { var behavior fact.getBehaviorFact(behavior); return behavior.articlesReadLastWeek 20 behavior.avgReadingTimeMinutes 5; }, action: (fact) { fact.set(recommendedPlan, annual); fact.set(promotionMessage, 感谢您的深度阅读年度套餐为您节省40%); fact.set(campaignId, deep_reader_2024); }, ); } // 规则3上下文规则 - 在节假日展示限时活动 Rule createHolidayRule() { return Rule( id: holiday_special, priority: 50, // 节假日活动优先级更高 condition: (fact) { var context fact.getContextFact(context); var now context.currentTime; // 判断是否为节假日期间逻辑需具体实现 return _isHolidaySeason(now); }, action: (fact) { fact.set(recommendedPlan, quarterly); fact.set(promotionMessage, 节日特惠季付套餐立减30元); fact.set(campaignId, holiday_2024); fact.set(overrideLowerPriority, true); // 设置标志可能用于冲突解决 }, ); }6.3 冲突解决与结果聚合执行完所有规则后Fact中可能被多个规则设置了相同的属性如recommendedPlan。我们需要一个“聚合器”来最终决策。可以在所有规则执行完毕后添加一个特殊的“聚合规则”或是在引擎外处理Rule createAggregationRule() { return Rule( id: aggregate_results, priority: -100, // 最后执行 condition: (fact) true, // 总是执行 action: (fact) { // 检查是否有高优先级覆盖标志 if (fact.getbool(overrideLowerPriority) true) { // 保留当前由高优先级规则设置的值 return; } // 否则可以采用“首次设置”、“最后一次设置”或“投票”等策略 // 例如选择优先级最高的规则结果 // 这部分逻辑需要根据业务需求定制 }, ); }6.4 效果评估与迭代系统上线后关键在于数据反馈。我们需要记录规则触发日志哪个用户在什么时间触发了哪条规则。用户行为日志用户看到促销后的行为关闭、点击、转化。A/B测试分组如果展示规则包含A/B测试需要记录用户所属的分组。通过这些数据我们可以分析每条规则的触发率、转化率和总体收益从而反向优化规则库下架无效规则调整成功规则的条件如降低门槛以扩大受众或复制成功规则的模式。7. 常见问题与排查技巧在实际集成和使用evanca/flutter-ai-rules或类似库的过程中你可能会遇到以下问题。7.1 规则不执行或执行结果不符合预期这是最常见的问题。可以按照以下清单排查问题现象可能原因排查步骤规则完全没执行1. 规则未正确注册到引擎。2.Fact对象中的数据路径与规则中访问的路径不一致。3. 规则被禁用或所属规则组未激活。1. 检查registerRule是否被调用打印引擎内规则数量。2. 在condition函数开头打印fact的内容确认数据结构。3. 检查规则的enabled属性和规则组的激活状态。部分规则未执行1. 规则条件评估为false。2. 规则优先级设置导致被跳过。3. 前面规则的action中调用了中断执行的方法。1. 在condition函数内添加详细日志输出中间判断结果。2. 检查所有规则的priority值理解引擎的执行顺序升序/降序。3. 检查高优先级规则的action中是否有halt()或类似调用。执行结果被覆盖多条规则修改了Fact中的同一个属性且没有明确的冲突解决策略。1. 审查所有会修改目标属性的规则。2. 引入更精细的优先级或使用不同的属性名来存储中间结果。3. 添加一个专门的“聚合规则”在最后统一处理冲突。7.2 性能问题如果发现使用规则引擎后界面响应变慢性能分析使用Dart DevTools的CPU Profiler定位是condition评估耗时还是action执行耗时。优化Condition缓存计算结果如果某个条件需要复杂计算如判断用户等级且在同一批规则中多次使用可以先将结果计算好存入Fact。简化逻辑避免在condition中进行循环遍历大型集合或复杂字符串操作。短路评估确保你的条件表达式利用了和||的短路特性。减少规则数量评估是否所有规则都需要在每次请求时检查能否根据场景分组加载检查动态加载如果规则是从网络加载的检查JSON解析是否成为瓶颈。考虑在后台线程解析或使用更高效的序列化格式如Protocol Buffers。7.3 动态规则更新失败网络问题确保设备网络通畅规则配置的URL可访问。解析错误动态规则的JSON/YAML格式必须严格符合预期。在解析逻辑中加入健壮的异常处理并记录格式错误的具体信息。可以先用一个简单的“测试规则”配置文件验证解析流程。版本兼容性确保服务器下发的规则语法版本与客户端集成的规则引擎版本兼容。可以在配置中加入version字段进行校验。更新策略采用“双缓冲”或“原子交换”策略更新规则。即先在一个新的引擎实例中加载和验证新规则验证通过后再原子性地替换当前正在使用的引擎实例避免出现规则部分更新的不一致状态。7.4 调试技巧启用详细日志在初始化引擎时设置调试模式让其打印出规则匹配、执行顺序、结果修改等详细信息。可视化规则流对于极其复杂的规则集可以考虑开发一个简单的调试工具以流程图或树状图的形式展示规则的依赖关系和执行路径。单元测试覆盖这是最有效的保障。为每一条核心业务规则编写单元测试并在每次动态更新规则后跑一遍核心测试用例确保基本功能不受影响。将业务逻辑从代码中剥离用声明式的规则来描述这不仅仅是代码组织方式的改变更是一种思维模式的转变。它迫使你将模糊的业务需求转化为清晰、可测试的逻辑断言。evanca/flutter-ai-rules这类库的价值在于为Flutter开发者提供了实践这种思维的强大工具。从简单的优惠计算到复杂的动态运营系统合理运用规则引擎能显著提升代码的可维护性、业务的可配置性和系统的智能水平。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2575822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…