Git 仓库
https://gitee.com/black_lacquer_white_moon/jmu-voting-system
需求分析
班级投票系统主要包括班级前台投票、投票结果查看和后台管理系统三个部分。班级前台投票包括投票主题和选项,选项可以是单选或多选,主要包含以下模块:
- 显示投票选项模块:主要是显示投票内容,即投票表单的实现;
- 参与投票模块: 禁止重复投票;
- 显示投票结果模块:主要是投票选项的计数统计,通过柱状图更直观的显示各选项的票数;
后台管理主要包括投票项目的增加、修改和删除,其中修改投票项目还可以包含对选项的修改和删除:
- 管理员登录验证模块;
- 投票主题显示模块:可以浏览投票主题及相关信息(投票总数、投票时间等),可实现分页显示;
- 投票主题增加模块: 以表单的形式增加投票主题以及选项的个数;
- 投票项目的删除:对于不需要的投票主题可实现删除。
使用的技术
Web 部分
- HTML、CSS、JavaScript
- Ajax
- jQuery
- bootstrap
- JSON
- Servlet
- Cookie
DB 部分
- SQL
- MySQL
- JDBC
设计模式
- MVC 模式
- DAO 模式
- 前后端分离
开发环境
- JDK
- TOMCAT
- Eclipse
- Navicat
系统程序设计
数据库设计
在需求分析阶段我们采用的是自上而下的分析方法,那么要在其基础上进一步作概念设计我们面临的是细化的分析数据流图以及数据字典,分析得到实体及其属性后,进一步可分析各实体之间的联系。
首先先找到实体,画出系统各个实体的全局 E-R 图。
由此可以得到系统的实体及其属性如下:
- User(UsersID, UsersUsername, UsersPassword, UsersType)
- Item(ItemID, ItemTitle, ItemText, ItemType)
- Option(OptionID, OptionText, ItemID)
- Record(RecordID, UserID, ItemID, OptionID, RecordSendTime)
系统功能设计
- 学生管理员登录验证模块:该模块用于管理员和学生的登录。登录验证后,学生和管理员才可以进入系统实行操作。未注册过账号的用户可进行注册后再登录,账号密码可以更改。
- 显示投票选项模块:此模块为学生进行一个投票项目的投票使用,针对投票项目的类型分为单选和多选,投票项目类型为单选则学生只能选择一个选项进行投票;投票项目类型为单选则学生能选择多个选项进行投票。
- 学生参与投票模块:此模块供用户对投票项目进行投票所用。在投票首页上,将会一个“进入投票”按扭,用户可进入该投票项目自由选择投票选项进行投票。投票操作具体为:用户选择一个投票选项,提交,即可投票成功,此时页面会跳转至显示投票结果的页面。
- 显示投票结果模块:此模块供用户查看该项目已有的投票情况。投票结果显示页面会显示相应投票选项的得票率和该项目总的得票数。
- 管理员管理用户模块:此模块为管理员操作的模块,管理员可以管理系统内所有学生,对其信息进行修改以及添加学生信息。
- 投票项目增删查改模块:此模块为管理员操作的模块。管理员登入系统后,可对本系统的所以投票项目进行相应的管理,如:添加投票项目,删除投票项目等。
- 投票选项增删查改模块:此模块为管理员操作的模块。管理员登入系统后,可对本系统的所以投票项目进行相应的管理添加投票项目对应的选项,以及删除投票项目对应的选项等。
程序流程设计
系统流程图如下,用户在主页可以选择登陆、注册或修改密码。用户登录成功后,分别进入管理员或普通用户页面。普通用户登录完成后进入主界面,可以修改自己的信息,然后选择投票项目参与投票。用户若是管理员可以对用户进行增删改查、对项目进行增删改查和对选项进行增删改查。最后用户选择退出登录,回到登录界面。
数据库实现
投票选项信息表
列名 | 数据类型 | 可否为空 | 说明 |
---|---|---|---|
Option_id | Int(11) | not null | 选项号 |
Option_text | text | null | 选项内容 |
Item_id | Int(11) | null | 投票项目号 |
投票项目信息表
列名 | 数据类型 | 可否为空 | 说明 |
---|---|---|---|
Item_id | Int(11) | not null | 投票项目号 |
Item_title | Varchar(255) | null | 投票项目名 |
Item_text | text | null | 投票描述信息 |
Item_type | Int(10 | null | 投票类型 |
学生投票记录表
列名 | 数据类型 | 可否为空 | 说明 |
---|---|---|---|
Record_id | Int(11) | not null | 记录号 |
User_id | Int(11) | not null | 用户号 |
Item_id | Int(11) | not null | 投票项目号 |
Option_id | Int(11) | not null | 选项号 |
Send_time | datetime | null | 提交时间 |
用户登录表
列名 | 数据类型 | 可否为空 | 说明 |
---|---|---|---|
User_id | Int(11) | not null | 用户号 |
Username_md5 | Varchar(255) | null | 用户名(md5) |
Password_md5 | Varchar(255) | null | 密码(md5) |
User_type | Int(11) | null | 用户类型 |
用户信息表
列名 | 数据类型 | 可否为空 | 说明 |
---|---|---|---|
Username | Varchar(255) | null | 用户名 |
User_id | Int(11) | not null | 用户号 |
Sex | Varchar(4) | null | 性别 |
Age | Int(3) | null | 年龄 |
Telephone | Varchar(11) | null | 联系方式 |
学生投票记录展示视图
列名 | 数据类型 | 可否为空 | 说明 |
---|---|---|---|
Item_id | Int(11) | not null | 投票项目号 |
Username | Varchar(255) | null | 用户名 |
Item_title | Varchar(255) | null | 投票项目名 |
Option_text | text | null | 选项内容 |
Send_time | datetime | null | 提交时间 |
选项提交记录数视图
列名 | 数据类型 | 可否为空 | 说明 |
---|---|---|---|
Item_id | Int(11) | not null | 投票项目号 |
Option_text | text | null | 选项内容 |
Total | Bigint(21) | not null | 投票总数 |
程序实现
程序结构
系统基于eclipse环境进行开发,使用Tomcat 8.5 作为服务器,使用MySQL 5.7 为数据库存储数据。项目的结构如图所示:
程序包划分
Controller 包
Controller 包中有 19 个 servlet 文件,分别对应着 19 个接口,前端页面可以通过向这些接口发送请求来获取 JSON 数据。
Dao 包
Dao 包中放置 6 个 Dao 接口,分别对应了对数据库中的表或者视图的操作行为。实现类可以继承 Dao 包中的方法,供其他程序调用。
Dao.impl 包
Dao.impl 包存储 Dao 包中的接口的实现类,其中的 6 个实现类是基于 JDBC 的访问 MySQL 数据库的实现类。
Model 包
存放实体类,对应经过数据库设计后得到的5个实体,数据库取出数据时将使用这些实体对象存储。
Utils 包
存放工具类,供其他类调用实现一些功能。
静态资源
系统拥有的静态资源如下所示。
功能展示
登录与信息完善
用户进入网页后,首先看到的是登录页面。
对于用户没有填写的内容,网页会自动提示用户。
如果用户选择注册,则进入注册页面,如果用户没有按照要求填写也会提示用户。
用户填写用户名和密码后提交,即可完成注册。
用户输入正确的用户名和密码后,即可登陆成功。
登录成功后,用户可以修改自己的信息。
修改后用户可以查看自己的信息。
学生投票
选择“学生投票”,用户可以选择投票项目。
进入投票项目后,用户可以进行投票。
系统会检查用户的行为,阻止重复投票。
如果投票项目是多选的,则用户可以选多个选项。
多选的投票项目同样不能重复提交。
进入“投票结果”页面,用户可以查看投票结果,通过柱状图和饼状图呈现出来。
在搜索栏中,可以搜索其他投票项目的投票结果。
销户
用户可以选择销户,销户后用户的所有投票记录都会被删除。
用其他的用户登录,可以看到投票记录发生了变化,这是由于销户删除了一些记录导致的。
用户可以修改密码。
投票管理
管理员需要选择身份是管理员才能登录。
选择“投票管理”,管理员可以对投票项目进行操作。
例如可以添加一个投票项目。
如图所示添加成功。
可以选择一个投票项目编辑它的选项。
如图是添加选项。
可以看到已经添加了多个选项。
对于要删除的选项,可以进行删除,删除选项后该选项的投票记录也会被删除。
也可以删除整个投票项目,删除后该投票项目的记录都会被删除。
如图所示删除成功。
用户管理
进入“用户管理”界面,管理员可以看到所有用户的基本信息。
管理员可以编辑用户的基本信息,但是不能改密码。
可以看到用户的信息被更改了。
完成情况
优点
- 通过 Ajax 向 Servlet 接口发送请求的方式实现前后端分离;
- 简洁而有科技感的前端设计;
- 使用 DAO 模式编写数据库操作接口降低代码耦合度;
- 数据库设计合理,表的设计均达到 3NF,且在控制层实现实体完整性;
- 用户敏感信息(密码)加密存储,使用数字签名进行认证;
- 实现了投票系统的大部分需求,支持普通用户和管理员的使用;
- 使用 Git 进行管理,代码具有丰富的注释和文档注释,易于维护。
缺点
- 网页设计缺乏过滤手段,安全性较低;
- 前端页面设计速度较慢导致开发效率较低,一部分功能没有完全实现;
- 部分前端页面布局设计不美观,存在一定的生搬硬套;
- 后端接口缺乏过滤器对用户进行验证;
- 后端接口接收数据时照单全收,没有进行数据类型的判别与检验;
- result.jsp 页面(也就是唯一一个 jsp 文件)有未处理的 Bug。