前端传入Grule,后端保存到 .grl 文件中

前端传入Grule,后端保存到 .grl 文件中

  • 通过简单的输入框,将Grule的部分拆解成 规则名称 规则描述 规则优先级 规则条件 规则逻辑
  • Grule关键字 when Then 模拟了 if 判断的条件和逻辑部分
    • 类似于 shellruby 之类的脚本语言,有 then 关键字
    • when&& 相当于多个条件的 操作
    • Then 之后为脚本逻辑语句, 所以后面要加 ; 分号结束

前端编写

  • 前端模板: templates/grule.tmpl , 可以让用户输入Grule
    • 表单用 POST 往源服务器的 /grule/form/ 发送表单
    • 其中 规则条件规则逻辑 有增加按钮
      • 使用dom树获取点击事件
      • 点击时增加表单输入框
<html>
<p>请编写你的Grule规则</p>
<form name="grule" method="POST" action="/grule/form/">规则名称: <input name="ruleName"></input><br/>规则描述: <input name="ruleDesc"></input><br/>规则优先级: <input name="ruleSalience"></input><br/><div>规则条件: <input name="ruleCondition"></input><button type="button" id="addRuleCondition">增加</button></div><div>规则逻辑: <input name="ruleLogic"></input><button type="button" id="addRuleLogic">增加</button></div><button type="submit">确认</button>
</form>
<script>
// 增加按钮的逻辑
var addRuleConditionButton = document.getElementById('addRuleCondition');
var addRuleLogicButton = document.getElementById('addRuleLogic');
var ruleConditionContainer = addRuleConditionButton.parentNode;
var ruleLogicContainer = addRuleLogicButton.parentNode;addRuleConditionButton.addEventListener('click', function() {var newInput = document.createElement('input');newInput.name = 'ruleCondition';newInput.type = 'text';ruleConditionContainer.insertBefore(newInput, addRuleConditionButton);
});addRuleLogicButton.addEventListener('click', function() {var newInput = document.createElement('input');newInput.name = 'ruleLogic';newInput.type = 'text';ruleLogicContainer.insertBefore(newInput, addRuleLogicButton);
});
</script>
</html>
  • 表单分别将 Grule 拆解成了下面几个输入框
    • 提交表单后 c.Redirect(http.StatusFound, "/grule/form/") 会重定向回该页面
      在这里插入图片描述

后端部分

  • 设置跳转到 grule.tmpl 的接口
r.GET("/index", func(c *gin.Context) {c.HTML(http.StatusOK, "index.tmpl", gin.H{})
})
  • 设置接受Grule表单的接口
    • 使用 c.ShouldBind(&form) 绑定表单到 RuleForm 结构体上
      • 结构体tag form:"ruleName" 对应表单 inputname 属性
      • RuleConditions 切片类型字段, 对应表单都为 ruleCondition 的多个input
    • 接口使用 fmt.Sprintf() 格式化Grule字符串
    • 接口使用文件操作将字符串保存到 grule/规则名.grl
    • 使用 c.Redirect() 重定向会表单页面
// 接收表单的结构体
type RuleForm struct {RuleName       string   `form:"ruleName"`RuleDesc       string   `form:"ruleDesc"`RuleSalience   string   `form:"ruleSalience"`RuleConditions []string `form:"ruleCondition"`RuleLogic      []string `form:"ruleLogic"`
}func main() {r.POST("/grule/form/", func(c *gin.Context) {var form RuleFormc.ShouldBind(&form) // 绑定表单// 格式化字符串grule := fmt.Sprintf(`
rule %s "%s" salience %s {when%sThen%s;
}`, form.RuleName, form.RuleDesc, form.RuleSalience, strings.Join(form.RuleConditions, " && "), strings.Join(form.RuleLogic, ";\n\t\t"))Ω// 将grule字符串写入文件err := ioutil.WriteFile(fmt.Sprintf("grule/%s.grl", form.RuleName), []byte(grule), 0644)if err != nil {log.Println(err)}// 重定向c.Redirect(http.StatusFound, "/grule/form/")})
}

演示

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

公众号看到一个小知识(遥感影像标签的数值问题)

遥感影像标签的数值问题。 拿到手的标签图像&#xff0c;是二分类形式&#xff0c;分为0和1。 这样的形式&#xff0c;不能直接在win10打开。双击图像文件后&#xff0c;如下&#xff1a; 但是可以在QGIS可视化。在QGIS可视化如下&#xff1a; 为什么会这样&#xff1f;大概是因…

【干旱指数】非一致性干旱指数:SnsPI

非一致性干旱指数:SnsPI 非一致性SPI 干旱指数(SnsPI)指数简介MATLAB代码实现Python代码实现参考近年来受气候和人类活动的显著影响,水文序列形成的物理基础条件发生变化,导致水文序列不满足一致性假定即呈非一致性特征。 已有研究主要通过以下两类方法解决非一致性干旱问…

《九重紫》逐集分析鉴赏—序言、概览、框架分析

主标题:《九重紫》一起追剧吧副标题:《九重紫》逐集分析鉴赏—序言、概览、框架分析《永夜星河》后,以为要浅尝剧荒,一部《九重紫》突出重围。看了宣传片感觉不是很差,看了部分剪辑感觉还可以,看了一两集感觉可以追吧,又看了几集——有新欢了,永夜我终于可以放下了,终…

Python Bokeh库:实现实时数据可视化的实战指南

目录一、Bokeh简介二、安装Bokeh三、创建简单的Bokeh图表四、实时更新图表五、集成到Flask应用中六、注意事项七、总结在数据分析和科学计算中,数据可视化是不可或缺的一部分。它能够直观地展示数据,帮助我们快速发现规律和趋势。Bokeh是Python中一个强大的数据可视化库,尤其…

月底课程关闭 | 中国大学MOOC公开课《人工智能与交通大数据实战》首次开课,欢迎选修!...

各位小伙伴们,今年我在中国大学MOOC开设面向全国高校师生的《人工智能与交通大数据实战》课程,编号:0818BJTU217,交通、土木、规划、计算机等领域的本科生和研究生都可以选,欢迎大家选课交流!也欢迎大家推荐给身边的同学和学弟学妹们选课!今年首次开课,课程内容与我在北…

Node.js(v16.13.2版本)安装及环境配置教程

一、进入官网地址下载安装包 https://nodejs.org/zh-cn/download/ 选择对应你系统的Node.js版本&#xff0c;这里我选择的是Windows系统、64位&#xff08;v16.13.2版本&#xff09; 下载后的zip文件 二、解压文件到nodejs&#xff0c;并打开文件夹nodejs&#xff0c;复制解压…

UE5 C++ Subsystem 和 多线程

一.Subsystem先做一个简单的介绍&#xff0c;其实可以去看大钊的文章有一篇专门讲这个的。 GamePlay框架基础上的一个增强功能&#xff0c;属于GamePlay架构的范围。Subsystems是一套可以定义自动实例化和释放的类的框架。这个框架允许你从5类里选择一个来定义子类(只能在C定义…

探究有栈协程的实现以及ucontenxt函数族的使用

协程分类 对称协程与非对称协程 协程按概念分为对称协程、非对称协程&#xff0c;对称协程指的是协程a可任意跳转到协程b/c/d&#xff0c;所有的协程都是相同的&#xff0c;可任意跳转&#xff0c;称为对称协程。 非对称协程则是有类似函数调用栈的概念&#xff0c;如协程a调…

容器化:Containerd组件

一 什么是Containerd? Containerd 最早出现在 Docker Engine 中&#xff0c;后来为了将 Docker Engine 做得更加轻量、快速和健壮&#xff0c;在 2016 年 Docker 将 containerd 从 daemon&#xff08;dockerd&#xff09; 中独立出来&#xff0c;并完成了与 daemon 的集成 独…

VBA API 概述 | 宏编程

注&#xff1a;本文为 “VBA API 概述 | 宏编程 | 执行速度慢” 相关文章合辑。 VBA API 详解 Office 二次开发于 2020-12-17 22:27:10 发布 Office 版本变动 在 Office 2010 之前&#xff0c;微软仅提供 32-bit 版本的 Office。而自 Office 2010 起&#xff0c;出现了 32-b…

LLM - 开源视觉多模态 LLaVA-CoT(o1) 深度推理模型 测试与源码 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/144304351 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 LLaVA-…

设计模式之工厂模式:从汽车工厂到代码工厂

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 工厂模式概述 想象一下你走进一家4S店准备买车。作为顾客&#xff0c;你不需要知道汽车是如何被制造出来的&#xff0c;你只需要告诉销售顾问&a…

Apache APISIX快速入门

本文将介绍Apache APISIX&#xff0c;这是一个开源API网关&#xff0c;可以处理速率限制选项&#xff0c;并且可以轻松地完全控制外部流量对内部后端API服务的访问。我们将看看是什么使它从其他网关服务中脱颖而出。我们还将详细讨论如何开始使用Apache APISIX网关。 在深入讨…

2024年12月11日Github流行趋势

项目名称&#xff1a;maigret 项目维护者&#xff1a;soxoj, kustermariocoding, dependabot, fen0s, cyb3rk0tik项目介绍&#xff1a;通过用户名从数千个站点收集个人档案信息的工具。项目star数&#xff1a;12,055项目fork数&#xff1a;870 项目名称&#xff1a;uv 项目维护…

使用pyinstaller打包pyqt的程序,运行后提示ModuleNotFoundError: No module named ‘Ui_main‘

环境&#xff1a;windowpython3.9pyqt6 使用pyqt UI编辑器生成了main.ui &#xff0c;main.ui编译成了Ui_main.py main.py 使用当前目录下的Ui_main.py。 打包过程没报错&#xff0c;运行报错。 错误如下: 解决方法&#xff1a;pyinstaller -Fw main.py --paths. 使…

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01;本章我们来学习 Linux 下的音频应用编程&#xff0c;音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升&#xff0c;但是笔者仅向大家介绍 Li…

网络应用技术 实验八:防火墙实现访问控制(华为ensp)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验步骤 1、设计全网 IP 地址 2、设计防火墙安全策略 3、在 eNSP 中部署园区网 4、配置用户主机地址 5、配置网络设备 配置交换机SW-1~SW-5 配置路由交换机RS-1~RS-5 配置路由器R-1~R-3 6、配置仿…

低代码云组态支持draw.io导入导出

支持draw.io 官网&#xff1a;draw.io 绘图 进入官网绘制模型&#xff0c;完成后导出 导出 选择“文件“ > “导出“ > “SVG“,完成后即可进行导入 新建 在低代码平台新建一个“网络拓扑”模型&#xff0c;如下图所示&#xff1a; 设计 新建的“网络拓扑”模型进行…

SpringMVC全局异常处理

一、Java中的异常 定义&#xff1a;异常是程序在运行过程中出现的一些错误&#xff0c;使用面向对象思想把这些错误用类来描述&#xff0c;那么一旦产生一个错误&#xff0c;即创建某一个错误的对象&#xff0c;这个对象就是异常对象。 类型&#xff1a; 声明异常&#xff1…

QT自定义控件实践--滑动组件

概述 本篇文章,会逐步带您了解,如何自定义一个QT的滑动组件 操作步骤 选择合适的基类继承: 我们命名这个自定义控件为MySlipButton,继承自QWidget 添加成员变量: 根据滑动组件的特性,添加合适的成员变量,如当前值、最小值、最大值、滑块的位置等。 定义必要的方…