Edu-CRM 框架设计

序言

本文写于Edu-CRM开发之前,现其中的功能大部分已经实现,实现时稍有不同,但基本思想不变。

 

设计要求

  • 支持多Tenant
  • 支持多语言
  • 支持数据版本
  • 支持自定义字段
  • 支持自定义查询
  • 支持数据导入导出

总体设计

clip_image002[4]

  • 利用Cache加快访问Localize和Metadata的速度
  • 对于固定的数据使用DLINQ来进行查询,返回对象
  • Metadata的定义采用name-value pair的方式
  • 对于高级查询或者通用查询将使用Dynamic Query的方式,返回name-value pair
  • 在系统中任何地方都需要通过支持多语言(如Metadata定义)
  • 支持一定格式的数据导入导出(Excel,CVS等)
  • 数据的修改需要通过Version来进行控制,能进行各种版本操作

详细设计

Metadata

数据库的设计将采用固定表的模式+Metadata数据库 + name-value Pair的方式

Metadata数据库存储数据库的结构(包括固定表和扩展的字段)

Name-value Pair的方式仅存储扩展字段的值

clip_image004[4]

可以参考《SAAS多用户数据体系结构》

  • CRM数据库的所有字段都在Metadata数据库中有定义,如果是CRM基础数据表或字段则定义不能被修改。
  • 可以在Metadata数据库中定义Entity(表)
  • 可以扩展现有Entity的Property也就是表中的字段
  • 字段有类型、长度、校验表达式(客户端和服务器端)、是否可以查询
  • 需要根据字段的类型处理该字段的Default Value,如字段类型为List,则DefaultValue为1,2,3,4,5
  • 可以定义Entity之间的关系
  • 数据采用name-value pair的方式进行存储
  • 对于数据量比较大的Entity可以单独定义一张表进行存储数据

自定义查询

自定义查询涉及两个问题:

  1. UI(可以参考Microsoft Dynamic CRM)
  • 可以让客户很容易的进行查询的自定义
  • 能够支持AND、OR、Equals、GreaterThan、In、Like等操作
  • 能够选择Entity以及Properties
  • 能够将用户自定义的查询进行存储

   2.  后台

  • 能够将UI的查询翻译成SQL进行查询
  • 返回的数据格式

基于以上的两个问题设计思路可以考虑使用XML树。

XML比较容易存储,利用树形来设计UI,设计一个类能够将XML树转化成SQL,返回的数据格式可以采用name-value pair的形式。

XML数据格式如下:

clip_image006[4]

对应的SQL:

select ac.subject,ac.activityid,ac.scheduledstart,ac.regardingobjectid,ac.prioritycode,ac.scheduledend,ac.activitytypecode from activitypoit as ac

join activityparty as aa

on ac.activityid = aa.activity

join systemuser as ab

on ac.owninguser = ab.systemuserid

where (ac.statecode in (0,3)) or (ac.activitytypecode <>'4404')

aa.partyid='XXXXX' and ab.address1_city = 'ss'

多语言

  • 可以根据不同的客户自动选择应用程序的语言,判断顺序如下:
  • url,也就是query string (?loc=zh-cn)
  • Cookie,也就是用户上次选择的语言
  • 浏览器设置的语言
  • 显示默认的语言
  • 确定语言之后就需要显示Localize,在这里还需要考虑多Tenant的问题,具体的判断是先查找该Tenant的Localize,如果没有则使用默认的Localize
  • 给用户提供UI可以进行翻译
  • 使用缓存(web可以生成静态js文件;客户端程序则下载到本地,每次判断有无更新即可)

clip_image008[4]

导入导出

  1. 在Grid控件上提供导入导出功能,根据Grid的数据源进行处理
  2. 提供通用的导出功能,可以选择导出的Entity,Properties,设定过滤条件进行导出,参考【自定义查询】
  3. 提供通用的导入功能,在导入时需要选择Entity,进行Property mapping,设定匹配原则。如果根据匹配原则找到的结果大于1,则需要进行人工操作
  • Property Mapping采用如DTS的数据Mapping方式
  • 如果存在重复数据时则可以使用列表方式来显示导入数据。选中一条导入数据可以查看数据库中和该条数据匹配的记录,可以选择其中一条数据进行更新

     4.  导入导出数据格式转换,如F-Male(男)

     5.  导入导出的方式可以为Excel、CSV、Web Service、XML

数据版本

  • 用户可以配置哪些Entity需要进行版本记录
  • 版本库可以通过ChangeSet进行查看每一批修改内容
  • 版本库可以根据Label进行提取一系列数据
  • 数据回滚也将通过ChangeSet增加一批修改记录

clip_image010[4]

缓存技术

服务器端缓存

  • Metadata数据可以在内存中进行缓存
  • Localize数据可以生成静态文件
  • 对于系统运行时数据进行缓存

Web Browser缓存

  • PersistJS(Flash、Gears、Cookie、IE User Data etc.)
  • SilverLight Isolated Storage

第一个打分

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

服务器端进行MailMerge

最近开发项目时,有一个模块需求如下:
用户筛选出客户信息后,选择需要Merge的字段,再选择Template Word模板,点击Merge后即可下载Merge后的文档。参照Microsoft的Dynamic CRM等相关资料,发现Merge操作通过在服务器端生成数据文件和Template模板下载到客户端后,在客户端进行Merge操作。在客户端装插件或者宏操作。由于项目是B/S架构,所以考虑客户端Office版本问题,还有在客户端操作的话在打开Word文档时会选择数据源,对于Office初学者会造成意想不到的结果,在客户端进行Merge也会加大将来软件的维护成本,故在服务器端进行Merge操作后直接返回Merge后的文档。

由于在服务器端进行Merge操作,故需要用Com组件,这里我用了 Microsoft.Word12.0   组件,实现接口如下:

String MailMergeWord(String templateFilePath, MergeData data)

MergeData类
+XmlFilePath
+XmlUrl
+XmlString
+List<Dictionary<String,String>> MegerDataList

MergeData中MegerDataList是数据源,它按优先级从高到低MergeDataList,XmlString,XmlFilePath,XmlUrl依次查找,如果前一值不存在才通过后一值赋值给MegerDataList。

MailMergeWord思想如下:
1.打开Template文档
2.由MergeDataList生成新的文档,并且作为Template的数据源
3.Merge生成新的文档Save,提取文档名,返回。

第一个打分

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

VS SP1 Beta发布

百忙之中发现微软的VS 2008 Sp1 beta 中给了我很多惊喜,最大的是它帮我们解决了一个目前很头痛的一个问题,那就是Smart Client在性能不是很好的机器上运行效率较差的问题,本次Sp1中引入了Client Profile的概念。

Improvements for Client Development

.NET 3.5 SP1 and VS 2008 SP1 contain major performance, deployment, and feature improvements for building client applications.  Tim Sneath has a great blog post that talks about some of the client improvements here.  Below are more details on them:

Application Startup and Working Set Performance Improvements

.NET 3.5 SP1 includes significant performance improvements to the CLR that enable much faster application startup times - in particular with "cold start" scenarios (where no .NET application is already running).  Much of these gains were achieved by changing the layout of blocks within CLR NGEN images, and by significantly optimizing disk IO access patterns.  We also made some nice optimizations to our JIT code generator that allow much better inlining of methods that utilize structs.

We are today measuring up to 40% faster application startup improvements for large .NET client applications with SP1 installed.  These optimizations also have the nice side-effect of improving ASP.NET application request per second throughput by up to 10% in some cases.

New .NET Framework Client Profile Setup Package

.NET 3.5 SP1 introduces a new setup package option for developers building .NET client applications called the ".NET Framework Client Profile".  This provides a new setup installer that enables a smaller, faster, and simpler installation experience for .NET client applications on machines that do not already have the .NET Framework installed.

“.NET Framework 3.5 Optimized Client Runtime
.NET Framework 3.5 SP1 provides an install version of the .NET Framework optimized for client development. The expected final size of this optimized runtime is less than 20 MB.”

 

同时Routing Engine也是在项目中比较实用的Lib,在这之前我们自己(Beauli)还开发了一套截获Uri请求Mapping到函数参数的Lib,看来有机会可以直接用微软的了。

“.NET 3.5 SP1 includes a flexible new URL routing engine that allows you to map incoming URLs to route handlers.  It includes support for both parsing parameters from clean URLs (for example: /Products/Browse/Beverages), as well as support to dynamically calculate and generate new URLs from route registrations.”

 

由于我们项目使用了Extjs,很高兴看到微软也强力支持Web2.0的开发模式,增加了对复杂JS Lib的Code Intellisense。

Better Visual Studio Javascript Intellisense for Multiple Javascript/AJAX Frameworks

VS 2008 includes Javascript Intellisense support in source view.  The intellisense support with the initial VS 2008 release works well with vanilla JavaScript as well as code written using the ASP.NET AJAX JavaScript type patterns.  JavaScript is a very flexible language, though, and many JavaScript libraries use this flexibility to full advantage to implement their features - sometimes in ways that prevented the intellisense engine from providing completion support.

VS 2008 SP1 adds much better intellisense support for popular Javascript libraries (we specifically did work to support JQuery, Prototype, Scriptaculous, ExtJS, and other popular libraries).  You will get better default intellisense when you reference these libraries.  We are also looking at whether we can maintain additional intellisense hint files that you can download to get even better intellisense and documentation support for some of the more popular libraries.

 

Article

Downloads

Documents

http://vs2008sp1docs.msdn.microsoft.com/en-us/default.aspx

Offline Install 

VS Sp1 Full download VS90sp1-KB945140-ENU.exe /createlayout c:\download

第一个打分

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5