ASP期末课设学习论坛系统.docx
《ASP期末课设学习论坛系统.docx》由会员分享,可在线阅读,更多相关《ASP期末课设学习论坛系统.docx(15页珍藏版)》请在冰豆网上搜索。
ASP期末课设学习论坛系统
华北科技学院计算机系期末大作业
说明书
课程名称网络编程B
学期2010至2011学年第一学期
学生所在系部电信系
年级专业班级
学生姓名学号
任课教师
成绩
计算机系制
《网络编程B》课程期末大作业说明书
2010年12月28日
题目
学习论坛系统
一、需求分析
系统实现了哪些功能,从哪些地方考虑(系统概述)
近年来,随着互联网技术的发展与互联网信息市场的不断完善,网络的功能和网络信息内容发生了急剧的变化。
网络已经成为人们学习生活不可或缺的一部分,在人们获取知识、了解社会方面更是扮演重要角色,尤其对在校大学生,这种角色更加明显。
在这一形势下,网络论坛应运而生,它是人们在线交流的重要媒介,因此现在很多高校都设有校内论坛例如比较流行的BBS。
这些论坛的形式各样,目的也各不相同,因此论坛的内容质量势必影响人们对事实的正确认知,正基于此原因,我特意设计一个在线学习论坛以便大家在网上进行学习和生活的交流,使大家百尺竿头更进一步。
由于时间的紧迫性,设计出一个简单的在线学习论坛系统。
该系统有如下几个功能:
1.浏览
按最后更新时间进行浏览
为了使大家在混乱的大量的主题帖中选出有价值的内容,设计出三种查询的模式:
(1)按时间查询
(2)按主题查询
(3)按作者查询
2.交流
用电子邮件和朋友进行联络
发主题帖
回复帖子
二、数据库设计
数据库如何设计,包含有哪些表,表中的各字段如何设计
数据库包括一个数据表,Content
学习论坛的数据表Content如下图所示
字段名称
字段说明
数据类型
主关键字
ID
文章编号
长整型
是
Subject
文章标题
Char(50)
Sender
张贴者
Char(20)
Email
张贴者E-mail
Char(30)
(允许为空)
Body
张贴文章的内容
Char(255)
SendDate
张贴时间
日期/时间
Parent
回复文章的编号
三、结果及分析
程序运行结果抓图,主要代码及简单分析
一:
建立张贴页面
1设计输入表单
输入表单设计如下:
文章标题:
textboxid="subject"runat="Server"/>
RequiredFieldValidatorid="valid1"
ControlToValidate="subject"runat="Server">(必要栏)
RequiredFieldValidator>
内容:
TextBoxid="Body"textmode="MultiLine"Rows=5
Width="80%"runat="Server"/>
RequiredFieldValidatorid="valid3"
ControlToValidate="body"runat="Server">(必要栏)
RequiredFieldValidator>
RegularExpressionValidatorid="Regular1"Runat="server"
ControlToValidate="Body"
ValidationExpression=".{10,255}">
输入的字符数在~之间!
RegularExpressionValidator>
签下您的大名:
textboxid="Send"runat="Server"/>
RequiredFieldValidatorid="valid2"
ControlToValidate="Send"runat="Server">
嘿嘿,名字不能少哦!
RequiredFieldValidator>
您的邮件地址:
textboxid="Email"runat="Server"/>
RegularExpressionValidatorid="Regular2"Runat="server"
ControlToValidate="Email"
ValidationExpression=".{1,}@.{1,}\..{1,}">
请输入有效的电子邮件地址
RegularExpressionValidator>
Buttonid="sub"text="张贴"
Onclick="sent"Runat="Server"/>
其中文章内容输入栏布置了两个验证控件:
一个控制该控件不能输入空值;另一个控制文章内容在10个字符和255个字符之间。
为了防止用户在恶意灌水,所以不允许少于10个字符;如果多于255个字符,Access2003中的字段将会溢出,所以设置不能多于255个字符。
2将数据存入数据库
单击“张贴”按钮,如果数据通过验证则将数据提交到数据库。
在提交数据之前,先要在数据库中获取当前最大的文章编号,用来生成新加入的文章的编号,具体方法如下所示:
SQLStr="Selectmax(ID)asidFromcontent"
rd=Cmd.ExecuteReader()'执行SQL指令,并将其结果设定给DataReader
IfNotIsDBNull(rd.Read())then
maxid=rd.Item("id")+1
Else
maxid=1
EndIf
首先检测当前数据表中是否有数据,如果没有数据,IsDBNull(rd.Read())返回true,同时将新插入的文章编号设为1;如果有数据,则取出最大的编号,在其上加1,生成新文章的编号。
二:
实现分页显示
1.显示文章内容
下面要对论坛进一步改进使之能显示文字的内容,改进后的显示效果如下图所示。
所用的Tree函数的完整代码如下所示:
Subtree(lasttabAsString)
DimrowidAsInteger'定义记录录号
Dimcontent,img,aux,item,bodyAsString'HTML元素的ID
DimtrAsdataRow
DimtablenameAsString'定义树的表名
Response.Write("")'遍历当前表中的记录
ForEachtrInds.Tables(lasttab).rows
rowid=tr.Item("ID")'将当前记录的子节点生成一张表
tablename="table"&rowid
SQLstr="Select*fromcontent"
SQLstr&="whereParent="&rowid
da=NewOleDbDataAdapter(SQLstr,conn)
da.Fill(ds,tablename)
'检测时候存在子节点,如果存在继续使用递归来生成树,如果不存在,退出递归
Ifds.Tables(tablename).rows.count=0then
'如果当前节点已经是叶节点,显示当前节点,退出递归
Response.Write("
")Response.Write("
") img="img"&rowid item="Item"&rowid Content="content"&rowid body="body"&rowid Response.Write(" ")Response.Write(" | ")Response.Write("hand'>"&tr.Item("subject")&"——"&tr.Item("Sender")&tr.Item("SendDate")&"")
Response.Write("
")
Response.Write("
")response.write("none'>")
Response.Write("")
Response.Write("
| ")Response.Write("
"&tr.Item("body")&" | ")Response.Write("
")
Response.Write("")
Response.Write("
")
'如果不是叶节点,则继续递归显示
Else
content="content"&rowid
img="img"&rowid
aux="Aux"&rowid
body="body"&rowid
item="Item"&rowid
'显示信息头
Response.Write("
")Response.Write("hand'>")
Response.Write("
")
Response.Write("")
Response.Write("hand'>"&tr.Item("subject")&"——"&tr.Item("Sender")&tr.Item("SendDate")&"")
Response.Write("
")
Response.Write("
")response.write("none'>")
Response.Write("")
Response.Write("
| ")Response.Write("
"&tr.Item("body")&" | ")Response.Write("
")
Response.Write("
| ")Response.Write("
"&tr.Item("Email")&">寄信给作者") Response.Write("ID="&Tr.Item("id")&"&subject="&tr.item("subject")&">回复此文 | ")Response.Write("
")
Response.Write("")
Response.Write("")
Response.Write("
")Response.Write("none'>")
Response.Write("none'>")
'将递归深度加深
tree(tablename)
Response.Write("
")
EndIf
next
Response.Write("")
EndSub
三:
实现分页功能
1初始化记录范围
为了实现分页,首先需要知道当前记录的范围,才能决定下一页或上一页的记录范围,因此我采用TextBox控件记录当前的记录范围。
在表单中这两个控件如下布置:
Textboxid=”lastno”visible=falserunat=”server”/>
textboxid=”priorno”visible=falserunat=”server”/>
将这两个TextBox控件的Visible属性设为False,lastno用于记录当前最后一条记录,priorno用于记录当前的第一条记录。
首次浏览论坛内容时需要在Page_Load事件中初始化记录范围,此后则在“上一次”和“下一次”按钮的事件中确定记录范围。
Page_Load事件修改后的完整代码如下:
SubPage_Load(SenderAsObject,eAsEventargs)
'首先建立数据连接
conn=NewOledbConnection()'建立一个oledbConnection对象
'设定连接字符串ConnectionString
conn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;"&_
"DataSource="&Server.MapPath("Discuss.mdb")
'打开连接
conn.Open()
'选出最近的十条记录,按照Id的降序排列
SQLstr="Selecttop10*fromcontent"
SQLstr&="whereparent=0OrderbyIDdesc"
da=NewOleDbDataAdapter(SQLstr,conn)
da.Fill(ds,"head")
'对于一条记录生成一颗树
Tree("head")
conn.close()
Endsub
2实现分页
1.布置分页按钮
要实现分页功能,还需要布置分页按钮“上一页”和“下一页”,代码如下所示:
linkbuttonid="prior"text="上一页"
OnClick="prior_click"runat="Server"/>
linkbuttonid="nxt"text="下一页"
OnClick="next_click"runat="Server"/>
Textboxid="lastno"visible=falserunat="server"/>
textboxid="priorno"visible=falserunat="Server"/>
在“上一页”按钮中触发prior_click函数,在“下一页”按钮中触发next_click函数。
2.添加分页时间
(1)浏览上一页。
首先添加“上一页”按钮事件,所使用的SQL语句如下所示:
'选出最近的十条记录,按照Id的降序排列
SQLstr="Selecttop10*fromcontent"
SQLstr&=”whereparent=0”
SQLstr&=”andID<”&priorno.text
SQLstr&="whereparent=0OrderbyIDdesc"
然后对priorno和lastno两个TextBox控件重新置数,记录上一页中显示主体的范围:
'记录当前的最后一个记录号
lastno.text=ds.Tables("head").rows.Item(0).Item("ID")
'记录当前的第一个记录号
dimcountasinteger
count=ds.Tables("head").rows.count-1
priorno.text=ds.Tables("head").rows.Item(count).Item("ID")
考虑到如果第一页仍然使用Tree函数来生成主题树会出错,所以加入如下判断语句:
ifds.Tables("head").rows.count=0then
Response.Write("已经到了第一页!
")
Else
…
Tree(“head”)
Endif
如果到了第一页,则会显示如图所示的页面。
(2)浏览下一页。
和浏览上一页中的Prior_Click函数一样,生成Next_Click函数。
四:
查询论坛内容
1布置查询表单
在表单中要布置3项查询内容:
按时间查询、按主题查询、按作者查询,此外还需要布置“重新查询和“返回主界面”两个按钮,这两个按钮具体下面再进行介绍。
布置好的查询表单如下图所示:
表单布置代码如下:
linkbuttonid="prior"text="上一页"
OnClick="prior_click"runat="Server"/>
linkbuttonid="nxt"text="下一页"
OnClick="next_click"runat="Server"/>
Textboxid="lastno"visible=falserunat="server"/>
textboxid="priorno"visible=falserunat="Server"/>
panelid="panel1"runat="server">
按时间查询:
TextBoxid="tm1"Runat="Server"/>
~
TextBoxid="tm2"runat="Server"/>
buttonid="tm"text="查询"
OnClick="tm_click"runat="server"/>
按主题查询:
textBoxid="sub1"runat="server"/>
buttonid="sub"onclick="sub_click"text="查询"runat="server"/>
按作者查询:
textBoxid="sd1"runat="server"/>
buttonid="sd"OnClick="sd_Click"text="查询"runat="server"/>
panel>
buttonid="rset"text="重新查询"OnClick="rset_click"runat="server"/>
buttonid="rback"text="返回主界面"OnClick="rback_click"runat="server"/>
在没有进行查询或者查询完毕后要隐藏查询表单,所以将查询表单布置在一个Panel控件中,这样只需要控制Panel的显示或隐藏即可控制查询表单的显示和隐藏了。
执行查询的过程如下:
1.按时间查询
用户在使用学习论坛时,常常需要查询某一段时间内的讨论问题来获取必要的信息,因此到下面几点:
检测时间是否有效。
建立查询的SQL语句。
建立数据库连接。
执行查询和清理现场。
最终设计出按时间查询的tm_Click函数,具体代码在程序中。
2.按主题查询
3.按作者查询
按作者查询比上面两项查询都要复杂一些。
因为不能只查找该作者张贴的主题,还要查找该作者所有回复的文章,所以不能再调用Tree函数来生成讨论树,必须另外书写显示记录的代码。
(1)建立SQL语句。
(2)建立数据连接并执行查询。
(3)显示查询结果。
4退出查询
在查询完毕之后需要退出查询或者继续查询其他数据,这就是“重新”查询和“返回主页面”两个按钮的功能。
1.重新查询
重新查询的主要工作就是清空查询表单和当前页面的内容。
2.返回主页面
单击“返回”主页面按钮将触发Rback_click函数,将会退出,具体代码如下:
'返回主界面
SubRback_click(senderasobject,easeventargs)
retrieve()
'显示上一页和下一页按钮
prior.visible=true
nxt.visible=true
EndSub
四、总结
程序的优点缺点,自己的体会
该程序构成了一个简单的学习论坛系统。
可以方便得供大家进行学习交流。
但还有很多不足:
如没有设置管理员对其中的内容进行筛选等等,总之功能比较简单,只可以适合用来少数人构建的学习论坛系统。
在经过一个多星期的努力以及老师的精心指导,终于成功设计出一个功能完整的在线学习系统。
首先,十分感谢王晓菊老师上课过程中诲人不倦的教导,使得在编写过程之中节约了不少时间和精力,而且激发了不少新的灵感。
其次,在这个理论联系实践的过程中,不仅对所学的知识点有了更加深刻的理解,而且慢慢体会到网络编程的那种快乐,尤其是在辛勤劳动后能够得到令人欣喜的成果,让我感到很充实,很满足。
最后衷心地希望老师身体健康,万事如意。
教师评价
评定项目
A
B
C
D
评定项目
A
B
C
D
算法正确
界面美观,布局合理
程序结构合理
操作熟练
语法、语义正确
解析完整
结果正确
文字流畅
报告规范
题解正确
其他:
评价教师签名:
年月日