逻辑编排
使用数据流 Flow 或 Script 编排处理器调用逻辑,实现复杂数据查询、处理。
约定
- 示例中约定应用根目录为
/data/app
, 实际编写时需替换为应用根目录。 - 使用
<>
标识自行替换的内容。 例如:icon-<图标名称>
, 实际编写时应替换为:icon-foo
,icon-bar
...
使用 Flow
使用 Flow DSL 编写处理器,编排数据查询逻辑。
新建 Flow DSL 文件
在 flows
目录下, 创建一个 Flow DSL 文件,编排数据查询逻辑。
/data/app/flows/product.flow.json
json
{
"label": "演示",
"version": "1.0.0",
"description": "数据查询",
"nodes": [
{
"name": "添加数据",
"process": "models.product.Insert",
"args": [
["name", "remark", "user_id"],
[
["遗落的南境三部曲一", "(美) 杰夫·范德米尔", 1],
["遗落的南境三部曲二", "(美) 杰夫·范德米尔", 1],
["遗落的南境三部曲三", "(美) 杰夫·范德米尔", 1],
["没药花园案件:罪恶", "没药花园 著,博集天", 1],
["那不勒斯四部曲", "【意】埃莱娜·费兰特", 1]
]
]
},
{
"name": "分页查询",
"process": "models.product.Paginate",
"args": [
{
"select": ["id", "name", "remark", "user_id"],
"wheres": [{ "column": "name", "op": "match", "value": "三部曲" }]
},
1,
2
]
}
],
"output": "{{$res}}"
}
运行调试
bash
yao run flows.product
上下文数据引用
使用 {{$res.<节点名称>}}
变量访问数据流节点的查询结果。
在 flows/query
目录下, 新建一个 Flow DSL 文件。
/data/app/flows/query/search.flow.json
json
{
"label": "演示",
"version": "1.0.0",
"description": "数据查询",
"nodes": [
{
"name": "产品",
"process": "models.product.Paginate",
"args": [
{
"select": ["id", "name", "remark", "user_id"],
"wheres": [{ "column": "name", "op": "match", "value": "三部曲" }]
},
1,
2
]
},
{
"name": "打印",
"process": "utils.fmt.Print",
"args": ["{{$res.产品.data[0]}}"]
},
{
"name": "用户",
"process": "models.xiang.user.Find",
"args": ["{{$res.产品.data[0].user_id}}", { "select": ["id", "name"] }]
}
],
"output": {
"产品": "{{$res.产品}}",
"用户": "{{$res.用户}}"
}
}
运行调试
bash
yao run flows.query.search
Flow 处理器传参
使用参数表
使用 {{$in[<参数表下标>]}}
变量访问传入参数
在 flows/query
目录下, 新建一个 Flow DSL 文件。
/data/app/flows/query/args.flow.json
json
{
"label": "演示",
"version": "1.0.0",
"description": "数据查询",
"nodes": [
{
"name": "用户",
"process": "models.xiang.user.Find",
"args": ["{{$in[0]}}", { "select": ["id", "name"] }]
}
],
"output": {
"参数表": "{{$in}}",
"用户": "{{$res.用户}}"
}
}
运行调试
bash
yao run flows.query.args 1
使用 Map 参数
如果参数表中 只有一个 Map 类型参数, 可以直接使用 KEY
作为变量名称。
在 flows/query
目录下, 新建一个 Flow DSL 文件。
/data/app/flows/query/args_map.flow.json
json
{
"label": "演示",
"version": "1.0.0",
"description": "数据查询",
"nodes": [
{
"name": "用户",
"process": "models.xiang.user.Find",
"args": ["{{$id}}", { "select": ["id", "name"] }]
}
],
"output": {
"参数表": "{{$in}}",
"用户": "{{$res.用户}}",
"ID": {
"$id": "{{$id}}",
"$in[0].id": "{{$in[0].id}}"
}
}
}
本例中 {{$id}}
与 {{$in[0].id}}
等效
运行调试
bash
yao run flows.query.args_map '::{"id":1}'
使用 Script
对于逻辑较为复杂的场景,可以使用 JavaScript 脚本编写处理器,实现逻辑编排。
新建 Script 脚本文件
在 scirpts
目录下, 新建一个 JS 文件。
/data/app/scripts/query.js
javascript
/**
* 查询产品信息
*/
function Product() {
let res = Process(
'models.product.Insert',
['name', 'remark', 'user_id'],
[
['手艺里的中国:指尖', '李武望 著 时代华语', 2],
['(限时包邮)在印度', '随水 著,书田文化', 2]
]
);
let products = Process('models.product.Get', {
select: ['id', 'name', 'remark', 'user_id'],
wheres: [{ column: 'user_id', value: 2 }]
});
let result = [];
products.forEach((item) => {
result.push(`${item.id} - ${item.name} ( ${item.remark} )`);
});
return result;
}
运行调试
bash
yao run scripts.query.Product
参数表
在文件中添加一个 Args
函数
/data/app/scripts/query.js
javascript
/**
* 传参演示
*/
function Args(...args) {
return args;
}
运行调试
bash
yao run scripts.query.Args "hello" '::{"foo":"bar"}'