河南城建学院
课程设计报告书
专 业:信息管理与信息系统
课程设计名称:《web技术设计与开发》
题 目:精品课程之在线交流
班 级:
设 计 者:
同 组 人 员:
指 导 老 师:
完 成 时 间:20##-6-17
摘要
为贯彻落实党的十六大精神,实践"三个代表"重要思想,切实推进教育创新,深化教学改革,促进现代信息技术在教学中的应用,共享优质教学资源,进一步促进教授上讲台,全面提高教育教学质量,造就数以千万计的专门人才和一大批拔尖创新人才,提升我国高等教育的综合实力和国际竞争能力,教育部决定在全国高等学校(包括高职高专院校)中启动高等学校教学质量与教学改革工程精品课程建设工作(以下简称精品课程建设)。现将有关事宜通知如下:
【关键词】:精品课程 科研与教学 学习
目录
一、设计内容和要求... 3
1.1 设计内容... 3
1.2 要求... 3
二、功能设计... 3
2.1 功能概要... 3
2.2 功能详细设计... 4
三、数据库设计... 4
3.1引入背景... 4
3.2数据库需求分析... 4
3.3数据库逻辑结构设计... 5
3.4数据库各表之间联系... 7
3.5数据库各表之间联系... 9
四、代码编写... 9
4.1 数据库连接... 9
4.2管理员登录... 10
4.3用户发帖... 11
4.4管理员删除帖子功能... 12
4.5 管理员回复功能... 13
4.6验证码代码... 14
4.7留言板浏览代码... 15
五、测试情况... 18
5.1 首页... 18
5.2 用户发帖界面... 19
5.3管理员登陆界面... 20
5.4管理员回复界面... 21
5.5管理员删除界面... 21
六、总结... 22
七、参考文献... 22
一、设计内容和要求
1.1 设计内容
网站功能:
该选题主要功能为精品课程的子模块---辅导答疑:以实现跟浏览者的一种互动,对浏览者的疑问予以交流解答。具体功能要求如下:
l 实现管理员登陆和普通用户的登陆和注册功能,进行信息修改和密码维护。
l 在进行登陆时防止网页被恶意刷新提交记录。即需要有一个验证码的功能!
l 实现用户留言功能。用户在页面上可以填写咨询的主题,邮件和咨询或意见的内容。
l 在填写咨询内容的页面上能有一个列表页面展示以前咨询者的提问。
l 用户可以查询浏览相关外网新闻。
后台管理:
l 管理员在后台对这些咨询的记录有管理权限,可以进行删除。
l 管理员在后台能对所提交的问题,进行回答,并将回答后的内容展示在页面上。
l 发帖可以进行分类管理。
1.2 要求
基本要求:
1) 要求利用asp.net的编程思想及组件开发来完成系统的设计。
2) 前台界面的设计以Dreamweaver等工具实现,后台逻辑功能代码采用C#编写。
3) 体现可视化编程基本东西,如系统自带菜单、工具栏、转太烂以及一些常用的高级控件。
4) 利用后台数据库的设计,实现数据的导入导出。
5) 进一步掌握在集成环境(IDE)下如何调试程序,及开发项目的安装部署。
二、功能设计
2.1 功能概要
在精品课程之在线交流网站上实现浏览者的发帖,管理员跟浏览者的一种互动,对浏览者的疑问予以交流解答。
l 前台显示留言信息
l 访客发布留言
l 管理员登陆
l 管理员对留言板的管理-----删除留言、回复留言
l 显示修改后的提示信息
2.2 功能详细设计
l 前台显示留言信息
1. 查询数据库留言信息表后、经过DataLists 格式化输出所有留言信息
2. 再跟DataLists添加数据源前对输出的信息进行分页显示
l 访客发布留言
1. 访客浏览留言信息后可发布自己的留言信息
l 管理员登陆
1. 要对留言信息进行删除、回复首先要进行登陆
l 管理员留言板的管理----删除留言、回复留言
1. 获得管理员权限后方可对留言信息回复和删除的管理
l 显示修改后的提示信息
1. 访客发布留言成功后,提示信息发布成功与否,方可返回首页进行查看
2. 管理员删除、回复留言后,提示信息操作成功与否, 方可返回首页进行查看
三、数据库设计
3.1引入背景
精品课程之在线交流是一个数据库应用系统,将提交以及管理员的所有信息都保存在数据库中。数据库结构设计是精品课程之在线交流数据库应用系统开发过程中一个非常重要的环节,设计的好坏将直接对所开发的人事管理信息系统的效率以及实现的效果产生影响。好的数据库结构设计会减少数据库的存储量,数据的完整性和一致性比较高,系统具有较快的响应速度,简化基于此数据库的应用程序的实现等等。数据库结构设计主要就是要设计好数据库中各个表的结构,包括信息保存在哪些表格中、各个表的结构如何以及各个表之间的关系。由于数据库设计的重要性,人们提出了许多数据库结构设计的技术。
3.2数据库需求分析
数据库需求分析是数据库结构设计的第一个阶段,也是非常重要的一个阶段。在这个阶段主要工作是收集基本数据以及数据处理的流程,为以后进一步设计一打下基础。需求分析主要解决两个问题::
. ● 内容要求。调查应用系统用户所需要操作的数据,决定在数据库中存储什么数据。
● 处理要求。调查应用系统用户要求对数据库进行什么样的处理,理清数据库中各种数据之间的关系。
在数据库需求分析后,得到一个数据字典文档,包括3方面内容。
●.数据项。包括名称、含义、类型、取值范围、长度以及和其他数据项之间的逻辑关系。
●.数据结构。若干个数据项的有意义的集合,包括名称、含义以及组成数据结构的数据项。
●.数据流。指数据中数据的处理过程,包括输入、处理和输出。
3.3数据库逻辑结构设计
概念结构是独立于实际数据模型的信息结构,必须将其转化为逻辑结构后才能进行数据库应用的设计。也就是要将概念上的结构转化为BP数据库系统所支持的实际数据模型。
精品课程之在线交流数据库中各个表格的设计结果如下面的四个表所示。每个表表示数据库中的一个表。
post表E-R图
Reply表E-R图
adminInfo表E-R图
各个实体的联系如下:
3.4数据库各表之间联系
用户留言信息表设计
管理员登陆信息表设计及详细信息
发帖表设计及初始值内容
回复表设计及初始内容
3.5数据库各表之间联系
四、代码编写
4.1 数据库连接
连接数据库:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
/// <summary>
/// DB 的摘要说明
/// </summary>
public class DB
{ public DB()
{ //
// TODO: 在此处添加构造函数逻辑
//
}
public static string Num;
public static SqlConnection getConnection()
{ return new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); }
}
<configuration>
<appSettings/>
<connectionStrings>
<add name="ConnectionString" connectionString="Data Source=.;Initial Catalog=bookDB;Integrated Security=True"/>
</connectionStrings>
4.2管理员登录
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class CheckLogin : System.Web.UI.Page
{ protected void Page_Load(object sender, EventArgs e)
{ if (!Page.IsPostBack)
{ }
}
protected void Button1_Click(object sender, EventArgs e)
{ string userName = this.TextBox1.Text;
string userPwd = this.TextBox2.Text;
SqlConnection conn = DB.getConnection();
SqlCommand cmd = new SqlCommand("select count(*) from dbo.adminInfo where userName = '" + userName + "' and userPwd = '" + userPwd + "'", conn);
conn.Open();
int count = (int)cmd.ExecuteScalar();
conn.Close();
if (count > 0)
{ Session["Admin"] = userName;
Response.Redirect("ShowInfo.aspx?info=" + Server.HtmlEncode("欢迎进入!!") + "");
}
else
{ Response.Redirect("ShowInfo.aspx?info="+ Server.HtmlEncode("对不起!用户名或者密码错误!!请确认后重新登陆!")+""); } }
protected void Button2_Click(object sender, EventArgs e)
{ this.TextBox1.Text = "";
this.TextBox2.Text = "";
this.TextBox1.Focus(); }
4.3用户发帖
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class Post : System.Web.UI.Page
{ protected void Page_Load(object sender, EventArgs e)
{ if (!Page.IsPostBack)
{ }
}
protected void Button1_Click(object sender, EventArgs e)
{ string userName = this.TextBox1.Text;
string Sex = null;
string imageAddress = null;
if (this.RadioButton1.Checked == true)
{ Sex = "男";
imageAddress = "boy.gif";
}
else
{ Sex = "女";
imageAddress = "girl.gif";
}
string QQ = this.TextBox2.Text;
string Email = this.TextBox3.Text;
string Content = this.TextBox4.Text;
SqlConnection conn = DB.getConnection();
SqlCommand cmd = new SqlCommand("insert into guestInfo(userName,Sex,QQ,Email,Content,ImageAddress) values('" + userName + "','" + Sex + "','" + QQ + "','" + Email + "','" + Content + "','" + imageAddress + "')", conn);
conn.Open();
int count = cmd.ExecuteNonQuery();
conn.Close();
if (count > 0)
{ Response.Redirect("ShowInfo.aspx?info=" + Server.UrlDecode("发布成功!!!") + "");
}
else
{ Response.Redirect("ShowInfo.aspx?info=" + Server.UrlDecode("发布失败!!!") + "");
} }
protected void Button2_Click(object sender, EventArgs e)
{ this.TextBox1.Text = "";
this.RadioButton1.Checked = true;
this.TextBox2.Text = "";
this.TextBox3.Text = "";
this.TextBox4.Text = "";
this.TextBox1.Focus(); } }
4.4管理员删除帖子功能
//删除业务处理
if (e.CommandName == "del")
{ if (Session["Admin"] == null)
{ Response.Redirect("ShowInfo.aspx?info="+Server.HtmlEncode("对不起!只有管理员才有此权限!如果你是管理员请登陆!!")+"");
}
else
{ int ID = Convert.ToInt32(e.CommandArgument);
//Response.Write("<script>alert('"+ID+"')</script>");
SqlConnection conn = DB.getConnection();
SqlCommand cmd = new SqlCommand("delete from guestInfo where ID = " + ID + "", conn);
conn.Open();
int count = cmd.ExecuteNonQuery();
conn.Close();
if (count > 0)
{ Response.Write("<script>alert('删除成功!!')</script>");
this.DandData(); } }
protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
{ //确认是否删除,友好性
LinkButton lbtdel = e.Item.FindControl("lbtdel") as LinkButton;
if (lbtdel != null)
{ lbtdel.Attributes.Add("onclick", "return confirm('你确认删除该条记录!')"); }
}
4.5 管理员回复功能
//回帖业务处理
if (e.CommandName == "Reply")
{ int ID = Convert.ToInt32(e.CommandArgument);
if (Session["Admin"] == null)
{ Response.Redirect("ShowInfo.aspx?info=" + Server.HtmlEncode("对不起!只有管理员才有此权限!如果你是管理员请登陆!!") + "");
}
else
{ Response.Write("<script>alert('" + ID + "')</script>");
Response.Redirect("Reply.aspx?ID=" + Server.HtmlEncode(ID.ToString()) + "");
} }
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class Post : System.Web.UI.Page
{ protected void Page_Load(object sender, EventArgs e)
{ if (!Page.IsPostBack)
{ }
}
protected void btnSumit_Click(object sender, EventArgs e)
{ string ID = Request.QueryString["ID"];
//Response.Write("<script>alert('" + ID + "')</script>");
SqlConnection conn = DB.getConnection();
SqlCommand cmd = new SqlCommand("update dbo.guestInfo set Reply = '" + this.txtContent.Text + "' where ID = " + int.Parse(ID) + "", conn);
conn.Open();
int count = cmd.ExecuteNonQuery();
conn.Close();
if (count > 0)
{ //Response.Write("<script>alert('回复成功!!')</script>");
//Page.ClientScript.RegisterStartupScript(this.GetType(), "StartUp", "<script>alert('回复成功!!')</script>");
Response.Redirect("ShowInfo.aspx?info=" + Server.HtmlEncode("回复成功!!") + "");
}
else
{ Response.Redirect("ShowInfo.aspx?info=" + Server.HtmlEncode("回复失败!!") + "");
} } }
4.6验证码代码
protected void Page_Load(object sender, EventArgs e)
{ // 创建一个包含随机内容的验证码文本
System.Random rand = new Random();
int len = rand.Next(4 , 6 );
char[] chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
System.Text.StringBuilder myStr = new System.Text.StringBuilder();
for( int iCount = 0 ; iCount < len ; iCount ++ )
{ myStr.Append( chars[ rand.Next( chars.Length )]); }
string text = myStr.ToString();
// 保存验证码到 session 中以便其他模块使用
this.Session["checkcode"] = text ;
Size ImageSize = Size.Empty ;
Font myFont = new Font("MS Sans Serif" , 20 );
// 计算验证码图片大小
using( Bitmap bmp = new Bitmap( 10 , 10 ))
{ using( Graphics g = Graphics.FromImage( bmp ))
{ SizeF size = g.MeasureString( text , myFont , 10000 );
ImageSize.Width = ( int ) size.Width + 8 ;
ImageSize.Height = ( int ) size.Height + 8 ; } }
// 创建验证码图片
using( Bitmap bmp = new Bitmap( ImageSize.Width , ImageSize.Height ))
{ // 绘制验证码文本
using( Graphics g = Graphics.FromImage( bmp ))
{ g.Clear( Color.White );
using( StringFormat f = new StringFormat())
{ f.Alignment = StringAlignment.Near ;
f.LineAlignment = StringAlignment.Center ;
f.FormatFlags = StringFormatFlags.NoWrap ;
g.DrawString( text , myFont , Brushes.Black , new RectangleF( 0 , 0 , ImageSize.Width , ImageSize.Height ), f );
}//using
}//using
// 制造噪声 杂点面积占图片面积的 30%
int num = ImageSize.Width * ImageSize.Height * 30 / 100 ;
for( int iCount = 0 ; iCount < num ; iCount ++ )
{ // 在随机的位置使用随机的颜色设置图片的像素
int x = rand.Next( ImageSize.Width );
int y = rand.Next( ImageSize.Height );
int r = rand.Next( 255 );
int g = rand.Next( 255 );
int b = rand.Next( 255 );
Color c = Color.FromArgb( r , g , b );
bmp.SetPixel( x , y , c );
}//for // 输出图片
System.IO.MemoryStream ms = new System.IO.MemoryStream();
bmp.Save( ms , System.Drawing.Imaging.ImageFormat.Png );
this.Response.ContentType = "image/png";
ms.WriteTo( this.Response.OutputStream );
ms.Close();
}//using
myFont.Dispose();
}
4.7留言板浏览代码
//为下拉列表添加选择项
private void getListItem()
{ for (int i = 0; i < Convert.ToInt32(DB.Num); i++)
{ this.DropDownList1.Items.Add(Convert.ToString(Convert.ToInt32(i) + 1)); } }
private void DandData()
{ this.DropDownList1.Items.Clear();
this.getListItem(); //向下拉列表中添加分页数
int currPage = Convert.ToInt32(this.Label1.Text);
SqlConnection conn = DB.getConnection();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand("select * from guestInfo order by ID desc", conn);
DataSet ds = new DataSet();
da.Fill(ds, "guestInfo");
PagedDataSource pds = new PagedDataSource(); //对用于分页的类的引用
pds.DataSource = ds.Tables["guestInfo"].DefaultView;//设置数据源(DataSet类型)
pds.AllowPaging = true;
pds.PageSize = 3; //指定每页显示几条记录
pds.CurrentPageIndex = currPage - 1; //获取当前页索引后转到索引页
if (currPage == 1)
{ this.Button1.Enabled = false;
this.Button2.Enabled = false; }
else
{ this.Button1.Enabled = true;
this.Button2.Enabled = true; }
if (currPage == pds.PageCount)
{ this.Button4.Enabled = false;
this.Button3.Enabled = false;
}
else
{ this.Button4.Enabled = true;
this.Button3.Enabled = true;
}
DB.Num = Convert.ToString(pds.PageCount);
conn.Open();
SqlCommand cmd = new SqlCommand("select count(*) from guestInfo", conn);
this.Label2.Text = "留言总记录数" + Convert.ToString((int)cmd.ExecuteScalar()) + "条";
conn.Close();
this.DataList1.DataSource = pds;
this.DataList1.DataBind();
}
//单击上一页按钮事件
protected void Button2_Click(object sender, EventArgs e)
{ this.Label1.Text = Convert.ToString(Convert.ToInt32(this.Label1.Text) - 1);
this.DandData();
this.DropDownList1.Text = this.Label1.Text;
}
//单击下一页按钮事件
protected void Button3_Click(object sender, EventArgs e)
{ this.Label1.Text = Convert.ToString(Convert.ToInt32(this.Label1.Text) + 1);
this.DandData();
this.DropDownList1.Text = this.Label1.Text; }
//单击首页按钮事件
protected void Button1_Click(object sender, EventArgs e)
{ this.Label1.Text = "1";
this.DandData();
this.DropDownList1.Text = this.Label1.Text; }
//单击尾页按钮事件
protected void Button4_Click(object sender, EventArgs e)
{ this.Label1.Text = DB.Num;
this.DandData();
this.DropDownList1.Text = this.Label1.Text; }
//下拉列表选中后转到指定的页
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{ this.Label1.Text = this.DropDownList1.SelectedValue.ToString();
this.DandData();
}
protected void DataList1_SelectedIndexChanged(object sender, EventArgs e)
{ }
五、测试情况
5.1 首页
5.2 用户发帖界面
5.3管理员登陆界面
5.4管理员回复界面
5.5管理员删除界面
六、总结
这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。其次,这次课程设计让我充分认识到团队合作的重要性,只有分工协作才能保证整个项目的有条不絮。另外在课程设计的过程中,当我们碰到不明白的问题时,指导老师总是耐心的讲解,给我们的设计以极大的帮助,使我们获益匪浅。因此非常感谢老师的教导。通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。我觉得作为一名软件
工程专业的学生,这次课程设计是很有意义的。更重要的是如何把自己平时所学的东西应用到实际中。虽然自己对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着这一个多礼拜的“学习”,在小组同学的帮助和讲解下,渐渐对这门课逐渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。
所以我认为这次的课程设计意义很深,和其他2位同学的共同学习﹑配合﹑努力的过程也很愉快,另外还要感谢各位老师和同学的耐心辅导。
七、参考文献
1、闫洪亮 ASP.NET程序设计 上海交通大学出版社 2008
2、Chris Payne ASP.NET从入门到精通 北京人民邮电出版社 2002
3、赫刚 ASP.NET2.0开发指南 北京人民邮电出版社 2006
4、林昱翔 ASP.NET网站开发实战 北京人民邮电出版社 2007
5、冯方 ASP.NET2.0上级练习与提高 北京清华大学出版社 2007
6、李应伟 ASP.NET数据库高级教程 北京清华大学出版社 2004