网页设计综合课程设计实验报告格式.docx
网页设计综合课程设计实验报告格式 课程设计报告 题 目 在线投票系统 课 程 名 称 网页设计综合课程设计 院 部 名 称 信息技术学院 专 业 计算机科学与技术 班 级 10级计算机科学与技术(特) 学 生 姓 名 黄娟娟 学 号 1005202216 课程设计地点 B407 课程设计学时 20 指 导 教 师 周 秀 娥 金陵科技学院教务处制 成绩 一、课程设计目的 本课程设计是通过利用 进行互动媒体学习社区的结构设计、调试、连接、巩固,加深并扩大所学到的理论知识,培养基本理论分析,解决实际问题的能力,逐步掌握信息系统的设计和调试的基本步骤,同时培养严肃认真、细致踏实、刻苦砖研、有所创造、实事求是的科学作风。 二、课程设计要求 本课程设计以使用 技术和Access数据库系统,共40学时。要求先进行系统分析,对问题进行模块划分,进行总体设计,画出各种模块流程图;然后进行详细设计,采用上机操作方法;最后编写系统的使用说明及课程设计报告书。 三、课程设计设备 奔腾II以上计算机,装有Microsoft Visual Studio 2022 及Access2022中文版软件四、课程设计原理、方法 上机操作。 五、课程设计步骤 实例说明 目前,Internet上的很多网站都具备网上调查功能,为了使在线投票网站制作得更精致,通常情况下,在显示投票结果时将采用百分比形式,如果网站的调查结果以饼状图的方式和表格的形式显示,则会使网站更具直观性。另外,本例还限制每个用户的投票次数(即每个用户只能对系统中的一个主题进行一次投票)。本实例实现的具体功能如下:1添加投票项目 2管理投票项目 3对项目进行投票 4查看投票结果 程序运行结果如图下面所示。 技术要点 实现在线投票系统主要涉及两大功能:一是防止用户对同一主题重复投票,二是以图形的方式显示投票的结果。下面将详细介绍这两个功能的具体实现。 (1)防止用户重复投票 在线投票系统中最重要的一个功能就是禁止用户对某一投票主题进行重复投票,即一个 用户只能对一个主题投票一次,投票后将不能继续投票。实现这一功能通常有两种方法:一是当用户进行投票时,系统首先获取该用户的本地IP地址,然后将它与数据库中存在的IP 地址比较,如果能检索出相同的IP地址,就给用户弹出错误信息,如果没有则会完成用户投票执行票数增加的操作,并将该用户的本地IP地址存入数据库;另一种方法是使用Cookie 对象确认用户的行为。 本例中采用的是第二种方法。由于系统中存在多个投票主题,为了区别各个Cookie项,可憎使用每个主题的ID作为Cookie的值。例如,用户为ID为1的投票主题时,则这个用户的Cookies中会多一个新项(“Voteltem”,“1”)。实现这一功能的代码如下:HttpCookie makecookie=new HttpCookie(”Vote”+M_Str_votelD);/制造cookie makecookie.Values.Add(”Voteltem”,readcookie.Values“Voteltem”+”); 在用户投票之前对该用户的Cookie进行判断。首先读出Cookie的值,然后对该值进行判断。如果读出的Cookie值为null,则表示该用户从未使用过该投票系统,那么就对新创建的Cookie对象添加新值,并设置过期时间。如果该用户已经使用过该投票系统,就判断该用户是否对该主题投过票,若对该主题投过票,就给出错误提示并不执行投票操作,否则设置Cookie对象的值。代码如下: /投票防作弊 HttpCookie makecookie=new HttpCookie(”Vote”+M_Str_votelD);/制造cookie HttpCookie readcookie=Request.Cookies(”Vote”+M_Str_votelD);/读出cookie if(readcookie=null)/从未投过票 makecookie.Values.Add(”Voteltem”,”);/设置其值 makecookie.Expires=DateTime.MaxValue;/设置过期时间 else/已经投过票 string P_Str_Alllten=readcookie.Values“Voteltem”.ToString();/读取已投票的项 if (P_Str_Allltem.lndexOf(”=-1)/未对该主题投过票 makecookie.Values.Add (”Voteltem”,readcookie.Values“Voteltem”+”); else/已对该主题投过票 Response.Write(”); return; (2)图形方式显示投票结果 以图形方式显示投票结果更加直观、形象,是投票系统人性化的表现。本实例以数据库中检索出的数据为依据,以饼状图形显示投票结果。在绘制图形时,按投票的选项将饼形图划分成相应的几部分,通过投票选项的票数计算出相应选项在饼状图中所分配的角度数据,然后利用Graphics类中的FillPie方法完成图形绘制。Fillpie方法的语法格式如下:FillPie(Brush brush,float x,float y,float width,float height,float startAngle,float sweepAngle) 参数含义如下。 (1)brush:确定填充特性的Brush . (2)x:边框左上角的x坐标,该边框定义扇形区所属的椭圆。 (3)y:边框左上角的y坐标,该边框定义扇形区所属的椭圆。 (4)width:边框的宽度,该边框定义扇形区所属的椭圆。 (5)heigth:边框的高度,该边框定义扇形区所属的椭圆。 (6)startAngle:从x轴沿顺时针方向旋转到扇形区第一个边所测得的角度(以度为单位)。 (7)sweepAngle:从startAngle参数沿顺时针方向旋转到扇形区第二个边所测得的角度(以度为单位)。 绘制完成后,利用Bitmap类的Save方法将图形输出到页面中。Save方法的语法格式如下: public void Save(Stream stream,lmageFormat format) 参数含义如下。 (1)stream:将在其中保存图像的Stream。 (2)format:指定保存的图像的格式。 显示投票结果的饼形图是由ResuLtImage.aspx页生成的,在该页的页面加载事件中接收页面间传值,并调用生成饼图的方法。代码如下: Protected void Page_Load(object sender,EventArgs e) string P_Str_votelD=Request“votelD”; string P_Str_title=Server.UrlDecode(Request“title”); Img(P_Str_votelD,P_Str_title); 生成饼图的方法具有两个string类型的参数P_Str_votelD和P_Str_title,分别为表示投票主题的lD和名称。代码如下: P ublic void img(string P_Str_votelD,string P_Str_title) #Region dataSetmyds1=DB.reDs("select*from tb_Voteltem where votelD=”+P_Str_votslD); /计算总票数 DataSet myds2=DB.reDs(“select sun(vote Total)as total FROM tb_Voteltem where votelD=”+P_Str_votelD); int P_lnt_sum=Convert.Tolnt32(myds2.Tables0.Rows00.ToString(); int P_lnt_ltemContent=myds1.Tables0.Rows.Count; /获取该投票主题的选项个数 stringP_Str_voteContent=new stringP_lnt_ltemCount; /存储每个选项的投票名称 stringP_Str_voteTotal=new stringP_lnt_ltemCount; /存储每个选项的投票数 int P_lnt_val=0;/变量,用于设置数组的下标 foreach(DataRow dr in myds1.Tables0.Rows) P_Str_voteContentP_lnt_val=dr2.ToString(); /获取每个选项的投票名称 P_Str_voteTotalP_lnt_val=dr3.ToString(); /获取每个选项的投票数 P_lnt_val+; Bitmap bitmap=new Bitmap(600,800); Graphics graphics=Graphics.Fromlmage(bitmap); Try Graphics.Clear(Color.White); Pen pen1=new Pen(Color.Red); Brush brush=new BrushP_lnt_ltemCount+1; Brush brush1=new SolidBrush(Color.White); For(int i=0;ialert(“”+ex.Message+”);”); MemoryStream ms=new MemoryStream(); Bitmap.Save(ms,System.Drawing.lmaging.lmageFormat.Gif); Response.ClearContent(); Response.ContentType=”image/Gif”; Response.BinaryWrite(ms.ToArray(); Graphics.Dispose(); #endregion RandomNum方法用于生成一个小于255的非负随机数,利用这个随机数来生成Brush对象的填充色。代码如下: Public int RandomNum(int i) /产生0255之间的随机数 Random rnd=new Random(i*unchecked(int)Date Time.Now.Ticks);/初始化一个Random实例 Int rndNum=rnd.Next(255); /返回小于255的非负随机数 Return rndNum; 开发过程 一、数据库设计 本实例采用SQL Server 2022数据库系统,在该系统中新建一个数据库并将其命名为db_Vote。创建投票项信息表(tb_Vote),用于保存投票项的基本信息,表结构如表下面所示。 所示。 由于Web.config文件对于访问站点的用户来说是不可见的,也是不可访问的。所以为了系统数据的安全和易操作,可以在配置文件(Web.config)中配置一些参数,本例将在Web.config文件中配置数据库连接字符串。代码如下: 三、公共类编号 在项目开发中,良好的类设计能够使系统结构更加清晰,并且可以加强代码的重用性和易维护性。在本例中也建立了一个公共类DB.cs,用来执行各种数据库操作及公共方法。 公共类DB.cs中包含3个方法,分别为GetCon方法、sqlEx方法和reDs方法,它们的功能说明及设计如下。 (1)GetCon()方法 GetCon方法主要用来连接数据库,使用ConfigurationManager对象的AppSettings属性值获取配置节中连接数据库的字符串实例化SqlConnection对象,并返回该对象。代码如下: / /配置连接字符串 / /返回SplConnection对象 Public static SqlConnection GetCon() Return new SqlConnection(ConfigurationManager.AppSettings“GetCon”;/配置连接字符串 (2)sqlEx(string cmdstr)方法 sqlEx方法主要使用SqlCommand对象执行数据库操作,如添加、修改、删除等,它包括一个string字符型参数,用来接收具体执行的SQL语句。执行该方法后,成功返回1,失败返回0。代码如下: / / 执行SQL语句 / / 用来执行的SQL语句 / 返回是否成功,成功返回True,否则返回False public static bool ExSql(string P_str_cmdtxt) SqlConnection con = DB.GetCon();/连接数据库 con.Open();/打开连接 SqlCommand cmd = new SqlCommand(P_str_cmdtxt, con); try cmd.ExecuteNonQuery();/执行SQL 语句并返回受影响的行数 return true; catch (Exception e) return false; finally con.Dispose();/释放连接对象资源 (3)reDs(string cmdstr)方法 reDs方法主要使用SqlDataAdapter对象的Fill()方法填充DataSet数据集,它包括一个string字符型参数,用来接收具体查询的SQL语句。执行该方法后,将返回保存查询结果的DataSet对象。代码如下: / / 返回DataSet结果集 / / 用来查询的SQL语句 / 结果集 public static DataSet reDs(string P_str_cmdtxt) SqlConnection con = DB.GetCon();/连接上数据库 SqlDataAdapter da = new SqlDataAdapter(P_str_cmdtxt, con); DataSet ds = new DataSet(); da.Fill(ds); return ds;/返回DataSet对象 四、模块设计说明 1.系统主页实现过程 系统主页面(Default.aspx)实现了系统导航功能,是整个应用程序的起始页。该页运行结果如图下面所示。 实现系统主页的步骤如下: (1)界面设计 在该页面添加3个ImageButton控件,具体属性设置如表下面所示。 控件类型控件名称主要属性设置用途 标准 /ImageButton控件 imgbtnAd d ImageUrl属性设置为 “/Image/主页切/主页按钮 添加投票项.ipg” 跳转到添加 投票项页面 imgbtnAl l ImageUrl属性设置为 “/Image/主页切/主页按钮 所有投票.ipg” 跳转到所有 投票页面imgbtnMa ImageUrl属性设置为跳转到投票 nage “/Image/主页切/主页按钮 项管理页面 投票项管理.ipg” (2)跳转到其他页面功能的实现 页面之间的跳转功能是通过Response对象的Redirect方法实现的。当用户单击、按钮时,分别将页面跳转到添加投票项页面AddVote.aspx、所有投票页面AllVote.aspx、投票项管理页ManageVote.aspx。代码如下:protected void imgbtnAdd_Click(object sender, ImageClickEventArgs e) Response.Redirect("/addVote.aspx");/跳转到添加投票页 protected void imgbtnAll_Click(object sender, ImageClickEventArgs e) Response.Redirect("/AllVote.aspx");/跳转到所有投票页 protected void imgbtnManage_Click(object sender, ImageClickEventArgs e) Response.Redirect("/ManageVote.aspx");/跳转到投票项管理页 2添加投票项页面实现过程 数据表:tb_Vote、tb_VoteItem 技术:数据库操作 添加投票项页面(AddVote.aspx)主要实现添加投票主题以及添加或删除投票选项的功能。在页面初始化时,只显示添加投票标题。当用户添加投票标题后,才显示添加投票选项面板,用户可以添加或删除该主题的投票选项,可以单击按钮结束投票选项的编辑。单击按钮,跳转到系统主页面。页面的运行结果如图下面所示。 实现添加投票项页面的步骤如下: (1)界面设计 在该页面添加2个TextBox控件,2个Button控件、2个LinkButton控件、2个RequiredFieldValidator控件、1个ListBox控件和3个ImageButton控件,具体属性设置 控件类型控件名称主要属性设置用 途标准/TextBox控件txtVoteTitle 输 入投票 的标题 txtItem 输 (2)初始化页面 在页面初始化时,首先定义一个静态的string类型的变量,用于存储投票主题的编号,代码如下: public static string M_Str_voteID = null;/投票主题的编号 然后,创建一个set方法用于设置页面中控件的状态,代码如下: #region public void set(bool P_Bl_value) txtTitle.Enabled = P_Bl_value;/输入标题的文本框是否可用 RequiredFieldValidator1.Enabled = P_Bl_value;/验证标题文本框的验证控件是否启用 imgbtnAdd.Enabled = P_Bl_value;/添加按钮是否可用 panelItem.Visible = !P_Bl_value;/Panel控件是否显示 RequiredFieldValidator2.Enabled = !P_Bl_value;/验证投票选项的文本框的验证控件是否启用 #endregion 在页面加载事件中调用set方法设置页面,代码如下: protected void Page_Load(object sender, EventArgs e) if (!IsPostBack) set(true); (3)添加投票项 单击按钮可以完成添加新投票项功能。单击该按钮时,将触发按钮的imgbtnAdd_Click事件。在该事件中首先调用AutoID方法自动获得投票项的编号,保存在M_Str_voteID变量中,然后判断自动编号是否null值,如果不为空值,则执行添加操作,并返回一个布尔值,如果成功则返回true,否则返回false。代码如下: /添加投票 #region protected void imgbtnAdd_Click(object sender, ImageClickEventArgs e) M_Str_voteID = AutoID("tb_Vote", "voteID"); string P_Str_Title = this.txtTitle.Text.Trim(); if (M_Str_voteID != null) bool P_Bl_reVal = DB.ExSql("insert into tb_Vote values(" + M_Str_voteID + ",'" + P_Str_Title + "')"); if (P_Bl_reVal) set(false);/设置页面 else Response.Write(""); #endregion 其中,生成自动编号的方法为AutoID(),该方法有两个string类型的参数P_Str_tbName 和P_Str_colName,分别用来传递产生自动编号的表名和列名。代码如下: