1
引言 ........................................................................................................................................... 5 1.1 1.2 1.3 2
课题背景 ........................................................................................................................... 5 国内外研究现状 ............................................................................................................... 5 本课题的研究意义 ........................................................................................................... 5
系统分析 ................................................................................................................................... 5 2.1 2.2
系统需求分析 ................................................................................................................... 5 系统功能描述 ................................................................................................................... 6
2.2.1 主要功能 ....................................................................................................................... 6 2.2.2 论坛扩展功能 ............................................................................................................... 8 3
系统设计 ................................................................................................................................... 8 3.1 3.2 4
功能模块 ........................................................................................................................... 8 数据库设计 ..................................................................................................................... 10
系统实现 ................................................................................................................................. 14 4.1 4.2 4.3
首页 ................................................................................................................................. 14 数据库连接函数 ............................................................................................................. 15 用户模块 ......................................................................................................................... 15
4.3.1 用户登录 ..................................................................................................................... 15 4.3.2 用户注册 ..................................................................................................................... 17 4.3.3 与其他用户联系 ......................................................................................................... 20 4.3.4 找回密码 ..................................................................................................................... 21 4.3.5 用户登录添加验证码 ................................................................................................. 22 4.4
版面/公共信息模块 ........................................................................................................ 23
4.4.1 版面模块 ..................................................................................................................... 23 4.4.2 公共信息模块 ............................................................................................................. 24 4.5
帖子模块 ......................................................................................................................... 25
4.5.1 发布/删除/修改帖子模块 ......................................................................................... 25 4.5.2 帖子浏览模块 ............................................................................................................. 29 4.5.3 帖子搜索模块 ............................................................................................................. 29 4.5.4 其它功能 ..................................................................................................................... 30 4.6
管理员模块 ..................................................................................................................... 30
4.6.1 用户管理 ..................................................................................................................... 30
4.6.2 版面管理 ..................................................................................................................... 31 4.6.3 帖子管理 ..................................................................................................................... 31 4.6.4 数据库备份和恢复 ..................................................................................................... 31 结 论 ......................................................................................................................................... 33 致 谢 ......................................................................................................................................... 33 参考文献 ......................................................................................................................................... 34
2 / 36
摘 要
电子论坛即BBS已经是互联网上的一种极为常见的互动交流服务。论坛可以为网友提供开放性的分类讨论区专题服务,网友们可以在此发表自己的观感,交流某些技术,经验等。论坛也可以作为用户和商家交流的渠道,商家也可以在此回答用户提出的问题或发布某些消息。
本系统使用ASP进行开发,数据库采用Microsoft SQL Server 2000。本文描述了企业论坛系统的设计与实现。首先对系统的需求进行了分析,建立系统工作流程图,设计系统数据库,对数据库结构进行了详细分析。然后划分系统功能模块,最后详细描述了各个功能模块实现的方法,并给出相应代码。
关键词:论坛系统;ASP;SQL Server 2000
3 / 36
青岛飞洋职业技术学院毕业论文
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
4 / 36
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. 版面:表明发言内容的类型。 3. 公共信息:与论坛相关的信息。 4. 帖子:论坛中单个观点的讨论。
5 / 36
5. 管理员:与论坛服务的人员。
论坛的对象不是孤立的,它们是紧密联系的,下面是论坛各个对象之间的关联表,关联是单向的,是指左侧对象对上方对象的活动。无关联的用×表示,如果两者只要单向关联,那么在另一个对象关联时用√表示。
表1 各对象之间的关系表 用户 用户 注册 修改 浏览 联系 版面 公共信息 帖子 管理员 √ √ √ 删除 授权 × × × 添加 删除 修改 × × × 添加 删除 修改 版面 浏览 公共信息 浏览 发布 帖子 浏览 发布 修改 删除 × × × 添加 删除 修改 √ √ √ × 管理员 √ 至此,论坛的需要分析完成,接下来是论坛的功能设计。
2.2 系统功能描述
2.2.1 主要功能
首先从用户开始,用户关联的对象是自身,版面,公共信息,帖子。分别根据用户与这些对象的联系给出一个明确的菜单
表2 用户功能表 序号 1 功能名称 用户注册 说明 用户在论坛填写必要信息就可以成为注册用户,注册后,可修改自己的注册信息 2 3 4 用户登录 浏览用户信息 与其它用户联系 5 6 7 8 浏览版面 浏览公共信息 浏览帖子 发布修改删除帖子 9 对帖子的特殊操作 主要针对版主类型的用户,可对帖子置顶,设置精华,删除帖子,移动帖子等操作 任何用户可浏览版面信息 任何用户可浏览公共信息 任何用户可浏览帖子 注册用户登录后可发布帖子,修改自己的帖子,删除自己的帖子 用户注册后可使用用户名,密码登录,可选择用户名,密码保存期限 注册用户可查看其它用户信息 注册用户可发站内短信 接下来的版面,公共信息,帖子都没有和其他对象的关联,它们在论坛中是被动对象,是被其它对象所操作。因此针对它们的主要功能是由其它对象产生,例如浏览版面就是用户的功能。
管理员是论坛的一个特殊群体,它们的主要工作是保证论坛的正常运行,他们可以和论坛的所有对象产生联系,因此他们的功能也很丰富
表3 管理员功能表
6 / 36
序号 1 2 3 4 5 功能名称 用户删除 用户授权 版面管理 公共信息管理 帖子的管理 说明 对于在论坛中造成很坏影响的用户,应该删除他们的身份 授予用户版主权限 版面是论坛的枝干,对版面进行添加,修改,删除等操作 公共信息展示论坛的状态,不能出现非法言论 帖子是论坛的枝叶,帖子的好坏关系到论坛的健康发展,对帖子进行删除,移动等 6 数据库的备份 管理员应该定期地对系统数据库备份,以免造成不必要的损失 现在分析各个对象的相关操作,设计为对象的功能实现接口,即为对象的操作方法。各个板块有浏览列表和管理两个方法,管理方法又可以分为添加,修改,删除3个子方法。
帖子有浏览,发帖,回帖,搜索和管理5个方法,浏览方法又分为列表和查看两个子方法,管理方法分为编辑,删除,置顶,移动,指定精华5个子方法,如图。
删除
搜索 浏览帖子 管理员 移动 用户 管理帖子 回帖 发帖 编辑 指定精华 置顶 图1 帖子对象的相关关系
用户有注册、登录2个方法,管理用户方法又分为删除和设置权限2个子方法,如图。
管理员 删除 用户 注册 管理用户 设置权限 登录 图2 用户对象的相关关系
这样分析完后,前面列出的功能列表就有了各自的归属对象。
论坛一般存在两种用户:注册用户和管理员。用户的权限是向下覆盖的,既上级权限包含下级权限,在论坛中,管理员是上级权限。
7 / 36
论坛的3大基本功能的相互关系如下图所示。
发帖 帖子列表 回帖 浏览帖子 图3 论坛基本功能的关系
本系统还有一些是论坛的内容更加丰富的扩展功能。
2.2.2 论坛扩展功能
下面是个一个论坛扩展功能表。
表4 扩展功能表 序号 1 功能名称 用户控制自己的信息 序号 2 功能名称 用户登录添加验证码 3 4 5 站内短信 帖子评价 帖子发布添加多媒体 6 7 8 9 10 11 论坛收藏 帖子搜索 用户等级 论坛情况显示 数据备份 非法言论过滤 保留用户喜欢的内容,方便用户查看 提供模糊搜索,方便用户找到感兴趣的主题 给用户一个荣誉,提高用户发帖的积极性 把论坛的一些数据显示给用户,如发帖数,在线用户人数等 防止论坛出现故障,能够正常运行 对于一些非法言论可以在论坛中进行默认设置过滤 方便用户在站内联系 提高用户参与论坛的积极性 吸引用户,扩展帖子发布功能 说明 防止暴力破解密码,输入用户名或密码错误会重新生成验证码 说明 用户不想让其他用户看到自己的信息,可以控制自己的信息是否公开 添加了这几个扩展功能后,论坛就显得平易近人多了,也更具有使用性。
3 系统设计
3.1 功能模块
根据上一节给出论坛所必须的功能,划分模块。模块的划分主要是按照每一个对象的操作来归类。论坛操作的对象是上一节所归纳的5个。下面就针对这5个对象划分功能模块。
用户:有两个模块,一个是用户注册,登录,修改信息等功能组合,是用户对用户自身的操作;另一个是管理员对用户进行删除,授权,是管理员对用户的操作,如表5。
8 / 36
表5 用户功能模块表 模块 用户模块 模块包含的功能 用户注册 用户登录 浏览其它用户信息 与其它用户联系 用户控制自己的信息 用户登录添加验证码 用户等级 管理员模块 用户删除 用户授权 版面:也有两个模块,一个是浏览模块,一个是管理模块。其功能模块列表如表6。
表6 版面功能模块表 模块 版面浏览模块 版面管理模块 模块包含的功能 浏览版面 版面管理 公共信息:用户浏览公共信息的功能划分一个模块,管理员对公共信息的操作划分为一个模块,其功能模块列表如表7
表7 公共信息功能模块表
模块 公共信息显示模块 公共信息管理模块 模块包含的功能 浏览发布的公共信息 公共信息管理 帖子:帖子包括用户对帖子的操作和管理员对帖子的操作,相应地分为帖子模块和帖子管理模块,如表8。
表8 帖子功能模块表 模块 帖子模块 模块包含的功能 浏览帖子 发布/修改/删除帖子 对帖子的特殊操作 帖子评价 帖子发布添加多媒体 论坛收藏 帖子搜索 帖子管理模块 删除帖子 移动帖子 管理员:管理员是对其他对象进行操作,如表9。
表9管理员管理功能模块表
9 / 36
模块 管理员管理模块 模块包含的功能 用户管理 版面管理 帖子管理 数据备份 另外,对于用户使用的模块称为前台模块,管理员使用的模块称为后台模块。系统总体功能划分如图4。
论坛系统前台模块后台模块用户模块版面浏览模块公共信息模块帖子模块用户管理模块版面管理模块公共信息管理模块帖子管理模块管理员管理模块
图4 系统总体功能划分
3.2 数据库设计
本论坛使用Microsoft SQL Server 2000数据库,下面列出是数据库设计的详细。
1.建立数据表间的关系
本论坛数据库共有11个数据表,具体如表10所示。
表10 论坛数据表 序号 1 2 3 4 5 6 7 8 9 10 表名 user_t topic_t superAdmin_t post_t message_t grade_t friend_t file_t board_t area_t 10 / 36
说明 用户信息表 主题信息表 论坛管理员表 帖子信息表 短消息信息表 用户积分等级表 用户好友表 文件上传表 子版面信息表 父版面信息表
11 admin_t 版主信息表 下面是数据表之间的关系图,如图5。
图5 数据表关系
2.数据表结构的详细设计
表11 用户信息表(user_t) 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 字段名 userid username userpassword useremail usersign usersex userface point joindate userbirthday userquestion useranswer userlastip userhidden userqq truename country city 字段类型 Int Varchar(50) Varchar(50) Nvarchar(255) Nvarchar(255) Varchar(50) Nvarchar(255) Int Datetime Nvarchar(50) Nvarchar(50) Nvarchar(50) Nvarchar(40) bit Nvarchar(255) Nvarchar(255) Nvarchar(255) Nvarchar(255) 11 / 36
说明 用户编号 用户名 密码 电子邮件 用户签名 用户性别 头像 积分 注册日期 用户生日 密码问题 密码答案 最后登录IP 是否隐身登录 用户QQ 真实姓名 国家 城市 备注 主键 Not null Not null Not null Not null Not null Not null Not null Not null Not null
19 20 21 22 23 24 25 26 constellation blood phone Works School Address jbzl xxzl Nvarchar(255) Nvarchar(255) Nvarchar(50) Nvarchar(255) Nvarchar(255) Nvarchar(255) bit bit 星座 血型 电话 职业 毕业院校 家庭住址 是否公开基本资料 是否公开详细资料 Not null Not null 在用户信息表里保存的是在论坛注册用户的信息,用户编号和用户名在论坛中是不能重复的,用户名不能重复还使用用户编号的原因是计算机对数字检索速度更快。
表12 父版面信息表(area_t) 序号 1 2 3 字段名 areaid areaname setuptime 字段类型 Int Varchar(255) datetime 说明 父版面编号 父版面名 建立时间 备注 主键 Not null Not null 表13 子版面信息表(board_t)
序号 1 2 3 序号 4 5 6 7 8 字段名 boardid boardname areaid 字段名 readme setuptime boardmaster topicnumber indexIMG 字段类型 Int Varchar(50) Int 字段类型 Varchar(255) Datetime Varchar(50) Int Varchar(255) 说明 子版面编号 子版面名 父版面编号 说明 版面说明 建立日期 版主 主题数量 版面图片 备注 主键 Not null Not null 备注 Not null Not null Not null Not null 表12和13是版面信息表,这里使用两个表是为了编程方便,父版面和子版面是通过areaid字段关联的。
表14 主题信息表(topic_t)
序号 1 2 3 4 5 6 7 8 9 10 字段名 topicid title bordid reply userid username DateAndTime hits istop isbest 字段类型 Int Varchar(255) Int Int Int Varchar(50) Datetime Int Bit Bit 12 / 36
说明 主题编号 主题 版面编号 主题回复数 用户编号 用户名 发表日期 点击数 是否置顶 是否精华 备注 主键 Not null Not null Not null Not null Not null Not null Not null Not null Not null
11 fileid int 上传文件编号 Not null 表15 帖子信息表(post_t) 序号 1 2 3 4 5 6 7 8 9 10 字段名 postid parentid boardid username userid topicid title DateAndTime body ip 字段类型 Int Int Int Varchar(50) Int Int Varchar(255) Datetime Text Varchar(40) 说明 帖子编号 回复帖子编号 版面编号 用户名 用户编号 主题编号 主题 发表日期 帖子内容 用户IP 备注 主键 Not null Not null Not null Not null Not null Not null Not null Not null Not null 以上两张表是紧密关联的,论坛主题信息表记载了论坛中主题帖的信息,建立这个表的原因是用户在浏览论坛中的帖子时先应看到的是主题列表,如果主题能够吸引用户,用户才会去看其中的内容,否则用户一进来就看到帖子内容,会使用户感觉非常的杂乱。这两个表是通过topicid字段联系起来的,parentid字段是用来针对特定的帖子回复。
接下来几张表是论坛的其它功能需要的数据表。
表16 短消息信息表(message_t)
序号 1 2 3 4 5 6 7 字段名 mid sender incept title content sendtime flag 字段类型 Int Varchar(50) Varchar(50) Varchar(255) Varchar(255) Datetime bit 说明 短消息编号 发送者 接受者 主题 内容 发消息时间 是否已读 备注 主键 Not null Not null Not null Not null Not null Not null 表17 用户等级信息表(grade_t)
序号 1 2 3 4 5 6 字段名 gradeid userid postid grade point ip 字段类型 Int Int Int Varchar(255) Int Varchar(40) 说明 自动编号 用户编号 帖子编号 等级 积分 IP 备注 主键 Not null Not null Not null Not null Not null 表18 文件上传信息表(file_t) 序号 1 2 字段名 fileid fname 字段类型 Int Varchar(100) 13 / 36
说明 文件编号 文件名 备注 主键 Not null
3 4 5 6 userid ename ftype fsize Int Varchar(50) Varchar(255) Varchar(255) 用户编号 文件扩展名 文件类型 文件大小 Not null Not null Not null Not null 表19 好友信息表(friend_t)
序号 1 2 3 4 5 6 字段名 Fid Userid username friendid frinedname addtime 字段类型 Int Int Varchar(50) Int Varchar(50) datetime 说明 自动编号 用户编号 用户名 好友编号 好友名 添加时间 备注 主键 Not null Not null Not null Not null Not null 表20 管理员信息表(admin_t) 序号 1 2 3 4 5 字段名 masterid userid username boardid flag 字段类型 Int Int Varchar(50) Int bit 说明 自动编号 用户编号 用户名 版面编号 权限标识 备注 主键 Not null Not null Not null Not null 4 系统实现
4.1 首页
当用户打开论坛时,首先看到的是论坛首页,用户从首页可以看到和论坛相关的并且能激起用户兴趣的东西。比如发帖数,在线用户数以及论坛板块的情况,如图6所示。
14 / 36
图6论坛首页
首页分为3个部分,最上面的导航条为一部分,中间的公共信息为一部分,下面的版面为一部分。将导航条部分单独写入文件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 用户模块
4.3.1 用户登录
下面是一个用户登录的界面,如图7。
图7 用户登录界面
下面是对用户登录页面的表单处理程序
15 / 36
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
16 / 36
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(\"\") 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 用户注册
用户注册,首先要检查的就是用户填写的信息,其中包括: 1. 字段是否空白,若空白则不接受。
2. 输入的E-mail是否正确,若E-mail中没有@,@符号位于E-mail的第一
个字符或者@位于E-mail的最后一个字符都算错误。 3. 两次输入的密码是否一致。 4. 用户名是否被使用。 5. 电子邮件是否被使用。
新用户注册reg.asp 修改信息update_userinfo.asp 修改密码update_pwd.asp 忘记密码lostpwd.asp 写入 写入 读取 写入 读取 读取 user_t
图8用户注册各个页面与数据库的关系
下面是验证用户注册信息的程序:
17 / 36
1 <% a=instr(request(\"userpassword\"),\"*\") 2 b=instr(request(\"userpassword\"),\" \") 3
if
username=\"\"or
useremail=\"\"or
userquestion=\"\"or
useranswer=\"\"or
userpassword=\"\"or userpassword1=\"\"then
4 response.Write(\"必填信息不能为空,请填完!\") 5 elseif userpassword<>userpassword1 then 6
response.Write(\"两次输入密码不一致,请重新输入!\")
7 elseif len(username)>10 then 8 9
response.Write(\"你输入的用户名太长,请重新输入!\") elseif len(userpassword)<6 or len(userpassword)>18 then
10 response.Write(\"密码不符合要求,请重新输入!\") 11 elseif not isvalidemail(useremail) then
12 response.Write(\"电子邮件地址错误,请重新输入\") 13 elseif a<>0 or b<>0 then
14 response.Write(\"请不要将‘*’和‘ ’等符号作为密码!\") 15 elseif useronly(username,useremail) then 16 response.Write(\"用户名被占用!\") 17 else
18 验证通过后将用户信息写入用户信息表user_t 19 end if %>
程序说明:第1~2行是取出密码中“*”和“ ”在字符串中的位置;第11行调用了isvalidmail函数,该函数是验证电子邮件地址正确性;第15行调用了useronly函数,该函数是验证用户名和电子邮件唯一性;下面给出验证电子邮件正确性的程序:
1 function isvalidemail(email) 2 dim names,named,I,c
3 4 5 6 7 8
9
isvalidemail=true names=split(email,”@”) if ubound(names)<>1 then isvalidemail=false exit function end if
for each named in names
10 if len(named)<=0 then
18 / 36
11 12 13 14 15 16 17 18 19 20 21 22 23 24
isvalidemail=false exit function end if
for i=1 to len(named) c=lcase(mid(named,I,1))
if instr(“abcdefghijklmnopqrstuvwxyz_-.”,c)<=0 and not isnumericI then isvalidemail=false exit function end if
next
if left(named,1)=”.” Or right(named,1)=”.” Then isvalidemail=false
exit function
end if
25 next
26 if instr(names(1),”.”)<=0 then 27 28 29 30 31 32 33 34 35 36 37
isvalidemail=false
exit function
end if
i=len(names(1))-instrrev(names(1),”.”) if i<>2 and i<>3 then isvalidemail=false exit function end if
if instr(email,”..”)>0 then isvalidemail=false end if
38 end function
下面是验证用户和电子邮件唯一性的程序:
1 function useronly(user,email)
2 set rs = server.CreateObject(\"adodb.recordset\")
3 sql=\"select * from user_t where username='\"&user&\"' or useremail='\"&email&\"'\"
4 rs.open sql,conn,3,3
19 / 36
5 if rs.eof and rs.bof then 6 useronly=false 7 else
8 useronly=true 9 end if 10 rs.close 11 set rs=nothing 12 end function
它包括修改信息(upadate_userinfo.asp)和修改密码(update_pwd.asp)两个页面。两个页面都是更新用户信息表user_t里的特定字段,这里就不再列出具体程序。
4.3.3 与其他用户联系
站内用户通过短消息与其他用户联系,下面是用户收/发短消息的页面:
图9 用户收/发短消息页面
该功能包括了发短消息,发件箱和收件箱三部分,发短消息是向短消息表(message_t)添加记录,发件箱和收件箱都是从message_t表读取记录。
标记短消息是否已读是对数据表message_t中的flag字段操作。下面是标记短消息已读的程序:
1 <% '标记短消息已读 2 abc=request(\"mid\")
3 set rsmessage = server.CreateObject(\"adodb.recordset\")
4 rsmessage.open \"select * from message_t where mid='\"&abc&\"'\
exec=\"update message_t set flag='1' where mid='\"&abc&\"'\" 5 conn.execute(exec) 6 rsmessage.close 7 set rsmessage=nothing 8 conn.close 9 set conn=nothing
20 / 36
10 response.Redirect(\"messageInceptCon.asp?mid=\"&abc&\"\") %>
下面是统计未读消息数的程序:
1 <% '统计未读消息数
2 set rsmessage1 = server.CreateObject(\"adodb.recordset\")
3 rsmessage1.open \"select * from message_t where flag='0' and incept='\"&session(\"user\")&\"'\
4 if rsmessage1.bof or rsmessage1.eof then 5 session(\"flag\")=0 6 else 7 k=0
8 do while not rsmessage1.eof 9 k=k+1
10 session(\"flag\")=k 11 rsmessage1.movenext 12 loop
13 rsmessage1.close 14 set rsmessage1=nothing 15 end if
16 conn.close
17 set conn=nothing %>
4.3.4 找回密码
当用户忘记密码时,可以使用找回密码功能。这就要用到用户信息表user_t里的userquestion和useranswer两个字段。系统根据用户名给出密码问题,用户给出密码答案,若匹配,系统会将用户的密码发至用户注册时填写的电子邮箱中。系统给出密码问题和用户给出密码答案是对数据表user_t的读/写操作,前面已经介绍过类似的程序,就不再讨论,这里给出系统是如何将密码发至用户邮箱的程序:
1 <% Set jmail = Server.CreateObject(\"JMAIL.SMTPMail\") '创建一个JMAIL对象 2 jmail.silent = true 'JMAIL不会抛出例外错误,返回的值为FALSE跟TRUE 3 jmail.logging = true '启用使用日志
4 jmail.Charset = \"GB2312\" '邮件文字的代码为简体中文 5 jmail.ContentType = \"text/html\" '邮件的格式为HTML的 6 jmail.ServerAddress = \"smtp.163.com\" '发送邮件的服务器
21 / 36
7 jmail.AddRecipient username '邮件的收件人 8 jmail.SenderName = \"地狱男爵\" '邮件发送者的姓名
9 jmail.Sender=\"******************\"'邮件发送者的邮件地址
10 jmail.Priority = 1 '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值 11 jmail.Subject = \"找回你的密码\" '邮件的标题 12 jmail.Body = \"你的密码是:\"&userpwd '邮件的内容 13 jmail.AddRecipientBCC email '密件收件人的地址 14 jmail.AddRecipientCC admin'邮件抄送者的地址 15 jmail.Execute() '执行邮件发送 16 jmail.Close '关闭邮件对象 %>
4.3.5 用户登录添加验证码
使用验证码,用户每次登录时都不一样,这样做的目的是为了防止有人利用破解程序,暴力破解用户的密码。验证码的处理程序已经讨论过,这里给出生成验证码的程序:
1 <% Option Explicit 2 Response.Buffer = True 3 Response.Expires = -1
4 Response.AddHeader \"Pragma\5 Response.AddHeader \"cache-ctrol\6 Dim RndNum,ImgFileContent 7 Randomize Timer
8 RndNum = Cint(7999*Rnd+1000)
9 Session(\"cnbruce.com_ValidateCode\") = Cstr(RndNum) 10 ImgFileContent=NumCode(RndNum) 11 Response.ContentType = \"image/BMP\" 12 Response.BinaryWrite ImgFileContent 13 Function NumCode(NumS) 14 Dim NumI,NumJ 15 Dim AdoM,AdoN 16 Dim Arr_Img(4),NStr 17 NStr=Cstr(NumS) 18 For NumI=0 To 3
19 Arr_Img(NumI)=Cint(Mid(NStr,NumI+1,1))
22 / 36
20 Next 21 Dim Position
22 Set AdoM=Server.CreateObject(\"Adodb.Stream\") 23 AdoM.Mode=3 24 AdoM.Type=1 25 AdoM.Open
26 Set AdoN=Server.CreateObject(\"Adodb.Stream\") 27 AdoN.Mode=3 28 AdoN.Type=1 29 AdoN.Open
30 AdoM.LoadFromFile(Server.Mappath(\"validatebody.fix\")) 31 AdoN.Write AdoM.Read(1280) 32 For NumI=0 To 3
33 AdoM.Position=(9-Arr_Img(NumI))*320 34 AdoN.Position=NumI*320 35 AdoN.Write AdoM.Read(320) 36 Next
37 AdoM.LoadFromFile(Server.Mappath(\"validatehead.fix\")) 38 Position=Lenb(AdoM.Read()) 39 AdoM.Position=Position 40 For NumI=0 To 9 Step 1 41 For NumJ=0 To 3
42 AdoN.Position=NumI*32+NumJ*320 43 AdoM.Position=Position+30*NumJ+NumI*120 44 AdoM.Write AdoN.Read(30) 45 Next 46 Next
47 AdoM.Position = 0 48 NumCode = AdoM.Read() 49 AdoM.Close:Set AdoM=Nothing 50 AdoN.Close:Set AdoN=Nothing
51 End Function %>
4.4 版面/公共信息模块
4.4.1 版面模块
23 / 36
版面浏览指的是版面列表,下面是一个显示版面的程序,用了一个循环的嵌套来显示父版面和子版面,使用了表area_t和表board_t。
1 <% set rs = server.CreateObject(\"adodb.recordset\") 2 rs.open \"select * from area_t order by areaid\3 Do While Not rs.Eof’创建一个对象实例,打开表area_t 4 response.Write(rs(\"areaname\"))’显示父版面名 5 set rj = server.CreateObject(\"adodb.recordset\")
6 rj.open \"select * from board_t where areaid='\"&rs(\"areaid\")&\"' order by boardid\
7 do while not rj.eof %>’打开表board_t
8 \"><% response.Write (rj(\"boardname\")) %>’显示子版面名,并作为进入子版面主题列表的链接 9 <% if not rj.eof then rj.movenext 10 loop 11 rj.close 12 set rj=nothing
13 if not rs.eof then rs.movenext 14 loop 15 rs.close
16 set rs=nothing %>
4.4.2 公共信息模块
公共信息部分的程序publicInfo.asp显示论坛和当前用户的状态,下面是一个统计在线人数的程序。
1 <%
2 dim refreshtime,idletime,totalusers,onlineuser(),tmp(),num,i,id 3 refreshtime=30 4 idletime=refreshtime*3 5 application.Lock()
6 if application(session.SessionID&\"lastaccesstime\")=empty then 7 if application(\"totalusers\")=empty then application(\"totalusers\")=0 8 redim tmp(application(\"totalussers\")+1) 9 num=0
10 if application(\"totalusers\")>0 then
24 / 36
11 for i=lbound(application(\"onlineuser\")) to
lbound(application(\"onlineuser\"))
12 id=application(\"onlineuser\")(i) 13 14 15 16
if id<>session.SessionID then tmp(num)=id
num=num+1
end if
17 next 18 end if
19 tmp(num)=session.SessionID 20 application(\"totalusers\")=num+1
21 redim preserve tmp(application(\"totalusers\")) 22 application(\"onlineuser\")=tmp 23 end if
24 application(session.SessionID & \"lastaccesstime\") =timer 25 redim tmp(application(\"totalusers\")) 26 num=0
27 for i=0 to application(\"totalusers\")-1 28 id=application(\"onlineuser\")(i)
29 if (timer-application(id & \"lastaccesstime\")) 36 if num<>application(\"totalusers\") then 37 redim preserve tmp(num) 38 application(\"onlineuser\") =tmp 39 application(\"totalusers\")=num 40 end if 41 application.UnLock %> 4.5 帖子模块 4.5.1 发布/删除/修改帖子模块 25 / 36 网络技术的发展日新月异,现在用户发言时使用的格式也是丰富多彩。例如:用户可以上传文件,可以粘贴多媒体等。下面是一个帖子的发布页面,如图10。 图10 帖子发布页面 1.文件长传部分 文件上传可以分为组件上传和无组件上传,本论坛使用的是无组件上传,它的好处是不受系统环境的影响。并且将文件上传到文件夹,将文件信息写入文件信息数据表file_t中。首先分析上传数据格式,在 1 Function GetFileInfo(FormName) 2 Dim strTemp,dataStart,dataEnd,dataLen,temp,intFlag 3 strTemp=StringToBinary(\"Content-Disposition: form-data; name=\"\"\" & FormName & \"\"\"; filename=\"\"\") 4 intFlag=InstrB(formData,Divider & bncrlf & strTemp) 5 Dim arrayTemp() 6 If intFlag>0 Then 7 Redim arrayTemp(4) 8 dataStart=intFlag+LenB(Divider & bncrlf & strTemp) '定位到第1个字符 9 dataend=InstrB(datastart,formdata,bncrlf)-2 '定位到最后1个字符 10 dataLen=dataend-datastart+1 '返回要取信息的长度 11 arrayTemp(0)=MidB(formdata,datastart,datalen) '返回文件路径 12 arrayTemp(0)=BinaryToString(arrayTemp(0)) '转换为文本字符串 26 / 36 13 arrayTemp(1)=Mid(arrayTemp(0),InstrRev(arrayTemp(0),\"\\\")+1) '返回文件的扩展名,其实只要从文件名称中分析出文件扩展名即可 14 arrayTemp(2)=Mid(arrayTemp(1),InstrRev(arrayTemp(1),\".\")+1) '下面获取文件的MIME类型 15 temp=dataend '记住当前位置 16 datastart=temp+18 '定位到第1个字符 17 dataend=InstrB(datastart,formdata,bncrlf & bncrlf)-1 '定位到最后1个字符 18 dataLen=dataend-datastart+1 '返回要取信息的长度 19 arrayTemp(3)=MidB(formdata,datastart,datalen) '返回MIME类型 20 arrayTemp(3)=BinaryToString(arrayTemp(3)) '转换为文本字符串 21 temp=dataend '下面获取文件大小 22 datastart=dataend+5 '定位到第1个字符 23 dataend=InstrB(datastart,formdata,divider)-3 '定位到最后1个字符 23 arrayTemp(4)=dataend-datastart+1 '返回文件大小 25 Else 26 27 Redim arrayTemp(0) arrayTemp(0)=\"0\" 28 End If '下面返回函数值 29 GetFileInfo=arrayTemp 30 End Function 下面是将上传文件保存到指定的文件夹中的函数: 1 Function SaveToFile(FormName,SaveFilePath,OverWriteFlag) 2 Dim strTemp,dataStart,dataEnd,dataLen,temp,intFlag,filepath,filename 3 strTemp=StringToBinary(\"Content-Disposition: form-data; name=\"\"\" & FormName & \"\"\"; filename=\"\"\") 4 intFlag=InstrB(formData,Divider & bncrlf & strTemp) 5 Dim arrayTemp() 6 If intFlag>0 Then '因为后面要用到文件的名字,所以首先返回文件的名字 7 dataStart=intFlag+LenB(Divider & bncrlf & strTemp) '定位到第1个字符 8 dataend=InstrB(datastart,formdata,bncrlf)-2 '定位到最后1个字符 9 dataLen=dataend-datastart+1 '返回要取信息的长度 10 filepath=BinaryToString(MidB(formdata,datastart,datalen)) '返回文件路径 11 filename=Mid(filepath,InstrRev(filepath,\"\\\")+1) '从当前位置找到两个回车换行符,也就是文件内容开头的地方 27 / 36 12 dataStart=InstrB(intFlag,formdata,bncrlf & bncrlf)+4'定位到文件内容所在第1个字符 13 dataEnd=InstrB(datastart,formdata,divider)-3 '定位到文件内容的最后一个字符 14 dataLen=dataend-datastart+1 '返回文件内容的长度 15 If dataLen<=0 Then 16 SaveToFile=3 17 Exit Function 18 End If 19 'objStream2对象中,然后再利用SaveToFile方法保存到指定文件夹下。 20 Dim objStream1 21 Set objStream1=Server.CreateObject(\"Adodb.Stream\") 22 objStream1.Type = 1 '设置二进制方式 23 objStream1.Open 对象 24 objStream1.Write formdata '写出文件内容到对象中 25 Dim objStream2 26 Set objStream2=Server.CreateObject(\"Adodb.Stream\") 27 objStream2.Type = 1 '设置二进制方式 28 objStream2.Open '打开对象 29 objStream1.Position=datastart-1 定起始位置,这里索引从0开始,所以减1 30 objStream1.CopyTo objStream2,dataLen '写出文件内容到对象中 '如果允许覆盖,才覆盖,否则给出提示信息,提示客户更改名字 31 If OverWriteFlag=True Then 32 objStream2.SaveToFile SaveFilePath & \"\\\" & filename,2 '保存文件,2表示可以覆盖 33 Else 34 Set fso=Server.CreateObject(\"Scripting.FileSystemObject\") 35 IF fso.FileExists(SaveFilePath & \"\\\" & filename)=True Then 36 37 38 39 40 SaveToFile=2 '返回函数值,2表示已经存在同名文件 Exit Function Else objStream2.SaveToFile SaveFilePath & \"\\\" & filename,1 '1表示不可以覆盖 End If 41 End IF '关闭对象 42 objStream1.Close 43 Set objStream1=Nothing 28 / 36 44 objStream2.Close 45 Set objStream2=Nothing 46 SaveToFile=1 '下面返回函数值,1表示正常 47 Else 48 SaveToFile=0 '下面返回函数值,0表示找不到,发生错误 49 End If 50 End Function 2.帖子内容实现部分 要实现帖子内容多样化可以使用UBB码。UBB码上HTML的一个变种,是Ultimate Bulletin Board采用的一种特殊的TAG。为了避免用户无意或者有意使用HTML代码对论坛进行攻击。各种论坛基本上都屏蔽了HTML代码。但是为了使得论坛更加“多姿多彩”,论坛也会相应地开放一些自定义的TAG标签,类似于HTML中的TAG。这种自定义的TAG就是俗称的UBB代码。可以使用免费的UBB编辑器来自动生成UBB代码。 修改和发布帖子差不多,而删除相对简单,这里就不在讨论了。 4.5.2 帖子浏览模块 帖子浏览模块部分最重要的是对数据库的操作,如帖子的分页列表,首先来看帖子的分页是如何实现的,下面是几个和分页浏览有关的属性: 1. AbsolutePage: 当Recordset对象有设置分页时,AbsolutePage会返回目 前的页码。 2. PageCount: 返回Recordset对象的分页总数。 3. PageSize: 当Recordset对象有设置分页时,PageSize为每页的记录条数。 有了这几个属性,在使用for……next循环就可以以分页的方式显示帖子了。具体的程序和版面浏览模块相似,这里就不给出程序了。 4.5.3 帖子搜索模块 该部分的帖子显示和浏览模块的帖子显示基本一致,这里重点讨论ASP如何操作SQL语句,以及SQL语句是如何工作的。下面先来看下搜索条件。 图11 帖子搜索页面 29 / 36 从上图可以看出帖子的搜索条件:首先要选择版面,搜索方式分为标题和作者,搜索时间是附加搜索条件。帖子搜索本质上是有条件的对数据表查找,所以要满足以上条件的搜索应该使用下面的SQL语句: 1 select * from topic_t where \"&kind&\" like '%\"&keyword&\"%' and boardid='\"&boardid&\"' and DateAndTime > '\"&posttime&\"' order by DateAndTime desc 4.5.4 其它功能 1. 帖子评价 对于未注册的用户如果想要吸引他们来到论坛,就需要给他们一个互动的权利,对于每个主题开启一个评价好坏的功能,即使未注册的用户也可以使用。同时,增加注册用户发帖的积极性,使他们获得更多的积分和相应的等级。 2. 论坛收藏 随着论坛的内容逐渐丰富,用户在论坛中查找信息就会变得越来越困难,特别是对于自己喜欢的内容,每次都要去查找,对此我们提供一个收藏夹,用户可以把自己喜欢的东西收藏起来,方便以后查阅。 3. 添加好友 可以将站内的注册用户加为好友,方便查看好友的信息和联系。 以上功能虽然不是论坛的必须功能,但是它让论坛更加人性化,其实现的方法都类似,都是对数据库的读/写操作。 4.6 管理员模块 4.6.1 用户管理 管理员对用户的管理主要包括用户的批量删除和用户授权。 1. 用户的批量删除 实现用户的批量删除,与以往的单个删除不同,主要使用了数组循环: 1 <% if request(\"checkbox\")=\"\" then 2 response.Write(\" 你没选用户! 3 response.Write(\"\") 4 else 5 set rs=server.CreateObject(\"adodb.recordset\") 6 rs.open \"select * from user_t \7 for each i in request(\"checkbox\") 8 exec=\"delete from user_t where userid='\"&i&\"'\" 9 conn.execute(exec) 30 / 36 10 next 11 rs.close 12 set rs=nothing 13 conn.close 14 set conn=nothing 15 response.Write(\" 用户删除成功! 16 response.Write(\"\") 17 end if %> 2. 用户授权 用户授权即指定版主,将用户授予版主的权限首先应该判断用户是否存在,然后在选择相应的版面来作为该版的版主,具体操作是将版面信息表boardid中的master字段更新为指定用户的用户名,其代码与其它写入数据库的代码类似。 4.6.2 版面管理 版面管理包括版面的添加,删除和修改。其具体实现方法均是对父版面信息表area_t和子版面信息表board_t操作。其三者主要不同之处在于SQL语句的不同,添加版面需要使用insert,删除版面需要使用delete,修改版面需要使用update。 4.6.3 帖子管理 管理员对帖子管理包括批量删除帖子和批量移动帖子。而版主对帖子的管理包括删除单个帖子,移动单个帖子,置顶帖子,指定精华帖。批量删除帖子与批量删除用户类似。而批量移动帖子不同之处使用下面的SQL语句: update topic_t set boardid='\"&request(\"boardid\")&\"' where TopicID='\"&i&\"' 4.6.4 数据库备份和恢复 下面是数据备份程序: 1 <% '备份数据库 2 sql=\"backup database bbs to disk='\"&request(\"path\")&\"' with init\" 3 set conn=server.createobject(\"adodb.connection\") conn.open = \"driver={sql server};server=(local);uid=sa;pwd=123456;database=bbs;\" 31 / 36 conn.Execute(sql) 4 on error resume next 5 if err<>0 then 6 response.Write(\" 数据备份失败! 7 8 9 conn.close set conn =nothing response.Write(\"\") 10 else 11 response.Write(\" 数据备份成功! 12 path=request(\"path\") 13 dim objfso,objts'将数据库备份文件地址保存到文件 14 set objfso=server.CreateObject(\"scripting.filesystemobject\") 15 set objts=objfso.opentextfile(server.MapPath(\"path.txt\"),2,true) 16 objts.write(path) 17 objts.close 18 set objts=nothing 19 set objfso=nothing 20 conn.close 21 set conn =nothing 22 response.Write(\"\") 23 end if %> 下面是数据库恢复程序: 1 <% '断开用户到数据库的连接 2 sqla=\"declare hcforeach cursor global for select 'kill '+rtrim(spid) from master.dbo.sysprocesses where dbid=db_id('bbs') exec sp_msforeach_worker '?'\" 3 sqlb=\"restore database bbs from disk='\"&request(\"pathname\")&\"'\" 4 set conn=server.createobject(\"adodb.connection\") conn.open = \"driver={sql server};server=(local);uid=sa;pwd=123456;database=master;\" '数据库在连接时不能恢复,所以要连接到master数据库 5 conn.Execute(sqla) 6 conn.Execute(sqlb) 32 / 36 7 on error resume next 8 if err<>0 then 9 response.Write(\" 数据恢复错误! 10 conn.close 11 set conn=nothing 12 response.Write(\"\") 13 else 14 response.Write(\" 数据恢复成功! 15 conn.close 16 set conn=nothing 17 response.Write(\"\") 18 end if %> 结 论 至此,本论文从设计到实现展示了一个简单的企业BBS系统。从宏观上分析,功能不过于用户管理,发帖,回复及论坛管理等几个最常用的功能。同时,在系统的实现过程中首要的是对需求的分析。然后,是对数据库的设计,只要设计好数据库,就做好了实现系统的基础,同时也方便对系统功能的扩展,在此看来,做一个好的系统首先要设计一个好的数据库。接下来是对各个功能模块的具体实现,其实现的方法都大体类似。总之,从设计到实现这个企业论坛系统,可以学到研究这一类Web系统的通用方法,为以后研究其它Web系统打下基础。 致 谢 本文是在杨书清老师的亲切关怀和悉心指导下完成的。从课题的选择到项目的最终完成,杨书清老师都给予我细心的指导和不懈的支持,他给我提出了很好的建议和设计思路,并提供了大量的资料与信息, 在此,我还要感谢在这次设计中所有给予我关心和帮助的朋友们,正是由于你们的帮助和支持,我才能克服一个一个的困难和疑惑,直至论文的顺利完成。 33 / 36 参考文献 [1]汤代禄,韩建俊.ASP案例开发集锦第二版.北京:电子工业出版社,2008.11。 [2] 邓文渊, 陈惠贞, 陈俊荣. ASP与网络数据库技术[M].北京:中国铁道出版社,2003。 [3] 明日科技. ASP程序开发范例宝典[M].北京:人民邮电出版社,2006。 [4] 顼宇峰,马军. ASP网络编程入门到精通[M].北京:清华大学出版社,2006。 [5] 王恩波, 张露, 刘柄兴. 网络数据库实用教程[M].北京:高等教育出版社,2003。 [6] 郭晶,孙伟娟. ASP网站开发四“酷”全书[M].北京:电子工业出版社,2006。 [7] 方睿,刁仁宏, 吴四九.网络数据库的原理及应用[M].成都:四川大学出版社,2005。 34 / 36 专业班级 设计 题目 姓 名 指导教师初审成绩 评定设计界面程序开发写作完成科研应用内容 选题 设计 代码 文档 规范 情况 能力 价值 评分10分 10分 10分 10分 10分 20分 10分 20分 标准 实际评分 总分数 100分 总分数 100分 总分数 100分 成绩 评阅教师评阅成绩 评定设计界面程序开发写作完成科研应用内容 选题 设计 代码 文档 规范 情况 能力 价值 评分10分 10分 10分 10分 10分 20分 10分 20分 标准 实际评分 评定仪态写作完成科研应用创新答辩语言 内容 仪表 规范 情况 能力 价值 观点 效果 答辩成绩 评分10分 10分 10分 10分 10分 20分 10分 20分 标准 实际评分 指导教师评语: 评语 评阅教师评语: 答辩小组评语: 指导教师 __________ 年 月 日 评审教师 __ 年 月 日 答辩负责人__________ 年 月 日 35 / 36 36 / 36 因篇幅问题不能全部显示,请点此查看更多更全内容