什么是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>
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 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
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 则是我们用的比较少的搜索语言, 类似于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)
SOAP & Rest API - 接口和服务
SF 通过编写Apex Class 可以访问调用外部提供的API服务,支持SOAP和Rest API 风格的,同时, 也可以自己开发API提供给外部使用:
其他多方系统集成功能
例如:
在marketing Cloud 中的可以融合 Pardot, 安装外部包,可以联通Pardot 平台进行Salesforce 与其他平台的数据共享;
或者OCMS 这种可以在 SF平台上自己建立可以 快速开发静态公开web站点工具包,可以快速开发更新发布静态站点内容;