如何在salesforce中设计dashboard
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在salesforce中设计dashboard相关的知识,希望对你有一定的参考价值。
参考技术A 作为世界最著名的客户关系管理软件巨头,Salesforce 在CRM软件设计上有着深入的了解和过硬的设计和开发经验。诸如CRM这类企业级的软件中,表单类的界面非常多,这也促成了今天的这篇文章。一个优秀的表单到底要具备怎样的素质?如何提高表单的用户体验和使用效率?看看Salesforce 的团队是怎么做的。 Salesforce 用户每天都在和表单打交道,无论他是销售人员、主管还是经理。所以,对于Salesforce而言,能否无缝地添加、编辑、删除信息就是确保企业生产力的核心因素和驱动力所在。这也是为什么Salesforce的UX团队将表单设计和编辑作为新产品 Lightning Experience的核心。 1、标签&字段的对齐 在Lightning 中,表单里的标签和它所对应的输入字段是一起左对齐的,并且标签处于输入框的上方。这种设计方式可以让用户操作更加省心高效,和之前的版本相比,用户在浏览和操作的时候,只需要进行上下眼动就可以搞定一切,无需左右扫视。 一切都是左对齐的 虽然新的设计会在垂直方向上占用更多的空间,但是标签和字段的匹配会让整个界面在视觉上更加易用清晰。为了让用户在输入的时候看得更清楚,成对的字段和标签会更加靠近,两个不同的组之间的间隙会更大。无需左右扫视之后,用户可以更加顺畅地填写表单。 在视图模式之下,我们采用了相同的原理来设计,这样使得信息的层次结构更优秀,同时确保了整体的可读性。 2、设置默认值 如果你是一名销售人员,你的工作内容可能涉及到同潜在用户进行沟通(也就是“Leads”)。如果你想在Salesforce中跟踪这些潜在用户的信息,那么通常你得先创建一个相应的档案。如果要这么做的话,可能会创建下面的这种Lead 表单: 在Salesforce中创建一个新的Lead 表单 看起来很简单,是吧?但是如果我们仔细看看,就能逐渐找出这种表单在设计上的门道。第一个可编辑的字段是“Lead 状态”,它包含了以下选项:无联系、有联系、开放状态、合格、不合格。 研究表明,设置一个默认值会引导许多人在多种不同的语境和环境下选择默认选项。好了,回到最初的问题,如果你是一个销售人员,在同新的潜在用户的沟通的时候,第一次填写这个表单的时候,你可能会更倾向于选择“开放状态”而非空着不填写。 好了,在绝大多数的情况下,新建一个Lead 表单的时候销售人员会选择“开放状态”。而在之后每次新建这类表单的时候,在这个字段上耗费一两秒来进行选择。但是如果这种表单的数量非常多,比如有几百份,那么这个修改成本就非常之高昂了。这就是为何要为一些字段设计默认值。 3、预填写相关字段 许多记录的相关页面会根据“发布者”来执行一些预制的操作,比如创建新的任务和事件(我们在淘宝下单的时候,系统会帮你填写预制的默认收件地址、收件人和联系电话,这种机制与之类似)。那么我们看看下面的页面: 发布者登录之后触发的操作 系统会自动填写发布者信息 在理想的状态下,用户会认真填写每一个字段的详细信息,然而事实上用户并没有这么做。 在这个案例中,这个Lead 表单是关于一个名叫Walter Junior的人,并且这是执行一次调用之后显示的界面。这个用户相关的信息包含了四个字段,而其中“姓名”和“项目”两个字段都被预先填写,由于这是一个调用信息的界面,所以项目中默认填写的是“Call”,而相关用户的名字也无需填写,直接填写进去了。 在理想的状态下,用户会“勤勉”地填写所有字段,并且详细地描述每一个细节和相关的信息。然而实际上,人是有惰性的,操作者总会详尽办法偷懒。每一个新增加的字段,都是用户完成表单的巨大屏障。为了解决这个问题,我们作出了一个妥协方案:系统预先填充一些相关的关键内容。当用户填写的表单涵盖这些预制信息的时候,系统会帮用户填写预制的信息,这样一来,这个有四个字段的表单中,用户需要填写的仅仅只有2个字段(请继续脑补淘宝下单的时候,自动添加收件人信息的机制)。 4、让表单拥有更好的可访问性 在设计新的Lightning Experience 的时候,我们对于它的可访问性设计就有一个基本的构想。由于键盘输入还是目前我们用户的主要输入方式(考虑到我们这是一个企业级软件),所以一定要对键盘有良好的兼容和适配,必须确保用户仅用键盘就可以执行全部的操作。为此,我们为每个表单组件建立了特定的键盘交互模式,而且这些模式的构建是遵循W3C的规则来设计的,这也确保了这套交互的准确和广泛的适配性。 这是一个日期选择器组件,旁边是W3C中推荐的设计模式 然而上述的全部规则并不是刚好合适的,真正的重度用户倾向于更高频度地使用键盘,而他们也会从真正高度一致的键盘输入体验中收益。如何评判整套键盘交互的易用和可靠性呢?一个真正为核心用户设计的日期选择器可以让他们完成全部的日期选取、必要的编辑,而双手无需离开键盘。 结语:更多的问题 对于Salesforce的UX团队而言,Lightning Experience 是一个里程碑,不过要做的事情还有很多。比如我们需要提升输入体验,引入行内编辑功能。 不管你在团队中处于什么样的地位,是设计界面还是编写代码,无论是要设计复选框还是要制作更为复杂的CRM程序,表单的设计至关重要。在许多情形下,用户需要同这些表单进行长时间、大范围的交互和操作,任何效率上的提升都会带来体验的极大优化。请务必记住,精心设计的界面不止是要保证形式上的漂亮,方便和高效的设计也是造福用户的重要手段。如何在 django rest 框架中设计 ArrayField?
【中文标题】如何在 django rest 框架中设计 ArrayField?【英文标题】:How to design ArrayField in django rest framework? 【发布时间】:2021-12-15 13:48:54 【问题描述】:我正在使用 Django Rest 框架为食谱制作 API。我不知道如何设计成分模型以使数据像这样:
"id": 1,
"name": "spaghetti",
"recipe": "recipe",
"ingredients": [
[name:'pasta',amount:100,name:'tomato',amount:200,...]
],
我的模特:
class Meal(models.Model):
name = models.TextField()
recipe = models.TextField()
ingredients = ?
还有如何序列化这个字段?
【问题讨论】:
这是一个供你学习的项目还是一个真正的产品?老实说,我问是因为这取决于情况。就个人而言,我宁愿使用单独的表格来存放食材,而另一个表格可以参考(FK)食材,膳食和存储数量。这样,您将利用数据库完整性(只能添加有效成分等),您将能够通过单个查询分析哪顿饭中使用了哪些成分,我认为它会更好看。 JSONField 更像是一个为模型存储非关键数据的字段。 我正在为我的投资组合构建这个项目,但我看不到如何将成分字段或模型与他在膳食模型中的 amont 连接起来的好方法。实际上,我有单独的成分模型来过滤数据。但是这个数量是真正的痛苦。 Amout as FK in db 将存储简单的整数值,所以它实际上是个好主意? 【参考方案1】:您可以为成分创建单独的模型。
多对多关系对我来说是最好的,因为一顿饭可以有很多配料,相反,一种配料可以用来做很多饭菜。
根据django docs,在你的情况下:
models.py
from django.db import models
class Ingredient(models.Model):
name = models.CharField(max_length=90)
amount = models.FloatField()
class Meta:
ordering = ['name']
def __str__(self):
return self.name
class Meal(models.Model):
name = models.CharField(max_length=100)
recipe = models.CharField(max_length=100)
ingredients = models.ManyToManyField(Ingredient)
class Meta:
ordering = ['name']
def __str__(self):
return self.name
序列化器.py
class IngredientSerializer(serializers.ModelSerializer):
class Meta:
model = Ingredient
fields = '__all__'
class MealSerializer(serializers.ModelSerializer):
ingredients = IngredientSerializer(read_only=True, many=True)
class Meta:
model = Meal
fields = '__all__'
【讨论】:
我认为这是最好的方法。也许有一个单独的成分模型(没有数量)和另一个存储成分和数量的表会更好。否则,db 中将有许多相同成分但数量不同,您将无法自定义成分使用(可能是成分使用顺序,或将来可能需要的任何其他额外信息) 我厌倦了这个,但这不是一个好的解决方案。想一想:我们有两餐,一餐需要 100 克盐,另一餐需要 200 克盐。但是在成分字段中,数量只能有一个值。有没有办法将成分模型与他的数量联系起来,但它在每个膳食模型中都是独一无二的? 因此您应该创建 2 个具有不同值的成分。正如@ÇağatayBarın 所说,它也可能被分成一个单独的表格。如何存储这些数据由您决定。 @non 当然,这始终是您的决定。只是想帮助您获得最佳实践。在我提到的另一个模型中(我们称之为成分使用),它将有一个 FK 到成分,FK 到膳食,以及 IntegerField(或 DecimalField,取决于你)的数量。这样一来,您就不必在每顿饭中使用成分时都存储它,您将获得该成分的链接,以便您将来可以使用该信息,或者您可以将其他数据添加到成分使用中(例如煎 x 分钟,或使用顺序)。 @ÇağatayBarın 非常感谢您的帮助。您的解决方案是最好的,我无法理解您的意思,但它与简单的关系完美结合。我可以通过一个请求获取所有相关数据。谢谢你:)【参考方案2】:我相信您正在寻找的是 JsonBField
from django.contrib.postgres.fields.jsonb import JSONField as JSONBField
ingredients = JSONBField(default=list,null=True,blank=True)
这应该会如你所愿,祝你有美好的一天
编辑:感谢下面提到的@Çağatay Barın 的更新 仅供参考,已弃用,请改用 django.db.models.JSONField。请参阅Doc
【讨论】:
但是如果我不使用 PostgreSQL 怎么办? 仅供参考,自 3.1 版起已弃用。您可能想要更改答案以支持最新版本。请改用django.db.models.JSONField
。文档:docs.djangoproject.com/en/3.2/ref/contrib/postgres/fields/…【参考方案3】:
来自django-3.1,Django自带JSONField
class Meal(models.Model):
name = models.TextField()
recipe = models.TextField()
ingredients = models.JSONField()
【讨论】:
【参考方案4】:有两种方法可以得到这个结果[2] 有另一个模型:
-
使用
WritableNestedModelSerializer
。
覆盖序列化程序的create()
方法。
第一个示例,使用WritableNestedModelSerializer
:
# models.py --------------------------
class Ingredient(models.Model):
# model that will be related to Meal.
name = models.CharField(max_lenght=128)
amount = models.IntergerField()
def __str__(self):
return str(self.name)
class Meal(models.Model):
# meal model related to Ingredient.
name = models.TextField()
recipe = models.TextField()
ingredients = models.ForeigKey(Ingredient)
def __str__(self):
return str(self.name)
# serializers.py ----------------------
class IngredientSerializer(serializers.ModelSerializer):
class Meta:
model = Ingredient
fields = '__all__'
class MealSerializer(WritableNestedModelSerializer, serializers.ModelSerializer):
ingredients_set = IngredientSerializer(required=False, many=True)
class Meta:
model = Ingredient
fields = ["id", "name","recipe", "ingredients_set"]
第二个示例重写create()
方法:
# models.py --------------------------
# Follow the same approach as the first example....
# serializers.py ----------------------
class IngredientSerializer(serializers.ModelSerializer):
class Meta:
model = Ingredient
fields = '__all__'
class MealSerializer(serializers.ModelSerializer):
ingredients = IngredientSerializer(required=False, many=True)
class Meta:
model = Meal
fields = ["id", "name","recipe", "ingredients"]
def create(self, validated_data):
# 1st step.
ingredients = validated_data('ingredients')
# 2nd step.
actual_instance = Meal.objects.create(**validated_data)
# 3rd step.
for ingredient in ingredients:
ing_objects = Ingredients.object.create(**ingredient)
actual_instance.ingredients.add(ing_objects.id)
actua_instance.save()
return actual_instance
第二个例子做了什么?
第一步:由于您创建一对二多关系,端点将等待这样的有效负载:
"name": null,
"recipe": null,
"ingredients": [],
您发送的数据/已验证数据的前:
"id": 1,
"name": "spaghetti",
"recipe": "recipe",
"ingredients": [
name:'pasta',amount:100,name:'tomato',amount:200,...
],
因此,由于您发送的有效载荷包含成分数组中的许多成分,您将从 validated_data
获取此值。
例如,如果您打印'ingredients'
(从 create() 方法的内部),您将在终端中得到:
[name:'pasta',amount:100,name:'tomato',amount:200,...]
第二步:好的,既然您从 validate_data 中获取了成分,那么是时候创建一个 Meal 实例了(其中没有“成分”)。
第 3 步:您将从上述第 1 步中循环所有成分对象,并将它们添加到 Meal.ingredients
关系中以保存 Meal 实例。
-- 关于额外模型--
[2] 请记住,JSONField()
允许在其中添加任何内容,甚至是额外的字段。如果您想要更好地控制,使用 Meal 模型可能是更好的选择。
【讨论】:
以上是关于如何在salesforce中设计dashboard的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 restforce gem 在 Rails 中设置 Salesforce 凭据?
salesforce零基础学习(八十三)analytics:reportChart实现Dashboard(仪表盘)功能效果