一、论坛的应用技术和支持环境
论坛,即讨论组,是基于网络技术的WEB应用。人们可以在上面按一定的组织形式发布各自的问题和观点、进行非实时性交流。笔者在此给出一个编写简单论坛的方法,读者若有兴趣可以一试。
本论坛采用ASP(Active Server Pages)技术编写,后台数据库为简单起见,采用Microsoft Access。在95/98平台上,需要安装Microsoft Personal Web Server,在NT平台则使用Internet Information Server(调试可用Peer Server),以此来设置你的网站的目录和名称,并能运行和调试你的ASP应用程序。笔者对数据库接口ODBC的配置是
数据库名称:forum.mdb
数据库与ASP应用程序在同一目录下,在此,均放在网站主目录下的子目录/forum中
ODBC中用户数据源(DSN)名为:forum,选取forum.mdb作为数据库
登录名称:user
登录密码:无
配置好ODBC数据源后,启动你的PWS或IIS,即可开始运行你的ASP应用程序。
二、论坛的形式
本论坛充分利用了浏览器的框架特性(frames,当然,必须浏览器支持,IE4.0以上即可),将页面划分成三部分,如下图1所示。该页面由顶框架TOP、左框架LEFT和主框架MAIN三个部分组成:
u 顶框架:导航栏,在整个论坛的使用和浏览期间始终不变,包括:
[返回主页]——从论坛直接退回网站主页;
[刷新内容]——对论坛进行刷新,读取最新消息;
[ 发 送 ]——在主框架中显示发送消息表单。
u 左框架:论坛目录和消息的列表,包括:
论坛目录——显示论坛组织的讨论主题,如本例中的六种,足球、篮球、排球、网球、羽毛球、乒乓球;
消息列表——按讨论主题分类显示消息,并且将消息与其答复消息组织在一起,并采用向右缩格方式表示其答复关系,如图1种足球主题中的一则消息“马明宇走得好!!!”,其答复消息为“RE:同意”。
u 主框架:消息内容显示和发送消息区,包括:
消息发送页面——进入论坛或点击导航栏的[ 发 送 ],显示一组由文本框和选择框组成的表单,填写相应内容后,点击“发送内容”按钮发送消息。消息发送成功会显示发送成功页面;
消息内容显示页面——选择点击左框架消息列表中的一项,在主框架中会显示该消息的标题、主题、提交作者、提交人邮箱、提交日期、提交时间、提交内容。在该页面中还有一个按钮“答复”,用于答复所浏览的消息;
消息答复页面——在消息内容显示页面中点击“答复”按钮,此时显示一个表单,填写相应内容后,点击“发送内容”按钮发送消息。消息发送成功会显示发送成功页面。答复消息将显示在所答复的消息下方,如消息列表中所述。
三、论坛的程序结构和数据库设置
3.1论坛的文件清单
本论坛由以下几个文件(均在forum子目录中)组成:
myforum.html——本论坛的进入主页,仅起引导作用;
discuss.asp——论坛的主页,包括三个框架,由discuss_top.html、discuss_left.asp和discuss_main.asp组成,如图1所示即为discuss.asp页面。本asp预统计每个论坛主题的消息总数和7天内的最新消息数并存在数据库中;
discuss_top.html——论坛主页的导航栏,即图1中的顶框架部分;
discuss_main.asp——论坛主页的主框架,即图1中的右下角表单部分,用于发送消息;
discuss_left.asp——论坛主页的左框架,即图1中的左下角目录列表部分,用于显示论坛的讨论主题目录,以及每个主题下的消息;
disc_post.asp——发送消息处理页面。当discuss_main.asp中填写的表单信息被发送时,调用本asp处理表单信息,并返回发送是否成功的信息;
contentdisplay.asp——显示消息内容页面。当选择点击左框架中消息列表的一项时,在主框架中显示该消息的相关信息(内容见前文2中主框架部分);
disc_reply.asp——答复消息表单页面。当主框架中显示某消息内容时,若点击“答复”按钮,则调用本asp显示一个表单,用于答复所浏览的消息;
disc_response.asp——答复消息处理页面。当disc_reply.asp中填写的答复表单信息备发送时,调用本asp处理表单信息,并返回发送是否成功的信息;
disc_showre.inc——消息发送成功包含文件。当disc_post.asp或disc_response.asp处理表单信息成功后,调用本包含文件显示消息发送成功信息;
message_show.inc——消息列表显示包含文件,在disc_left.asp中处理消息列表的显示;
opendb33.inc——包含文件,以光标类型3和锁定类型3打开主题消息表;
closedb33.inc——包含文件,执行事务处理并关闭和清除主题消息表对象;
forum.mdb——本论坛的数据库,采用Microsoft Access,其内所有的表和域说明见后。
3.2论坛的程序结构
下面采用图来说明论坛的文件关系和程序结构:
   
图2 论坛程序结构图
其中黑箭头表示调用或访问关系。
3.3论坛的数据库设置
本论坛的数据库为forum.mdb。此数据库内有数个表,分两类:
² 论坛主题表——forum_content,其结构设置如下:
字段名称 |
数据类型 |
字段大小 |
必填字段 |
允许空 |
索 引 |
注 释 |
index |
自动编号 |
长整形 |
|
|
有(无重复) |
记录索引 |
contentname |
文本 |
100 |
否 |
否 |
无 |
讨论主题 |
total |
数字 |
长整形 |
否 |
|
无 |
该主题消息总数 |
newest |
数字 |
长整形 |
否 |
|
无 |
最近7天内的新消息数 |
表1 论坛主题表的结构
◇主题消息表——在论坛主题表forum_content中字段contentname中有几个记录,就应该建立几个主题消息表,表的名称和contentname的值相同。
例如,本论坛中设定了六个讨论主题,即在讨论主题表forum_content中添加六个
记录,其字段contentname值依次为:足球、篮球、排球、网球、羽毛球、乒乓球,则建立六个主题消息表,其表名依次为:足球、篮球、排球、网球、羽毛球、乒乓球,并且每个主题消息表的结构都是相同的。
主题消息表的结构设置如下
字段名称 |
数据类型 |
字段大小 |
必填字段 |
允许空 |
索 引 |
注 释 |
index |
自动编号 |
长整形 |
|
|
有(无重复) |
记录索引 |
subject |
文本 |
100 |
否 |
否 |
无 |
消息标题 |
submitdate |
日期/时间 |
|
否 |
|
无 |
消息提交时间 |
level |
数字 |
长整形 |
否 |
|
无 |
该消息所处的层次,详见4 |
content |
备注 |
65,535字符 |
否 |
是 |
|
消息正文 |
next |
数字 |
长整形 |
否 |
|
无 |
链接指针,指向该消息的下一个消息,详见4 |
name |
文本 |
50 |
否 |
否 |
无 |
提交该消息者的姓名 |
email |
文本 |
50 |
否 |
是 |
无 |
提交该消息者的电子邮箱 |
表2 论坛主题消息表的结构
四、论坛的关键算法说明
编写本论坛有两个需要注意的,一个是论坛主题的确定和显示,一个是消息按主题和层次显示和处理。 4.1论坛主题的确定和显示
可能读者已经注意到,在3.3中论坛主题表forum_content中有一个字段域为contentname,用来存放论坛主题。在本论坛中,采用读取该字段值输出到客户端浏览器页面的方法来显示论坛主题,这样只需要在论坛主题表中修改、添加或删减记录即可实现论坛主题的变更,而不需修改应用程序。唯一需要注意的一点是,每当发生论坛主题的变更时,应该相应地对3.3中的主题消息表的表名进行变更,保证论坛主题的每个记录在数据库中都有一个以该记录中字段contentname的值命名的主题消息表存在。
这段处理程序在文件discuss_left.asp中,如下:
<% ‘display discuss content显示讨论主题
on error resume next ‘程序出错则继续运行
dim recordtotal ‘定义变量recordtotal存储论坛主题表中记录总数
dim contotal() ‘定义数组contotal存储论坛主题表中的contentname的值
set rs=server.createobject("ADODB.recordset")
rs.open "select * from forum_content","DSN=forum;UID=user;PWD=",3,1
‘以只读方式打开数据库forum.mdb中表forum_content
if not rs.eof then ‘记录不为空则继续
%> <ul> ‘采用无序项目列表方式显示所有的讨论主题
<%
recordtotal=rs.recordcount
‘获得记录总数
redim contotal(recordtotal-1)
‘重定义数组contotal,确定实际内存大小
for i=0 to recordtotal-1
%>
<li><a href="#content<%=i%>"><%=rs("contentname")%></a>
(共<%=rs("total")%>条,<font color="#ff0000">新<%=rs("newest")%>条</font>)</li>
‘显示论坛主题及该主题下的消息总数和新消息数(这里为7天内)
‘其统计处理程序段在discuss.asp中
<% contotal( i )=rs("contentname")
rs.movenext
next%> ‘for循环,直到记录尾
</ul>
<%
else ‘没有讨论主题记录
response.write "对不起,还没有讨论内容."
rs.close
set rs=nothing
response.end
‘显示相应信息,关闭并清除rs,结束asp页面请求并显示页面结果
end if
rs.close
set rs=nothing ‘有讨论主题记录操作结束时关闭并清除rs
%>
程序段1
|