Grule前端表单post后端执行grule引擎规则

news2025/1/11 14:58:15

Grule前端表单post后端执行grule引擎规则

  • 编写前端表单和后端接口

编写test.go执行grule引擎规则

  • 示例都是 go test 执行的测试代码,所以将里面的测试代码去除
    • 由于之前 NumberExponentExample_test.go 已经验证可运行, 所以将 err 的异常处理去除
package main

import (
	"log"

	"github.com/hyperjumptech/grule-rule-engine/ast"
	"github.com/hyperjumptech/grule-rule-engine/builder"
	"github.com/hyperjumptech/grule-rule-engine/engine"
	"github.com/hyperjumptech/grule-rule-engine/pkg"
)

type ExponentData struct {
	Check float64
	Set   float64
}

const ExponentRule = `
rule  ExponentCheck  "User Related Rule"  salience 10 {
	when 
		ExponentData.Check == 6.67428e-11
	Then
		ExponentData.Set = .12345E+5;
		Retract("ExponentCheck");
}
`

func main() {
	exponent := &ExponentData{
		Check: 6.67428e-11,
		Set:   0,
	}
	dataContext := ast.NewDataContext()
	dataContext.Add("ExponentData", exponent)
	lib := ast.NewKnowledgeLibrary()
	rb := builder.NewRuleBuilder(lib)
	rb.BuildRuleFromResource("TestExponent", "1.0.0", pkg.NewBytesResource([]byte(ExponentRule)))
	eng1 := &engine.GruleEngine{MaxCycle: 5}
	kb, _ := lib.NewKnowledgeBaseInstance("TestExponent", "1.0.0")
	eng1.Execute(dataContext, kb)
	log.Println(exponent)
}
  • 运行结果: 结构体 ExponentDataSet 字段被设置为了 12345
$ go run test.go 
2024/12/05 01:22:59 &{6.67428e-11 12345}

部署gin和加载模板引擎

  • gin中文文档: https://learnku.com/docs/gin-gonic/1.7
  • 下载 gin 模块
go get -u github.com/gin-gonic/gin
  • 编写 main.go , 并引入 模板引擎
package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
    r.LoadHTMLGlob("templates/*")
	r.GET("/index", func(c *gin.Context) {
        c.HTML(http.StatusOK, "index.tmpl", gin.H{})
    })
	r.Run()
}
  • 创建 templates 目录, 然后添加 index.tmpl 模板
mkdir -p templates && touch templates/index.tmpl

编写前端表单

  • 编写表单, 往后端 /number/ 接口发送 post 请求
<html>
    <form action="/number/" method="POST" >
        <textarea name="textarea"></textarea>
        <input type="submit" value="Submit">
    </form>
</html>
  • 启动项目访问 localhost:8080/index 会看到一个文本框
go run main.go

在这里插入图片描述

编写后端接口

  • 编写 /number/ 的后端接口, 运行Grule规则
import (
    "github.com/hyperjumptech/grule-rule-engine/ast"
	"github.com/hyperjumptech/grule-rule-engine/builder"
	"github.com/hyperjumptech/grule-rule-engine/engine"
	"github.com/hyperjumptech/grule-rule-engine/pkg"
)

type ExponentData struct {
	Check float64
	Set   float64
}

func main() {
    r.POST("/number/", func(c *gin.Context) {
        textareaContent := c.PostForm("textarea")

        exponent := &ExponentData{
            Check: 6.67428e-11,
            Set:   0,
        }
        dataContext := ast.NewDataContext()
        dataContext.Add("ExponentData", exponent)
        lib := ast.NewKnowledgeLibrary()
        rb := builder.NewRuleBuilder(lib)
        rb.BuildRuleFromResource("TestExponent", "1.0.0", pkg.NewBytesResource([]byte(textareaContent)))
        eng1 := &engine.GruleEngine{MaxCycle: 5}
        kb, _ := lib.NewKnowledgeBaseInstance("TestExponent", "1.0.0")
        eng1.Execute(dataContext, kb)
        c.JSON(http.StatusOK, gin.H{
            "textareaContent": exponent.Set,
        })
    })
}

验证表单传入Grule能否执行规则

  • 重启项目, 访问 localhost:8080/index , 将Grule规则放入文本框提交
rule  ExponentCheck  "User Related Rule"  salience 10 {
	when 
		ExponentData.Check == 6.67428e-11
	Then
		ExponentData.Set = .12345E+5;
		Retract("ExponentCheck");
}

在这里插入图片描述

  • 结果能返回 exponentSet 字段值: 12345
    在这里插入图片描述

完整代码

  • main.go
package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
    "github.com/hyperjumptech/grule-rule-engine/ast"
	"github.com/hyperjumptech/grule-rule-engine/builder"
	"github.com/hyperjumptech/grule-rule-engine/engine"
	"github.com/hyperjumptech/grule-rule-engine/pkg"
)

type ExponentData struct {
	Check float64
	Set   float64
}

func main() {
	r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    r.LoadHTMLGlob("templates/*")
	r.GET("/index", func(c *gin.Context) {
        c.HTML(http.StatusOK, "index.tmpl", gin.H{})
    })
    r.POST("/number/", func(c *gin.Context) {
        textareaContent := c.PostForm("textarea")

        exponent := &ExponentData{
            Check: 6.67428e-11,
            Set:   0,
        }
        dataContext := ast.NewDataContext()
        dataContext.Add("ExponentData", exponent)
        lib := ast.NewKnowledgeLibrary()
        rb := builder.NewRuleBuilder(lib)
        rb.BuildRuleFromResource("TestExponent", "1.0.0", pkg.NewBytesResource([]byte(textareaContent)))
        eng1 := &engine.GruleEngine{MaxCycle: 5}
        kb, _ := lib.NewKnowledgeBaseInstance("TestExponent", "1.0.0")
        eng1.Execute(dataContext, kb)
        c.JSON(http.StatusOK, gin.H{
            "textareaContent": exponent.Set,
        })
    })
	r.Run()
}

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

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

相关文章

Android hid 数据传输(device 端 )

最近一直在处理hid 数据需求&#xff0c;简而言之就是两台设备直接可以通过usb 线互相传递数据。 项目架构 为什么Device 端要采用HID&#xff08;人机接口设备&#xff09;的方式发送和接收数据呢&#xff1f; 主要是速度快&#xff0c;举个例子&#xff0c;就是鼠标移动&am…

【Unity基础】Unity中Transform.forward的详解与应用

在Unity中&#xff0c;Transform.forward 是一个常用属性&#xff0c;它表示物体的“前方”方向&#xff0c;即物体本地坐标系中 Z 轴&#xff08;蓝色轴&#xff09;在世界坐标系中的方向。它动态反映物体的旋转情况&#xff0c;非常适合用于移动、检测、方向控制等场景。 什么…

基于 RWKV 的视觉语言模型 VisualRWKV 被 COLING 2025 接收!

基于 RWKV 的视觉语言模型 VisualRWKV 被 COLING 2025 接收&#xff01; COLING&#xff0c;国际计算语言学会议&#xff08;International Conference on Computational Linguistics&#xff09;&#xff0c;是自然语言处理和计算语言学领域的顶级国际会议&#xff08;CCF 推…

如何加强游戏安全,防止定制外挂影响游戏公平性

在现如今的游戏环境中&#xff0c;外挂始终是一个困扰玩家和开发者的问题。尤其是定制挂&#xff08;Customized Cheats&#xff09;&#xff0c;它不仅复杂且隐蔽&#xff0c;更能针对性地绕过传统的反作弊系统&#xff0c;对游戏安全带来极大威胁。定制挂通常是根据玩家的需求…

斯坦福李飞飞《AI Agent:多模态交互前沿调查》论文

多模态AI系统很可能会在我们的日常生活中无处不在。将这些系统具身化为物理和虚拟环境中的代理是一种有前途的方式&#xff0c;以使其更加互动化。目前&#xff0c;这些系统利用现有的基础模型作为构建具身代理的基本构件。将代理嵌入这样的环境中&#xff0c;有助于模型处理和…

Lua面向对象实现

Lua中的面向对象是通过表&#xff08;table&#xff09;来模拟类实现的&#xff0c;通过setmetatable(table,metatable)方法&#xff0c;将一个表设置为当前表的元表&#xff0c;之后在调用当前表没有的方法或者键时&#xff0c;会再查询元表中的方法和键&#xff0c;以此来实现…

flex布局容易忽略的角色作用

目录 清除浮动 作用于行内元素 flex-basis宽度 案例一&#xff1a; 案例二&#xff1a; 案例三&#xff1a; flex-grow设置权重 案例一&#xff1a; 案例二&#xff1a; 简写flex-grow:1 0 auto; flex作为一维布局,行和列的使用&#xff0c;忽略的小角色&#xff0c;大…

Arduino IDE for mac 无法加载界面

打开软件后&#xff0c;无法加载界面的问题 1.手动删除“~/Library/Arduino15”文件夹 2.终端中输入sudo nano /etc/hosts&#xff0c;在里面添加“127.0.0.1 localhost”

【短视频SEO矩阵源码开发技术解析——框架应用分享】

为了部署短视频SEO矩阵系统&#xff0c;需要遵循以下核心步骤&#xff1a;首先&#xff0c;需掌握一系列关键技术和知识&#xff0c;涵盖但不限于相关领域的专业技能。 为了确保短视频SEO矩阵系统源代码能够顺利部署&#xff0c;首先需要构建一个适宜的服务器环境。您可以选择…

探索前端世界的无限可能:玩转Excel文件

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

本地运行打包好的dist

首先输入打包命令 每个人设置不一样 一般人 是npm run build如果不知道可以去package.json里去看。 打包好文件如下 命令行输入 :npm i -g http-server 进入到dist目录下输入 命令cmd 输入 http-server 成功

鸿蒙 DevEco Studio 设置状态栏,调用setWindowSystemBarProperties不生效

参考文章&#xff1a;设置状态栏&#xff0c;调用setWindowSystemBarProperties不生效 我使用 setWindowSystemBarProperties 设置状态栏&#xff0c;不生效。 import window from ohos.window;export default {data: {title: World},setSystemBar() {var windowClass null;…

MacOS安装软件后无法启动报错:“已损坏,无法打开,你应该将它移到废纸篓“

目录 报错截图 解决方法 知识科普 报错截图 解决方法 1. 打开系统设置->安全性与隐私->选择任何来源 2. 如果打开没有看到"任何来源"&#xff0c;如果不开启“任何来源”的选项&#xff0c;会直接影响到无法运行的第三方应用。开启“任何来源”的方法如下&a…

Linux-用户和权限

文章目录 一. 用户1. 用户分类① root用户(超级管理员)② 普通用户Ⅰ. 创建普通用户命令 ③ root用户与普通用户Ⅰ. 权限区别Ⅱ. 切换用户命令Ⅲ. sudo命令Ⅳ. 为普通用户配置sudo认证 2. 用户组① 用户,用户组② 创建用户组命令② 删除用户组命令② 用户管理命令③ getent 二.…

Flutter动画(二)内建隐式动画Widget

动画效果介绍中给出了选择动画的决策树&#xff1a; 使用动画框架不在我们讨论的话题内。flutter支持的动画包括隐式动画和显式动画。 隐式动画和显式动画 隐式动画和显示动画是两种不同的动画实现方式&#xff0c;它们的主要区别在于控制权和动画的重复性。 隐式动画&#…

【笔记2-5】ESP32:freertos消息队列

主要参考b站宸芯IOT老师的视频&#xff0c;记录自己的笔记&#xff0c;老师讲的主要是linux环境&#xff0c;但配置过程实在太多问题&#xff0c;就直接用windows环境了&#xff0c;老师也有讲一些windows的操作&#xff0c;只要代码会写&#xff0c;操作都还好&#xff0c;开发…

211高校的VMware迁移之路:迁至深信服云平台,更高效、更稳定

某211高校为国家 “双一流” 建设高校、省一流大学&#xff0c;在教育领域占据举足轻重的地位。其教学单位构成丰富多元&#xff0c;学科体系广泛而全面。然而&#xff0c;学校面临着VMware虚拟化平台维保到期、服务器老化等严峻挑战&#xff0c;严重干扰了教学、科研及管理工作…

【Matlab】将所有打开的图像批量保存为JPG格式

将Matlab中所有打开的图像批量保存为JPG格式 前言一、实现步骤1. 获取所有打开的图像句柄2. 遍历并保存图像 总结 前言 在使用Matlab进行数据分析或图像处理时&#xff0c;我们经常会生成多个图像以便观察和比较。有时&#xff0c;为了方便分享或存档&#xff0c;我们需要将这…

Linux实现地址转换和抓包

1.Linux实现地址转换 1.1 SNAT和DNAT NAT:地址转换SNAT:源地址转换DNAT:目的地址转换 内网——》外网&#xff1a;内网色的ip不能直接和公网ip通信&#xff0c;必须要把内网的地址转换成和公网ip通信的地址 外网——》内网&#xff1a;外网也不能直接和内网通信&#xff0c…

RocketMQ 过滤消息 基于tag过滤和SQL过滤

RocketMQ 过滤消息分为两种&#xff0c;一种tag过滤&#xff0c;另外一种是复杂的sql过滤。 tag过滤 首先创建producer然后启动&#xff0c;在这里创建了字符串的数组tags。字符串数组里面放置了多个字符串&#xff0c;然后去发送15条消息。 15条消息随着i的增长&#xff0c;…