我如何使用Lightning App Builder构建一个基本的Salesforce移动应用程序
在短短几分钟内建立一个新的应用程序?看看这个使用Salesforce Lightning App Builder创建的移动应用程序吧。
2018年秋天,我决定替换我岳母用于房地产业务的一个应用程序。我决定用一个在AWS内部运行的Angular客户端和Spring Boot服务来取代该应用。我学到的最大的教训是,我觉得我花了更多的时间去了解AWS,而没有花时间对她的应用程序进行改进。
当2020年春天到来时,这一切都改变了......
当整个世界都在试图找出如何在全球大流行中航行时,我却在潜心研究Heroku PaaS......并爱上了它。在很短的时间内,我就能把这个相同的应用程序转移到Heroku上。虽然我知道Heroku在幕后使用AWS,但它对我的时间没有影响。我可以继续专注于我真正喜欢的事情:为自定义应用程序增加价值,并使用基于git的基本操作部署新版本。
虽然我知道Heroku不是每一种情况下的理想选择,但今天运行的大部分应用程序都可以利用Heroku提供的优势,并使支持这些应用程序的功能团队专注于增加新的功能。
随着我开始在移动应用程序领域做更多的工作,我想知道是否有一个类似于Heroku的移动应用程序开发选项,用于构建Salesforce应用程序。我决定先看看Salesforce工程团队提供了什么。
关于Lightning App Builder
Salesforce Lightning App Builder是一个点对点的工具,用于创建可在移动设备上使用的单页应用程序。就像Heroku从应用托管的角度所提供的一样,Lightning App Builder产品处理了大部分的应用基础。这使开发人员能够将时间集中在满足业务需求和目标上。
Lightning App Builder支持分为三类的单页应用程序。
-
应用程序--用于自定义应用程序
-
首页--登录后的登陆页面
-
记录--用于集中查看数据的页面布局
在这篇文章中,我将专注于应用程序选项,并创建一个全新的应用程序。
一个 "站起来 "的用例
在我创建应用程序的三十年中,我一直是一个超过我公平份额的功能团队的成员。在那段时间里,我发现,听到有创造力的开发者对团队经理的问题 "完成了吗?"做出机智的回答,我感到很高兴。
虽然敏捷团队通常不会像传统的项目经理那样问这个问题,但对于大多数功能开发员来说,沟通你目前的状态仍然是日常工作的一部分。为了帮助开发人员保持新鲜感,我们将使用Lightning App Builder创建 "Stand Up "应用程序。
考虑一下这些高层次的要求:
-
创建一个自定义对象(称为Stand Up)来容纳以下信息:
-
名称(现有属性)将是响应
-
类型包括以下值,为响应指定一个类型:
-
积极的
-
中性
-
否定
-
-
-
创建一个Stand Up组件并显示四个按钮:
-
正面
-
中性
-
负面的
-
全部
-
-
该应用程序的基本流程:
-
启动应用程序将呈现四个按钮(如上所述)。
-
当用户选择一个按钮时,选择一个与自定义对象的类型属性匹配的随机响应。全部按钮将在所有三种类型中选择一个随机响应。
-
在屏幕上显示响应,供开发人员在每天的站立会议上转达。
-
-
该应用程序将在Salesforce移动客户端内运行。
行动中的Lightning App Builder
随着Visual Studio(VS)代码的运行和Salesforce扩展包的安装,开始使用Stand Up应用程序就像使用Cmd+Shift+P(在我的MacBook Pro上)或Ctrl+Shift+P(Windows机器)并输入以下命令一样简单。
SFDX: Create Project
为了使事情变得快速和简单,我选择了标准选项。
我把我的项目称为StandUpLightningWebComponent。
我把这个项目放在一个叫Stand-up-web-component的文件夹中,并在VS Code中打开了一个新的工作区。
接下来,我们需要连接到一个Salesforce org,我将使用我现有的一个沙盒。如果你需要创建一个新的,那么请查看以下网址。
developer.salesforce.com/signup
一旦你有了一个要使用的开发者组织,你就可以使用下面的Cmd+Shift+P/Ctrl+Shift+P命令将VS Code连接到该组织。
SFDX: Authorize an Org
VS code会提示你选择登录的URL。我选择了项目默认选项。
当被问及登录别名时,我简单地按了回车键。
一个浏览器窗口出现了,我登录了我的沙盒组织。出现了以下对话框。
VS Code现在已经连接到我的沙盒,我们准备开始使用Stand Up组件。
创建 "站起来 "自定义对象
使用上面一节中打开的浏览器页面,我使用Salesforce设置视角来创建一个新的自定义对象。如果你碰巧关闭了那个浏览器窗口,使用下面的VS代码Cmd+Shift+P/Ctrl+Shift+P命令,在浏览器窗口中打开默认的org。
SFDX: Open Default Org
在设置中,我简单地浏览了Objects and Fields | Object Manager。接下来,我使用了创建|自定义对象选项。
我创建了一个新的自定义对象,标签是Stand Up,并保留了默认的对象名称Stand_Up。但是,我将默认的记录名称替换为Witty Response。
我对其他的东西都保留了默认值,我点击了保存按钮来建立新的对象。
为了创建类型属性,我浏览了字段和关系选项并点击了新建按钮。对于这个字段,我选择了Picklist选项,并点击了 "下一步"按钮,这导致了以下屏幕。
该选单将被限制在上述的三个选择中。我点击了两次 "下一步"按钮(接受这些值和默认的字段安全性),然后点击了 "保存"按钮,添加了新字段。站起来的对象已经可以使用了。
接下来,我使用Salesforce中的集成|数据导入向导流程,将以下记录从sample-data.csv 文件导入到Stand Up自定义对象中。
All is good in the hood!,Positive
I am free and need something to work on.,Positive
Should be finished today.,Positive
Been battling a migraine - no update.,Neutral
It works but it hasn't been tested,Neutral
QA is testing things right now - fingers crossed.,Neutral
Still making progress - but not finished.,Neutral
Waiting for my merge-request to be approved.,Neutral
I am honestly thinking about a career change.,Negative
It is as done as it is gonna be - is that good enough?,Negative
My dog ate my code and I am starting over.,Negative
如果你不熟悉这个过程,你可以在这里阅读关于如何使用导入向导。
导入完成后,我在VS Code的Scripts | soql部分内创建了一个名为Stand_Up__c.soql 的文件,其中包含以下内容。
// Use .soql files to store SOQL queries.
// You can execute queries in VS Code by selecting the
// query text and running the command:
// SFDX: Execute SOQL Query with Currently Selected Text
SELECT Id, Name, Type__c FROM Stand_Up__c ORDER BY Name ASC
接下来,我突出了SELECT语句,并使用Cmd+Shift+P/Ctrl+Shift+P命令选择了以下选项。
SFDX: Execute SOQL Query with Currently Selected Text
这个动作在我的终端标签中产生了以下结果。
Starting SFDX: Execute SOQL Query...
12:29:51.99 sfdx force:data:soql:query --query SELECT Id, Name, Type__c FROM Stand_Up__c ORDER BY Name ASC
Querying Data... done
ID NAME TYPE__C
────────────────── ────────────────────────────────────────────────────── ────────
a092L00000E6eX4QAJ Been battling a migraine - no update. Neutral
a092L00000E6eX2QAJ I am free and need something to work on. Positive
a092L00000E6eX9QAJ I am honestly thinking about a career change. Negative
a092L00000E6eXAQAZ It is as done as it is gonna be - is that good enough? Negative
a092L00000E6eX5QAJ It works but it hasn't been tested Neutral
a092L00000E6eXBQAZ My dog ate my code and I am starting over. Negative
a092L00000E6eX6QAJ QA is testing things right now - fingers crossed. Neutral
a092L00000E6eX3QAJ Should be finished today. Positive
a092L00000E6eX7QAJ Still making progress - but not finished. Neutral
a092L00000E6eX8QAJ Waiting for my merge-request to be approved. Neutral
Total number of records retrieved: 10.
12:29:52.681 sfdx force:data:soql:query --query SELECT Id, Name, Type__c FROM Stand_Up__c ORDER BY Name ASC
ended with exit code 0
最后,我想把自定义对象的所有元数据拉到VS Code中。这样,自定义对象就可以包含在基于git的仓库中,消除了组件用户手动创建对象的需要。
要把Stand Up自定义对象导入VS Code,在终端窗口使用以下命令。
sfdx force:source:retrieve -m CustomObject:Stand_Up__c
以下输出出现在VS Code中。
PowerShell
╭─jv@me ~/projects/jvc/stand-up-web-component/StandUpLightningWebComponent
╰─$ sfdx force:source:retrieve -m CustomObject:Stand_Up__c
Preparing retrieve request... done
=== Retrieved Source
FULL NAME TYPE PROJECT PATH
────────────────── ──────────── ────────────────────────────────────────────────────────────────────────
Stand_Up__c.Type__c CustomField force-app/main/default/objects/Stand_Up__c/fields/Type__c.field-meta.xml
Stand_Up__c CustomObject force-app/main/default/objects/Stand_Up__c/Stand_Up__c.object-meta.xml
在VS Code中也可以实现同样的结果,点击工具栏中的云图标,找到你想检索的项目,然后推送下载图标。
在VS代码的左侧,现在可以看到Stand Up自定义对象。
在对象和数据准备好后,我们可以建立Lightning Web组件,该组件将与应用程序一起使用。
创建Stand Up控制器
我们将首先创建Stand Up控制器,它将作为一个API来定位适当的响应。
我们可以使用以下Cmd+Shift+P/Ctrl+Shift+P命令来创建StandUpController类。
SFDX: Create Apex Class
我填充了简单的控制器,如下所述。
Java
public with sharing class StandUpController {
@AuraEnabled(cacheable=false)
public static Stand_Up__c getRandomResponse(String responseType) {
List<Stand_Up__c> responseList;
if (responseType.equals('all')) {
responseList = [SELECT Name, Type__c FROM Stand_Up__c];
} else {
responseList = [SELECT Name, Type__c FROM Stand_Up__c WHERE Type__c = :responseType];
}
return getRandomFromList(responseList);
}
private static Stand_Up__c getRandomFromList(List<Stand_Up__c> responseList) {
if (responseList == null || responseList.isEmpty()) {
Stand_Up__c standUpResponse = new Stand_Up__c();
standUpResponse.Name = 'Ummmm.......';
standUpResponse.Type__c = 'Neutral';
return standUpResponse;
}
Integer count = responseList.size();
Integer rand = Math.floor(Math.random() * count).intValue();
return responseList[rand];
}
}
客户端将调用StandUpController.getRandomResponse() 方法,传入适当的responseType 选项,该方法将返回一个Stand_Up__c 记录。如果没有符合请求的记录,那么将返回一个新的Stand_Up__c 对象,其中立状态为 "Ummmm......."
创建Stand Up Lightning Web组件
我们现在准备为Stand Up应用程序创建Lightning Web组件。
我们可以使用以下Cmd+Shift+P/Ctrl+Shift+P命令来创建StandUp Lightning Web组件。
SFDX: Create Lightning Web Component
我们需要做的第一件事是更新standUp.js-meta.xml ,使这个组件可以使用。
XML
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata" fqn="standUp">
<apiVersion>53.0</apiVersion>
<isExposed>true</isExposed>
<targets>
<target>lightning__AppPage</target>
<target>lightning__RecordPage</target>
<target>lightning__HomePage</target>
</targets>
</LightningComponentBundle>
接下来,需要更新standUp.js ,以便处理应用程序的请求,与我们在上一节创建的控制器进行交互。
Java
import { LightningElement } from 'lwc';
import getRandomResponse from '@salesforce/apex/StandUpController.getRandomResponse';
export default class StandUp extends LightningElement {
standUpResponse = null;
error = null;
getPositiveResponse() {
this.getRandomResponseFromSalesforce('Positive');
}
getNeutralResponse() {
this.getRandomResponseFromSalesforce('Neutral');
}
getNegativeResponse() {
this.getRandomResponseFromSalesforce('Negative');
}
getAnyResponse() {
this.getRandomResponseFromSalesforce('all');
}
getRandomResponseFromSalesforce(responseType) {
this.standUpResponse = null;
this.error = null;
getRandomResponse({responseType})
.then((standUp) => {
this.standUpResponse = standUp.Name;
})
.catch((error) => {
this.error = JSON.stringify(error);
});
}
}
最后,我们需要更新standUp.html 文件,以包括视图层的逻辑。
HTML
<template>
<div class="slds-var-m-vertical_large slds-var-p-vertical_medium
slds-text-align_center slds-border_top slds-border_bottom slds-text-heading_small">
<p>Select the type of update you wish to find: </p>
</div>
<div class="slds-text-align_center slds-var-p-top_xx-small">
<lightning-button variant="brand" class="slds-var-m-left_x-small"
icon-name="utility:cases" label="Positive" title="Positive"
onclick={getPositiveResponse}>
</lightning-button>
</div>
<div class="slds-text-align_center slds-var-p-top_xx-small">
<lightning-button variant="brand" class="slds-var-m-left_x-small"
icon-name="utility:cases" label="Neutral" title="Neutral"
onclick={getNeutralResponse}>
</lightning-button>
</div>
<div class="slds-text-align_center slds-var-p-top_xx-small">
<lightning-button variant="brand" class="slds-var-m-left_x-small"
icon-name="utility:cases" label="Negative" title="Negative"
onclick={getNegativeResponse}>
</lightning-button>
</div>
<div class="slds-text-align_center slds-var-p-top_xx-small">
<lightning-button variant="brand" class="slds-var-m-left_x-small"
icon-name="utility:cases" label="Any" title="Any"
onclick={getAnyResponse}>
</lightning-button>
</div>
<div if:true={standUpResponse} class="slds-var-m-vertical_large slds-var-p-vertical_medium
slds-text-align_center slds-border_top slds-border_bottom slds-text-heading_small">
<p>Today's Update: {standUpResponse}</p>
</div>
<div if:true={error} class="slds-var-m-vertical_large slds-var-p-vertical_medium
slds-text-align_center slds-border_top slds-border_bottom slds-text-color_error">
<p>Error: {error}</p>
</div>
</template>
现在,我们已经准备好将Stand Up应用程序部署到Salesforce。
部署到Salesforce
将我的所有代码从本地机器推送到Salesforce很简单。我所需要做的就是在导航器中右击force-app/main/default,然后选择SFDX:将源码部署到机关选项。
一旦完成,VS Code中会出现以下对话框。
现在我们已经准备好将Lightning Web组件添加到Salesforce的一个新应用中。
在Salesforce中创建一个新的Lightning应用程序
我切换到浏览器标签,登录到我的Salesforce组织,并打开设置视角。接下来,我浏览了Apps | App Manager页面并点击了New Lightning App按钮。
我决定把新的应用程序称为Stand Up,甚至还找到了一个漂亮的小图标来使用。我使用了向导中其余的默认设置,除了最后一个屏幕,在那里我授予所有用户对这个应用的访问权。
然后,我导航到用户界面|闪电应用程序生成器屏幕。在这里,我创建了一个新的Lightning App Page,名为Stand Up,它被设计成一个只有一个区域的App Page。
在屏幕的左侧,我可以看到自定义部分下的standUp LWC。我所要做的就是把这个组件拖过来,并把它放到基于Lightning的页面的单一区域中。
保存该组件后,我使用激活程序将Lightning页面展示给客户使用。
在激活阶段,我将应用名称设置为Stand Up,并在列表中找到最佳图标。
为了设置闪电体验,我把Stand Up应用放到了屏幕的右侧。
对于移动导航,我添加了Stand UpLighting应用程序,并确保它在列表的顶部附近。
点击保存按钮后,Stand Up应用程序就可以使用了。
使用 "站起来 "应用程序
启动Salesforce移动应用程序后,我就能看到我刚刚创建的Stand Up应用程序。
接下来,我点击了Stand Up应用程序,它显示了以下屏幕,其中有我的自定义LWC。
点击任意按钮将从Stand_Up__c 记录集中返回一个随机响应。
该应用程序也可以在Salesforce中使用,无需对代码做任何更新。
结论
从2021年开始,我一直在努力践行以下的使命宣言,我觉得这可以适用于任何IT专业人士。
"把你的时间集中在提供特性/功能上,以扩大你的知识产权的价值。充分利用框架、产品和服务来处理其他事情。
- J. Vester
正如我在评估Heroku平台时发现的那样,我能够通过利用Salesforce平台迅速推出Salesforce移动应用。在这样做的时候,我仍然专注于满足应用程序的需求,而不是担心基础和设计决策。
真的,这种模式坚持了我的使命感......而完成这个例子所需的时间是以分钟计算的,而不是以小时甚至是以天计算。
如果你对本文的源代码感兴趣,只需导航到GitLab上的以下资源库。
祝你有一个非常棒的一天!