更新时间:2024-03-08 GMT+08:00
分享

脚本开发实例

本节主要通过创建2个脚本实例为您介绍了解如何在AstroZero中创建一个全新脚本,以及如何在已有脚本的基础上定制开发脚本。

  1. 创建全新脚本
  2. 定制开发脚本:如何定制已有脚本

开发一个简单脚本实例

本脚本实例不涉及对象,及调用接口等内容,脚本只实现请求“http://www.huawei.com”,返回网站请求的消息头功能。

  1. 登录到AstroZero开发环境,在首页“项目”下“我的应用”中,单击一个应用,进入该应用开发工作台
  2. 将光标放在某个文件夹(例如Logic)上,单击,选择“脚本”。

    图1 选择创建图标“+”

  3. 选择“创建一个新脚本”,输入基本信息,单击“添加”,进入脚本编辑页面。

    其中,脚本名称为“httpTest”。
    图2 新增脚本

  4. 在脚本编辑页面中,将以下脚本代码粘贴到代码编辑区。

    import * as http from 'http' // 导入http库
    let client = http.newClient() // 实例化
    let resp = client.get("https://www.huawei.com/")// 请求网址
    console.log(resp.headers) // 打印返回headers

  5. 单击页面上方,保存脚本。
  6. 运行测试脚本。

    1. 单击编辑器上方执行图标。
    2. 在页面底部单击测试窗口右上角图标,返回消息头信息。
      {
           Access-Control-Allow-Headers: [ 'Content-Type' ], 
           Access-Control-Allow-Methods: [ 'GET,POST,PUT,DELETE,OPTIONS' ], 
           Access-Control-Allow-Origin: [ '*' ], 
           Cache-Control: [ 'no-cache, no-store' ], 
           Content-Type: [ 'text/html; charset=utf-8' ], 
           Date: [ 'Mon, 14 Dec 2020 12:09:59 GMT' ], 
           Expires: [ '-1' ], 
           Pragma: [ 'no-cache' ], 
           Processtime: [ '0.039' ], 
           Server: [ 'PAAS-WEB' ], 
           Set-Cookie: [ 'cbg1#lang=en; path=/' ], 
           Strict-Transport-Security: [ 'max-age=31536000' ], 
           X-Content-Type-Options: [ 'nosniff' ], 
           X-Download-Options: [ 'noopen' ], 
           X-Frame-Options: [ 'SAMEORIGIN' ], 
           X-Powered-By: [ 'ASP.NET' ], 
           X-Xss-Protection: [ '1; mode=block' ]
       }

    以上步骤已经完成了一个简单脚本的编写,如果后续其他脚本、服务编排、编译打包等需要继续使用该脚本,则必须单击页面上方的启用图标,启用该脚本,如果未启用,其他组件无法查询到该脚本,查询时会报错该脚本不存在或未启用。

    后续在新版本功能中如果需要更新该脚本,您可单击编辑器上方图标,选择“新建版本”,在新建的版本中更改脚本并保存、测试、以及启用。单击编辑器上方的,选择对比版本,可将当前版本与历史版本进行比对。

    TypeScript脚本如何写请深入学习JavaScript和TypeScript相关语言代码知识。相关的库除JavaScript es5的官方标准库外,AstroZero还扩展了10+内置功能库,帮助您更高效地开发,有关系统预置的标准库说明请参见脚本中预置的API

开发一个业务场景脚本实例

本小节创建的业务场景脚本相对于开发一个简单脚本实例,具有更为复杂的业务逻辑。

本脚本实例实现的业务场景:根据对象的数据生成资源列表数据,用于前台数据呈现,启用本脚本后,可实现数据导入模板使用。

创建脚本之前,需要先创建脚本中操作的对象ApprovedResource,其字段如表1所示。

表1 对象说明

字段标签

字段名称

字段类型

取值

读写权限

含义

ownerId

ownerId

文本

长度:255

全选

资源拥有者ID

ResourceName

ResourceName

文本

长度:255

全选

资源名称

Type

Type

选项列表

枚举值如下:

  • File
  • Folder

全选

资源类型

SubmitDate

SubmitDate

日期/时间

不涉及

全选

资源提交时间

ApproveDate

ApproveDate

日期/时间

不涉及

全选

资源审批时间

Status

Status

选项列表

枚举值如下:

  • Waiting
  • Submitted
  • Approved

全选

审批状态

  1. 登录到AstroZero开发环境,在首页“项目”下“我的应用”中,单击一个应用,进入该应用开发工作台
  2. 创建一个脚本操作的对象ApprovedResource:

    1. 将光标放在一个存放对象的应用目录(例如Model)上,单击,选择“对象”。
    2. 在弹窗中,输入对象的“名称”、“标识”为“ApprovedResource”,单击“添加”。
    3. 导入字段模板,创建字段模板。请单击import-fields-template.zip下载并解压获取“import-fields-template.xlsm”,将待导入字段模板到本地。
    4. 单击当前对象的“自定义字段”,然后单击“批量创建”后的,选择“批量导入字段”,选择上一步下载的字段模板。导入完成后,刷新页面,重新进入对象的“自定义字段”,即可查看已导入的字段。
      图3 导入自定义字段

  3. 将光标放在某个文件夹(例如Logic)上,单击,选择“脚本”。
  4. 选择“创建一个新脚本”,输入脚本名称“ResourceListScript”,单击“添加”,进入脚本编辑页面。

    图4 新增脚本
    表2 脚本参数说明

    参数

    说明

    创建一个新脚本

    选择后,创建空白脚本。

    使用已有脚本

    选择后,复制一个已有的脚本。

    名称

    ResourceListScript,脚本名称

    模板

    脚本模板,用于生成不同类型的脚本。这里选择“空脚本”。

    目前支持以下几种类型。

    • 空脚本:表示不用模板。
    • 示例服务脚本:对外提供服务的脚本,可通过restful直接调用。
    • 示例内部脚本:是内部库代码,只能被其它脚本import使用。
    • 示例安装脚本:在安装或升级App/BO包时,在导入实例化配置数据之前或者之后执行的脚本。一般用于预清理数据,删除、更新数据等。
    • 示例权限脚本:在开放AstroZero的服务编排、脚本或者操作对象数据接口给第三方系统调用时,通过该示例脚本可实现在第三方系统配置这些接口的访问权限。

    当编辑已有脚本时,为防止编辑时多人篡改,编辑前请单击锁定脚本。

  5. 在脚本编辑页面中,将以下脚本代码粘贴到代码编辑区。

    请将脚本中CNAME__替换为实际的命名空间、对象名、字段名。

    //导入该脚本所依赖的标准库文件。decimal、context都是系统预置的标准库。
    import * as db from 'db';
    import * as decimal from 'decimal';
    import * as context from 'context';
    //声明该脚本中所应用到的ApprovedResource__CST对象
    @useObject(['CNAME__ApprovedResource__CST'])
    //定义入参变量ownerId、limit、offset,分别表示资源拥有者ID、每页展示的资源条数、每页展示第一条资源的偏移量,即从offset+1条资源开始展示。
    @action.object({ type: 'param' })
    export class Input {
        @action.param({ type: 'string', required: true })
        ownerId: string;
        @action.param({ type: 'number', required: true })
        limit: number;
        @action.param({ type: 'number', required: true })
        offset: number;
    }
    //定义出参变量resource和totalCount,分别表示资源数组集合和资源总数(固定100)。
    @action.object({ type: 'param' })
    export class Output {
        @action.param({ type: 'any', isCollection: true, label: "object" })
        resource: object[];
        @action.param({ type: 'number' })
        totalCount: number;
    }
    //定义查询SQL语句,用于查询某条资源审批详情;SQL语句中的表名和字段名要和预定义的对象名和字段名保持一致。
    class querySql {
        static queryRecord = "select CNAME__Status__CST, CNAME__SubmitDate__CST, CNAME__ApproveDate__CST from CNAME__ApprovedResource__CST where CNAME__ownerId__CST=? and CNAME__ResourceName__CST=?";
    }
    //定义数据源方法体,用于模拟数据源,并支持状态检查和分页功能。
    @action.object({ type: 'method' })
    export class getFileList {
        @action.method({ input: "Input", output: "Output", label: "getFileList" })
        getFileList(input: Input): Output {
            let outResult = new Output()
            let resource: Array<Object> = [];
            let resourceLimit: Array<Object> = [];
            outResult.totalCount = 100;
            try {
                let sequence = "";
                for (let i = 1; i < 51; i++) {
                    if (i < 10) {
                        sequence = "0" + i;
                    } else {
                        sequence = "" + i;
                    }
                    let file = {
                        "ownerId": input.ownerId,
                        "approveDate": null,
                        "resourceName": "File" + sequence,
                        "status": "Waiting",
                        "submitDate": null,
                        "type": "File"
                    }
                    let folder = {
                        "ownerId": input.ownerId,
                        "approveDate": null,
                        "resourceName": "Folder" + sequence,
                        "status": "Waiting",
                        "submitDate": null,
                        "type": "Folder"
                    }
                    resource.push(file);
                    resource.push(folder);
                }
                if (resource.length > 0) {
                    for (let i = 0; i < resource.length; i++) {
                        let s = db.sql()
                        let query = s.exec(querySql.queryRecord, { params: [input.ownerId, resource[i].resourceName] });
                        if (query.length == 1) {
                            resource[i].status = query[0]["CNAME__Status__CST"];
                            resource[i].submitDate = query[0]["CNAME__SubmitDate__CST"];
                            resource[i].approveDate = query[0]["CNAME__ApproveDate__CST"];
                        }
                    }
                }
                for (let j = 0; j < decimal.toNumber(input.limit); j++) {
                    console.log(decimal.toNumber(input.offset) + j);
                    resourceLimit.push(resource[decimal.toNumber(input.offset) + j]);
                    outResult.resource = resourceLimit;
                }
                return outResult;
            } catch (error) {
                console.log(error.name, error.message);
                error.Error(error.name, error.message);
            }
    
        }
    }

  6. 单击代码编辑页面上方图标,保存脚本。
  7. 运行测试脚本。

    1. 单击编辑器上方执行图标。
    2. 在页面底部“输入参数”页签输入请求报文,单击测试窗口右上角图标。
      { 
         "ownerId":"123", 
         "limit":3, 
         "offset":1
      }

      脚本的入参支持写入http-header参数。例如:

      {
        "http-header": {
          "header1": "value1"
        }
      }
    3. 检查Output页签的结果是否符合预期。
      {
          "resource": [
              {
                  "approveDate": null,
                  "ownerId": "123",
                  "resourceName": "Folder01",
                  "status": "Waiting",
                  "submitDate": null,
                  "type": "Folder"
              },
              {
                  "approveDate": null,
                  "ownerId": "123",
                  "resourceName": "File02",
                  "status": "Waiting",
                  "submitDate": null,
                  "type": "File"
              },
              {
                  "approveDate": null,
                  "ownerId": "123",
                  "resourceName": "Folder02",
                  "status": "Waiting",
                  "submitDate": null,
                  "type": "Folder"
              }
          ],
          "totalCount": 100
      }

  8. 单击代码编辑页面上方图标,启用脚本。

    后续在新版本功能中如果需要更新该脚本,您可单击编辑器上方图标,选择“新建版本”,在新建的版本中更改脚本并保存、测试、以及启用。单击编辑器上方的,选择对比版本,可将当前版本与历史版本进行比对。

如何定制已有脚本

您可以全新创建一个脚本,也可以根据业务需要修改已有脚本,如使用如何通过模板进行数据导入的BulkInsert脚本为例。

在以下两种场景下,您需要修改已有脚本:

  • 场景1:在已有脚本基础上新建版本。业务需要,脚本要实现的能力变化,此时您可以基于原有脚本修改,并保存为脚本的新版本。在此场景下,原有脚本作为老版本自动失效。
  • 场景2:在已有脚本基础上新建脚本。您需要开发的新脚本与已有的某个脚本类似,此时您可以基于原有脚本修改,再保存为新的脚本名称。在此场景下,原有脚本仍然有效。新脚本和老脚本也没有关联关系,各自独立。

场景1:在已有脚本基础上新建版本:

根据已有的“BulkInsert”版本1.0.1的脚本 ,开发“BulkInsert”版本1.0.2的脚本。

  1. 在应用开发工作台Logic目录下,单击“BulkInsert”脚本。
  2. 单击编辑器上方的另存为图标,选择“新建版本”,单击“保存”。

    图5 另存为“BulkInsert”脚本
    图6 保存新建版本

  3. 编辑新脚本版本的内容,修改后单击页面上方,保存修改。

    图7 修改版本后保存与启用

  4. 测试脚本,确保其运行结果符合预期后,再单击启用脚本。

场景2:在已有脚本基础上新建脚本:

根据已有的“BulkInsert”脚本 ,开发“BulkInsertOther”。

  1. 在应用开发工作台Logic目录下,单击“BulkInsert”脚本。
  2. 单击编辑器上方的另存为图标,选择“新建脚本”,输入新脚本名“BulkInsertOther”,单击“保存”。

    图8 新建脚本

  3. 编辑新脚本的内容,修改后单击上方图标,进行保存。
  4. 测试脚本,确保其运行结果符合预期后,再单击启用脚本。
分享:

    相关文档

    相关产品