ASP期末课设学习论坛系统Word下载.docx
《ASP期末课设学习论坛系统Word下载.docx》由会员分享,可在线阅读,更多相关《ASP期末课设学习论坛系统Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
ID
文章编号
长整型
是
Subject
文章标题
Char(50)
Sender
张贴者
Char(20)
Email
张贴者E-mail
Char(30)
(允许为空)
Body
张贴文章的内容
Char(255)
SendDate
张贴时间
日期/时间
Parent
回复文章的编号
三、结果及分析
程序运行结果抓图,主要代码及简单分析
一:
建立张贴页面
1设计输入表单
输入表单设计如下:
文章标题:
<
asp:
textboxid="
subject"
runat="
Server"
/>
RequiredFieldValidatorid="
valid1"
ControlToValidate="
>
(必要栏)
/asp:
RequiredFieldValidator>
p>
内容:
TextBoxid="
Body"
textmode="
MultiLine"
Rows=5
Width="
80%"
/>
valid3"
body"
RegularExpressionValidatorid="
Regular1"
Runat="
server"
ValidationExpression="
.{10,255}"
输入的字符数在~之间!
RegularExpressionValidator>
签下您的大名:
Send"
valid2"
嘿嘿,名字不能少哦!
您的邮件地址:
Email"
Regular2"
.{1,}@.{1,}\..{1,}"
请输入有效的电子邮件地址
Buttonid="
sub"
text="
张贴"
Onclick="
sent"
其中文章内容输入栏布置了两个验证控件:
一个控制该控件不能输入空值;
另一个控制文章内容在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("
tableborder=0>
"
)'
遍历当前表中的记录
ForEachtrInds.Tables(lasttab).rows
rowid=tr.Item("
ID"
)'
将当前记录的子节点生成一张表
tablename="
table"
&
rowid
SQLstr="
Select*fromcontent"
SQLstr&
="
whereParent="
da=NewOleDbDataAdapter(SQLstr,conn)
da.Fill(ds,tablename)
'
检测时候存在子节点,如果存在继续使用递归来生成树,如果不存在,退出递归
Ifds.Tables(tablename).rows.count=0then
如果当前节点已经是叶节点,显示当前节点,退出递归
tr>
)
td>
img="
img"
item="
Item"
Content="
content"
body="
palign='
right'
imgid="
Img&
"
src='
minus.gif'
WIDTH='
9'
HEIGHT='
/p>
/td>
tdid="
item&
language='
JavaScript'
onMouseUp='
turnout("
body&
);
style='
CURSOR:
hand'
fontface='
楷体'
size='
2'
strong>
tr.Item("
)&
——"
Sender"
SendDate"
/strong>
/font>
/a>
Response.Write("
<
/tr>
response.write("
tdcolspan=2id="
DISPLAY:
none'
)
tableborder=0bgcolor='
grey'
fontsize=1>
/table>
如果不是叶节点,则继续递归显示
Else
content="
aux="
Aux"
显示信息头
tdlanguage='
turnit("
&
Content&
"
Img&
Aux&
plus.gif'
ahref=mailto:
寄信给作者<
ahref=post.aspx?
ID="
Tr.Item("
subject="
tr.item("
回复此文<
将递归深度加深
tree(tablename)
next
/Table>
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("
conn.close()
Endsub
2实现分页
1.布置分页按钮
要实现分页功能,还需要布置分页按钮“上一页”和“下一页”,代码如下所示:
Formrunat="
linkbuttonid="
prior"
上一页"
OnClick="
prior_click"
nxt"
下一页"
next_click"
Textboxid="
lastno"
visible=falserunat="
priorno"
/Form>
在“上一页”按钮中触发prior_click函数,在“下一页”按钮中触发next_click函数。
2.添加分页时间
(1)浏览上一页。
首先添加“上一页”按钮事件,所使用的SQL语句如下所示:
=”whereparent=0”
=”andID<
”&
priorno.text
然后对priorno和lastno两个TextBox控件重新置数,记录上一页中显示主体的范围:
记录当前的最后一个记录号
lastno.text=ds.Tables("
).rows.Item(0).Item("
记录当前的第一个记录号
dimcountasinteger
count=ds.Tables("
).rows.count-1
priorno.text=ds.Tables("
).rows.Item(count).Item("
考虑到如果第一页仍然使用Tree函数来生成主题树会出错,所以加入如下判断语句:
ifds.Tables("
).rows.count=0then
Response.Write("
已经到了第一页!
Else
…
Tree(“head”)
Endif
如果到了第一页,则会显示如图所示的页面。
(2)浏览下一页。
和浏览上一页中的Prior_Click函数一样,生成Next_Click函数。
四:
查询论坛内容
1布置查询表单
在表单中要布置3项查询内容:
按时间查询、按主题查询、按作者查询,此外还需要布置“重新查询和“返回主界面”两个按钮,这两个按钮具体下面再进行介绍。
布置好的查询表单如下图所示:
表单布置代码如下:
panelid="
panel1"
按时间查询:
tm1"
~
tm2"
buttonid="
tm"
查询"
tm_click"
按主题查询:
textBoxid="
sub1"
onclick="
sub_click"
按作者查询:
sd1"
sd"
sd_Click"
panel>
rset"
重新查询"
rset_click"
rback"
返回主界面"
rback_click"
在没有进行查询或者查询完毕后要隐藏查询表单,所以将查询表单布置在一个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
四、总结
程序的优点缺点,自己的体会
该程序构成了一个简单的学习论坛系统。
可以方便得供大家进行学习交流。
但还有很多不足:
如没有设置管理员对其中的内容进行筛选等等,总之功能比较简单,只可以适合用来少数人构建的学习论坛系统。
在经过一个多星期的努力以及老师的精心指导,终于成功设计出一个功能完整的在线学习系统。
首先,十分感谢王晓菊老师上课过程中诲人不倦的教导,使得在编写过程之中节约了不少时间和精力,而且激发了不少新的灵感。
其次,在这个理论联系实践的过程中,不仅对所学的知识点有了更加深刻的理解,而且慢慢体会到网络编程的那种快乐,尤其是在辛勤劳动后能够得到令人欣喜的成果,让我感到很充实,很满足。
最后衷心地希望老师身体健康,万事如意。
教师评价
评定项目
A
B
C
D
算法正确
界面美观,布局合理
程序结构合理
操作熟练
语法、语义正确
解析完整
结果正确
文字流畅
报告规范
题解正确
其他:
评价教师签名:
年月日