一行代码没有AppCude开发聊天机器人并讲解知识与体验 | 【AppCude X WeLink双剑合璧】

龙哥手记 发表于 2022/03/10 20:11:11 2022/03/10
【摘要】 活动作品

摘要:亲自入门IT圈最近很火AppCude这款产品,你可能要问是个啥?可以理解成一个专业的低代码应用开发平台。这下你明白了吧,哈哈就是偷男的,不是,是用来偷懒的哈哈。其实也不是因为有些工作其实重复度太高,轮子直接拿来用,去做业务需要的编码不是挺好的吗?

回归正题,本文是带你踩坑的,使用 AppCude 开发健康打卡,并了解其中知识与体验,记得要交三连当做学费了

AppCude是什么

翻译过来就是应用魔方,源自华为应用开发和数字化转型的产物,能提供了云上无码化、低码化、支持多码化的应用开发模式,底层屏蔽了技术的复杂性,提升了企业开发的效率。同时提供应用资产的开发标准和微服务框架,助力企业不断沉淀可复制的套件,加速应用的定制,这段你听着乐,明白意思就行。

🛠 一 熟悉AppCude

废话少说,搜索进入它的控制台

如果不想花银子,你可以点击右边的免费试用,它会在你的控制台创建一个实例,点下详情,信息很全面,不过跟服务器哪些差远了,不过下面哪些陌生名词不懂可以到帮助文档查下,这些简单的我就不说了。


展示的是它首页,如果是小白,建议你先看下平台概览,学习下应用有哪些类型,开发流程,以及编译发布与安装部署这些基础知识,再来下一步学习操作。

文档直达:https://support.huaweicloud.com/usermanual-appcube/appcube_05_0000.html

现在是默认你已掌握上述,咱们就进入正式的环境中,点轻应用,我们这选健康打卡作为此次演示模板,进入之后可能要填公司的简单信息。系统不会限制你,随便填点保存。


然后你看看到一个编辑页,也许觉得里面不是密密麻麻的代码并不是,他只会让你简单的选择。如果想看代码点击下方的事件视图,可以看不过你不能修改你必须的获取锁,本文重点不是讲代码,而是有哪些好的功能用,坑帮你踩。

我们先大致认识它怎么办呢,点击资产你会发现一个app它是由对象,模型,逻辑与报表以及页面这些选择性组成。先来看对象,它是一种制订对象是给应用的特定数据用。

不懂,举个例子

选个Model的第二个自定义对象,叫datalong__jiankan_healthPunch__CST,看下它的意思是啥子,对象的这些属性就是代表具体含义,比如“您是否去过或经停湖北任意一个地方(含自驾、火车等交通工具)?”对应datalong__VisitedSomeWhere__CST这个字段,这下明白了吧。

当然你还可以对字段更加细分的去设置,节约篇幅,用红色标出。大家有兴趣去试试感受下这个操作。

关于这个对象我还想说一个容易忽略的点就是布局这个东西,你觉得这个布局有什么难的?逻辑不难,难在细节处。下图的页面布局容易让人理解,你也可以进入里面单独设置页面的布局,这个比较简单。但是这个权限集怎么理解呢?

是这样的

🎯 二 混淆的知识

你没有搞明白账户与权限的关系是什么

帐号

首先说它,您首次用华为云时注册的帐号,该帐号对其所拥有的资源及云服务具有完全的访问权限,是根,可以重置用户密码、分配用户权限等。由于帐号是付费主体,为了确保帐号安全,建议您不要直接使用帐号进行日常管理工作,而是创建用户并使用他们进行日常管理工作保证安全。

用户(User)

创建出来的是用户,是华为云帐号在AppCube中添加的IAM用户或WeLink用户,可升级为应用的开发者。用户信息存储在User表中。

说明:
使用AppCube前,请参照了解我的当前帐号中操作查看当前登录帐号所具备的权限。

下方添加用户为开发者

业务用户(PortalUser)

还有种业务用户是指访问在AppCube开发的应用的用户帐号,说白了是应用的使用者。业务用户的信息存储在AppCube的标准对象PortalUser中,听不明白直接上图。

思考个问题:如何判断是用户还是业务用户呢?

例如,在AppCube中注册了帐号“A”,并使用帐号“A”在AppCube中开发了一个应用“X”。帐号“B”是通过应用“X”注册的帐号,并登录使用应用“X”。这种情况下,帐号“A”是用户,帐号“B”是业务用户,这下你明白了没。

下面是AppCube中用户行为变化

权限配置

前面我们已经用过对象的布局去配置权限,但是敢肯定你一定很懵,这写的啥?

简单描述权限配置(Profile)来控制用户、业务用户等的操作权限。AppCube当前预置了如下几种Profile标准配置文件吧

  • System Administrator Profile:系统管理员,拥有AppCube全部权限。
  • Developer Profile:开发者权限,一般给用户使用,拥有此权限的用户可以在AppCube进行开发,例如新增一个对象、为对象增加一个字段、新增一个流程等。
  • Portal User Profile:业务用户的权限,一般给业务用户使用,拥有此权限的业务用户可以通过服务编排鉴权登录AppCube。
  • Anonymous User Profile:游客用户的访问权限,拥有此权限的游客可以访问AppCube中创建的应用。请根据自身业务需求,给Profile分配适当的权限。
  • Standard User Profile:运行态权限,开通AppCube服务时自带的权限,拥有这个权限可以运行系统中的流程、对系统已有对象进行记录的增删改查操作,但没有开发权限,如新增一个对象或新增一个流程等。

业务用户权限如下演示

游客用户访问权限如下演示

除了默认的权限配置外,用户还可以在默认权限配置的基础上,自定义权限配置,具体操作请参见新建扩展权限集,就不用多说。

再说下工作队列

它是用来记录一类具有相同权限和任务对象的成员集。当需要批量处理同一类用户权限时,可以通过创建工作队列来实现,它给业务用户在业务流转过程中,区分不同的权限。

工作队列支持以下功能:

  • 绑定一个或多个对象。若工作队列绑定了对象,涉及这些对象的用户任务(例如审批流)将会投递到该队列成员进行处理。

  • 可以给工作队列配置一个公共邮箱,用于接收公共通知邮件。

  • 可以给队列成员发送邮件。

  • 在BPM中为泳道指定某个工作队列,此工作队列中全部用户都可以操作此泳道的流程。

还有业务权限凭证

业务权限凭证用于控制接口的访问权限,AppCube提供了配置权限脚本和配置API接口两种方式来控制API接口的访问权限。建议优先通过权限脚本进行权限验证,根据脚本的返回值判断下一步的操作。

对于配置了业务权限凭证的接口,需要在权限的“业务权限凭证”页签中接入相应的业务权限凭证,才可调用API接口。

  • 若用户(User)没有配置业务权限凭证,则继续校验Profile权限中的数据权限(例如执行服务编排、执行脚本、对象的增删改查、API读、API写权限)。
  • 若业务用户(PortalUser)没有配置业务权限凭证,调用接口直接报错,不会继续校验Profile权限中的数据权限。
  • 对于未配置业务权限凭证的接口,则需要查看内置系统参数“bingo.permission.customapi.check”取值,该参数控制公共接口未绑定业务权限凭证时的逻辑。
  • 若该参数取值为“是”,公共接口未绑定业务权限凭证时,业务用户(PortalUser)无法访问该接口;对于用户(User),则继续校验Profile权限中的数据权限。
  • 若该参数取值为“否”,公共接口未绑定业务权限凭证时,业务用户(PortalUser)可直接访问该接口,无需鉴权;对于用户(User),则继续校验Profile权限中的数据权限。

例如:内置参数bingo.permission.customapi.check配置为“是”,接口未绑定业务权限凭证,即使在权限设置中勾选“API读”与“API写”权限,业务用户也无法操作对象数据。若业务用户需要操作对象数据,请将该内置参数配置为“否”。

查看和配置该系统参数的方法为:在AppCube管理中心选择“系统管理 > 系统参数”,在“内置系统参数”查看和配置该参数。

下面是内置系统参数设置

角色很好理解,是某类用户的集合,更多场景指向部门组织结构,如CEO、经理、员工等,角色之间可以有上下级关系。

还有个扩展权限集

扩展权限集可以指派给用户或者权限Profile,在权限Profile详情页的“扩展权限集”页签中可添加扩展权限集。

举个例子,用户A和用户B拥有一样的权限Profile时,若需要给A和B设置不同的权限,又不希望更改权限Profile,可通过设置扩展权限集来区分用户A和用户B的权限。

一种权限配置可分配给多个用户,但每个用户只能属于某一个权限配置。
以新建普通业务用户权限“csProfile”为例进行介绍。在后续有新的业务用户注册时,只需要将业务用户配置上“csProfile”,即可获取该权限配置中的权限。

🕹 三 做脚本实验

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

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

  • 1.登录到AppCube开发环境,在首页“项目”下“我的应用”中,单击一个应用,进入该应用开发工作台。
  • 2.创建一个脚本操作的对象ApprovedResource:
    a 将光标放在一个存放对象的应用目录(例如Model)上,单击,选择“对象”。
    b 在弹窗中,输入对象的“名称”、“标识”为“ApprovedResource”,单击“添加”。
    c 导入字段模板,创建字段模板。请单击import-fields-template.zip下载并解压获取“import-fields-template.xlsm”,将待导入字段模板到本地。
    d 单击当前对象的“自定义字段”,然后单击“批量创建”后的,选择“批量导入字段”,选择上一步下载的字段模板。导入完成后,刷新页面,重新进入对象的“自定义字段”,即可查看已导入的字段。

下面是如何导入自定义字段

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

下面是如何新增脚本

下表是脚本参数说明

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

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);
            context.setError(error.name, error.message);
        }

    }
}

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

  • a.单击编辑器上方执行图标。
  • b.在页面底部“输入参数”页签输入请求报文,单击测试窗口右上角图标。

{ 
   "ownerId":"123", 
   "limit":3, 
   "offset":1
}

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


{
  "http-header": {
    "header1": "value1"
  }
}

c.检查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
}

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

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

上面把容易混淆的知识在掌握一下

⛑ 四 创建机器人

实例进入开发环境,前面我们介绍了轻应用比较容易混淆的但有特别重要的知识点,这次从实战不写一行代码教你创建聊天机器人,如图所示;

如何配置呢,选择模板,然后给咱们机器人命名,简单的写下对它的描述,最后你应该选一个比较稳定的版本创建,咱们的场景是,你在外地出差,需要通过小甜安排明天10.00的研发部例会,过程中需要很多的要素。

进入控制台后感觉代码好多,不用担心咱们这是低代码平台。首先把左上方的锁释放掉,然后再中间填写对应的内容,最后可在右侧消息预览进行展示;

然后经过咱们自定义的修改,具体功能与描述如图所示,自定义卡片的内容是什么,还可自定义它的功能菜单及如何对消息如何发送出去到你手机。

消息回落也叫消息发送

  • 回落为RCS消息:意思是多种媒体形式融合的通信方式

  • 回落为系统短消息:下面个给手机发短信
    然后你在外地,需要及时显示你的位置信息,方便其他的同学了解这个咋办呢?模板里集成了高德API,获取昨天,列表填入对应信息就可以。


    那你可能要问了这些列表的代码去了哪里了呢?没错,

下一个要掌握的是数据接入,你可能不明白啥意思。通俗的讲,是平台提供的可以帮助您快速构建数据接入规则并标准化事件的工具而已,比如下面这样

接收到的5G消息数据通过内存通道可到达KafKa这种消息队列做存储,这只是其中一个例子。你的输入源可以是华为设备IoTDA,中国移动OneNET等,而输出源你可选择ROMA等;

但是并不能满足,大部分的业务需要,所以你可自定义;首先点击灯泡后,对每个值进行修改成自己的;

搞懂什么是服务编排

它是一种通过简单的拖拉拽式流程编排以及参数配置的方式来进行服务开发的能力,并支持对已开发的服务重新进行组合编排。用户能够在服务编排编辑器内以图形化编排的形式快速地进行服务的开发并扩展出更丰富的业务功能,同时能够与API接口进行绑定,以API的形式对外提供服务。

那为什么使用服务编排?

通过服务编排,可以把已实现的脚本、服务编排等功能进行复用,只需要进行图形化编排以及相关参数配置,即可针对您自己的独特业务需求并以流程的方式将业务需求所要实现的功能展现出来,甚至不需要有任何编程经验即可完成服务的开发,降低了开发难度提高了开发效率。

比如说根据查询到的呼吸机资源数据判断资源是否充足,并修改相关资源信息。

实现方案:提前创建好呼吸机资源对象Respirator,使用服务编排实现上述场景功能。实现逻辑如下:

  • 首先需要通过循环图元对传入的数组对象变量RespiratorInfos(即空闲状态下的呼吸机资源数组)进行遍历,并将数组中的每个元素放置到对象变量RespiratorInfo(空闲状态下的呼吸机资源数组元素)中。
  • 通过“赋值”图元设置参数:将当前遍历的对象变量元素添加到此次申请的原始呼吸机资源数组中,并对计数进行加一操作,并将当前遍历的对象变量元素的字段医院信息修改为发起呼吸机申请的医院信息,将呼吸机状态修改为“使用中”,并添加到申请后的呼吸机资源数组中。

通过“决策”图元判断资源是否充足。

  • 走“ResourceEnough1”分支:在空闲状态下的呼吸机资源满足申请数量的时候跳出循环,返回信息“资源充足,申请呼吸机成功!”。
  • 走“ResourceNotEnough1”分支:循环遍历全部元素后仍未满足申请数量,将走Finish连线进行资源是否充足的判断:
  • 走“ResourceEnough2”分支:资源充足情况下返回“资源充足,申请呼吸机成功!”。
  • 走“ResourceNotEnough2”分支:当此次申请的呼吸机资源数组中的资源数量比申请的数量相同小时,代表申请的资源不足,返回信息“资源不足,申请失败!”。

总体编排流程

前提条件

开发呼吸机申请服务,首先需要创建呼吸机资源对象Respirator,作为呼吸机申请服务处理的对象。根据数据对象建模进行对象创建,自定义字段信息如下表所示。

创建Respirator对象步骤如下:

在一个应用目录上,例如“Model”上,单击 “+”,在弹出菜单中选择“对象”。
输入对象的标签为“Respirator”,单击名称系统会自动生成该值,单击“添加”。
在“自定义字段”页签,单击“新建”。
字段类型选择“文本”,单击“下一步”。
设置字段标签为“status”,单击名称系统会自动生成该值,“数据长度”设置为“255”,单击“下一步”。
勾选权限,设置字段的访问权限,即哪些Profile可以查看或修改该字段,单击“下一步”。
保持默认,默认该字段加入所有布局。单击“保存”。
参考3~7在“自定义字段”页签,新建“hospital”字段。

查看更多请点击:https://support.huaweicloud.com/usermanual-appcube/appcube_05_0603.html

看一下事件


假如你对当前不满意可修改

创建高级页面

进入AppCube开发环境首页,在“项目”页签下的“我的应用”中,单击“设备维修管理系统”,进入应用。

单击,进入工作目录。

在“User”目录下,将鼠标放在“Page”上,单击界面上出现的“+”,在弹出菜单中选择“高级页面”。

设置“标签”和“名称”为“Login”,并选择“绝对布局”,单击“添加”。

说明:高级页面布局有绝对布局和流式布局两种,页面布局详细介绍请参见高级页面布局。

拖拽自定义组件“userLogin”到页面。
单击左上角,打开组件列表,再单击“全部”,然后单击“自定义”页签,搜索到“userLogin”组件,将其拖进页面编辑区。“userLogin”组件即是在上传自定义登录组件中上传的自定义登录组件。

设置自定义组件“userLogin”的位置属性。

单击页面右下角的空白处,右侧显示当前视图组件列表。

单击选中“userLogin”组件,会在右侧显示该组件的属性配置面板。

在“位置”中,设置“距离左端”、“距离顶端”为“0”,“宽度”为“1920”,“高度”为“1080”。

单击页面上方,保存页面修改。
在目录中,将鼠标放在“Login”上,单击,然后选择“设置”,在弹窗中设置页面的拉伸属性,再单击“保存”。

设置页面拉伸

设置自定义组件“userLogin”的“数据”中的桥接器。
单击选中“userLogin”组件,在右侧属性设置的“属性”页签最下端“Parameters”配置项下,设置“login API”为“/HW__MyApp/1.0.0/login”。

添加命名空间前缀

“login API”为登录接口的URL后半段,请根据实际情况修改,调用服务编排时,会在服务编排名称前面自动拼接租户命名空间的前缀,登录接口将会在创建用户登录脚本章节创建。

在“数据”页签,单击“View API Get Connector”,设置“桥接器实例”为“通用AppCube API数据桥接器”,“数据类型”为“动态数据”,“请求方法”为“get”,如图

自定义组件的“数据”参数说明如下

  • 桥接器实例:调用的桥接器名称。
  • 请求方法:调用的方法名,如get(查询)、put(增加)、post(修改)、delete(删除)。
  • 调用周期:此处不用配置。调用周期是每隔多少秒调用一次后台接口或获取静态数据,默认配置为“0”,表示只调用一次或只获取一次静态数据。

单页面设置

保存,点击灯泡,可根据你需要的场景设置对应的卡片菜单,其中就包含了文本,日程以及链接等实用的组件。它能根据你的指令,会有反馈操作;

在下图,共用了三个常见功能,比如日程,发送定位,关于聊天机器人的介绍;还有种是短信回复,觉得并没有这种链接式的对话卡片有效率。

👍 温馨提示

  • 文章内容如果写的存在问题欢迎留言指出,让我们共同交流,共同探讨,共同进步~~~

  • 文章如果对你有帮助,动动你的小手点个赞,鼓励一下,给我前行的动力。

  • 【AppCube X WeLink双剑合璧】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/334492

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。