教学前言
课程介绍
师资介绍
教材介绍
课程计划
教学大纲
教学计划
实训计划
课程总表
教学内容
作业考试
作业上传
在线测试
测验考试
互动讨论
学习论坛
疑难解答
意见建议
 
 
章节:
第7章 ASP开发实例
7.3 BBS论坛
重点:
这是一个相对比较复杂的ASP系统,了解其设计框架;ASP+Access技术;分页显示的运用
难点:
分页显示的运用
内容:

BBS论坛又称为电子公告板,在网页中加入论坛可以给浏览者提供讨论问题的空间,让用户与网站所有者、用户与用户之间进行良好的沟通。论坛里的文章俗称“帖子”,在论坛里回应别人的文章俗称“灌水”,如果是比较复杂的论坛还要根据话题分出不同的版块,而这些版块的管理员又叫版主,俗称“斑竹”。
以论坛为基础,做适当的修改就可以开发出其他的交互性功能,比如信息发布系统、电子政务系统等。
这里介绍一个具有简单功能的论坛。它主要提供以下功能:分页显示文章;显示文章及回复的具体内容;显示文章的回复数及浏览数;发表新文章;回复文章;管理员登录;论坛的简单管理。这些只是一个论坛的基本功能,其实一个相对完善的论坛还应该有复杂的权限管理、分级显示等,由于篇幅有限,这里只给出BBS论坛基本功能的设计。在具体程序编写前,我们首先对论坛进行整体的框架设计。
7.3.1 论坛的总体框架设计
本论坛包含下列ASP文件:
▲ conn_db.asp,数据库连接文件。该文件用于连接数据库,系统中所有要对数据库进行操作的页面均通过<!--#include file="conn_db.asp"-->以包含这个文件。采用这种包含连接文件的方式,数据连接的操作代码放在一个包含文件里,便于维护与修改数据库的连接信息,也使页面代码简化。
▲ sdbbsindex.asp,论坛入口页。实现分页显示文章标题;通过文章标题链接到显示文章具体内容的页面;进入管理登录页面和发表新文章页面的链接。
▲ publish.asp,发表文章页。用户在此页面发表新文章。
▲ adminlogin.asp,管理员登录页。管理员在此页面通过用户名及密码登录到管理页面。
▲ admin.asp,管理员管理页。实现分页显示文章标题;删除文章。
▲ article.asp,文章及回复内容显示页。实现显示文章及回复的具体内容;链接到回复文章页。
▲ re_ article.asp,回复文章页。用于浏览者回复文章。
▲ hit_num.asp:记录浏览次数。
说明:
▲ 本论坛采用技术为ASP+Access。
▲ 与数据库的连接设计成为一单独文件,由ASP文件包含。
▲ 为了移植方面,没有设置数据源,而是在连接代码中直接指明数据库文件信息和驱动信息。
▲ 通过表格进行论坛的布局。
▲ 为了突出重点内容,没有进行什么页面美工方面的设计。
▲ 本论坛所有页面文件及数据库文件均位于同一目录下。
本论坛采用数据库存储信息,所以还要对数据库及其表结构进行设计。
7.3.2 论坛的后台数据库设计
本论坛数据库采用大家比较熟悉的Access,包含表article和admin。
article表用于存放文章信息,包含id(文章编号)、title(标题)、articlebody(文章内容)、layer(文章所在层数)、parent_id(上一级文章id)、re_num(回复数)、hit_num(浏览数)、name(作者名)、submit_date(发表时间)等字段,其设计如所示。

说明:
▲ 层数:本例中只有二层,即源文章和回复文章。层数为1表示是源文章,层数为2表示是回复文章。
▲ 上一级文章id:如果是回复文章,则为源文章的编号,如果是源文章,则为0。
▲ 回复数:该文章回复文章的数目。
▲ 浏览数:浏览者点击浏览该文章的数目。
admin管理员表用于存放管理员的信息,包含管理员的用户名和密码字段,如图所示。

在数据库admin表中事先设置好管理员的用户名和密码。
下面具体编写论坛的ASP程序。
7.3.3 论坛的程序设计
conn_db.asp是数据库连接文件,包含数据库的信息,其代码如下:
<%
set db=Server.CreateObject("ADODB.connection")
db.Open"DBQ="&Server.Mappath("sdbbs.mdb")&";DRIVER={Microsoft Access Driver (*.mdb)}"
%>
sdbbsindex.asp,论坛入口页。功能是分页显示文章标题;通过文章标题链接到显示文章具体内容的页面;进入管理登录页面和发表新文章页面的链接。其代码如下:
<!--#include file="conn_db.asp"-->
<html>
<head>
<title>盛达公司论坛</title>
</head>
<body>
<h3 align="center">盛达公司论坛</h3>
<center>
<table border="1" bordercolor="#111111" width="600" style="border-collapse: collapse" cellpadding="0" cellspacing="0">
<tr bgcolor="#CCFFFF" align="center">
<td width="37" bgcolor="#C0C0C0" >序号</td>
<td width="239" bgcolor="#C0C0C0" >标题</td>
<td width="49" bgcolor="#C0C0C0" >回复数</td>
<td width="52" bgcolor="#C0C0C0" >浏览数</td>
<td width="101" bgcolor="#C0C0C0" >作者</td>
<td width="96" bgcolor="#C0C0C0" >发言时间</td>
</tr>
<%
dim sql,rs
' 因为要分页显示查询结果,因此要创建一个recordset对象
' 按文章发表时间降序查询显示文章信息
sql="select * from article where layer=1 order by submit_date desc"
set rs=Server.CreateObject("ADODB.Recordset")
rs.Open sql,db,1 ' 因为要分页,必须用键盘指针类型打开记录集
if not rs.bof and not rs.eof then ' 判断记集录是否为空
' 设置分页显示
dim page_size ' 定义每页多少条记录变量
dim page_no ' 定义当前是第几页变量
dim page_total ' 定义总页数变量
page_size=6 ' 设置每页显示6条记录
' 如果第一次打开,则page_no为1,否则,由传回的参数决定
if Request("page_no")="" then
page_no=1
else
page_no=Request("page_no")
end if
session("page_no")=page_no ' 将page_no存入session,以备其他页调用
rs.pagesize=page_size ' 设置每页多少条记录
page_total=rs.pagecount ' 返回总页数
rs.absolutepage=page_no ' 设置当前显示第几页
' 显示当前页的所有记录
dim i,j
i=0 ' 该变量用来输出序号
j=page_size ' 该变量用来控制显示当前页记录
do while not rs.eof and j>0 ' 循环检测该页结束或整个数据库文件结尾
i=i+1
j=j-1
%>
<tr align="center">
<td width="37"><%=(page_no-1)*page_size+i%>  <td width="239"><a href="hit_num.asp?id=<%=rs("id")%>"><%=rs("title")%></a> </td>
<td width="49"><%=rs("re_num")%> </td>
<td width="52"><%=rs("hit_num")%> </td>
<td width="101"><%=rs("name")%> </td>
<td width="96"><%=rs("submit_date")%> </td>
</tr>
<%
rs.movenext
loop
end if
%>
</table>
 <p align="center">
[本页是第<%=page_no%>/<%=page_total%>页]
<% if int(page_no)>1 then %>
[<a href="sdbbsindex.asp?page_no=<%=cstr(int(page_no)-1)%>">上一页</a>]
<% end if%>
<% if int(page_no)<int(page_total) then %>
[<a href="sdbbsindex.asp?page_no=<%=cstr(int(page_no)+1)%>">下一页</a>]
<%end if%><p><a href="adminlogin.asp">管理</a>&nbsp;&nbsp;&nbsp;
<a href="publish.asp">发表</a>&nbsp&nbsp&nbsp&nbsp
</p>
</center>
</body>
</html>
 点击浏览sdbbsindex.asp运行效果参见本平台《学习论坛》bbs.asp。
说明:
▲ 注意<%=rs("id")%>等写法。向用户端输出的常用方法通常有response.write( )和<%= %>。
▲ int(page_no)为取整函数的使用;cstr(int(page_no)-1)将int(page_no)-1整数子类型强制转换为字符串子类型。
publish.asp用于用户发表文章,用户在此页面发表新文章。发表新文章页面的表单元素如表7-1所示。

表7-1 发表新文章页面的表单元素
名称
类型
说明
title text文本框 作者填写 文章标题
articlebody textarea文本区 作者填写 文章内容
name text文本框 作者填写 作者姓名
submit submit 提交 提交表单

publish.asp页面代码如下:
<!--#include file="conn_db.asp"-->
<html>
<head>
<title>发表新文章</title>
</head>
<body>
<h4 align="center">发表新文章</h4>
<center>
<table border="0" width=400 style="border-collapse:collapse" bordercolor="#111111" cellpadding="0" cellspacing="0">
<form method="post" action="" name="form1" >
<tr><td>主题:</td><td width="341"><input type="text" name="title" size="40">** </td></tr>
<tr><td>内容:</td><td width="341">
<textarea name="articlebody" rows="4" cols="37" wrap="soft"></textarea>**</td></tr>
<tr><td>姓名:</td><td width="341"><input type="text" name="name" size="10"> </td></tr>
<tr><td></td><td width="341">
<input type="submit" value="提交" size="20"></td></tr>
</form>
</table>
</center>
<p align=center><a href="sdbbsindex.asp?page_no=<%=session("page_no")%>">返回首页</a>
<%
if request("title")<>"" and request("articlebody")<>"" then
layer=1 ' 表示是第一层
parent_id=0 ' 因为是第一层,上一级文章编号设为0
re_num=0 ' 回复数为0
hit_num=0 ' 浏览数为0
' 将文章保存到数据库
db.Execute " insert into article(title,articlebody,name,layer,parent_id,re_num,hit_num,submit_date) values (" _
& "'" & Request.Form("title") &"', " _
& "'" & Request.Form("articlebody") &"', " _
& "'" & Request.Form("name") &"', " _
& "" & layer &", " _
& "" & parent_id &", " _
& "" & re_num &", " _
& "" & hit_num &", " _
& "'" & date() & "') "
db.close ' 关闭连接对象
' 保存完毕,重定向回首页
response.redirect "sdbbsindex.asp?page_no=" & session("page_no")
end if
%>
</body>
</html>
说明:
▲ 通过表单来采集用户输入信息。<form method="post" action="" >,表示将表单的输入数据用POST方法提交给publish.asp自身页面里的ASP程序处理,action=""为空,表示提交给自身页程序处理,也可以写成action="publish.asp"。
▲ if request("title")<>"" and request("articlebody")<>"" then
用于验证表单输入文章标题和文章内容是否为空。
▲ 如果一条ASP语句太长,一行写不下,可以断行,注意观察断行的写法。
 点击浏览publish.asp运行效果参见本平台《学习论坛》publish.asp。
hit_num.asp用于记录文章的浏览次数,其代码如下:
<!--#include file="conn_db.asp"-->
<%
dim id
id=request("id")
' 如浏览者点击浏览该文章,则将浏览次数加1,然后引导至article.asp显示文章内容
sql="update article set hit_num=hit_num+1 where id=" & id
db.execute(sql)
db.close
response.redirect "article.asp?id=" & id
%>
article.asp用于显示文章及回复内容,其代码如下:
<!--#include file="conn_db.asp"-->
<html>
<head>
<title>文章及回复</title>
</head>
<body>
<h4 align=center>文章及回复</h4>
<%
dim id
id=request("id") ' 获得要显示的文章编号
' 查询并显示该文章信息
dim sql,rs
sql="select * from article where id =" & id
set rs=db.execute(sql)
%>
<center>
<p><a href="sdbbsindex.asp?page_no=<%=session("page_no")%>">返回</a>&nbsp&nbsp&nbsp&nbsp
<a href="re_article.asp?id=<%=id%>&title=<%=rs("title")%>">回复</a>
<table border="1" width="400" bordercolor="#000000" style="border-collapse: collapse" cellpadding="0" cellspacing="0">
<tr>
<td width=37>标题</td>
<td width="360"><%=rs("title")%> </td>
</tr>
<tr>
<td width="37">内容</td>
<td width="360"><%=rs("articlebody")%> </td>
</tr>
<tr>
<td width="397" colspan="2"><%=rs("name")%>&nbsp;发表于<%=rs("submit_date")%></td>
</tr>
</table>
<%
' 显示回复
sql="select * from article where parent_id=" & id
sql=sql + " order by submit_date desc"
set rs=db.execute(sql)
do while not rs.eof
%>
<table border="1" width="400" bordercolor="#000000" style="border-collapse: collapse" cellpadding="0" cellspacing="0">
<caption align=left>回复:</font></caption>
<tr>
<td width=36>标题</td>
<td width="361"><%=rs("title")%> </td>
</tr>
<tr>
<td width="36">内容</td>
<td width="361"><%=rs("articlebody")%> </td>
</tr>
<tr>
<td width="397" colspan="2"><%=rs("name")%> &nbsp回复于<%=rs("submit_date")%></td>
</tr>
</table>
<%
rs.movenext
loop
%>
</center>
</body>
</html>
说明:
▲ 注意利用表格布局循环输出记录的写法。
▲ <a href="sdbbsindex.asp?page_no=<%=session("page_no")%>">返回</a>
这个链接是要返回首页。由于首页是分页显示,因此这里的“返回”,应该返回到正在显示的那一页。page_no用于表示首页的当前页码,在首页中,page_no已经被记录到session。通过page_no=<%=session("page_no")%可以在返回时将当前页码作为参数传递回去,首页就可以正确显示出相应的页。
▲ <a href="re_article.asp?id=<%=id%>&title=<%=rs("title")%>">回复</a>
这个链接是链接到回复该文章的页面。id=<%=id%>用于传递文章编号参数,title=<%=rs("title")%>用于传递文章标题参数。
 点击浏览publish.asp运行效果参见本平台《学习论坛》article.asp。


    

~ 江西信息应用技术职业学院信息技术系制作 ~

E-Mail:lxlz2050@163.net Tel:0791-5275546