nextcode
v2021.8.1
Published
## 设计思路
Downloads
4
Maintainers
Readme
NextCode
设计思路
NextCode 引擎采用 AST 的思路+SOP 的思想+JSON 的结构进行设计
- AST:抽象语法树,编译原理中会对对代码进行词法分析、语法分析,形成抽象语法树,引擎直接进行抽象语法树定义,编写业务逻辑
- SOP:面向服务编程,把所有可执行体:js 函数、http、rpc 包装成一种服务,并且统一为 JSON 入参、出参,这样达到最大程度的数据整合和集成
- POP:面向插件编程,把功能包装成一个个独立的可视化插件,实现可视化的插件编程
- JSON:目前最通用的一种数据结构,数据和流程都使用 JSON 来描述,同时也方便图形化操作节点和属性
支持模型
- 连接模型:使用 next 属性关联,将一系列节点串联起来执行,使用 pipeline 方式执行
- 嵌套模型:嵌套模型支持子流程的执行,类似于编程语言的大括号{},大括号可以嵌套,if、while、for 等都是可以嵌套的
- 引用模型:支持节点引用执行,能够实现循环、递归的逻辑
- 异步模型:执行到一个异步节点时暂停,等待一个事件唤醒再次执行,实现审批流效果
部署说明
使用 webpack 打包,npm publish 发布
使用
node 环境使用
//加载NextCode
var NextCode = require("nextcode/NextCode");
//执行NextCode
var flow = {"package":"nextcode", "plugin":"eval", "service":"add"};
var input = {"x":2,"y":3}
//执行NextCode
var output = new NextCode().execute(flow, input);
//output => {"x":5,"y":2}
chrome 环境使用
<!-- 加载NextCode -->
<script src="https://unpkg.com/nextcode/dist/NextCode.js"></script>
<script>
var flow = {"package":"nextcode", "plugin":"eval", "service":"add"};
var input = {"x":2,"y":3}
//执行NextCode
var output = new NextCode().execute(flow, input);
//output => {"x":5,"y":2}
</scritp>
上下文和插件
插件
由于 node 环境调用 http 的方式和 chrome 环境的方式不一样,所以需要不同环境的插件实现
设置插件实现
//比如注入http的适配器
NextCode.setPluginAdapter({
"implement": {
http: {
httpPost: httpPost,//执行post的函数
httpGet: httpGet,//执行get的函数
}
}
});
这样就可以执行 http.get 和 http.post 节点,同理 node 环境还可以实现 MongoDB 和 MySQL 等数据库插件适配器
节点类型
所有的功能都通过节点来实现,所有的逻辑通过节点与节点之间连线来实现,节点按照从上往下,从左往右的顺序执行。
flow(流程类型)(稳定)
- start(开始) :开始节点,只允许一个开始启动,只有连出边,没有连入边
- stop(结束) :结束节点,只有连入边,没有连出边
- empty(空) :空节点,没有任何逻辑,透传参数
- sequence(顺序) :流程节点数组按照数组顺序执行,具有相同的入参
- pipe(管道) :流程节点数组按照数组顺序执行,上一个节点出参是下一个节点的入参
- switch(分支):根据分支字段,选择节点执行
- foreach(遍历):遍历入参数组,依次处理
- loop(次数循环):循环 N 次执行
- while(条件循环):条件循环
- break(退出):在循环体中退出
eval(运算类型)(暂定)
- init(初始化):计算数据初始化
- assign(赋值运行):变量赋值
- eval(计算):计算表达式
- add(加法):x + y
- sub(减法):x - y
- mul(乘法):x * y
- div(除法):x / y
- mod(取模):x % y
- pow(平方):x ^ 2
engine(引擎类型)(暂定)
- info(信息):引擎内部信息
- mix(混入):混入节点
- return(返回):返回数据,退出整个流程
- cache(缓存):相同入参,从缓存中获取
- delete(删除字段):删除入参中的字段
- log(日志):输出入参和出参,已经内部状态信息
stack(栈)(暂定)
- push(入栈):
- pop(出栈):
- peak(栈顶元素):
- reverse(反转):栈内元素反转
- join(拼接): 数组栈元素拼接在一起
- int2char: 栈内元素转换(待定)
- replace: 栈内元素替换
- mix: 混入
db(数据库)(稳定)
- query: 查询
- insert: 插入
- update: 更新
- delete: 删除
git(稳定)
- read: 更新 git,然后读取文件
- write: 写文件,提交 git
- delete: 删除文件,提交 git
- list: 拉取 git,获取指定目录的内容
http(稳定)
- post: 发出 post 请求
'implement'
- redis: 执行 redis 命令
节点属性
节点属性分公共属性和节点特有属性,公共属性是所有节点都适用的属性
公共属性
- type:节点类型(字符串、必填)
- id:节点 id,引用时使用 id(字符串、必填)
- "service":节点名称,体现节点功能(字符串、必填)
- text:节点文本,在流程图节点中展示(字符串、必填)
- next:下一个执行节点,支持:节点 id、节点、节点数组
特有属性
节点特有的属性,下面依次说明
flow.start(起始节点)
只有一个起始节点
- subflow:子流程,支持:节点 id、节点、节点数组
flow.stop(终止节点)
允许多个终止节点,不能有连出的边
flow.empty(空节点)
- subflow:子流程,支持:节点 id、节点、节点数组
flow.sequence(顺序)
把 subflow 中的子节点按照顺序执行,所有子节点有相同入参
- subflow:子流程,支持:节点 id、节点、节点数组
flow.pipe(管道)
把 subflow 中的子节点按照串行执行,上一个节点的出参是下一个节点的入参
- subflow:子流程,支持:节点 id、节点、节点数组
flow.switch(分支)
- subflow:子流程,支持:节点 id、节点、节点数组
- field:分支的字段,最终会转化为字符串类型值来判断,比如是 boolean 类型,会转化为"true"来判断(支持表达式)(字符串类型,、必填)
- case:分支节点定义,比如:{"pass":0,"back":1,"default":1},值为 pass 执行第 0 个子流程,back 时,执行第 1 个子流程,其他默认情况执行 1 流程(对象类型、必填)
flow.foreach(遍历)
- field:字符串类型,指明要遍历的数组,field 对应入参字段必须是数组
- subflow:子流程,支持:节点 id、节点、节点数组
flow.loop(次数循环)
- times:整数类型(支持表达式),要循环的次数(默认为 1)
- field:结果方法 field 字段中,默认为 array
- subflow:子流程,支持:节点 id、节点、节点数组
flow.while(条件循环)
- field:循环值,相当于 while(input[field]) {do what}
- subflow:子流程,支持:节点 id、节点、节点数组
flow.break(退出)
循环体中【sequence、pipe、foreach、while、loop】退出,比如【step1、step2、break、step3】【stepA、stepB】,step3 不执行,其他都执行
- breakId:跳出到指定的节点
db.query(查询)
查询数据库表数据,入参
- input
- table: 表名
- where: 查询条件
- output
- rows: 数据行
db.insert(插入)
- input
- table: 表名
- data: json 数据
- output
- 结果透传
db.update(更新)
- input
- table: 表名
- data: json 数据
- output
- 结果透传
db.delete(删除)
- input
- table: 表名
- where: json 数据
- output
- 结果透传
git.read(读取)
- input
- path: json 文件路径
- output
- 文件内容
git.write(写入)
- input
- path: json 文件路径
- json: json 数据
- output
- message: 成分与否消息
git.delete(删除)
- input
- path: json 文件路径
- output
- message: 删除结果消息
git.list(列出)
- input
- path: json 文件路径
- output
- name: 当前路径名称
- files: 文件名称字符串数组
- dirs: 目录字符串数组