- 系统功能设计
1.1 引言
随着网络的越来越普及,人们越来越关于这样一种交流平台――论坛。很多商业网站都开设自己论坛来提供交流和服务,也有很多的个人网站和个人论坛的出现,论坛已经不光是一种交流平台,甚至是成为了实现自我价值的一个舞台。正因为论坛越来越重要,所以论坛的维护也变成了一种职业,而更好的维护则需要从设计这个层面来了解和进行。
在论坛里大家最熟悉的就是用户浏览论坛中已有的内容,针对别人的主题展开讨论,也可以发表自己的观点供大家品评。同时为了防止用户发布一些不健康不合法的内容,需要有管理人员来对这些内容进行删除、修改。而且用户想在论坛发布信息则要求他注册,这样来控制用户发布信息和方便管理者操作用户的信息。论坛也要有多个版面和分区,用来区分各种帖子的内容范畴,方便整理和管理。所以论坛的基本功能就是要实现用户的数据库管理和帖子的数据库管理,以及怎么样让这些数据库和网页的操作联系起来。
1.2 需求分析
要设计一个一个论坛,首先要分析论坛里需要那些内容,以及各种内容之间的关系。
首先列出论坛常用的名词:用户、版面、公共信息、帖子、主题、积分、称号、版主、注册信息、管理员、系统参数。
对于以上名词可以精简。主题是帖子的一个特例、积分和称号是用户的一个属性、版主是增加了权限的用户,注册信息是用户的具体属性。
所以具体的对象有:用户、版面、公共信息、帖子、管理员、系统参数。
具体的操作包括:管理员对用户、帖子、版块的管理;客人和用户的对版块、帖子的浏览;客人的注册;用户的发帖、回帖、搜索等操作。
把具体的对象和具体的操作相联系,我们可以归结出论坛基本操作的流程图,如图1-1。
图1-1 论坛基本功能流程图
图1-1中个将具体的对象和操作直观的表达了出来,为了更具体的细化对象和操作的关联,用来划分开发的模块,我们将对象与对象之间的关联可以建立出一张表,对象如表1-1。
表1-1 各对象间的关联表
|
用 户 |
版 面 |
公共信息 |
帖 子 |
管理人员 |
系统参数 |
用 户 |
注 册 修 改 浏 览 联 系 |
浏 览 |
浏 览 发 布 |
浏 览 发 布 修 改 删 除 特殊操作 |
√ |
× |
版 面 |
√ |
× |
× |
× |
√ |
× |
公共信息 |
√ |
× |
× |
× |
√ |
× |
帖 子 |
√ |
× |
× |
× |
√ |
× |
管理人员 |
删 除 授 权 |
添 加 删 除 修 改 |
添 加 删 除 修 改 |
添 加 删 除 修 改 |
× |
设 置 |
系统参数 |
× |
× |
× |
× |
√ |
× |
表1-1中的对象是单向关联,是指左侧对象对上方对象的活动。×表示没有关联,√表示存在单向关联。通过以上设计,论坛需要些什么以及所需要的对象之间存在着怎么的关系就有了基本的概念。
1.3 功能设计
表1-1中用户关联的对象是自身、版面、公共信息、帖子。分别根据用户与这些对象的联系给出一个明确的菜单,如表1-2。
表1-2 用户功能列表
功能名称 |
说明 |
用户注册 |
用户在论坛填写必要信息后就可以注册为注册用户,并能在登陆后对注册信息进行更改 |
用户登陆 |
注册后的用户可利用用户名和密码在论坛登陆 |
浏览其他用户信息 |
用户注册后可以查看其他用户的公开信息 |
与其他用户联系 |
可以在论坛内给其他用户私下留言,或直接发送邮件等 |
浏览版面 |
用户可以看到以列表形式展现的版面信息和版面说明 |
浏览发布公共信息 |
未登陆的用户可以浏览公共信息,登陆后可以发布允许范围内的公共信息 |
浏览帖子 |
用户可以以列表形式浏览帖子主题及其全部内容 |
发布修改删除帖子 |
用户在登陆后可以发布帖子、修改自己的帖子,被给予版主权限后还可以编辑、修改、删除权限范围内的其他用户帖子 |
对帖子特殊操作 |
主要针对版主权限用户,对帖子进行置顶、加精华等特殊操作,是帖子主题不同于其他主题 |
版面、公共信息、帖子都没有和其他对象的关联,都属于被动的对象,是被其他对象所操作的,因此针对它们的功能主要是有其他对象产生。版面和帖子是有一定关系的,可以看作是对帖子内容的归类,类似文件夹与文件的关系,有时候可以认为版面是帖子的一个属性。
对于管理员的功能,应该认为管理员是论坛的特殊群体,工作是设置论坛参数规则和维护论坛的正常运转。管理员可以和所有对象产生关联,所以其功能设定也很丰富,如表1-3。
表1-3 管理员功能列表
功能名称 |
说明 |
用户删除 |
对于一些蓄意破坏的用户,删除其身份,不允许其存在 |
用户权限 |
对于一个具有管理能力的用户给予一些特殊的权限,让他们在权限范围内帮助管理和维护论坛 |
版面管理 |
版面是论坛的枝干,要设定论坛需要的合适版面,让论坛的功能更明细,分类更规范,方便大家的浏览 |
公共信息管理 |
公共信息是向用户展现论坛状态的部分,由于信息的普遍性,其删除和修改权限需要由管理人员来完成 |
帖子管理 |
帖子是论坛的叶子,是基本数据库,反映了论坛使用者和管理者的水平,所以需要管理人员的全权管理来规范其内容 |
设置系统参数 |
系统参数包含的内容很多,直接关系到论坛的正常运行,包括网址在内的各种参数全部要由管理人员统一设置和变更 |
对于管理员和用户功能关系可以细化成以下几个相关用例图。
论坛设置参数,可以把设置一组参数作为一个方法,也可以把设置一个参数作为一个方法,如图1-2。
图1-2 论坛对象的相关用例图
各个版块有浏览列表和管理两个操作,管理方法又包括了创建、修改和删除这3个子方法,如图1-3。
图1-3 版块对象的相关用例图
帖子有浏览、发帖、回帖、搜索和管理5种方法,浏览方法又可以分列表和查看2个子方法,管理方法又可分编辑、删除、置顶、转移、加精华5个子方法,如图1-4。
图1-4 帖子对象的相关用例图
用户类有注册、登陆和管理3个方法,管理方法又分为添加、删除、设置权限3个子方法,如图1-5。
图1-5 用户对象的相关用例图
这样,表1-2和1-3就分别有了各自的归属对象。
论坛一般存在两种用户:注册用户和管理员。用户的权限是向下覆盖的,即上级权限包含下级权限。这样论坛的基本功能就可以从各种需求中筛选出来了,即发帖、浏览帖子、回帖。基本功能就是构成论坛系统的必要功能,具备这些功能的Web系统即是论坛。
1.4 扩展功能设计
具备了发帖、浏览帖子、回帖的Web系统就构成论坛了,但是这样的论坛很简单,没有吸引力,用户使用起来也不会很舒服,无论是作为商业还是个人论坛都是没有竞争力的。所以需要为其添加一些更人性化的功能使内容更丰富。
用表格形式列出可能的扩展功能,如表1-4。
表1-4 扩展功能列表
功能名称 |
说明 |
用户控制自己的信息 |
用户可控制自己的信息是否公开 |
用户登陆添加验证码 |
登陆时需输入验证码,如登陆信息错误则重新生成验证码。这样可以防止一些软件偷取用户名和密码 |
站内短信 |
让两个用户能在论坛内更方便的交流 |
帖子评价 |
给予用户对一个帖子评价好坏的功能 |
帖子发布添加多媒体 |
如可在帖子内使用表情图片、插入flash、音乐等功能 |
帖子类别多样化 |
让用户可以发起投票、买卖等功能的帖子 |
帖子收藏 |
在论坛中加入搜索但效率却不一定很高,对于好的帖子为了方便用户以后更方便找到这个帖子,可以让用户收藏帖子 |
用户等级 |
建立一个荣誉体系,对于对论坛贡献大的用户给予一定的荣誉称号或者高的论坛等级 |
论坛情况显示 |
让用户直接看到一些论坛统计数据,如主题总数、在线人员等 |
数据备份 |
论坛最重要的就是数据库,但数据库系统的安全并不是100%的,所以为了论坛能持续发展,需要定期对论坛数据库进行备份 |
非法言论过滤 |
对于一些非法言论或不良词汇可以在论坛进行过滤设置,一旦有人使用也会被过滤掉而不至于造成不良影响 |
非法IP限制 |
对于一个蓄意捣蛋的用户,限制他的IP不能访问论坛,但这个有很大的局限性,一般情况下用处不会很大 |
添加了以上功能,论坛就显得更具有亲和力了,而且也更具有实用性。
第二章 系统架构与数据库设计
2.1 功能模块的划分
模块的划分主要是按每一个对象的操作来归类。论坛操作的对象在第一章里归纳为用户、版面、公共信息、帖子、管理员、系统参数这6个对象,所以就要针对这6个对象划分功能模块。
(1) 用户:有两个模块,一个是用户注册、登陆、修改信息等功能组合,是用户对自身的操作;另一个是管理人员对用户进行删除、授权的操作;如表2-1。
表2-1 用户功能模块列表
模块 |
模块包含的功能 |
用户模块 |
用户注册 |
用户登陆 |
|
浏览其他用户信息 |
|
与其他用户联系 |
|
用户控制自己的信息 |
|
用户登陆添加验证码 |
|
用户等级 |
|
管理人员模块 |
用户删除 |
用户授权 |
(2) 版面:有两个模块,一个是浏览模块,一个是管理模块。如表2-2。
表2-2 版块功能模块列表
模块 |
模块包含的功能 |
版面浏览模块 |
浏览版面 |
版面管理模块 |
版面管理 |
(3) 公共信息:将用户发布和浏览公共信息的功能划分为一个模块,对象是用户对公共信息的操作;管理员对公共信息的操作划分为另一个模块。如表2-3。
表2-3 公共信息功能模块列表
模块 |
模块包含的功能 |
公共信息显示模块 |
浏览、发布公共信息 |
公共信息管理模块 |
公共信息管理 |
(4) 帖子:帖子是论坛的基本,其功能是最多最复杂的,但仍然可以分为两个模块,根据操作对象来区分。如表2-4。
表2-4 帖子功能模块列表
模块 |
模块包含的功能 |
帖子模块 |
浏览帖子 |
发布、修改、删除帖子 |
|
对帖子特殊操作 |
|
帖子评价 |
|
帖子发布增加多媒体 |
|
帖子类别多样化 |
|
帖子移动(单个) |
|
帖子收藏 |
|
帖子搜索 |
|
帖子管理模块 |
帖子管理 |
帖子移动(批量) |
(5) 管理员:管理员主要是对其他对象进行操作,是对其他模块的操作人员,同时系统参数设置模块的功能也可以划分进来。如表2-5。
表2-5 管理员管理功能模块列表
模块 |
模块包含的功能 |
管理员管理模块 |
设置系统参数 |
数据备份 |
|
非法言论过滤 |
|
非法IP限制 |
通过以上分析,论坛的模块划分也就完成了。但如果要把整个论坛系统完整的架构出来,还要分析模块与模块之间的关系,把零散的功能模块用一条主线串联起来。对于论坛系统来说,联系各个模块的主线是使用者的权限,用户能使用论坛的哪些功能是由用户的权限决定的,论坛的每个功能都与相应的权限对应。同一类用户使用的功能模块。是以使用者为中心连接起来的。另外,操作同一类事物的功能模块,也是相互关系的。
浏览模块与发帖回帖模块、管理帖子模块关联,是由论坛的系统流程决定的;管理版块模块与浏览模块关联,是有帖子与版块的父子关系决定的,帖子依附与版块,先有版块后有帖子,帖子必须发表在某个版块中;管理用户模块与注册登陆模块关联,是由同一类对象用户决定的,注册后获得论坛的身份,成为用户,所有的用户需要接受管理员的管理,用户登陆证明自己在论坛中的身份。分析了这些关系,我们可以得到论坛系统的整体架构,如图2-1。
图2-1 论坛整体架构图
对于用户使用的模块成为前台模块,管理员使用的模块称为后台模块。其划分如图2-2。
图2-2 功能模块划分
2.2 数据库设计
论坛系统信息的储存一般是在文件或者数据库中,相比之下数据库要简单高效,能对论坛进行更好的控制,也能对资料提供一些严正和保护。所以目前流行的论坛都是使用的数据库系统。使用数据库的首先就是要设计数据库的表结构,一个设计良好的数据库结构可以提高效率、方便维护,而且对于可能的扩充也会留有余地。
- 需要建立的数据表
为了更方便操作和维护,建立的数据表名都使用相关含义的因为单词,为了区别于数据库中可能出现的其他非表内容,在给每个表名加上一个标识。根据对论坛功能的分析,可以建立16个数据表,如表2-6。
表2-6 论坛数据表
序号 |
表名 |
说明 |
1 |
Admin_T |
管理员信息表 |
2 |
Bbs1_1 |
帖子信息表 |
3 |
BbsNews_1 |
公共信息表 |
4 |
Board_T |
版面信息表 |
5 |
BookMark_T |
收藏夹信息表 |
6 |
Friend_T |
用户好友列表 |
7 |
Help_T |
帮助信息表 |
8 |
Log_T |
论坛日志表 |
9 |
Message_T |
短消息信息表 |
10 |
Online_T |
在线用户表 |
11 |
Setup_T |
系统信息表 |
12 |
Topic_T |
论坛主题信息表 |
13 |
Upfile_T |
文件上传表 |
14 |
User_T |
用户信息表 |
15 |
Vote_T |
投票信息表 |
16 |
VoteUser_T |
投票用户表 |
有些表是可以独立的,但大多数表都是存在关联的。其关联一般都是通过主线用户相关联,或者是用户ID,或者是用户的其他信息。所以也可以看到主线用户的列表是相关数据项目最多的。
- 数据库表结构的详细设计
首先是用户信息表,用户信息是相关信息最多的表。如表2-7。
表2-7 用户信息表(User_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
UserID |
COUNTER |
用户编号 |
Key |
2 |
UserName |
VARCHAR(50) |
用户名 |
Not null |
3 |
UserPassword |
VARCHAR(20) |
密码 |
Not null |
4 |
UserEmail |
VARCHAR(255) |
电子邮件 |
Not null |
5 |
UserPost |
INTEGER |
发帖数 |
|
6 |
UserTopic |
INTEGER |
发布主题数 |
|
7 |
UserSign |
VARCHAR(255) |
用户签名 |
|
8 |
UserSex |
BYTE |
性别 |
|
9 |
UserFace |
VARCHAR(255) |
头像 |
|
10 |
UserWidth |
INTEGER |
头像宽 |
|
11 |
UserHeight |
INTEGER |
头像高 |
|
12 |
JoinDate |
DATETIME |
注册时间 |
Not null |
13 |
LastLogin |
DATETIME |
最后登陆时间 |
|
14 |
UserLogins |
INTEGER |
登陆次数 |
Not null |
15 |
UserViews |
INTEGER |
信息被浏览次数 |
|
16 |
UserClass |
VARCHAR(20) |
用户级别 |
|
17 |
UserWealth |
INTEGER |
现金货币 |
|
18 |
UserEP |
INTEGER |
经验值 |
|
19 |
UserCP |
INTEGER |
魅力值 |
|
20 |
UserPower |
INTEGER |
威望值 |
|
21 |
UserDel |
INTEGER |
被删主题数 |
|
22 |
UserIsBest |
INTEGER |
精华帖子 |
|
23 |
UserTitle |
VARCHAR(50) |
头衔 |
|
24 |
UserBirthday |
VARCHAR(50) |
生日 |
|
续表2-7
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
25 |
UserQuestion |
VARCHAR(50) |
密码问题 |
Not null |
26 |
UserAnswer |
VARCHAR(50) |
密码答案 |
Not null |
27 |
UserLastIP |
VARCHAR(30) |
最后登陆IP |
|
28 |
UserPhoto |
VARCHAR(255) |
用户照片 |
|
29 |
UserFav |
VARCHAR(255) |
用户好友分组 |
|
30 |
UserInfo |
LONGCHAR |
用户其他信息 |
|
31 |
UserSetting |
VARCHAR(255) |
用户设置 |
|
32 |
TitlePic |
VARCHAR(50) |
标题图片 |
|
33 |
UserHidden |
BYTE |
是否隐身 |
Not null |
34 |
UserMsg |
VARCHAR(30) |
用户消息 |
|
35 |
UserTaday |
VARCHAR(250) |
今日信息 |
|
在用户信息表里保存的是所有在论坛注册的用户的信息,用户编号是用户在论坛中的唯一标识。其实用户名也是不可重复的,但是使用编号作为主键可以让查找起来更加方便,提高效率,而且编号也是与其他表关联的主要字段。密码和密码答案是在用户忘记密码时验证身份的保证,所以设置为不能为空。用户名和密码是登陆的唯一识别,邮件是为了方便联系和某些可能的服务需要,所以也设置为非空。
表2-8是论坛中的版面信息表。
表2-8 版面信息表(Board_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
BoardID |
INTEGER |
版面编号 |
Key |
2 |
BoardType |
VARCHAR(50) |
版面名称 |
|
3 |
ParentID |
INTEGER |
上级版面编号 |
Default 0 |
4 |
ParentStr |
VARCHAR(250) |
上级版面名称 |
|
5 |
Depth |
SMALLINT |
版面层数 |
|
6 |
RootID |
INTEGER |
主版面编号 |
|
7 |
Child |
INTEGER |
子版面编号 |
|
8 |
Orders |
INTEGER |
显示顺序 |
|
续表2-8
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
9 |
Readme |
VARCHAR(255) |
介绍 |
|
10 |
BoardMaster |
VARCHAR(100) |
版主 |
|
11 |
PostNum |
INTEGER |
发帖数量 |
|
12 |
TopicNum |
INTEGER |
主题数量 |
|
13 |
IndexIMG |
VARCHAR(255) |
论坛图象 |
|
14 |
TadayNum |
INTEGER |
今日发帖数 |
|
15 |
BoardUser |
VARCHAR(255) |
状态 |
|
16 |
LastPost |
LONGCHAR |
最后一帖 |
|
17 |
Sid |
INTEGER |
签名标识 |
|
18 |
Board_Setting |
LONGCHAR |
版面设置 |
|
19 |
Board_User |
VARCHAR(250) |
版面用户 |
|
20 |
BoardTopStr |
VARCHAR(255) |
置顶主题信息 |
|
版面信息表中依然是使用了版面编号做主键,一般都会用编号作为主键,这样效率要更高些。上级版面编号是为了方便分层次找到各级版面。发帖数量、主题数量是指本版面的所有发帖数量和主题数量,而上级版面的数量是包括下级版面的所有发帖数量和主题数量的,今日发帖数和最后一帖的规则也相同。版面置顶主题信息所包含的是该版面置顶的主题的编号。与版面相关最密切的是帖子和主题,表2-9是论坛的主题信息表。
表2-9 论坛主题信息表(Topic_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
TopicID |
COUNTER |
主题编号 |
Key |
2 |
Title |
VARCHAR(250) |
标题 |
Not null |
3 |
BoardID |
INTEGER |
版面编号 |
|
4 |
PollID |
INTEGER |
投票表编号 |
|
5 |
LockTopic |
INTEGER |
是否锁定 |
|
6 |
Child |
INTEGER |
回复数量 |
|
7 |
PostUserName |
VARCHAR(50) |
发帖用户名 |
|
8 |
PostUserID |
INTEGER |
发帖用户编号 |
|
续表2-9
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
9 |
DateAndTime |
DATETIME |
发帖时间 |
|
10 |
Hits |
INTEGER |
点击数 |
|
11 |
Expression |
VARCHAR(20) |
状态 |
|
12 |
VoteTotal |
INTEGER |
投票总数 |
|
13 |
LastPost |
VARCHAR(250) |
最后一帖 |
|
14 |
PostTable |
VARCHAR(8) |
发帖内容表 |
|
15 |
Istop |
BYTE |
是否置顶 |
|
16 |
LastPostTime |
DATETIME |
最后发帖时间 |
|
17 |
Isbest |
BYTE |
是否精华 |
|
18 |
Isvote |
BYTE |
是否投票 |
|
19 |
TopicMode |
BYTE |
主题模式 |
|
20 |
Mode |
INTEGER |
模式 |
|
表2-10是帖子信息表。
表2-10 帖子信息表(Bbs1_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
AnnounceID |
COUNTER |
帖子编号 |
Key |
2 |
ParentID |
INTEGER |
上级帖子编号 |
Not null |
3 |
BoardID |
INTEGER |
版面编号 |
Not null |
4 |
UserName |
VARCHAR(50) |
发帖用户名 |
Not null |
5 |
PostUserID |
INTEGER |
用户ID |
Not null |
6 |
Topic |
VARCHAR(255) |
标题 |
|
7 |
Body |
LONGCHAR |
帖子内容 |
|
8 |
DateAndTime |
DATETIME |
发帖时间 |
|
9 |
Lengh |
INTEGER |
内容长度 |
|
10 |
RootID |
INTEGER |
主题编号 |
|
11 |
Layer |
INTEGER |
层数 |
|
12 |
Order |
INTEGER |
排序号 |
|
续表2-10
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
13 |
Isbest |
BYTE |
是否精华 |
|
14 |
IP |
VARCHAR(40) |
发帖用户IP |
|
15 |
Expression |
VARCHAR(255) |
状态 |
|
16 |
LockTopic |
INTEGER |
主题锁定状态 |
|
17 |
Signflag |
BYTE |
签名标识 |
|
18 |
Emailflag |
BYTE |
电子邮件标识 |
|
19 |
Isagree |
VARCHAR(250) |
评价 |
|
20 |
Isuoload |
BYTE |
是否有附件 |
|
21 |
Isaudit |
BYTE |
是否有音频 |
|
22 |
PostBuyUser |
LONGCHAR |
购买此帖的人 |
|
23 |
Ubblist |
VARCHAR(250) |
UBB标识使用编号 |
|
表2-11是投票信息表。
表2-11 投票信息表(Vote_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
VoteID |
COUNTER |
投票编号 |
Key |
2 |
Vote |
LONGCHAR |
投票内容 |
|
3 |
VoteNum |
LONGCHAR |
每项投票的数量 |
|
4 |
VoteType |
INTEGER |
投票类型 |
|
5 |
LockVote |
INTEGER |
锁定投票 |
|
6 |
Votes |
INTEGER |
投票人数 |
|
7 |
TimeOut |
DATETIME |
截止时间 |
|
8 |
UArticle |
INTEGER |
用户文章 |
|
9 |
UWealth |
INTEGER |
现金货币 |
|
10 |
UEP |
INTEGER |
经验值 |
|
11 |
UCP |
INTEGER |
魅力值 |
|
12 |
UPower |
INTEGER |
威望值 |
|
表2-12是投票用户表。
表2-12 投票用户表(VoteUser_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
ID |
COUNTER |
编号 |
Key |
2 |
VoteID |
INTEGER |
投票编号 |
|
3 |
UserID |
INTEGER |
用户编号 |
|
4 |
VoteDate |
DATETIME |
投票日期 |
|
5 |
VoteOption |
VARCHAR(50) |
投票选项 |
|
以上4个表是紧密关联的。为什么单独建立主题信息表而不把主题当成帖子的特例来筛选,是因为主题会有很多回复,而在论坛帖子搜索时如果搜索要过滤一次帖子将会速度很慢,而且用户浏览主题时也不必要看到帖子的全部内容。表2-9里用到了4个外键,如果在其他表中该字段没有的数据,在主题信息表中也是不能有的。发帖用户名和发帖用户编号来源于用户信息表,可以算是数据冗余,是在查询用户发帖时具有更高的效率。
表2-10也包含了4个外键,其中主题编号是用来关联主题信息表的。层数记录的是该帖子是主帖还是从帖,排序数是对同一层次的帖子进行排序的。签名标识和电子邮件标识是记录用户是否在此帖中开放自己的签名和电子邮件。
表2-11记录了投票类帖子的投票部分的内容。由于投票内容和帖子信息不一样,所以单独建立一张表。后面几个U开头的字段是限制字段,可以对于投票的用户做一些资格上的限制,防止新用户反复注册投票。
表2-12记载了没个投票用户的投票情况。投票编号和用户编号都是外键。投票选项字段和表2-11中的投票内容字段想关联。
接着设计管理员信息表,如表2-13,记载了管理员的信息。
表2-13 管理员信息表(Admin_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
ID |
COUNTER |
管理员编号 |
Key |
2 |
Username |
VARCHAR(50) |
用户名 |
|
3 |
Password |
VARCHAR(50) |
用户密码 |
|
4 |
Flag |
Memo |
权限字段 |
|
5 |
LastLogin |
DATETIME |
投最后登陆时间 |
|
续表2-13
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
6 |
LastLoginIP |
VARCHAR(50) |
最后登陆IP地址 |
Key |
7 |
Adduser |
VARCHAR(50) |
用户信息表中的用户名 |
|
管理员信息表和用户信息表是有关联的,外键是用户信息表里的用户名,所以论坛的管理人员也是论坛的注册用户。这样可以让管理人员在修改论坛参数后可以很直观的看到修改后的状态。
公共信息表记载的是论坛中发布的公共信息,与版面等信息是关联的。如表2-14。
表2-14 公共信息表(BbsNews_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
ID |
COUNTER |
编号 |
Key |
2 |
BoardID |
INTEGER |
版面编号 |
|
3 |
Title |
VARCHAR(50) |
标题 |
|
4 |
Content |
LONGCHAR |
内容 |
|
5 |
Username |
VARCHAR(50) |
发布用户名 |
|
6 |
Addtime |
DATETIME |
发布时间 |
|
7 |
Bgs |
VARCHAR(100) |
背景音乐 |
|
表2-14中版面编号和发布用户名是外键,但版面编号可以为0,表示是在论坛首页发布的信息。背景音乐是让大家读枯燥的公告时有亲切感,不至于觉得无聊。
收藏夹信息表是针对用户的一个信息表,如表2-15。
表2-15 收藏夹信息表(BookMark_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
ID |
COUNTER |
编号 |
Key |
2 |
Username |
VARCHAR(50) |
用户名 |
|
3 |
url |
VARCHAR(100) |
收藏的网页地址 |
|
4 |
Topic |
VARCHAR(100) |
帖子的主题 |
|
5 |
Addtime |
DATETIME |
添加时间 |
|
收藏夹是为了给用户带来方便的,这里收藏的是网页的地址,其实也可以做成收藏主题的编号,但因为可能收藏版面等容易编号混乱。
短消息信息表记录用户之间的短消息,见表2-16。
表2-16 短消息信息表(Message_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
ID |
COUNTER |
编号 |
Key |
2 |
Sender |
VARCHAR(50) |
发送者 |
|
3 |
Incept |
VARCHAR(50) |
接受者 |
|
4 |
Title |
VARCHAR(100) |
标题 |
|
5 |
Content |
LONGCHAR |
内容 |
|
6 |
Flag |
INTEGER |
阅读标记 |
|
7 |
SendTime |
DATETIME |
发送时间 |
|
8 |
DelR |
INTEGER |
接受者删除标识 |
|
9 |
DelS |
INTEGER |
发送者删除标识 |
|
10 |
IsSend |
INTEGER |
已发送标识 |
|
短消息是用户之间私下交流的内容,所以必须保留两者之间的信息。发送和接收者都是用户信息表关联的外键。删除标识设置两个是防止一方删除操作后另一方看不到的情况。
用户的好友信息表见表2-17。
表2-17 用户好友列表(Friend_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
F_ID |
COUNTER |
好友编号 |
Key |
2 |
F_username |
VARCHAR(50) |
用户名 |
|
3 |
F_friend |
VARCHAR(50) |
好友用户名 |
|
4 |
F_Addtime |
DATETIME |
添加时间 |
|
5 |
F_mod |
BYTE |
好友类型 |
|
6 |
F_userID |
INTEGER |
用户编号 |
|
用户好友列表是用户用来相互交流的,是论坛感觉更人性化。记录好友用户名是因为用户往往记得这个好友名字却不记得编号,所以这里用用户名做记录而不是编号。
在线用户表是显示即时在先的用户,可以方便用户见看到在线情况而更及时的交流。如表2-18。
表2-18 在线用户表(Online_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
ID |
DOUBLE |
编号 |
Key |
2 |
Username |
VARCHAR(50) |
用户名 |
|
3 |
Userclass |
VARCHAR(20) |
用户类型 |
|
4 |
Stats |
VARCHAR(250) |
用户状态 |
|
5 |
IP |
VARCHAR(40) |
当前IP |
|
6 |
Actforip |
VARCHAR(40) |
IP来源 |
|
7 |
Startime |
DATETIME |
开始时间 |
|
8 |
Lastimebk |
DATETIME |
最后操作时间 |
|
9 |
BoardID |
INTEGER |
版面编号 |
|
10 |
Browser |
VARCHAR(250) |
浏览器类型 |
|
11 |
ActCome |
VARCHAR(50) |
来源 |
|
12 |
UserID |
INTEGER |
用户编号 |
|
13 |
Userhidden |
INTEGER |
是否隐身 |
|
这里的主键是DOUBLE类型,是因为用户的活动很多,数据量存在溢出的可能。用户名、编号和类型都是来自用户信息表的外键。浏览器类型记录了浏览器和操作系统的类型。
文件上传表是帖子表的一个附表,它记录了在帖子中的附件等信息,见表2-19。
表2-19 用户信息表(User_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
F_ID |
COUNTER |
编号 |
Key |
2 |
F_AnnounceID |
VARCHAR(50) |
帖子编号 |
|
3 |
F_BoardID |
INTEGER |
版面编号 |
|
4 |
F_UserID |
INTEGER |
用户编号 |
|
5 |
F_Username |
VARCHAR(50) |
用户名 |
|
6 |
F_Filename |
VARCHAR(250) |
文件名 |
|
7 |
F_FileType |
VARCHAR(10) |
文件类型 |
|
8 |
F_Type |
SMALLINT |
文件类型编号 |
|
续表2-19
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
9 |
F_FileSize |
INTEGER |
文件大小 |
|
10 |
F_Readme |
VARCHAR(250) |
文件说明 |
|
11 |
F_Download |
INTEGER |
下载次数 |
|
12 |
F_ViewNum |
INTEGER |
浏览次数 |
|
13 |
F_DownUser |
LONGCHAR |
下载用户 |
|
14 |
F_Flag |
SMALLINT |
文件标识 |
|
15 |
F_AddTime |
DATETIME |
添加日期 |
|
16 |
F_Viewname |
VARCHAR(255) |
显示名称 |
|
文件上传表记录了用户上传附件的内容。用户名、用户编号、版面编号等都是外键。文件名字段由于用户上传的文件可能同名,所以采取系统自动命名的方式,缺点是如果同一个文件分包上传,则下载后需要重新命名后才能恢复原文件。文件类型是文件真正的类型,而类型编号是论坛文件类型,表示下载与显示。
帮助信息表是很重要的表,是用来介绍整个论坛的使用的,见表2-20。
表2-20 帮助信息表(Help_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
H_ID |
COUNTER |
帮助编号 |
Key |
2 |
H_ParentID |
INTEGER |
上级编号 |
|
3 |
H_Title |
VARCHAR(250) |
标题 |
|
4 |
H_Content |
LONGCHAR |
内容 |
|
5 |
H_Type |
BYTE |
类型 |
|
6 |
H_Stype |
INTEGER |
后台类型 |
|
7 |
H_begimg |
VARCHAR(100) |
背景图片 |
|
8 |
H_Addtime |
DATETIME |
添加时间 |
|
帮助信息表是个独立的表,帮助信息对于论坛是很重要的,帮助文件写得好,用户就会上手快,论坛就会更有亲切感。虽然现在的网络用户对论坛都并不陌生,但良好的帮助文件依然可以体现出论坛在设置上的到位。因为帮助文件分用户和管理员的,所有添加一个后台类型来区别帮助文件的显示位置。
论坛日志表是用来记录论坛行为的,一旦论坛出现了问题,可以通过这个表来跟踪一些活动,分析出问题的所在。见表2-21。
表2-21 论坛日志表(Log_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
L_ID |
COUNTER |
日志编号 |
Key |
2 |
L_AnnounceID |
INTEGER |
帖子编号 |
|
3 |
L_BoardID |
INTEGER |
版面编号 |
|
4 |
L_Touser |
VARCHAR(50) |
访问页面 |
|
5 |
L_Username |
VARCHAR(50) |
访问用户名 |
|
6 |
L_Content |
VARCHAR(255) |
日志内容 |
|
7 |
L_AddTime |
DATETIME |
添加时间 |
|
8 |
L_IP |
VARCHAR(50) |
用户IP |
|
9 |
L_Type |
BYTE |
日志类型 |
|
为了保证日志记录信息的详实,因此日志表需要设计得很全面。帖子编号和版面编号是外键,记录了论坛中对帖子信息进行操作的信息,当非帖子操作时,这两个字段不是必须的。
系统信息表关系到整个论坛是否可以正常运行,是核心表,见表2-22。
表2-22 系统信息表(Setup_T)
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
1 |
ID |
COUNTER |
编号 |
Key |
2 |
Forum_Setting |
LONGCHAR |
论坛设置 |
|
3 |
Forum_Ads |
LONGCHAR |
论坛广告 |
|
4 |
Forum_Badwords |
LONGCHAR |
过滤词 |
|
5 |
Forum_rBadword |
LONGCHAR |
注册过滤词 |
|
6 |
Forum_Maxonline |
INTEGER |
最多在线人数 |
|
7 |
Forum_MaxonlineDate |
DATETIME |
最多在线日期 |
|
8 |
Forum_TopicNum |
INTEGER |
单页主题数 |
|
9 |
Forum_PostNum |
INTEGER |
单页帖子数 |
|
10 |
Forum_TodayNum |
INTEGER |
今日发帖数 |
|
续表2-22
序 号 |
字 段 名 |
字段类型 |
说 明 |
备 注 |
11 |
Forum_UserNum |
INTEGER |
论坛用户数 |
|
12 |
Forum_YesterdayNum |
INTEGER |
昨日发帖数 |
|
13 |
Forum_MaxPostNum |
INTEGER |
最大发帖数 |
|
14 |
Forum_MAXPostDate |
DATETIME |
最大发帖日期 |
|
15 |
Forum_LastUser |
VARCHAR(50) |
最后注册用户 |
|
16 |
Forum_LastPost |
VARCHAR(255) |
最后一帖 |
|
17 |
Forum_BirthUser |
LONGCHAR |
过生日的用户 |
|
18 |
Forum_Sid |
INTEGER |
论坛编号 |
|
19 |
Forum_Version |
VARCHAR(50) |
论坛版本 |
|
20 |
Forum_NowUseBBS |
VARCHAR(8) |
帖子信息表 |
|
21 |
Forum_IsInstall |
BYTE |
是否被安装 |
|
22 |
Forum_Ad |
LONGCHAR |
论坛广告 |
|
23 |
Forum_ChanName |
VARCHAR(50) |
论坛名称 |
|
24 |
Forum_ChanSetting |
VARCHAR(250) |
论坛设置 |
|
25 |
Forum_LockIP |
LONGCHAR |
锁定的IP |
|
26 |
Forum_Cookiespath |
VARCHAR(50) |
Cookie存储路径 |
|
27 |
Forum_Boards |
LONGCHAR |
论坛版面 |
|
28 |
Forum_AlltopNum |
VARCHAR(250) |
论坛置顶数 |
|
29 |
Forum_Pack |
VARCHAR(250) |
超级管理员 |
|
虽然是核心表,但是每个字段的内容都很简单。论坛设置字段存储了论坛名称、地址、联系方式等。过滤词设置比较有用,当用户发表一些禁止的词汇时可以通过过滤让这些词汇不显示在论坛上。其他的一些字段都是记录了一些论坛的状态。
论坛的数据库是非常重要的,它决定了整个论坛最终的使用是否可行。
- 基本设计
3.1 论坛首页设计
当用户打开论坛时,首先看到的是论坛首页,用户从首页可以看到和论坛相关的内容,发帖数、用户数量和主要版面的情况等。首先这个页面应该尽量的美观,操作截面也要看起来简单易用而且具有实用性。
一般论坛的首页分4个部分,上面是论坛的顶部LOGO,一般这个要体现出论坛的一个主题;接着是论坛的导航部分,包括了用户状况和论坛了基本状况,且这两个状况应该左右分开;再下面就是论坛主题部分的各个版面信息;最下面就是论坛用户在线状况论坛当前的情况。
基本上可能变动大的只有版面部分,所以其他变动小的部分可以做成公用文件,让其他页面可以重用。这3部分不写在文件里,而是直接写进数据库中。如程序3-1。
程序3-1 首页公用程序
<!--HTML头-->
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312>
<meta name=”generator” content=”dvbbs”>
<meta name=keywords content=”{$keyword}”>
<meta name=”description” content=”{$description}”>
<!—论坛首页开始代码-->
<script language=”JavaScript” src=”inc/Main.js”></script >
</head>
<body topmargin=”0” leftmargin=”0”>
<div class=menuskin id==popmenu
Onmouseover=”clearhidemenu();highlightmenu(event,’on’)”
Onmouseout=” highlightmenu(event,’off’);dynamichide(event)” style=”Z-index:100”></div>
<!—顶部导航表格-->
<table cellspacing=”0” cellpadding=”0” align=”center” class=tableborder1>
<tr><td width=”1”></td>
<td class=TopdarkNav height=9 width=”*”></td>
<td width=”1”></td>
<tr><td width=”1” height=”70”></td>
<td height=”70” class=TopLighNav2>
<table board=”0” width=”100%” align=center>
<tr><td align=left width=”25%”><a href=”{$link}”><img border=0 src=”{$logo}”></a></td>
<td align=center width=”65%” id=”Top_ads”></td>
<td align=”right” style=”line-height:15pt” width=”10%”>
<span style=”cuosor:hand” onClick=”window.external.AddFavorite(document.location.href,
’{$title}’)” onmousemove=”status=’收藏本页’;” onmouseout=”status=”;”>收藏本页</span>
<br><a href=”{$mailto}” target=_blank>联系我们</a>
<br><a href=”boardhelp.asp?boardID={$boardid}”>论坛帮助</a></td></table></td>
<td width=”1”></td>
<tr><td width=”1”></td><td class=TopLighNav height=9 width=”*”></td><td width=”1”></td>
<!—index.asp##首页用户信息和在线用户状态-->
<table cellpadding=5 cellspacing=1 class=tableborder1 align=center style=”word-break:break-all;”>
<tr><th align=left colspan=2 height=25>-=> 用户来访信息</th></tr>
<tr><td valign=top class=tablebody1 height=25 width=100%>您的真实<b>IP</b>是:{$userip},
<b>操作系统</b>:{$system},<b>浏览器</b>:{$brw}</td></tr>
<tr><th colspan=2 align=left id=tabletitlelink height=25 style=”font-weight:normal”>
<b>-=论坛在线情况</b> [<span id=showstr><a href=”online.asp?action=1&boarded=0”
Target=”hiddenframe”>{$showstr}</a></span>][<a href=”boardstat.asp?reaction=online”>查看在线
用户位置</a>]</th></tr>
<tr><td width=100% valign=top class=tablebody1>目前论坛上总共有<b>{$onlinenum}</b> 人
在线,其中注册会员<b>{$ousernum}</b>人,访客<b>{$gusernum}</b>人。
<br>自<b>{$BuildDate}</b>创建以来,历史最高在线记录是<b>{$maxuser}</b>人同时在线,
发生时间是:{$maxusertime}<br>
<font color=”#ff0000”>名单图例</font>:{$piclist}<br>
<table border=0 cellspacing=0 cellpadding=0 align=center style=”width:100%” class=tableborder1>
<tr><td></td></tr></table>
<table width=100% border=0 cellspacing=0 cellpadding=0>
<tr><td height=5></td></tr>
<tr><td width100%><span style=”display:none” id=”onlinetr”></span></td></tr>
</table></td></tr></table><br>
<!—index.asp##首页底部论坛状态部分>
<table cellspacing=1 cellpadding=3 width=97% border=0 align=center>
<tr><td align=center><img src=”{nonewpic}” align=”absmiddle”> 没有新帖子
<img src=”{isnewpic}” align=”absmiddle”> 有新的
帖子 <img src=”{islockpic}” align=”absmiddle”>
被锁定的论坛</td></tr></table>
首页里用到了很多“{}”包括的字符,里面的内容是变量,因为论坛信息会随一些操作而改变而不同的显示状态,这些信息将随这些状态的改变而改变成及时的真实的状态。这些是要与数据库连接的,所以下面将说明数据库的连接函数。
3.2 数据库连接函数
数据库连接在论坛运行中是必不可少的,把这部分单独做成一个函数,在需要的时候只需要调用这个函数就可以了,而不用每次去写连接程序,这种复用可以让操作更加方便快捷。
选择的Access作为数据库,功能不强大,不能让很多人连接,但是可以省掉很多设置,对机器要求也相对要低得多,适合用PC机架设论坛。ASP中与数据相关紧密的是ADO,要让ADO对象能存取数据库,最重要的东西是OLE DB和ODBC的驱动程序,必须具备对应数据库的其中一种驱动程序,ADO对象才能进行存取。因为根据Microsoft公司的说法,OLE DB驱动程序的执行效能比ODBC要好,所以选择用OLE DB驱动程序。
利用ADO的Connection来建立同数据库的连接。建立ADODB.Connection对象,使用此对象的Open方法打开数据库。用Access在论坛路径下建立一个数据库存储路径“data”,然后建立一个名为mybbs7.mdb的数据库,建立之前数据库设计中的表。利用Microsoft公司的OLE DB机制连接Access,用OLE DB不用建立ODBC就可以直接连接Access数据库。见程序3-2。
程序3-2 Access数据库连接
Sub ConnectionDatabase
Dim ConnStr
Db=”data/mybbs7.mdb”
ConnStr=”Provider=Microsoft.jet.OLEDV.4.0”Data Source=”& Server.MapPath(db)
Set conn=Server.CreateObject(“ADODB.Connection”)
Conn.open ConnStr
if Err Then
Err.Clear
Set Conn=Nothing
Response.Write ”数据库连接出错,请检查连接字符串。”
Response.End
End if
End Sub
Sub声明了函数ConnectionDatabase,End Sub结束这个函数。Dim声明了变量ConnStr,这个变量是用来存储连接数据库信息的。变量Db声明了数据库文件所在的路径。为ConnStr赋值是声明OLE DB连接数据库的方式,Data Source后面跟的是数据库文件所在的路径。Server.MapPath是ASP内置Server对象一个函数,用来取得网站目录下文件的绝对路径。7~12行是一个判断错误的信息,如果连接出错,Asp的Err对象判断系统给出错误的存在,然后清除。
第四章 模块的实现
4.1 用户模块
4.1.1 用户的登陆
首先看用户的登陆。在用户信息表里用户名和用户密码字段是用来验证用户身份的,用这两个字段来写验证用户登陆的程序。
登陆页面命名为Login.asp,这个页面包含了输入用户名和密码、Cookie选项、和隐身登陆选项。隐身登陆只是一个判断登陆状态的标识。主要是验证用户身份和把用户信息写入Cookie。
首先看验证用户身份的程序,如程序4-1。
程序4-1 验证用户身份程序(Login.asp)
sqlstr=" UserName='"&username&"'"
Sql="Select UserID,UserName,UserPassword,UserEmail,UserPost,UserTopic,UserSex,UserFace,
UserWidth,UserHeight,JoinDate,LastLogin,UserLogins,Lockuser,Userclass,UserGroupID,
UserGroup,userWealth,userEP,userCP,UserPower,UserBirthday,UserLastIP,UserDel,UserIsBest,
UserHidden,UserMsg,IsChallenge,UserMobile,TitlePic,UserTitle,TruePassWord,UserToday "
Sql=Sql+" From [Dv_User] Where "&sqlstr&""
set rsUser=Mybbs.Execute(sql)
If rsUser.eof and rsUser.bof Then
ChkUserLogin=false
Exit Function
Else
iMyUserInfo=rsUser.GetString(,1, "|||", "", "")
rsUser.Close:Set rsUser = Nothing
End If
iMyUserInfo = "Mybbs|||"& Now & "|||" & Now &"|||"& Mybbs.BoardID &"|||"& iMyUserInfo
&"||||||Mybbs"
iMyUserInfo = Split(iMyUserInfo,"|||")
If trim(password)<>trim(iMyUserInfo(6)) Then
ChkUserLogin=false
ElseIf iMyUserInfo(17)=1 Then
ChkUserLogin=false
ElseIf iMyUserInfo(19)=5 Then
ChkUserLogin=false
Else
ChkUserLogin=True
Session(Mybbs.CacheName & "UserID") = iMyUserInfo
Mybbs.UserID = iMyUserInfo(4)
RegName = iMyUserInfo(5)
Article = iMyUserInfo(8)
UserLastLogin = iMyUserInfo(15)
UserClass = iMyUserInfo(18)
GroupID = iMyUserInfo(19)
TitlePic = iMyUserInfo(34)
If Article<0 Then Article=0
End If
首先是一个查询用户身份的SQL语句,输入某个用户后将从数据表User_T中查找该用户。set rsUser=Mybbs.Execute(sql)一句是用来执行这条SQL语句,同时返回一个包含了查询信息的记录集。If rsUser.eof and rsUser.bof Then一句判断用户信息是否存在。如果不为空,就将把数据集的信息写入储存用户信息的字符串中。If trim(password)<>
trim(iMyUserInfo(6)) Then一句判断用户密码是否和数据库中的用户密码相同。
Cookie是对于一些有限制注册用户才能看的页面用来识别是否登陆的。是由Web页服务器置于你硬盘上的一个很小的文本文件,一般不超过4KB。程序4-2是把用户信息写入Cookie的程序。
程序4-2 把用户信息写入Cookie(Login.asp)
select case usercookies
case "0"
Response.Cookies(Mybbs.Forum_sn)("usercookies") = usercookies
case 1
Response.Cookies(Mybbs.Forum_sn).Expires=Date+1
Response.Cookies(Mybbs.Forum_sn)("usercookies") = usercookies
case 2
Response.Cookies(Mybbs.Forum_sn).Expires=Date+31
Response.Cookies(Mybbs.Forum_sn)("usercookies") = usercookies
case 3
Response.Cookies(Mybbs.Forum_sn).Expires=Date+365
Response.Cookies(Mybbs.Forum_sn)("usercookies") = usercookies
end select
Response.Cookies(Mybbs.Forum_sn).path = Mybbs.cookiepath
Response.Cookies(Mybbs.Forum_sn)("username") = regname
Response.Cookies(Mybbs.Forum_sn)("userid") = Mybbs.UserID
Response.Cookies(Mybbs.Forum_sn)("password") = TruePassWord
Response.Cookies(Mybbs.Forum_sn)("userclass") = userclass
Response.Cookies(Mybbs.Forum_sn)("userhidden") = userhidden
Response是ASP的一个内置对象,Cookies是这个对象用来向浏览器写Cookie文件的集合。Cookies集合设置Cookie的值。若指定的Cookie不存在,则创建它,若存在。则设置新的值并且将旧值删除。Response.Cookies(Mybbs.Forum_sn).Expires=Date+1是用来保存用户选择的Cookie保存时间的,在选择时间内再次来论坛则可以不用再登陆了。
4.1.2 用户的注册
用户注册也关系到信息的验证,必须确定一些信息符合一定的规则和要求。用户注册后可以修改自己的信息和密码,如果忘记密码还有相关取回密码的操作。
首先就是用户的注册,命名为reg.asp,主要是对用户所填写信息的检测。主要包括字段是否为空,是不是满足长度、字符方面的要求;输入E-mail是否正确,主要判别是@字符是否存在和存在的位置;两次输入的密码是否一致;用户名是否已经存在,电子邮件是否被使用。
注册首先是要向数据库提交你所填写的信息,这些所填写的信息大多是表单的形式,可以使用Request.form()来获取表单内的文本框。Request是ASP的内置对象,Form是Request的一个获得表单的集合。
(1) 用户名的验证:在获取的同时就可以对文件长度等进行检测,使用Cint()函数进行强制执行整数运算判断是否在可接受的范围之内。
Cint(Mybbs.Forum_Setting(41)) or strLength(Request.form("name"))
<Cint(Mybbs.Forum_Setting(40))
使用InStr函数来判断是否存在非法的字符。
If Instr(username,"=")>0 or Instr(username,"%")>0 or Instr(username,chr(32))>0 or
Instr(username,"?")>0 or Instr(username,"&")>0 or Instr(username,";")>0 or Instr(username,",")>0
or Instr(username,"'")>0 or Instr(username,",")>0 or Instr(username,chr(34))>0 or
Instr(username,chr(9))>0 or Instr(username,"")>0 or Instr(username,"$")>0
(2) 密码的验证:主要验证的是密码的长度,采用Len()函数,可以返回字符串中字符的个数。参数可以是字符串也可以是变量名。
If Request.form("psw")="" or len(Request.form("psw"))>10 or len(Request.form("psw"))<6 Then
ErrCodes=ErrCodes+"<li>"+template.Strings(13)
(3) 电子邮件的验证:邮件的地址一般是“用户名@域名”,采用VBScript的函数Split(),可以返回一个一维数组。在参数部分可以设置“@”为字符串的标识界限。用这个符号来拆分电子邮件地址,形成数组。UBound()函数返回了数组维数的最大可用下标。
Dim names,name,i,c
Is ValidEmail=true
Names=Split(email,”@”)
If UBound(names)<>1 then
Is VailEmail=false
Exit function
End If
而用户的注册信息如果是合法的则在提交注册信息后要将这个注册信息插入到数据库中去,可以使用Recordset对象。
set rs=Server.CreateObject(“ADODB.Recordset”)
sql=”select * from [User_T]
rs.open sql,conn,2,3
rs.addnew
rs(“Username”)=username
rs(“Userpassword”)=password
rs(“UserEmail”)=useremail
rs(“Userclass”)=userclass
rs(“TitlePic”)=titlepic
rs.update
rs.close
set rs=nothing
但光有Recordset对象没有Connection对象也没有用,Connection对象已经写入了连接数据库的函数Conn.asp。
ConnStr = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " & Server.MapPath(db)
Set conn = Server.CreateObject("ADODB.Connection")
conn.open ConnStr
set rs=server.createobject("adodb.recordset")
sql="select * from [User_T] where username=’”&username&”’
rs.open sql,conn,1,3
在上面程序里,conn对象的功能是连接数据库,rs的功能是打开数据表User_T。而Connection对象的功能是连接数据库,连接程序如下:
Sub ConnectionDatabase
Dim ConnStr
Db = "data/mybbs7.mdb"
ConnStr = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " & Server.MapPath(db)
Set conn = Server.CreateObject("ADODB.Connection")
conn.open ConnStr
ConnStr = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " & Server.MapPath(db)一句分别设置了Provide参数和Data Source参数。
用户注册后要修改自己的信息。修改信息就是将原来用户的信息显示出来,待用户修改提交表单后更新数据库中的信息,这里同样要对用户新输入的信息进行检测,这个和用户注册部分的检测是一样的,只是没有了对用户名的检测。所以用户信息的修改的程序与用户注册是很相似的,只少了rs.addnew一句,另外在选取信息的时候的语句有所不同。
sql=”Select * from [User_T]” where userid=”& UserID
通过这一句可以准确的定位到用户的编号UserID的这条记录,这是利用了Recordset对象的查询功能,然后使用Recordset对象的写入功能,用rs.Update结束。
虽然用户的用户名不可以更改,但是用户的密码是可以更改的,这是用户身份验证的标识,同时也可以更改自己的密码提问和密码答案。这些更改也基本上和用户信息修改的程序相同,利用用户的编号取出用户的信息,验证用户的修改信息后更新数据库。
但是如果用户是忘记了密码而要取回,则就要调用到另外的一套程序。见程序4-3。
程序4-3 获得用户密码程序(Lostpass.asp)
If request.Form("username")="" Then
showerr template.Strings(6)
Exit Sub
Else
username=replace(request("username"),"'","")
End If
If Mybbs.Forum_Setting(2)<>"0" Then
Set Rs=Mybbs.execute("Select UserQuesion,userAnswer,Username,Usergroupid from [Dv_user] where username='"&username&"'")
Else
Set Rs=Mybbs.execute("Select UserQuesion,userAnswer,Username,Usergroupid from [Dv_user] where username='"&username&"' and UserGroupID>3")
End If
If rs.eof and rs.bof then
showerr template.Strings(8)
Exit Sub
ElseIf rs(3) < 4 then
showerr template.Strings(7)
Exit Sub
Else
If rs(0)="" or isnull(rs(0)) Then
showerr template.Strings(9)
Exit Sub
Else
template.html(6)=Replace(template.html(6),"{$Quesion}",Rs(0))
template.html(6)=Replace(template.html(6),"{$username}",username)
If Mybbs.forum_setting(81)="0" Then
template.html(6)=Replace(template.html(6),"{$getcode}","")
Else
template.html(6)=Replace(template.html(6),"{$getcode}"," 验证码:
"&Mybbs.GetCode())
End If
Response.Write template.html(6)
End If
End If
Rs.Close
Set Rs=Nothing
这里是通过两步来完成取回密码的,第一步是验证用户名,第二步才是取回密码。
4.1.3 浏览其他用户信息
如程序4-4。
程序4-4 用户列表程序(dispuser.asp)
UPSQL="update [Dv_user] set UserViews=UserViews+1 "
SQL=" Select UserID,UserName,UserPassword,UserEmail,UserPost,UserTopic,UserSign,UserSex,
UserFace,UserWidth,UserHeight,UserIM,JoinDate,LastLogin,UserLogins,UserViews,Lockuser,
Userclass,UserGroup,userWealth,userEP,userCP,UserTitle,UserBirthday,UserQuesion,UserAnswer,
UserLastIP,UserPhoto,UserFav,UserPower,UserDel,UserIsBest,UserInfo,UserSetting,UserGroupID,
TitlePic,UserHidden,UserMsg,IsChallenge,UserMobile From [Dv_User] "
If ShowUserid="" Then
UPSQL=UPSQL + " Where Username='"&UserName&"'"
SQL=SQL + " Where Username='"&UserName&"'"
Else
UPSQL=UPSQL + " Where Userid="&ShowUserid
SQL=SQL + " Where Userid="&ShowUserid
End If
Set Rs=Mybbs.Execute(Sql)
If Rs.Eof And Rs.Bof Then
Mybbs.AddErrCode(32)
Exit Sub
Else
Mybbs.Execute(UPSQL)
'UserInfo=Rs.GetRows(1)
SQL=Rs.GetString(,1, "@@@", "", "")
Rs.Close:Set Rs=Nothing
End if
UserInfo=Split(Sql,"@@@")
ShowUserid=Clng(UserInfo(0))
UserName=UserInfo(1)
前面的SQL语句和用户修改信息很相似,实际上就是修改用户信息的另外一种方法。Rs.GetString(,1, "@@@", "", "")这个方法是将Recordset作为字符串返回,Getstring可以有4个参数,这里只用到两个。因为浏览用户只需要从数据库中读取一条记录,所以这里的第二个参数为1,@@@是用来分割记录集字符串。使用这个方法会使读取记录的速度比较快,从而提高ASP的效率。