Salesforce 技术简介和分享

什么是Salesforce?

Salesforce(后面为了简洁都写作SF)总的来说是一个商业的云平台, 提供完善的商业解决方案,云平台开发,稳定开放的数据存储。

可以迎合并支持各类复杂的商业,尤其是业界内出SAP为做CRM最好的商业云平台,那我们来看看他都能支持哪些:

Commerce Cloud, -- 商业云,集成各种商业解决环境和方案,例如广告策划,产品推广

Sales Cloud, -- 销售云, 简单来说, 就是专门针对销售人员应用的一套,例如 资产管理, 基金销售之类的

Service Cloud, -- 服务云, 典型的是CRM(customer relationship management), 客户关系管理系统,有点像客服支持,Call Center 支持中心;

Data Cloud (including Jigsaw), --数据云,专业的数据对象存储云,有点像MongoDB,表都对象化了,没有table只有object;

Marketing Cloud, --市场云,主要针对市场营销,销售广告渠道之类,进行市场挖掘,客户群感知与发掘;

Community Cloud, --社区云, 可以建立各种社区论坛之类,大家可以发很有趣的文章或者帖子,各种有兴趣的有识之士可以进行评论、分享,有点像贴吧,博客园;

Analytics Cloud, --分析云,对商业数据进行专业的分析和梳理,引导用户做出有价值的市场分析和决策;

 App Cloud,  --应用云, 简单说就是集成各种各样的应用,SF 里面有个APP exchange,根据需要可以自行集成,然后也可以拓展各种各样市面上可以在SF上门集成和嫁接的app,

IoT , -- 物联网,向硬件方面集成的应用,例如手机端访问SF app 应用设置定时任务,对应链接的IoT设备可以执行相应的任务;

 

主要构成部件:

Setup & configuration - 设置与配置

因为SF是基于平台的,很多项目可以不完全依赖于开发,更偏向于有UI的控制项进行全局或者局部的设置;例如 传统的网站需要Apache或者IIS这样的服务器做支撑,SF 则可以在Sites 设置里面建立相应的站点,然后配置相应的访问权限访问页面就可以建立站点了。

 

Apex 编程语言 - Salesforce 自己的编程语言

apex 语言是SF自己的一套编程语言, 是一种类JAVA和C#的OOP编程语言,也是一种强类型语言,但是他大小写不敏感,大部分学过java和C#的同学,基本可以很快上手,学习起来没有什么困难,但是毕竟语言和语言之间有差异,SF本身自己语言也有一定基于平台的限制性和约束性,有些JAVA和C#特性并不完全支持,但有些他支持的特性JAVA和C#未必有,例如线程Thread貌似在SF里面是没有的,可能以其他方式或技术途径来实现,而Class的声明中 with sharing/without sharing 这种写法确实Apex特有的;

Visualforce page

Visualforce 是SF中Apex 对应的前端页面, 风格有点类似于aspx, 都是xml 风格规范的html,能很好地支持和兼容HTML所有原生标签,还有jQuery, AngularJS等前端编程语言;

来上代码看一看,瞧一瞧:

 1 <apex:page controller="CompanyController">
 2     <apex:form >
 3         <apex:outputPanel layout="block">
 4             <apex:outputPanel layout="block">
 5                 <apex:outputPanel layout="block">
 6                     <apex:outputPanel layout="block" id="companyList">
 7 
 8                         <apex:outputPanel layout="block" styleClass="paginator"
 9                             style="padding:0px;">
10                             <apex:panelGrid columns="2" style="100%;"
11                                 styleClass="az_text_table" rowClasses="paginator,paginator">
12                                 <apex:outputText rendered="{!!resultPagination.hasRecord}"
13                                     value="第 0 页,共 0 页,每页 {!resultPagination.pageSize} 条" />
14                                 <apex:outputText rendered="{!resultPagination.hasRecord}"
15                                     value="第 {!resultPagination.pageNumber} 页,共 {!resultPagination.totalPage} 页,每页 {!resultPagination.pageSize} 条" />
16                                 <apex:panelGroup >
17                                     <apex:outputPanel >
18                                         <apex:outputText value="首页"
19                                             rendered="{!(!resultPagination.hasRecord)||(!resultPagination.hasPrevious)}"
20                                             style="border: solid 1px #ddd;padding:1px 6px;background: #e8e8e9;margin-right:5px;"></apex:outputText>
21                                         <apex:commandLink action="{!firstPage}"
22                                             rendered="{!resultPagination.hasRecord && resultPagination.hasPrevious}"
23                                             immediate="true" reRender="companyList" value="首页"
24                                             style="margin-right:5px;" />
25                                     </apex:outputPanel>
26                                     <apex:outputPanel >
27                                         <apex:outputText value="上一页"
28                                             rendered="{!!resultPagination.hasRecord || (!resultPagination.hasPrevious)}"
29                                             style="border: solid 1px #ddd;padding:1px 6px;background: #e8e8e9;margin-right:5px;"></apex:outputText>
30                                         <apex:commandLink action="{!previousPage}"
31                                             rendered="{!resultPagination.hasRecord && resultPagination.hasPrevious}"
32                                             immediate="true" reRender="companyList" value="上一页"
33                                             style="margin-right:5px;" />
34                                     </apex:outputPanel>
35                                     <apex:outputPanel >
36                                         <apex:outputText value="{!resultPagination.pageNumber}"
37                                             styleClass="current" />
38                                     </apex:outputPanel>
39                                     <apex:outputPanel >
40                                         <apex:outputText value="下一页"
41                                             rendered="{!!resultPagination.hasRecord || !resultPagination.hasNext}"
42                                             style="border: solid 1px #ddd;padding:1px 6px;background: #e8e8e9;margin-right:5px;margin-left:5px;"></apex:outputText>
43                                         <apex:commandLink action="{!nextPage}"
44                                             rendered="{!resultPagination.hasRecord && resultPagination.hasNext}"
45                                             immediate="true" reRender="companyList" value="下一页"
46                                             style="margin-right:5px;margin-left:5px;" />
47                                     </apex:outputPanel>
48                                     <apex:outputPanel >
49                                         <apex:outputText value="尾页"
50                                             rendered="{!!resultPagination.hasRecord || !resultPagination.hasNext}"
51                                             style="border: solid 1px #ddd;padding:1px 6px;background: #e8e8e9;margin-right:5px;"></apex:outputText>
52                                         <apex:commandLink action="{!lastPage}"
53                                             rendered="{!resultPagination.hasRecord && resultPagination.hasNext}"
54                                             immediate="true" reRender="companyList" value="尾页"
55                                             style="margin-right:5px;" />
56                                     </apex:outputPanel>
57                                 </apex:panelGroup>
58                             </apex:panelGrid>
59                         </apex:outputPanel>
60                     </apex:outputPanel>
61                 </apex:outputPanel>
62             </apex:outputPanel>
63         </apex:outputPanel>
64     </apex:form>
65 </apex:page>
VisualForce Code

Apex Class

Apex 的后台代码,有点像java、C#代码:

public class ObjWrapper {
        public String objName{get;set;}
        public String objEmail{get;set;}
        public String objType{get;set;}

        public Boolean equals(Object o){
            Boolean result = false;
            if(o instanceof ObjWrapper) {
                ObjWrapper obj = (ObjWrapper)o;
                if(objEmail != null && objName != null) {
                    if(objEmail.equalsIgnoreCase(obj.objEmail) && objName.equalsIgnoreCase(obj.objName)) {
                        result = true;
                    }
                }
                
            }
            return result;
        }

        public Integer hashCode() {
            return 1;
        }
    }
Apex Code Sample

 

Apex Trigger

Trigger 这个东西很有用哦,如果是在原来的数据库中在数据insert /update/ delete 操作之前或者之后都可以在数据库里面附加一些额外的逻辑,这几直接可以混合到代码层面了,只需要限定需要执行的逻辑代码实在什么事后出发:

上例子:

 1 trigger GoodsTrigger on Goods__c (before delete, before update) {
 2     
 3    
 4     if(trigger.IsDelete) {
 5         //delete cascade
 6       
 7        /..../
 8     } else if(trigger.IsUpdate){
 9        /..../
10 }
11 
12 //根据需要添加自己的业务附加逻辑
13 
14 }
15        
Trigger Code

Page Layout

这个的好处是页面布局,根据需要可以对同一个数据对象进行基本的CRUD时,各自定义化地进行页面元素控制,例如页面显示10个字段还是5个字段,在移动端和桌面端显示的差异,以及部分用户可访问部分布局,而部分用户只能访问另外一些布局;不同的数据用不同的布局来呈现,减少的前端开发的成本,只需要简单的妥妥拽就能解决大部分问题;

User management - 复杂的用户管理

User:

用户和SF系统访问的核心,SF平台可以存储各种不同类型的user

Profile:

Profile 可以很好地控制同意类型的用户群的访问控制和操作,可见性可访问性的权限;例如对数据Object的CRUD权限,对页面的权限,对文件类的权限,甚至是对字段的权限、可读、可写权限的充分控制;

Role :

用户角色,可以充分展现用户关系以及群属、上下级包含以及层级架构关系,也可以用来进行角色层级的管控和数据访问范畴的控制;

Permission Set - 特权集

零散的个性化特权, 可以根据需要创建特权,例如对某个数据字段, 其他用户没有访问权限,而特定的2-3个用户需要权限,这样就可以使用permission set 特权集,之后将此特权集授权给相应的用户即可;

SOQL/SOSL - 数据查询/搜索语句

说到底就是我们在Oracle 或者SQL server里面用到的SQL 语句,只不过查询到不是表数据结果,而是SF里面Object 数据List, 通常查询到的记过都是一个List<SObject>,

上代码:

 List<Sobject__c> goodsSignDeleteList = [select Id,Name from Sobject__c where Id = 'a356EonAWEIbn3as8rJUX'];
SOQL Code

而SOQL 则是我们用的比较少的搜索语言, 类似于Baidu这种全局搜索,可以根据需要进行一定范围的模糊查询,能够快速的查询需要的结果;

1 FIND 'xxx'  //--查询的管
2 IN ALL FIELDS  //--字段范畴
3 RETURNING //--数据对象领域,当前搜索仅在account和Opportunity 两个object中搜索
4 account(where Name like '%zhang%' limit 1),
5 Opportunity(Name,StageName order by createddate asc limit 10)
SOSL Code

SOAP & Rest API - 接口和服务

SF 通过编写Apex Class 可以访问调用外部提供的API服务,支持SOAP和Rest API 风格的,同时, 也可以自己开发API提供给外部使用:

其他多方系统集成功能

例如:

在marketing Cloud 中的可以融合 Pardot, 安装外部包,可以联通Pardot 平台进行Salesforce 与其他平台的数据共享;

或者OCMS 这种可以在 SF平台上自己建立可以 快速开发静态公开web站点工具包,可以快速开发更新发布静态站点内容;

海纳百川,有容乃大,万千世界,博采众长,不卑不亢,谦逊有礼,行胜于言,厚积薄发。
原文地址:https://www.cnblogs.com/auxg/p/9595704.html