单击上面的“ 源代码”,然后选择”
不管她是上一波还是下一波?
暴风雨的海浪是好海浪!
该文章每天在10:33更新,每天都会失去头发...
源代码质量列
不久前,当我进行项目重建时,我遇到了许多地方需要做出很多条件和判断的地方。当然,您可以使用很多IF-ELSE判断来解决它,但是您当时不知道发生了什么,所以您只想播放其他内容。因此,我去研究了规则引擎。
当然,市场上有许多成熟的规则引擎,具有许多功能和良好的性能。但是,我只想玩不同的东西(您不应该选择这样的技术类型,这是负面教科书)。最终的规则引擎吸引了我,主要使用浏览器直接配置它而没有安装过多,并且视觉规则也做得很好。经过一系列研究,然后将其连接到该项目并记录研究结果。
规则引擎实际上是可以嵌入程序中的组件。该计划的复杂判断规则与业务法规分开,因此该计划只需要关心自己的业务,而无需做出复杂的逻辑判断。一个简单的理解是,规则接受一组输入数据,通过预定规则进行配置,然后输出一组结果。
当然,市场上有许多成熟的规则引擎,例如:但是,它可以在UNIX等各种类型的操作系统上运行,并采用仅浏览器编辑模式。它不需要直接在浏览器上的安装工具,编辑规则和测试规则。
当然,此规则引擎在开源版本和Pro版本之间具有差异。至于Pro版本是什么,您可以理解它。在下面放一个表以了解具体差异。
后端管理系统 +基于启动 + plus + vue&支持RBAC动态权限,多租户,数据权限,工作流程,三方登录,付款,SMS,购物中心和其他功能的后端管理系统 +用户
在实际使用中,有四种使用Pro的方法,即嵌入式模式,本地模式,分布式计算模式和独立的服务模式。
但是我们在这里不考虑专业。我们将根据开源版本的集成进行二级开发。搜索它后,实际上将有一个解决方案。一般项目模块如下:
自己创建一个空数据库。只需修改EDAS规则服务中的数据库配置,然后开始服务即可。首次完成启动时,将在数据库中创建一个表。
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/urule-data?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=mysql
如上所述,它通过简单地打开浏览器并输入地址:8090 //来编辑和配置规则。当您看到此界面时,这意味着该创业公司已成功启动。
后端管理系统 +基于 + + + + vue&支持RBAC动态权限,多租户,数据权限,工作流程,三方登录,付款,SMS,购物中心和其他功能的后端管理系统 +用户
让我们首先谈论其组件,主要是两个部分:1。设计师第2部分。规则执行引擎。设计人员部分主要由库文件和规则文件组成。让我们看看下面的整体结构图
如上图所述,有4种类型的库文件,包括变量库,参数库,常数库和操作库。实际上,它类似于Java开发系统中的实体对象,枚举,常数和方法。
如上所述,规则全部都在视觉上配置。在配置规则的过程中,有必要介绍各种定义的库文件,然后结合业务需求以配置满足业务方案的业务规则,因此库文件无处不在。
在业务开发中,我们将创建许多和Java类,例如PO,VO,BO,DTO,POJO等。实际上,主要功能之后这些新对象的主要功能是用于传输数据的数据载体。
在这种情况下,变量库用于映射这些对象,然后可以在规则中使用该对象,以最终完成业务与规则之间的交互。最后一个图像用于创建变量库
顺便说一句,我已经谈到了上面的很多视觉配置,这是我第一次显示配置接口。我很ham愧。
上面的图片很清楚。右键单击“库”菜单下方,然后单击“添加变量库”,最后定义您喜欢的变量库名称。当然,这个名称仅支持中文或英语,而其他字符则不可用。
创建变量库后,您可以编辑变量库,可以将其视为向POJO添加属性。
如果我在曲线中谈论它们,我不仅会理解这些术语。图的左侧是创建类,名称是其别名,配置规则使用它而不是此类。图片的右侧是班级的属性。我在这里写了几篇文章,我想他们在阅读它们后会理解它们。
最后,在业务系统中创建相应的类,并注意完全合格的名称和配置变量库的类Path是一致的。
package com.cicada;
import com.bstek.urule.model.Label;
import lombok.Data;
/**
* @author 芋道源码
* @version 1.0
* @date 2023/3/3 15:38
* @description
*/
@Data
public class Stu {
@Label("姓名")
private String name;
@Label("年龄")
private int age;
@Label("班级")
private String classes;
}
最后,让我们谈谈这个 @注释。这是由其提供的注释,主要描述该字段的属性,这与变量库的标题列是一致的。在官方介绍之后,您可以使用此注释来实现POJO属性和可变库属性的映射。这意味着POJO是编写的,并且与规则相对应的变量库不需要重写,并且可以直接生成。无论如何,此功能可用,因此我将在此处提及。
说到不断的库,这可以被视为我们Java系统中的常数和枚举。例如,性别,您需要定义枚举;例如,对接组织还可以定义枚举。
当然,类似于变量库,常数库也可以在系统中的枚举中映射。这样做的好处可以阻止我们手动进入并防止输入错误。创建常数库也相对简单。右键单击“库”菜单和“添加常数库”。
创建常数库文件后,也将显示以下页面:
参数库是规则中的临时变量,变量的类型和数量未固定。可以认为,与MAP相似,实际上,存储参数库只是一个地图。
对于相同的例程,右键单击“库”菜单和“添加参数库”。
可以看出,参数库在左侧丢失了类别。直接添加参数并选择类型相对简单。我在这里使用英语的“名称”列,这是地图中的键,并且在配置规则时显示“标题”列,该规则在中文中看起来更直观。
当然,也必须注意,定义的名称必须是唯一的,因为地图中的键是唯一的,否则会覆盖。
动作库可以映射其在其中配置的BEAN方法,然后可以在规则中直接调用此批次的方法。要使用愚蠢的例程,请右键单击“库”菜单,然后单击“添加动作库”。
然后,我在系统中添加了一个类,并将类上的 @注释标记为类的Bean容器管理。在此类中添加一些方法,并在该方法上标记 @注释。该注释是定义的,表明将通过动作库读取标记的方法。
package com.bstek.urule.cicada;
import com.bstek.urule.action.ActionId;
import com.bstek.urule.model.ExposeAction;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author 芋道源码
* @version 1.0
* @date 2023/3/10 13:59
* @description
*/
@Component("action")
public class Action {
@ActionId("Hello")
public String hello(){
return "hello";
}
@ExposeAction(value="方法1")
public boolean evalTest(String username){
if(username==null){
return false;
}else if(username.equals("张三")){
return true;
}
return false;
}
@ExposeAction(value="测试Int")
public int testInt(int a,int b){
return a+b;
}
@ExposeAction(value="打印内容")
public void printContent(String username, Date birthday){
SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if(birthday!=null){
System.out.println(username+"今年已经"+sd.format(birthday)+"岁了!");
}else{
System.out.println("Hello "+username+"");
}
}
@ExposeAction(value="打印Stu")
public void printUser(Stu m){
System.out.println("Hello "+m.getName()+", is age:"+m.getAge());
}
}
最后,在“动作库”页面上添加一个bean,在“ bean id”列中输入相应bean的名称,在此处输入。然后单击“动作”列中的“小手”按钮,然后弹出刚刚标记注释的方法。选择一个指定的方法,然后在最后添加。最后,与该方法相对应的参数也将自动加载。
最后,在定义了变量库,参数库,操作库和常数库之类的库文件之后,可以在配置各种规则文件时导入它们。但是,一旦某个规则文件使用这些库文件,请不要随意修改库文件。
顾名思义,说到规则集,它是为了配置规则。上面定义的库文件需要导入到规则集中以进行配置和使用。这是最常用的业务规则实施方法。
规则集是指由三个部分规则组成的一组规则:如果,则否则。
就规则集的定义而言,有两种类型:向导和脚本;
仍然相同,首先创建一个新的。这次,右键单击“决策集”菜单,然后单击“添加向导决策集”以创建规则集。
在配置规则之前,您可以首先导入上面定义的库文件。我在此处导入变量库文件,单击页面上的“变量库”,然后选择指定的变量库文件。如图所示;
最后,您可以快乐地配置规则。巫师风格没有什么可谈论的。它们都是视觉接口,只是点。下面是我配置的简单规则集;
可以看出,它由三个部分组成:如果,则否则;
如果:配置规则条件;
然后:配置满足条件后执行的操作,并且通常配置变量分配是更多
否则:配置不符合条件的动作。
最后,在附加规则后,通过代码执行规则;
package com.cicada;
import cn.hutool.core.bean.BeanUtil;
import com.Result;
import com.bstek.urule.Utils;
import com.bstek.urule.runtime.KnowledgePackage;
import com.bstek.urule.runtime.KnowledgeSession;
import com.bstek.urule.runtime.KnowledgeSessionFactory;
import com.bstek.urule.runtime.service.KnowledgeService;
import com.cicada.req.StuReq;
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.io.IOException;
/**
* @author 芋道源码
* @version 1.0
* @date 2023/3/10 16:47
* @description
*/
@RestController
@RequestMapping("/rule")
public class RuleDataController {
@PostMapping("/stu")
public Result rule(@RequestBody StuReq stuReq) throws IOException {
KnowledgeService knowledgeService = (KnowledgeService) Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID);
KnowledgePackage knowledgePackage = knowledgeService.getKnowledge("xxx/xxx");
KnowledgeSession knowledgeSession = KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);
Stu stu = BeanUtil.copyProperties(stuReq, Stu.class);
knowledgeSession.insert(stu);
knowledgeSession.fireRules();
return Result.success(stu.getTeacher());
}
}
请求接口,最终参数满足配置条件,然后返回以“然后”配置的输出结果。
脚本风格的规则集具有与指南相同的原理,这无非是通过编写脚本提高阈值并实现配置规则。我不会在这里提供太多的介绍。
让我们谈谈决策表。实际上,这是显示规则集的另一种形式。与规则集相比,我更喜欢使用决策表来配置规则,该规则应该更直观,更易于理解。但是本质与规则集没有什么不同。
我不会详细介绍太多的细节,在这里我将放置一个配置的决策表;
当然,还有其他概念和功能,我不会在这里一个一个介绍它们,因为上面提到的已经是最常用的。如果您想知道,您可以自己理解。其他功能包括:交叉决定表,计分卡,复杂的计分卡,决策树和规则流;当然,其中一些是Pro版本的函数。
最近,有必要开发一个大版本的第一阶段,如下所示。参与购买订单的用户将有自己的等级,或者可以说是一个角色。每个用户将有三个职位:普通用户,成员和精英成员。
然后,将在每个月初促进用户一次。普通用户满足要求时将晋升为会员,并且成员在满足要求时将晋升为精英会员。
当然,将有不同的规则供普通用户晋升为成员和成员,以晋升为精英成员。
普通用户 - >成员:在3个月内注册的人数将吸引3人;本身和以下团队的人数将超过10,000;持续的个人命令将超过80%。
成员 - >精英成员:在3个月内注册的人数将达到6;来自自己和以下团队的人的命令金额将超过50,000;继续命令的个人将超过90%。
您不能跨越层次晋升。普通用户最多只能晋升为精英会员。
当然,这只是简化要求的一部分。我进行了一些更改,真正的要求方案并不那么简单。
接下来,我将为规则配置此要求,在这里,我将使用决策表进行配置。在配置规则之前,我将添加一个变量库文件和一个常数库;
最后,添加决策表并执行规则配置;
您可以看到表中有五列,前四列是规则,最后一列是满足规则后的信息输出。这清楚地表明,即使您不是技术人员,您也可以轻松理解规则。
规则引擎可用于我们的系统。它可以增加蛋糕上的糖霜,并帮助我们在业务中剥离很多判断力。但是,这种规则的分离要求我们的开发人员了解需求并根据理解定义抽象概念。对于整个编程来说,这也是必经之路。
欢迎加入我的知识星球,一起讨论架构和交换源代码。要加入,请按以下QR码:
源代码已在知识行星上更新,如下所示:
“ Tao Road 2.x介绍”系列的最新更新已经完成,涵盖了101篇文章,包括ES,图书馆和表格,读写分离,权限,性能测试等。
提供近3W行的代码以及具有超过4W代码的电子商务微服务项目的示例。