选择正确的计划
- 在您开始在AppCreator中创建应用程序之前,了解AppCreator平台可以提供的内容以及每个计划的详细信息很重要。
- 作为经验法则,理想的范围至少比要求的多5-10%。这将确保您的应用程序可以在用户活动激增的情况下进行扩展。
- 确定谁将使用该应用程序,并根据他们的要求进行设计。例如,您可以选择一个客户门户计划来支持您的客户、供应商和合作伙伴的需求。
安全最佳实践
用户和权限
- 仅应将所需用户添加到应用程序中,并仅共享必要的模块。
- 不再需要访问应用程序的用户或开发人员应该被删除。
- 当多个用户正在构建应用程序时,请添加所需用户作为开发人员,而不是共享管理员凭据。
- 访问个人身份信息(PII)和电子受保护的健康信息(ePHI)数据可以单独授予必要的权限集。
- 必须限制导出、删除、查看全部和批量编辑权限。
- 可以删除用户和客户不需要的权限集。
表格和报表
- 收集或包含PII和ePHI数据的字段应加密。
- 敏感信息可以在适用的情况下在报表中被屏蔽。
- 过滤器和标准可以添加到报表中,以确保只向用户显示所需信息。
- 任何存储的敏感信息都可以在不再需要时删除。
- 确认消息可以与自定义操作按钮相关联。
- 不建议收集或存储社会保障号码或密码等敏感信息。如果收集,目的应在表格中明确说明。
- 最好避免在应用程序中存储API凭据。
- 帮助文本或工具提示可以与字段相关联,以详细说明收集数据的原因。
- 注释字段可以添加到表单中,以向用户指定数据收集的目的。
- 当不再需要公众访问时,建议停用已发布的表格。
- 决策框可用于获得数据收集的同意。
- 在调用API时,应尽可能使用基于OAuth的身份验证。
- 收集IP地址时,建议通知用户并征得他们的同意。IP地址也可以加密。
- 报表中的操作,如添加、删除和复制,必须进行审查,如果不需要,可以删除。
- 也可以使用审计跟踪功能来跟踪对记录所做的更改历史。
工作流程和脚本
- 应尽可能对字段进行输入验证。
- 应用程序中使用的任何超链接都应经过验证。
- 应审查短信和电子邮件任务中的内容。
- 业务逻辑,如函数和计划工作流程,可以在工作流构建器本身内执行,然后再纳入主流程。
页面
- 应该审查HTML和JavaScript代码。
- 尽可能使用评论。
- 对于基于参数工作的页面,请务必包含空值检查,以防止页面显示错误或无关数据。
- 避免重复CSS样式。
应用最佳实践
一般做法
- 定义应用程序结构,识别数据模型-字段、关系、字段加密,并在开始构建应用程序之前考虑当前流程的痛点。
- 记录应用程序结构。这将使以后更容易进行更改。
- 为所有组件分配有意义的名称——表单、字段、报表、工作流程、页面、变量、函数和权限集。
- 使用查找字段在表单之间创建关系,以避免跨表单的冗余数据。
- 将强制值和无重复值等属性设置为字段,以保持数据完整性。
- 从应用程序中删除不需要的组件。
- 指定记录的删除行为——当特定记录被删除时,任何相关记录会发生什么。例如,如果员工被删除,分配给他们的任务会发生什么?
- 在沙盒环境中对应用程序进行更改,并在发布前进行测试。
- 使用计划的应用程序备份功能来创建定期备份。
洪水最佳实践
Deluge是AppCreator的内置脚本语言。它易于学习,并带有集成的开发环境,使您能够在编码时拖放Deluge代码片段。
一般做法
- 像“信息”这样的调试语句可以在适用的地方用于消除错误。
- 避免脚本的重嵌套并优化循环。
- 有效地使用汇总记录任务。仅在需要时获取所有记录。
- 尽可能使用内置功能——这些功能针对性能进行了优化。
- Try catch语句可用于处理代码中的异常。
- 变量可以被赋予有意义的名称。
- 使用zoho.appUri和zoho.appName等系统变量,这样应用程序链接名称或所有者名称更改就不会影响您的功能。
- 这对于HTML页面中用于嵌入组件的Deluge脚本特别有用。
- 函数可用于从常用或重复的代码中创建可重复使用的代码块。
- 可以删除不需要的和注释的代码,以保持代码库的清洁,以便于维护。
- 脚本可以缩进,并添加注释,以简要概述逻辑和目的。
- 保持代码模块化。
- 语法辅助可用于帮助配置任务。
- 版本管理也可用于跟踪各种版本和代码更改。
- 当使用invokeURL Deluge任务进行API调用时,响应不会存储在AppCreator保留的数据中或处理,这使得Deluge不受任何漏洞的侵害。
- Deluge脚本中的任何错误只会影响应用程序逻辑,不会造成任何漏洞。
- 当用户尝试保存脚本时,将显示Deluge中出现的语法错误。在纠正错误之前,代码将不会被保存或执行。
- 必须追踪和修复因编程实践和错误不佳而产生的逻辑错误。
- 编写的任何Deluge代码都必须优化,以确保不会达到Deluge语句限制。这些设置是为了防止资源意外滥用。
- 为了提高性能,请使用预定义的洪水函数:等于忽略案例,等于比较而不是“==”。
要避免的脚本
以下是一些可以避免的脚本。为他们提供了替代方案。
示例1:
您可以直接在循环中使用获取集合,而不是从获取语句中检查计数。
fetchInvoices = Invoice[Client == input.Client && Location.equalsIgnoreCase("Chennai") && Bill_Payment_Status == "未付款"];
if(fetchInvoices.count() > 0)
{
对于fetchInvoices中的每张发票
{
}
}
//------------------------------------------
//相反,请使用以下脚本
//------------------------------------------
对于发票中的每张发票[客户==输入.客户&&位置.等值IgnoreCase("Chennai") && Bill_Payment_Status == "未支付"]{
}
if(fetchInvoices.count() > 0)
{
对于fetchInvoices中的每张发票
{
}
}
//------------------------------------------
//相反,请使用以下脚本
//------------------------------------------
对于发票中的每张发票[客户==输入.客户&&位置.等值IgnoreCase("Chennai") && Bill_Payment_Status == "未支付"]{
}
示例2:
您可以使用内置函数来避免循环。
付款列表=列表();
PaymentAgainstInvoice[ID == rushPayment]中的每张发票
{
付款列表.添加(发票.ID);
}
//------------------------------------------
//相反,请使用以下脚本
//------------------------------------------
付款清单=对发票付款[ID == rushPayment]。ID.获取所有();
PaymentAgainstInvoice[ID == rushPayment]中的每张发票
{
付款列表.添加(发票.ID);
}
//------------------------------------------
//相反,请使用以下脚本
//------------------------------------------
付款清单=对发票付款[ID == rushPayment]。ID.获取所有();
示例3:
这是另一种使用内置函数来避免循环的方法。
fethcInvoice = 发票[ID == input.invoiceId];
对于fethcfrominv.Line_Items中的每个lineitmcount
{
连接线 = 连接线 + 1;
}
//----------------------------------------------------
//相反,使用以下脚本
//------------------------------------------
计数=fethc发票=发票[ID ==输入.发票ID].计数(ID);
对于fethcfrominv.Line_Items中的每个lineitmcount
{
连接线 = 连接线 + 1;
}
//----------------------------------------------------
//相反,使用以下脚本
//------------------------------------------
计数=fethc发票=发票[ID ==输入.发票ID].计数(ID);
示例4:
此代码示例向您展示如何避免不必要的更新操作。
billId = 插入到账单中
[
添加_用户=zoho.loginuser
总_价格=总_价格
账单_状态=账单_状态
];
获取账单=账单[ID == billId];
如果(患者_类型 == “免费”)
{
获取账单.总计_价格=0;
获取Bill.Bill_Status="Closed";
}
//----------------------------------------------------
//我们可以在将数据插入账单表格之前执行检查,而不是使用上述代码。这将避免不必要的更新操作
//----------------------------------------------------
如果(患者_类型 == “免费”)
{
总计_价格=0;
账单_状态="已关闭";
}
billId = 插入到账单中
[
添加_用户=zoho.loginuser
总_价格=总_价格
账单_状态=账单_状态
];
[
添加_用户=zoho.loginuser
总_价格=总_价格
账单_状态=账单_状态
];
获取账单=账单[ID == billId];
如果(患者_类型 == “免费”)
{
获取账单.总计_价格=0;
获取Bill.Bill_Status="Closed";
}
//----------------------------------------------------
//我们可以在将数据插入账单表格之前执行检查,而不是使用上述代码。这将避免不必要的更新操作
//----------------------------------------------------
如果(患者_类型 == “免费”)
{
总计_价格=0;
账单_状态="已关闭";
}
billId = 插入到账单中
[
添加_用户=zoho.loginuser
总_价格=总_价格
账单_状态=账单_状态
];
资源
移动应用程序最佳实践
- 触发的操作和事件,如点击记录、向左滑动和向右滑动,可以确定和更改。
- 快速视图和详细视图中的列可以根据应用程序上下文进行设置。
- 自定义徽标可以上传到应用程序。
- 应用程序可以为用户和客户单独离线更名和发布。