在线投票系统_吴志辉:在线投票系统
在线投票系统
[摘
要]
吴志辉
浙江绍兴文理学院工学院计算机系032班
本文给出了一个基于ASP.NET(C#)+SQL-SERVER2000在线投票系统的实现。该系统
分为"前台投票"和"后台管理"两大部分。
其中投票部分有前台用户投票,查看结果两大功能,后台管理,管理员可以登录管理系统。管理员可以添加新管理员或者删除已有的管理员,还可以修改密码。系统支持多个不同项目投票切换,支持针对用户的IP限制,支持限制时间间隔。该系统具有投票资格认证、票数统计及实时显示功能.。指出了ASP.NET技术由于其方便,灵活及可扩充性等特点,在Web数据库的开发中体现出强大的优势.介绍了ASP.
NET的主要技术特点及其数据库的访问原理和ADO。Net对象,通过实例提出了一种应用于网上投票的基于数据库和ASP.NET的网上投票系统的开发方法,讨论了该系统的数据库,给出了主要程序设计流程图
该系统采用MicrosoftVisualStudio2005.NET+SQL-Server2000开发平台。投票模块:采用WEB用户控件的形式开发。
论文主要介绍了该系统的开发背景,所要完成的功能和开发的过程。重点说明了系统设计的重点、设计的思想、技术难点和解决方案。
[关键词]MicrosoftVisualStudio2005.NET;SQLServer2000;数据库管理;动态服务网页;Web数据
库;动态数据对象;组件
第一章前言
当今社会,随着科技的不断发展,计算机已在人们的日常生活和工作领域中日益普及,并且人们对于计算机的应用不再是简单的文字处理和最初的科学计算。计算机早已涉及到我们生活的各个方面,更多的利用计算机来减轻我们的工作。随着互联网的普及,传统的投票和调查方式已经不能满足我们的需要;而"网上投票系统"除了能够完成传统的功能之外,更具有时效高和范围广的优点,更符合现代社会的需要。我们需要一种基于Web的网上投票系统,该系统的用户可以在登录后对工作总结进行投票,使管理员可以快速的知道工作总结的统计情况。前台使用ASP.Net语言及其组件技术实现动态网页的设计,后台为服务器端的SQLServer数据库。从经济信息中心的实际情况出发,经过对单位有关工作总结的投票要求进行了一番考察和分析,在单位需求的分析基础上,确立了网上投票系统的具体实现功能。
管理员管理用户、并阐述系统的概要设计和详细设计,实现用户投票、
候选单位等功能。并且在完成系统的实现后,对整个系统作单元测试。
投票管理的目标概括起来就是要通过科学的管理手段和专业化管理技术来实现社会效益、经济效益、环境效益的统一。结合先进的现代计算机技术、现代控制技术建立一个整个的综合服务中心,为住户提供一个安全、舒适、便捷、节能、高效的生活环境。实现以家庭智能化为主的、可持续发展的、具有二十一世纪风范的智能化。
1.1系统的概述
现在网上投票系统可匿名投票的比较多,这样对于信息反馈的准确性便会有所降低。所以现在研究的在线投票系统需要用户登陆投票。
进行用户登陆投票的用户是由管理员在后台输入的,而且用户可以自行对个人资料进行相应的不固定的个人信息修改。这样使得投票系统更加完整更加公正更加实用并且更具有活动性。
1.1.1需求分析
确定设计任务和设计目标,并提炼出设计规格说明书,作为正式设计指导和验收的标准。系统的需求一般分功能性需求和非功能性需求两方面。
操作方式(1)功能性需求是系统的基本功能,如输入输出信号、
等;网上投票网站系统如果要作到时性、准确性、可靠性、灵活性、安全性、综合性,在前台必须要有个完整的用户交互平台,网站的推广方案,功能完整的后台管理系统等。
成本、功耗等因素。网上投票网站(2)非功能需求包括系统性能、
系统要有比较好的浏览速度也就是整个系统是否受欢迎的重要因素。因此设计者要为网上投票网站系统制作一个网站优化机制。系统的成本预算是必做的一件事,设计者要合理的安排资金使用,使得用最少的资本做更多有用的事。
(3)设计者做这个系统需求分析工作的研究对象是用户要求,设计者如果根据用户对软件功能和性能提出初步要求,并澄清一些模糊概念,然后软件分析人员认真了解用户的要求,细致地进行调查分析,把用户做什么的要求最终转换成一个完全的、精细的软件逻辑模型,并
写出软件的需求规格说明,准确地表达用户的要求。设计者就可以做好系统的基本功能和系统性能、成本、功耗分析和预算工作。
1.1.2可行性分析
从企业角度来讲无论您是做什么生意,您都不能忽略互联网的重要性。实际上,只要您上网看一看,您也许会惊讶地发现您的竞争对手的"网页"早已在Internet上发布了。抢占新世纪发展的战略据点;建立新的企业形象;直接开拓国际市场;开展24小时网上营销;高效廉价的定向宣传;与客户建立最直接的交流机制;缩短推出新产品和打开新市场的周期;与富有吸引力的客户群发展客户关系网;与自己的销售人员保持联系;面向外地市场。从而可以看出在互联网上发送或了解信息是多么地重要。而我建设一个网上投票系统同样也具有非常重要的价值、值得研究开发;与客户建立最直接的交流机制。而作为一个企业人员对这些信息了解还不止是表面上的了解应该还要做更入的调查研究才对,而网上投票系统却要为寻找此类信息的广大网友提供最新可靠消息。网上投票网站采用的是动态语言--ASP.NET,数据库为MicrosoftSQLServer2000,在技术上不存在很大的难题。因为ASP.NET是一个统一的Web开发模型,它包括您使用尽可能少的代码生成企业级Web应用程序所必需的各种服务。ASP.NET作为.NETFramework的一部分提供。当您编写ASP.NET应用程序的代码时,可以访问.NETFramework中的类。您可以使用与公共语言运行库(CLR)兼容的任何语言来编写应用程序的代码,这些语言包括MicrosoftVi-sualBasic、C#、JScript.NET和J#。使用这些语言,可以开发利用公共语言运行库、类型安全、继承等方面的优点的ASP.NET应用程序。ASP.NET语言是一种比较成熟的专业动态网站设计语言,ASP.NET是服务器端脚本编写环境,使用它可以创建和运行动态、交互的Web服务器应用程序。使用ASP.NET可以组合HTML页、VBScript脚本命令和JavaScript脚本命令等,以创建交互的Web页和基于Web的功能强大的应用程序。由于脚本程序是在服务器上而不是在客户端运行,传送到浏览器上的Web页是在Web服务器上生成的。所以不必担心浏览器能否处理脚本:Web服务器已经完成了所有脚本的处理,并将标准的HTML页面传输到浏览器。由于只有脚本的结果返回到浏览器,所以服务器端脚本不易复制。用户看不到创建他们正在浏览的页的脚本命令。SQLServer2000数据库也是一种很常用的实用性、可靠性、安全性都比较好的数据库,SQLServer是由Microsoft开发和推广的关系数
(DBMS),它最初是由Microsoft、据库管理系统Sybase和Ashton-Tate三
家公司共同开发的,并于1988年推出了第一个OS/2版本。SQLServer近年来不断更新版本,1996年,Microsoft推出了SQLServer6.5版本;1998年,SQLServer7.0版本和用户见面;SQLServer2000是Microsoft公司于2000年推出的最新版本。SQLServer特点:1.真正的客户机/服务器体系结构。2.图形化用户界面,使系统管理和数据库管理更加直观、简单。3.丰富的编程接口工具,为用户进行程序设计提供了更大的选择余地。4.SQLServer与WindowsNT完全集成,利用了NT的许多功能,如发送和接受消息,管理登录安全性等。SQLServer也可以很好地与MicrosoftBackOffice产品集成。5.具有很好的伸缩性,可跨
" !
越从运行Windows95/98的膝上型电脑到运行Windows2000的大型多处理器等多种平台使用。6.对Web技术的支持,使用户能够很容易地将数据库中的数据发布到Web页面上。7.SQLServer提供数据仓库功能,这个功能只在Oracle和其他更昂贵的DBMS中才有。SQLServer2000与以前版本相比较,又具有以下新特性:1.支持XML(ExtensiveMarkupLanguage,扩展标记语言)2.强大的基于Web的分析3.支持OLEDB和多种查询4.支持分布式的分区视图。另外还要安装一个网站开发环境软件MacromediaDreamweaver8,然后再安装一些其它的辅助工作软件如:图片处理软件Photoshop7.0;FlashMX;
还这些软件的获得和使用都不会成为设计中的关键Fireworks等软件。
难题。
在Internet上实现投票系统,需要web服务器和数据库服务器的支持,支持服务器运行的操作系统,可以采用Windows2003Server。
1.2网上投票系统的一般需求1.2.1功能需求(1)基本功能需求
投票的实现、投票结果的查询、投票结果的a)前台:投票项的选择、
统计与分析。
投票主题的管理、每个投票主题投票项b)后台:投票用户的管理、
管理、每个投票主题的投票方式的设定这几个方面。
(2)操作界面需求
系统根据客户/服务器应用模型,利用计算机网络中的IE浏览器和Internet信息服务(IIS)(此组件可以很方便地将信息和业务应用程序发布到Web),因此系统是采用网站的形式发布的,利用网页制作工具制作友好的用户界面,并实现和加强用户对系统的易操作性。
(3)数据库维护需求
系统运行一段时间后,数据库中存放的数据会越来越多。为了不影响系统的运行效率,应当定期地清除数据库中的过时数据,如每年清除一次。
1.2.2性能需求(1)灵活性、可扩展性
系统根据客户/服务器应用模型,利用ASP.NET编写,再加上SQLServer2000作为数据存储介质而完成的。ASP.NET是服务器端脚本环境,可用来创建交互式Web页并建立强大的Web应用程序。因此系统的升级只涉及到服务端,且系统是一模块化进行设计与管理的,只要服务端做出相应的修改升级,客户端自然会实现新的系统更新,同时实现了系统的灵活性、可扩展性。
(2)安全性
对各种投票赋予自己的投票性质。对投票赋予自己的角色。1.3一般的网上投票系统分析1.3.1系统环境及工作原理
根据对网上投票系统的调查得知,虽然现今网络上已经有了很多的网上投票系统,也有很多是利用MicrosoftActiveServerPages(ASP)编写,再加上MicrosoftAccess作为数据存储介质而完成的,也是以网站为发布形式的。这些系统也都有以下功能:投票,增加新投票项目,修改投票项目,删除投票项目,查看投票结果等。
1.3.2系统的优缺点(1)优点:
系统实现简单,使用相对比较方便。(2)缺点:
系统安全性、灵活性不足,有些投票系统只能匿名投票,而且可以重复的投票,这使得调查统计的结果严重失真。数据库安全性不足等。
1.4本课题目标1.4.1新系统的功能
系统整个系统主要有前台投票和后台管理组成:*前台投票部分:a)验证用户身份;
b)确认用户身份后投票;
c)限制或者不限制投票者ip,并且在规定的时间内是否允许反复投票;
d)投票结果查看;*后台管理部分:
a)管理员名称和密码管理,包括管理员名称和密码的修改;
删除、修改;b)投票标题的管理,包括投票标题的添加、
删除、修改;c)每个投票标题投票项的管理,包括投票项的添加、
其中在投票标题管理模块中,投票标题添加的时候还包括了投票
方式的设定,投票时间的限制,防止用户重复投票有失公正。
1.4.2新系统的优点
新系统在实现功能的同时并且注意了如何使得投票用户更方便快捷地清楚如何投票,简单易懂,实现和加强用户对系统的易操作性。简单的网络投票系统在投票期间,网页上显示的投票内容固定不定。
对于用户投票,而用户是由管理员在后台操作,用限制ip的形式来达到防止反复投票的虚假行为,调查的准确性大大提高,这样的功能对于学校内的投票是非常有用的。
用户投票后前后都可以查看投票结果,在投票结果页面可以详细看到每项投票的票数。投票的票数以数字和图形两种形式显示。这样对于用户得到信息的反馈更加明了。
图1-1投票工作框图
第二章:系统需求分析
2.1用户的具体操作过程与内容
首先,用户在登录界面登录进入,然后在选择是参加投票还是进入用户管理来修改个人资料,选择进入用户管理来修改个人资料完成后将返回选择页面,选择进入投票操作后进行投票,并可以查看相应投票主题的投票结果。
2.2开发环境2.2.1硬件
该系统采用网站的形式,专门设置一台计算机作为服务器,别的计算机作为客户端。
2.2.2软件
该系统服务端需在WINDOWS2003+MicrosoftVisualStudio2005(c#),MicrosoftSQLServer2000数据库配置下运行,开发工具为Microsoft
Dreamweaver、Flash、VisualStudio2005(c#),MicrosoftSQLServer2000、
firework、PHOTOSHOP等。
2.3数据库选择
本系统选择了Microsoft(r)SQLServer(tm)2000数据库作为信息存储介质,它扩展了MicrosoftSQLServer7.0版的性能、可靠性、质量和易用性。MicrosoftSQLServer2000增加了几种新的功能,由此成为大规模联机事务处理(OLTP)、数据仓库和电子商务应用程序的优秀数据库平台。
第三章:系统设计3.1功能模块设计
在线投票系统操作的功能模块结构图:
图3-1功能模块结构图
3.1.1检测是否限制IP
模块设计
" !
IT技
术
本模块主要功能是当投票这点击投票项目时,自动检测当前系统是否限制ip。以防止过于频繁的投票。
3.1.2检测用户IP是否存在模块设计
本模块用于从数据库中查询用户是否内已经对该项投过票的记录。
3.1.3检测用户上次投票时间模块
本模块主要功能是检测用户的最近一次投票时间。3.1.4用户投票模块
用户投票模块是系统前台最重要实现的一部分,而本系统最好的方面是禁止了重复投票。禁止用户在规定的时间内重复投票,能够比较准确地获得用户反馈的信息。本系统利用sql语句来记录并对比用户的投票时间间隔。
3.1.5查看投票结果模块
投票结果模块在投票成功会显示出来,并一一比较简单明了的画面出现。
投票长度的小柱子便会增长一点,这样有利用更了解更直观地显示给用户。
3.2开发方法3.2.1数据库访问
基于微软IIS的平台,通过服务器端运行的ASP.NET程序来访问后台数据库是一种最常见的模式。
3.3数据库设计
3.3.1数据库创建语句
表3-3voteConfig
createtablevoteConfig
——设置系统前台需要(idintforeignkeyreferencesvoteMaster(id),—调查的投票项
——系统是否限制ip,0为限制,1为不限制checkIPintdefault(0),—
——统是否限制时间间隔单位(分钟)checkTimeintdefault(0)—
)
insertintovoteConfig(id)values(1)select*fromvoteConfig投票项目表
表3-4voteDetails
createdatabasevote3.3.2数据表设计
管理员表:其中包含了管理员的信息,有管理员名以及管理员密码id等。
表3-1admin表
createtablevoteDetails
——外键(idintforeignkeyreferencesvoteMaster(id),—
——主键voteDetailsIDintidentity(1,1)primarykey,—
——投票项目值voteItemvarchar(20)notnull,—
———票数voteNumintdefault(0)
)
select*fromvoteDetails投票信息表
表3-5voter
创建管理员表SQL语句:
usevote
createtableadmin
(idintidentity(1,1)primarykey,--主键,唯一标识
非空userNamevarchar(20)notnull,--管理员姓名、非空passwordvarchar(20)notnull,--管理员密码、
)Go
——数据库insertintoadmin(userName,password)values('wzh','wzh')—
插入语句,插入admin表,其中管理员姓名为wzh,管理员密码也同样为wzh其id为1
go
——查询是否插入管理员成功select*fromadmin—
投票标题管理表
表3-2voteMaster表
createtablevoter
——该用户针对哪项调(idintforeignkeyreferencesvoteMaster(id),—查进行投票,也加上外键约束
——该用户的ipipvarchar(30)notnull,—
——用户的投票时间voteTimedatetimedefault(getdate()),—
——用户针对此项投票的次数voteNumintdefault(1),—
primarykey(id,ip)
)
insertintovoter(id,ip)values(1,'192.168.0.1')select*fromvoter用户表
表3-6users表
createtablevoteMaster
——主键约束(idintidentity(1,1)primarykey,—
——投票标题、非空voteTitlevarchar(30)notnull,—
voteSumintdefault(0)--总票数)
——数据库插入语insertintovoteMaster(voteTitle)VALUES('wzh')—
句,插入voteMaster表,投票标题为计算机03级十佳先进个人
insertintovoteMaster(voteTitle)VALUES('计算机03级十佳先进个人')
go
——查询是否插入投票标题成功select*fromvoteMaster—
投票检测是否限制ip表
createtableadmin
——主键,唯一标识(idintidentity(1,1)primarykey,—
——用户姓名、非空userNamevarchar(20)notnull,—
——用户密码、非空passwordvarchar(20)notnull,—
)Go
——数据库insertintousers(userName,password)values('wzh','wzh')—
插入语句,插入admin表,其中用户姓名为wzh,用户密码也同样为wzh其id为1
go
select*fromusers--查询是否插入用户成功
———创建触发器
createtriggerupdateVoteSumonvoteDetails
" !
IT技术
forupdateasbegin
updatevoteMastersetvoteSum=voteSum+1whereid=(selecttop1idfrominserted)
end
3.3.3视图:
cmd.CommandText=strSql;//指定数据库命令对象的执行语句stringresult=cmd.ExecuteScalar().ToString();//执行命令语句,并将其以字符串的形式返回
3.3.4数据库操作介绍
定义一个类属性,类型为SQL连接,针对象。利用构造函数初始化SQL连接
数据库操作的命令对
publicclassDB{
SqlConnectioncon=null;//定义一个类属性,类型为SQL连接
SqlCommandcmd=newSqlCommand();//针对数据库操作的命令对象
//利用构造函数初始化SQL连接,建立到数据库的连接.连接服务器为localhost,连接到vote数据库,sa身份密码为空
publicDB()
{
con=newSqlConnection("server=.;database=vote;uid=sa;pwd=;");}
publicSqlConnectiongetCon(){
if(con.State==ConnectionState.Closed)
con.Open();//先判断,如果数据库当前的连接状态是关闭着的,则打开连接
returncon;}
//关闭连接
publicvoidclear(){
if(con.State==ConnectionState.Open)
con.Close();//先判断,如果数据库当前的连接状态是打开着的,则关闭连接
}
//根据传入的SQL语句,执行
publicintexecuteNonQuery(stringstrSql){
cmd.Connection=getCon();cmd.CommandText=strSql;inti=cmd.ExecuteNonQuery();clear();returni;}
//根据传入的SQL语句执行并返回结果publicstringexecuteGetReturn(stringstrSql)//strSql令语句
clear();
returnresult;}
//得到一个数据集
publicDataSetgetDs(stringstrSql,stringtableName){
SqlDataAdaptersda=newSqlDataAdapter(strSql,getCon());DataSetds=newDataSet();sda.Fill(ds,tableName);clear();returnds;}
//根据传入的SQL语句,执行并返回一个只向前的数据流DataReader
publicSqlDataReadergetSdr(stringstrSql){
cmd.Connection=getCon();cmd.CommandText=strSql;
SqlDataReadersdr=cmd.ExecuteReader();returnsdr;}
//定义批量执行多条SQL语句的方法publicboolexecuteTransaction(string[]strSql){
boolflag=false;
con=getCon();//得到连接
cmd.Connection=con;//命令对象
SqlTransactionmyTransaction;//声明一个SQL事物类型
myTransaction=con.BeginTransaction();//基于一个连接初始化事物try{
inti=0;
foreach(stringsqlinstrSql)//遍历{
cmd.Transaction=myTransaction;//指定SQL命令语句的事物cmd.CommandText=sql;//给定命令语句cmd.ExecuteNonQuery();//执行SQL语句}
myTransaction.Commit();flag=true;}
catch(Exceptione){
myTransaction.Rollback();//事务的回滚,外一出现断电,计算机重启等不可预见的问题的时候,不能确保服务器和客户端的数据都能同时更新的话,将使得本次交易双方回到交易前的状态,即投票将失败,保持投票前的状态,这一应用在银行交易系统中有着广泛的应用
是传入SQL命
{
//得到数据的连接并且这个连接是打开//getCon();
//建立一个命令对象
cmd.Connection=getCon();//命令对象是需要基于了的连接
flag=false;}
finally{
clear();}
returnflag;}}
第四章:系统实现4.1系统模块实现
4.1.1
在线投票系统首页
一个已经打开
" !
IT技术
功能:一开始打开的便是在线投票系统的主页面。块
功能:此模块为用户修改个人信息,便用户更改自己的信息的操作。
4.1.5用户投票主页面模块
功能:此模块为用户投票的最具体操作,实现调查的过程,最后查看。
实现投票的最终功能。
输入:选择用户认为的选项,并提交查看。
提交选项后对结果进行查看的模块。如下图所示:
4.1.6查看投票结果模块
提交选项后对结果进行查看的模块
4.2系统重要代码与算法的说明
4.1.2分页模块
4.1.2.1系统简介:介绍本系统的一些概况。
4.1.2.2个人信息:介绍作者的个人信息
4.1.2.3友情链接:添加的友情链接。
4.1.2.4后台管理登录:链接到后台管理登录。
4.1.3用户登录模块
功能:此模块为用户登录,便验证用户身份的操作。
输入:用户名、密码并提交登录。
提交登录选项后对的模块。如下图所示:
4.1.4用户修改个人信息模
4.2.1命名空间usingSystem;
usingSystem.Data;
usingSystem.Configuration;usingSystem.Web;
usingSystem.Web.Security;usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;usingSystem.Web.UI.HtmlControls;//引入数据库的命名空间usingSystem.Data.SqlClient;4.2.2用户身份验证代码
publicpartialclassDefault0:System.Web.UI.Page{
protectedvoidPage_Load(objectsender,EventArgse){
}
protectedvoidButton1_Click(objectsender,EventArgse){
DBDBManager=newDB();
stringuserName=TextBox1.Text;stringuserPwd=TextBox2.Text;
stringstrSql="selectcount(*)fromuserswhereuserName='"+user-Name+"'andpassword='"+userPwd+"'";
if(Convert.ToInt32(DBManager.executeGetReturn(strSql))>
0)
" !
{
//合法的用户//加入Session
Session.Add("userName",userName);//我们将用户名保存入Ses-sion中。
Response.Redirect("Default4.aspx");}else{
//非法的用户名
this.Label1.Text="对不起,您输入的用户名和密码错误!";}}
protectedvoidButton2_Click(objectsender,EventArgse){
Response.Write("<scriptlanguage:javascript>javascript:window.close();</script>");}}
4.2.3投票代码
为了代码的通用性,我把投票代码用自定义控件的样式编写编写在App_Code下的DB.cs中
{
stringstrSql="selectvoteTitlefromvoteMasterwhereid="+ID;this.lblVoteTitle.Text=DBManager.executeGetReturn(strSql);}
//投票项数据绑定publicvoidbindData(){
stringstrSql="selectvoteDetailsID,voteItemfromvoteDetailswhereID="+ID;
SqlDataReadersdr=DBManager.getSdr(strSql);
this.RadioButtonList1.DataSource=sdr;//指定数据源
this.RadioButtonList1.DataTextField="voteItem";//指定要显示的字段
this.RadioButtonList1.DataValueField="voteDetailsID";//指定主键字段
this.RadioButtonList1.DataBind();//绑定Rd,这一句一定要写,否则看不到内容
sdr.Close();//关闭数据流
DBManager.clear();//清除资源,关闭数据库的连接}
protectedvoidbtnVote_Click(objectsender,EventArgse){//首先检查系统是否限制IPif(checkIP())
{//系统限制IP接下来要做的事情就是检测投票者的IPif(checkVoterIP())
{//IP已经存在,即用户已经针对该项调查投过一次票,//接下来要做的事情是检测该用户上次投票时间间隔if(checkTime())
{//表明该用户过于频繁的投票
this.Label1.Text="对不起,为了公平,请不要反复投票!";}else{//表明此用户再次投票
//第一步更新投票从表
stringsqlUpDateVoteDetails="updatevoteDetailssetvoteNum=voteNum+1wherevoteDetailsID="+this.RadioButtonList1.SelectedValue;
//第二步,更新投票者信息表
stringsqlUpDateVoter="updatevotersetvoteTime=getDate(),
voteNum=voteNum+1whereid="+ID+"andip='"+Request.UserHostAd-dress.ToString()+"'";
string[]arrSql=newstring[2];arrSql[0]=sqlUpDateVoteDetails;arrSql[1]=sqlUpDateVoter;
if(DBManager.executeTransaction(arrSql)){
this.Label1.Text="感谢你的再次投票";}else{
this.Label1.Text="错误出现在//表明此用户再次投票
";
}}}else{
//它是第一次投票,我们允许
//第一步更新投票从表
stringsqlUpDateVoteDetails="updatevoteDetailssetvoteNum=
voteNum+1wherevoteDetailsID="+this.RadioButtonList1.SelectedValue;
//第二步,更新投票者信息表
stringsqlUpDateVoter="insertintovoter(id,ip)values("+ID+",
'"+Request.UserHostAddress+"')";
publicpartialclassmyController_vote:System.Web.UI.UserControl{
DBDBManager=newDB();//实例化一个数据库的服务类privateboolflag=false;privateintID=0;publicint_ID{set{
ID=value;}get{
returnthis.ID;}}
protectedvoidPage_Load(objectsender,EventArgse){
//PageLoad方法是在页面一加载的时候就会执行的方法getID();
getVoteTitle();
if(!Page.IsPostBack)//Page.IsPostBack表明是回传,加上取反符!表明,表明是第一次
{
bindData();//客户第一次请求的时候我}}
前台要举行的投票ID//获取系统配置里
publicvoidgetID(){
stringstrSql="selectidfromvoteConfig";//这是我们需要执行的SQL语句
if(ID==0)
ID=Convert.ToInt32(DBManager.executeGetReturn(strSql));//获取
系统配置的投票ID}
//获取投票的标题publicvoidgetVoteTitle()
们才绑定
选项
" !
string[]arrSql=newstring[2];arrSql[0]=sqlUpDateVoteDetails;arrSql[1]=sqlUpDateVoter;
if(DBManager.executeTransaction(arrSql)){
this.Label1.Text="感谢你的第一次投票";}else{
this.Label1.Text="错误出现在////它是第一次投票,我们
允许";
}
}}else{
stringsqlUpDateVoteDetails="updatevoteDetailssetvoteNum=voteNum+1wherevoteDetailsID="+this.RadioButtonList1.SelectedValue;
//系统不限制IP,可以投票if(checkVoterIP())
{//如果IP已经存在,我们应该用更新Voter表语句
stringsqlUpDateVoter="updatevotersetvoteTime=getDate(),voteNum=voteNum+1whereid="+ID+"andip='"+Request.UserHostAd-dress.ToString()+"'";
string[]arrSql=newstring[2];arrSql[0]=sqlUpDateVoteDetails;arrSql[1]=sqlUpDateVoter;
if(DBManager.executeTransaction(arrSql)){
this.Label1.Text="感谢你的再次投票,当前系统不限制
IP";
}else{
this.Label1.Text="错误出现在////,当前系统不限制IP";}}else{
//IP不存在我们用添加的语句
stringsqlUpDateVoter="insertintovoter(id,ip)values("+ID+",
'"+Request.UserHostAddress+"')";
string[]arrSql=newstring[2];arrSql[0]=sqlUpDateVoteDetails;arrSql[1]=sqlUpDateVoter;
if(DBManager.executeTransaction(arrSql)){
this.Label1.Text="感谢你第一次投票,当前系统不限制
IP";
}else{
this.Label1.Text="错误出现在////,我们用添加的语句";}}}}
//定义一个用于检测系统限制IP设置的方法privateboolcheckIP(){
flag=false;//标记变量
stringstrSql="selectcheckIPfromvoteConfig";
intresult=Convert.ToInt32(DBManager.executeGetReturn(strSql));//得到系统配置表中的IP限制信息
if(result==0){
flag=true;}
returnflag;}
//定义一个用于从数据库中检索投票者的IPprivateboolcheckVoterIP(){//获取投票者IP
stringip=Request.UserHostAddress.ToString();flag=false;//开始检测IP
stringstrSql="selectcount(*)fromvoterwhereip='"+ip+"'andid="+ID;
intresult=Convert.ToInt32(DBManager.executeGetReturn(strSql));if(result>0){
flag=true;}
returnflag;}
//定义一个用于获取投票者上次投票的时间间隔privateboolcheckTime(){
//取出系统配置中限制时间间隔
stringstrGetTime="selectcheckTimefromvoteConfig";
intresult=Convert.ToInt32(DBManager.executeGetReturn(strGetTime));
stringstrSql="selectdatediff(s,voteTime,getdate())fromvoterwhereid="+ID+"andip='"+Request.UserHostAddress+"'";
longi=Convert.ToInt64(DBManager.executeGetReturn(strSql));//获取到距投票者上次投票的时间间隔
flag=false;
if(i<result*60){
flag=true;}
returnflag;
}
protectedvoidbtnShowResult_Click(objectsender,EventArgse){
Response.Redirect("showResult.aspx?id="+ID);}}
4.2.4投票查看页面代码
编写在showResult.aspx.cs中.
publicpartialclassshowResult:System.Web.UI.Page{
DBDBManager=newDB();
protectedvoidPage_Load(objectsender,EventArgse){
intid=Convert.ToInt32(Request.QueryString["id"].ToString());
inttotal=Convert.ToInt32(DBManager.executeGetReturn("selectvote-SumfromvoteMasterwhereid="+id));
SqlDataReadersdr=DBManager.getSdr("selectvoteItem,voteNumfromvoteDetailswhereid="+id);
while(sdr.Read()){
" !
IT技
术
intm=sdr.GetInt32(1);
Response.Write("<imgsrc='img/100.gif'
width="+m+"/>"+sdr.GetString(0)+"(票数:"+m+")<BR>");
}
sdr.Close();
DBManager.clear();}}
height=20
第五章:测试和应用5.1.重要模块测试情况5.1.1用户登录
在用户登陆时候,输入不存在的的用户名或则错误的密码,则提示的错误的信息:
图5-2针对投票结果的查看图5-1限制IP
的情况下的投票
如果没有选中投票项,便点击"投票",则会有如下错误信息显示:
5.1.2.1不限制ip的情况
如果用户是第一次投票
由于不限制IP所以不考虑时间间隔,固可以进行多次投票查看投票结果
5.1.2.2限制ip的情况第一次投票:再一次投票:5.2总结(1)体会
通过毕业设计我有以下的体会:毕业设计是整个教学过程的最后环节,是学生综合运用所学知识解决实际问题能力的考查。通过使用ASP.NET制作系统,使人真正体会到了自
图5-1限制IP的情况下的再一次投票己动手开发中规模
的应用系统,学会
一种规范化的编程方法,使我加深了对软件的理解。学以致用,学用结合,这既是学习理论知识目的,也是检验学习的最好方法。
(2)系统存在的问题
虽然本系统还比较通用,但仍旧存在着问题。
管理员登陆时候,没有验证码这一模块。验证码是为用户提供的一种安全措施,用于增强用户登陆时的安全性,一般的验证码可以起到保护用户名的作用。系统最大的缺陷在于还没有考虑到有多个用户同时投票时产生的情况将如何解决。这些不足之处有待于进一步改善,编写程序的思维方式严密性有待于提高。
(3)系统的优点
当然本系统也有优点,首先系统使用了用户比较熟悉的windows友好菜单,以实现和加强用户对系统的易操作性;系统以模块为设计维护的基本单位,各模块间相互独立,又相互类似,这样就提高了系统的可维护性。
参考文献
数据库系统开发实例导航》,清华大学出版社,2004[1]宣小平,但正刚,张文毅编著,《
,机械工业出版社,2000ASP3高级编程》[2]AndersonR.等编著,刘福太等译,《
,中国水利水电出版社[3]苏如英等编著,《asp.net编程技术与交互式网页设计》
,电子工业出版社[4]唐学中编著,《SQLserver2000数据库教程》
数据库程序设计》,高等教育出版社[5]微软公司编著,《
,中国电力出版社[6]精英科技编著,《Asp核心技术》
,机械工业出版社[7]丁贵广编著,《Asp及Asp.net编程基础与实例》
,人民邮电出版社[8]李律松编著,《Asp.net开发技术详解》
,机械工业出版社[9]李万宝编著,《Asp.net技术详解与应用实例》
图5-2-2用户登录操作
如果用户名和密码均输入为空,则提示的错误信息:
图5-2-3用户登录操作
5.1.2投票操作
用户登陆之后,选择进行投票。
图5-2-3用户投票操作图5-2-3
用户投票操作
图5-1不限制IP的情况下的投票图5-1不限制IP
的情况下的再次投票
" !