加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[转发]基于.shtml静态文本的文章管理系统- -

(2008-08-22 16:29:23)
标签:

shtml

静态

文章管理系统

it

今年上半年做了一个文章管理系统,把思路说一下,和大家切磋切磋:


一、总体思路


如果在服务器端采用动态程序,可以提高站点的交互性,同时使站点的内容更新非常便捷。这就是动态站点技术。但是当一个站点的访问量非常大的时候,动态程序对Web Server以及Database Server的压力会非常大。

如果采用静态页面,当然对Web Server的压力很小,而且对Database Server没有压力。但是这样做的劣势是显而易见的——更新繁琐,没有交互性。

再看看动态站点技术,我们会发现绝大多数页面只是将数据库中的内容读出来显示,用户每一次访问这种页面,服务器端都要重复做一次数据库读取,如果把这些页面预先生成为静态页面,那么将大大降低服务器的负担。而这种静态页面的生成可以采用动态站点技术去动态生成。

为了降低声生成页面的复杂性,提高程序的可维护性,采用SSI技术,也就是说,采用后缀为.shtml或者.shtm的静态页面。这种页面默认情况下是由 System32inetsrvssinc.dll 这个动态链接库处理的,它可以根据页面中的SSI指令将多个文档合成为一个静态页面。这样的话,对于那些每个页面都有的公共HTML块,以及许多页面共同包含的HTML块,可以采用SSI进行包含,大大减少生成页面的工作量和复杂性。

为了使静态页面具有一定的交互性,可以在页面中采用javascript,而javascript源(Source)可以从动态脚本中产生。
也就是说,在页面中的javascript脚本可以是这种形式:
<script language="javascript" src="/js/welcome.asp?pageid=A001"></script>

这样,就解决了页面的交互功能。


二、文章管理系统的模块化设计


常见的文章管理系统常常把内容管理与文章的显示部分混在一起,这样做非常不利于程序的扩展。
我的文章管理系统在程序编写的时候采用模块化的程序框架,尽量遵循MVC,整体框架如下:

1、管理员帐号及权限管理系统
2、独立的内容管理系统(CMS)
3、模板类
4、页面生成触发程序

 

三、管理员帐号及权限管理系统

这部分程序没什么好说的,密码基于MD5加密之后又做了一层加密,权限控制模仿NTFS的权限机制,可以对每个用户的权限进行定制。在其他程序中要想进行权限控制,之需要引用有关文件并指明页面的PageID或者页面的“页面组”即可。

以前我曾经做过一个大学教务管理程序,那个程序里面对管理员的活动还有日志记录。而且日志记录程序是相对独立的。可以把那么日志记录程序整合到这个管理员帐号及权限管理系统中来。


四、独立的内容管理系统(CMS)

该内容管理系统支持无限级的文章类别分类,并可以定制专题。
值得一提的是,该文章管理系统可以让管理员自定义每一类文章的录入项目以及附件项目,例如:对A类文章可以录入文章内容、文章简洁、引言,对B类文章可以录入文章内容、首页调用缩略图,每一类的文章都可以任意定义文字模块和附件。
每一篇文章可以包含“子文章”,就像每一个文章类可以包含任意子类。


五、模板类

模板的存储方式无非是文本和数据库两种。我的模板是存储在SQL Server数据库中的,这样做的好处是显而易见的。
模板的管理非常方便。可以导入、导出模板。

导出模板即:将模板通过ADODB.Stream输出浏览器,并通过Response.BinaryWrite产生下载的动作,下载后在本地打开这个文件,就是一个HTML格式的文本,文本中文章显示的部分用特定的标签代替。我的模板支持数组。

对模板文件编辑以后,还可以导入到数据库中。导入的过程其实就是上传到服务器端并读到数据库里面去,当然在操作的时候是一步完成的。

六、页面生成触发程序

生成.shtml静态文本

前面说过采用SSI降低复杂度并提高可维护性,这里就不对此再次罗嗦。值得一提的是页面生成的逻辑控制。
并不是每一次对任何一篇文章的修改都需要重新生成所有页面。哪一类文章被重新编辑或者录入,由此引发的站点页面变动,这种对应关系是一个树结构。

现在我采用的触发机制很简单,无非是某一类文章被修改后,查找关系树确定要重新生成页面的任务范围,将这些任务写到一个任务表中去逐条执行。

页面生成任务在执行的时候,考虑到对一些大站可能因为任务过多而造成服务器端脚本超时,所以令任务的执行程序在执行完毕以及超时之后都能自动返回任务调度程序。
其实返回的功能实现很简单:

<meta HTTP-EQUIV="Refresh" content="0; taskcontrol.asp">

这样的话即使脚本超时也不怕。
任务成功执行一条就删除一条,即使中途由于某种不可预见的问题导致某个任务执行失败(比如:超时),程序也仍然会返回任务调度程序继续执行,已经执行过的任务不重复执行,任务执行的先后顺序也是从数据库里面控制的,直到所有任务均执行完毕。

触发机制其实还可以这样改进:通过SQL Server的触发器。不过这需要写扩展存储过程。留着以后有时间的时候再作扩展吧。


七、程序的扩展性

程序的四大部分,每一部分都可以灵活扩展。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有