华为云用户手册

  • 安装专业版节点 在“节点管理”的节点列表选择您需要安装的节点,单击右侧“安装”,获得提示。 图5 安装 选择支持架构和安装目录,然后单击复制安装命令,使用SSH工具以root用户登录边缘节点服务器后台系统,执行安装命令。 图6 提示 安装命令的选择需要与购买的ecs的架构保持一致。 图7 执行安装 图8 安装命令执行成功 单击“我知道了”,等待边缘节点的状态变为“在线”,表示该节点已安装并连接成功。 您可以单击“节点名称”,查看该节点详细信息,关于节点详情描述可参见节点概览。
  • 打包容器镜像 若制作镜像包以容器化方式部署应用,不支持在一个容器内运行多个集成ModuleSDK的软件进程或者重启集成ModuleSDK的软件进程,会导致鉴权失败等问题。 上传打包的项目。 将jar文件上传到联网的linux机器上,如目录(/home/monitor)中 安装docker。 请确认你使用的系统已经安装docker(docker版本需要高于17.06,推荐18.06),安装参照docker 安装教程。 制作镜像。 搜索基础镜像,基础镜像需要集成jre。 docker search jre8 选择合适的镜像(镜像需要集成版本不低于8的jre) NAME DESCRIPTION STARS OFFICIAL AUTOMATED livingobjects/jre8 Jre8 image 4 [OK] livingobjects/jre8镜像是docker hub第三方提供的镜像,非IoT团队发布,且IoT团队未提供任何官方镜像。该镜像在此仅做示例,IoT团队对该镜像的安全性不作保证。强烈建议用户自己封装镜像! 拉取镜像 docker pull livingobjects/jre8 编写dockerfile制作镜像 dockerfile内容参照如下(具体可参考编写高效的Dockerfile ) #Version 1.0.0 #基础镜像来源 FROM livingobjects/jre8 #授权 RUN mkdir -p /opt/iot/edge/monitor / && chmod -R 777 /opt/ #复制文件到指定目录,此dockerfile文件位置:/home,jar包位置:/home/monitor COPY monitor /opt/iot/edge/monitor #用户 USER root #开放端口 EXPOSE 8080 #运行命令 CMD ["java", "-jar", "/opt/iot/edge/monitor/monitor-app.jar", "run"] 目录树结构如下: home ├── dockerfile └── monitor └── monitor-app.jar 构建镜像 docker build -t edge_monitor:1.0.0 /home --no-cache 查看打包完成的镜像 docker images 回显信息: REPOSITORY TAG IMAGE ID CREATED SIZE edge_monitor 1.0.0 93f9d964bcea 12 seconds ago 243MB 父主题: 前提条件
  • 请求URI 请求URI由如下部分组成。 {URI-scheme} :// {Endpoint} / {resource-path} ? {query-string} 尽管请求URI包含在请求消息头中,但大多数语言或框架都要求您从请求消息中单独传递它,所以在此单独强调。 URI-scheme:表示用于传输请求的协议,当前所有API均采用HTTPS协议。 Endpoint:指定承载REST服务端点的服务器 域名 或IP,不同服务不同区域的Endpoint不同,您可以从地区和终端节点中获取。例如IoT边缘平台在“华北-北京四”区域的Endpoint为“iotedge-api.cn-north-4.myhuaweicloud.com”。 resource-path:资源路径,也即API访问路径。从具体API的URI模块获取,例如“查询北向NA信息详情”API的resource-path为“/v2/{project_id}/nas/{na_id}”。 query-string:查询参数,是可选部分,并不是每个API都有查询参数。查询参数前面需要带一个“?”,形式为“参数名=参数取值”,例如“limit=10”,表示查询不超过10条数据。 例如您需要在IoT边缘平台获取应用接入地址的信息, 并在查询北向NA信息详情的URI部分找到resource-path(/v5/iot/{project_id}/products/{product_id}),拼接起来如下所示。 https://100.xxx.xxx.220/v2/{project_id}/nas/{na_id} 为查看方便,在每个具体API的URI部分,只给出resource-path部分,并将请求方法写在一起。这是因为URI-scheme都是HTTPS,而Endpoint在同一个区域也相同,所以简洁起见将这两部分省略。
  • 请求消息头 附加请求头字段,如指定的URI和HTTP方法所要求的字段。例如定义消息体类型的请求头“Content-Type”,请求鉴权信息等。 如下公共消息头需要添加到请求中。 Content-Type:消息体的类型(格式),必选,默认取值为“application/json”,有其他取值时会在具体接口中专门说明。 X-Auth-Token:用户Token。当使用Token方式认证时,必须填充该字段,可通过调用获取用户Token接口获取,接口返回的响应消息头中“X-Subject-Token”就是需要获取的用户Token。 对于查询北向NA信息详情接口,由于需要认证,所以需要添加“Content-Type”和“X-Auth-Token”到头域,添加消息头后的请求如下所示。 GET https://{Endpoint}/v2/{project_id}/nas/{na_id} Content-Type: application/json X-Auth-Token:eyJhbGciOiJSUzUxMiJ9.eyJpc3MiOiJpb3Rzd...
  • 请求消息体 请求消息体通常以结构化格式发出,与请求消息头中Content-type对应,传递除请求消息头之外的内容。若请求消息体中参数支持中文,则中文字符必须为UTF-8编码。 每个接口的请求消息体内容不同,也并不是每个接口都需要有请求消息体(或者说消息体为空),GET、DELETE操作类型的接口就不需要消息体,消息体具体内容需要根据具体接口而定。 对于创建&更新北向NA信息接口,您可以从接口的请求部分看到所需的请求参数及参数说明。将消息体加入后的请求如下所示。 POST https://{Endpoint}/v2/{project_id}/nas/{na_id} Content-Type: application/json X-Auth-Token: eyJhbGciOiJSUzUxMiJ9.eyJpc3MiOiJpb3Rzd... { "name" : "北向系统1", "description" : "这是一个北向NA", "endpoint" : "https://068b72f3b75444dda67cc6e2286a4c20.apic.cn-south-1.huaweicloudapis.com", "auth_type" : "AKSK", "auth_aksk_info" : { "secret" : "123456" }, "access_type" : "ROMA", "access_roma_info" : { "app_key" : "ebf59208-4c6b-4b06-9b69-494e9df475a3", "app_secret" : "fa3c8cd144b29771b5873ae6a7efa25b393c86665d2e9ffa34d1309c5cd704ea" } } 到此请求需要的内容已具备齐全,您可以使用curl、Postman或直接编写代码等方式发送请求调用API。
  • 请求方法 HTTP请求方法(也称为操作或动词),它告诉服务你正在请求什么类型的操作。 GET:请求服务器返回指定资源。 PUT:请求服务器更新指定资源。 POST:请求服务器新增资源或执行特殊操作。 DELETE:请求服务器删除指定资源,如删除对象等。 HEAD:请求服务器资源头部。 在查询北向NA信息详情的URI部分,您可以看到其请求方法为“GET”,则其请求为: GET https://{Endpoint}/v2/{project_id}/nas/{na_id}
  • JAVA版SDK SDK获取和安装 1. 安装Java开发环境。 访问Java官网,下载并说明安装Java开发环境。 华为云Java SDK支持Java JDK 1.8 及其以上版本。 2. 使用eclipse/IDEA创建工程。 3. 下载ModuleSDK,并在工程中导入jar包。 4. 开发代码 开发数据处理的代码示例,详细说明请参考开发应用集成ModuleSDK进行数据处理。 /** * 监控APP,检视设备上报的数据,并对设备进行相应的控制 */ public class MonitorApp implements BusMessageCallback { /** * 接受设备数据的消息总线输入点,取值需在创建应用版本的inputs参数中定义 */ private static final String INPUT = "input"; /** * 发送设备数据的消息总线输出点,取值需在创建应用版本的outputs参数中定义 */ public static final String OUTPUT = "output"; public static final int FIVE_SECOND = 5000; /** * 电机设备的产品ID */ public static final String MOTOR_PRODUCT_ID = "6b4843db3f0189e9c577"; /** * 与EdgeHub通信的客户端 */ private AppClient appClient; public MonitorApp() throws GeneraException { appClient = AppClient.createFromEnv(); } public void start() throws GeneraException { //设置回调,打开客户端 appClient.setBusMessageCallback(INPUT, this);//设置收到设备数据的回调 appClient.open(); } public void stop() throws GeneraException { appClient.close(); } /** * 收到设备上报数据的回调处理,样例代码在马达设备状态错误时对马达进行重启 * * @param busMessage */ @Override public void onMessageReceived(BusMessage busMessage) { try { if (busMessage.getProductId().equals(MOTOR_PRODUCT_ID)) { //马达设备状态错误时对马达进行重启 MotorData motorData = JsonUtil.fromJson( JsonUtil.toJson(busMessage.getServices().get(0).getProperties()), MotorData.class); if (motorData.getStatus().equals("error")) { Command command = new Command(busMessage.getDeviceId(), "power", "restart", null); appClient.callDeviceCommand(command, FIVE_SECOND); }else{ //其他设备数据发布到总线 appClient.sendBusMessage(OUTPUT, busMessage); } } else { //其他设备数据发布到总线 appClient.sendBusMessage(OUTPUT, busMessage); } } catch (Exception e) { System.out.println(e.getMessage()); } } }
  • 应用集成开发概述 集成开发包括连接器、数据接入和开放接口三部分。其中,数据接入(DataAccess)和连接器(Connector),是将外部数据或功能模块集成到AstroZero中使用,而开放接口是将AstroZero中开发的脚本、服务编排等包装成自定义REST接口,供第三方系统使用。 图1 集成开发 表1 集成开发 特性 特性说明 连接器 连接器是AstroZero提供的,调用第三方服务的集成工具。AstroZero封装了不同类型的连接器,用于对接相应的第三方服务,如OBS、Redis、 云搜索 和ROMA等。通过连接器,开发者无需关注具体代码实现,只需要配置集成服务的地址和鉴权信息,即可在服务编排或脚本中快速集成第三方系统。 使用连接器调用第三方接口 在使用AstroZero时,通常会调用第三方系统接口,进行数据交互。AstroZero提供了Rest服务连接器、Soap服务连接器和自定义连接器三种方式来调用第三方接口。使用这三种连接器,可方便快捷的调用第三方接口,实现对第三方系统数据的增加、删除、修改和查找。 使用Rest服务调用Rest协议接口:当系统需要调用第三方提供的Rest协议接口时,可以通过配置Rest服务来实现。Rest服务是第三方系统提供的,是一组模块化的Rest接口,通过配置第三方提供的Rest服务的URL进行调用。 使用SOAP服务调用SOAP协议接口:当系统需要调用第三方提供的SOAP协议接口时,可以通过配置SOAP服务来实现。SOAP服务是第三方系统提供的,是一组模块化的SOAP接口,通过配置第三方提供的SOAP服务的URL进行调用。 须知: 调用第三方接口前,需要第三方系统提供符合Rest和SOAP协议规范的API。 使用自定义连接器调用第三方接口:通过使用自定义连接器,可快速对接一个外部服务的接口并在AstroZero中使用。 使用连接器对接云服务 AstroZero封装了不同类型的连接器对接相应的第三方服务,如OBS、Redis、云搜索和ROMA等。通过连接器,开发者无需关注具体代码实现,只需要配置一下服务地址和鉴权信息,即可在服务编排或事件中快速集成第三方系统。 数据接入 数据接入是指通过对接多种输入源进行消息类数据的接入,如将ROMA侧的MQS,转换成Kafka消息队列中的事件,供平台业务逻辑接口使用。 开放接口 开放接口是指将用户在应用中开发的脚本、服务编排等包装成自定义的REST接口,供第三方系统进行调用。 父主题: 使用AstroZero进行应用集成开发
  • 什么是应用包 轻应用或行业应用开发完成后,应用需要编译打包,这种编译后的压缩包即应用包。 应用包类型 在AstroZero中,编译打包的应用包类型有以下两种: 源码包:该类型包中的所有组件,都不受保护和限制。在其他环境安装后可编辑包中组件,即在原有基础上可进行再开发。若后续其他用户在开发环境安装后,会显示在开发环境首页的“项目”页签下。 资产包:该类型支持设置包中的组件,是否受保护。打包时不做编译设置,默认打出的包都是资产包,包中组件都为只读保护模式,将包安装到其他环境时,只能运行和预览,不可编辑包中组件。若后续其他用户在其他开发环境安装资产包后,应用会显示在开发环境首页的“库”页签下。 应用包类型的详细介绍,请参见源码包与资产包对比。 软件包环境 图1 环境介绍 AstroZero分为开发环境,沙箱环境和运行环境三个部分,更多介绍请参见基本概念。 开发者在开发环境开发应用和BO,开发完成后生成对应的软件包。 发布软件包到沙箱环境中进行测试。 测试通过后,发布安装到生产环境实际运行和维护。 仅专业收费版本支持沙箱环境和运行环境,免费版本无沙箱环境和运行环境权限。 软件包制作 应用或BO创建完成后,平台会同步创建同名的软件包。 对应用和BO内的组件,进行增删查改都会同步反映到软件包中。 开发者也可以在编译设置中,对软件包和其中组件的属性进行修改。
  • 源码包与资产包对比 源码包和资产包都是应用发布类型,大部分的功能都是一致的,例如都分为全量和组件两种形式,都是按“编译-发布”的流程进行。目前来说,主要有以下几点不同之处: 不同的保护模式设置。 源码包中的所有组件都不受保护和限制,其保护模式也无法进行设置修改,这些组件在安装后可以被自定义编辑修改。而资产包的大部分组件默认在安装后是不允许被修改的,甚至可以设置某些组件不可见,如服务编排,脚本等,可防止泄露源代码,保护知识产权。其保护模式可以在编译设置中,进行修改。 二次开发与发布模式不同。 源码包在开发环境中安装后允许再次进行打包发布,而资产包安装后无法二次打包发布。另外,源码包只能发布到“我的仓库”,而资产包主要用于发布到应用市场。
  • 请求示例 对一个BPM实例修改或设置,设置其中两个开发者自定义的参数值,将变量cpuNumber的值改为1, custVar1的值改为value1。被操作的BPM实例ID是“002N000000Q3QW4IMAOO”。 PUT https://AstroZero域名/u-route/baas/bp/v2.0/runtime/instances/002N000000Q3QW4IMAOO/variables { "cpuNumber":1, "custVar1":"value1" }
  • URI PUT AstroZero域名/u-route/baas/bp/v2.0/runtime/instances/{instance_id}/variables 表1 路径参数 参数 是否必选 参数类型 描述 instance_id 是 String 参数解释: 对应一个具体BPM实例的标识,可通过调用查询BPM实例接口查看(响应消息中的“id”)。 约束限制: 不涉及。 取值范围: 不涉及。 默认取值: 不涉及。
  • 服务编排相关 初始化Flow API:context.flow(flowName) 入参:flowName表示Flow名称。 出参:Flow 示例: // 初始化Flow let _flow = context.flow("flowName") 设置Flow版本号 API:_flow.version(version: string) 入参:version表示flow版本号。 出参:Flow。 示例: // 设置Flow版本号 _flow.version("0.0.1") 运行Flow API:flow.run(params: Object) 入参:params,输入参数,如下示例: { param1: 'param1', param2: { param21: 'param21', param22: 'param22' } } 出参:Promise。 示例: // 适用于一次调用,Flow即完成的场景 // 运行Flow _flow.run({ param1: 'param1' }).then(function (res) { // TODO: Youre business logic }) 启动Flow API:_flow.start(params: Object) 入参:params,输入参数,如下示例: { param1: 'param1', param2: { param21: 'param21', param22: 'param22' } } 出参:Promise。 示例: // 以下适用于多步操作的业务场景 _flow.start({ param1: 'param1' }).then(function (res) { // TODO: Youre business logic }) 执行Flow下一步 API:_flow.next(interviewID: string, params: Object) 入参:interviewID为Flow运行实例ID,params为输入参数。 { param1: 'param1', param2: { param21: 'param21', param22: 'param22' } } 出参:Promise。 示例: // 下一步 _flow.next("{{ interviewID }}", { param1: 'param1' }).then(function (res) { // TODO: Youre business logic }) 返回Flow上一步 API:_flow.back(interviewID: string, params: Object) 入参:interviewID为Flow运行实例ID,params为输入参数。 { param1: 'param1', param2: { param21: 'param21', param22: 'param22' } } 出参:Promise。 示例: // 上一步 _flow.back("{{ interviewID }}", { param1: 'param1' }).then(function (res) { // TODO: Youre business logic }) 正常完成Flow API:_flow.finish(interviewID: string, params: Object) 入参:interviewID表示Flow运行实例ID;params:输入参数,如下示例: { param1: 'param1', param2: { param21: 'param21', param22: 'param22' } } 出参:Promise。 示例: // 完成Flow _flow.finish("{{ interviewID }}", { param1: 'param1' }).then(function (res) { // TODO: Youre business logic }) 恢复Flow运行 API:_flow.resume(interviewID: string, params: Object) 入参:interviewID表示Flow运行实例ID;params:输入参数,如下示例: { param1: 'param1', param2: { param21: 'param21', param22: 'param22' } } 出参:Promise。 示例: // 恢复Flow _flow.resume("{{ interviewID }}", { param1: 'param1' }).then(function (res) { // TODO: Youre business logic }) 删除Flow实例 API:_flow.terminate(interviewID: string, params: Object) 入参:interviewID表示Flow运行实例ID;params:输入参数,如下示例: { param1: 'param1', param2: { param21: 'param21', param22: 'param22' } } 出参:Promise。 示例: // 删除Flow _flow.terminate("{{ interviewID }}", { param1: 'param1', param2: { param21: 'param21', param22: 'param22' } }).then(function (res) { // TODO: Youre business logic })
  • 服务请求 调用服务的API API:context.service('{{url}}').run(_inputParams) 入参:“url”为服务接口的URL,在APP或者BO视图下单击“服务”,可查看到封装Flow、脚本或者对象操作接口的URL。“_inputParams”为输入参数。 示例: var _inputParams = {}; // 调用服务 context.service('{{ url }}').run(_inputParams).then(function(response) { // TODO: Your business logic });
  • BPM相关(原子级) context.$bp和context.$bpm的区别在于后者保证了操作的原子性。例如,调用context.$bp.submitTask (variables:object)数据提交成功时,会有弹框提示且点击“确定”按钮会自动关闭当前页面。而调用context.$bpm.submitTask (variables:object)提交时,只会提交任务而不会有后续的弹框提示等操作;并且当不在BPM上下文环境中提交任务时(即当BPM实例没有运行时提交任务),会有相关提示信息。 推荐使用context.$bpm。 获取参数信息 API:context.$bpm.loadVariables() 入参:无。 出参:参数对象。 示例: context.$bpm.loadVariables().then(function (data) { context.$model.ref("loanRequestData").setData(data.result.LoanRequestData); context.$model.ref("statusUpdates").setData(data.result.Status); context.$model.ref("negotiateCount").setData(data.result.NegotiateCount); }); 设置BPM中的变量 API:context.$bpm.putVariables (variables:object, instId: string) 入参:“variables”为参数对象,必选;“instId”为实例ID,可选。 出参:执行结果。 示例: context.$bpm.putVariables({ LoanRequest: "test" }); 数据提交到BPM API:context.$bpm.submitTask (variables:object) 入参:“variables”为参数对象,必选。 出参:无。 示例: var data = context.$model.ref("loanRequestData").getData(); context.$bpm.submitTask({ LoanRequest: data });
  • 模型相关 获取data model= model_1实例的数据。 API:$model.ref("model_1").getData() 设置data model= model_1实例的数据,入参data和model_1定义结构一致,当改变整个模型数据时使用。 API:$model.ref("model_1").setData(data) 设置data model= model_1实例的字段值,只改变已有模型数据某个字段值时使用。 API:$model.ref("model_1").setValue(field, value)
  • Tab页相关 仅支持平台的运行态使用,可使用portal框架暴露的API来实现,平台运行态会暴露一个 bingo 全局变量供使用,标准页面由于在 iframe 内,需要使用 window.parent.bingo 访问: 打开tab页,返回tabId。 API:openTab(name, url) 切换tab页。 API:switchTab(tabId) 关闭指定Tab页。 API:removeTab(tabId) 当前Tab页。 API:getCurrentTab() 默认Tab页。 API:getDefaultTab() 打开指定Tab。 API:open({type:'Tab', id: tabId}) 打开指定Tab。 API:openTabByMenuName(menuName) 返回上一个路由。 API:back()
  • BPM相关(非原子级) 获取参数信息 API:context.$bp.loadVariables() 入参:无。 出参:参数对象。 示例: context.$bp.loadVariables().then(function (data) { context.$model.ref("loanRequestData").setData(data.result.LoanRequestData); context.$model.ref("statusUpdates").setData(data.result.Status); context.$model.ref("negotiateCount").setData(data.result.NegotiateCount); }); 设置BPM中的变量 API:context.$bp.putVariables (variables:object, instId: string) 入参:“variables”为参数对象,必选;“instId”为实例ID,可选。 出参:执行结果。 示例: context.$bp.putVariables({ LoanRequest: "test" }); 数据提交到BPM API:context.$bp.submitTask (variables:object) 入参:“variables”为参数对象,必选。 出参:无。 示例: var data = context.$model.ref("loanRequestData").getData(); context.$bp.submitTask({ LoanRequest: data });
  • 其他 启动定时任务 API:context.timerTask(_timerHandler, _timeout, _executionCondition); 入参:分别是定时执行的业务逻辑、任务时间间隔、执行条件。 示例: // 任务间隔时间,毫秒 var _timeout = 1000; // 定时执行业务逻辑 var _timerHandler = function() { // TODO: Your business logic }; // 执行条件 var _executionCondition = function() { return true; }; // 启动定时任务 context.timerTask(_timerHandler, _timeout, _executionCondition);
  • 页面类 获取当前页面 API:context.$page.current 当前页面绑定的数据模型 API:context.$page.getModel() 页面URL参数 API:context.$page.params.paramName 示例: // 假设当前页面URL为:https://localhost:8080/besBaas/page#/std_1?a=1&b=2, 则获取URL参数方式如下: let paramA = context.$page.params.a let paramB = context.$page.params.b 在新的导航条打开页面 API:context.$page.open(url: string, queryString: string) 入参:url表示页面地址。queryString表示查询参数(URL参数),格式为“key=value”,多个参数用“&”符号连接。 示例: context.$page.open('https://localhost:8080/besBaas/page#/std_2', 'a=1&b=2') 在当前导航条打开页面 API:context.$page.load(url: string, queryString: string) 刷新当前页面 API:context.$page.reload() 在新的导航条打开标准页面 API:context.$page.openStdPage(pageName: string, queryString: string) 入参:pageName表示页面名称。queryString表示查询参数(URL参数),格式为“key=value”,多个参数用“&”符号连接。 示例: context.$page.openStdPage('std_2', 'a=1&b=2') 在当前导航条打开标准页面 API:context.$page.loadStdPage(pageName: string, queryString: string) 在新的导航条打开高级页面 API:context.$page.openAdvPage(pageName: string, websiteName:string, queryString: string) 入参:pageName表示页面名称。websiteName表示为高级页面的站点名称,queryString表示查询参数(URL参数),格式为“key=value”,多个参数用“&”符号连接。 在当前导航条打开高级页面 API:context.$page. loadAdvPage (pageName: string, websiteName:string, queryString: string) 关闭当前页面 API:window.close() 图2 关闭页面语句
  • 对象操作 获取对象 API:context.object(objectName) 入参:objectName,对象名称。 出参:对象。 示例如下: let _object = context.object("objectName") 查询对象所有数据 API: _object.query().then(function (response) { // TODO: Your business logic }) 查询满足条件数据 例如,查询满足name = 'test' 条件的对象数据,代码如下: let _condition = {conjunction: 'AND', conditions: [{ field: 'name', operator: 'eq', value: 'test' }] } _object.query({condition:_condition}).then(function (response) { // TODO: Your business logic }) 统计满足条件的对象数据数量 API:_object.count(_condition) 其中,“_object”为对象名称。 入参:_condition,查询条件,可选。 出参:Promise。 示例: // 统计所有数据 _object.count().then(function (response) { // TODO: Your business logic }) // 统计满足条件数据 _object.count(_condition).then(function (response) { // TODO: Your business logic }) 查询满足条件数据, 且只查询部分字段 let _fields = 'id,name' _object.query({condition:_condition}, _fields).then(function (response) { // TODO: Your business logic }) 查询满足条件数据, 且只查询部分字段, 支持分页和排序 例如,根据name字段降序排序,跳过前10条记录分页,每页最多显示10条数据。示例代码如下: let _fields = 'id,name' let _options= {'skip': 10,'limit': 10,'orderby': [{'field': 'name','order': 'desc'}]} _object.query({condition:_condition}, _fields, _options).then(function (response) { // TODO: Your business logic }) 通用对象数据查询 API:_object.query({condition:_condition}, fields: string) 入参:_condition,查询条件,可选,参考如下结构。 { conjunction: 'AND', // 条件连接符,AND 或 OR conditions: [ { field: 'name', // 条件字段 operator: 'eq',// 条件比较符 value: 'test' // 条件值 }, { condition: { // 嵌入条件 conjunction: 'OR', conditions: [ { field: 'status', operator: 'eq', value: '1' }, { field: 'status', operator: 'eq', value: '2' } ] } } ] } 以上示例表达内容为:name = 'test' && ( status = '1' || status = '2') fields:查询字段(只返回指定的字段),多个字段以逗号分割,可选。 出参:Promise。 插入对象数据,支持批量操作 API:_object.insert(data: Object[]) 入参:data,待插入数据,对象数组。 出参:Promise,返回新插入数据的记录ID。 示例: let data = [{ name: 'test', label: 'test' }] _object.insert(data).then(function (response){ if (response && '0' === response.resCode) { let _id = response.result[0].id}}) 根据记录ID更新对象数据 API:_object.updateByID(_id: string, data: Object) 入参:id表示记录ID,data表示对象更新内容。 出参:Promise。 示例: let _id = '{{ id }}' // 根据记录ID更新数据 _object.updateByID(_id, { label: 'test2' }).then(function (response) { // TODO: Your business logic }) 根据记录ID查询对象数据 API:_object.queryByID(_id: string) 入参:id表示记录ID。 出参:Promise。 示例: let _id = '{{ id }}' // 根据记录ID查询单条数据 _object.queryByID(_id).then(function (response) { // TODO: Your business logic }) 根据记录ID删除对象数据 API:_object.deleteByID(_id: string) 入参:id表示对象记录ID。 出参:Promise。 示例: let _id = '{{ id }}' // 根据记录ID删除数据 _object.deleteByID(_id).then(function (response) { // TODO: Your business logic }) 根据记录ID批量查询对象数据 API:_object.batchQueryByIDs(_ids: string, fields: string) 入参:ids表示记录ID,多个ID以逗号分割。fields表示查询字段,多个字段以逗号分割,可选。 出参:Promise。 示例: _object.batchQueryByIDs('id1,id2,id3').then(function (response) { // TODO: Your business logic }) 根据记录ID批量删除对象数据 API:_object.batchDeleteByIDs(_ids: string) 入参:ids表示记录ID,多个ID以逗号分割。 出参:Promise。 示例: _object.batchDeleteByIDs('id1,id2,id3').then(function (response) { // TODO: Your business logic }) 批量插入或更新对象数据 API:_object.batchUpsert(data: Object[]) 入参:data,待插入或更新的数据对象,包含id时表示进行更新。 出参:Promise。 示例: let data = [{id: '1538033158273005', label: 'test'}, {name: 'test', label: 'test'}] _object.batchUpsert(data).then(function (response) { // TODO: Your business logic })
  • 表单类 获取当前表单 API:context.$component.form 如果当前组件为表单,则直接返回。否则,根据组件上下文向上查找最近的表单组件。 根据组件Key值获取表单 API:context.getFormByKey(_formKey: number) 入参:表单组件的Key值,类型为number。 校验整个表单 API:_form.formValidate() _form为已获取的表单组件,返回promise。 API:_form. formValidateUnPromise 非promise,返回true/false。 表单的单字段校验: API:_form.validateField(prop, callback) 参数prop为需校验的属性,参数callback为检验完回调函数,返回错误信息。 示例: _form.validateField("name",function(errorMsg){ console.log("validate field", errorMsg) }); 表单重置 API:_form.resetFields() _form为已获取的表单组件。 表单提交 API:_form.formSave() _form为已获取的表单组件。API内部实现已先进行表单校验,校验成功后进行提交保存操作。
  • 表格类 获取当前表格 API:context.$component.table 如果当前组件为表格,则直接返回。如果当前组件有关联的表格,则返回对应的表格(如表格查询条件、分页等)。否则,根据组件上下文向上查找最近的表格组件。 获取查询条件 API:_table.getCondition() _table为已获取的表格组件,返回表格绑定的查询条件。 设置查询条件 API: // 先获取条件,再进行赋值 var condition = _table.getCondition(); // 字段满足单个条件,默认操作是contains condition.queryInfo = { "fieldName": "1" } // 字段满足单个条件,使用自定义操作 condition.queryInfo = { "fieldName": { operator: "contains", value: "1" } } // 字段满足多个条件 condition.queryInfo = { "fieldName": [{ operator: "contains", value: "1" }, { operator: "contains", value: "2" }] } // 分页条件 condition.pageInfo: { "pageSize": 10, "curPage": 1 } 其中,“_table”为已获取的表格组件。 入参:表格查询条件。 执行查询 API:_table.doQuery() 其中,“_table”为已获取的表格组件。 初始化行数据 API:_table.rowInit() 其中,“_table”为已获取的表格组件,初始化一条新的行数据,此方法执行后,数据并未添加到表格。 添加行数据 API:_table.addrow(newRowData: object) 其中,“_table”为已获取的表格组件,此方法将初始化好的行数据添加到表格,此方法执行后,数据仅在前端表格保存,并未持久化到后端。 入参:行数据。 获取表格当前选中的行数据 API: _table.getSelectedData() 其中,“_table”为已获取的表格组件。 删除表格行数据 API:_table.doDelete(rows: array) 其中,“_table”为已获取的表格组件。 入参:表格行数据列表。 示例: // 当前表格 let _table = context.$component.table // 获取当前选中的行 let rows = _table.getSelectedData() // 删除选中行 _table.doDelete(rows) 获取表格修改的数据(新增、修改、删除) API:_table.getOperatedData() 其中,“_table”为已获取的表格组件。 保存表格数据 API:_table.doSave(operatedData: object) 其中,“_table”为已获取的表格组件,此方法将当前表格做的修改操作进行持久化操作。 入参:修改的表格数据。 示例: // 当前表格 let _table = context.$component.table // 获取修改的数据 let operatedData = _table.getOperatedData() // 提交表格修改 _table.doSave(operatedData)
  • 脚本操作 初始化Script API:context.script(scriptName) 入参:scriptName,表示Script名称。 出参:Script 示例: // 初始化脚本 let _script = context.script('{{ scriptName }}') 运行Script API:_script.run() 入参:无。 出参:Promise。 示例: // 初始化脚本 let _script = context.script('{{ scriptName }}') // 运行脚本 _script.run().then(function(response) { // TODO: Your business logic })
  • 组件类 获取当前组件 context.$component.current 根据KEY获取组件 API:context.$component.get(_compKey: number) 入参:组件KEY,类型为number。 出参:Component。 示例如下: let _compKey = 1546395654403000 let _component = context.$component.get(_compKey) 根据名称获取组件 API:context.$component.get(_compName: string) 示例如下: let _compName = 'input_1' let _component = context.$component.get(_compName) 获取组件绑定的模型 API:_component.getDataModel() _component为当前操作的组件。 示例如下: let _component = context.$component.current let _model = _component.getDataModel()
  • 验证 单击界面上方的,进入预览页面,查看页面的展示效果,并验证以下功能: 在界面上单击“新增设备”,查看是否跳转到“编辑设备”页面,如未跳转,请检查事件代码中页面名称前缀是否是实际空间名。 检查“编辑设备”页面的“设备品牌”下拉框,“省市区”级联框的选项是否正确。 选项正确,则说明自定义模型、页面组件与模型绑定关系、以及页面on-load事件是正确的。 检查“编辑设备”页面(HW__editEquipment)的设备录入功能是否正确。 填写“设备名称”、“设备编码”等信息, 单击“保存”。 检查“设备管理”页面(HW__equipmentManage)是否包含新插入的数据。 如果查询结果页面显示新增数据,则说明新增功能以及页面的事件代码正确。 如果操作不成功,可以在页面事件脚本中增加debugger,使用Chrome 开发者工具 来调试定位问题。 检查“编辑设备”页面(HW__editEquipment)的设备修改功能是否正确。 单击一条记录后面的编辑按钮,查看是否跳转到“编辑设备”页面。 修改“设备名称”、“设备编码”等信息, 单击“保存”。 检查“设备管理”页面(HW__equipmentManage)当前设备记录是否更新。 如果查询结果页面显示更新数据,则说明修改功能以及页面的事件代码正确。 检查“设备管理”页面(HW__equipmentManage)的设备删除、查询、重置功能是否正确。 选中空白行或其他行,单击“删除”,验证删除功能是否正常,如果不能删除,请检查操作列“删除”按钮事件代码。 在查询区域分别输入“设备名称”、“地址”,单击“搜索”或“重置”验证查询电梯设备信息功能,如果不能查询或重置,请检查操作列按钮的事件代码。
  • 操作步骤 参考登录零代码工作台中操作,登录AstroZero零代码工作台。 在全部应用中,单击应用后的“...”,选择“编辑”,进入编辑应用页面。 单击表单栏左侧的,进入表单设计页面。 在“表单填报”页面,单击表单填报页后的,新建表单填报页,名称设置为“填报链接”。 选择新建的填报页面(填报链接),单击页面最右侧的“填报设置”,“填报模式”选择“单次填报”,设置“开始时间”和“截至时间”,并勾选“允许在截止时间前修改原提交记录”。 填报模式包括单次填报、多次填报和周期填报。其中,单次填报和多次填报用于限制用户填写次数,周期填报一般应用于每日打卡、填写周报等场景。 图1 设置新建填报页 单击“保存”,返回应用设计页面。 在页面左下方,单击新建的填报页面(填报链接),单击“分享”,并填写上报信息。 在数据统计页面,可查看到填写的信息,返回再次提交一份,可以看到统计页面仅保留一份最新的记录。
  • 审批 在流程设计页面,单击,选择“审批”。 图3 审批 设置审批参数。 图4 基础设置 审批人:设置审批人,默认为流程发起人。单击“指定人员”,可指定特定的用户或者动态审批人(流程发起人或者从表单中指定某个引用字段)作为审批人。 勾选“审批后抄送结果”后,审批通过或拒绝,都会将结果反馈给抄送人。 审批方式(多人审批):选择多个审批人时,需要设置审批方式。 或签:只需要审批人中的某一个用户完成了审批,即可推动任务流程,走向下一个任务。 会签:所有审批人都同意后,才可推动任务流程,走向下一个任务。 审批标题:设置审批页面的标题。 节点按钮:设置审批通过或拒绝时的界面按钮显示名称,按钮显示名称支持多语言配置。 开启暂存功能后,在发起流程页面,单击“暂存”,可暂存表单中数据。 图5 字段权限设置 可见:是否可见,当需要给审批人隐藏表单某些字段时,设置为不可见。 可编辑:是否可编辑。 摘要:是否将表单中的字段,作为摘要进行展示。 图6 高级设置 审批设置 开启批量操作:开启后在批量处理时,将忽略必填内容(必填字段、审批意见)等操作,请谨慎使用。 拒绝后,允许回退到指定节点:从当前节点向上回溯,回到上一审批节点或流程发起节点。设置回退节点后,在我的待办审批任务时,支持批量拒绝任务。 节点限时处理:为节点设置截止时间,到期后触发自动处理。 节点限时处理:设置节点处理截至时间,支持自定义时间、指定日期时间和指定表单内日期时间字段。 自动提醒:是否开启自动提醒,默认为关闭。 在节点处理截至时间当时、之前或之后发送提醒。 提醒内容:输入提醒内容,如请及时处理待办任务。 被提醒人:默认为节点责任人。 自动提交:是否开启自动提交,默认为关闭。 开启后,可以设置在节点处理截至时间当时、之前或之后自动提交。
  • 身份认证 KooMessage 提供的身份认证可以分为控制台和云服务两个层面: 控制台层面 您可以使用华为云用户名与密码登录,实现用户的认证与鉴权,未授权的不能访问。 云服务层面 您可通过开放的API网关,实现智能信息、智能信息基础版(视频短信)、服务号等能力的访问和集成,具体操作和描述请参考KooMessage服务的《API参考》。 KooMessage调用接口支持Token认证鉴权,请参考认证鉴权。
  • 责任共担 华为云秉承“将公司对网络和业务安全性保障的责任置于公司的商业利益之上”。针对层出不穷的 云安全 挑战和无孔不入的云安全威胁与攻击,华为云在遵从法律法规业界标准的基础上,以安全生态圈为护城河,依托华为独有的软硬件优势,构建面向不同区域和行业的完善云服务安全保障体系。 安全性是华为云与您的共同责任,如图1所示。 华为云:负责云服务自身的安全,提供安全的云。华为云的安全责任在于保障其所提供的IaaS、PaaS和SaaS类云服务自身的安全,涵盖华为云数据中心的物理环境设施和运行其上的基础服务、平台服务、应用服务等。这不仅包括华为云基础设施和各项云服务技术的安全功能和性能本身,也包括运维运营安全,以及更广义的安全合规遵从。 租户:负责云服务内部的安全,安全地使用云。 华为云租户的安全责任在于对使用的IaaS、PaaS和SaaS类云服务内部的安全以及对租户定制配置进行安全有效的管理,包括但不限于虚拟网络、 虚拟主机 和访客虚拟机的操作系统,虚拟防火墙、API网关和高级安全服务,各项云服务,租户数据,以及身份账号和密钥管理等方面的安全配置。 《华为云安全白皮书》详细介绍华为云安全性的构建思路与措施,包括云安全战略、责任共担模型、合规与隐私、安全组织与人员、基础设施安全、租户服务与租户安全、工程安全、运维运营安全、生态安全。 图1 华为云安全责任共担模型 父主题: 安全
共100000条