《课程设计-在线投票系统(共21页).doc》由会员分享,可在线阅读,更多相关《课程设计-在线投票系统(共21页).doc(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上程序(70%)设计报告(15%)答辩(15%)总分(100)工作量(35)运行效果(35)完整性(10)质量(5)通过(15)不通过教师签名: 说明:答辩未通过者总分记为0并重修。总分 = 程序70% + 设计报告15% + 答辩15%在线投票系统小组成员:xxx指导老师:提交日期:2010-07-8 专心-专注-专业摘要在积极建立科学管理机制的今天,仅仅靠原始的手工管理或简单的单机管理,管理部门面对大量的信息,无法有效率地将其中的重要部分提取出来,并做出相应的判断和处理。投票管理者的决策只能依据手工表数据,在浪费大量人力、物力的同时无法做到实时监控,难以保证数据的准
2、确性和及时性。因此,先进的管理思想就成为了一个可望而不可及的目标。投票非常急需一套既有先进管理思想的系统,作为实现目标和提高现有投票管理水平的一种重要手段。随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,在先进的计算机技术、通信技术、控制技术及IC卡技术基础上,采用系统集成方法,逐步建立一个智能化的投票系统。编写在线投票系统,最重要的一点就是如何从烦琐的投票结果中,导出全部投票项目的票数,然后根据投票项目的各个票数,进行票数百分比计算,最后编辑出在线投票系统。开发该系统我主要采用JSP技术和数
3、据库相结合的方式。JSP技术通过在静态HTML内容中嵌入服务器端脚本,实现网页内容的动态改变。Web服务器从磁盘上读取含有服务器端脚本的网页,在网页发送给客户端浏览器之前,先对其中的服务器端脚本进行解释,输出用户定制内容,从而产生动态网页。数据库的采用,能够胜投票系统中的数据处理。本文在相关理论指导下,在分析其他一些系统的基础上,开发出了一个简单的在线投票系统(包括功能模块设计、数据库结构设计等)基本解决了管理人员的烦琐事务。关键字:jSP,数据库 目录一绪论开发背景:如今很多的服务行业都要进行服务的反馈,以便更好的提高产品的质量和作出更好的服务,投票系统就是一个反馈信息的软件,通过它可以更好
4、更快捷方便的反馈信息共服务商参考。因此开发一个能够供客户反馈信息的平台是很有必要的。意义:其一,方便的操作。原有的手工投票管理基本上是人工操作,效率低下,缺乏方便性,在线投票管理系统运用计算机和其他附加设备,不再需要手工操作,基本上是全自动化,能够节省人力、最大限度地利用各种宝贵的资源,大大的提高了效率。 其二,友好的界面。友好的用户界面会给人一种亲切的感觉,在使用起来不会觉得沉闷,效率自然也会提高了。在线投票系统主要用来统计网站用户对某个主题或热门话题的意见。决策者通过这些统计数据做出相应的决策。在线投票系统是一般网站必备的程序之一,如果网站开发者想了解用户对该网站的意见和建议。他可以设计这
5、样一个投票主题:你认为该网站如何?(A.很好B.一般C.不好)然后提供给用户进行投票二、开发环境开发环境MyEclipse简介MyEclipse企业级工作平台(MyEclipse Enterprise Workbench ,简称MyEclipse)是对Eclipse IDE的扩展,利用它我们可以在数据库和J2EE的开发、发布,以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的J2EE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML, Struts, JSF, CSS, Javascript, SQL, Hibernate。在结构上,MyEclipse的特征可以
6、被分为7类:1. J2EE模型2. WEB开发工具3. EJB开发工具4. 应用程序服务器的连接器5. J2EE项目部署服务6. 数据库服务7. MyEclipse整合帮助对于以上每一种功能上的类别,在Eclipse中都有相应的功能部件,并通过一系列的插件来实现它们。MyEclipse结构上的这种模块化,可以让我们在不影响其他模块的情况下,对任一模块进行单独的扩展和升级。简单而言,MyEclipse是Eclipse的插件,也是一款功能强大的J2EE集成开发环境,支持代码编写、配置、测试以及除错。三、需求分析随着科学技术的不断提高,计算机科学日渐成熟,互联网技术的不断发展和普及,众多高校,科研机
7、构及个人从理论与实践两个方面进行了大量的研究与开发工作,涌现出了很多在线投票系统,对学院、企业的管理起到了很好的作用。总之投票系统概括起来就是要通过科学的管理手段和专业化管理技术来实现统一。本系统是一个简单的投票系统,主要提供以下功能:系统首页上显示所有投票选项的列表,用户可以通过选中某个选项并点击“投票”按钮进行投票操作。另外,还提供查看投票详细信息的超链接,用户点击后可在另一页面上看到各个投票选项目前的投票情况,主要包括各选项所得的票数、占总票数的百分比等信息,并且以柱形图显示各选项的得票率,可以让用户从直观上看到各项的得票情况投票系统主要是为用户提供一个方便易用的投票界面,同时还具有查看
8、投票、投票选项的功能。投票系统主要需要实现以下一些基本功能:1. 投票:用户在投票系统首页上可以通过选中每个投票项前面的单选按钮并单击“投票”按钮来进行投票。2. 查看投票情况:用户在投票系统首页上可以通过点击“查看投票”超链接来查看当前的最新投票情况,包括各投票项的得票数、得票率等。四、系统设计 4.1概要设计1)开发平台:Microsoft Windows XP Professional 版本 2002 Service Pack 3开发工具:MyEclipse 在线投票系统功能:投票 查看投票 对同一IP地址的用户重复投票的限制2)实现该系统可划分为三个模块:显示投票选项,参与投票和显示投
9、票结果。下面来分别介绍。 投票界面: 4.2详细设计:4.2.1数据表的设计 本系统设计了两张表,表tb-temp保存投票用用户信息,表tb-vote保存投票选项信息。 表tb-temp字段名数据类型字段大小是否为主键IdInt4是VoteipChar20VotemselBigint8VotetimeChar50 表tb-vote字段名数据类型字段大小是否为主键IdSmallint2是Vote_titleChar50Vote_numInt4Vote_orderSmallint24.2.2值javabean的设计建一个值JavaBean用来封装存储表tb-temp中的投票选项信息,代码如下:pa
10、ckage com.yxq.valuebean;public class VoteSingle private String id; /存儲選項IDprivate String title;/存儲選項標題private String num;/存儲選項所得票數private String order;/存儲選項的排列序號public String getId() return id;public void setId(String id) this.id = id;public String getNum() return num;public void setNum(String num)
11、this.num = num;public String getOrder() return order;public void setOrder(String order) this.order = order;public String getTitle() return title;public void setTitle(String title) this.title = title;同样建另一个值JavaBean用来封装存储表tb-vote中的信息:package com.yxq.valuebean;public class TempSingle private String id
12、;/存儲投票用戶IDprivate String voteIp;/存儲投票用戶IPprivate long voteMSEL;/存儲毫秒數private String voteTime;/存儲yyyy-MM-dd HH:mm:ss形式的時間public long getVoteMSEL() return voteMSEL;public void setVoteMSEL(long voteMSEL) this.voteMSEL = voteMSEL;public String getVoteTime() return voteTime;public void setVoteTime(String
13、 voteTime) this.voteTime = voteTime;public String getId() return id;public void setId(String id) this.id = id;public String getVoteIp() return voteIp;public void setVoteIp(String voteIp) this.voteIp = voteIp;4.2.3数据库操作类的编写对于查看投票内容,参与投票和显示结果的操作,都涉及了数据库的操作。这些操作在一个DB类中实现,具体代码入下:定义属性及构造方法package com.yxq
14、.toolbean;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import com.yxq.valuebean.TempSingle;import com.yxq.valuebean.VoteSingle;public class DB private String className;/存儲數據庫驅動類路徑private
15、String url;/存儲數據庫URLprivate String username;/存儲登陸數據庫的用戶名private String password;/存儲登陸數據庫的密碼private Connection con;/聲明一個Connection對象private Statement stm;/聲明一個Statement對象用來執行SQL語句private ResultSet rs;/聲明一個ResultSet對象用來存儲結果集public DB() /通過構造方法為屬性賦值className = org.apache.derby.jdbc.ClientDriver;url = j
16、dbc:derby:/localhost:1527/myeclipse;username = classiccars;password = classiccars;/* * 功能 加载数据库驱动程序 */public void loadDrive() try Class.forName(className); /加載數據庫驅動程序 catch (ClassNotFoundException e) System.out.println(加载数据库驱动程序失败!);e.printStackTrace(); /向控制臺輸出提示信息/*获取数据库连接 * 功能 */public void getCon
17、() loadDrive(); /加載數據庫驅動程序try con = DriverManager.getConnection(url, username, password);/獲取連接 catch (Exception e) System.out.println(连接数据库失败!);e.printStackTrace();/* * 功能 获取Statement对象 */public void getStm() getCon();/獲取數據庫連接try stm = con.createStatement();/獲取Statement類對象 catch (Exception e) System
18、.out.println(获取Statement对象失败!);e.printStackTrace();/* * 功能 查询数据表,获取结果集 */public void getRs(String sql) getStm();try rs = stm.executeQuery(sql);/執行SQL語句查詢數據表獲取結果集 catch (Exception e) System.out.println(查询数据库失败!);e.printStackTrace();/* * 功能 查询数据表,获取投票选项 */public List selectVote(String sql) List voteli
19、st = null;if (sql != null & !sql.equals() getRs(sql);/查詢數據表獲取結果集if (rs != null) votelist = new ArrayList();try while (rs.next() /依次將結果集中的记录封装到VoteSingle类对象中VoteSingle voteSingle = new VoteSingle();voteSingle.setId(MyTools.intToStr(rs.getInt(1);voteSingle.setTitle(rs.getString(2);voteSingle.setNum(My
20、Tools.intToStr(rs.getInt(3);voteSingle.setOrder(MyTools.intToStr(rs.getInt(4);votelist.add(voteSingle);/将VoteSingle类对象存储到List集合中 catch (Exception e) System.out.println(封装tb_vote表中数据失败!);e.printStackTrace(); finally closed(); /关闭 数据库return votelist;/* * 功能 查询数据表,获取指定IP最后一次投票的记录 */public TempSingle se
21、lectTemp(String sql) TempSingle tempSingle = null;if (sql != null & !sql.equals() getRs(sql);/查询数据表获取结果集if (rs != null) try while (rs.next() /若该结果集中有记录,说明当前用户投过票tempSingle = new TempSingle();tempSingle.setId(MyTools.intToStr(rs.getInt(1);tempSingle.setVoteIp(rs.getString(2);tempSingle.setVoteMSEL(rs
22、.getLong(3);tempSingle.setVoteTime(rs.getString(4); catch (Exception e) System.out.println(封装tb_temp表中数据失败!);e.printStackTrace(); finally closed(); /关闭数据库return tempSingle;/返回TempSingle类对象中/* * 功能 更新数据表,实现票数累加 */public int update(String sql) int i = -1;if (sql != null & !sql.equals() getStm();/获取Sta
23、tement类对象try i = stm.executeUpdate(sql);/执行SQL语句更新数据表 catch (Exception e) System.out.println(更新数据库失败!);e.printStackTrace(); finally closed();return i;/* * 功能 关闭数据库连接 */public void closed() try if (rs != null)rs.close();/关闭结果集if (stm != null)stm.close();/关闭Statement类对象if (con != null)con.close();/关闭数
24、据库连接 catch (Exception e) System.out.println(关闭数据库失败!);e.printStackTrace();4.2.4工具类的编写该系统涉及了类型的转换,计算时间差等操作,这些操作在一个类中实现,这样可以实现代码的重复使用。该工具类为mytools,代码如下:package com.yxq.toolbean;import java.text.SimpleDateFormat;import java.util.Date;public class MyTools /* * 功能 将int型数据转换为String型数据 * 参数 num为要转换的int型数据
25、* 返回值 String类型 */public static String intToStr(int num)return String.valueOf(num);/* * 功能 比较时间。 * 参数 today当前时间,temp为上次投票时间。这两个参数都是以毫秒显示的时间 * 返回值 String类型 */public static String compareTime(long today,long temp)int limitTime=60;/设置限制时间为60分钟long count=today-temp;/计算当前时间与上次投票时间相差的毫秒数(该结果一定是大于等于0)if(cou
26、nt=limitTime*60*1000)/如果相差小于等于60分钟(1分=60秒,1秒=1000毫秒)return no;else/如果相差大于60分钟return yes;/* * 功能 格式化时间为指定格式。首先通过Date类的构造方法根据给出的毫秒数获取一个时间,然后将该时间转换为指定格式,如年-月-日 时:分:秒 * 参数 ms为毫秒数 * 返回值 String类型 */public static String formatDate(long ms)Date date=new Date(ms);SimpleDateFormat format=new SimpleDateFormat(
27、yyyy-MM-dd HH:mm:ss);String strDate=format.format(date);return strDate;4.2.5显示投票选项的设计当用户访问首页面后,单击“参与投票”就会进入vote.jsp页面显示投票选项,在该页面中先要查询tb_vote数据表获取所有的投票选项,然后逐一显示投票选项的标题 在线投票 没有选项可显示! % int i=0; while(i input type=radio name=ilike value= 注意事项: 1小时内只能投一次票!  
28、; 4.2.6参与投票的设计% String mess=; /用来保存提示信息 String selectId=request.getParameter(ilike);/获取用户选择 if(selectId=null|selectId.equals()/没有选择投票选项 mess=请选择投票!; else /选择了投票选项 boolean mark=false;/是否允许投票的标志 long today=(new Date().getTime();/new Date()获取当前时间,通过调用Date类的getTime()方法获取从1970年1月1
29、日00:00:00起到当前时间的毫秒数 long last=0;/上次投票的时间(以毫秒显示) String ip=request.getRemoteAddr();/获取用户IP地址 String sql=SELECT * FROM app.tb_temp WHERE voteMSEL = (SELECT MAX(voteMSEL) FROM tb_temp WHERE voteIp=+ip+);/SQL语句,功能:从数据表中获取当前用户上次投票时的记录 TempSingle single=myDb.selectTemp(sql); if(single=null)/在tb_temp表中不存在当前IP mark=true;/允许投票 else/存在当前IP,则判断从上次投票到现在是否超过指定时间,本系统指定为60分钟 last=single.getVoteMSEL();/从该JavaBean中获取上次投票的时间(以毫秒显示) String result=MyTpareTime(today,last);/将现在时间与上次投票时的时间进行比较 if(result.equals(yes)/返回yes,表示时间差已超过60分钟,允许投票 mark=true;
限制150内