Archive for September, 2006

ASP.NET中CMS的体系结构

CMS三层体系结构

我曾在开发CMS(内容管理系统)三层体系结构上受到好评,不过那已经是好久以前的事了。CMS三层体系结构与标准三层客户端/服务器体系结构是基本对应的。CMS三层体系结构没有什么难以理解的内容,都是一些常识性的东西。它的每一层对应着一个体系结构中必须的元素:交互(interaction)、操作(manipulation)以及存储。这三层是:

  • 表示层——处理与用户的交互、交流。
  • 事务逻辑(business logic)层——处理用户所需要的信息。
  • 数据库层——存储系统所处理的所有数据。

图A中直观的表示了CMS三层体系结构。图A所示的层分别位于不同的机器上,实际上,多个层可以存在于同一台计算机中,但是将它们分布在多台计算机中可以更好的分配CMS系统的负荷。

图A

CMS三层体系结构

CMS n层体系结构

简单的说,CMS n层体系结构就是把CMS三层体系结构的各个层分解为多个层,如B所示。把层进行分解的好处是使得各个层更好的协调工作从而提高了系统性能;同时这也使得系统分布在更多的计算机上,这样可以减少系统由于指定计算机耗时过多而造成的瓶颈,从而提高了系统负荷。

图B

CMS n层体系结构

表示层是什么?

尽管表示层并不见得比其它层更重要,但是它几乎得到了全部的荣耀——因为它是唯一的CMS用户可以看到的层。这个层负责CMS与用户的交互工作。

表示层实际上由两部分组成:即Web客户端和Web服务器。Web客户端驻留在用户计算机中,通常用来接受Web浏览器的表格(form)。Web服务器位于Web主机地址上,用来生成动态Web页面和组成CMS系统的表格。

Web客户端与Web服务器端通过“请求——回应”的方式来相互通信。Web客户端向Web服务器发出请求,Web服务器根据请求作出回应。

Web客户端使用的是HTTP的请求方式。如:

GET /index.html HTTP/1.0      User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT) Host: www.18idea.com Web servers respond using the HTTP response. For example: HTTP/1.1 200 OK Server: Microsoft-IIS/5.0 Date: Thu, 12 Jul 2002 19:19:52 GMT Connection: Keep-Alive Content-Length: 1270 Content-Type: text/html Set-Cookie: ASPSESSIONIDQQQGQGDC=MOFPDBPCPNIBACIBDCIOFCCL; path=/ Cache-control: private   <HTML> <BODY>  ... </BODY> </HTML>

HTML嵌入了Web服务器发出的回应,该回应用来指示浏览器显示什么内容;JavaScript用来实现客户端的基本功能。最近以来,其它技术,如Java applet和ActiveX组件开始流行了,不过Web服务器在最初发出的回应中,绝大多数还是使用HTML,这包括了服务器发出的用于通知客户端使用何种HTML以外的技术来接管后面的执行过程的回应。

事务逻辑层是什么?

重申一次,事务逻辑层的功能可以放到单个的服务器上(三层体系结构),也可以分布到多个服务器上(n层体系结构)。事务逻辑层的功能包括以下三个部分:

  • 访问(获取和保存)数据库层的数据。
  • 从表示层获取数据。
  • 执行必要的运算并且/或者处理数据。

事务逻辑层从数据库层获取数据,并根据表示层的需要来对数据进行处理。事务逻辑层也可以获得表示层提供的数据,并根据数据库层的需要对其进行处理。

CMS事务逻辑层的许多逻辑与其它两个层的交接(interfacing)有关。在Microsoft.NET下,由于ADO.NET、.NET remoting和Web服务器的帮助,这种逻辑的复杂性大多都被降低了。有了.NET之后,该层的最复杂的逻辑就是用于处理事务逻辑而进行计算和处理数据任务了(用C#或者Managed C++)。

什么是数据库层

数据库层的名字告诉了我们它的任务是什么了;它用来处理CMS数据。一个不太引人注意的地方就是,它的数据存储和检索功能并不限制于数据库。它可以是单个或者一系列平面文件(flat file),可能是XML格式。不过,数据通常还是存在数据库中。数据库的类型并不重要,因为对绝大多数CMS系统来说Microsoft SQL Server 2000与Oracle以及Sybase同样优秀(至少,你在Windows环境下)。也就是说,微软公司已经为Microsoft SQL Server 2000优化了.NET接口(interface);这可能会给它一个小小的优势(edge)。不过其它数据库提供商也没有闲着,微软的这个优势很快就会消失。

如果你不偏好某种数据库,你最好按通用的方式编写代码,这样你可以把任何数据库嵌入到你的CMS中。谁知道将来会怎样?今年所选择的数据库,明年你可能就不想再用了,是不是?

数据库层通常有它所在的计算机加载和访问。在大型的CMS中,通常在另一台计算机上保存一个镜像拷贝,这样可以在主机发生故障时,可以用它来顶替。

数据库层的内部工作过程、以及数据库本身,对一般的编程者来说是一个迷。开发者在本层的主要任务就是建立数据库、创建并载入数据库纲要(schema),偶尔也需要生成报表,还有一点就是要常常备份数据库。

选择哪一种体系结构?

选择哪一种体系结构(三层或者n层)取决于以下因素:

  • CMS 需要实现的功能
  • 数据的数量
  • 并行工作的用户数量
  • 预期的增长

基本上,如果你的CMS系统将一直保持较小的规模,最好选择三层体系结构。相反,如果你估计CMS系统会越来越大,n层体系结构是一个明智的选择。

由于服务器间的通信量不高,三层体系结构更容易实现。但是在.NET中,并不一定要这么做。由于三层体系容易构建,所以可以早日投入使用。这样,如果市场要求很急迫,三层体系结构也可以作为大的CMS系统的暂时解决方案;把三层体系结构的方案几乎“无痛苦”的移植到n层体系结构是可行的。不过,你要认识到,拥有大量用户的三层体系的CMS系统很可能会超负荷的。

小结

现在你应该基本理解这两种主要用于CMS的体系结构。同时,你也应该可以科学的评估你应该使用哪一种体系结构。

基于.NET的CMS数据库的两种设计方法

开发基于.NET的内容管理系统时,在理论上你有许多建立数据库的方法。然而,在绝大多数情况下,只有我们即将讨论的这两种方法中的某一种才管用。第一种是固定数据模型,在这种方式下,你所显示出来的内容总是包含相同的数据内容。如果你为某份报纸或者杂志建立CMS(内容管理系统),这种方法无疑是很好的一种。在第二种方法中,数据模型是一种模板驱动(template-driven)系统,数据是否被选中基于网页模板是否被选中。这种系统提供了更多的灵活性。

固定数据模型

由于你需要确保你的CMS所需的所有数据都齐全了,所以在使用固定数据模型之前你还需要做一些前期工作,即数据收集。当这一步完成后,建立逻辑数据库就很简单明了了。图A给出了一个CMS的固定数据模型的例子。

图A

固定数据模型的核心就是内容表;它包含了你的CMS中的所有内容实体。在我的新闻站点上,这些内容实体(报纸的模型)就是标题栏、来源、副标题、导言、正文和标志行。

由于我希望该系统支持基于角色(role-based)的工作流程,这样,为了处理内容的变化过程,内容表跟踪所有的帐户。内容的工作流(workflow)包括编写、编辑、批准(发行)和显示。

你可能还希望拥有控制版本的能力。我用了一种简单的方法实现了这个功能,即在数据库中保存各个版本的全部内容。你可以试一试仅仅保存版本之间变化的内容这种方法。

对数据库的设计为保存帐户的数据提供了灵活性。它仅为帐户表中的帐户保存它所需要的数据。然后,它为其它信息以该帐户ID的属性的方式保存下来。通过这样的方式,你可以为该用户在数据库中添加任何信息。例如,在你的帐户下添加电话号码,你可以给帐号ID的“家庭电话”属性赋值800-55-1234(或者任何其它电话号码)到帐户属性表中。

在本文的例子中,每一个帐户有多个角色。如,某个帐户既可以是编著者也可以是编辑。当为我们这个简单的CMS加上工作流之后,我们就可以使用这些角色。不过,过一会儿你就希望你的工作流基于角色而不是帐户,因为帐户的角色会随着时间而改变。

该数据库的另一个优点就是Notes(消息)功能。由于作者和编辑可能位于不同的大洲上,通信变得比较困难。(相信我,不同的时区会造成很大的麻烦!)Notes功能使得工作流上不同角色的通信变得简单起来。内容Notes与内容ID是相联系的,但是忽略内容的版本。

本设计允许在网站的多个栏目上显示相同的内容。但是,如果你的栏目很少,该功能也就没有什么作用了。同样的内容可以在不同的时间出现在不同的栏目里。例如,你可能希望即时新闻栏中的新闻保持时间不超过一天,但又希望新闻的保持时间稍久一些,那么上述功能就有了用武之地了。

如果你使用模板数据模型,内容实体可以在日后需要实现的时候确定。它也没有固定数据模型那样为内容实体而进行的艰难编码过程。不过,模板数据模型与固定数据模型还是有许多共同之处的,你可以在B中看到这一点。

表B

模板数据模型

这两个模型的最大共同之处就是它们处理帐户(也就是用户)的方式。它们工作方式完全相同。对模板数据模型来说,这是模板建立者的附加角色(附加任务),但是对固定数据模型来说,就是对数据库内容而不是数据库本身的附加。

在这两个模型中内容表都是数据库的基础,这也是它们的共同点。但是,模板数据模型的内容表与固定数据模型有着很大的不同,在模板数据模型中,内容表扮演了在网页模板、内容实体、Notes和显示栏目之间的枢纽角色。

在本设计中,模板建立者又一个新的角色。该角色设计网页,然后在内容实体所要出现的栏目上加入位置标志符。模板的建立工作流对应着内容实体的建立工作流,即编著、编辑、批准发行和显示。

我们已经提到,内容实体已经无需存到内容表中;内容实体将有一个自己的表(名为ContentNode)。在本模型中,你可以把相同的内容放到多个网页的模板中,这就提高了可重用性。由于每个内容实体(节点)都是自包含的(self-contained)而且有着自己的工作流,所以多个作者、多个编辑同时对同一个网页进行操作的情形是被允许的。不过,批准发行过程常常是基于整个网页而不是单个节点的——尽管这一点并不是必须的。

下面是建立模板数据模型网页的基本步骤:

  • 创建、编辑、批准发行网页。
  • 作者选择包含适当的模板(该模板包含若干正确类型的内容节点)去处理网页文章。
  • 作者创建所有内容节点。
  • 编者编辑内容节点。
  • 当所有的内容节点都准备好之后,它们可以作为一个已完成的内容页(即模板、内容节点和内容控制器)批准发行。
  • 当批准发行后,内容页就显示出来。
小结

现在你应该有了设计数据库的基本概念了。记住,如果你有固定数量的内容节点,你可以使用固定数据模型;如果节点数量很大或者文档与文档间的内容节点数是变化的,模板数据模型可能是一个更好的选择。

在我的下一篇文章中,我将讨论如何用ADO.NET去访问数据库中的数据。

建议您使用防毒无弹窗的FireFox浏览器,上网冲浪更安全。
有数码相机?有很多图片?使用免费的图片管理软件Picasa,还送1G免费网络相册!

最近关注的几个开放源代码的几个.NET的CMS系统和论坛系统

CMS系统:

1 Community Server国内有很多人使用它,也有一些中文增强包比如CCS,或者hidotnet,规矩的都把它的logo留下来了,不少商家把logo删除,那就是盗版了,这个是首选的,在微软http://www.asp.net也是用它,包括了相册blog论坛,几乎有用的都包了。
官方网站: www.communityserver.org
中文的可以看这里communityserver.cn

它有一个社区开源版本的授权,只要在每页最底端保留它的logo就行。

2 DotNetNuke
这个也是很有名的,简称DDN,国内也有相关的中文化研究组织。开发语言是VB.net也是支持asp.net 2.0.
开发人员据说都是有十年的VB开发经验。在微软的官方网站上也有一些相关的介绍,算是杀手级程序。

官方网站: www.dotnetnuke.com

3 RainBowPortal
官方网站:http://www.rainbowportal.net/

4 Cuyahoga
官方网站:http://www.cuyahoga-project.org/

5 SOOP Portal
官方网站:www.soopportal.org/

6 应用的比较多的国内的动网.NET新闻系统,不过安全性不敢恭维,

论坛系统:

1、 中国非常论坛cnVery bbs v3.01(SQL/ACESS)网站首页:http://www.cnvery.net/
发布地址:http://www.cnvery.net/cvb/board.aspx?boardid=2
演示地址:http://www.cnvery.net/cvb/

2、Asp.Net Forums网站首页:http://bbs.hidotnet.com/
发布地址:http://bbs.hidotnet.com/10/ShowForum.aspx
演示地址:http://bbs.hidotnet.com/
英文原版:http://www.telligentsystems.com/Solutions/Forums/

3、AspxBBS 4.3正式版

网站首页:http://www.9k8.com/
发布地址:http://www.9k8.com/AspxOS_BBS.aspx?A=D1_2&T=48&ST=0
演示地址:http://www.9k8.com/AspxOS_BBS.aspx

贴一下关注,对各系统的分析将陆续推出。.

http://wordpress.org/ 介绍 http://www.yuanma.org/data/2006/0326/article_173_1.htm

开源解决方案库 - Coppermine - 开源在线图片管理系统 - 中国开源软件资源库

http://oss.org.cn/modules/article/view.article.php/32/c5

http://oss.org.cn/

利用JS防止垃圾邮件侵扰

        跟我一样,诸多人都 收到过垃圾邮件的骚扰,除了邮件服务商为我们屏蔽了一些意图比较明显的垃圾邮件外,还是不同程度的收到了垃圾邮件的干扰。这些发送垃圾邮件的人很大程度上都是通过自动脚本来获取大家留在个人主页、blog、论坛、或者其他一些地方的邮件地址来发送垃圾邮件的。但是为了方便大家联系和其他一些因素避免不了在网上留下联系邮件地址,那如何避免恶意邮件的侵扰呢?让我们baidu一下:(见下图)
 

看到了吧,主要是以替换字符或者用图片代替的方式,又都有不足的地方就是不太美观,或者就是图片不方便,总之就是看着不舒服!今天有朋友问我blog公告栏里面的邮件地址是以文字的形式(下图)

 

就不怕垃圾邮件么?怕!谁能不烦呢,呵呵,但是我们有办法,用一句JS就可以实现,下面是我的实现方法

<script type='text/javascript'>var a = new Array('8.c','chen','de','li','g@18','om');document.write("<a href='mailto:"+a[3]+a[2]+a[1]+a[4]+a[0]+a[5]+"'>"+a[3]+a[2]+a[1]+a[4]+a[0]+a[5]+"</a>");
</script>

<noscript>
<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/lidecheng/220895/o_email.gif" align="absmiddle" height="21" width="143">
</noscript>

呵呵,看明白了吧,其实挺简单的,只要能想到.  如果你js不好看不懂的话只需要你把new Array后面的'' 中间的字符改为你的email地址拆分的字符,然后打乱,再在后面排一下顺序.再把<img src="http://........".........>中的图片地址改成你的就可以了,其实还是用到图片,不是么!

还是那句话:只有想不到,没有做不到.哈!