• 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站点工具包,可以快速开发更新发布静态站点内容;

    海纳百川,有容乃大,万千世界,博采众长,不卑不亢,谦逊有礼,行胜于言,厚积薄发。
  • 相关阅读:
    gorilla/mux 的学习
    SwitchyOmega 配置
    golang []byte 和 string相互转换
    golang 并发demo 写入 redis
    VS2010 显示TFS删除项
    WPF之转换器
    DataTemplate的用法
    DynamicResource与StaticResource的区别
    除非Windows Activation Service (WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。
    WPF 可视化树的用途
  • 原文地址:https://www.cnblogs.com/auxg/p/9595704.html
Copyright © 2020-2023  润新知