电子论坛系统的设计与实现
摘 要
电子论坛即BBS已经是互联网上的一种极为常见的互动交流服务。论坛可以为网友提供开放性的分类讨论区专题服务,网友们可以在此发表自己的观感,交流某些技术,经验等。论坛也可以作为用户和商家交流的渠道,商家也可以在此回答用户提出的问题或发布某些消息。
本系统使用ASP进行开发,数据库采用Microsoft SQL Server 2000。本文描述了电子论坛系统的设计与实现。首先对系统的需求进行了分析,建立系统工作流程图,设计系统数据库,对数据库结构进行了详细分析。然后划分系统功能模块,最后详细描述了各个功能模块实现的方法,并给出相应代码。
关键词:电子论坛系统;ASP;SQL Server 2000
The Design and Implementation of BBS
Abstract
BBS as an electronic forum on the Internet is a very common interaction services. Forum provides an open platform to discuss one subject amony netizens . Netizens can express their impressions and communicate technologies and experience. It also can be used as a channel for the communication between customers with businessmen.
The system is developed with ASP and Microsoft SQL Server 2000. In this paper, how to design and implement a BBS is introduced. First, it analyzes the demands for this system, establishes system flowchart, designs system database and analyzes the database structure. Second, it introduces the modules. The way of implementation of each modules is introduced, and the source codes are showed in the end.
Key words: BBS; ASP; SQL Server 2000
目 录
论文总页数:32页
1 引言
1.1 课题背景
论坛服务已经是互联网上的一种极为常见的互动交流服务。论坛可以为网友提供开放性的分类讨论区专题服务,网友们可以在此发表自己的观感,交流某些技术,经验乃至人生的感悟与忧欢,亦可以作为用户和商家交流的渠道,商家也可以在此回答用户提出的问题或发布某些消息。
1.2 国内外研究现状
BBS起源于20世纪初。最初,论坛只是用于发布公共信息和讨论问题的在线交流平台;后来,随着网络的普及,论坛的功能也越来越丰富,不仅仅可以发表文字,更是可以使用多媒体,受到了广大网民的欢迎。因此,商业网站对论坛重视起来,纷纷在自己的网站上开辟论坛,作为与网民交流的园地,同时在线技术支持和在线服务也在论坛中开展起来。
1.3 本课题的研究意义
随着互联网技术的迅猛发展,网络给人们带来了很多便利,比如人们借助于网络进行相互交流变得更加方便。电子论坛也称为BBS,BBS是Bulletin Board System的缩写,意即电子公告牌,一种在Internet上常见的用于信息服务的Web系统,它的主要服务是用来帮助浏览者相互沟通,吸引用户,服务用户的。
技术的发展一日千里,尤其是Web开发技术。早年间,我们还只能用静态的HTML编写静态的网站,毫无交互性可言。随着技术的飞速发展,我们有了动态的HTML(DHTML),然后有了脚本(Script),脚本有很多种,这些都伴随着早期的Web开发者走了很长,很苦的日子。到了21世纪,Web的开发者们迎来了幸福的生活,Microsoft,Sun等公司相继推出了强大,快捷的ASP,PHP,JSP和ASP.NET等开发技术,我们可以使用多种编程语言来进行开发,大大提升了网站开发的效率,质量。我们尽管可以说哪一种技术是最流行的,但是很难说哪一种技术是最好的,每一种技术都在它最对口的应用上。对于电子论坛系统,我选择了ASP技术,它同样可把我们想要的功能很好的实现。
2 系统分析
2.1 系统需求分析
首先找出论坛针对的对象,得出一个简洁的例表:
- 用户:论坛的使用人员,进行某些操作时需要注册。
- 版面:表明发言内容的类型。
- 公共信息:与论坛相关的信息。
- 帖子:论坛中单个观点的讨论。
- 管理员:与论坛服务的人员。
论坛的对象不是孤立的,它们是紧密联系的,下面是论坛各个对象之间的关联表,关联是单向的,是指左侧对象对上方对象的活动。无关联的用×表示,如果两者只要单向关联,那么在另一个对象关联时用√表示。
表1 各对象之间的关系表
|
用户 |
版面 |
公共信息 |
帖子 |
管理员 |
用户 |
注册 修改 浏览 联系 |
浏览 |
浏览 发布 |
浏览 发布 修改 删除 |
√ |
版面 |
√ |
× |
× |
× |
√ |
公共信息 |
√ |
× |
× |
× |
√ |
帖子 |
√ |
× |
× |
× |
√ |
管理员 |
删除 授权 |
添加 删除 修改 |
添加 删除 修改 |
添加 删除 修改 |
× |
至此,论坛的需要分析完成,接下来是论坛的功能设计。
2.2 系统功能描述
首先从用户开始,用户关联的对象是自身,版面,公共信息,帖子。分别根据用户与这些对象的联系给出一个明确的菜单
表2 用户功能表
序号 |
功能名称 |
说明 |
1 |
用户注册 |
用户在论坛填写必要信息就可以成为注册用户,注册后,可修改自己的注册信息 |
2 |
用户登录 |
用户注册后可使用用户名,密码登录,可选择用户名,密码保存期限 |
3 |
浏览用户信息 |
注册用户可查看其它用户信息 |
序号 |
功能名称 |
说明 |
4 |
与其它用户联系 |
注册用户可发站内短信 |
5 |
浏览版面 |
任何用户可浏览版面信息 |
6 |
浏览公共信息 |
任何用户可浏览公共信息 |
7 |
浏览帖子 |
任何用户可浏览帖子 |
8 |
发布修改删除帖子 |
注册用户登录后可发布帖子,修改自己的帖子,删除自己的帖子 |
9 |
对帖子的特殊操作 |
主要针对版主类型的用户,可对帖子置顶,设置精华,删除帖子,移动帖子等操作 |
接下来的版面,公共信息,帖子都没有和其他对象的关联,它们在论坛中是被动对象,是被其它对象所操作。因此针对它们的主要功能是由其它对象产生,例如浏览版面就是用户的功能。
管理员是论坛的一个特殊群体,它们的主要工作是保证论坛的正常运行,他们可以和论坛的所有对象产生联系,因此他们的功能也很丰富
表3 管理员功能表
序号 |
功能名称 |
说明 |
1 |
用户删除 |
对于在论坛中造成很坏影响的用户,应该删除他们的身份 |
2 |
用户授权 |
授予用户版主权限 |
3 |
版面管理 |
版面是论坛的枝干,对版面进行添加,修改,删除等操作 |
4 |
公共信息管理 |
公共信息展示论坛的状态,不能出现非法言论 |
5 |
帖子的管理 |
帖子是论坛的枝叶,帖子的好坏关系到论坛的健康发展,对帖子进行删除,移动等 |
6 |
数据库的备份 |
管理员应该定期地对系统数据库备份,以免造成不必要的损失 |
现在分析各个对象的相关操作,设计为对象的功能实现接口,即为对象的操作方法。各个板块有浏览列表和管理两个方法,管理方法又可以分为添加,修改,删除3个子方法。
帖子有浏览,发帖,回帖,搜索和管理5个方法,浏览方法又分为列表和查看两个子方法,管理方法分为编辑,删除,置顶,移动,指定精华5个子方法,如图。
图1 帖子对象的相关关系
用户有注册、登录2个方法,管理用户方法又分为删除和设置权限2个子方法,如图。
图2 用户对象的相关关系
这样分析完后,前面列出的功能列表就有了各自的归属对象。
论坛一般存在两种用户:注册用户和管理员。用户的权限是向下覆盖的,既上级权限包含下级权限,在论坛中,管理员是上级权限。
论坛的3大基本功能的相互关系如下图所示。
图3 论坛基本功能的关系
本系统还有一些是论坛的内容更加丰富的扩展功能。
下面是个一个论坛扩展功能表。
表4 扩展功能表
序号 |
功能名称 |
说明 |
1 |
用户控制自己的信息 |
用户不想让其他用户看到自己的信息,可以控制自己的信息是否公开 |
序号 |
功能名称 |
说明 |
2 |
用户登录添加验证码 |
防止暴力破解密码,输入用户名或密码错误会重新生成验证码 |
3 |
站内短信 |
方便用户在站内联系 |
4 |
帖子评价 |
提高用户参与论坛的积极性 |
5 |
帖子发布添加多媒体 |
吸引用户,扩展帖子发布功能 |
6 |
论坛收藏 |
保留用户喜欢的内容,方便用户查看 |
7 |
帖子搜索 |
提供模糊搜索,方便用户找到感兴趣的主题 |
8 |
用户等级 |
给用户一个荣誉,提高用户发帖的积极性 |
9 |
论坛情况显示 |
把论坛的一些数据显示给用户,如发帖数,在线用户人数等 |
10 |
数据备份 |
防止论坛出现故障,能够正常运行 |
11 |
非法言论过滤 |
对于一些非法言论可以在论坛中进行默认设置过滤 |
添加了这几个扩展功能后,论坛就显得平易近人多了,也更具有使用性。
3 系统设计
3.1 功能模块
根据上一节给出论坛所必须的功能,划分模块。模块的划分主要是按照每一个对象的操作来归类。论坛操作的对象是上一节所归纳的5个。下面就针对这5个对象划分功能模块。
用户:有两个模块,一个是用户注册,登录,修改信息等功能组合,是用户对用户自身的操作;另一个是管理员对用户进行删除,授权,是管理员对用户的操作,如表5。
表5 用户功能模块表
模块 |
模块包含的功能 |
用户模块 |
用户注册 |
用户登录 |
|
浏览其它用户信息 |
|
与其它用户联系 |
|
用户控制自己的信息 |
|
用户登录添加验证码 |
|
用户等级 |
|
管理员模块 |
用户删除 |
用户授权 |
版面:也有两个模块,一个是浏览模块,一个是管理模块。其功能模块列表如表6。
表6 版面功能模块表
模块 |
模块包含的功能 |
版面浏览模块 |
浏览版面 |
版面管理模块 |
版面管理 |
公共信息:用户浏览公共信息的功能划分一个模块,管理员对公共信息的操作划分为一个模块,其功能模块列表如表7
表7 公共信息功能模块表
模块 |
模块包含的功能 |
公共信息显示模块 |
浏览发布的公共信息 |
公共信息管理模块 |
公共信息管理 |
帖子:帖子包括用户对帖子的操作和管理员对帖子的操作,相应地分为帖子模块和帖子管理模块,如表8。
表8 帖子功能模块表
模块 |
模块包含的功能 |
帖子模块 |
浏览帖子 |
发布/修改/删除帖子 |
|
对帖子的特殊操作 |
|
帖子评价 |
|
帖子发布添加多媒体 |
|
论坛收藏 |
|
帖子搜索 |
|
帖子管理模块 |
删除帖子 |
移动帖子 |
管理员:管理员是对其他对象进行操作,如表9。
表9管理员管理功能模块表
模块 |
模块包含的功能 |
管理员管理模块 |
用户管理 |
版面管理 |
|
帖子管理 |
|
数据备份 |
另外,对于用户使用的模块称为前台模块,管理员使用的模块称为后台模块。系统总体功能划分如图4。
图4 系统总体功能划分
3.2 数据库设计
本论坛使用Microsoft SQL Server 2000数据库,下面列出是数据库设计的详细。
1.建立数据表间的关系
本论坛数据库共有11个数据表,具体如表10所示。
表10 论坛数据表
序号 |
表名 |
说明 |
1 |
user_t |
用户信息表 |
2 |
topic_t |
主题信息表 |
3 |
superAdmin_t |
论坛管理员表 |
4 |
post_t |
帖子信息表 |
5 |
message_t |
短消息信息表 |
6 |
grade_t |
用户积分等级表 |
7 |
friend_t |
用户好友表 |
8 |
file_t |
文件上传表 |
9 |
board_t |
子版面信息表 |
10 |
area_t |
父版面信息表 |
11 |
admin_t |
版主信息表 |
下面是数据表之间的关系图,如图5。
图5 数据表关系
2.数据表结构的详细设计
表11 用户信息表(user_t)
序号 |
字段名 |
字段类型 |
说明 |
备注 |
1 |
userid |
Int |
用户编号 |
主键 |
2 |
username |
Varchar(50) |
用户名 |
Not null |
3 |
userpassword |
Varchar(50) |
密码 |
Not null |
4 |
useremail |
Nvarchar(255) |
电子邮件 |
Not null |
5 |
usersign |
Nvarchar(255) |
用户签名 |
|
6 |
usersex |
Varchar(50) |
用户性别 |
Not null |
7 |
userface |
Nvarchar(255) |
头像 |
|
8 |
point |
Int |
积分 |
|
9 |
joindate |
Datetime |
注册日期 |
Not null |
10 |
userbirthday |
Nvarchar(50) |
用户生日 |
|
11 |
userquestion |
Nvarchar(50) |
密码问题 |
Not null |
12 |
useranswer |
Nvarchar(50) |
密码答案 |
Not null |
13 |
userlastip |
Nvarchar(40) |
最后登录IP |
Not null |
14 |
userhidden |
bit |
是否隐身登录 |
Not null |
15 |
userqq |
Nvarchar(255) |
用户QQ |
|
16 |
truename |
Nvarchar(255) |
真实姓名 |
|
17 |
country |
Nvarchar(255) |
国家 |
|
18 |
city |
Nvarchar(255) |
城市 |
|
19 |
constellation |
Nvarchar(255) |
星座 |
|
20 |
blood |
Nvarchar(255) |
血型 |
|
21 |
phone |
Nvarchar(50) |
电话 |
|
22 |
Works |
Nvarchar(255) |
职业 |
|
23 |
School |
Nvarchar(255) |
毕业院校 |
|
24 |
Address |
Nvarchar(255) |
家庭住址 |
|
25 |
jbzl |
bit |
是否公开基本资料 |
Not null |
26 |
xxzl |
bit |
是否公开详细资料 |
Not null |
在用户信息表里保存的是在论坛注册用户的信息,用户编号和用户名在论坛中是不能重复的,用户名不能重复还使用用户编号的原因是计算机对数字检索速度更快。
表12 父版面信息表(area_t)
序号 |
字段名 |
字段类型 |
说明 |
备注 |
1 |
areaid |
Int |
父版面编号 |
主键 |
2 |
areaname |
Varchar(255) |
父版面名 |
Not null |
3 |
setuptime |
datetime |
建立时间 |
Not null |
表13 子版面信息表(board_t)
序号 |
字段名 |
字段类型 |
说明 |
备注 |
1 |
boardid |
Int |
子版面编号 |
主键 |
2 |
boardname |
Varchar(50) |
子版面名 |
Not null |
3 |
areaid |
Int |
父版面编号 |
Not null |
序号 |
字段名 |
字段类型 |
说明 |
备注 |
4 |
readme |
Varchar(255) |
版面说明 |
Not null |
5 |
setuptime |
Datetime |
建立日期 |
Not null |
6 |
boardmaster |
Varchar(50) |
版主 |
|
7 |
topicnumber |
Int |
主题数量 |
Not null |
8 |
indexIMG |
Varchar(255) |
版面图片 |
Not null |
表12和13是版面信息表,这里使用两个表是为了编程方便,父版面和子版面是通过areaid字段关联的。
表14 主题信息表(topic_t)
序号 |
字段名 |
字段类型 |
说明 |
备注 |
1 |
topicid |
Int |
主题编号 |
主键 |
2 |
title |
Varchar(255) |
主题 |
Not null |
3 |
bordid |
Int |
版面编号 |
Not null |
4 |
reply |
Int |
主题回复数 |
Not null |
5 |
userid |
Int |
用户编号 |
Not null |
6 |
username |
Varchar(50) |
用户名 |
Not null |
7 |
DateAndTime |
Datetime |
发表日期 |
Not null |
8 |
hits |
Int |
点击数 |
Not null |
9 |
istop |
Bit |
是否置顶 |
Not null |
10 |
isbest |
Bit |
是否精华 |
Not null |
11 |
fileid |
int |
上传文件编号 |
Not null |
表15 帖子信息表(post_t)
序号 |
字段名 |
字段类型 |
说明 |
备注 |
1 |
postid |
Int |
帖子编号 |
主键 |
2 |
parentid |
Int |
回复帖子编号 |
Not null |
3 |
boardid |
Int |
版面编号 |
Not null |
4 |
username |
Varchar(50) |
用户名 |
Not null |
5 |
userid |
Int |
用户编号 |
Not null |
6 |
topicid |
Int |
主题编号 |
Not null |
7 |
title |
Varchar(255) |
主题 |
Not null |
8 |
DateAndTime |
Datetime |
发表日期 |
Not null |
9 |
body |
Text |
帖子内容 |
Not null |
10 |
ip |
Varchar(40) |
用户IP |
Not null |
以上两张表是紧密关联的,论坛主题信息表记载了论坛中主题帖的信息,建立这个表的原因是用户在浏览论坛中的帖子时先应看到的是主题列表,如果主题能够吸引用户,用户才会去看其中的内容,否则用户一进来就看到帖子内容,会使用户感觉非常的杂乱。这两个表是通过topicid字段联系起来的,parentid字段是用来针对特定的帖子回复。
接下来几张表是论坛的其它功能需要的数据表。
表16 短消息信息表(message_t)
序号 |
字段名 |
字段类型 |
说明 |
备注 |
1 |
mid |
Int |
短消息编号 |
主键 |
2 |
sender |
Varchar(50) |
发送者 |
Not null |
3 |
incept |
Varchar(50) |
接受者 |
Not null |
4 |
title |
Varchar(255) |
主题 |
Not null |
5 |
content |
Varchar(255) |
内容 |
Not null |
6 |
sendtime |
Datetime |
发消息时间 |
Not null |
7 |
flag |
bit |
是否已读 |
Not null |
表17 用户等级信息表(grade_t)
序号 |
字段名 |
字段类型 |
说明 |
备注 |
1 |
gradeid |
Int |
自动编号 |
主键 |
2 |
userid |
Int |
用户编号 |
Not null |
3 |
postid |
Int |
帖子编号 |
Not null |
4 |
grade |
Varchar(255) |
等级 |
Not null |
5 |
point |
Int |
积分 |
Not null |
6 |
ip |
Varchar(40) |
IP |
Not null |
表18 文件上传信息表(file_t)
序号 |
字段名 |
字段类型 |
说明 |
备注 |
1 |
fileid |
Int |
文件编号 |
主键 |
2 |
fname |
Varchar(100) |
文件名 |
Not null |
3 |
userid |
Int |
用户编号 |
Not null |
4 |
ename |
Varchar(50) |
文件扩展名 |
Not null |
5 |
ftype |
Varchar(255) |
文件类型 |
Not null |
6 |
fsize |
Varchar(255) |
文件大小 |
Not null |
表19 好友信息表(friend_t)
序号 |
字段名 |
字段类型 |
说明 |
备注 |
1 |
Fid |
Int |
自动编号 |
主键 |
2 |
Userid |
Int |
用户编号 |
Not null |
3 |
username |
Varchar(50) |
用户名 |
Not null |
4 |
friendid |
Int |
好友编号 |
Not null |
5 |
frinedname |
Varchar(50) |
好友名 |
Not null |
6 |
addtime |
datetime |
添加时间 |
Not null |
表20 管理员信息表(admin_t)
序号 |
字段名 |
字段类型 |
说明 |
备注 |
1 |
masterid |
Int |
自动编号 |
主键 |
2 |
userid |
Int |
用户编号 |
Not null |
3 |
username |
Varchar(50) |
用户名 |
Not null |
4 |
boardid |
Int |
版面编号 |
Not null |
5 |
flag |
bit |
权限标识 |
Not null |
4 系统实现
4.1 首页
当用户打开论坛时,首先看到的是论坛首页,用户从首页可以看到和论坛相关的并且能激起用户兴趣的东西。比如发帖数,在线用户数以及论坛板块的情况,如图6所示。
图6论坛首页
首页分为3个部分,最上面的导航条为一部分,中间的公共信息为一部分,下面的版面为一部分。将导航条部分单独写入文件top.asp作为公共程序,以后任何一个页面需要就使用<!-- #include file="top.asp" -->来调用。下面是top.asp的程序。
1 <% If Session("userid") = "" Then %> 这里显示的是游客的导航条 2 <% Else %> 这里显示的注册用户的导航条 3 <% End If %> |
程序说明:用户登录后将用户名存入session对象来判断用户状态。
公共信息部分是显示了论坛和当前用户的状态,该部分的详细内容将在后面的公共信息部分讨论。
版面部分显示了版面的列表,该部分的详细内容将在后面的版面部分讨论。
至此,首页的主要程序已经介绍了,以后章节是各个模块的主要程序。
4.2 数据库连接函数
SQL Server数据连接要求提供用户名,密码,数据库名及数据库服务器地址,下面是使用ADO连接数据库的代码:
1 <% dim conn’打开数据库连接 2 set conn = server.CreateObject("adodb.connection") 3 conn.open = "dirver ={sql server};server=(服务器地址);uid=用户名;pwd=密码;database=数据库名; " %> 4 <% conn.close’关闭数据库连接 5 Set conn=nothing %> |
4.3 用户模块
下面是一个用户登录的界面,如图7。
图7 用户登录界面
下面是对用户登录页面的表单处理程序
1 <% '验证码处理 2 If trim(request.form("validatecode"))=empty or Trim(Session("cnbruce.com_ValidateCode"))<>Trim(Request.Form("validatecode")) Then 3 response.write("请注意正确输入验证码") 4 response.end 5 end if 6 session("user")=request.Form("username") 7 user=request.Form("username") 8 session("pwd")=request.Form("userpwd") 9 pwd=request.Form("userpwd") 10 ishidden=request.Form("hidden") 11 set rs = server.CreateObject("adodb.recordset") 12 sql="select * from user_t where username='"&session("user")&"' and userpassword='"&session("pwd")&"'" 13 rs.open sql,conn,3,3 14 if rs.eof and rs.bof then '判断用户是否存在 15 response.Redirect("login_error.asp") 16 else 17 session("userid")=rs("userid") 18 sql1="update user_t set userhidden='"&ishidden&"' where userid='"&session("userid")&"'"'用户是否隐身 19 conn.execute(sql1) 20 select case request("usercookie")'把用户信息写入Cookie 21 case "1" 22 response.Cookies("user")("username")=user 23 response.Cookies("user")("userpassword")=pwd 24 response.Cookies("user").expires=date()+1 25 case "2" 26 response.Cookies("user")("username")=user 27 response.Cookies("user")("userpassword")=pwd 28 response.Cookies("user").expires=date()+7 29 case "3" 30 response.Cookies("user")("username")=user 31 response.Cookies("user")("userpassword")=pwd 32 response.Cookies("user").expires=date()+365 33 end select 34 session("name")=request.Form("username") 35 response.Write("<meta http-equiv=refresh content='2;url=index.asp'>") 36 response.Write(session("name")) 37 response.Write("!欢迎你回来!") 38 response.Write("两秒钟后自动转入首页") 39 end if 40 rs.close 41 set rs=nothing %> |
程序说明:第1~5行是对验证码的处理;第6~10行是将从表单获取的数据存入变量;第11~14行是依据输入的用户名和密码为条件对用户信息表user_t进行查找,如果没有查找到记录说明该用户输入的用户名或密码错误;第15行转到错误处理页面;第18~19行是将用户是否隐身登录标记,即是对用户信息表中的userhidden字段标记;第20~33行是将用户信息写入Cookie。
4.3.2 用户注册
用户注册,首先要检查的就是用户填写的信息,其中包括:
- 字段是否空白,若空白则不接受。
- 输入的E-mail是否正确,若E-mail中没有@,@符号位于E-mail的第一个字符或者@位于E-mail的最后一个字符都算错误。
- 两次输入的密码是否一致。
- 用户名是否被使用。
- 电子邮件是否被使用。
图8用户注册各个页面与数据库的关系