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)
}
运行结果: 结构体 ExponentData
的 Set
字段被设置为了 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
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");
}
结果能返回 exponent
的 Set
字段值: 12345
完整代码
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 ( )
}