华为云用户手册

  • 初识BPM 在某个应用开发工作台中,将光标放在应用目录上之后,应用目录右侧会出现“+”,单击“+”,选择“BPM”,在“添加工作流”弹窗中,输入BPM的标签和名称后,单击“添加”,即可进入BPM设计界面。 图1 创建BPM 图2 添加工作流 BPM设计界面由上方按钮区域、左侧面板图元区域、中间画布工作区域和右侧属性配置区域四部分组成。 图3 BPM设计界面 表1 BPM设计界面说明 序号 分类 功能说明 1 按钮区域 功能按钮区域,包括锁定、解锁、启用(或者禁用)、保存、另存为新版本或者新BPM、运行、操作回退、撤销回退、启用流跟踪器以及切换版本的操作。支持快捷键操作,即可脱离鼠标直接用键盘操作。 2 面板图元区域 BPM的组成图元,详细介绍请参见BPM图元。 3 画布工作区域 BPM设计操作区域。在该区域可对BPM进行具体流程设计、组件放置。 选中图元或者泳道按“Delete”可进行删除操作。 4 属性配置区域 整个BPM、泳道(Lane)或者图元属性设置区域。 当选择BPM中图元时,右侧配置区域为该图元的属性设置区域。 当选择BPM中空白区域时,右侧配置区域为该BPM的设置区域。 当选择泳道左侧标签时,右侧配置区域为该泳道的属性设置区域。
  • 当前泳道 “用户任务”图元接收人类型设置为“当前泳道”,将泳道和工作队列绑定,则处于该泳道的用户任务图元,由该泳道对应工作队列中的成员去处理。工作队列中的成员可以是多个用户、业务用户、公共组中成员、角色或带有下属的角色中成员。配置过程如下: 参考管理队列,创建工作队列,将处理任务的用户或者业务用户加入工作队列中。例如创建派单员工作队列“Dispatcher”。 图2 创建工作队列 如图3所示,“用户任务”的接收人类型选择“当前泳道”,您可以将任务分配给“当前泳道角色的任意成员”或“当前泳道中的上一个任务被分配的人员”。 图3 用户任务中设置当前泳道接收 如图4所示,单击左侧泳道区域,在“泳道配置”中设置派单员工作队列“Dispatcher”。 处于该泳道的用户任务图元,则由工作队列“Dispatcher”中的成员去处理。 图4 设置泳道
  • 用户和业务用户 在进行任务分配时,AppCube平台提供了两种用户可以进行任务的分配,分别是用户和业务用户。 用户(User):是租户帐号或子帐号开发者,用来管理应用和业务用户。购买AppCube的租户帐号默认拥有所有权限,是管理员用户,可添加子帐号并为其配置需要的权限。 业务用户(即PortalUser):是访问在AppCube中开发的业务应用的用户帐号。即业务应用的使用者。 您可以在BPM中通过用户任务图元,在用户任务配置页面的“接收人”模块,通过以下三种方式将任务分配给用户或业务用户。 当前泳道。 流程发起人的主管 名称和表达式。 基于规则。 图1 接收人类型
  • 名称和表达式 “用户任务”图元接收人类型设置为“名称和表达式”时,通过以下三种方式分配该任务的参与者:“表达式”、“用户”和“组”。这时泳道中的工作队列配置不起作用。 图5 名称和表达式 用户:在“取值”中选择接收该任务的用户,不包括业务用户。 组:在“取值”中选择公共组,则该任务由公共组的成员去处理。公共组的成员可以是用户、业务用户、其他公共组的成员、角色或带有下属的角色中成员。关于如何创建工作组,请参考管理公共组。 表达式:当您将“参与者”配置为“表达式”时,实际是一个变量。在“取值”中可设置变量的值,变量值支持以下几种: 用户的用户名或用户ID,其中用户名前需要加“user:”前缀。 业务用户的用户名或业务用户ID,其中业务用户名前需要加“puser:”前缀。 公共组名称或者公共组ID,其中公共组名称前需要加“group:”前缀。 角色名称或者角色ID,其中角色名称前需要加“role:”前缀。 例如分配任务接受者为用户名为“PortalUser1”的业务用户、用户名为“User1”的用户、用户ID为“10XX000000XXXXXXX”的用户、公共组名称为“group1”和角色名称为“role1”的合集,则取值为“"puser:PortalUser1,user:User1,10XX000000XXXXXXX,group:group1,role:role1"”。多个取值之间用英文逗号“,”分隔,取值外加英文双引号。
  • 基于规则 “用户任务”图元接收人类型设置为“基于规则”时,您可以将全局上下文中的变量拖入到条件输入框中,当条件输入框中的变量或条件为true时,将会把任务分配给选择框中配置的用户。您可以通过以下方式配置接收任务的用户: 当前用户:把任务分配给执行当前用户任务的用户。 上级经理:把任务分配给执行当前用户任务的用户的上级经理。 特定的用户:把任务分配给选择框中选择的用户。 队列:把任务分配给选择框中选择的工作队列中的所有用户。 用户属性:根据用户对象的某一字段进行任务的分配。 变量:根据输入框中的用户ID或用户名将任务分配给相应的用户。 图6 基于规则
  • OAuth鉴权模式 使用OAuth客户端模式鉴权,AppCube服务会根据填写的OAuth的服务端地址、Client ID和Client Secret。在发送请求前后台自动获取第三放服务端的access_token, 并在发送请求时携带此access_token,服务端根据携带的access_token进行鉴权。 在创建或修改Rest服务时,可以设置鉴权信息。 图1 鉴权设置操作入口 图2 OAuth鉴权模式示例配置 父主题: 如何对接口鉴权
  • 如何调用第三方接口 在使用AppCube时,通常会调用第三方系统接口进行数据交互。针对常见Rest和SOAP协议,AppCube封装了Rest服务和SOAP服务连接器,使用这两种连接器,可以方便快捷的调用第三方接口,实现对第三方系统的数据增删改查。 调用第三方接口前,需要第三方系统有提供符合Rest和SOAP协议规范的API。 使用Rest服务调用Rest协议接口 使用SOAP服务调用SOAP协议接口 父主题: 集成开发
  • 如何对接口鉴权 通过Rest连接器只需简单配置即可实现方便快捷的调用第三方接口。但是为了保证接口调用安全,调用第三方系统开放的Rest接口,通常需要进行鉴权。目前Rest连接器集成了几种通用的鉴权方式。 鉴权协议支持OAuth、简单消息头和JWT(JSON Web Tokens)三种,此外还支持HTTPS双向认证鉴权。 OAuth鉴权模式 简单消息头鉴权 JWT鉴权模式 HTTPS双向认证鉴权 父主题: 集成开发
  • 调试过程 单击,输入参数后单击“运行”,运行服务编排。 在“输入参数”中输入如下参数: { "ownerId":"123", "limit":3, "offset":1} 检查输出页签的结果是否符合预期。 输出如下: { "interviewId": "002N000000P4ApgMJOM4", "outputs": { "resource": [ { "ownerId": "123", "resourceName": "Folder01", "status": "Waiting", "type": "Folder" }, { "ownerId": "123", "resourceName": "File02", "status": "Waiting", "type": "File" }, { "ownerId": "123", "resourceName": "Folder02", "status": "Waiting", "type": "Folder" } ], "totalCount": 100 }} 单击服务编排编辑器页面右上方“跟踪”,打开“服务编排跟踪器”页面。 可在“服务编排跟踪器”页面查看Flow执行的每一步的详细信息。 单击服务编排编辑器页面上方图标,启用服务编排。
  • 操作步骤 鼠标放在App下的Logic文件夹旁会出现加号,单击加号,选择“服务编排”。 系统弹出“添加服务编排”的对话框,请参见表3配置参数。然后单击“添加”。 图1 创建服务编排 表3 创建服务编排参数说明 参数名 参数说明 如何配置 创建一个新的服务编排 创建一个新的服务编排流程。 选中单选按钮选择“创建一个新的服务编排”。 使用已有的服务编排 基于同一租户或基线里已有的服务编排创建。 方便用户快速继承已有服务编排的配置,增加效率。 类型 服务编排的类型。 Autolaunched Flow:自启动Flow,在接口调用后会立即执行Flow模型定义的逻辑。 Event Trigger:事件触发的Flow,则会在事件触发时才会开始执行Flow模型定义的逻辑。 在下拉框里选择“Autolaunched Flow”。 标签 仅用于展示。 直接填写“GetResourveListFlow”。 名称 系统会自动在该名称前添加命名空间__。当其他功能调用服务编排时,调用的是服务编排的名称,而不是标签。 填完“标签”值后,单击该参数的输入框,系统会自动填充。 描述 服务编排描述信息。 选填项,建议填写服务编排的作用。 当编辑已有服务编排时,为防止编辑时多人篡改,编辑前请单击锁定服务编排。 创建该服务编排的入参和出参变量。由于该服务编排封装的是“ResourceListScript”脚本,则该服务编排的入参和出参的字段类型和字段名与“ResourceListScript”脚本保持一致。 此步骤需要创建如下变量。 表4 服务编排变量 变量类型 参数名 Data Type Input/Output Type 普通变量Variable ownerId text Input Only limit number Input Only offset number Input Only totalCount number Output Only 结构体变量Struct resource struct Output Only 在服务编排编辑器页面右侧选择。在私有结构体页面单击“新增”。 创建输出参数结构体类型变量“resource”前,首先需要创建私有结构体类型。 图2 添加私有结构体类型 设置页面参数。 在“基本信息”中输入结构体名字、描述信息。 在“结构体成员”中设置自定义成员变量,包括设置成员变量的名称、数据类型、是否必填、是否是集合、描述信息等。单击“新增”可增加成员变量。成员变量需要和“ResourceListScript”脚本中定义的出参“resource”成员变量(见表2)保持一致。 创建私有结构体后,您可创建私有结构体变量。 图3 配置私有结构体 在服务编排编辑器页面右侧选择。在全局上下文页面单击“对象变量”后的加号。 选择“私有结构体”,设置页面参数。 图4 配置私有结构体变量 表5 私有结构体变量参数说明 参数名 参数说明 如何配置 名称 该结构体变量名称,与“ResourceListScript”脚本中定义的出参命名保持一致。 直接输入“resource”。 私有结构体 该结构体变量类型。 选择刚创建的结构体类型名称“resourcestruct”。 默认值 变量的默认取值。 不用配置。 描述 该变量的描述说明。 选填项,建议填写该变量的作用。 是否为数组 是否为数组型变量即集合变量。 请勾选。 在服务编排编辑器页面右侧选择。在全局上下文页面单击“变量”后的加号。 单击新增变量后的“...”,选择“设置”。 图5 设置变量 配置普通变量“ownerId”。 图6 配置变量 表6 普通变量参数说明 参数名 参数说明 如何配置 名称 变量名称,必填。 直接输入“ownerId”。 数据类型 变量的数据类型。必填。支持以下几种。 文本 数字 货币 日期 日期/时间 复选框 从下拉列表选择“文本”。 默认值 变量的默认取值。 不用配置。 描述 该变量的描述说明。 选填项,建议填写该变量的作用。 是否为数组 是否为数组型变量即集合变量。 不勾选。 参考3.e~3.g步骤配置表4中其他普通变量。 在服务编排编辑器页面右侧选择,按照表4从全局上下文页面中拖拽参数到相应的入参和出参区域。设置服务编排的入参和出参。 图7 设置服务编排的入参和出参 拖拽“基本”下“脚本”图标至画布中,松开鼠标左键。 单击,如图8所示设置页面参数。将服务编排中的变量赋值给脚本中的输入参数,脚本中的输出参数赋值给服务编排中的变量。 图8 配置脚本 表7 脚本配置参数说明 参数名 参数说明 如何配置 脚本 调用的脚本名称。 只有在启用状态下同一应用工程内的脚本才能被服务编排调用。 选择“命名空间_ResourceListScript”。 输入参数/目标 脚本的输入参数名称。 在下拉框中选择输入参数的名称。 输入参数/源 服务编排中的变量,为目标赋值。 请从“全局上下文”中拖拽之前创建的服务编排输入变量。 输出参数/源 脚本的输出参数名称。 在下拉框中选择输出参数的名称 输出参数/目标 服务编排中的变量,脚本中的输出参数赋值给服务编排中的变量。请从“全局上下文”中拖拽之前创建的服务编排输出变量。 请从“全局上下文”中拖拽之前创建的服务编排输出变量。 若有多个输入参数或者输出参数,单击“新增行”进行添加。 连接所有元素。 单击,保存服务编排。
  • 前提条件 已创建名为“Approved Resource”的Object,用于存储资源数据。 该对象中需要包含如下字段。 字段标签 字段名称 (系统自动生成) 字段类型 取值 读写权限 是否加入界面布局 含义 ownerId ownerId__ CS T 文本 长度:255 全选 不勾选 资源拥有者ID ResourceName ResourceName__CST 文本 长度:255 全选 不勾选 资源名称 Type Type__CST 选项列表 枚举值如下: File Folder 全选 不勾选 资源类型 SubmitDate SubmitDate__CST 日期/时间 不涉及 全选 不勾选 资源提交时间 ApproveDate ApproveDate__CST 日期/时间 不涉及 全选 不勾选 资源审批时间 Status Status__CST 选项列表 枚举值如下: Waiting Submitted Approved 全选 不勾选 审批状态 已创建场景描述中的脚本。该脚本根据对象的数据生成资源列表数据,用于前台数据呈现。示例脚本为“ResourceListScript.zip”,单击下载链接可获取该脚本包。 该脚本中定义的入参和出参说明如表1和表2所示。 表1 入参说明 参数名 参数类型 说明 ownerId string 资源拥有者ID。 limit number 每页展示的资源条数。 offset number 每页展示第一条资源的偏移量,即从offset+1条资源开始展示。 表2 出参说明 参数名 参数类型 说明 resource struct 返回资源数组集合。 approveDate:审批时间,若该记录已审批则返回审批时间。 ownerId:资源拥有者Id。 resourceName:资源名称。 status:资源状态。若该记录未提交则为Waiting;若该记录已提交未审批则为Submitted;若该记录已审批则为Approved。 submitDate:资源提交时间。 type:资源类型。 totalCount number 资源总数(固定100)。
  • 什么是BO BO(全称Business Object)即商业对象,是封装了完整的数据模型、业务逻辑、页面展现的软件单元,一个BO提供一个完整场景的服务,为上层应用提供特定服务。不同用户可以开发各自的BO,在BO里创建逻辑使其具有特定的业务功能,开发好后制作成用户包并进行发布。下载用户包给其他用户,其他用户安装BO包后,在上层应用(需要使用该BO服务的应用)里导入发布好的BO,即导入特定的业务功能进行使用。 例如:设备BO,为上层应用提供对设备的统一语义,对设备自身能力进行抽象封装,不包含对设备的运营运维管理能力;告警BO,对园区的所有告警提供统一语义,从各个子系统和上层应用获取告警数据,统一模型统一展现;GIS服务BO,提供对GIS子系统的租户管理、地图管理、位置服务接口的封装和标准化接口。您可基于设备BO、告警BO以及GIS服务BO等多种BO资产,创建智能烟雾感应应用,完成设备数据的接入、处理分析以及告警监控功能。 父主题: 服务组件(BO)
  • 如何通过脚本控制接口访问权限 AppCube提供了示例自定义接口前置脚本,可以仿造示例代码进行脚本的编写。 图5 创建示例自定义接口前置脚本 您可以在自定义接口前置脚本中进行自定义的权限校验,并根据校验结果返回相应的result值。 export class Output { @action.param({ type: "Number"}) result: decimal.Decimal;} const PASS = decimal.newWithExponent(1, 0);const BANNED = decimal.newWithExponent(0, 0);const FALLBACK = decimal.newWithExponent(-1, 0); 自定义接口前置脚本输出参数result含义如下: PASS--{"result":1}:校验通过,直接放行。 BANNED--{"result":0}:校验不通过,无法调用。 FALLBACK--{"result":-1}:校验通过,但还需要进行后续权限校验。 开发自定义接口前置脚本时,出参可按照示例自定义接口前置脚本代码中的表达式也可自行定义,但必须确保出参为-1,0,1中的某一值,否则作为校验不通过处理。 单击左下角的“服务”,在服务管理页面,单击“编辑”,将校验方式改为“与脚本绑定”,在“前置处理”中选择相应的自定义接口前置脚本。 前置处理脚本:一般是授权处理脚本,在访问自定义接口前,需要进行授权处理。 后置处理脚本:一般是敏感错误信息或者统计日志处理脚本,后置脚本没有返回参数,无论执行成功或失败都不影响自定义接口的请求处理流程。 图6 自定义访问控制 图7 绑定自定义接口前置脚本
  • 操作步骤 需要使用该BO的用户参考如何安装已开发好的应用章节安装用户包。 在“项目”页签单击需要导入该BO的上层应用(需要使用该BO服务的应用),打开应用开发页面。 在应用开发页面下“External dependencies”目录树旁单击加号,选择“BO服务”。 若发布BO,编译设置的是源码包,在上层应用中导入BO时,可在“Internal dependencies”中进行导入,导入后,在打包上层应用时,“Internal dependencies”中的资产也会随应用打包发布出去。 在“添加BO”页签选择BO,单击“添加”,导入BO。 导入后,该BO会出现在上层应用中。后续,您可在应用中调用该BO中的服务。例如在标准页面的服务模型中调用BO中的服务编排,具体操作将会在“开发标准页面”章节进行介绍。 图1 导入BO 图2 调用BO中的服务编排
  • 补丁包发布步骤 参考 导入导出应用源码包,对App中部分组件进行设置打包。选中“组件”后,需要单击“详情”,在“可选组件”页面勾选需要设置的组件,单击“保存”再进行后续操作。 例如对应用中的某一个脚本进行打包: 参考应用发布主要流程,在应用开发平台左侧导航栏单击,选择“设置”,进入应用编译设置页面,设置只编译该脚本。 图1 设置编译组件 图2 勾选脚本 单击“保存”后,再发布即可。 在APP开发页面左侧单击,选择“编译”进行编译。 编译完成后,单击左下角,选择“我的仓库”,将应用程序安装包发布到当前租户的私仓。 发布成功后,即可在“资产包”下获取仅包含脚本的补丁包。 补丁包发布之后,可以参考如何安装已开发好的应用中的内容进行更新安装。
  • 前台页面常用调测方法 在高级页面的开发中,常借助浏览器内置的 开发者工具 对样式或功能问题进行定位和分析。下面,将以Chrome浏览器为例简单介绍浏览器开发者工具中常用调测方法。在Chrome浏览器中,按下“F12”或者“Ctrl + Shift + I”就可以开启开发者工具。 DOM和 CSS 样式调试 使用Elements面板,可以自由的操作DOM和CSS来迭代布局和设计页面。在开发者工具打开的状态下,使用左上角的箭头按钮,可点选页面元素,查看该元素DOM和CSS等。您可在Elements页签下修改页面上的元素的DOM标签或CSS样式并且修改立即生效,您实时查看修改后效果,这对于调试修改组件样式非常便捷。 图1 Elements页签查看调试DOM和CSS样式 打印日志信息 在Console页签下,可使用控制台打印日志信息。在Sources页签下,调试JavaScript时常用方法是将多个console.log()语句插入代码,重新加载页面后,可以在Console页签下控制台中看到打印的消息。Sources页签下,主要分为三个部分,左侧为页面请求文件列表,中间为选择文件的文件内容,右侧为JavaScript调试窗格。 想要在JavaScript中打印日志,需要找到相应文件,查找相关代码,然后插入console.log()。 图2 Sources页签布局 调用AppCube平台API 在Console页签下,可使用控制台调用AppCube提供的API,以获取相关信息进行调试。 断点调试 在Sources页签下,可以设置断点来调试JavaScript,使用断点,DevTools会在暂停时及时显示所有变量值。Chrome开发者工具提供多种断点,包括代码行断点、条件代码行断点、DOM断点和事件侦听断点等,您可根据调测的实际需求选择合适的断点。断点的类型和使用场景如表1所示。 表1 Chrome断点类型 断点类型 使用场景 代码行 在确切的代码区域中。 条件代码行 在确切的代码区域中,且仅当其他一些条件成立时。 DOM 在更改或移除特定DOM节点或其子级的代码中。 XHR 当XHR网址包含字符串模式时。 事件 在触发点击等事件后运行的代码中。 侦听器 在引发已捕获或未捕获异常的代码行中。 异常函数 任何时候调用特定函数时。 代码行断点调试是最为常见的断点调试方法,在Sources页签下,主要分为三个部分,左侧为页面请求文件列表,中间为选择文件的文件内容,右侧为JavaScript调试窗格。 设置代码行断点的方法是找到请求文件,您可在左侧请求文件列表按照目录查找,还可以借助“Ctrl+F”搜索关键词找到相关文件,在中间文件内容区域,找到要设置断点的代码行,单击行号,出现蓝色图标,这意味着这行代码上有一个代码行断点。如图3所示,在global_BubbleChartWidget.js文件的49行代码处设置了一个代码行断点。 刷新此网页,脚本运行始终会在执行此行代码之前暂停,可单击右侧调试窗格的按钮进行单步调试,或者单击调试窗格的按钮继续执行脚本。 图3 代码行断点示例 多终端测试 在进行页面自适应测试时,可以采用Chrome开发者工具提供的模拟移动设备的功能。借助此功能,您可无实物快速对网页进行多个终端测试。 单击按钮,可启动模拟移动设备界面,设备工具栏在打开时默认处于自适应视口模式,可以将视口大小调整为所需的任何尺寸,另外还可以选择多种终端型号,例如iPhone X、iPad等。 图4 模拟移动设备
  • 自定义高级组件调试 针对用户本地开发的高级组件,AppCube提供了Scaffolding脚手架工具,Scaffolding可帮助您快捷实现组件的新建、本地开发、调试、预览、发布、下载等主要功能。 Scaffolding打通了本地开发环境与AppCube开发环境,实现本地开发组件的实时在线调测,简化了本地开发组件后频繁的打包组件资产包上传至AppCube环境再查看页面显示效果的过程,可提升高级组件的开发效率。
  • 源码包与资产包对比 源码包和资产包都是应用发布类型,大部分的功能都是一致的,比如都分为全量和组件两种形式,都是按编译-发布的流程进行。目前来说,主要有以下几点不同之处: 不同的保护模式设置。源码包中的所有组件都不受保护和限制,其保护模式也无法进行设置修改,这些组件在安装后可以被自定义编辑修改。而资产包的大部分组件默认在安装后是不允许被修改的,甚至可以设置某些组件不可见,如服务编排,脚本等,可防止泄露源代码,保护知识产权。其保护模式能够在编译设置中进行修改。 二次开发与发布模式不同。源码包在开发环境中安装后允许再次进行打包发布,而资产包安装后无法二次打包发布。另外,源码包只能发布到“我的仓库”,而资产包主要用于发布到应用市场。
  • 如何导出源码包 可参考资产包的导出流程,导出和编译设置参数详情见 应用打包发布。 需先发布源码包,再下载源码包到本地(下载即是导出源码包),参见本节1。 发布源码包的步骤请参考如何将应用发布到“我的仓库”,只需步骤2修改为:在应用开发页面左侧单击,选择“设置”,在“编译设置”页面配置参数,选择“全量包”就是全量导出源码包,或者选择“增量包”设置成组件包,添加并勾选部分组件。其他设置编译,发布的步骤保持一致。 图4 编译设置:全量导出源码包 图5 编译设置-组件:部分组件导出源码包 类别中“租户级组件”指的是当前租户内(不分所属项目)所存在的组件。
  • 什么是应用包 轻应用或者行业应用开发完成后,应用需要编译打包,这种编译后的压缩包即应用包。 应用包类型 AppCube中编译打包的应用包类型有以下两种: 源码包:该类型包中的所有组件都不受保护和限制。在其他环境安装后可编辑包中组件,即在原有基础上可进行再开发。若后续其他用户在开发环境安装后,会显示在开发环境首页的“项目”页签下。 资产包:该类型支持设置包中的组件是否受保护。打包时不做编译设置,默认打出的包都是资产包,包中组件都为只读保护模式,将包安装到其他环境时,只能运行和预览。不可编辑包中组件。若后续其他用户在其他开发环境安装资产包后,应用会显示在开发环境首页的“库”页签下。 应用包类型的详细,请参见本节中的源码包与资产包对比。 软件包环境 图1 环境介绍 AppCube分为开发环境,沙箱环境和运行环境三个部分。详细信息请参见开发环境/沙箱环境/运行环境。 开发者在开发环境开发应用和BO,开发完成后生成对应的软件包。 发布软件包到沙箱环境中进行测试。 测试通过后发布安装到生产环境实际运行和维护。 仅专业收费版本支持沙箱环境和运行环境,免费版本无沙箱环境和运行环境权限。 软件包制作 应用或BO创建完成后,平台会同步创建同名的软件包。 对应用和BO内的组件进行增删查改都会同步反映到软件包中。 开发者也可以在编译设置中对软件包和其中组件的属性进行修改。
  • 如何快速区分源码包与资产包 在开发环境中,应用开发开发工作台里可区分源码包和资产包。 开发环境,沙箱环境和运行环境具体说明请参见开发环境/沙箱环境/运行环境。 图2 资产包和源码包位置 另外,在沙箱或运行环境中安装资产包和源码包后,在packageinstall表中看managed字段的值,true是资产包,false是源码包。如何使用控制台查看可参见使用控制台分析查询SQL。 图3 控制台中查看packageinstall
  • 什么是沙箱 沙箱环境(Sandbox)是与开发环境隔离的环境,用户可以在沙箱环境中进行软件测试,也可在开发环境直接进行测试。沙箱是一种特殊的执行环境,能够在不破坏生产环境的情况下测试更改或更新应用程序。AppCube提供了创建沙箱环境功能,您可根据需要决定是否使用沙箱环境。 在沙箱环境只能进行测试,不具备开发能力。沙箱环境只拥有开发环境的元数据副本,没有数据记录。登录沙箱环境后,可以增加新的沙箱用户,并设置用户密码。新增用户只在沙箱有效,并且只能访问沙箱环境。
  • 什么应用代码可以保护 应用包类型有资产包和源码包两种,仅资产包可设置是否受保护,源码包不受保护。 参考应用打包发布,选择“资产包”发布的应用包,包中组件可设置是否受保护。选择该项后,您需要配置版权信息(可选)、描述(可选)、每个组件的保护设置(必选。配置为未受保护或者只读保护)。 三种类型保护模式:未受保护、只读保护和不可见保护。相当于Linux下的三种保护模式,即可读可写可执行(RWX)、不可写(RX)和仅可执行(X)。
  • 什么是实例化数据包 实例化数据是应用需要自带的预设数据,用于支持应用的默认行为。 在AppCube平台中,实例化数据包是由以下三种类型数据的整体或部分构成的数据压缩包: 系统对象数据。AppCube系统定义的实例化数据主要是用户在开发应用过程中平台产生或用户使用平台功能生成的,在应用安装完成后能够进行配置的数据。 标准对象数据。AppCube平台内部自带的或第三方提供的标准对象数据,标准对象实例化数据包括了平台内置的(例如Account、Contact)以及订购了基线应用所提供的对象的实例化数据。 自定义对象数据。由用户通过建立自定义对象,并通过界面或接口生成的记录数据。 应用在发布时,包含一些初始化的数据,可通过进入App视图在左侧菜单栏下方单击或者进入管理台单击右侧图标,使用SQL语句查询对象及对象的数据,详情可参考使用控制台分析查询SQL。
  • 如何导入导出数据 实例化数据可以通过AppCube平台的“数据导出”功能,以对象的方式导出到本地;安装实例化数据可以通过平台的“数据导入”功能实现。 数据导入导出的具体操作,请参考如何导入导出数据。 数据修改后,升级没变化:不是同一条数据,即ID不一致。 对象存在,但数据导出里面找不到该表:开发界面里对象属性“允许API批量访问”未勾上。 报错“parsing request parameters content of JSON failed: 'record'”:表中存在lookup/masterdetail类型的字段,该字段的值必须为id,不能是普通的值。 报错“file server exception, receive response failed, TrackerTask RecvHeader recv resp status 28 != 0”:文件服务器异常,需要咨询运维处理。
  • 自定义OAuth2授权码模式接入鉴权 配置OAuth管理中介绍了第三方系统访问AppCube时,如何配置接入鉴权,通过鉴权认证的第三方系统才可访问AppCube。在AppCube中开发的应用也可以通过自定义OAuth2授权码模式接入鉴权,当应用配置鉴权后,只有通过鉴权的第三方系统才可访问应用。 参考配置OAuth管理中操作,获取鉴权ID“client_id”和鉴权密钥“client_secret”。 在新版应用设计器的集成中,开发者通过自定义接口,给第三方接入调用,用于第三方系统获取授权码code。 应用调用脚本API,判断第三方客户端的鉴权ID“client_id”和重定向地址“redirect_url”是否和注册接入鉴权时匹配。 如果匹配,则由平台应用自定义接口,实现登入跳转和授权跳转。在授权完成后,再调用脚本API获取授权码code,并将需要展示给第三方的授权用户信息,通过该API传给AppCube,AppCube会返回一个code,然后应用重定向到“redirect_url”,并携带code。 判断第三方客户端的鉴权ID“client_id”和重定向地址“redirect_url”是否和注册接入鉴权时,匹配的API样例如下: // Here's your code.import * as oauth from 'oauth'let handle = oauth.getAuthorizeHandle()let clientDatas: oauth.clientDataFromApp = { redirect_uri: "http://10.26.30.68:14000/appauth/code", client_id: "bff4398905ee4a918722debec98b594c",}let pass = handle.checkURL(clientDatas)console.log(pass) //trueif (pass){//判断是否登入,做登入跳转//判断是否授权,做授权跳转} 获取授权码code的脚本API样例如下: // Here's your code.import * as oauth from 'oauth'let handle = oauth.getAuthorizeHandle() //前面步骤已经走完let clientDatas: oauth.clientDataFromApp = { redirect_uri: "http://10.26.30.68:14000/appauth/code", client_id: "bff4398905ee4a918722debec98b594c",} let userInfo = { "name": "jack", "phone": "1256287222", "email": "dsfsdf.com"} let code = handle.getAuthCode(clientDatas, userInfo)console.log(code) //WEUcqXbeQDKUHxcn8til3Q 第三方系统接收到该请求,并解析出code后,在自己的后端访问AppCube接口获取access_token,其步骤和配置OAuth管理中一致。 第三方系统在获取到access_token后,使用该凭证访问平台“https://AppCube域名/u-route/baas/oauth/v1.0/third/userinfo”接口,来获取授权用户的信息。 响应示例如下: { "resCode": "0", "resMsg": "成功", "result": { "email": "dsfsdf.com", "name": "jack", "phone": "1256287222" }}
  • 相关操作 (可选)设置字段访问权限。 默认批量创建自定义字段后,所有权限Profile都会添加批量导入自定义字段的访问权限。若需要单独设置某些字段的访问权限,请执行该步骤。 单击自定义字段列表中的具体字段名,进入自定义字段详情页,单击“设置字段级权限”,可单独设置字段的访问权限,即哪些权限Profile可以查看或修改该字段。 图16 单击字段名 图17 设置字段级权限入口 图18 设置字段级权限 (可选)将对象字段添加到对象的页面布局: 默认批量创建自定义字段后,所有自定义字段都会显示在布局页面。若需要修改对象页面布局中字段,请执行该步骤。 在对象配置页面选择“布局”页签,单击“visitorlnfo Records”,进入对象布局页面后,选中页面中的表格组件,可在布局页添加或者删除字段。 图19 进入布局页 图20 添加或者删除字段
  • 操作步骤 登录AppCube开发环境,进入一个已创建好的应用。 创建一个自定义对象“visitorlnfo”。 在一个应用目录上,例如“Model”,单击 “+”,在弹出菜单中选择“对象”。 图1 创建对象 输入对象的标签为“visitorlnfo”,单击名称系统会自动生成该值,单击“添加”。 图2 设置对象名称 实际创建的自定义对象将会自动拼接命名空间前缀,以及对象标识后缀,即“CNAME__visitorlnfo__CST”。对象创建后,仅包含一些内置的标准字段,您可以继续以下步骤使用模板批量创建自定义字段。 下载对象字段模板: 在已创建的对象中,选择“自定义字段”页签,单击“批量创建”,然后单击“下载模板”,将字段模板Excel下载到本地。 图3 下载模板 在本地打开上一步下载的字段模板,单击左上角“启用内容”启用宏。 图4 启用宏 打开字段模板后,需要先单击“启用内容”,启用字段模板中的宏。如果不启用宏,字段模板将不校验字段属性,影响您使用。 您如果初次使用请在“Note”页签阅读字段模板说明,其中包含命名空间配置。“Example”页签提供了字段批量定义示例。 图5 模板说明 使用字段模板创建字段。 在表底部,选择“Data”表进入字段编辑页面。 图6 进入Data表 创建字段即在“Data”表中,填写各字段属性值,包括字段类型、标签、名称、数据长度以及默认值等,其中必填项单元格表头会有红色*号,背景置灰的单元格无法填写。 选中C列表头,显示当前列为“数据类型”。C列用于设置字段类型,设置字段类型后,不是当前字段类型的其他属性将会置灰。 图7 查看C列标题中文描述 单击C列第一行,在下拉选项中,选中您的第一字段“CNAME__matter__CST”的字段类型为“Text Area”。 图8 设置字段类型 分别在A列设置字段的标签、在B列设置字段的名称,其中B列值需要唯一,即字段名不能重复。A列可以为中文,B列为字段名称不能是中文。 图9 设置字段标签及名称 A列B列分别对应AppCube中自定义字段的标签、名称。 图10 AppCube自定义字段 单击必填列的列名,查看该列属性值的中文描述,然后依次设置当前字段的其他属性值。 图11 设置字段属性值 设置完成后,保存表格。 实例模板可单击下载链接另存到本地解压获取,供您体验导入一个对象字段模板使用。 本步骤实例模板“字段类型中英文对照及说明”页提供了字段类型中英文对应关系及字段类型说明。 图12 字段类型说明 在AppCube中批量导入对象(例如visitorlnfo)的自定义字段。 在对象配置页面选择“自定义字段”页签,单击“批量创建”,选择“批量导入字段”。 图13 进入自定义字段页面 在弹窗中拖入编辑好的字段模板,单击“确定”。 图14 拖入字段模板 导入字段模板成功后,系统会自动批量创建已定义好的所有字段。自定义字段列表将如下图所示。 图15 导入后的字段
  • 如何使用错误码 系统支持对错误码信息进行多语言国际化配置。您可以通过配置错误码,实现根据用户使用的语言不同将错误码信息进行不同的展示。 自定义错误码。 在App视图下左侧菜单栏下方选择“配置”,在打开的页签选择“自定义错误码”。 配置“显示名称”,该名称将会显示在运营配置页签。 单击“新建”。 您也可单击“导入”,选择系统中已创建的错误码进行导入。 参照表7配置错误码参数,单击“保存”。 图7 新建错误码 表7 错误码参数说明 参数 参数说明 名称 客户自定义的错误码。建议以字母打头。 包括命名空间,长度不超过64个字节。 系统根据“名称”和“语言”匹配错误码进行展示。请保证“名称”+“语言”唯一。 类别 该错误码所属的分类。 Http状态码 Http协议状态码。 语言 请根据实际情况从下拉列表中选择语言类型。目前支持中文、英文、西班牙语、法语和缅甸语。 单击“新增”支持创建多语言错误码。 单击语言后的“?”显示:请在翻译工作台中添加支持的语言。单击“翻译工作台”可跳转至翻译工作台配置页面。 格式 错误码信息描述。在描述中,可以用{Number}表示变量名。例如 {0} 表示第一个输出变量,{1} 表示第二个输出变量,以此类推。 长度不超过255个字节。 创建脚本。 在脚本中调用抛出错误信息的error函数I18nError('ErrorCodeName','变量1','变量2')。该函数中输入参数为错误码名称"t__testErrorCode"和错误码信息中所携带的变量("val1"和"val2")。 // test custom error func , get diff language error by user langimport * as error from 'error';export class TestDemo { @action.method({ label: 'test', description: 'error code', input: 'No input', output: 'No output' }) public test() { //使用I18nError函数设定错误码和错误码信息携带变量 throw new error.I18nError('t__testErrorCode', ["val1", "val2"]); }} 按照如何定义API接口中的步骤绑定上述开发的脚本,进行测试,最终根据用户使用的语言返回相应语言的错误信息。 图8 自定义错误信息测试
  • 自定义OAuth2授权码模式接入鉴权 前面介绍的是第三方系统访问AppCube时,如何配置接入鉴权,通过鉴权认证的第三方系统才可访问AppCube。 在AppCube开发的应用也可自定义OAuth2授权码模式接入鉴权,当应用配置鉴权后,只有通过鉴权的第三方系统才可访问应用。 参考1~4获取鉴权ID“client_id”和鉴权密钥“client_secret”。 在应用开发界面,开发者通过自定义接口,给第三方接入调用,用于第三方系统获取授权码code。 平台应用调用脚本API,判断第三方客户端的鉴权ID“client_id”和重定向地址“redirect_url”是否和注册接入鉴权时匹配。如果匹配,则由平台应用自定义接口,实现登入跳转和授权跳转。在授权完成后,再调用脚本API获取授权码code,并将需要展示给第三方的授权用户信息通过该API传给AppCube,AppCube会返回一个code。然后应用重定向到“redirect_url”,并携带code。 判断第三方客户端的鉴权ID“client_id”和重定向地址“redirect_url”是否和注册接入鉴权时匹配的API样例如下: // Here's your code.import * as oauth from 'oauth'let handle = oauth.getAuthorizeHandle()let clientDatas: oauth.clientDataFromApp = { redirect_uri: "http://10.26.30.68:14000/appauth/code", client_id: "bff4398905ee4a918722debec98b594c",}let pass = handle.checkURL(clientDatas)console.log(pass) //trueif (pass){//判断是否登入,做登入跳转//判断是否授权,做授权跳转} 获取授权码code的脚本API样例如下: // Here's your code.import * as oauth from 'oauth'let handle = oauth.getAuthorizeHandle() //前面步骤已经走完let clientDatas: oauth.clientDataFromApp = { redirect_uri: "http://10.26.30.68:14000/appauth/code", client_id: "bff4398905ee4a918722debec98b594c",} let userInfo = { "name": "jack", "phone": "1256287222", "email": "dsfsdf.com"} let code = handle.getAuthCode(clientDatas, userInfo)console.log(code) //WEUcqXbeQDKUHxcn8til3Q 第三方系统接收到该请求,并解析出code后,在自己的后端访问AppCube接口获取access_token,其步骤和6一致。 第三方系统在获取到access_token后,用该凭证访问平台“https://AppCube域名/u-route/baas/oauth/v1.0/third/userinfo”接口(注意,该接口和8中的接口不同),来获取授权用户的信息。 响应如下: { "resCode": "0", "resMsg": "成功", "result": { "email": "dsfsdf.com", "name": "jack", "phone": "1256287222" }}
共100000条