代码块

前提

有一定的 JavaScript 基础,熟悉定义变量、函数、循环、条件判断等常规代码编写,没基础的可以先去 B站/菜鸟教程学习

使用教程

添加代码块

Zion 行为流中的「代码块」目前只支持 JavaScript 语言。 如果想要通过编写 JS 代码来实现更加复杂的业务逻辑时,可以在行为流中添加代码块的操作,只需要点击需要添加代码块的节点,选择代码块即可。

配置代码块

当添加了代码块之后,你可以点击代码块操作修改名称,在右侧的代码编辑区域中可以直接编写 JS 代码,也可以点击代码编辑器右上角「展开」按钮展开代码编辑器界面,使用更大的窗口编辑代码。

配置以及获取入参

如果您的代码块中需要处理用户输入的(行为流最上级的「入参」)或者是上级节点产生的数据,那么首先需要在代码块中所需的【入参】 以触发【微信提醒】为例:

  1. 先在「行为流」中配置入参,这里的作用是为了在页面上调用行为流时,可以向行为流中输入参数
  2. 「代码块」 中配置入参,这里的作用是为了告诉代码块,入参具体的值是什么,一般绑定行为流入参的结果 ⚠️ 注意:入参名称要与第3步中获取入参的函数括号中的一致!!!

  3. 「代码」 中获取入参,需要使用到 Zion 内置的 context.getArg("入参名称"); 函数来获取入参 ⚠️ 注意:名称需要使用英文的「单引号」或者「双引号」包裹 微信提醒

    const thing1 = context.getArg('thing1');
    const thing4 = context.getArg('thing4');
    const date2 = context.getArg('date2');
    const accountId = context.getArg('accountId');
    const data = { 'thing1':thing1, 'date2':date2, 'thing4':thing4
    };
    const gql = `mutation publishWechatMessage($data: Map_String_StringScalar,$accountId:Long!){
    publishWechatMessage(
     accountId: $accountId
     data: $data
     miniprogramState: FORMAL
     page: "pages/lil7gbne/lil7gbne"
     lang: CN
     templateId: "RQH7FafxS4_jQsRSN6ujLLKUoWuXpC3uLvYP1WL75Ys"
    )
    }`;
    context.runGql('publishWechatMessage', gql,{data,accountId}, { role: 'admin'});
    

    配置以及返回出参

    如果你需要将代码块处理的结果拿到行为流下方的其它节点使用时,你需要配置代码块的出参,并且编写返回参数的的代码内容。

  4. 「代码」 中返回出参,需要使用到 Zion 内置的 context.setReturn("出参名称",出参内容); 函数来返回出参返回手机号码处理结果

    const phone_number = context.getArg('phone_number'); // 获取行为流入参手机号
    const result = `${phone_number.substring(0,3)}****${phone_number.substring(7,11)}`; // 将获取到的手机号中间四位处理为引号的逻辑
    context.setReturn('result_phone', result) ; // 返回处理结果,即出参
    
  5. 「代码块」 中配置出参,这里的作用时告诉下级节点,出参的名称以及类型是什么

⚠️ 注意 :出参的名称要与代码中 context.setReturn() 函数中填写的名称一致

  1. 在「行为流」中配置出参,这里的作用是将上级节点中需要给前端使用的数据返回到前端,进行了这一步之后,在前端页面调用这个行为流时,才会有【结果数据】供页面赋值/使用

高阶内容

详细介绍如何在Zion平台的代码块中使用GraphQL进行数据库操作,包括前提条件、操作步骤、代码示例,以及在Zion中配置和调用第三方API的方法。 前提条件:

⚠️⚠️⚠️ 注意:保护好自己的 Authorization,一旦泄露别人可以随便通过 gql 操作你的数据,所以为了防止别人能够通过 gql 随意操作你的数据库 ,你需要参考 【权限管理配置说明】定义好你的数据库访问权限。

教学视频:【 gql 专讲 1 】【 gql 专讲 2 】

应用场景

期望直接在代码块中读取或者修改数据库中的数据,以便于拿到数据后进行代码逻辑的处理

在代码块中运行 gql

前提:了解下方的 Graphql 基础

基本代码结构

// gql 内容
const gql = `query findPaymentTransactionById ($paymentTransactionId: bigint!){
    response: payment_transaction_by_pk(id:$paymentTransactionId) {
      id
      status
      currency
      amount
      description
      order_id
      account_id
      payment_method
    }
  }`;
// 运行 gql
context.runGql('findPaymentTransactionById', gql, { paymentTransactionId: 1 }, { role: 'admin' });

runGql 参数说明

context.runGql( operationName , gql , variables , permission );

  • operationName: 就是 gql 的名字,需要和 gql 里面的名字保持一致,如上方 gql 中 query 后的【findPaymentTransactionById】就是 gql 的名字
  • gql:gql 的具体内容,即上方通过 const 定义的变量 gql 之后的内容,`` 该符号是在英文输入模式下 tab 键上方的按键结果
  • variables: 如果 gql 里面使用了参数声明,则这个参数不能为空,参数为键值对的形式
  • permission: 声明去调用 gql 的角色,一般为 admin### 应用案例 通过 gql 请求活动表中的所有数据,更新其中报名费用字段的数据

代码示例:

const gql1 = `query all_huodong{
  ud_huodongbiao_aed593(
    distinct_on: [id]
  ) {
    id
    ud_huodongmingcheng_683ab6
    ud_baomingfeiyong_a5f138
  }
}
`; // 定义获取活动表中的 id 、活动名称、报名费用的所有数据的gal

const all_huodong = context.runGql('all_huodong',gql1,{},{role:'admin'});// 运行这段 gql,获取数据并保存到 all_huodong 变量中

const gql2 = `mutation update_feiyong($value:bigint){
  update_ud_huodongbiao_aed593(_set: {ud_baomingfeiyong_a5f138:10086}, _inc: {}, where: {id:{_eq:$value}}) {
    affected_rows
    returning {
      id
      ud_baomingfeiyong_a5f138
  }
}
}`; // 定义根据活动表的id(即过滤条件为活动表的id)更新活动报名费用字段,将所有的费用更新为 10086

const huodong_array = all_huodong.ud_huodongbiao_aed593;// gql 返回的结果是一个对象,要拿到对象中的数据数组

for (var i = 0;i < huodong_array.length;i++)
{
  context.runGql('update_feiyong',gql2,{value:huodong_array[i].id},{role:'admin'});
}; // 通过循环的方式运行 gql 更新每一条数据

Graphql 基本简介与作用

Graphql 是 Facebook 于 2012 年在内部开发的数据查询语言

  • Zion 前端向后端发送请求的方式是 Graphql,以下简称 gql ,所以可以利用 gql 向 Zion 的后端发送请求,一般用来调试
  • 将 Graphql 植入 ActionFlow 中,即可在 Zion 的行为流中定义各种代码块,实现复杂的功能需求,例如各类批量操作## Altair 界面认知 Altair GraphQL Client 是调试 gql 的工具,以下简称 Altair,下载打开后的界面如下所示

Altair 调试 gql 配置内容

  • Add new 添加请求
  • Set Headers 设置请求头
  • 设置请求方式
  • 添加请求链接
  • 点击 Docs 查看请求文档
  • 配置测试参数
  • 美化请求代码:prettify

配置请求 URL 以及 Headers

  1. 进入 Zion 创建一个新的项目,创建一张名为 reference 的数据表,在数据表中添加 content(文本)的字段,更新后端
  2. 进入数据库,打开 F12 ,点击 Network ,清空请求,点击数据库中的 reference 表,点击 Network 中的请求:

  1. 复制 Headers 下 General 中的 Request URL 中的内 URL 粘贴至 Altair 的请求中,请求方式默认为POST;
  2. 复制 Headers 下 General 中的 Request Headers 中的 Authorization 以及其值 粘贴到 Altair 请求头中

如何查看 Docs

配置一个 query 请求,请求 reference 表中的数据,点击 Altair 右侧的 Docs,输入reference,可以看到关于这张数据表的请求都在这里,选择第一个,可以看到在这个请求下的左右参数、类型、字段,你可以点击任何一个内容来进一步了解请求配置

  • ARGUMENTS 请求参数: 在请求数据时,一般需要配置 where(条件)、order_by(排序字段)、distinct_on(字段内容去重)、offset(从第几项开始,index)、limit(限额)
  • 请求参数类型判断:没有任何符号的,那么就是一个对象,有一个[]的,是一个数组,具体的类型(比如 int )
  • 请求参数的选择:点击某个请求参数,可以查看该参数下能够配置哪些内容,点击内容,能够查看该内容能够配置哪些运算符(判断方法)
  • 基本的比较运算符(判断方法):
  • 等于(_eq)、为空(_is_null:true)、非空:(_is_null:false)
  • 大于等于(_gte)、小于等于(_lte)
  • 与条件_and:[条件1,条件2]、或条件_or:[条件1,条件2],、非条件_not:条件
  • 大于(_gt)、小于(_lt)
  • 包含(_in)、不包含(_nin)
  • 相似(_like)、不相似(_nlike)、不区分大小写的相似(_ilike)
  • 自增(_inc)
  • 排序:降序(desc)、升序(asc)
  • TYPE 类型:哪一张表
  • FIELDS 字段: 这个表里有哪些字段可以请求回来,请求回来的如果是关联表内容,还可以继续点击查看如何配置关联表的条件等内容## 配置请求

    Query - 查询请求

    搜索请求

    在 Docs 中搜索某张表名,找到这张表的 query 请求,点击该请求进入到请求 Docs

添加请求

鼠标悬浮到最上方表名时,右侧可以点击 ADD QUERY,会自动将请求代码填充至左侧(所以实际上你自己并不用写 gql ),在左侧编辑区你可以删除/增加条件、字段、关联表内容,只拿自己想要的某个条件的某个字段。

请求的基本结构

# 查询
query 命令名($argumentname1:type){
表名(where:{字段1:{判断方法:判断值},
字段2:{判断方法:判断值}},
order_by:[{字段:排序方式}],
distinct_on:[去重字段],
limit:1)
{
别名:需返回字段
    }
}
  • where 用来配置请求条件,是个对象类型
  • order_by 用来配置排序条件,是个数组类型,数组中的内容是一个个对象
  • distinct_on 用来设置去重条件,是个数组类型,数组中是去哪些字段的重
  • limit 用来设置请求的数据条数,是个整数类型可以根据需求来删减需要返回的数据字段,返回的结果是一个对象

    设置请求入参

  • 在请求的「命令名」之后增加一对英文的(),然后在括号填写请求入参名称以及类型:$argumentname1:参数类型

  • 在编辑界面左下方点击【VARVARLABES】展开参数编辑窗口,先写入一对{},然后在花括号中写入参数的内容,参数内容中的参数名称依旧需要以美元符号 $ 开头,这里的参数是个对象,意味着如果你在命令名中配置了多个参数,在这里你就可以设置多个参数内容

运行请求

点击请求上方的【send query】按钮即可运行该请求,在右侧即可查看请求结果

Query 基本场景

  1. 根据过滤条件,获取一对一关联表中的数据:获取当前用户的个人信息

    query getAccount($accountID: bigint) {
    account(where: { id: { _eq:$accountID } }) {
     id
     profile {
       id
       name: ud_xingming_e1693e
       gender: ud_xingbie_7644ed
       phone_number: ud_shoujihaoma_e3188e
     }
    }
    }
    
  2. 根据过滤条件,获取一对多关联表中的数据:获取这个活动在活动表中的报名记录,获取媒体--图片数据

    # 请求某个活动的报名情况
    query getsign_record($activityID: bigint) {
    activity(where: {}, order_by: [{}], distinct_on: [id], offset: 1, limit: 1) {
     id
     name
     image {
       url
     }
     sign_record(where: { activity_id_activity: { _eq: $activityID } }) {
       id
       activity_id_activity
       ud_account_id_zhanghu_999f9c
     }
    }
    }
    
  3. 请求聚合数据:在 Docs 中搜索“表名_aggregate”的 query 请求即可请求这张表的聚合数据

    # 请求 reference 表的count,maxid
    query getReferenceAggregate {
    reference_aggregate {
     aggregate {
       count(columns:[id,content],distinct:true)
       max {
         id
       }
     }
    }
    
  4. 请求关联表的 count 来对本表进行排序,并显示关联表的 count,比如要根据某个活动的报名数量对活动内容进行降序显示,并显示

    # 请求 activity 表,让他按照报名表的count降序显示,并且显示报名数量
    query activity_order_by_sign_count{
    activity(order_by: [{sign_record_aggregate:{count:desc}}]) {
     id 
     name
     image{url}
     sign_record_aggregate{
       aggregate{count}
     }
    }
    }
    

    Mutation - insert 请求

    搜索请求

    在 Docs 中搜索 insert_某张表名,找到这张表的 mutation 请求,点击该请求进入到请求 Docs

添加请求

鼠标悬浮到最上方表名时,右侧可以点击 ADD QUERY,会自动将请求代码填充至左侧

请求的基本结构

#添加
mutation 命令名{
    insert_表名(
    objects:[{数据1字段1:赋值1,数据1字段2:赋值2},{数据2字段1:赋值1,数据2字段2:赋值2}],     
    on_conflict:{constraint:约束名,update_columns:[更新的字段1,更新的字段2],},
    )
    {
        无所谓填啥,新手不用管,想研究的可以自行查看 Docs
    }
}
  • objects ​用来填写需要插入的数据内容,是个数组类型,数组中每一条数据是一个对象
  • on_conflict 用来填写发生数据冲突时,这个请求要做什么,是个对象类型,如果没有限制可以不配
  • constraint:填写约束名称
  • update_columns:填写冲突时,需要更新的字段名称### Mutation - update 请求

    搜索/添加请求

    在 Docs 中搜索 update_某张表名,找到这张表的 mutation 请求,点击该请求进入到请求 Docs ,添加请求与上述方法一致

    请求的基本结构

#更新
mutation 命令名{
    update_表名(
    _set:{字段1:赋值1,字段2:赋值2},
    _inc:{字段1:赋值1},
    where:{字段1:{判断方法:判断值},字段2:{判断方法:判断值}}
    )
    {
        无所谓填啥,新手不用管,想研究的可以自行查看 Docs
    }
}
  • _set 用来设置需要更新的字段以及内容,是个对象类型
  • _inc 用来设置需要更新的数字类型的字段增加/减少一定的数值,增加则写正数,减少则写负数
  • where 用来配置更新的条件,是个对象类型### Mutation - delete 请求

    搜索/添加请求

    在 Docs 中搜索 delete_某张表名,找到这张表的 mutation 请求,点击该请求进入到请求 Docs ,添加请求与上述方法一致

    请求的基本结构

# 删除
mutation 命令名{
  delete_表名(
  where:{字段1:{判断方法:判断值},字段2:{判断方法:判断值}}
  ){
    无所谓填啥,新手不用管,想研究的可以自行查看 Docs
  }
}
  • where 用来配置删除数据的条件,是个对象类型# 在代码块中运行 API 前提:在 Zion 中添加并调试成功了API callThirdPartyApi('$operationId', $args) : 调用Zion配置后API

  • $operationId: API id

  • $args: API 参数, 如{'body':{"appKey": "f46dce7fa0566f0c"}}
    context.callThirdPartyApi('$operationId', {'body'{"appKey": "f46dce7fa0566f0c","sign": "OTljNjYyNXXX=="}});
    
    如何查找 API id: 在 Altair 的 Docs 的搜索框中输入:operation,然后会出现相关的请求,例如: operation_llw3pde2 中的 llw3pde2 就是 API id,当你配置了多个 API 时,这里也会出现多个请求,你可以通过点击这个请求,查看配置参数来确定具体是哪一个API

使用案例

通过小程序用户的account id获取其对应的微信union id 和 open id

常用场景:

  • 服务号发送消息的时候需要指定用户的open id
  • 当数据源在外部时(比如明道云),需要保存open id作为用户标识
  • 当一个企业有多个小程序,要共用同一套体系的时候,会用到union_id. 比如为了向用户持续推送消息,需要用到公众号推送,启用这个功能需要用到union_id.入参:用户的account id (整数类型) 出参:微信union id (文本类型)和 open id (文本类型)
// 获取account_id
const account_id = context.getArg('account_id');
console.log(account_id);
// 取account信息的gql语句(入参为account id,即过滤的条件)
var gql = `query queryAccount($account_id:bigint!)

{
  account (where:{id:{_eq:$account_id}})
           {

            id
            oauth2_user_info_map
          }
        }`;

// 执行这个gql语句,得到查询结果
var result_id = context.runGql("queryAccount", gql, {account_id}, { role: "user" })

// 创建数组a, a为account信息里名为account的数组
var a = [];
a = result_id.account;
//情况1,account既有union_id,也有open_id
if(a.length!= 0 && a[0].oauth2_user_info_map.WECHAT.hasOwnProperty('unionId')){
  var open_id = a[0].oauth2_user_info_map.WECHAT.openId;
  var union_id = a[0].oauth2_user_info_map.WECHAT.unionId;
  context.setReturn('union_id',union_id);
  context.setReturn('open_id',open_id);
}
  // 情况2,account只有open_id, 没有union_id
else if(a.length!= 0 && !a[0].oauth2_user_info_map.WECHAT.hasOwnProperty('unionId')){
  var open_id = a[0].oauth2_user_info_map.WECHAT.openId;
  context.setReturn('union_id','');
  context.setReturn('open_id',open_id);
}
  // 情况3,account既没有open_id也没有union_id
else{
  context.setReturn('union_id','');
  context.setReturn('open_id','');
}

在代码块中调用API获取图片URL,转存到Zion

基本逻辑: 通过第三方API获取到图片的URL,利用 Zion 内置的 uploadMedia 方法将URL解析为图片并保存在Zion 中,定义一个往你的项目中 insert 或者 update 数据的 gql ,其中入参为 uploadMedia 方法返回的 id,运行该 gql 即可将图片存到项目的数据库中 uploadMedia('url', 'headers') 参数 url : 从API 获取过来的 URL insert的代码:

const url = ''; // 过来的 url 链接
const headers = {};
const media = context.uploadMedia(url, headers);    // $url: 图片地址; $headers: 请求需要的headers, 一般都填{},除非你是向非本项目的数据库传文件。
// 返回值举例:{mediaType:"IMAGE", id:1020000000000003}
const imageID = media.id;
const gql = `mutation inset_image($imageID: bigint){
    insert_表名(
      objects:[{图片字段_id:$imageID}])
      {
     returning{id}
    }
}`
context.runGql('inset_image',gql,{imageID},{role:'admin'});

update的代码:

const xx_id = context.getArg('xx_id');//获取过滤用的表id
const url = ''; // 过来的 url 链接
const headers = {};
const media = context.uploadMedia(url, headers);    // $url: 图片地址; $headers: 请求需要的headers, 一般都填{},除非你是向非本项目的数据库传文件。
// 返回值举例:{mediaType:"IMAGE", id:1020000000000003}
const imageID = media.id;
const gql = `mutation update_image($imageID: bigint,$xx_id:bigint){
    update_表名(
      _set:{图片字段_id:$imageID}
      where:{id:{_eq:$xx_id}})
      {
     returning{id}
    }
}`
context.runGql('update_image',gql,{imageID,xx_id},{role:'admin'});
Copyright © FunctorZ 2024 all right reserved修订时间: 2024-11-30 13:00:45

results matching ""

    No results matching ""