当前位置: 首页 > news >正文

Rule-Engine-Starter V1.0.0

一个轻量级的规则引擎、搜索引擎,让条件匹配简单、优雅。


GIT地址

https://gitcode.cosmoplat.com/15011240224/rule-engine-starter

介绍

Rule-Engine-Starter 是一个轻量级规则引擎,V1.0.0主要解决条件匹配问题。比如飞书文档,每个文档都可以设置访问权限,可以限制哪些人、哪些部门可以访问、是否对互联网用户公开等等,这些条件可以看成每个文档设置的访问规则,一个文档可以设置多个规则。

校验一个用户是否能访问目标文档,只需要校验规则中的条件,可以使用SPEL等表达式来实现;但是如果想获取一个用户有访问权限的所有文档,如果再用SPEL实现岂不是需要遍历所有文档的所有规则,这种方案无疑是低效的。因此自研 Rule-Engine-Starter 解决这个问题,只需要将用户的属性作为条件输入给规则引擎,规则引擎会快速返回所有匹配的规则:

Rule-Engine-Starter 通过拉平条件和MySQL的B+Tree索引实现快速匹配。

Demo

访问地址:https://gitcode.cosmoplat.com/15011240224/rule-engine-demo

修改数据库配置后,可本地执行com.cosmoplat.rule.RuleTest。

使用

  1. MySQL初始化,执行src/main/sql/init.sql

  2. POM引入依赖和卡奥斯仓库

<dependency><groupId>com.cosmoplat.rule</groupId><artifactId>rule-engine-starter</artifactId><version>1.0.0</version>
</dependency><repository><id>maven-public</id><name>maven-public</name><url>http://nexus.cosmoplat.com/repository/maven-public/</url><snapshots><enabled>true</enabled></snapshots>
</repository>
  1. 修改配置文件

    spring:datasource:url: jdbc:mysql://xxx.xxx.xxx.xxx:xxxxx/库名username: 用户名password: 密码driver-class-name: com.mysql.cj.jdbc.Driver# 启用规则引擎      
    rule:engine:enabled: true
    
  2. 创建维度

    Dimension dimension = Dimension.builder().namespaceId(NAMESPACE_ID).code(dimensionEnum.getCode()).description(dimensionEnum.getName()).build();
    ruleEngineService.createDimensions(Collections.singletonList(dimension));
    
  3. 创建分类

    List<String> dimension = Lists.newArrayList(DimensionEnum.WORK_NO.getCode(), DimensionEnum.DEPT_NO.getCode());
    Type ruleType = Type.builder().code(DOC_READ_RULE_TYPE_CODE).description("文档阅读规则").namespaceId(NAMESPACE_ID).dimensionCodes(dimension).build();
    ruleEngineService.createTypes(Lists.newArrayList(ruleType));
    
  4. 添加规则

String docId1= "11111";
String docId2= "22222";
String docId3= "33333";
// 允许体验云和海云智造的员工阅读文档1
createDocReadRule(docId1, Lists.newArrayList(ALL), Lists.newArrayList("tiYanYun", "haiyunzhizao"));
// 只允许工号22038425阅读文档2
createDocReadRule(docId2, Lists.newArrayList("22038425"), Lists.newArrayList(ALL));
// 只允许工号77889998阅读文档3
createDocReadRule(docId3, Lists.newArrayList("77889998"), Lists.newArrayList(ALL));private void createDocReadRule(String docId, List<String> workNos, List<String> deptNos) throws RuleConflictException {Package rule = new Package();rule.setNamespaceId(NAMESPACE_ID);rule.setTypeCode(DOC_READ_RULE_TYPE_CODE);rule.setName("文档阅读规则");rule.setCreateInfo();// 匹配结果rule.setConfigInfo(docId);// 规则条件Map<String, List<String>> searchKeyMap = Maps.newHashMap();searchKeyMap.put(DimensionEnum.WORK_NO.getCode(), workNos);searchKeyMap.put(DimensionEnum.DEPT_NO.getCode(), deptNos);ruleEngineService.createRule(rule, searchKeyMap);
}
  1. 规则匹配

    // 规则匹配,返回体验云员工22038425能访问的文档
    Map<String, List<String>> searchAndSortKeyMap = Maps.newHashMap();
    searchAndSortKeyMap.put(DimensionEnum.WORK_NO.getCode(), Lists.newArrayList( "22038425", ALL));
    searchAndSortKeyMap.put(DimensionEnum.DEPT_NO.getCode(), Lists.newArrayList("tiYanYun", ALL));
    List<MatchRuleResult<String>> ret = ruleEngineService.matchRule(NAMESPACE_ID,DOC_READ_RULE_TYPE_CODE, searchAndSortKeyMap, null);List<String> docIds = ret.stream().map(MatchRuleResult::getResult).collect(toList());
    Assert.isTrue(docIds.contains(docId1), "文档1不能阅读");
    Assert.isTrue(docIds.contains(docId2), "文档2不能阅读");
    Assert.isTrue(!docIds.contains(docId3), "文档3能阅读");
    

支持

如果您觉得有用,麻烦您按照链接支持下:链接

相关文章:

Rule-Engine-Starter V1.0.0

一个轻量级的规则引擎、搜索引擎&#xff0c;让条件匹配简单、优雅。 GIT地址 https://gitcode.cosmoplat.com/15011240224/rule-engine-starter 介绍 Rule-Engine-Starter 是一个轻量级规则引擎&#xff0c;V1.0.0主要解决条件匹配问题。比如飞书文档&#xff0c;每个文档都…...

绘制X-Bar-S和X-Bar-R图,监测过程,计算CPK过程能力指数

X-Bar-S图和X-Bar-R图是统计质量控制中常用的两种控制图&#xff0c;用于监测过程的稳定性和一致性。它们的主要区别在于如何计算和呈现数据的变化以及所关注的问题类型。 X-Bar-S图&#xff08;平均值与标准偏差图&#xff09;&#xff1a; X-Bar代表样本均值&#xff0c;S代表…...

【每日一句】只出现一次的数

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;位运算 其他语言Cpython3 写在最后 Tag 【位运算-异或和】【数组】【2023-10-14】 题目来源 136. 只出现一次的数字 题目解读 给你一个数组&#xff0c;找出数组中只出现一次的元素。题目保证仅有一个元素出现一次&a…...

GDB调试程序常用命令

编译文件 g -g -o test test.cpp(注意&#xff1a;GDB调试的前提是在编译时加上-g参数.) 启动gdb # 方法一 gdb test # 方法二 gdb file test 设置断点 tbreak&#xff1a;设置临时断点&#xff0c;仅在第一次触发后失效。 watch&#xff1a;设置观察点&#xff0c;监控变量的…...

C语言,求两个数的二进制表达中,有多少个位数不同

以前我的博客中写过一篇求二进制的1的个数的博客&#xff0c;里面用按位与1的方式来判断位数是否为一。 如代码所示&#xff1a; #include <stdio.h> int num(int n) {int a 0;int i 0;while (i < 32){a a (n & 1);n n >> 1;i;}return a; } int main…...

解决Win10电脑无线网卡的移动热点无法开启问题

一、目的 利用无线网卡连接网络&#xff0c;然后又用无线网卡通过移动热点分享该网络。 移动热点&#xff0c;简单地说&#xff0c;就是将台式机或笔记本的 Internet 连接转化成 WIFI 信号以供移动设备无线上网的功能&#xff0c;硬件前提是电脑须安装有无线网卡。 二、问题 …...

Spring framework Day10:JSR330注入注解

前言 JSR330是Java社区标准化进程&#xff08;Java Community Process&#xff0c;简称JCP&#xff09;中的一个规范&#xff0c;全名为"Dependency Injection for Java"&#xff0c;即Java的依赖注入规范。它定义了一组注解和相关的规范&#xff0c;用于实现依赖注…...

Java开发中List数据量大,需要分片批次处理

在开发过程中可能会遇到需要处理的List数据量过大&#xff0c;可以选择分批处理的方式对大量数据进行处理。 1、使用 apache 的工具包 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><v…...

Apache Doris 2.0.2 版本正式发布!

峰会官网已上线&#xff0c;最新议程请关注&#xff1a;doris-summit.org.cn 点击报名 亲爱的社区小伙伴们&#xff0c;Apache Doris 2.0.2 版本已于 2023 年 10 月 6 日正式发布&#xff0c;该版本对多个功能进行了更新优化&#xff0c;旨在更好地满足用户的需求。有 92 位贡献…...

transformers架构实现

目录 架构代码如下 模型打印如下 架构代码如下 import numpy as np from torch.autograd import Variable import copy from torch import softmax import math import torch import torch.nn.functional as F import torch.nn as nn # 构建Embedding类来实现文本嵌入层 class…...

C++类型推导

这里对C的类型推导方式进行一次全面的总结。 C中有三种类型推导的方式&#xff0c;分别是模板、auto以及decltype()。以下分别介绍这三种方式的同异。 一 模板 假设有这样的函数模板和这样的调用&#xff1a; template<typename T> void f(ParamType param);f(expr);…...

Open3D(C++) SVD分解求两个点云的变换矩阵

目录 一、算法原理二、代码实现三、结果展示四、相关链接一、算法原理 计算两个点云的质心计算中心化向量计算协方差矩阵奇异值分解,求解旋转矩阵 R R R计算平移向量 t t...

rtmp htttp推流Windows桌面到srs进行播放

推流命令: ffmpeg -f gdigrab -framerate 30 -i desktop -c:v libx264 -preset ultrafast -tune zerolatency -pix_fmt yuv420p -f flv rtmp://xxx.xxx.xxxx.xx/live/livestream 后面是推流地址 推流后的播放地址为: http://xxxxxx:8080/live/livestream.flv 可以写一个…...

NSSCTF做题(9)

[GDOUCTF 2023]<ez_ze> 看见输入框而且有提示说是ssti注入 输入{{7*7}} 试试&#xff0c;发现报错 输入{%%}发现了是jinja2模板 找到关键函数 Python SSTI利用jinja过滤器进行Bypass ph0ebuss Blog 原理见这篇文章&#xff0c;这里直接给出payload {%set ninedict(aaa…...

【09】基础知识:React组件的生命周期

组件从创建到死亡它会经历一些特定的阶段。 React 组件中包含一系列勾子函数&#xff08;生命周期回调函数 <> 生命周期钩子函数 <> 生命周期函数 <> 生命周期钩子&#xff09;&#xff0c;会在特定的时刻调用。 我们在定义组件时&#xff0c;会在特定的生…...

Pytorch之ConvNeXt图像分类

文章目录 前言一、ConvNeXt设计决策1.设计方案2.Training Techniques3.Macro Design&#x1f947;Changing stage compute ratio&#x1f948;Change stem to "Patchify" 4.ResNeXt-ify5. Inverted Bottleneck6.Large Kernel Size7.Micro Design✨Replacing ReLU wit…...

Linux系统编程:makefile以及文件系统编程

增量编译概念 首先回顾一下我们之前写的各种gcc指令用来执行程序&#xff1a; 可以看见非常繁琐&#xff0c;两个文件就要写这么多&#xff0c;那要是成百上千岂不完蛋。 所以为了简化工作量&#xff0c;很自然的想到了将这些命令放在一起使用脚本文件来一键执行&#xff0c…...

《动手学深度学习 Pytorch版》 8.5 循环神经网络的从零开始实现

%matplotlib inline import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35 train_iter, vocab d2l.load_data_time_machine(batch_size, num_steps) # 仍然使用时间机器数据集8.…...

写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换

我们这里是利用按位与来计算的 我们可以想想怎么保留偶数上的位&#xff1f;我们可以利用0x55555555按位与上这个数就保留了偶数 我们知道&#xff0c;16进制0x55555555转换为二进制就是0x01010101010101010101010101010101 我们知道&#xff0c;二进制每一位&#xff0c;如…...

Zabbix监控系统详解2:基于Proxy分布式实现Web应用监控及Zabbix 高可用集群的搭建

文章目录 1. zabbix-proxy的分布式监控的概述1.1 分布式监控的主要作用1.2 监控数据流向1.3 构成组件1.3.1 zabbix-server1.3.2 Database1.3.3 zabbix-proxy1.3.4 zabbix-agent1.3.5 web 界面 2. 部署zabbix代理服务器2.1 前置准备2.2 配置 zabbix 的下载源&#xff0c;安装 za…...

分组网络频率同步互通测试

概述随着3G/4G网络大规模的部署和应用&#xff0c;网络和业务的全IP化发展&#xff0c;分组传送技术将替代SDH/MSTP网络而成为主流的传送承载网络。这时&#xff0c;一方面新的传送网络技术会对网络的同步性能提出相应的要求&#xff0c;另一方面在通信网络由电路交换型向分组交…...

AI五金冲压报价——让精准报价,快人一步。

传统报价熬3天&#xff1f;AI 8分钟给你一份带Excel明细正规PDF的报价单&#xff01;还在用Excel手动算冲压报价&#xff1f;客户催得急&#xff0c;成本核不准&#xff0c;格式不专业丢订单&#xff1f;五金厂的报价痛点&#xff0c;我们懂&#xff01;✅ 工艺PDF/3D图扔进去&…...

Python 如何反向 `enumerate` 遍历枚举

在 Python 中&#xff0c;enumerate() 是一个常用的内置函数&#xff0c;用于在遍历可迭代对象&#xff08;如列表、元组、字符串等&#xff09;时同时获取索引和值。但默认情况下&#xff0c;enumerate() 是从前往后遍历的。那么&#xff0c;**如何反向 enumerate 遍历&#x…...

ESP32组件化开发实战:从零构建高效项目结构

1. 为什么需要组件化开发&#xff1f; 第一次接触ESP32开发时&#xff0c;我习惯把所有代码都塞进main文件夹里。结果项目稍微复杂点就乱成一锅粥&#xff0c;每次修改都要在几十个文件里翻找&#xff0c;不同功能模块互相纠缠&#xff0c;想复用某个传感器驱动都得连带着拷贝…...

热点 | Harness 架构深度解析:AI智能体编排框架的核心原理

热点 | Harness 架构深度解析:AI智能体编排框架的核心原理 声明: 📝 作者:甜城瑞庄的核桃(ZMJ) 原创学习笔记,欢迎分享,但请保留作者信息及原文链接哦~ 本文深度解析 Claude Code 背后的核心架构 Harness,揭示为何"Harness 比模型更重要"成为 2026 年 AI …...

适合自动化测试练习的免费 API 清单

免费接口-聚合网站 https://www.juhe.cn/ 适合自动化测试练习的免费 API 清单,按场景分类,覆盖 REST/GraphQL、状态码验证、自定义 Mock 与真实数据,可直接用于接口测试(含 Python+pytest)练习。 一、核心免费 API 清单(按场景) 表格 名称 类型 核心用途 特点 访问方式…...

Android项目中的Gradle文件详解:从基础配置到高级技巧

Android项目中的Gradle文件详解&#xff1a;从基础配置到高级技巧 在Android开发的世界里&#xff0c;Gradle文件就像是一个项目的"大脑"&#xff0c;它控制着构建过程的方方面面。对于有一定经验的Android开发者来说&#xff0c;深入理解Gradle文件的配置不仅能够提…...

如何通过Nucleus Co-Op实现创新无缝的本地多人游戏体验

如何通过Nucleus Co-Op实现创新无缝的本地多人游戏体验 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 你是否曾经希望在同一台电脑上与朋友共同体…...

Qwen3.5-9B图文对话实战:工业设备铭牌识别+参数查询+维保周期提醒

Qwen3.5-9B图文对话实战&#xff1a;工业设备铭牌识别参数查询维保周期提醒 1. 项目概述 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型&#xff0c;特别适合工业场景下的图文对话应用。这个项目展示了如何利用其多模态能力&#xff0c;实现工业设备铭牌识别、参数查询和维保…...

PyTorch 2.8镜像法律科技:庭审音视频→AI摘要+关键帧提取+证据链可视化

PyTorch 2.8镜像法律科技&#xff1a;庭审音视频→AI摘要关键帧提取证据链可视化 1. 镜像概述与法律科技应用场景 在司法数字化进程中&#xff0c;庭审音视频处理正面临三大挑战&#xff1a;海量数据难以快速消化、关键信息提取效率低下、证据呈现方式单一。PyTorch 2.8深度学…...